diff --git a/.env.local_dev b/.env.local_dev
index 969ede16c..d208d296e 100644
--- a/.env.local_dev
+++ b/.env.local_dev
@@ -7,7 +7,7 @@ PUBLIC_URL=http://localhost:3000
# Set it to true if you want to generate the Sourcemap for debugging
GENERATE_SOURCEMAP=false
# Set it to the URL from where APIs will be accessible, for local development it should be localhost:3000/api/app (use your local port number instead)
-REACT_APP_SERVERURL=http://localhost:8080/app
+# REACT_APP_SERVERURL=http://localhost:8080/app
# A 12 character long random app identifier. The value of this should be same as APP_ID which is a variable used by backend API.
REACT_APP_APPID=opensign
@@ -46,7 +46,7 @@ USE_LOCAL=true
MAILGUN_API_KEY=
MAILGUN_DOMAIN=mail.yourdomain.com
MAILGUN_SENDER=postmaster@mail.yourdomain.com
-SMTP_ENABLE=
+SMTP_ENABLE=true
SMTP_HOST=smtp.yourhost.com
SMTP_PORT=443
SMTP_USER_EMAIL=mailer@yourdomain.com
diff --git a/.github/workflows/Docker.yml b/.github/workflows/Docker.yml
index 612955230..01c74a80d 100644
--- a/.github/workflows/Docker.yml
+++ b/.github/workflows/Docker.yml
@@ -2,7 +2,7 @@ name: ci
on:
push:
branches:
- - 'staging'
+ - 'main'
jobs:
docker:
diff --git a/Caddyfile b/Caddyfile
new file mode 100644
index 000000000..c3a000662
--- /dev/null
+++ b/Caddyfile
@@ -0,0 +1,7 @@
+{$HOST_URL} {
+ reverse_proxy client:3000
+ handle_path /app/* {
+ reverse_proxy server:8080
+ rewrite * /app{uri}
+ }
+}
diff --git a/Makefile b/Makefile
index 7c70890cf..3741a2bc0 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,10 @@
build:
+ @echo "Building with HOST_URL=${HOST_URL}"
cp .env.local_dev .env
cd apps/OpenSign && cp ../../.env.local_dev .env && npm install && npm run build
- docker compose up --build --force-recreate
+ HOST_URL=${HOST_URL} docker compose up --build --force-recreate
run:
+ @echo "Building with HOST_URL=${HOST_URL}"
cp .env.local_dev .env
- docker compose up -d
\ No newline at end of file
+ docker compose up -d
diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json
index 41dada7e1..f876bd1c8 100644
--- a/apps/OpenSign/package-lock.json
+++ b/apps/OpenSign/package-lock.json
@@ -9,12 +9,12 @@
"version": "0.1.0",
"dependencies": {
"@formkit/auto-animate": "^0.8.2",
- "@lottiefiles/dotlottie-react": "^0.8.6",
+ "@lottiefiles/dotlottie-react": "^0.8.7",
"@pdf-lib/fontkit": "^1.1.1",
"@radix-ui/themes": "^3.1.1",
"@react-pdf/renderer": "^3.4.4",
"@reduxjs/toolkit": "^2.2.7",
- "axios": "^1.7.2",
+ "axios": "^1.7.3",
"file-saver": "^2.0.5",
"i18next": "^23.12.2",
"i18next-browser-languagedetector": "^8.0.0",
@@ -38,10 +38,10 @@
"react-dom": "^18.2.0",
"react-gtm-module": "^2.0.11",
"react-helmet": "^6.1.0",
- "react-i18next": "^15.0.0",
+ "react-i18next": "^15.0.1",
"react-konva": "^18.2.10",
"react-pdf": "^9.1.0",
- "react-quill": "^2.0.0",
+ "react-quill-new": "^3.2.2",
"react-redux": "^9.1.2",
"react-rnd": "^10.4.11",
"react-router-dom": "^6.26.0",
@@ -82,7 +82,7 @@
"postcss": "^8.4.41",
"prettier": "^3.3.3",
"pretty-quick": "^4.0.0",
- "tailwindcss": "^3.4.7",
+ "tailwindcss": "^3.4.9",
"terser-webpack-plugin": "^5.3.10",
"webpack-cli": "^5.1.4"
}
@@ -3615,9 +3615,9 @@
"integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="
},
"node_modules/@lottiefiles/dotlottie-react": {
- "version": "0.8.6",
- "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.8.6.tgz",
- "integrity": "sha512-Xy4IYU7auoQ+PTc6sESviK6Izh1LgCK710LcRehyQArjYMw/4SxfNB6sdX5qVdGeBbo/JbM9tOAd1MULEmfebQ==",
+ "version": "0.8.7",
+ "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.8.7.tgz",
+ "integrity": "sha512-vytNbD6tpmuBNrkfPHBC0luStanaihmL1CXwdFw2sXbRl/5V7r2ZzclhMd+rIczYqg1rEa9vTRepF2bl/7pHrQ==",
"dependencies": {
"@lottiefiles/dotlottie-web": "0.30.2",
"debounce": "^2.0.0"
@@ -6121,14 +6121,6 @@
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz",
"integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg=="
},
- "node_modules/@types/quill": {
- "version": "1.3.10",
- "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz",
- "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==",
- "dependencies": {
- "parchment": "^1.1.2"
- }
- },
"node_modules/@types/range-parser": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
@@ -7249,9 +7241,9 @@
}
},
"node_modules/axios": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz",
- "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==",
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz",
+ "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
@@ -9690,25 +9682,6 @@
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
"integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="
},
- "node_modules/deep-equal": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz",
- "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
- "dependencies": {
- "is-arguments": "^1.1.1",
- "is-date-object": "^1.0.5",
- "is-regex": "^1.1.4",
- "object-is": "^1.1.5",
- "object-keys": "^1.1.1",
- "regexp.prototype.flags": "^1.5.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -11049,8 +11022,7 @@
"node_modules/eventemitter3": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
- "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
- "dev": true
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
},
"node_modules/events": {
"version": "3.3.0",
@@ -11195,11 +11167,6 @@
"node": ">= 0.6"
}
},
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
"node_modules/external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -11222,8 +11189,7 @@
"node_modules/fast-diff": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
- "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
- "dev": true
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="
},
"node_modules/fast-glob": {
"version": "3.3.2",
@@ -16554,11 +16520,26 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "node_modules/lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
+ },
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+ },
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
@@ -17855,11 +17836,6 @@
"tslib": "^2.0.3"
}
},
- "node_modules/parchment": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz",
- "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
- },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -19950,42 +19926,19 @@
}
]
},
- "node_modules/quill": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz",
- "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
- "dependencies": {
- "clone": "^2.1.1",
- "deep-equal": "^1.0.1",
- "eventemitter3": "^2.0.3",
- "extend": "^3.0.2",
- "parchment": "^1.1.4",
- "quill-delta": "^3.6.2"
- }
- },
"node_modules/quill-delta": {
- "version": "3.6.3",
- "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz",
- "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz",
+ "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==",
"dependencies": {
- "deep-equal": "^1.0.1",
- "extend": "^3.0.2",
- "fast-diff": "1.1.2"
+ "fast-diff": "^1.3.0",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.isequal": "^4.5.0"
},
"engines": {
- "node": ">=0.10"
+ "node": ">= 12.0.0"
}
},
- "node_modules/quill-delta/node_modules/fast-diff": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
- "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
- },
- "node_modules/quill/node_modules/eventemitter3": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
- "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
- },
"node_modules/radix-ui": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.0.1.tgz",
@@ -20568,9 +20521,9 @@
}
},
"node_modules/react-i18next": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.0.0.tgz",
- "integrity": "sha512-2O3IgF4zivg57Q6p6i+ChDgJ371IDcEWbuWC6gvoh5NbkDMs0Q+O7RPr4v61+Se32E0V+LmtwePAeqWZW0bi6g==",
+ "version": "15.0.1",
+ "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.0.1.tgz",
+ "integrity": "sha512-NwxLqNM6CLbeGA9xPsjits0EnXdKgCRSS6cgkgOdNcPXqL+1fYNl8fBg1wmnnHvFy812Bt4IWTPE9zjoPmFj3w==",
"dependencies": {
"@babel/runtime": "^7.24.8",
"html-parse-stringify": "^3.0.1"
@@ -20682,18 +20635,37 @@
}
}
},
- "node_modules/react-quill": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz",
- "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==",
+ "node_modules/react-quill-new": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-quill-new/-/react-quill-new-3.2.2.tgz",
+ "integrity": "sha512-pWMfSVAG/ErEh8qjffEp7g8FxRZOcYgTjyi0lp5aLRc/8Ii6u9u95NWu4oeDhFJuZ0NX/h1VnOul8WWKvsl0uQ==",
"dependencies": {
- "@types/quill": "^1.3.10",
- "lodash": "^4.17.4",
- "quill": "^1.3.7"
+ "lodash-es": "^4.17.21",
+ "quill": "~2.0.2"
},
"peerDependencies": {
- "react": "^16 || ^17 || ^18",
- "react-dom": "^16 || ^17 || ^18"
+ "quill-delta": "^5.1.0",
+ "react": "^16 || ^17 || ^18 || ^19",
+ "react-dom": "^16 || ^17 || ^18 || ^19"
+ }
+ },
+ "node_modules/react-quill-new/node_modules/parchment": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz",
+ "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A=="
+ },
+ "node_modules/react-quill-new/node_modules/quill": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.2.tgz",
+ "integrity": "sha512-QfazNrhMakEdRG57IoYFwffUIr04LWJxbS/ZkidRFXYCQt63c1gK6Z7IHUXMx/Vh25WgPBU42oBaNzQ0K1R/xw==",
+ "dependencies": {
+ "eventemitter3": "^5.0.1",
+ "lodash-es": "^4.17.21",
+ "parchment": "^3.0.0",
+ "quill-delta": "^5.1.0"
+ },
+ "engines": {
+ "npm": ">=8.2.3"
}
},
"node_modules/react-reconciler": {
@@ -23805,9 +23777,9 @@
"integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
},
"node_modules/tailwindcss": {
- "version": "3.4.7",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz",
- "integrity": "sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==",
+ "version": "3.4.9",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.9.tgz",
+ "integrity": "sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json
index 5ab0d56c8..9581f7af3 100644
--- a/apps/OpenSign/package.json
+++ b/apps/OpenSign/package.json
@@ -4,12 +4,12 @@
"private": true,
"dependencies": {
"@formkit/auto-animate": "^0.8.2",
- "@lottiefiles/dotlottie-react": "^0.8.6",
+ "@lottiefiles/dotlottie-react": "^0.8.7",
"@pdf-lib/fontkit": "^1.1.1",
"@radix-ui/themes": "^3.1.1",
"@react-pdf/renderer": "^3.4.4",
"@reduxjs/toolkit": "^2.2.7",
- "axios": "^1.7.2",
+ "axios": "^1.7.3",
"file-saver": "^2.0.5",
"i18next": "^23.12.2",
"i18next-browser-languagedetector": "^8.0.0",
@@ -33,10 +33,10 @@
"react-dom": "^18.2.0",
"react-gtm-module": "^2.0.11",
"react-helmet": "^6.1.0",
- "react-i18next": "^15.0.0",
+ "react-i18next": "^15.0.1",
"react-konva": "^18.2.10",
"react-pdf": "^9.1.0",
- "react-quill": "^2.0.0",
+ "react-quill-new": "^3.2.2",
"react-redux": "^9.1.2",
"react-rnd": "^10.4.11",
"react-router-dom": "^6.26.0",
@@ -114,7 +114,7 @@
"postcss": "^8.4.41",
"prettier": "^3.3.3",
"pretty-quick": "^4.0.0",
- "tailwindcss": "^3.4.7",
+ "tailwindcss": "^3.4.9",
"terser-webpack-plugin": "^5.3.10",
"webpack-cli": "^5.1.4"
},
diff --git a/apps/OpenSign/public/static/js/public-template.bundle.js b/apps/OpenSign/public/static/js/public-template.bundle.js
index 3092c5b7b..99bdb5762 100644
--- a/apps/OpenSign/public/static/js/public-template.bundle.js
+++ b/apps/OpenSign/public/static/js/public-template.bundle.js
@@ -6164,8 +6164,6 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
-
function DefaultSignature(_ref) {
let {
@@ -6173,19 +6171,16 @@ function DefaultSignature(_ref) {
xyPostion,
setDefaultSignAlert
} = _ref;
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)();
const confirmToaddDefaultSign = () => {
if (xyPostion.length > 0) {
setDefaultSignAlert({
isShow: true,
- alertMessage: t("default-sign-alert")
+ alertMessage: "Are you sure you want to auto sign at requested all locations?"
});
} else {
setDefaultSignAlert({
isShow: true,
- alertMessage: t("please-select-position!")
+ alertMessage: "please select position!"
});
}
};
@@ -6193,11 +6188,11 @@ function DefaultSignature(_ref) {
"data-tut": "reactourThird"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300"
- }, t("signature")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Signature"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex flex-col items-center mt-[10px] font-semibold"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
className: "text-base-content"
- }, t("Your-Signature")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Your Signature"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "op-card shadow-md h-[111px] w-[90%] p-2"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
alt: "signature",
@@ -6207,7 +6202,7 @@ function DefaultSignature(_ref) {
type: "button",
className: "op-btn op-btn-primary op-btn-sm mt-[10px]",
onClick: () => confirmToaddDefaultSign()
- }, t("auto-sign-all"))));
+ }, "Auto Sign All")));
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DefaultSignature);
@@ -6229,11 +6224,9 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _PrevNext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PrevNext */ "./src/components/pdf/PrevNext.js");
/* harmony import */ var _constant_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constant/Utils */ "./src/constant/Utils.js");
/* harmony import */ var _styles_signature_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../styles/signature.css */ "./src/styles/signature.css");
-/* harmony import */ var _radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @radix-ui/react-dropdown-menu */ "./node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs");
+/* harmony import */ var _radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @radix-ui/react-dropdown-menu */ "./node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs");
/* harmony import */ var _primitives_ModalUi__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../primitives/ModalUi */ "./src/primitives/ModalUi.js");
/* harmony import */ var _primitives_Loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../primitives/Loader */ "./src/primitives/Loader.js");
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
-
@@ -6267,9 +6260,6 @@ function Header(_ref) {
setIsEditTemplate,
isPublicTemplate
} = _ref;
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_6__.useTranslation)();
const filterPrefill = signerPos && (signerPos === null || signerPos === void 0 ? void 0 : signerPos.filter(data => data.Role !== "prefill"));
const isMobile = window.innerWidth < 767;
const [isDownloading, setIsDownloading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("");
@@ -6302,17 +6292,17 @@ function Header(_ref) {
pageNumber: pageNumber,
allPages: allPages,
changePage: changePage
- }), pdfUrl && alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Root, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Trigger, {
+ }), pdfUrl && alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Root, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Trigger, {
asChild: true
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "op-link op-link-primary no-underline text-[16px] font-semibold pr-[3px] pl-[5px]"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-ellipsis-v",
"aria-hidden": "true"
- }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Portal, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Content, {
+ }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Portal, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Content, {
className: "DropdownMenuContent",
sideOffset: 5
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, {
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Item, {
className: "DropdownMenuItem",
onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading)
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -6320,7 +6310,7 @@ function Header(_ref) {
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-arrow-down mr-[3px]",
"aria-hidden": "true"
- }), t("download"))), isCompleted && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, {
+ }), "Download")), isCompleted && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Item, {
className: "DropdownMenuItem",
onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadCertificate)(pdfDetails, setIsDownloading)
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -6328,7 +6318,7 @@ function Header(_ref) {
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-award mr-[3px]",
"aria-hidden": "true"
- }), t("certificate"))), isSignYourself && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, {
+ }), "Certificate")), isSignYourself && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Item, {
className: "DropdownMenuItem",
onClick: () => setIsEmail(true)
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -6336,7 +6326,7 @@ function Header(_ref) {
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-envelope mr-[3px]",
"aria-hidden": "true"
- }), t("mail"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, {
+ }), "Mail")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Item, {
className: "DropdownMenuItem",
onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading)
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -6344,7 +6334,7 @@ function Header(_ref) {
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-print mr-[3px]",
"aria-hidden": "true"
- }), t("print")))))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }), "Print"))))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex justify-around items-center"
}, currentSigner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex items-center",
@@ -6352,7 +6342,7 @@ function Header(_ref) {
}, decline && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
onClick: () => handleDeclinePdfAlert(),
className: "text-[red] border-none font-[650] text-[14px] mr-2"
- }, t("decline")), isPlaceholder ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Decline"), isPlaceholder ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
onClick: () => {
if (!isMailSend) {
alertSendEmail();
@@ -6360,7 +6350,7 @@ function Header(_ref) {
},
className: "".concat(isMailSend ? "" : "op-link-primary", " op-link no-underline font-[650] text-[14px]"),
"data-tut": "headerArea"
- }, completeBtnTitle ? completeBtnTitle : t("send")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, completeBtnTitle ? completeBtnTitle : "Send") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
"data-tut": "reactourThird",
onClick: () => {
if (!pdfUrl) {
@@ -6370,17 +6360,17 @@ function Header(_ref) {
}
},
className: "border-none font-[650] text-[14px] op-link op-link-primary no-underline"
- }, t("finish")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Root, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Trigger, {
+ }, "Finish"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Root, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Trigger, {
asChild: true
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "font-[650] text-[18px] px-2 ml-[4px] text-base-content no-underline"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-ellipsis-v",
"aria-hidden": "true"
- }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Portal, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Content, {
+ }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Portal, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Content, {
className: "bg-white shadow-md rounded-full px-3 py-2",
sideOffset: 5
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, {
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Item, {
className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer",
onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading)
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
@@ -6388,7 +6378,7 @@ function Header(_ref) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "font-[500]"
- }, t("download")))))))))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Download"))))))))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex flex-wrap justify-between items-center w-full gap-y-1 ml-1"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PrevNext__WEBPACK_IMPORTED_MODULE_1__["default"], {
pageNumber: pageNumber,
@@ -6398,9 +6388,9 @@ function Header(_ref) {
className: "flex mx-[100px] lg:mx-0 order-last lg:order-none"
}, !isMailSend && signersdata.length > 0 && signersdata.length !== filterPrefill.length && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, filterPrefill.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "text-[13px] text-[#f5405e]"
- }, t("add"), " ", signersdata.length - filterPrefill.length, " ", t("recipients"), " ", t("widgets-name.signature")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ }, "Add ", signersdata.length - filterPrefill.length, " ", "recipients signature") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "text-[13px] text-[#f5405e]"
- }, t("add"), " ", signersdata.length - filterPrefill.length, " ", t("more"), t("recipients"), " ", t("widgets-name.signature")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Add ", signersdata.length - filterPrefill.length, " more recipients signature"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex"
}, setIsEditTemplate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
onClick: () => setIsEditTemplate(true),
@@ -6411,12 +6401,12 @@ function Header(_ref) {
onClick: () => window.history.go(-2),
type: "button",
className: "op-btn op-btn-ghost op-btn-sm mr-[3px]"
- }, t("back")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Back"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
disabled: isMailSend && true,
"data-tut": "headerArea",
className: "op-btn op-btn-primary op-btn-sm mr-[3px]",
onClick: () => alertSendEmail()
- }, completeBtnTitle ? completeBtnTitle : isMailSend ? t("sent") : t("send")))) : isPdfRequestFiles ? alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, completeBtnTitle ? completeBtnTitle : isMailSend ? "Sent" : "Send"))) : isPdfRequestFiles ? alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex flex-row"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading),
@@ -6427,7 +6417,7 @@ function Header(_ref) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block"
- }, t("print"))), isCompleted && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Print")), isCompleted && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadCertificate)(pdfDetails, setIsDownloading),
className: "op-btn op-btn-secondary op-btn-sm mr-[3px] shadow"
@@ -6436,7 +6426,7 @@ function Header(_ref) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block"
- }, t("certificate"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Certificate")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
className: "op-btn op-btn-primary op-btn-sm mr-[3px] shadow",
onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading)
@@ -6445,21 +6435,21 @@ function Header(_ref) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block"
- }, t("download")))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Download"))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex",
"data-tut": "reactourFifth"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
onClick: () => window.history.go(-2),
type: "button",
className: "op-btn op-btn-ghost op-btn-sm mr-[3px]"
- }, t("back")), currentSigner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Back"), currentSigner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
className: "op-btn op-btn-secondary op-btn-sm mr-[3px] shadow",
onClick: () => handleDeclinePdfAlert()
- }, t("decline")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Decline"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
className: "op-btn op-btn-primary op-btn-sm mr-[3px] shadow",
onClick: () => embedWidgetsData()
- }, t("finish")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Finish"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
className: "op-btn op-btn-neutral op-btn-sm mr-[3px] shadow",
onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading)
@@ -6467,7 +6457,7 @@ function Header(_ref) {
className: "fa-light fa-arrow-down font-semibold lg:hidden"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block"
- }, t("download"))))) : isCompleted ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Download")))) : isCompleted ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex flex-row"
}, isCompleted && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
@@ -6478,7 +6468,7 @@ function Header(_ref) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block ml-1"
- }, t("certificate"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Certificate")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading),
type: "button",
className: "op-btn op-btn-neutral op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow"
@@ -6487,7 +6477,7 @@ function Header(_ref) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block ml-1"
- }, t("print"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Print")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
className: "op-btn op-btn-primary op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow",
onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading)
@@ -6496,7 +6486,7 @@ function Header(_ref) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block ml-1"
- }, t("download"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Download")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
className: "op-btn op-btn-info op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow",
onClick: () => setIsEmail(true)
@@ -6505,7 +6495,7 @@ function Header(_ref) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block ml-1"
- }, t("mail")))) : isPublicTemplate ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Mail"))) : isPublicTemplate ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
@@ -6513,13 +6503,13 @@ function Header(_ref) {
onClick: () => {
embedWidgetsData();
}
- }, t("sign-now"))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Sign Now"))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
onClick: () => window.history.go(-2),
type: "button",
className: "op-btn op-btn-ghost op-btn-sm mr-[3px]"
- }, t("back")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Back"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
className: "op-btn op-btn-primary op-btn-sm mr-[3px]",
onClick: () => {
@@ -6527,15 +6517,15 @@ function Header(_ref) {
embedWidgetsData();
}
}
- }, t("finish")))), isDownloading === "pdf" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Finish"))), isDownloading === "pdf" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "fixed z-[200] inset-0 flex justify-center items-center bg-black bg-opacity-30"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Loader__WEBPACK_IMPORTED_MODULE_5__["default"], null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_4__["default"], {
isOpen: isDownloading === "certificate",
- title: isDownloading === "certificate" ? t("generating-certificate") : t("pdf-download"),
+ title: isDownloading === "certificate" ? "Generating certificate" : "PDF Download",
handleClose: () => setIsDownloading("")
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "p-3 md:p-5 text-[13px] md:text-base text-center text-base-content"
- }, isDownloading === "certificate", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, t("generate-certificate-alert")))));
+ }, isDownloading === "certificate", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Your completion certificate is being generated. Please wait momentarily. If the download doesn't start shortly, click the button again."))));
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Header);
@@ -6554,13 +6544,8 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
-
function PdfZoom(props) {
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)();
const onClickZoomIn = () => {
props.setScale(props.scale + 0.1 * props.scale);
props.setZoomPercent(props.zoomPercent + 10);
@@ -6587,13 +6572,13 @@ function PdfZoom(props) {
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px] cursor-pointer",
onClick: onClickZoomIn,
- title: t("zoom-in")
+ title: "Zoom in"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-magnifying-glass-plus text-gray-500 2xl:text-[30px]"
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px] cursor-pointer",
onClick: handleReset,
- title: t("reset")
+ title: "Reset"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-magnifying-glass-arrows-rotate text-gray-500 2xl:text-[30px]"
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
@@ -6602,7 +6587,7 @@ function PdfZoom(props) {
style: {
cursor: props.zoomPercent > 0 ? "pointer" : "default"
},
- title: t("zoom-out")
+ title: "Zoom out"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-magnifying-glass-minus text-gray-500 2xl:text-[30px]"
})))
@@ -7384,14 +7369,13 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _constant_Utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../constant/Utils */ "./src/constant/Utils.js");
-/* harmony import */ var react_datepicker__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-datepicker */ "./node_modules/react-datepicker/dist/react-datepicker.min.js");
-/* harmony import */ var react_datepicker__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react_datepicker__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var react_datepicker__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-datepicker */ "./node_modules/react-datepicker/dist/react-datepicker.min.js");
+/* harmony import */ var react_datepicker__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_datepicker__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var react_datepicker_dist_react_datepicker_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-datepicker/dist/react-datepicker.css */ "./node_modules/react-datepicker/dist/react-datepicker.css");
/* harmony import */ var _styles_signature_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../styles/signature.css */ "./src/styles/signature.css");
/* harmony import */ var regex_parser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! regex-parser */ "./node_modules/regex-parser/lib/index.js");
/* harmony import */ var regex_parser__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(regex_parser__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var _constant_const__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../constant/const */ "./src/constant/const.js");
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
@@ -7399,16 +7383,11 @@ __webpack_require__.r(__webpack_exports__);
-
-const textWidgetCls = "w-full h-full md:min-w-full md:min-h-full z-[999] text-[12px] rounded-[2px] border-[1px] border-[#007bff] overflow-hidden resize-none outline-none text-base-content item-center whitespace-pre-wrap bg-white";
+const textWidgetCls = "w-full h-full md:min-w-full md:min-h-full z-[999] text-[12px] rounded-[2px] border-[1px] border-[#007bff] overflow-hidden resize-none outline-none text-base-content item-center whitespace-pre-wrap";
const selectWidgetCls = "w-full h-full absolute left-0 top-0 border-[1px] border-[#007bff] rounded-[2px] focus:outline-none text-base-content";
function PlaceholderType(props) {
- var _props$pos, _props$pos2, _props$pos20, _props$data4, _props$data5, _props$data6, _props$data7, _props$pos$options7, _props$data9, _props$pos$options11, _props$pos$options12, _props$pos$options13, _props$pos$options14, _props$pos$options15, _props$pos$options16, _props$data11, _props$pos21, _props$pos22, _props$pos23, _props$data13, _props$data14, _props$data15, _props$pos$options17, _props$pos$options18, _props$pos$options19, _props$pos$options20, _props$pos$options21, _props$pos$options22, _props$data17, _props$pos$options23, _props$pos$options24, _props$pos$options25, _props$pos$options26, _props$pos$options27, _props$pos$options28, _props$data19, _props$pos$options29, _props$pos$options30, _props$pos$options31, _props$pos$options32, _props$pos$options33, _props$pos$options34, _props$data21, _props$data22, _props$pos$options35, _props$selectDate, _props$pos24, _props$pos25, _props$selectDate2, _props$pos26, _props$pos27, _props$data23, _props$data24, _props$data25, _props$pos$options36, _props$pos$options37, _props$pos$options38, _props$pos$options39, _props$pos$options40, _props$pos$options41, _props$pos$options42, _props$pos$options45, _props$pos$options46, _props$pos$options47, _props$data29, _props$data30;
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_6__.useTranslation)();
+ var _props$pos, _props$pos19, _props$data4, _props$data5, _props$pos20, _props$data6, _props$data7, _props$pos21, _props$pos$options7, _props$data9, _props$pos$options11, _props$pos$options12, _props$pos$options13, _props$pos$options14, _props$pos$options15, _props$pos$options16, _props$data11, _props$pos22, _props$pos23, _props$pos24, _props$data13, _props$data14, _props$pos25, _props$data15, _props$pos$options17, _props$pos$options18, _props$pos$options19, _props$pos$options20, _props$pos$options21, _props$pos$options22, _props$data17, _props$pos$options23, _props$pos$options24, _props$pos$options25, _props$pos$options26, _props$pos$options27, _props$pos$options28, _props$data19, _props$pos$options29, _props$pos$options30, _props$pos$options31, _props$pos$options32, _props$pos$options33, _props$pos$options34, _props$data21, _props$data22, _props$pos$options35, _props$selectDate, _props$pos26, _props$pos27, _props$selectDate2, _props$pos28, _props$pos29, _props$data23, _props$data24, _props$pos30, _props$data25, _props$pos$options36, _props$pos$options37, _props$pos$options38, _props$pos$options39, _props$pos$options40, _props$pos$options41, _props$pos$options42, _props$pos$options45, _props$pos$options46, _props$pos$options47, _props$data29, _props$data30;
const type = props === null || props === void 0 || (_props$pos = props.pos) === null || _props$pos === void 0 ? void 0 : _props$pos.type;
- const widgetTypeTraslation = t("widgets-name.".concat(props === null || props === void 0 || (_props$pos2 = props.pos) === null || _props$pos2 === void 0 ? void 0 : _props$pos2.type));
const [selectOption, setSelectOption] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("");
const [validatePlaceholder, setValidatePlaceholder] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("");
const inputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
@@ -7418,9 +7397,9 @@ function PlaceholderType(props) {
const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
const validateExpression = regexValidation => {
if (textValue && regexValidation) {
- var _props$pos3;
+ var _props$pos2;
let regexObject = regexValidation;
- if (((_props$pos3 = props.pos) === null || _props$pos3 === void 0 || (_props$pos3 = _props$pos3.options) === null || _props$pos3 === void 0 || (_props$pos3 = _props$pos3.validation) === null || _props$pos3 === void 0 ? void 0 : _props$pos3.type) === "regex") {
+ if (((_props$pos2 = props.pos) === null || _props$pos2 === void 0 || (_props$pos2 = _props$pos2.options) === null || _props$pos2 === void 0 || (_props$pos2 = _props$pos2.validation) === null || _props$pos2 === void 0 ? void 0 : _props$pos2.type) === "regex") {
regexObject = regex_parser__WEBPACK_IMPORTED_MODULE_4___default()(regexValidation);
}
// new RegExp(regexValidation);
@@ -7432,9 +7411,9 @@ function PlaceholderType(props) {
}
};
const handleInputBlur = () => {
- var _props$pos4, _props$pos5;
+ var _props$pos3, _props$pos4;
props.setDraggingEnabled(true);
- const validateType = (_props$pos4 = props.pos) === null || _props$pos4 === void 0 || (_props$pos4 = _props$pos4.options) === null || _props$pos4 === void 0 || (_props$pos4 = _props$pos4.validation) === null || _props$pos4 === void 0 ? void 0 : _props$pos4.type;
+ const validateType = (_props$pos3 = props.pos) === null || _props$pos3 === void 0 || (_props$pos3 = _props$pos3.options) === null || _props$pos3 === void 0 || (_props$pos3 = _props$pos3.validation) === null || _props$pos3 === void 0 ? void 0 : _props$pos3.type;
let regexValidation;
if (validateType && validateType !== "text") {
switch (validateType) {
@@ -7447,7 +7426,7 @@ function PlaceholderType(props) {
validateExpression(regexValidation);
break;
default:
- regexValidation = ((_props$pos5 = props.pos) === null || _props$pos5 === void 0 || (_props$pos5 = _props$pos5.options) === null || _props$pos5 === void 0 || (_props$pos5 = _props$pos5.validation) === null || _props$pos5 === void 0 ? void 0 : _props$pos5.pattern) || "";
+ regexValidation = ((_props$pos4 = props.pos) === null || _props$pos4 === void 0 || (_props$pos4 = _props$pos4.options) === null || _props$pos4 === void 0 || (_props$pos4 = _props$pos4.validation) === null || _props$pos4 === void 0 ? void 0 : _props$pos4.pattern) || "";
validateExpression(regexValidation);
}
}
@@ -7472,35 +7451,35 @@ function PlaceholderType(props) {
}
}
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
- var _props$pos6, _props$pos8, _props$pos10, _props$pos11, _props$pos12, _props$pos13, _props$pos14, _props$pos15, _props$pos16, _props$pos17;
+ var _props$pos5, _props$pos7, _props$pos9, _props$pos10, _props$pos11, _props$pos12, _props$pos13, _props$pos14, _props$pos15, _props$pos16;
if (type && type === "checkbox" && props.isNeedSign) {
var _props$pos$options;
const isDefaultValue = (_props$pos$options = props.pos.options) === null || _props$pos$options === void 0 ? void 0 : _props$pos$options.defaultValue;
if (isDefaultValue) {
setSelectedCheckbox(isDefaultValue);
}
- } else if ((_props$pos6 = props.pos) !== null && _props$pos6 !== void 0 && (_props$pos6 = _props$pos6.options) !== null && _props$pos6 !== void 0 && _props$pos6.hint) {
- var _props$pos7;
- setValidatePlaceholder((_props$pos7 = props.pos) === null || _props$pos7 === void 0 ? void 0 : _props$pos7.options.hint);
- } else if ((_props$pos8 = props.pos) !== null && _props$pos8 !== void 0 && (_props$pos8 = _props$pos8.options) !== null && _props$pos8 !== void 0 && (_props$pos8 = _props$pos8.validation) !== null && _props$pos8 !== void 0 && _props$pos8.type) {
- var _props$pos9;
- checkRegularExpress((_props$pos9 = props.pos) === null || _props$pos9 === void 0 || (_props$pos9 = _props$pos9.options) === null || _props$pos9 === void 0 || (_props$pos9 = _props$pos9.validation) === null || _props$pos9 === void 0 ? void 0 : _props$pos9.type);
+ } else if ((_props$pos5 = props.pos) !== null && _props$pos5 !== void 0 && (_props$pos5 = _props$pos5.options) !== null && _props$pos5 !== void 0 && _props$pos5.hint) {
+ var _props$pos6;
+ setValidatePlaceholder((_props$pos6 = props.pos) === null || _props$pos6 === void 0 ? void 0 : _props$pos6.options.hint);
+ } else if ((_props$pos7 = props.pos) !== null && _props$pos7 !== void 0 && (_props$pos7 = _props$pos7.options) !== null && _props$pos7 !== void 0 && (_props$pos7 = _props$pos7.validation) !== null && _props$pos7 !== void 0 && _props$pos7.type) {
+ var _props$pos8;
+ checkRegularExpress((_props$pos8 = props.pos) === null || _props$pos8 === void 0 || (_props$pos8 = _props$pos8.options) === null || _props$pos8 === void 0 || (_props$pos8 = _props$pos8.validation) === null || _props$pos8 === void 0 ? void 0 : _props$pos8.type);
}
- setTextValue((_props$pos10 = props.pos) !== null && _props$pos10 !== void 0 && (_props$pos10 = _props$pos10.options) !== null && _props$pos10 !== void 0 && _props$pos10.response ? (_props$pos11 = props.pos) === null || _props$pos11 === void 0 || (_props$pos11 = _props$pos11.options) === null || _props$pos11 === void 0 ? void 0 : _props$pos11.response : (_props$pos12 = props.pos) !== null && _props$pos12 !== void 0 && (_props$pos12 = _props$pos12.options) !== null && _props$pos12 !== void 0 && _props$pos12.defaultValue ? (_props$pos13 = props.pos) === null || _props$pos13 === void 0 || (_props$pos13 = _props$pos13.options) === null || _props$pos13 === void 0 ? void 0 : _props$pos13.defaultValue : "");
- setSelectOption((_props$pos14 = props.pos) !== null && _props$pos14 !== void 0 && (_props$pos14 = _props$pos14.options) !== null && _props$pos14 !== void 0 && _props$pos14.response ? (_props$pos15 = props.pos) === null || _props$pos15 === void 0 || (_props$pos15 = _props$pos15.options) === null || _props$pos15 === void 0 ? void 0 : _props$pos15.response : (_props$pos16 = props.pos) !== null && _props$pos16 !== void 0 && (_props$pos16 = _props$pos16.options) !== null && _props$pos16 !== void 0 && _props$pos16.defaultValue ? (_props$pos17 = props.pos) === null || _props$pos17 === void 0 || (_props$pos17 = _props$pos17.options) === null || _props$pos17 === void 0 ? void 0 : _props$pos17.defaultValue : "");
+ setTextValue((_props$pos9 = props.pos) !== null && _props$pos9 !== void 0 && (_props$pos9 = _props$pos9.options) !== null && _props$pos9 !== void 0 && _props$pos9.response ? (_props$pos10 = props.pos) === null || _props$pos10 === void 0 || (_props$pos10 = _props$pos10.options) === null || _props$pos10 === void 0 ? void 0 : _props$pos10.response : (_props$pos11 = props.pos) !== null && _props$pos11 !== void 0 && (_props$pos11 = _props$pos11.options) !== null && _props$pos11 !== void 0 && _props$pos11.defaultValue ? (_props$pos12 = props.pos) === null || _props$pos12 === void 0 || (_props$pos12 = _props$pos12.options) === null || _props$pos12 === void 0 ? void 0 : _props$pos12.defaultValue : "");
+ setSelectOption((_props$pos13 = props.pos) !== null && _props$pos13 !== void 0 && (_props$pos13 = _props$pos13.options) !== null && _props$pos13 !== void 0 && _props$pos13.response ? (_props$pos14 = props.pos) === null || _props$pos14 === void 0 || (_props$pos14 = _props$pos14.options) === null || _props$pos14 === void 0 ? void 0 : _props$pos14.response : (_props$pos15 = props.pos) !== null && _props$pos15 !== void 0 && (_props$pos15 = _props$pos15.options) !== null && _props$pos15 !== void 0 && _props$pos15.defaultValue ? (_props$pos16 = props.pos) === null || _props$pos16 === void 0 || (_props$pos16 = _props$pos16.options) === null || _props$pos16 === void 0 ? void 0 : _props$pos16.defaultValue : "");
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
- var _props$pos18, _props$data;
- if (["name", "email", "job title", "company"].includes((_props$pos18 = props.pos) === null || _props$pos18 === void 0 ? void 0 : _props$pos18.type) && props.isNeedSign && ((_props$data = props.data) === null || _props$data === void 0 ? void 0 : _props$data.signerObjId) === (props === null || props === void 0 ? void 0 : props.signerObjId)) {
- var _props$pos19;
- const defaultData = (_props$pos19 = props.pos) === null || _props$pos19 === void 0 || (_props$pos19 = _props$pos19.options) === null || _props$pos19 === void 0 ? void 0 : _props$pos19.defaultValue;
+ var _props$pos17, _props$data;
+ if (["name", "email", "job title", "company"].includes((_props$pos17 = props.pos) === null || _props$pos17 === void 0 ? void 0 : _props$pos17.type) && props.isNeedSign && ((_props$data = props.data) === null || _props$data === void 0 ? void 0 : _props$data.signerObjId) === (props === null || props === void 0 ? void 0 : props.signerObjId)) {
+ var _props$pos18;
+ const defaultData = (_props$pos18 = props.pos) === null || _props$pos18 === void 0 || (_props$pos18 = _props$pos18.options) === null || _props$pos18 === void 0 ? void 0 : _props$pos18.defaultValue;
if (defaultData) {
setTextValue(defaultData);
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [(_props$pos20 = props.pos) === null || _props$pos20 === void 0 || (_props$pos20 = _props$pos20.options) === null || _props$pos20 === void 0 ? void 0 : _props$pos20.defaultValue]);
+ }, [(_props$pos19 = props.pos) === null || _props$pos19 === void 0 || (_props$pos19 = _props$pos19.options) === null || _props$pos19 === void 0 ? void 0 : _props$pos19.defaultValue]);
const ExampleCustomInput = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)((_ref, ref) => {
let {
value,
@@ -7633,7 +7612,7 @@ function PlaceholderType(props) {
className: "w-full h-full "
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "text-[11px] w-full h-full text-black flex flex-col justify-center items-center"
- }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data4 = props.data) === null || _props$data4 === void 0 ? void 0 : _props$data4.Id, props === null || props === void 0 || (_props$data5 = props.data) === null || _props$data5 === void 0 ? void 0 : _props$data5.Role, widgetTypeTraslation)));
+ }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data4 = props.data) === null || _props$data4 === void 0 ? void 0 : _props$data4.Id, props === null || props === void 0 || (_props$data5 = props.data) === null || _props$data5 === void 0 ? void 0 : _props$data5.Role, props === null || props === void 0 || (_props$pos20 = props.pos) === null || _props$pos20 === void 0 ? void 0 : _props$pos20.type)));
case "stamp":
return props.pos.SignUrl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
alt: "stamp",
@@ -7642,7 +7621,7 @@ function PlaceholderType(props) {
className: "w-full h-full"
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "text-[11px] w-full h-full text-black flex flex-col justify-center items-center"
- }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data6 = props.data) === null || _props$data6 === void 0 ? void 0 : _props$data6.Id, props === null || props === void 0 || (_props$data7 = props.data) === null || _props$data7 === void 0 ? void 0 : _props$data7.Role, widgetTypeTraslation)));
+ }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data6 = props.data) === null || _props$data6 === void 0 ? void 0 : _props$data6.Id, props === null || props === void 0 || (_props$data7 = props.data) === null || _props$data7 === void 0 ? void 0 : _props$data7.Role, props === null || props === void 0 || (_props$pos21 = props.pos) === null || _props$pos21 === void 0 ? void 0 : _props$pos21.type)));
case "checkbox":
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
style: {
@@ -7706,10 +7685,10 @@ function PlaceholderType(props) {
color: ((_props$pos$options16 = props.pos.options) === null || _props$pos$options16 === void 0 ? void 0 : _props$pos$options16.fontColor) || "black",
overflow: "hidden"
}
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, widgetTypeTraslation));
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, type));
case "dropdown":
return ((_props$data11 = props.data) === null || _props$data11 === void 0 ? void 0 : _props$data11.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", {
- className: "".concat(selectWidgetCls, " text-[12px] bg-inherit"),
+ className: "".concat(selectWidgetCls, " text-[12px]"),
id: "myDropdown",
value: selectOption,
onChange: e => {
@@ -7721,14 +7700,14 @@ function PlaceholderType(props) {
value: "",
disabled: true,
hidden: true
- }, props === null || props === void 0 || (_props$pos21 = props.pos) === null || _props$pos21 === void 0 || (_props$pos21 = _props$pos21.options) === null || _props$pos21 === void 0 ? void 0 : _props$pos21.name), (_props$pos22 = props.pos) === null || _props$pos22 === void 0 || (_props$pos22 = _props$pos22.options) === null || _props$pos22 === void 0 || (_props$pos22 = _props$pos22.values) === null || _props$pos22 === void 0 ? void 0 : _props$pos22.map((data, ind) => {
+ }, props === null || props === void 0 || (_props$pos22 = props.pos) === null || _props$pos22 === void 0 || (_props$pos22 = _props$pos22.options) === null || _props$pos22 === void 0 ? void 0 : _props$pos22.name), (_props$pos23 = props.pos) === null || _props$pos23 === void 0 || (_props$pos23 = _props$pos23.options) === null || _props$pos23 === void 0 || (_props$pos23 = _props$pos23.values) === null || _props$pos23 === void 0 ? void 0 : _props$pos23.map((data, ind) => {
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", {
key: ind,
value: data
}, data);
})) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "text-[12px] overflow-hidden"
- }, (_props$pos23 = props.pos) !== null && _props$pos23 !== void 0 && (_props$pos23 = _props$pos23.options) !== null && _props$pos23 !== void 0 && _props$pos23.name ? props.pos.options.name : widgetTypeTraslation);
+ }, (_props$pos24 = props.pos) !== null && _props$pos24 !== void 0 && (_props$pos24 = _props$pos24.options) !== null && _props$pos24 !== void 0 && _props$pos24.name ? props.pos.options.name : type);
case "initials":
return props.pos.SignUrl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
alt: "initials",
@@ -7737,7 +7716,7 @@ function PlaceholderType(props) {
className: "w-full h-full"
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "text-[11px] w-full h-full text-black flex flex-col justify-center items-center"
- }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data13 = props.data) === null || _props$data13 === void 0 ? void 0 : _props$data13.Id, props === null || props === void 0 || (_props$data14 = props.data) === null || _props$data14 === void 0 ? void 0 : _props$data14.Role, widgetTypeTraslation)));
+ }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data13 = props.data) === null || _props$data13 === void 0 ? void 0 : _props$data13.Id, props === null || props === void 0 || (_props$data14 = props.data) === null || _props$data14 === void 0 ? void 0 : _props$data14.Role, props === null || props === void 0 || (_props$pos25 = props.pos) === null || _props$pos25 === void 0 ? void 0 : _props$pos25.type)));
case "name":
return props.isSignYourself || props.isNeedSign && ((_props$data15 = props.data) === null || _props$data15 === void 0 ? void 0 : _props$data15.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", {
ref: inputRef,
@@ -7764,7 +7743,7 @@ function PlaceholderType(props) {
fontFamily: "Arial, sans-serif",
overflow: "hidden"
}
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, widgetTypeTraslation));
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, type));
case "company":
return props.isSignYourself || props.isNeedSign && ((_props$data17 = props.data) === null || _props$data17 === void 0 ? void 0 : _props$data17.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", {
ref: inputRef,
@@ -7790,7 +7769,7 @@ function PlaceholderType(props) {
overflow: "hidden",
fontFamily: "Arial, sans-serif"
}
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, widgetTypeTraslation));
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, type));
case "job title":
return props.isSignYourself || props.isNeedSign && ((_props$data19 = props.data) === null || _props$data19 === void 0 ? void 0 : _props$data19.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", {
ref: inputRef,
@@ -7816,9 +7795,9 @@ function PlaceholderType(props) {
fontFamily: "Arial, sans-serif",
overflow: "hidden"
}
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, widgetTypeTraslation));
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, type));
case "date":
- return props.isSignYourself || props.isNeedSign && ((_props$data21 = props.data) === null || _props$data21 === void 0 ? void 0 : _props$data21.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react_datepicker__WEBPACK_IMPORTED_MODULE_7___default()), {
+ return props.isSignYourself || props.isNeedSign && ((_props$data21 = props.data) === null || _props$data21 === void 0 ? void 0 : _props$data21.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react_datepicker__WEBPACK_IMPORTED_MODULE_6___default()), {
renderCustomHeader: _ref2 => {
let {
date,
@@ -7865,10 +7844,10 @@ function PlaceholderType(props) {
onChange: date => handleOnDateChange(date),
popperPlacement: "top-end",
customInput: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ExampleCustomInput, null),
- dateFormat: props.selectDate ? (_props$selectDate = props.selectDate) === null || _props$selectDate === void 0 ? void 0 : _props$selectDate.format : (_props$pos24 = props.pos) !== null && _props$pos24 !== void 0 && (_props$pos24 = _props$pos24.options) !== null && _props$pos24 !== void 0 && (_props$pos24 = _props$pos24.validation) !== null && _props$pos24 !== void 0 && _props$pos24.format ? (_props$pos25 = props.pos) === null || _props$pos25 === void 0 || (_props$pos25 = _props$pos25.options) === null || _props$pos25 === void 0 || (_props$pos25 = _props$pos25.validation) === null || _props$pos25 === void 0 ? void 0 : _props$pos25.format : "MM/dd/yyyy"
+ dateFormat: props.selectDate ? (_props$selectDate = props.selectDate) === null || _props$selectDate === void 0 ? void 0 : _props$selectDate.format : (_props$pos26 = props.pos) !== null && _props$pos26 !== void 0 && (_props$pos26 = _props$pos26.options) !== null && _props$pos26 !== void 0 && (_props$pos26 = _props$pos26.validation) !== null && _props$pos26 !== void 0 && _props$pos26.format ? (_props$pos27 = props.pos) === null || _props$pos27 === void 0 || (_props$pos27 = _props$pos27.options) === null || _props$pos27 === void 0 || (_props$pos27 = _props$pos27.validation) === null || _props$pos27 === void 0 ? void 0 : _props$pos27.format : "MM/dd/yyyy"
})) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "text-[12px] text-black items-center overflow-hidden"
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, props.selectDate ? (_props$selectDate2 = props.selectDate) === null || _props$selectDate2 === void 0 ? void 0 : _props$selectDate2.format : (_props$pos26 = props.pos) !== null && _props$pos26 !== void 0 && (_props$pos26 = _props$pos26.options) !== null && _props$pos26 !== void 0 && (_props$pos26 = _props$pos26.validation) !== null && _props$pos26 !== void 0 && _props$pos26.format ? (_props$pos27 = props.pos) === null || _props$pos27 === void 0 || (_props$pos27 = _props$pos27.options) === null || _props$pos27 === void 0 || (_props$pos27 = _props$pos27.validation) === null || _props$pos27 === void 0 ? void 0 : _props$pos27.format : "MM/dd/yyyy"));
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, props.selectDate ? (_props$selectDate2 = props.selectDate) === null || _props$selectDate2 === void 0 ? void 0 : _props$selectDate2.format : (_props$pos28 = props.pos) !== null && _props$pos28 !== void 0 && (_props$pos28 = _props$pos28.options) !== null && _props$pos28 !== void 0 && (_props$pos28 = _props$pos28.validation) !== null && _props$pos28 !== void 0 && _props$pos28.format ? (_props$pos29 = props.pos) === null || _props$pos29 === void 0 || (_props$pos29 = _props$pos29.options) === null || _props$pos29 === void 0 || (_props$pos29 = _props$pos29.validation) === null || _props$pos29 === void 0 ? void 0 : _props$pos29.format : "MM/dd/yyyy"));
case "image":
return props.pos.SignUrl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
alt: "image",
@@ -7877,7 +7856,7 @@ function PlaceholderType(props) {
className: "w-full h-full"
}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "text-[11px] w-full h-full text-black flex flex-col justify-center items-center"
- }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data23 = props.data) === null || _props$data23 === void 0 ? void 0 : _props$data23.Id, props === null || props === void 0 || (_props$data24 = props.data) === null || _props$data24 === void 0 ? void 0 : _props$data24.Role, widgetTypeTraslation)));
+ }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data23 = props.data) === null || _props$data23 === void 0 ? void 0 : _props$data23.Id, props === null || props === void 0 || (_props$data24 = props.data) === null || _props$data24 === void 0 ? void 0 : _props$data24.Role, props === null || props === void 0 || (_props$pos30 = props.pos) === null || _props$pos30 === void 0 ? void 0 : _props$pos30.type)));
case "email":
return props.isSignYourself || props.isNeedSign && ((_props$data25 = props.data) === null || _props$data25 === void 0 ? void 0 : _props$data25.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", {
ref: inputRef,
@@ -7905,7 +7884,7 @@ function PlaceholderType(props) {
fontFamily: "Arial, sans-serif",
overflow: "hidden"
}
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, widgetTypeTraslation));
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, type));
case _constant_Utils__WEBPACK_IMPORTED_MODULE_1__.radioButtonWidget:
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, (_props$pos$options42 = props.pos.options) === null || _props$pos$options42 === void 0 ? void 0 : _props$pos$options42.values.map((data, ind) => {
var _props$pos$options43, _props$data27, _props$pos$options44;
@@ -7976,8 +7955,6 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
-
function PrevNext(_ref) {
let {
@@ -7985,9 +7962,6 @@ function PrevNext(_ref) {
allPages,
changePage
} = _ref;
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)();
//for go to previous page
function previousPage() {
changePage(-1);
@@ -8003,22 +7977,26 @@ function PrevNext(_ref) {
disabled: pageNumber <= 1,
onClick: previousPage
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
- className: "block"
+ className: "block lg:hidden"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-backward",
"aria-hidden": "true"
- }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "lg:block hidden 2xl:text-[30px]"
+ }, "Prev")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "text-xs text-base-content font-medium mx-2 2xl:text-[30px]"
- }, pageNumber || (allPages ? 1 : "--"), " ", t("of"), " ", allPages || "--"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, pageNumber || (allPages ? 1 : "--"), " of ", allPages || "--"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
className: "op-btn op-btn-neutral op-btn-xs md:op-btn-sm font-semibold text-xs",
disabled: pageNumber >= allPages,
onClick: nextPage
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
- className: "block"
+ className: "block lg:hidden"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "fa-light fa-forward",
"aria-hidden": "true"
- }))));
+ })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "lg:block hidden 2xl:text-[30px]"
+ }, "Next")));
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PrevNext);
@@ -8037,11 +8015,9 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
-/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Document.js");
-/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Page.js");
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs");
-
+/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Document.js");
+/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Page.js");
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs");
@@ -8057,9 +8033,6 @@ function RenderAllPdfPage(_ref) {
signerObjectId,
containerWH
} = _ref;
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)();
const [signPageNumber, setSignPageNumber] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
const [bookmarkColor, setBookmarkColor] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("");
//set all number of pages after load pdf
@@ -8084,7 +8057,7 @@ function RenderAllPdfPage(_ref) {
}
}
const pageContainer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
- const isHeader = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(state => state.showHeader);
+ const isHeader = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(state => state.showHeader);
const [pageWidth, setPageWidth] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("");
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
const updateSize = () => {
@@ -8115,10 +8088,10 @@ function RenderAllPdfPage(_ref) {
className: "hidden w-[20%] bg-base-100 md:block"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300"
- }, t("pages")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Pages"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex h-[90%] flex-col items-center m-2 \n autoSignScroll hide-scrollbar max-h-[100vh] "
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_3__["default"], {
- loading: t("loading-doc"),
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_2__["default"], {
+ loading: "Loading Document..",
onLoadSuccess: onDocumentLoad,
file: signPdfUrl
}, Array.from(new Array(allPages), (el, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -8132,7 +8105,7 @@ function RenderAllPdfPage(_ref) {
}
}, signerPos && addSignatureBookmark(index), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "relative z-[1] overflow-hidden"
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_4__["default"], {
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_3__["default"], {
key: "page_".concat(index + 1),
pageNumber: index + 1,
width: pageWidth - 60,
@@ -8613,7 +8586,7 @@ function RenderPdf(_ref) {
}));
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_5__["default"], {
onLoadError: () => {
- setPdfLoad(false);
+ pdfLoad(false);
},
loading: "Loading Document..",
onLoadSuccess: pageDetails,
@@ -8656,10 +8629,8 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
-/* harmony import */ var react_signature_canvas__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-signature-canvas */ "./node_modules/react-signature-canvas/build/index.js");
-/* harmony import */ var react_signature_canvas__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_signature_canvas__WEBPACK_IMPORTED_MODULE_2__);
-
+/* harmony import */ var react_signature_canvas__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-signature-canvas */ "./node_modules/react-signature-canvas/build/index.js");
+/* harmony import */ var react_signature_canvas__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_signature_canvas__WEBPACK_IMPORTED_MODULE_1__);
function SignPad(_ref) {
@@ -8685,9 +8656,6 @@ function SignPad(_ref) {
currWidgetsDetails,
setCurrWidgetsDetails
} = _ref;
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)();
const [penColor, setPenColor] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("blue");
const allColor = ["blue", "red", "black"];
const canvasRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
@@ -8740,7 +8708,7 @@ function SignPad(_ref) {
type: "button",
className: "op-btn op-btn-ghost mr-1 mt-[2px]",
onClick: () => handleClear()
- }, t("clear")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Clear"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
onClick: () => {
setCurrWidgetsDetails({});
if (!image) {
@@ -8754,7 +8722,7 @@ function SignPad(_ref) {
} else {
if (isTab === "type") {
setIsSignImg("");
- onSaveSign(null, false, !isInitial && textWidth > 150 ? 150 : textWidth, !isInitial && textHeight > 35 ? 35 : textHeight);
+ onSaveSign(null, false, textWidth, textHeight);
} else {
setIsSignImg("");
canvasRef.current.clear();
@@ -8778,7 +8746,7 @@ function SignPad(_ref) {
type: "button",
className: "".concat(isSignImg || image || isDefaultSign || textWidth ? "" : "pointer-events-none", " op-btn op-btn-primary shadow-lg"),
disabled: isTab === "draw" && isSignImg || isTab === "image" && image || isTab === "mysignature" && isDefaultSign || isTab === "type" && textWidth ? false : image ? false : true
- }, t("save")));
+ }, "Save"));
};
//useEffect for set already draw or save signature url/text url of signature text type and draw type for initial type and signature type widgets
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
@@ -8835,11 +8803,11 @@ function SignPad(_ref) {
//get text content to convert in image
const textContent = text;
const fontfamily = fontStyle ? fontStyle : fontSelect ? fontSelect : "Fasthand";
- const fontSizeValue = "40px";
+
//creating span for getting text content width
const span = document.createElement("span");
span.textContent = textContent;
- span.style.font = "".concat(fontSizeValue, " ").concat(fontfamily); // here put your text size and font family
+ span.style.font = "20px ".concat(fontfamily); // here put your text size and font family
span.style.color = color ? color : penColor;
span.style.display = "hidden";
document.body.appendChild(span); // Replace 'container' with the ID of the container element
@@ -8849,8 +8817,7 @@ function SignPad(_ref) {
// Draw the text content on the canvas
const ctx = canvasElement.getContext("2d");
const pixelRatio = window.devicePixelRatio || 1;
- const addExtraWidth = isInitial ? 10 : 50;
- const width = span.offsetWidth + addExtraWidth;
+ const width = span.offsetWidth;
const height = span.offsetHeight;
setTextWidth(width);
setTextHeight(height);
@@ -8914,7 +8881,7 @@ function SignPad(_ref) {
className: "flex flex-row justify-between gap-[5px] md:gap-[8px] text-[11px] md:text-base"
}, isStamp ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "text-base-content font-bold text-lg"
- }, widgetType === "image" || (currWidgetsDetails === null || currWidgetsDetails === void 0 ? void 0 : currWidgetsDetails.type) === "image" ? t("upload-image") : t("upload-stamp-image")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ }, widgetType === "image" || (currWidgetsDetails === null || currWidgetsDetails === void 0 ? void 0 : currWidgetsDetails.type) === "image" ? "Upload image" : "Upload stamp image") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
onClick: () => {
setIsDefaultSign(false);
setIsImageSelect(false);
@@ -8925,7 +8892,7 @@ function SignPad(_ref) {
}
},
className: "".concat(isTab === "draw" ? "op-link-primary" : "no-underline", " op-link underline-offset-8 ml-[2px]")
- }, t("draw"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ }, "Draw")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
onClick: () => {
setIsDefaultSign(false);
setIsImageSelect(true);
@@ -8933,7 +8900,7 @@ function SignPad(_ref) {
setSignatureType("");
},
className: "".concat(isTab === "uploadImage" ? "op-link-primary" : "no-underline", " op-link underline-offset-8 ml-[2px]")
- }, t("upload-image"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ }, "Upload Image")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
onClick: () => {
setIsDefaultSign(false);
setIsImageSelect(false);
@@ -8942,7 +8909,7 @@ function SignPad(_ref) {
setImage();
},
className: "".concat(isTab === "type" ? "op-link-primary" : "no-underline", " op-link underline-offset-8 ml-[2px]")
- }, t("type"))), !isInitial && defaultSign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ }, "Type")), !isInitial && defaultSign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
onClick: () => {
setIsDefaultSign(true);
setIsImageSelect(true);
@@ -8951,7 +8918,7 @@ function SignPad(_ref) {
setImage();
},
className: "".concat(isTab === "mysignature" ? "op-link-primary" : "no-underline", " op-link underline-offset-8 ml-[2px]")
- }, t("my-signature"))) : isInitial && myInitial && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ }, "My Signature")) : isInitial && myInitial && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
onClick: () => {
setIsDefaultSign(true);
setIsImageSelect(true);
@@ -8960,7 +8927,7 @@ function SignPad(_ref) {
setImage();
},
className: "".concat(isTab === "mysignature" ? "op-link-primary" : "no-underline", " op-link underline-offset-8 ml-[2px]")
- }, t("my-initials"))))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "My Initials")))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "text-[1.5rem] cursor-pointer",
onClick: () => {
setPenColor("blue");
@@ -9023,7 +8990,7 @@ function SignPad(_ref) {
className: "fa-light fa-cloud-upload-alt uploadImgLogo"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "text-[10px]"
- }, t("upload")))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Upload"))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex justify-center"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
style: {
@@ -9045,7 +9012,7 @@ function SignPad(_ref) {
className: "flex justify-between items-center"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "mr-[5px] text-[12px]"
- }, isInitial ? t("initial-teb") : t("signature-tab"), ":"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ }, isInitial ? "Initials" : "Signature", ":"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
maxLength: isInitial ? 3 : 30,
style: {
fontFamily: fontSelect,
@@ -9086,7 +9053,7 @@ function SignPad(_ref) {
convertToImg: convertToImg
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SaveBtn, null))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex justify-center"
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react_signature_canvas__WEBPACK_IMPORTED_MODULE_2___default()), {
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react_signature_canvas__WEBPACK_IMPORTED_MODULE_1___default()), {
ref: canvasRef,
penColor: penColor,
canvasProps: {
@@ -9186,21 +9153,16 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _primitives_Loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../primitives/Loader */ "./src/primitives/Loader.js");
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
-
function VerifyEmail(props) {
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)();
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("dialog", {
className: "op-modal op-modal-open absolute z-[1999]"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "md:w-[40%] w-[80%] op-modal-box p-0 overflow-y-auto hide-scrollbar text-sm"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h3", {
className: "font-bold text-lg pt-[15px] px-[20px] text-base-content"
- }, t("otp-verification")), props.isVerifyModal ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
+ }, "OTP verification"), props.isVerifyModal ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
onSubmit: e => {
props.setIsVerifyModal(false);
props.handleVerifyEmail(e);
@@ -9209,13 +9171,12 @@ function VerifyEmail(props) {
className: "px-6 py-3 text-base-content"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
className: "mb-2"
- }, t("enter-otp")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
- onInvalid: e => e.target.setCustomValidity(t("input-required")),
+ }, "Enter OTP"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
required: true,
type: "tel",
pattern: "[0-9]{4}",
className: "w-full op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-xs",
- placeholder: t("otp-placeholder"),
+ placeholder: "Enter OTP received over email",
value: props.otp,
onChange: e => props.setOtp(e.target.value)
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -9223,16 +9184,16 @@ function VerifyEmail(props) {
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "submit",
className: "op-btn op-btn-primary"
- }, t("verify")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Verify"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
className: "op-btn op-btn-secondary ml-2",
onClick: e => props.handleResend(e)
- }, t("resend")))) : props.otpLoader ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Resend"))) : props.otpLoader ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "h-[150px] flex items-center justify-center"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Loader__WEBPACK_IMPORTED_MODULE_1__["default"], null)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "px-6 py-3 text-base-content"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
className: "mb-2 text-sm"
- }, t("verify-email")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Please verify your email !"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "px-0 mt-3"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
className: "op-btn op-btn-primary",
@@ -9240,7 +9201,7 @@ function VerifyEmail(props) {
onClick: () => {
props.handleVerifyBtn();
}
- }, t("send-otp"))))));
+ }, "Send OTP")))));
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VerifyEmail);
@@ -9319,7 +9280,6 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ replaceMailVaribles: () => (/* binding */ replaceMailVaribles),
/* harmony export */ resizeBorderExtraWidth: () => (/* binding */ resizeBorderExtraWidth),
/* harmony export */ sanitizeFileName: () => (/* binding */ sanitizeFileName),
-/* harmony export */ saveLanguageInLocal: () => (/* binding */ saveLanguageInLocal),
/* harmony export */ signPdfFun: () => (/* binding */ signPdfFun),
/* harmony export */ textInputWidget: () => (/* binding */ textInputWidget),
/* harmony export */ textWidget: () => (/* binding */ textWidget),
@@ -9327,7 +9287,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ urlValidator: () => (/* binding */ urlValidator),
/* harmony export */ widgets: () => (/* binding */ widgets)
/* harmony export */ });
-/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! axios */ "./node_modules/axios/lib/axios.js");
+/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! axios */ "./node_modules/axios/lib/axios.js");
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js");
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
@@ -9340,8 +9300,6 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var print_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! print-js */ "./node_modules/print-js/dist/print.js");
/* harmony import */ var print_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(print_js__WEBPACK_IMPORTED_MODULE_6__);
-/* harmony import */ var _json_plansArr__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../json/plansArr */ "./src/json/plansArr.js");
-
@@ -9388,7 +9346,7 @@ async function fetchSubscription(extUserId, contactObjId) {
} : {
extUserId: extUser
};
- const tenatRes = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post(url, params, {
+ const tenatRes = await axios__WEBPACK_IMPORTED_MODULE_7__["default"].post(url, params, {
headers: headers
});
let plan, status, billingDate;
@@ -9442,7 +9400,7 @@ async function checkIsSubscribedTeam() {
if (res.plan === "freeplan") {
return false;
} else if (res.billingDate) {
- const plan = _json_plansArr__WEBPACK_IMPORTED_MODULE_7__.validplan[res.plan] || false;
+ const plan = res.plan === "team-weekly" || res.plan === "team-yearly" || res.plan === "teams-monthly" || res.plan === "teams-yearly" || res.plan === "enterprise-monthly" || res.plan === "enterprise-yearly";
if (plan && new Date(res.billingDate) > new Date()) {
return true;
} else {
@@ -9477,7 +9435,7 @@ const getDrive = async function (documentId) {
limit: limit,
skip: skip
};
- const driveDeatils = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getDrive"), data, {
+ const driveDeatils = await axios__WEBPACK_IMPORTED_MODULE_7__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getDrive"), data, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -9507,19 +9465,28 @@ const pdfNewWidthFun = divRef => {
};
//`contractUsers` function is used to get contract_User details
-const contractUsers = async () => {
- try {
- const userDetails = await parse__WEBPACK_IMPORTED_MODULE_3___default().Cloud.run("getUserDetails");
+const contractUsers = async email => {
+ const data = {
+ email: email
+ };
+ const userDetails = await axios__WEBPACK_IMPORTED_MODULE_7__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getUserDetails"), data, {
+ headers: {
+ "Content-Type": "application/json",
+ "X-Parse-Application-Id": localStorage.getItem("parseAppId"),
+ sessionToken: localStorage.getItem("accesstoken")
+ }
+ }).then(Listdata => {
+ const json = Listdata.data;
let data = [];
- if (userDetails) {
- const json = JSON.parse(JSON.stringify(userDetails));
- data.push(json);
+ if (json && json.result) {
+ data.push(json.result);
}
return data;
- } catch (err) {
+ }).catch(err => {
console.log("Err in getUserDetails cloud function", err);
return "Error: Something went wrong!";
- }
+ });
+ return userDetails;
};
//function for resize image and update width and height for mulitisigners
@@ -9697,7 +9664,7 @@ const addWidgetOptions = type => {
return {};
}
};
-const getWidgetType = (item, widgetName) => {
+const getWidgetType = item => {
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", {
className: "op-btn w-fit md:w-[100%] op-btn-primary op-btn-outline op-btn-sm focus:outline-none outline outline-[1.5px] ml-[6px] md:ml-0 p-0 overflow-hidden"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", {
@@ -9708,7 +9675,7 @@ const getWidgetType = (item, widgetName) => {
className: "fa-light fa-grip-vertical ml-[3px]"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", {
className: "md:inline-block text-center text-[15px] ml-[5px] font-semibold pr-1 md:pr-0"
- }, widgetName)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", {
+ }, item.type)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", {
className: "text-[20px] op-btn op-btn-primary rounded-none w-[40px] h-full flex justify-center items-center"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("i", {
className: item.icon
@@ -9872,16 +9839,14 @@ const handleSignYourselfImageResize = (ref, key, xyPostion, setXyPostion, index,
};
//function for call cloud function signPdf and generate digital signature
-const signPdfFun = async (base64Url, documentId, signerObjectId, objectId, isSubscribed, activeMailAdapter, widgets) => {
- let isCustomCompletionMail = false;
+const signPdfFun = async (base64Url, documentId, signerObjectId, setIsAlert, objectId, isSubscribed, activeMailAdapter, xyPosition) => {
+ let singleSign,
+ isCustomCompletionMail = false;
try {
//get tenant details
const tenantDetails = await getTenantDetails(objectId);
if (tenantDetails && tenantDetails === "user does not exist!") {
- return {
- status: "error",
- message: "User does not exist."
- };
+ alert("User does not exist");
} else {
if (tenantDetails !== null && tenantDetails !== void 0 && tenantDetails.CompletionBody && tenantDetails !== null && tenantDetails !== void 0 && tenantDetails.CompletionSubject && isSubscribed) {
isCustomCompletionMail = true;
@@ -9891,7 +9856,7 @@ const signPdfFun = async (base64Url, documentId, signerObjectId, objectId, isSub
// below for loop is used to get first signature of user to send if to signpdf
// for adding it in completion certificate
let getSignature;
- for (let item of widgets) {
+ for (let item of xyPosition) {
if (!getSignature) {
const typeExist = item.pos.some(data => data === null || data === void 0 ? void 0 : data.type);
if (typeExist) {
@@ -9909,17 +9874,13 @@ const signPdfFun = async (base64Url, documentId, signerObjectId, objectId, isSub
base64Sign = await fetchImageBase64(base64Sign);
} catch (e) {
console.log("error", e);
- return {
- status: "error",
- message: "something went wrong."
- };
}
}
- //change image width and height to 100/40 in png base64
+ //change image width and height to 104/44 in png base64
const getNewse64 = await changeImageWH(base64Sign);
//remove suffiix of base64
const suffixbase64 = getNewse64 && getNewse64.split(",").pop();
- const params = {
+ singleSign = {
mailProvider: activeMailAdapter,
pdfFile: base64Url,
docId: documentId,
@@ -9927,30 +9888,30 @@ const signPdfFun = async (base64Url, documentId, signerObjectId, objectId, isSub
isCustomCompletionMail: isCustomCompletionMail,
signature: suffixbase64
};
- const resSignPdf = await parse__WEBPACK_IMPORTED_MODULE_3___default().Cloud.run("signPdf", params);
- if (resSignPdf) {
- const signedPdf = JSON.parse(JSON.stringify(resSignPdf));
- return signedPdf;
- }
+ const response = await axios__WEBPACK_IMPORTED_MODULE_7__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/signPdf"), singleSign, {
+ headers: {
+ "Content-Type": "application/json",
+ "X-Parse-Application-Id": localStorage.getItem("parseAppId"),
+ // sessionToken: localStorage.getItem("accesstoken")
+ "X-Parse-Session-Token": localStorage.getItem("accesstoken")
+ }
+ }).then(Listdata => {
+ const json = Listdata.data;
+ const res = json.result;
+ return res;
+ }).catch(err => {
+ console.log("Err in signPdf cloud function ", err);
+ setIsAlert({
+ isShow: true,
+ alertMessage: "something went wrong"
+ });
+ });
+ return response;
} catch (e) {
- var _e$message;
- console.log("Err in signPdf cloud function ", e.message);
- if (e && e !== null && e !== void 0 && (_e$message = e.message) !== null && _e$message !== void 0 && _e$message.includes("is encrypted.")) {
- return {
- status: "error",
- message: "Currently encrypted pdf files are not supported."
- };
- } else if (e.message === "PKCS#12 MAC could not be verified. Invalid password?") {
- return {
- status: "error",
- message: "PFX file password is invalid."
- };
- } else {
- return {
- status: "error",
- message: "something went wrong."
- };
- }
+ setIsAlert({
+ isShow: true,
+ alertMessage: "something went wrong"
+ });
}
};
const randomId = () => {
@@ -10003,7 +9964,7 @@ const createDocument = async (template, placeholders, signerData) => {
RemindOnceInEvery: parseInt((Doc === null || Doc === void 0 ? void 0 : Doc.RemindOnceInEvery) || 5)
};
try {
- const res = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Document"), data, {
+ const res = await axios__WEBPACK_IMPORTED_MODULE_7__["default"].post("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Document"), data, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -10516,8 +10477,9 @@ const changeImageWH = async base64Image => {
const ctx = canvas.getContext("2d");
canvas.width = newWidth;
canvas.height = newHeight;
+ ctx.imageSmoothingEnabled = false;
ctx.drawImage(img, 0, 0, newWidth, newHeight);
- const resizedBase64 = canvas.toDataURL("image/png", 1.0);
+ const resizedBase64 = canvas.toDataURL("image/png", 1);
resolve(resizedBase64);
};
img.onerror = error => {
@@ -10537,8 +10499,8 @@ const calculateFontSize = (position, containerScale, signyourself) => {
}
};
//function for embed multiple signature using pdf-lib
-const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale, pdfOriginalWH, containerWH) => {
- for (let item of widgets) {
+const multiSignEmbed = async (xyPositionArray, pdfDoc, signyourself, scale, pdfOriginalWH, containerWH) => {
+ for (let item of xyPositionArray) {
const containerScale = getContainerScale(pdfOriginalWH, item === null || item === void 0 ? void 0 : item.pageNumber, containerWH);
const typeExist = item.pos.some(data => data === null || data === void 0 ? void 0 : data.type);
let updateItem;
@@ -10876,7 +10838,7 @@ const placeholderHeight = pos => {
//function for getting contracts_contactbook details
const contactBook = async objectId => {
- const result = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].get("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Contactbook?where={\"objectId\":\"").concat(objectId, "\"}"), {
+ const result = await axios__WEBPACK_IMPORTED_MODULE_7__["default"].get("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Contactbook?where={\"objectId\":\"").concat(objectId, "\"}"), {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -10898,7 +10860,7 @@ const contractDocument = async documentId => {
const data = {
docId: documentId
};
- const documentDeatils = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getDocument"), data, {
+ const documentDeatils = await axios__WEBPACK_IMPORTED_MODULE_7__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getDocument"), data, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -11178,7 +11140,7 @@ const handleSendOTP = async email => {
const body = {
email: email
};
- await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post(url, body, {
+ await axios__WEBPACK_IMPORTED_MODULE_7__["default"].post(url, body, {
headers: headers
});
} catch (error) {
@@ -11205,7 +11167,7 @@ const handleDownloadPdf = async (pdfDetails, pdfUrl, setIsDownloading) => {
setIsDownloading("pdf");
try {
// const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl });
- const axiosRes = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/getsignedurl"), {
+ const axiosRes = await axios__WEBPACK_IMPORTED_MODULE_7__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/getsignedurl"), {
url: pdfUrl
}, {
headers: {
@@ -11235,7 +11197,7 @@ const handleToPrint = async (event, pdfUrl, setIsDownloading) => {
// const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl });
//`localStorage.getItem("baseUrl")` is also use in public-profile flow for public-sign
//if we give this `appInfo.baseUrl` as a base url then in public-profile it will create base url of it's window.location.origin ex- opensign.me which is not base url
- const axiosRes = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/getsignedurl"), {
+ const axiosRes = await axios__WEBPACK_IMPORTED_MODULE_7__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/getsignedurl"), {
url: pdfUrl
}, {
headers: {
@@ -11290,7 +11252,7 @@ const handleDownloadCertificate = async (pdfDetails, setIsDownloading) => {
const data = {
docId: (_pdfDetails$4 = pdfDetails[0]) === null || _pdfDetails$4 === void 0 ? void 0 : _pdfDetails$4.objectId
};
- const docDetails = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getDocument"), data, {
+ const docDetails = await axios__WEBPACK_IMPORTED_MODULE_7__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getDocument"), data, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -11410,12 +11372,6 @@ const getContainerScale = (pdfOriginalWH, pageNumber, containerWH) => {
return containerScale;
};
-//function to get current laguage and set it in local
-const saveLanguageInLocal = i18n => {
- const detectedLanguage = i18n.language || "en";
- localStorage.setItem("i18nextLng", detectedLanguage);
-};
-
/***/ }),
/***/ "./src/constant/appinfo.js":
@@ -11427,14 +11383,26 @@ const saveLanguageInLocal = i18n => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ appInfo: () => (/* binding */ appInfo)
+/* harmony export */ appInfo: () => (/* binding */ appInfo),
+/* harmony export */ serverUrl_fn: () => (/* binding */ serverUrl_fn)
/* harmony export */ });
/* harmony import */ var _assets_images_logo_png__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../assets/images/logo.png */ "./src/assets/images/logo.png");
+/* harmony import */ var _const__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./const */ "./src/constant/const.js");
+
+function serverUrl_fn() {
+ let baseUrl;
+ if (_const__WEBPACK_IMPORTED_MODULE_1__.isEnableSubscription) {
+ baseUrl = true ? "https://localhost:3001/app" : 0;
+ } else {
+ baseUrl = true ? "https://localhost:3001/app" : 0;
+ }
+ return baseUrl;
+}
const appInfo = {
applogo: _assets_images_logo_png__WEBPACK_IMPORTED_MODULE_0__["default"],
appId: true ? "opensign" : 0,
- baseUrl: true ? "http://localhost:8080/app" : 0,
+ baseUrl: serverUrl_fn(),
defaultRole: "contracts_User",
fbAppId: "MISSING_ENV_VAR".REACT_APP_FBAPPID ? "".concat("MISSING_ENV_VAR".REACT_APP_FBAPPID) : "",
fev_Icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAALlJREFUaEPtmN0NwjAMBpNxYDKYiM1Yp90g93CKStH1NbIdfz921Dker2Pc+Js1cDF7MXAxASMGYkAigBI6vh9ZwoXP53uZoAYcvhwdA3mAVbI2aSb+9zFKU4IURB6j/HoPUIEa2G3iGIAhQQDlAUIoE2diabIklISS0NoFPebo77RF6OenEF3QntOm128he0GKrwHyACFoz2MgBqSGkpAEcHs47oHtN5AFakACqMNjQEMoE8SABFCHn4HE2zGHSLeEAAAAAElFTkSuQmCC",
@@ -11494,100 +11462,11 @@ const documentCls = "contracts_Document";
const themeColor = "#47a3ad";
const iconColor = "#686968";
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
-const isEnableSubscription = true && ((_process$env$REACT_AP = "true") === null || _process$env$REACT_AP === void 0 ? void 0 : _process$env$REACT_AP.toLowerCase()) === "true" ? true : false;
+const isEnableSubscription = "MISSING_ENV_VAR".REACT_APP_ENABLE_SUBSCRIPTION && ((_process$env$REACT_AP = "MISSING_ENV_VAR".REACT_APP_ENABLE_SUBSCRIPTION) === null || _process$env$REACT_AP === void 0 ? void 0 : _process$env$REACT_AP.toLowerCase()) === "true" ? true : false;
const isStaging = window.location.origin === "https://staging-app.opensignlabs.com";
/***/ }),
-/***/ "./src/json/plansArr.js":
-/*!******************************!*\
- !*** ./src/json/plansArr.js ***!
- \******************************/
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
-/* harmony export */ validplan: () => (/* binding */ validplan)
-/* harmony export */ });
-/* harmony import */ var _constant_const__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constant/const */ "./src/constant/const.js");
-
-const plans = [{
- planName: "OPENSIGNâ„¢ FREE",
- img: "free.png",
- currency: "",
- monthlyPrice: "Free",
- yearlyPrice: "Free",
- subtitle: "Free Unlimited E-signatures, Forever.",
- btn: {
- text: "Subscribe",
- color: "op-btn-primary"
- },
- url: "",
- target: "_blank",
- benefits: ["Unlimited envelopes", "Sign documents yourself", "Request signatures from others", "14 field types", "Automatic e-signatures", "Completion certificates", "Send in order", "Document templates", "Import from Dropbox", "Contact book", "Document expiry support", "Decline document support", "Email notifications", "Recipient authentication using OTP", "Bulk send (upto 5 docs)", "Public profiles", "And much more"],
- yearlyBenefits: ["Unlimited envelopes", "Sign documents yourself", "Request signatures from others", "14 field types", "Automatic e-signatures", "Completion certificates", "Send in order", "Document templates", "Import from Dropbox", "Contact book", "Document expiry support", "Decline document support", "Email notifications", "Recipient authentication using OTP", "Bulk send (upto 5 docs)", "Public profiles", "And much more"]
-}, {
- planName: "OPENSIGNâ„¢ PROFESSIONAL",
- img: "professional.png",
- currency: "$",
- monthlyPrice: "29.99",
- yearlyPrice: "9.99/month",
- subtitle: "Exclusive Access to advanced features.",
- btn: {
- text: "Subscribe",
- color: "op-btn-primary"
- },
- url: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? "https://billing.zoho.in/subscribe/9627f62a09df1c8ce500f2f4dc8328dd84ecda20eeae13878ce581d60240f206/pro-weekly" : "https://billing.opensignlabs.com/subscribe/ef798486e6a0a11ea65f2bae8f2af901d1a09dfa8085585cdd4ec4d7f32137f3/professional-monthly",
- yearlyUrl: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? "https://billing.zoho.in/subscribe/9627f62a09df1c8ce500f2f4dc8328ddc184411129224f1f29ed84f6cef3b862/pro-yearly" : "https://billing.opensignlabs.com/subscribe/ef798486e6a0a11ea65f2bae8f2af901d8ad1135190dff951330360e47585a71/professional-yearly",
- target: "_self",
- benefits: ["Everything in OpenSignâ„¢ free", "Field validations", "Regular expression validations", "Organize docs in OpenSignâ„¢ Drive", "Webhooks", "Zapier integration", "API Access", "100 API signatures included", "Custom email templates", "Auto reminders", "Bulk send (upto 20 docs)", "Premium Public profile usernames", "Embedding (coming soon)"],
- yearlyBenefits: ["Everything in OpenSignâ„¢ free", "Field validations", "Regular expression validations", "Organize docs in OpenSignâ„¢ Drive", "Webhooks", "Zapier integration", "API Access", "240 API signatures included", "Custom email templates", "Auto reminders", "Bulk send (upto 20 docs)", "Premium Public profile usernames", "Embedding (coming soon)"]
-}, {
- planName: "OPENSIGNâ„¢ TEAMS",
- img: "teams.png",
- currency: "$",
- monthlyPrice: "39.99/user",
- yearlyPrice: "19.99/user/month",
- subtitle: "Exclusive Access to advanced features.",
- btn: {
- text: "Subscribe",
- color: "op-btn-accent"
- },
- url: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? "https://billing.zoho.in/subscribe/ed8097273a82b6bf39892c11a3bb3c381eb2705736014cfbdbde1ccf1c7a189d/team-weekly" : "https://billing.opensignlabs.com/subscribe/ef798486e6a0a11ea65f2bae8f2af901237d0702bfaa959406306635d80f138c/teams-monthly",
- yearlyUrl: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? "https://billing.zoho.in/subscribe/ed8097273a82b6bf39892c11a3bb3c381eb2705736014cfbdbde1ccf1c7a189d/team-weekly" : "https://billing.opensignlabs.com/subscribe/ef798486e6a0a11ea65f2bae8f2af9011a864994bbeeec71fcf106188630199d/teams-yearly",
- target: "_self",
- benefits: ["Everything in OpenSignâ„¢ professional", "100 API signatures included", "Teams and Organizations", "Share Templates with teams", "Share Templates with individuals", "DocumentId removal from signed docs", "Bulk send (upto 50 docs)", "Request Payments (coming soon)", "Mobile app (coming soon)"],
- yearlyBenefits: ["Everything in OpenSignâ„¢ professional", "500 API signatures included", "Teams and Organizations", "Share Templates with teams", "Share Templates with individuals", "DocumentId removal from signed docs", "Bulk send (upto 50 docs)", "Request Payments (coming soon)", "Mobile app (coming soon)"]
-}, {
- planName: "OPENSIGNâ„¢ ENTERPRISE",
- img: "enterprise.png",
- currency: "",
- monthlyPrice: "
Request Price
",
- yearlyPrice: "Request Price
",
- subtitle: "Scalable Features with priority support.",
- btn: {
- text: "Contact us",
- color: "op-btn-primary"
- },
- url: "https://www.opensignlabs.com/contact-us",
- target: "_blank",
- benefits: ["All features", "Custom domain", "Custom branding", "Uptime SLA", "SSO support", "Priority support"],
- yearlyBenefits: ["All features", "Custom domain", "Custom branding", "Uptime SLA", "SSO support", "Priority support"]
-}];
-const validplan = {
- "team-weekly": true,
- "team-yearly": true,
- "teams-monthly": true,
- "teams-yearly": true,
- "enterprise-monthly": true,
- "enterprise-yearly": true
-};
-/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (plans);
-
-/***/ }),
-
/***/ "./src/pages/PdfRequestFiles.js":
/*!**************************************!*\
!*** ./src/pages/PdfRequestFiles.js ***!
@@ -11606,9 +11485,9 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _styles_signature_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../styles/signature.css */ "./src/styles/signature.css");
/* harmony import */ var parse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! parse */ "./node_modules/parse/index.js");
/* harmony import */ var parse__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(parse__WEBPACK_IMPORTED_MODULE_4__);
-/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! axios */ "./node_modules/axios/lib/axios.js");
-/* harmony import */ var react_dnd__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! react-dnd */ "./node_modules/react-dnd/dist/core/DndProvider.js");
-/* harmony import */ var react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! react-dnd-html5-backend */ "./node_modules/react-dnd-html5-backend/dist/index.js");
+/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! axios */ "./node_modules/axios/lib/axios.js");
+/* harmony import */ var react_dnd__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! react-dnd */ "./node_modules/react-dnd/dist/core/DndProvider.js");
+/* harmony import */ var react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! react-dnd-html5-backend */ "./node_modules/react-dnd-html5-backend/dist/index.js");
/* harmony import */ var _components_pdf_SignPad__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/pdf/SignPad */ "./src/components/pdf/SignPad.js");
/* harmony import */ var _components_pdf_RenderAllPdfPage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/pdf/RenderAllPdfPage */ "./src/components/pdf/RenderAllPdfPage.js");
/* harmony import */ var reactour__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! reactour */ "./node_modules/reactour/dist/reactour.esm.js");
@@ -11627,12 +11506,10 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../primitives/ModalUi */ "./src/primitives/ModalUi.js");
/* harmony import */ var _primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../primitives/TourContentWithBtn */ "./src/primitives/TourContentWithBtn.js");
/* harmony import */ var _primitives_Loader__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../primitives/Loader */ "./src/primitives/Loader.js");
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs");
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs");
/* harmony import */ var _components_pdf_SignerListComponent__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../components/pdf/SignerListComponent */ "./src/components/pdf/SignerListComponent.js");
/* harmony import */ var _components_pdf_VerifyEmail__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../components/pdf/VerifyEmail */ "./src/components/pdf/VerifyEmail.js");
/* harmony import */ var _components_pdf_PdfZoom__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../components/pdf/PdfZoom */ "./src/components/pdf/PdfZoom.js");
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
-
@@ -11662,10 +11539,7 @@ __webpack_require__.r(__webpack_exports__);
function PdfRequestFiles(props) {
- var _window$location, _window$location2, _pdfDetails$12, _pdfDetails$13;
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_24__.useTranslation)();
+ var _window$location, _window$location2, _pdfDetails$13, _pdfDetails$14;
const [pdfDetails, setPdfDetails] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
const [signedSigners, setSignedSigners] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
const [unsignedSigners, setUnSignedSigners] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
@@ -11689,7 +11563,7 @@ function PdfRequestFiles(props) {
const [tourStatus, setTourStatus] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
const [isLoading, setIsLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({
isLoad: true,
- message: t("loading-mssg")
+ message: "This might take some time"
});
const [defaultSignImg, setDefaultSignImg] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();
const [isDocId, setIsDocId] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
@@ -11754,7 +11628,7 @@ function PdfRequestFiles(props) {
const [res, setRes] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});
const [documentId, setDocumentId] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("");
const [isPublicContact, setIsPublicContact] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
- const isHeader = (0,react_redux__WEBPACK_IMPORTED_MODULE_25__.useSelector)(state => state.showHeader);
+ const isHeader = (0,react_redux__WEBPACK_IMPORTED_MODULE_24__.useSelector)(state => state.showHeader);
const divRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
const isMobile = window.innerWidth < 767;
let isGuestSignFlow = false;
@@ -11807,7 +11681,7 @@ function PdfRequestFiles(props) {
const currentUser = JSON.parse(localuser);
await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleSendOTP)(currentUser === null || currentUser === void 0 ? void 0 : currentUser.email);
setOtpLoader(false);
- alert(t("otp-sent-alert"));
+ alert("OTP sent on you email");
};
//`handleVerifyEmail` function is used to verify email with otp
const handleVerifyEmail = async e => {
@@ -11822,12 +11696,11 @@ function PdfRequestFiles(props) {
});
if ((resEmail === null || resEmail === void 0 ? void 0 : resEmail.message) === "Email is verified.") {
setIsEmailVerified(true);
- alert(t("Email-verified-alert-1"));
} else if ((resEmail === null || resEmail === void 0 ? void 0 : resEmail.message) === "Email is already verified.") {
setIsEmailVerified(true);
- alert(t("Email-verified-alert-2"));
}
setOtp("");
+ alert(resEmail.message);
setIsVerifyModal(false);
//handleRecipientSign();
} catch (error) {
@@ -11884,7 +11757,7 @@ function PdfRequestFiles(props) {
templateId: props.templateId,
ispublic: true
};
- const templateDeatils = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getTemplate"), params, {
+ const templateDeatils = await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getTemplate"), params, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -11920,12 +11793,12 @@ function PdfRequestFiles(props) {
});
} else if (documentData === "Error: Something went wrong!" || documentData.result && documentData.result.error) {
console.log("err in get template details ");
- setHandleError(t("something-went-wrong-mssg"));
+ setHandleError("Error: Something went wrong!");
setIsLoading({
isLoad: false
});
} else {
- setHandleError(t("no-data"));
+ setHandleError("No Data Found!");
setIsLoading({
isLoad: false
});
@@ -11934,9 +11807,9 @@ function PdfRequestFiles(props) {
var _err$response;
console.log("err in get template details ", err);
if ((err === null || err === void 0 || (_err$response = err.response) === null || _err$response === void 0 || (_err$response = _err$response.data) === null || _err$response === void 0 ? void 0 : _err$response.code) === 101) {
- setHandleError(t("error-template"));
+ setHandleError("Error: Template not found!");
} else {
- setHandleError(t("something-went-wrong-mssg"));
+ setHandleError("Error: Something went wrong!");
}
}
};
@@ -12000,7 +11873,7 @@ function PdfRequestFiles(props) {
}, 5000);
setIsCompleted({
isModal: true,
- message: t("document-signed-alert-1")
+ message: "You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers."
});
} else {
if (currUserId) {
@@ -12039,7 +11912,7 @@ function PdfRequestFiles(props) {
}
};
try {
- await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/callwebhook"), params, {
+ await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/callwebhook"), params, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -12107,10 +11980,13 @@ function PdfRequestFiles(props) {
setRequestSignTour(true);
} else {
//else condition to check current user exist in contracts_Users class and check tour message status
- //if not then check user exist in contracts_Contactbook class and check tour message statu
- const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)();
+ //if not then check user exist in contracts_Contactbook class and check tour message status
+ const localuser = localStorage.getItem("Parse/".concat(localStorage.getItem("parseAppId"), "/currentUser"));
+ const currentUser = JSON.parse(localuser);
+ const currentUserEmail = currentUser.email;
+ const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)(currentUserEmail);
if (res === "Error: Something went wrong!") {
- setHandleError(t("something-went-wrong-mssg"));
+ setHandleError("Error: Something went wrong!");
} else if (res[0] && res !== null && res !== void 0 && res.length) {
setContractName("_Users");
currUserId = res[0].objectId;
@@ -12125,7 +12001,7 @@ function PdfRequestFiles(props) {
} else if ((res === null || res === void 0 ? void 0 : res.length) === 0) {
const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contactBook)(currUserId);
if (res === "Error: Something went wrong!") {
- setHandleError(t("something-went-wrong-mssg"));
+ setHandleError("Error: Something went wrong!");
} else if (res[0] && res.length) {
setContractName("_Contactbook");
const objectId = res[0].objectId;
@@ -12138,24 +12014,24 @@ function PdfRequestFiles(props) {
setRequestSignTour(((_checkTourRequest$2 = checkTourRequest[0]) === null || _checkTourRequest$2 === void 0 ? void 0 : _checkTourRequest$2.requestSign) || false);
}
} else if (res.length === 0) {
- setHandleError(t("user-not-exist"));
+ setHandleError("Error: User does not exist!");
}
}
}
setIsUiLoading(false);
} else if (documentData === "Error: Something went wrong!" || documentData.result && documentData.result.error) {
- setHandleError(t("something-went-wrong-mssg"));
+ setHandleError("Error: Something went wrong!");
setIsLoading({
isLoad: false
});
console.log("err in getDocument cloud function ");
} else {
- setHandleError(t("no-data"));
+ setHandleError("No Data Found!");
setIsUiLoading({
isLoad: false
});
}
- await axios__WEBPACK_IMPORTED_MODULE_26__["default"].get("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Signature?where={\"UserId\": {\"__type\": \"Pointer\",\"className\": \"_User\", \"objectId\":\"").concat(jsonSender === null || jsonSender === void 0 ? void 0 : jsonSender.objectId, "\"}}"), {
+ await axios__WEBPACK_IMPORTED_MODULE_25__["default"].get("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Signature?where={\"UserId\": {\"__type\": \"Pointer\",\"className\": \"_User\", \"objectId\":\"").concat(jsonSender === null || jsonSender === void 0 ? void 0 : jsonSender.objectId, "\"}}"), {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -12175,7 +12051,7 @@ function PdfRequestFiles(props) {
setIsLoading(loadObj);
}).catch(err => {
console.log("Err in contracts_Signature class", err);
- setHandleError(t("something-went-wrong-mssg"));
+ setHandleError("Error: Something went wrong!");
setIsLoading({
isLoad: false
});
@@ -12338,10 +12214,8 @@ function PdfRequestFiles(props) {
setPageNumber(TourPageNumber);
setWidgetsTour(true);
} else {
- var _checkUser$;
setIsUiLoading(true);
- // `widgets` is Used to return widgets details with page number of current user
- const widgets = checkUser === null || checkUser === void 0 || (_checkUser$ = checkUser[0]) === null || _checkUser$ === void 0 ? void 0 : _checkUser$.placeHolder;
+ const pngUrl = checkUser[0].placeHolder;
let pdfArrBuffer;
//`contractDocument` function used to get updated SignedUrl
//resolved issue of sign document by multiple signers simultaneously
@@ -12352,20 +12226,20 @@ function PdfRequestFiles(props) {
//convert document url in array buffer format to use embed widgets in pdf using pdf-lib
const arrayBuffer = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.convertPdfArrayBuffer)(url);
if (arrayBuffer === "Error") {
- setHandleError(t("invalid-document"));
+ setHandleError("Error: invalid document!");
} else {
pdfArrBuffer = arrayBuffer;
}
} else if (documentData === "Error: Something went wrong!" || documentData.result && documentData.result.error) {
- setHandleError(t("something-went-wrong-mssg"));
+ setHandleError("Error: Something went wrong!");
} else {
- setHandleError(t("document-not-found"));
+ setHandleError("Document not Found!");
}
// Load a PDFDocument from the existing PDF bytes
const existingPdfBytes = pdfArrBuffer;
try {
- var _pdfDetails$;
+ var _pdfDetails$, _pdfDetails$2;
const pdfDoc = await pdf_lib__WEBPACK_IMPORTED_MODULE_2__.PDFDocument.load(existingPdfBytes);
const isSignYourSelfFlow = false;
const extUserPtr = pdfDetails[0].ExtUserPtr;
@@ -12377,15 +12251,16 @@ function PdfRequestFiles(props) {
}
}
//embed multi signature in pdf
- const pdfBytes = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.multiSignEmbed)(widgets, pdfDoc, isSignYourSelfFlow, scale, pdfOriginalWH, containerWH);
- // console.log("pdfte", pdfBytes);
+ const pdfBytes = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.multiSignEmbed)(pngUrl, pdfDoc, isSignYourSelfFlow, scale, pdfOriginalWH, containerWH);
+ // console.log("pdfte", pdfBytes);
//get ExistUserPtr object id of user class to get tenantDetails
const objectId = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$ = pdfDetails[0]) === null || _pdfDetails$ === void 0 || (_pdfDetails$ = _pdfDetails$.ExtUserPtr) === null || _pdfDetails$ === void 0 || (_pdfDetails$ = _pdfDetails$.UserId) === null || _pdfDetails$ === void 0 ? void 0 : _pdfDetails$.objectId;
//get ExistUserPtr email to get userDetails
- const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)();
+ const currentUserEmail = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$2 = pdfDetails[0]) === null || _pdfDetails$2 === void 0 || (_pdfDetails$2 = _pdfDetails$2.ExtUserPtr) === null || _pdfDetails$2 === void 0 ? void 0 : _pdfDetails$2.Email;
+ const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)(currentUserEmail);
let activeMailAdapter = "";
if (res === "Error: Something went wrong!") {
- setHandleError(t("something-went-wrong-mssg"));
+ setHandleError("Error: Something went wrong!");
setIsLoading({
isLoad: false
});
@@ -12396,101 +12271,107 @@ function PdfRequestFiles(props) {
activeMailAdapter = (_res$2 = res[0]) === null || _res$2 === void 0 ? void 0 : _res$2.active_mail_adapter;
}
//function for call to embed signature in pdf and get digital signature pdf
- const resSign = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.signPdfFun)(pdfBytes, documentId, signerObjectId, objectId, isSubscribed, activeMailAdapter, widgets);
- if (resSign && resSign.status === "success") {
- var _pdfDetails$2, _pdfDetails$3;
- setPdfUrl(res.data);
- setIsSigned(true);
- setSignedSigners([]);
- setUnSignedSigners([]);
- getDocumentDetails(true);
- const index = pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Signers.findIndex(x => {
- var _currentUser5;
- return x.Email === ((_currentUser5 = currentUser) === null || _currentUser5 === void 0 ? void 0 : _currentUser5.email);
- });
- const newIndex = index + 1;
- const usermail = {
- Email: (pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$2 = pdfDetails[0]) === null || _pdfDetails$2 === void 0 || (_pdfDetails$2 = _pdfDetails$2.Placeholders[newIndex]) === null || _pdfDetails$2 === void 0 ? void 0 : _pdfDetails$2.email) || ""
- };
- const user = usermail !== null && usermail !== void 0 && usermail.Email ? usermail : pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$3 = pdfDetails[0]) === null || _pdfDetails$3 === void 0 ? void 0 : _pdfDetails$3.Signers[newIndex];
- if (sendmail !== "false" && sendInOrder) {
- var _pdfDetails$4, _pdfDetails$5;
- const requestBody = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$4 = pdfDetails[0]) === null || _pdfDetails$4 === void 0 ? void 0 : _pdfDetails$4.RequestBody;
- const requestSubject = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$5 = pdfDetails[0]) === null || _pdfDetails$5 === void 0 ? void 0 : _pdfDetails$5.RequestSubject;
- if (user) {
- var _pdfDetails$6;
- const expireDate = pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExpiryDate.iso;
- const newDate = new Date(expireDate);
- const localExpireDate = newDate.toLocaleDateString("en-US", {
- day: "numeric",
- month: "long",
- year: "numeric"
- });
- let senderEmail = pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Email;
- let senderPhone = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$6 = pdfDetails[0]) === null || _pdfDetails$6 === void 0 || (_pdfDetails$6 = _pdfDetails$6.ExtUserPtr) === null || _pdfDetails$6 === void 0 ? void 0 : _pdfDetails$6.Phone;
- const senderName = "".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Name);
- try {
- var _pdfDetails$7, _replaceVar, _replaceVar2;
- const imgPng = "https://qikinnovation.ams3.digitaloceanspaces.com/logo.png";
- let url = "".concat(localStorage.getItem("baseUrl"), "functions/sendmailv3");
- const headers = {
- "Content-Type": "application/json",
- "X-Parse-Application-Id": localStorage.getItem("parseAppId"),
- sessionToken: localStorage.getItem("accesstoken")
- };
- const objectId = user === null || user === void 0 ? void 0 : user.objectId;
- const hostUrl = window.location.origin;
- //encode this url value `${pdfDetails?.[0].objectId}/${user.Email}/${objectId}` to base64 using `btoa` function
- let encodeBase64;
- if (objectId) {
- encodeBase64 = btoa("".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].objectId, "/").concat(user.Email, "/").concat(objectId));
- } else {
- encodeBase64 = btoa("".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].objectId, "/").concat(user.Email));
- }
- const hostPublicUrl = _constant_const__WEBPACK_IMPORTED_MODULE_1__.isStaging ? "https://staging-app.opensignlabs.com" : "https://app.opensignlabs.com";
- let signPdf = props !== null && props !== void 0 && props.templateId ? "".concat(hostPublicUrl, "/login/").concat(encodeBase64) : "".concat(hostUrl, "/login/").concat(encodeBase64);
- const openSignUrl = "https://www.opensignlabs.com/contact-us";
- const orgName = (_pdfDetails$7 = pdfDetails[0]) !== null && _pdfDetails$7 !== void 0 && _pdfDetails$7.ExtUserPtr.Company ? pdfDetails[0].ExtUserPtr.Company : "";
- const themeBGcolor = _constant_const__WEBPACK_IMPORTED_MODULE_1__.themeColor;
- let replaceVar;
- if (requestBody && requestSubject && isSubscribed) {
- const replacedRequestBody = requestBody.replace(/"/g, "'");
- const htmlReqBody = "" + replacedRequestBody + " ";
- const variables = {
- document_title: pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name,
- sender_name: senderName,
- sender_mail: senderEmail,
- sender_phone: senderPhone,
- receiver_name: user.Name,
- receiver_email: user.Email,
- receiver_phone: user.Phone,
- expiry_date: localExpireDate,
- company_name: orgName,
- signing_url: "Sign here")
- };
- replaceVar = (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.replaceMailVaribles)(requestSubject, htmlReqBody, variables);
- }
- let params = {
- mailProvider: activeMailAdapter,
- extUserId: extUserId,
- recipient: user.Email,
- subject: requestSubject ? (_replaceVar = replaceVar) === null || _replaceVar === void 0 ? void 0 : _replaceVar.subject : "".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Name, " has requested you to sign \"").concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name, "\""),
- from: senderEmail,
- html: requestBody ? (_replaceVar2 = replaceVar) === null || _replaceVar2 === void 0 ? void 0 : _replaceVar2.body : " Digital Signature Request
" + (pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Name) + " has requested you to review and sign " + (pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name) + ".
| Sender | | " + senderEmail + " |
| Organization | | " + orgName + " |
| Expires on | | " + localExpireDate + " |
| |
This is an automated email from OpenSignâ„¢. For any queries regarding this email, please contact the sender " + senderEmail + " directly.If you think this email is inappropriate or spam, you may file a complaint with OpenSignâ„¢ here.
"
- };
- await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(url, params, {
- headers: headers
+ try {
+ const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.signPdfFun)(pdfBytes, documentId, signerObjectId, setIsAlert, objectId, isSubscribed, activeMailAdapter, pngUrl);
+ if (res && res.status === "success") {
+ var _pdfDetails$3, _pdfDetails$4;
+ setPdfUrl(res.data);
+ setIsSigned(true);
+ setSignedSigners([]);
+ setUnSignedSigners([]);
+ getDocumentDetails(true);
+ const index = pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Signers.findIndex(x => {
+ var _currentUser5;
+ return x.Email === ((_currentUser5 = currentUser) === null || _currentUser5 === void 0 ? void 0 : _currentUser5.email);
+ });
+ const newIndex = index + 1;
+ const usermail = {
+ Email: (pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$3 = pdfDetails[0]) === null || _pdfDetails$3 === void 0 || (_pdfDetails$3 = _pdfDetails$3.Placeholders[newIndex]) === null || _pdfDetails$3 === void 0 ? void 0 : _pdfDetails$3.email) || ""
+ };
+ const user = usermail !== null && usermail !== void 0 && usermail.Email ? usermail : pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$4 = pdfDetails[0]) === null || _pdfDetails$4 === void 0 ? void 0 : _pdfDetails$4.Signers[newIndex];
+ if (sendmail !== "false" && sendInOrder) {
+ var _pdfDetails$5, _pdfDetails$6;
+ const requestBody = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$5 = pdfDetails[0]) === null || _pdfDetails$5 === void 0 ? void 0 : _pdfDetails$5.RequestBody;
+ const requestSubject = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$6 = pdfDetails[0]) === null || _pdfDetails$6 === void 0 ? void 0 : _pdfDetails$6.RequestSubject;
+ if (user) {
+ var _pdfDetails$7;
+ const expireDate = pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExpiryDate.iso;
+ const newDate = new Date(expireDate);
+ const localExpireDate = newDate.toLocaleDateString("en-US", {
+ day: "numeric",
+ month: "long",
+ year: "numeric"
});
- } catch (error) {
- console.log("error", error);
+ let senderEmail = pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Email;
+ let senderPhone = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$7 = pdfDetails[0]) === null || _pdfDetails$7 === void 0 || (_pdfDetails$7 = _pdfDetails$7.ExtUserPtr) === null || _pdfDetails$7 === void 0 ? void 0 : _pdfDetails$7.Phone;
+ const senderName = "".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Name);
+ try {
+ var _pdfDetails$8, _replaceVar, _replaceVar2;
+ const imgPng = "https://qikinnovation.ams3.digitaloceanspaces.com/logo.png";
+ let url = "".concat(localStorage.getItem("baseUrl"), "functions/sendmailv3");
+ const headers = {
+ "Content-Type": "application/json",
+ "X-Parse-Application-Id": localStorage.getItem("parseAppId"),
+ sessionToken: localStorage.getItem("accesstoken")
+ };
+ const objectId = user === null || user === void 0 ? void 0 : user.objectId;
+ const hostUrl = window.location.origin;
+ //encode this url value `${pdfDetails?.[0].objectId}/${user.Email}/${objectId}` to base64 using `btoa` function
+ let encodeBase64;
+ if (objectId) {
+ encodeBase64 = btoa("".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].objectId, "/").concat(user.Email, "/").concat(objectId));
+ } else {
+ encodeBase64 = btoa("".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].objectId, "/").concat(user.Email));
+ }
+ const hostPublicUrl = _constant_const__WEBPACK_IMPORTED_MODULE_1__.isStaging ? "https://staging-app.opensignlabs.com" : "https://app.opensignlabs.com";
+ let signPdf = props !== null && props !== void 0 && props.templateId ? "".concat(hostPublicUrl, "/login/").concat(encodeBase64) : "".concat(hostUrl, "/login/").concat(encodeBase64);
+ const openSignUrl = "https://www.opensignlabs.com/contact-us";
+ const orgName = (_pdfDetails$8 = pdfDetails[0]) !== null && _pdfDetails$8 !== void 0 && _pdfDetails$8.ExtUserPtr.Company ? pdfDetails[0].ExtUserPtr.Company : "";
+ const themeBGcolor = _constant_const__WEBPACK_IMPORTED_MODULE_1__.themeColor;
+ let replaceVar;
+ if (requestBody && requestSubject && isSubscribed) {
+ const replacedRequestBody = requestBody.replace(/"/g, "'");
+ const htmlReqBody = "" + replacedRequestBody + " ";
+ const variables = {
+ document_title: pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name,
+ sender_name: senderName,
+ sender_mail: senderEmail,
+ sender_phone: senderPhone,
+ receiver_name: user.Name,
+ receiver_email: user.Email,
+ receiver_phone: user.Phone,
+ expiry_date: localExpireDate,
+ company_name: orgName,
+ signing_url: "Sign here")
+ };
+ replaceVar = (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.replaceMailVaribles)(requestSubject, htmlReqBody, variables);
+ }
+ let params = {
+ mailProvider: activeMailAdapter,
+ extUserId: extUserId,
+ recipient: user.Email,
+ subject: requestSubject ? (_replaceVar = replaceVar) === null || _replaceVar === void 0 ? void 0 : _replaceVar.subject : "".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Name, " has requested you to sign \"").concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name, "\""),
+ from: senderEmail,
+ html: requestBody ? (_replaceVar2 = replaceVar) === null || _replaceVar2 === void 0 ? void 0 : _replaceVar2.body : " Digital Signature Request
" + (pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Name) + " has requested you to review and sign " + (pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name) + ".
| Sender | | " + senderEmail + " |
| Organization | | " + orgName + " |
| Expires on | | " + localExpireDate + " |
| |
This is an automated email from OpenSignâ„¢. For any queries regarding this email, please contact the sender " + senderEmail + " directly.If you think this email is inappropriate or spam, you may file a complaint with OpenSignâ„¢ here.
"
+ };
+ await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post(url, params, {
+ headers: headers
+ });
+ } catch (error) {
+ console.log("error", error);
+ }
}
}
+ } else {
+ setIsAlert({
+ isShow: true,
+ alertMessage: "something went wrong"
+ });
}
- } else {
- setIsUiLoading(false);
+ } catch (err) {
setIsAlert({
isShow: true,
- alertMessage: resSign.message
+ alertMessage: "something went wrong"
});
}
} catch (err) {
@@ -12498,13 +12379,13 @@ function PdfRequestFiles(props) {
if (err && err.message.includes("is encrypted.")) {
setIsAlert({
isShow: true,
- alertMessage: t("encrypted-pdf-not-support")
+ alertMessage: "Currently encrypted pdf files are not supported."
});
} else {
console.log("err in request signing", err);
setIsAlert({
isShow: true,
- alertMessage: t("something-went-wrong-mssg")
+ alertMessage: "Something went wrong."
});
}
}
@@ -12513,7 +12394,7 @@ function PdfRequestFiles(props) {
} else {
setIsAlert({
isShow: true,
- alertMessage: t("something-went-wrong-mssg")
+ alertMessage: "something went wrong"
});
}
} catch (err) {
@@ -12521,7 +12402,7 @@ function PdfRequestFiles(props) {
setIsUiLoading(false);
setIsAlert({
isShow: true,
- alertMessage: t("something-went-wrong-mssg")
+ alertMessage: "something went wrong, please try again later."
});
}
} else {
@@ -12538,7 +12419,7 @@ function PdfRequestFiles(props) {
}
} catch (e) {
console.log("error in save user's emailVerified in user class");
- setHandleError(t("something-went-wrong-mssg"));
+ setHandleError("Error: Something went wrong!");
}
}
}
@@ -12676,7 +12557,7 @@ function PdfRequestFiles(props) {
DeclineReason: reason
};
setIsUiLoading(true);
- await axios__WEBPACK_IMPORTED_MODULE_26__["default"].put("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Document/").concat(documentId), data, {
+ await axios__WEBPACK_IMPORTED_MODULE_25__["default"].put("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Document/").concat(documentId), data, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -12685,7 +12566,7 @@ function PdfRequestFiles(props) {
}).then(async result => {
const res = result.data;
if (res) {
- var _pdfDetails$8, _pdfDetails$9, _pdfDetails$0$Signers;
+ var _pdfDetails$9, _pdfDetails$10, _pdfDetails$0$Signers;
const currentDecline = {
currnt: "YouDeclined",
isDeclined: true
@@ -12696,7 +12577,7 @@ function PdfRequestFiles(props) {
event: "declined",
body: {
objectId: pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].objectId,
- file: (pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$8 = pdfDetails[0]) === null || _pdfDetails$8 === void 0 ? void 0 : _pdfDetails$8.SignedUrl) || (pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$9 = pdfDetails[0]) === null || _pdfDetails$9 === void 0 ? void 0 : _pdfDetails$9.URL),
+ file: (pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$9 = pdfDetails[0]) === null || _pdfDetails$9 === void 0 ? void 0 : _pdfDetails$9.SignedUrl) || (pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$10 = pdfDetails[0]) === null || _pdfDetails$10 === void 0 ? void 0 : _pdfDetails$10.URL),
name: pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name,
note: (pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Note) || "",
description: (pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Description) || "",
@@ -12711,7 +12592,7 @@ function PdfRequestFiles(props) {
}
};
try {
- await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/callwebhook"), params, {
+ await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/callwebhook"), params, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -12769,7 +12650,7 @@ function PdfRequestFiles(props) {
}];
}
try {
- await axios__WEBPACK_IMPORTED_MODULE_26__["default"].put("".concat(localStorage.getItem("baseUrl"), "classes/contracts").concat(contractName, "/").concat(signerUserId), {
+ await axios__WEBPACK_IMPORTED_MODULE_25__["default"].put("".concat(localStorage.getItem("baseUrl"), "classes/contracts").concat(contractName, "/").concat(signerUserId), {
TourStatus: updatedTourStatus
}, {
headers: {
@@ -12787,7 +12668,7 @@ function PdfRequestFiles(props) {
const tourConfig = [{
selector: '[data-tut="reactourFirst"]',
content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], {
- message: t("tour-mssg.pdf-request-file-1"),
+ message: "List of signers who still need to sign the document .",
isChecked: handleDontShow
}),
position: "top",
@@ -12797,7 +12678,7 @@ function PdfRequestFiles(props) {
}, {
selector: '[data-tut="pdfArea"]',
content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], {
- message: t("tour-mssg.pdf-request-file-2"),
+ message: "Click any of the placeholders appearing on the document to sign. You will then see options to draw your signature, type it, or upload an image .",
isChecked: handleDontShow
}),
position: "top",
@@ -12807,7 +12688,7 @@ function PdfRequestFiles(props) {
}, {
selector: '[data-tut="reactourFifth"]',
content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], {
- message: t("tour-mssg.pdf-request-file-3"),
+ message: "Click the Back, Decline, or Finish buttons to navigate your document. Use the ellipsis menu for additional options, including the Download button .",
isChecked: handleDontShow
}),
position: "top",
@@ -12818,7 +12699,7 @@ function PdfRequestFiles(props) {
const signedByStep = {
selector: '[data-tut="reactourSecond"]',
content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], {
- message: t("tour-mssg.pdf-request-file-4"),
+ message: "List of signers who have already signed the document .",
isChecked: handleDontShow
}),
position: "top",
@@ -12833,7 +12714,7 @@ function PdfRequestFiles(props) {
const defaultSignStep = {
selector: '[data-tut="reactourThird"]',
content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], {
- message: t("tour-mssg.pdf-request-file-5"),
+ message: "You can click \"Auto Sign All\" to automatically sign at all the locations meant to be signed by you. Make sure that you review the document properly before you click this button .",
isChecked: handleDontShow
}),
position: "top",
@@ -12864,13 +12745,13 @@ function PdfRequestFiles(props) {
e.preventDefault();
setLoading(true);
try {
- var _pdfDetails$10, _pdfDetails$11, _userRes$data;
+ var _pdfDetails$11, _pdfDetails$12, _userRes$data;
const params = {
...contact,
- templateid: (_pdfDetails$10 = pdfDetails[0]) === null || _pdfDetails$10 === void 0 ? void 0 : _pdfDetails$10.objectId,
- role: (_pdfDetails$11 = pdfDetails[0]) === null || _pdfDetails$11 === void 0 ? void 0 : _pdfDetails$11.PublicRole[0]
+ templateid: (_pdfDetails$11 = pdfDetails[0]) === null || _pdfDetails$11 === void 0 ? void 0 : _pdfDetails$11.objectId,
+ role: (_pdfDetails$12 = pdfDetails[0]) === null || _pdfDetails$12 === void 0 ? void 0 : _pdfDetails$12.PublicRole[0]
};
- const userRes = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/publicuserlinkcontacttodoc"), params, {
+ const userRes = await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/publicuserlinkcontacttodoc"), params, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId")
@@ -12881,7 +12762,7 @@ function PdfRequestFiles(props) {
await SendOtp();
} else {
console.log("error in public-sign to create user details");
- alert(t("something-went-wrong-mssg"));
+ alert("something went wrong");
}
} catch (e) {
console.log("e", e);
@@ -12900,7 +12781,7 @@ function PdfRequestFiles(props) {
email: contact.email,
docId: res.docId
};
- const Otp = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/SendOTPMailV1"), params, {
+ const Otp = await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/SendOTPMailV1"), params, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId")
@@ -12912,7 +12793,7 @@ function PdfRequestFiles(props) {
}
} catch (error) {
console.log("error in verify otp in public-sign", error);
- alert(t("something-went-wrong-mssg"));
+ alert("something went wrong!");
}
};
@@ -12934,20 +12815,19 @@ function PdfRequestFiles(props) {
email: contact.email,
otp: otp
};
- let user = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(url, body, {
+ let user = await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post(url, body, {
headers: headers
});
if (user.data.result === "Invalid Otp") {
- alert(t("invalid-otp"));
+ alert("Invalid Otp");
setLoading(false);
} else if (user.data.result === "user not found!") {
- alert(t("user-not-found"));
+ alert("User not found!");
setLoading(false);
} else {
let _user = user.data.result;
const parseId = localStorage.getItem("parseAppId");
- await parse__WEBPACK_IMPORTED_MODULE_4___default().User.become(_user.sessionToken);
- const contractUserDetails = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)();
+ const contractUserDetails = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)(_user.email);
localStorage.setItem("UserInformation", JSON.stringify(_user));
localStorage.setItem("Parse/".concat(parseId, "/currentUser"), JSON.stringify(_user));
if (contractUserDetails && contractUserDetails.length > 0) {
@@ -12970,7 +12850,7 @@ function PdfRequestFiles(props) {
console.log("err ", error);
}
} else {
- alert(t("enter-otp-alert"));
+ alert("Please Enter OTP!");
}
};
const handleCloseOtp = () => {
@@ -12984,19 +12864,19 @@ function PdfRequestFiles(props) {
phone: ""
});
};
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_dnd__WEBPACK_IMPORTED_MODULE_27__.DndProvider, {
- backend: react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_28__.HTML5Backend
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_dnd__WEBPACK_IMPORTED_MODULE_26__.DndProvider, {
+ backend: react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_27__.HTML5Backend
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Title__WEBPACK_IMPORTED_MODULE_16__["default"], {
title: props.templateId ? "Public Sign" : "Request Sign"
}), isSubscriptionExpired ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], {
- title: t("subscription-expired"),
+ title: "Subscription Expired",
isOpen: isSubscriptionExpired,
showClose: false
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex flex-col justify-center items-center py-4 md:py-5 gap-5"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
className: "text-sm md:text-lg font-normal"
- }, t("owner-subscription-expired")))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, isLoading.isLoad ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_LoaderWithMsg__WEBPACK_IMPORTED_MODULE_11__["default"], {
+ }, "Owner's subscription has expired."))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, isLoading.isLoad ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_LoaderWithMsg__WEBPACK_IMPORTED_MODULE_11__["default"], {
isLoading: isLoading
}) : handleError ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_HandleError__WEBPACK_IMPORTED_MODULE_12__["default"], {
handleError: handleError
@@ -13004,7 +12884,7 @@ function PdfRequestFiles(props) {
className: "absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Loader__WEBPACK_IMPORTED_MODULE_20__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "text-[13px] text-base-content"
- }, t("loading-mssg"))), isCelebration && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "This might take some time")), isCelebration && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "relative z-[1000]"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react_confetti__WEBPACK_IMPORTED_MODULE_8___default()), {
width: window.innerWidth,
@@ -13016,21 +12896,27 @@ function PdfRequestFiles(props) {
className: "relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"
}, !requestSignTour && signerObjectId && requestSignTourFunction(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], {
isOpen: isAlert.isShow,
- title: t("alert-message"),
- handleClose: () => setIsAlert({
- isShow: false,
- alertMessage: ""
- })
+ title: "Alert message",
+ handleClose: () => {
+ setIsAlert({
+ isShow: false,
+ alertMessage: ""
+ });
+ }
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "h-full p-[20px]"
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, isAlert.alertMessage), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
- onClick: () => setIsAlert({
- isShow: false,
- alertMessage: ""
- }),
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, isAlert.alertMessage), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "h-[1px] w-full my-[15px] bg-[#9f9f9f]"
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ onClick: () => {
+ setIsAlert({
+ isShow: false,
+ alertMessage: ""
+ });
+ },
type: "button",
- className: "op-btn op-btn-primary mt-3 px-4"
- }, t("ok")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(reactour__WEBPACK_IMPORTED_MODULE_7__["default"], {
+ className: "op-btn op-btn-primary"
+ }, "Ok"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(reactour__WEBPACK_IMPORTED_MODULE_7__["default"], {
showNumber: false,
showNavigation: false,
showNavigationNumber: false,
@@ -13041,8 +12927,8 @@ function PdfRequestFiles(props) {
closeWithMask: false
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_PdfDeclineModal__WEBPACK_IMPORTED_MODULE_15__["default"], {
show: isDecline.isDeclined,
- headMsg: t("document-decline"),
- bodyMssg: isDecline.currnt === "Sure" ? t("decline-alert-2") : isDecline.currnt === "YouDeclined" ? t("decline-alert-1") : isDecline.currnt === "another" && t("decline-alert-3"),
+ headMsg: "Document decline",
+ bodyMssg: isDecline.currnt === "Sure" ? "Are you sure want to decline this document ?" : isDecline.currnt === "YouDeclined" ? "You have declined this document!" : isDecline.currnt === "another" && "You can not sign this document as it has been declined/revoked.",
footerMessage: isDecline.currnt === "Sure",
declineDoc: declineDoc,
setIsDecline: setIsDecline
@@ -13071,14 +12957,13 @@ function PdfRequestFiles(props) {
onSubmit: VerifyOTP
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex flex-col gap-2"
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("get-otp-alert")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "You will get a verification code via email"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
className: "op-input op-input-bordered flex items-center gap-2 "
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
type: "number",
name: "otp",
className: "grow",
placeholder: "Enter Verification Code",
- onInvalid: e => e.target.setCustomValidity(t("input-required")),
required: true,
value: otp,
onChange: e => setOtp(e.target.value),
@@ -13115,7 +13000,6 @@ function PdfRequestFiles(props) {
value: contact.name,
onChange: handleInputChange,
placeholder: "name",
- onInvalid: e => e.target.setCustomValidity(t("input-required")),
required: true,
disabled: loading
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
@@ -13136,7 +13020,6 @@ function PdfRequestFiles(props) {
value: contact.email,
onChange: handleInputChange,
placeholder: "Email",
- onInvalid: e => e.target.setCustomValidity(t("input-required")),
required: true,
disabled: loading
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
@@ -13170,7 +13053,7 @@ function PdfRequestFiles(props) {
disabled: loading
}, loading ? "Loading..." : "Submit")))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], {
isOpen: defaultSignAlert.isShow,
- title: t("auto-sign-all"),
+ title: "Auto sign",
handleClose: () => setDefaultSignAlert({
isShow: false,
alertMessage: ""
@@ -13183,24 +13066,24 @@ function PdfRequestFiles(props) {
onClick: () => addDefaultSignature(),
type: "button",
className: "op-btn op-btn-primary"
- }, t("yes")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Yes"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
onClick: () => setDefaultSignAlert({
isShow: false,
alertMessage: ""
}),
type: "button",
className: "op-btn op-btn-secondary"
- }, t("close"))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Close")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
onClick: () => setIsAlert({
isShow: false,
alertMessage: ""
}),
type: "button",
className: "op-btn op-btn-primary"
- }, t("ok")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_RenderAllPdfPage__WEBPACK_IMPORTED_MODULE_6__["default"], {
+ }, "Ok"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_RenderAllPdfPage__WEBPACK_IMPORTED_MODULE_6__["default"], {
signerPos: signerPos,
signerObjectId: signerObjectId,
- signPdfUrl: pdfDetails[0] && (((_pdfDetails$12 = pdfDetails[0]) === null || _pdfDetails$12 === void 0 ? void 0 : _pdfDetails$12.SignedUrl) || ((_pdfDetails$13 = pdfDetails[0]) === null || _pdfDetails$13 === void 0 ? void 0 : _pdfDetails$13.URL)),
+ signPdfUrl: pdfDetails[0] && (((_pdfDetails$13 = pdfDetails[0]) === null || _pdfDetails$13 === void 0 ? void 0 : _pdfDetails$13.SignedUrl) || ((_pdfDetails$14 = pdfDetails[0]) === null || _pdfDetails$14 === void 0 ? void 0 : _pdfDetails$14.URL)),
allPages: allPages,
setAllPages: setAllPages,
setPageNumber: setPageNumber,
@@ -13218,7 +13101,7 @@ function PdfRequestFiles(props) {
className: " w-full md:w-[95%] "
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], {
isOpen: isCompleted.isModal,
- title: t("document-signed"),
+ title: "Document signed",
handleClose: () => {
setIsCompleted(prev => ({
...prev,
@@ -13230,7 +13113,7 @@ function PdfRequestFiles(props) {
className: "h-full p-[20px] text-base-content"
}, isCompleted !== null && isCompleted !== void 0 && isCompleted.message ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, isCompleted === null || isCompleted === void 0 ? void 0 : isCompleted.message) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "px-[15px]"
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("document-signed-alert-4"))), !(isCompleted !== null && isCompleted !== void 0 && isCompleted.message) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "Congratulations! \uD83C\uDF89 This document has been successfully signed by all participants!")), !(isCompleted !== null && isCompleted !== void 0 && isCompleted.message) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "flex mt-4 gap-1 px-[15px]"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleToPrint)(e, pdfUrl, setIsDownloading),
@@ -13241,7 +13124,7 @@ function PdfRequestFiles(props) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block"
- }, t("print"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Print")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleDownloadCertificate)(pdfDetails, setIsDownloading),
className: "font-[500] text-[13px] mr-[5px] op-btn op-btn-secondary"
@@ -13250,7 +13133,7 @@ function PdfRequestFiles(props) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block"
- }, t("certificate"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Certificate")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
className: "font-[500] text-[13px] mr-[5px] op-btn op-btn-primary",
onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading)
@@ -13259,15 +13142,15 @@ function PdfRequestFiles(props) {
"aria-hidden": "true"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "hidden lg:block"
- }, t("download")))))), isDownloading === "pdf" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, "Download"))))), isDownloading === "pdf" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "fixed z-[1000] inset-0 flex justify-center items-center bg-black bg-opacity-30"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Loader__WEBPACK_IMPORTED_MODULE_20__["default"], null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], {
isOpen: isDownloading === "certificate",
- title: isDownloading === "certificate" ? t("generating-certificate") : t("pdf-download"),
+ title: isDownloading === "certificate" ? "Generating certificate" : "PDF Download",
handleClose: () => setIsDownloading("")
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "p-3 md:p-5 text-[13px] md:text-base text-center text-base-content"
- }, isDownloading === "certificate", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, t("generate-certificate-alert")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_SignPad__WEBPACK_IMPORTED_MODULE_5__["default"], {
+ }, isDownloading === "certificate", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Your completion certificate is being generated. Please wait momentarily. If the download doesn't start shortly, click the button again."))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_SignPad__WEBPACK_IMPORTED_MODULE_5__["default"], {
isSignPad: isSignPad,
isStamp: isStamp,
setIsImageSelect: setIsImageSelect,
@@ -13358,7 +13241,7 @@ function PdfRequestFiles(props) {
}, signedSigners.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
"data-tut": "reactourSecond",
className: "mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300"
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("signed-by"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, " Signed by")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "mt-[2px]"
}, signedSigners.map((obj, ind) => {
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -13372,7 +13255,7 @@ function PdfRequestFiles(props) {
}))), unsignedSigners.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
"data-tut": "reactourFirst",
className: "mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300"
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("yet-to-sign"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "Yet to sign")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "mt-[5px]"
}, unsignedSigners.map((obj, ind) => {
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -13392,19 +13275,19 @@ function PdfRequestFiles(props) {
setDefaultSignAlert: setDefaultSignAlert
}))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], {
isOpen: validateAlert,
- title: t("validation-alert"),
+ title: "Validation alert",
handleClose: () => {
setValidateAlert(false);
}
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "h-[100%] p-[20px]"
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, t("validation-alert-1")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "The input does not meet the criteria set by the regular expression."), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "h-[1px] bg-[#9f9f9f] w-full my-[15px]"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
onClick: () => setValidateAlert(false),
type: "button",
className: "op-btn op-btn-ghost"
- }, t("close"))))));
+ }, "Close")))));
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PdfRequestFiles);
@@ -13589,8 +13472,6 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _styles_signature_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles/signature.css */ "./src/styles/signature.css");
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
-
function CustomModal(_ref) {
@@ -13602,9 +13483,6 @@ function CustomModal(_ref) {
declineDoc,
setIsDecline
} = _ref;
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)();
const [reason, setReason] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("");
return show && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("dialog", {
className: "op-modal op-modal-open absolute z-[448]"
@@ -13633,7 +13511,7 @@ function CustomModal(_ref) {
setReason("");
declineDoc(reason);
}
- }, t("yes")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ }, "Yes"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
type: "button",
className: "op-btn op-btn-secondary",
onClick: () => {
@@ -13642,7 +13520,7 @@ function CustomModal(_ref) {
isDeclined: false
});
}
- }, t("close"))))));
+ }, "Close")))));
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CustomModal);
@@ -13661,17 +13539,12 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js");
-
function TourContentWithBtn(_ref) {
let {
message,
isChecked
} = _ref;
- const {
- t
- } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)();
const [isCheck, setIsCheck] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
const handleCheck = () => {
setIsCheck(!isCheck);
@@ -13688,7 +13561,7 @@ function TourContentWithBtn(_ref) {
onChange: handleCheck
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "#787878 text-[12px]"
- }, t("tour-content"))));
+ }, "Don't show this again")));
}
/***/ }),
@@ -18210,14 +18083,13 @@ html {
}
:root {
- color-scheme: dark;
+ color-scheme: light;
--in: 72.06% 0.191 231.6;
--su: 64.8% 0.150 160;
--wa: 84.71% 0.199 83.87;
--er: 71.76% 0.221 22.18;
- --pc: 13.138% 0.0392 275.75;
- --sc: 14.96% 0.052 342.55;
- --ac: 14.902% 0.0334 183.61;
+ --pc: 89.824% 0.06192 275.75;
+ --ac: 15.352% 0.0368 183.61;
--inc: 0% 0 0;
--suc: 0% 0 0;
--wac: 0% 0 0;
@@ -18231,15 +18103,85 @@ html {
--border-btn: 1px;
--tab-border: 1px;
--tab-radius: 0.5rem;
- --p: 65.69% 0.196 275.75;
- --s: 74.8% 0.26 342.55;
- --a: 74.51% 0.167 183.61;
- --n: 31.3815% 0.021108 254.139175;
- --nc: 74.6477% 0.0216 264.435964;
- --b1: 25.3267% 0.015896 252.417568;
- --b2: 23.2607% 0.013807 253.100675;
- --b3: 21.1484% 0.01165 254.087939;
- --bc: 74.6477% 0.0216 264.435964;
+ --p: 49.12% 0.3096 275.75;
+ --s: 69.71% 0.329 342.55;
+ --sc: 98.71% 0.0106 342.55;
+ --a: 76.76% 0.184 183.61;
+ --n: 32.1785% 0.02476 255.701624;
+ --nc: 89.4994% 0.011585 252.096176;
+ --b1: 100% 0 0;
+ --b2: 96.1151% 0 0;
+ --b3: 92.4169% 0.00108 197.137559;
+ --bc: 27.8078% 0.029596 256.847952;
+}
+
+@media (prefers-color-scheme: dark) {
+
+ :root {
+ color-scheme: dark;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --pc: 13.138% 0.0392 275.75;
+ --sc: 14.96% 0.052 342.55;
+ --ac: 14.902% 0.0334 183.61;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 65.69% 0.196 275.75;
+ --s: 74.8% 0.26 342.55;
+ --a: 74.51% 0.167 183.61;
+ --n: 31.3815% 0.021108 254.139175;
+ --nc: 74.6477% 0.0216 264.435964;
+ --b1: 25.3267% 0.015896 252.417568;
+ --b2: 23.2607% 0.013807 253.100675;
+ --b3: 21.1484% 0.01165 254.087939;
+ --bc: 74.6477% 0.0216 264.435964;
+ }
+}
+
+[data-theme=light] {
+ color-scheme: light;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --pc: 89.824% 0.06192 275.75;
+ --ac: 15.352% 0.0368 183.61;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 49.12% 0.3096 275.75;
+ --s: 69.71% 0.329 342.55;
+ --sc: 98.71% 0.0106 342.55;
+ --a: 76.76% 0.184 183.61;
+ --n: 32.1785% 0.02476 255.701624;
+ --nc: 89.4994% 0.011585 252.096176;
+ --b1: 100% 0 0;
+ --b2: 96.1151% 0 0;
+ --b3: 92.4169% 0.00108 197.137559;
+ --bc: 27.8078% 0.029596 256.847952;
}
[data-theme=dark] {
@@ -18275,6 +18217,998 @@ html {
--bc: 74.6477% 0.0216 264.435964;
}
+[data-theme=cupcake] {
+ color-scheme: light;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --pc: 15.2344% 0.017892 200.026556;
+ --sc: 15.787% 0.020249 356.29965;
+ --ac: 15.8762% 0.029206 78.618794;
+ --nc: 84.7148% 0.013247 313.189598;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --rounded-box: 1rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --p: 76.172% 0.089459 200.026556;
+ --s: 78.9351% 0.101246 356.29965;
+ --a: 79.3811% 0.146032 78.618794;
+ --n: 23.5742% 0.066235 313.189598;
+ --b1: 97.7882% 0.00418 56.375637;
+ --b2: 93.9822% 0.007638 61.449292;
+ --b3: 91.5861% 0.006811 53.440502;
+ --bc: 23.5742% 0.066235 313.189598;
+ --rounded-btn: 1.9rem;
+ --tab-border: 2px;
+ --tab-radius: 0.7rem;
+}
+
+[data-theme=bumblebee] {
+ color-scheme: light;
+ --b2: 93% 0 0;
+ --b3: 86% 0 0;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --bc: 20% 0 0;
+ --ac: 16.254% 0.0314 56.52;
+ --nc: 82.55% 0.015 281.99;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 89.51% 0.2132 96.61;
+ --pc: 38.92% 0.046 96.61;
+ --s: 80.39% 0.194 70.76;
+ --sc: 39.38% 0.068 70.76;
+ --a: 81.27% 0.157 56.52;
+ --n: 12.75% 0.075 281.99;
+ --b1: 100% 0 0;
+}
+
+[data-theme=emerald] {
+ color-scheme: light;
+ --b2: 93% 0 0;
+ --b3: 86% 0 0;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 76.6626% 0.135433 153.450024;
+ --pc: 33.3872% 0.040618 162.240129;
+ --s: 61.3028% 0.202368 261.294233;
+ --sc: 100% 0 0;
+ --a: 72.7725% 0.149783 33.200363;
+ --ac: 0% 0 0;
+ --n: 35.5192% 0.032071 262.988584;
+ --nc: 98.4625% 0.001706 247.838921;
+ --b1: 100% 0 0;
+ --bc: 35.5192% 0.032071 262.988584;
+ --animation-btn: 0;
+ --animation-input: 0;
+ --btn-focus-scale: 1;
+}
+
+[data-theme=corporate] {
+ color-scheme: light;
+ --b2: 93% 0 0;
+ --b3: 86% 0 0;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --pc: 12.078% 0.0456 269.1;
+ --sc: 13.0739% 0.010951 256.688055;
+ --ac: 15.3934% 0.022799 163.57888;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --p: 60.39% 0.228 269.1;
+ --s: 65.3694% 0.054756 256.688055;
+ --a: 76.9669% 0.113994 163.57888;
+ --n: 22.3899% 0.031305 278.07229;
+ --nc: 95.8796% 0.008588 247.915135;
+ --b1: 100% 0 0;
+ --bc: 22.3899% 0.031305 278.07229;
+ --rounded-box: 0.25rem;
+ --rounded-btn: .125rem;
+ --rounded-badge: .125rem;
+ --tab-radius: 0.25rem;
+ --animation-btn: 0;
+ --animation-input: 0;
+ --btn-focus-scale: 1;
+}
+
+[data-theme=synthwave] {
+ color-scheme: dark;
+ --b2: 20.2941% 0.076211 287.835609;
+ --b3: 18.7665% 0.070475 287.835609;
+ --pc: 14.4421% 0.031903 342.009383;
+ --sc: 15.6543% 0.02362 227.382405;
+ --ac: 17.608% 0.0412 93.72;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 72.2105% 0.159514 342.009383;
+ --s: 78.2714% 0.118101 227.382405;
+ --a: 88.04% 0.206 93.72;
+ --n: 25.5554% 0.103537 286.507967;
+ --nc: 97.9365% 0.00819 301.358346;
+ --b1: 21.8216% 0.081948 287.835609;
+ --bc: 97.9365% 0.00819 301.358346;
+ --in: 76.5197% 0.12273 231.831603;
+ --inc: 23.5017% 0.096418 290.329844;
+ --su: 86.0572% 0.115038 178.624677;
+ --suc: 23.5017% 0.096418 290.329844;
+ --wa: 85.531% 0.122117 93.722227;
+ --wac: 23.5017% 0.096418 290.329844;
+ --er: 73.7005% 0.121339 32.639257;
+ --erc: 23.5017% 0.096418 290.329844;
+}
+
+[data-theme=retro] {
+ color-scheme: light;
+ --inc: 90.923% 0.043042 262.880917;
+ --suc: 12.541% 0.033982 149.213788;
+ --wac: 13.3168% 0.031484 58.31834;
+ --erc: 13.144% 0.0398 27.33;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --p: 76.8664% 0.104092 22.664655;
+ --pc: 26.5104% 0.006243 0.522862;
+ --s: 80.7415% 0.052534 159.094608;
+ --sc: 26.5104% 0.006243 0.522862;
+ --a: 70.3919% 0.125455 52.953428;
+ --ac: 26.5104% 0.006243 0.522862;
+ --n: 28.4181% 0.009519 355.534017;
+ --nc: 92.5604% 0.025113 89.217311;
+ --b1: 91.6374% 0.034554 90.51575;
+ --b2: 88.2722% 0.049418 91.774344;
+ --b3: 84.133% 0.065952 90.856665;
+ --bc: 26.5104% 0.006243 0.522862;
+ --in: 54.615% 0.215208 262.880917;
+ --su: 62.7052% 0.169912 149.213788;
+ --wa: 66.584% 0.157422 58.31834;
+ --er: 65.72% 0.199 27.33;
+ --rounded-box: 0.4rem;
+ --rounded-btn: 0.4rem;
+ --rounded-badge: 0.4rem;
+ --tab-radius: 0.4rem;
+}
+
+[data-theme=cyberpunk] {
+ color-scheme: light;
+ --b2: 87.8943% 0.16647 104.32;
+ --b3: 81.2786% 0.15394 104.32;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --bc: 18.902% 0.0358 104.32;
+ --pc: 14.844% 0.0418 6.35;
+ --sc: 16.666% 0.0368 204.72;
+ --ac: 14.372% 0.04352 310.43;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ font-family: ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;
+ --p: 74.22% 0.209 6.35;
+ --s: 83.33% 0.184 204.72;
+ --a: 71.86% 0.2176 310.43;
+ --n: 23.04% 0.065 269.31;
+ --nc: 94.51% 0.179 104.32;
+ --b1: 94.51% 0.179 104.32;
+ --rounded-box: 0;
+ --rounded-btn: 0;
+ --rounded-badge: 0;
+ --tab-radius: 0;
+}
+
+[data-theme=valentine] {
+ color-scheme: light;
+ --b2: 88.0567% 0.024834 337.06289;
+ --b3: 81.4288% 0.022964 337.06289;
+ --pc: 13.7239% 0.030755 15.066527;
+ --sc: 14.3942% 0.029258 293.189609;
+ --ac: 14.2537% 0.014961 197.828857;
+ --inc: 90.923% 0.043042 262.880917;
+ --suc: 12.541% 0.033982 149.213788;
+ --wac: 13.3168% 0.031484 58.31834;
+ --erc: 14.614% 0.0414 27.33;
+ --rounded-box: 1rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --p: 68.6197% 0.153774 15.066527;
+ --s: 71.971% 0.14629 293.189609;
+ --a: 71.2685% 0.074804 197.828857;
+ --n: 54.6053% 0.143342 358.004839;
+ --nc: 90.2701% 0.037202 336.955191;
+ --b1: 94.6846% 0.026703 337.06289;
+ --bc: 37.3085% 0.081131 4.606426;
+ --in: 54.615% 0.215208 262.880917;
+ --su: 62.7052% 0.169912 149.213788;
+ --wa: 66.584% 0.157422 58.31834;
+ --er: 73.07% 0.207 27.33;
+ --rounded-btn: 1.9rem;
+ --tab-radius: 0.7rem;
+}
+
+[data-theme=halloween] {
+ color-scheme: dark;
+ --b2: 23.0416% 0 0;
+ --b3: 21.3072% 0 0;
+ --bc: 84.9552% 0 0;
+ --sc: 89.196% 0.0496 305.03;
+ --nc: 84.8742% 0.009322 65.681484;
+ --inc: 90.923% 0.043042 262.880917;
+ --suc: 12.541% 0.033982 149.213788;
+ --wac: 13.3168% 0.031484 58.31834;
+ --erc: 13.144% 0.0398 27.33;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 77.48% 0.204 60.62;
+ --pc: 19.6935% 0.004671 196.779412;
+ --s: 45.98% 0.248 305.03;
+ --a: 64.8% 0.223 136.073479;
+ --ac: 0% 0 0;
+ --n: 24.371% 0.046608 65.681484;
+ --b1: 24.7759% 0 0;
+ --in: 54.615% 0.215208 262.880917;
+ --su: 62.7052% 0.169912 149.213788;
+ --wa: 66.584% 0.157422 58.31834;
+ --er: 65.72% 0.199 27.33;
+}
+
+[data-theme=garden] {
+ color-scheme: light;
+ --b2: 86.4453% 0.002011 17.197414;
+ --b3: 79.9386% 0.00186 17.197414;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --sc: 89.699% 0.022197 355.095988;
+ --ac: 11.2547% 0.010859 154.390187;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 62.45% 0.278 3.83636;
+ --pc: 100% 0 0;
+ --s: 48.4952% 0.110985 355.095988;
+ --a: 56.2735% 0.054297 154.390187;
+ --n: 24.1559% 0.049362 89.070594;
+ --nc: 92.9519% 0.002163 17.197414;
+ --b1: 92.9519% 0.002163 17.197414;
+ --bc: 16.9617% 0.001664 17.32068;
+}
+
+[data-theme=forest] {
+ color-scheme: dark;
+ --b2: 17.522% 0.007709 17.911578;
+ --b3: 16.2032% 0.007129 17.911578;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --bc: 83.7682% 0.001658 17.911578;
+ --sc: 13.9553% 0.027077 168.327128;
+ --ac: 14.1257% 0.02389 185.713193;
+ --nc: 86.1397% 0.007806 171.364646;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --rounded-box: 1rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 68.6283% 0.185567 148.958922;
+ --pc: 0% 0 0;
+ --s: 69.7764% 0.135385 168.327128;
+ --a: 70.6285% 0.119451 185.713193;
+ --n: 30.6985% 0.039032 171.364646;
+ --b1: 18.8409% 0.00829 17.911578;
+ --rounded-btn: 1.9rem;
+}
+
+[data-theme=aqua] {
+ color-scheme: dark;
+ --b2: 45.3464% 0.118611 261.181672;
+ --b3: 41.9333% 0.109683 261.181672;
+ --bc: 89.7519% 0.025508 261.181672;
+ --sc: 12.1365% 0.02175 309.782946;
+ --ac: 18.6854% 0.020445 94.555431;
+ --nc: 12.2124% 0.023402 243.760661;
+ --inc: 90.923% 0.043042 262.880917;
+ --suc: 12.541% 0.033982 149.213788;
+ --wac: 13.3168% 0.031484 58.31834;
+ --erc: 14.79% 0.038 27.33;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 85.6617% 0.14498 198.6458;
+ --pc: 40.1249% 0.068266 197.603872;
+ --s: 60.6827% 0.108752 309.782946;
+ --a: 93.4269% 0.102225 94.555431;
+ --n: 61.0622% 0.117009 243.760661;
+ --b1: 48.7596% 0.127539 261.181672;
+ --in: 54.615% 0.215208 262.880917;
+ --su: 62.7052% 0.169912 149.213788;
+ --wa: 66.584% 0.157422 58.31834;
+ --er: 73.95% 0.19 27.33;
+}
+
+[data-theme=lofi] {
+ color-scheme: light;
+ --inc: 15.908% 0.0206 205.9;
+ --suc: 18.026% 0.0306 164.14;
+ --wac: 17.674% 0.027 79.94;
+ --erc: 15.732% 0.03 28.47;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --p: 15.9066% 0 0;
+ --pc: 100% 0 0;
+ --s: 21.455% 0.001566 17.278957;
+ --sc: 100% 0 0;
+ --a: 26.8618% 0 0;
+ --ac: 100% 0 0;
+ --n: 0% 0 0;
+ --nc: 100% 0 0;
+ --b1: 100% 0 0;
+ --b2: 96.1151% 0 0;
+ --b3: 92.268% 0.001082 17.17934;
+ --bc: 0% 0 0;
+ --in: 79.54% 0.103 205.9;
+ --su: 90.13% 0.153 164.14;
+ --wa: 88.37% 0.135 79.94;
+ --er: 78.66% 0.15 28.47;
+ --rounded-box: 0.25rem;
+ --rounded-btn: 0.125rem;
+ --rounded-badge: 0.125rem;
+ --tab-radius: 0.125rem;
+ --animation-btn: 0;
+ --animation-input: 0;
+ --btn-focus-scale: 1;
+}
+
+[data-theme=pastel] {
+ color-scheme: light;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --bc: 20% 0 0;
+ --pc: 16.6166% 0.006979 316.8737;
+ --sc: 17.6153% 0.009839 8.688364;
+ --ac: 17.8419% 0.012056 170.923263;
+ --nc: 14.2681% 0.014702 228.183906;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --rounded-box: 1rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --p: 83.0828% 0.034896 316.8737;
+ --s: 88.0763% 0.049197 8.688364;
+ --a: 89.2096% 0.06028 170.923263;
+ --n: 71.3406% 0.07351 228.183906;
+ --b1: 100% 0 0;
+ --b2: 98.4625% 0.001706 247.838921;
+ --b3: 87.1681% 0.009339 258.338227;
+ --rounded-btn: 1.9rem;
+ --tab-radius: 0.7rem;
+}
+
+[data-theme=fantasy] {
+ color-scheme: light;
+ --b2: 93% 0 0;
+ --b3: 86% 0 0;
+ --in: 72.06% 0.191 231.6;
+ --su: 64.8% 0.150 160;
+ --wa: 84.71% 0.199 83.87;
+ --er: 71.76% 0.221 22.18;
+ --pc: 87.49% 0.0378 325.02;
+ --sc: 90.784% 0.0324 241.36;
+ --ac: 15.196% 0.0408 56.72;
+ --nc: 85.5616% 0.005919 256.847952;
+ --inc: 0% 0 0;
+ --suc: 0% 0 0;
+ --wac: 0% 0 0;
+ --erc: 0% 0 0;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 37.45% 0.189 325.02;
+ --s: 53.92% 0.162 241.36;
+ --a: 75.98% 0.204 56.72;
+ --n: 27.8078% 0.029596 256.847952;
+ --b1: 100% 0 0;
+ --bc: 27.8078% 0.029596 256.847952;
+}
+
+[data-theme=wireframe] {
+ color-scheme: light;
+ --bc: 20% 0 0;
+ --pc: 15.6521% 0 0;
+ --sc: 15.6521% 0 0;
+ --ac: 15.6521% 0 0;
+ --nc: 18.8014% 0 0;
+ --inc: 89.0403% 0.062643 264.052021;
+ --suc: 90.395% 0.035372 142.495339;
+ --wac: 14.1626% 0.019994 108.702381;
+ --erc: 12.5591% 0.051537 29.233885;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ font-family: Chalkboard,comic sans ms,'sans-serif';
+ --p: 78.2604% 0 0;
+ --s: 78.2604% 0 0;
+ --a: 78.2604% 0 0;
+ --n: 94.007% 0 0;
+ --b1: 100% 0 0;
+ --b2: 94.9119% 0 0;
+ --b3: 89.7547% 0 0;
+ --in: 45.2014% 0.313214 264.052021;
+ --su: 51.9752% 0.176858 142.495339;
+ --wa: 70.8131% 0.099969 108.702381;
+ --er: 62.7955% 0.257683 29.233885;
+ --rounded-box: 0.2rem;
+ --rounded-btn: 0.2rem;
+ --rounded-badge: 0.2rem;
+ --tab-radius: 0.2rem;
+}
+
+[data-theme=black] {
+ color-scheme: dark;
+ --pc: 86.736% 0 0;
+ --sc: 86.736% 0 0;
+ --ac: 86.736% 0 0;
+ --nc: 86.736% 0 0;
+ --inc: 89.0403% 0.062643 264.052021;
+ --suc: 90.395% 0.035372 142.495339;
+ --wac: 19.3597% 0.042201 109.769232;
+ --erc: 12.5591% 0.051537 29.233885;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --p: 33.6799% 0 0;
+ --s: 33.6799% 0 0;
+ --a: 33.6799% 0 0;
+ --b1: 0% 0 0;
+ --b2: 19.1251% 0 0;
+ --b3: 26.8618% 0 0;
+ --bc: 87.6096% 0 0;
+ --n: 33.6799% 0 0;
+ --in: 45.2014% 0.313214 264.052021;
+ --su: 51.9752% 0.176858 142.495339;
+ --wa: 96.7983% 0.211006 109.769232;
+ --er: 62.7955% 0.257683 29.233885;
+ --rounded-box: 0;
+ --rounded-btn: 0;
+ --rounded-badge: 0;
+ --animation-btn: 0;
+ --animation-input: 0;
+ --btn-focus-scale: 1;
+ --tab-radius: 0;
+}
+
+[data-theme=luxury] {
+ color-scheme: dark;
+ --pc: 20% 0 0;
+ --sc: 85.5163% 0.012821 261.069149;
+ --ac: 87.3349% 0.010348 338.82597;
+ --inc: 15.8122% 0.024356 237.133883;
+ --suc: 15.6239% 0.038579 132.154381;
+ --wac: 17.2255% 0.027305 102.89115;
+ --erc: 14.3506% 0.035271 22.568916;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 100% 0 0;
+ --s: 27.5815% 0.064106 261.069149;
+ --a: 36.6744% 0.051741 338.82597;
+ --n: 24.27% 0.057015 59.825019;
+ --nc: 93.2033% 0.089631 90.861683;
+ --b1: 14.0765% 0.004386 285.822869;
+ --b2: 20.2191% 0.004211 308.22937;
+ --b3: 29.8961% 0.003818 308.318612;
+ --bc: 75.6879% 0.123666 76.890484;
+ --in: 79.0612% 0.121778 237.133883;
+ --su: 78.1197% 0.192894 132.154381;
+ --wa: 86.1274% 0.136524 102.89115;
+ --er: 71.7531% 0.176357 22.568916;
+}
+
+[data-theme=dracula] {
+ color-scheme: dark;
+ --b2: 26.8053% 0.020556 277.508664;
+ --b3: 24.7877% 0.019009 277.508664;
+ --pc: 15.0922% 0.036614 346.812432;
+ --sc: 14.8405% 0.029709 301.883095;
+ --ac: 16.6785% 0.024826 66.558491;
+ --nc: 87.8891% 0.006515 275.524078;
+ --inc: 17.6526% 0.018676 212.846491;
+ --suc: 17.4199% 0.043903 148.024881;
+ --wac: 19.1068% 0.026849 112.757109;
+ --erc: 13.6441% 0.041266 24.430965;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 75.4611% 0.18307 346.812432;
+ --s: 74.2023% 0.148546 301.883095;
+ --a: 83.3927% 0.124132 66.558491;
+ --n: 39.4456% 0.032576 275.524078;
+ --b1: 28.8229% 0.022103 277.508664;
+ --bc: 97.7477% 0.007913 106.545019;
+ --in: 88.263% 0.09338 212.846491;
+ --su: 87.0995% 0.219516 148.024881;
+ --wa: 95.5338% 0.134246 112.757109;
+ --er: 68.2204% 0.206328 24.430965;
+}
+
+[data-theme=cmyk] {
+ color-scheme: light;
+ --b2: 93% 0 0;
+ --b3: 86% 0 0;
+ --bc: 20% 0 0;
+ --pc: 14.3544% 0.02666 239.443325;
+ --sc: 12.8953% 0.040552 359.339283;
+ --ac: 18.8458% 0.037948 105.306968;
+ --nc: 84.3557% 0 0;
+ --inc: 13.6952% 0.0189 217.284104;
+ --suc: 89.3898% 0.032505 321.406278;
+ --wac: 14.2473% 0.031969 52.023412;
+ --erc: 12.4027% 0.041677 28.717543;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 71.7722% 0.133298 239.443325;
+ --s: 64.4766% 0.202758 359.339283;
+ --a: 94.2289% 0.189741 105.306968;
+ --n: 21.7787% 0 0;
+ --b1: 100% 0 0;
+ --in: 68.4759% 0.094499 217.284104;
+ --su: 46.949% 0.162524 321.406278;
+ --wa: 71.2364% 0.159843 52.023412;
+ --er: 62.0133% 0.208385 28.717543;
+}
+
+[data-theme=autumn] {
+ color-scheme: light;
+ --b2: 89.1077% 0 0;
+ --b3: 82.4006% 0 0;
+ --bc: 19.1629% 0 0;
+ --pc: 88.1446% 0.032232 17.530175;
+ --sc: 12.3353% 0.033821 23.865865;
+ --ac: 14.6851% 0.018999 60.729616;
+ --nc: 90.8734% 0.007475 51.902819;
+ --inc: 13.8449% 0.019596 207.284192;
+ --suc: 12.199% 0.016032 174.616213;
+ --wac: 14.0163% 0.032982 56.844303;
+ --erc: 90.614% 0.0482 24.16;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 40.7232% 0.16116 17.530175;
+ --s: 61.6763% 0.169105 23.865865;
+ --a: 73.4253% 0.094994 60.729616;
+ --n: 54.3672% 0.037374 51.902819;
+ --b1: 95.8147% 0 0;
+ --in: 69.2245% 0.097979 207.284192;
+ --su: 60.9951% 0.080159 174.616213;
+ --wa: 70.0817% 0.164909 56.844303;
+ --er: 53.07% 0.241 24.16;
+}
+
+[data-theme=business] {
+ color-scheme: dark;
+ --b2: 22.6487% 0 0;
+ --b3: 20.944% 0 0;
+ --bc: 84.8707% 0 0;
+ --pc: 88.3407% 0.019811 251.473931;
+ --sc: 12.8185% 0.005481 229.389418;
+ --ac: 13.4542% 0.033545 35.791525;
+ --nc: 85.4882% 0.00265 253.041249;
+ --inc: 12.5233% 0.028702 240.033697;
+ --suc: 14.0454% 0.018919 156.59611;
+ --wac: 15.4965% 0.023141 81.519177;
+ --erc: 90.3221% 0.029356 29.674507;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 41.7036% 0.099057 251.473931;
+ --s: 64.0924% 0.027405 229.389418;
+ --a: 67.271% 0.167726 35.791525;
+ --n: 27.441% 0.01325 253.041249;
+ --b1: 24.3535% 0 0;
+ --in: 62.6163% 0.143511 240.033697;
+ --su: 70.2268% 0.094594 156.59611;
+ --wa: 77.4824% 0.115704 81.519177;
+ --er: 51.6105% 0.14678 29.674507;
+ --rounded-box: 0.25rem;
+ --rounded-btn: .125rem;
+ --rounded-badge: .125rem;
+}
+
+[data-theme=acid] {
+ color-scheme: light;
+ --b2: 91.6146% 0 0;
+ --b3: 84.7189% 0 0;
+ --bc: 19.7021% 0 0;
+ --pc: 14.38% 0.0714 330.759573;
+ --sc: 14.674% 0.0448 48.250878;
+ --ac: 18.556% 0.0528 122.962951;
+ --nc: 84.262% 0.0256 278.68;
+ --inc: 12.144% 0.0454 252.05;
+ --suc: 17.144% 0.0532 158.53;
+ --wac: 18.202% 0.0424 100.5;
+ --erc: 12.968% 0.0586 29.349188;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --p: 71.9% 0.357 330.759573;
+ --s: 73.37% 0.224 48.250878;
+ --a: 92.78% 0.264 122.962951;
+ --n: 21.31% 0.128 278.68;
+ --b1: 98.5104% 0 0;
+ --in: 60.72% 0.227 252.05;
+ --su: 85.72% 0.266 158.53;
+ --wa: 91.01% 0.212 100.5;
+ --er: 64.84% 0.293 29.349188;
+ --rounded-box: 1.25rem;
+ --rounded-btn: 1rem;
+ --rounded-badge: 1rem;
+ --tab-radius: 0.7rem;
+}
+
+[data-theme=lemonade] {
+ color-scheme: light;
+ --b2: 91.8003% 0.0186 123.72;
+ --b3: 84.8906% 0.0172 123.72;
+ --bc: 19.742% 0.004 123.72;
+ --pc: 11.784% 0.0398 134.6;
+ --sc: 15.55% 0.0392 111.09;
+ --ac: 17.078% 0.0402 100.73;
+ --nc: 86.196% 0.015 108.6;
+ --inc: 17.238% 0.0094 224.14;
+ --suc: 17.238% 0.0094 157.85;
+ --wac: 17.238% 0.0094 102.15;
+ --erc: 17.238% 0.0094 25.85;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 58.92% 0.199 134.6;
+ --s: 77.75% 0.196 111.09;
+ --a: 85.39% 0.201 100.73;
+ --n: 30.98% 0.075 108.6;
+ --b1: 98.71% 0.02 123.72;
+ --in: 86.19% 0.047 224.14;
+ --su: 86.19% 0.047 157.85;
+ --wa: 86.19% 0.047 102.15;
+ --er: 86.19% 0.047 25.85;
+}
+
+[data-theme=night] {
+ color-scheme: dark;
+ --b2: 19.3144% 0.037037 265.754874;
+ --b3: 17.8606% 0.034249 265.754874;
+ --bc: 84.1536% 0.007965 265.754874;
+ --pc: 15.0703% 0.027798 232.66148;
+ --sc: 13.6023% 0.031661 276.934902;
+ --ac: 14.4721% 0.035244 350.048739;
+ --nc: 85.5899% 0.00737 260.030984;
+ --suc: 15.6904% 0.026506 181.911977;
+ --wac: 16.6486% 0.027912 82.95003;
+ --erc: 14.3572% 0.034051 13.11834;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 75.3513% 0.138989 232.66148;
+ --s: 68.0113% 0.158303 276.934902;
+ --a: 72.3603% 0.176218 350.048739;
+ --n: 27.9495% 0.036848 260.030984;
+ --b1: 20.7682% 0.039824 265.754874;
+ --in: 68.4553% 0.148062 237.25135;
+ --inc: 0% 0 0;
+ --su: 78.452% 0.132529 181.911977;
+ --wa: 83.2428% 0.139558 82.95003;
+ --er: 71.7858% 0.170255 13.11834;
+}
+
+[data-theme=coffee] {
+ color-scheme: dark;
+ --b2: 20.1585% 0.021457 329.708637;
+ --b3: 18.6412% 0.019842 329.708637;
+ --pc: 14.3993% 0.024765 62.756393;
+ --sc: 86.893% 0.00597 199.19444;
+ --ac: 88.5243% 0.014881 224.389184;
+ --nc: 83.3022% 0.003149 326.261446;
+ --inc: 15.898% 0.012774 184.558367;
+ --suc: 14.9445% 0.014491 131.116276;
+ --wac: 17.6301% 0.028162 87.722413;
+ --erc: 15.4637% 0.025644 31.871922;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 71.9967% 0.123825 62.756393;
+ --s: 34.465% 0.029849 199.19444;
+ --a: 42.6213% 0.074405 224.389184;
+ --n: 16.5109% 0.015743 326.261446;
+ --b1: 21.6758% 0.023072 329.708637;
+ --bc: 72.3547% 0.092794 79.129387;
+ --in: 79.4902% 0.063869 184.558367;
+ --su: 74.7224% 0.072456 131.116276;
+ --wa: 88.1503% 0.140812 87.722413;
+ --er: 77.3187% 0.12822 31.871922;
+}
+
+[data-theme=winter] {
+ color-scheme: light;
+ --pc: 91.372% 0.051 257.57;
+ --sc: 88.5103% 0.03222 282.339433;
+ --ac: 11.988% 0.038303 335.171434;
+ --nc: 83.9233% 0.012704 257.651965;
+ --inc: 17.6255% 0.017178 214.515264;
+ --suc: 16.0988% 0.015404 197.823719;
+ --wac: 17.8345% 0.009167 71.47031;
+ --erc: 14.6185% 0.022037 20.076293;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 56.86% 0.255 257.57;
+ --s: 42.5516% 0.161098 282.339433;
+ --a: 59.9398% 0.191515 335.171434;
+ --n: 19.6166% 0.063518 257.651965;
+ --b1: 100% 0 0;
+ --b2: 97.4663% 0.011947 259.822565;
+ --b3: 93.2686% 0.016223 262.751375;
+ --bc: 41.8869% 0.053885 255.824911;
+ --in: 88.1275% 0.085888 214.515264;
+ --su: 80.4941% 0.077019 197.823719;
+ --wa: 89.1725% 0.045833 71.47031;
+ --er: 73.0926% 0.110185 20.076293;
+}
+
+[data-theme=dim] {
+ color-scheme: dark;
+ --pc: 17.2267% 0.028331 139.549991;
+ --sc: 14.6752% 0.033181 35.353059;
+ --ac: 14.8459% 0.026728 311.37924;
+ --inc: 17.2157% 0.028409 206.182959;
+ --suc: 17.2343% 0.028437 166.534048;
+ --wac: 17.2327% 0.028447 94.818679;
+ --erc: 16.4838% 0.019914 33.756357;
+ --rounded-box: 1rem;
+ --rounded-btn: 0.5rem;
+ --rounded-badge: 1.9rem;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --tab-radius: 0.5rem;
+ --p: 86.1335% 0.141656 139.549991;
+ --s: 73.3759% 0.165904 35.353059;
+ --a: 74.2296% 0.133641 311.37924;
+ --n: 24.7311% 0.020483 264.094728;
+ --nc: 82.9011% 0.031335 222.959324;
+ --b1: 30.8577% 0.023243 264.149498;
+ --b2: 28.0368% 0.01983 264.182074;
+ --b3: 26.3469% 0.018403 262.177739;
+ --bc: 82.9011% 0.031335 222.959324;
+ --in: 86.0785% 0.142046 206.182959;
+ --su: 86.1717% 0.142187 166.534048;
+ --wa: 86.1634% 0.142236 94.818679;
+ --er: 82.4189% 0.09957 33.756357;
+}
+
+[data-theme=nord] {
+ color-scheme: light;
+ --pc: 11.8872% 0.015449 254.027774;
+ --sc: 13.9303% 0.011822 248.687186;
+ --ac: 15.4929% 0.01245 217.469017;
+ --inc: 13.8414% 0.012499 332.664922;
+ --suc: 15.3654% 0.01498 131.063061;
+ --wac: 17.0972% 0.017847 84.093335;
+ --erc: 12.122% 0.024119 15.341883;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --p: 59.4359% 0.077246 254.027774;
+ --s: 69.6516% 0.059108 248.687186;
+ --a: 77.4643% 0.062249 217.469017;
+ --n: 45.229% 0.035214 264.1312;
+ --nc: 89.9258% 0.016374 262.749256;
+ --b1: 95.1276% 0.007445 260.731539;
+ --b2: 93.2996% 0.010389 261.788485;
+ --b3: 89.9258% 0.016374 262.749256;
+ --bc: 32.4374% 0.022945 264.182036;
+ --in: 69.2072% 0.062496 332.664922;
+ --su: 76.827% 0.074899 131.063061;
+ --wa: 85.4862% 0.089234 84.093335;
+ --er: 60.61% 0.120594 15.341883;
+ --rounded-box: 0.4rem;
+ --rounded-btn: 0.2rem;
+ --rounded-badge: 0.4rem;
+ --tab-radius: 0.2rem;
+}
+
+[data-theme=sunset] {
+ color-scheme: dark;
+ --pc: 14.9408% 0.031656 39.94703;
+ --sc: 14.5075% 0.035531 2.72034;
+ --ac: 14.2589% 0.033336 299.844533;
+ --inc: 17.1119% 0.017054 206.015183;
+ --suc: 17.1122% 0.017172 144.77874;
+ --wac: 17.1139% 0.016961 74.427797;
+ --erc: 17.1023% 0.015778 16.886379;
+ --animation-btn: 0.25s;
+ --animation-input: .2s;
+ --btn-focus-scale: 0.95;
+ --border-btn: 1px;
+ --tab-border: 1px;
+ --p: 74.7039% 0.158278 39.94703;
+ --s: 72.5375% 0.177654 2.72034;
+ --a: 71.2947% 0.166678 299.844533;
+ --n: 26% 0.019 237.69;
+ --nc: 70% 0.019 237.69;
+ --b1: 22% 0.019 237.69;
+ --b2: 20% 0.019 237.69;
+ --b3: 18% 0.019 237.69;
+ --bc: 77.3835% 0.043586 245.096534;
+ --in: 85.5596% 0.085271 206.015183;
+ --su: 85.5609% 0.08586 144.77874;
+ --wa: 85.5695% 0.084806 74.427797;
+ --er: 85.5116% 0.07889 16.886379;
+ --rounded-box: 1.2rem;
+ --rounded-btn: 0.8rem;
+ --rounded-badge: 0.4rem;
+ --tab-radius: 0.7rem;
+}
+
[data-theme=opensigncss] {
--p: 29.4653% 0.114548 259.060129;
--rounded-box: 1rem;
@@ -21429,9 +22363,6 @@ input.op-tab:checked + .op-tab-content,
.max-h-\\[340px\\] {
max-height: 340px;
}
-.max-h-\\[35px\\] {
- max-height: 35px;
-}
.max-h-\\[38px\\] {
max-height: 38px;
}
@@ -21538,9 +22469,6 @@ input.op-tab:checked + .op-tab-content,
.w-\\[4rem\\] {
width: 4rem;
}
-.w-\\[50\\%\\] {
- width: 50%;
-}
.w-\\[50px\\] {
width: 50px;
}
@@ -21616,9 +22544,6 @@ input.op-tab:checked + .op-tab-content,
.max-w-\\[450px\\] {
max-width: 450px;
}
-.max-w-\\[45px\\] {
- max-width: 45px;
-}
.max-w-\\[500px\\] {
max-width: 500px;
}
@@ -22085,9 +23010,6 @@ input.op-tab:checked + .op-tab-content,
--tw-bg-opacity: 1;
background-color: rgb(249 250 251 / var(--tw-bg-opacity));
}
-.bg-inherit {
- background-color: inherit;
-}
.bg-transparent {
background-color: transparent;
}
@@ -22098,9 +23020,6 @@ input.op-tab:checked + .op-tab-content,
.bg-white\\/20 {
background-color: rgb(255 255 255 / 0.2);
}
-.bg-base-content\\/30 {
- background-color: var(--fallback-bc,oklch(var(--bc)/0.3));
-}
.bg-opacity-20 {
--tw-bg-opacity: 0.2;
}
@@ -22125,9 +23044,6 @@ input.op-tab:checked + .op-tab-content,
.p-0 {
padding: 0px;
}
-.p-14 {
- padding: 3.5rem;
-}
.p-2 {
padding: 0.5rem;
}
@@ -22155,6 +23071,9 @@ input.op-tab:checked + .op-tab-content,
.p-\\[2px\\] {
padding: 2px;
}
+.p-\\[2rem\\] {
+ padding: 2rem;
+}
.p-\\[30px\\] {
padding: 30px;
}
@@ -22279,6 +23198,10 @@ input.op-tab:checked + .op-tab-content,
padding-top: 20px;
padding-bottom: 20px;
}
+.py-\\[2px\\] {
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
.py-\\[3px\\] {
padding-top: 3px;
padding-bottom: 3px;
@@ -22565,6 +23488,10 @@ input.op-tab:checked + .op-tab-content,
--tw-text-opacity: 1;
color: rgb(0 0 0 / var(--tw-text-opacity));
}
+.text-blue-400 {
+ --tw-text-opacity: 1;
+ color: rgb(96 165 250 / var(--tw-text-opacity));
+}
.text-blue-600 {
--tw-text-opacity: 1;
color: rgb(37 99 235 / var(--tw-text-opacity));
@@ -23105,10 +24032,6 @@ body {
width: 100%;
}
- .md\\:w-\\[15\\%\\] {
- width: 15%;
- }
-
.md\\:w-\\[200px\\] {
width: 200px;
}
@@ -23251,10 +24174,6 @@ body {
padding-bottom: 1.25rem;
}
- .md\\:pb-0 {
- padding-bottom: 0px;
- }
-
.md\\:pb-4 {
padding-bottom: 1rem;
}
@@ -23468,7 +24387,7 @@ body {
--tw-bg-opacity: 1;
background-color: rgb(55 65 81 / var(--tw-bg-opacity));
}
-}`, "",{"version":3,"sources":["webpack://./src/index.css"],"names":[],"mappings":"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nB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,+BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,0BAAmB;EAAnB,uBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,0BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,yBAAmB;UAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,4BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,0EAAmB;EAAnB,8FAAmB;EAAnB;AAAmB;AAAnB;EAAA,+EAAmB;EAAnB,mGAAmB;EAAnB;AAAmB;AAAnB;EAAA,6EAAmB;EAAnB,iGAAmB;EAAnB;AAAmB;AAAnB;EAAA,8BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,2GAAmB;EAAnB,yGAAmB;EAAnB;AAAmB;AAAnB;EAAA,2GAAmB;EAAnB,yGAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,gKAAmB;EAAnB,wJAAmB;EAAnB,iLAAmB;EAAnB,wDAAmB;EAAnB;AAAmB;AAAnB;EAAA,wBAAmB;EAAnB,wDAAmB;EAAnB;AAAmB;;AAEnB;EACE,uBAAuB;AACzB;;AAEA,iCAAiC;AACjC;EACE,aAAa;AACf;;AAEA;EACE,wBAAwB,EAAE,gBAAgB;EAC1C,qBAAqB,EAAE,YAAY;AACrC;;AAEA,kEAAkE;AAEhE;EAAA,kBAAiB;EAAjB;AAAiB;AAGjB;EAAA,kBAAmB;EAAnB;AAAmB;AAGnB;EAAA,kBAAc;EAAd;AAAc;AAGd;EAAA,kBAAiB;EAAjB;AAAiB;AAGjB;EAAA,kBAAiB;EAAjB;AAAiB;;AAGnB,4DAA4D;AAE1D;EAAA,oBAAmB;EAAnB;AAAmB;AAGnB;EAAA,oBAAqB;EAArB;AAAqB;AAGrB;EAAA,oBAAgB;EAAhB;AAAgB;AAGhB;EAAA,oBAAmB;EAAnB;AAAmB;AAGnB;EAAA,oBAAmB;EAAnB;AAAmB;AAGnB;EAAA,sBAAoB;EAApB;AAAoB;AAEtB,oCAAoC;AACpC;EACE,qBAAqB,EAAE,gBAAgB;EACvC,qBAAqB,EAAE,gBAAgB;AACzC;;AAEA,kDAAkD;AAClD;EACE,UAAU;AACZ;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,sBAAsB;EACtB,mBAAmB;AACrB;;AAxEA;;EAAA;IAAA,YAwEC;IAxED,gBAwEC;IAxED,qBAwEC;IAxED,sBAwEC;IAxED;EAwEC;;EAxED;IAAA,YAwEC;IAxED,gBAwEC;IAxED,kBAwEC;IAxED,mBAwEC;IAxED;EAwEC;;EAxED;IAAA,YAwEC;IAxED,WAwEC;IAxED;EAwEC;;EAxED;IAAA,YAwEC;IAxED,WAwEC;IAxED;EAwEC;;EAxED;IAAA,YAwEC;IAxED,WAwEC;IAxED,qBAwEC;IAxED;EAwEC;;EAxED;IAAA,YAwEC;IAxED,WAwEC;IAxED,qBAwEC;IAxED;EAwEC;AAAA;;AAxED;EAAA,0BAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED,sBAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED,kBAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED,wBAwEC;EAxED,wDAwEC;EAxED;AAwEC;;AAxED;EAAA,gBAwEC;EAxED;AAwEC;;AAxED;EAAA;AAwEC;;AAxED;EAAA,kBAwEC;EAxED;AAwEC;;AAxED;EAAA;AAwEC;;AAxED;EAAA;AAwEC;;AAxED;EAAA,sBAwEC;EAxED;AAwEC;;AAxED;EAAA,sBAwEC;EAxED;AAwEC;;AAxED;EAAA;AAwEC;;AAxED;EAAA,kBAwEC;EAxED;AAwEC;;AAxED;EAAA;AAwEC;;AAxED;EAAA,oBAwEC;EAxED;AAwEC;;AAxED;EAAA,oBAwEC;EAxED;AAwEC;;AAxED;EAAA;AAwEC;;AAxED;EAAA;AAwEC;;AAxED;EAAA,+EAwEC;EAxED,mGAwEC;EAxED;AAwEC;;AAxED;EAAA,kBAwEC;EAxED;AAwEC;;AAxED;EAAA,8BAwEC;EAxED;AAwEC;;AAxED;EAAA,oBAwEC;EAxED;AAwEC;;AAxED;EAAA,sBAwEC;EAxED;AAwEC;;AAxED;EAAA,kBAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED,sBAwEC;EAxED;AAwEC;;AAxED;EAAA,0BAwEC;EAxED,sBAwEC;EAxED;AAwEC;;AAxED;EAAA,8BAwEC;EAxED;AAwEC;;AAxED;EAAA,2GAwEC;EAxED,yGAwEC;EAxED;AAwEC;;AAxED;EAAA,oBAwEC;EAxED;AAwEC;;AAxED;;EAAA;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,gBAwEC;IAxED;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,gBAwEC;IAxED;EAwEC;;EAxED;IAAA,oBAwEC;IAxED;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,iBAwEC;IAxED;EAwEC;;EAxED;IAAA,mBAwEC;IAxED;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,eAwEC;IAxED;EAwEC;;EAxED;IAAA,mBAwEC;IAxED;EAwEC;;EAxED;IAAA,mBAwEC;IAxED;EAwEC;;EAxED;IAAA,kBAwEC;IAxED;EAwEC;AAAA;;AAxED;;EAAA;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,gBAwEC;IAxED;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,mBAwEC;IAxED;EAwEC;AAAA;;AAxED;;EAAA;IAAA;EAwEC;;EAxED;IAAA;EAwEC;AAAA;;AAxED;;EAAA;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,kBAwEC;IAxED;EAwEC;;EAxED;IAAA,iBAwEC;IAxED;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;AAAA;;AAxED;EAAA,0BAwEC;EAxED,uBAwEC;EAxED;AAwEC;;AAxED;;EAAA;IAAA,sBAwEC;IAxED;EAwEC;;EAxED;IAAA,kBAwEC;IAxED;EAwEC;AAAA","sourcesContent":["@tailwind base;\r\n@tailwind components;\r\n@tailwind utilities;\r\n\r\nbody {\r\n background-color: white;\r\n}\r\n\r\n/* Custom CSS to hide scrollbar */\r\n.hide-scrollbar::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.hide-scrollbar {\r\n -ms-overflow-style: none; /* IE and Edge */\r\n scrollbar-width: none; /* Firefox */\r\n}\r\n\r\n/* below css class replace bootstrap background color with daisy */\r\n.op-bg-primary {\r\n @apply bg-primary;\r\n}\r\n.op-bg-secondary {\r\n @apply bg-secondary;\r\n}\r\n.op-bg-info {\r\n @apply bg-info;\r\n}\r\n.op-bg-success{\r\n @apply bg-success;\r\n}\r\n.op-bg-warning {\r\n @apply bg-warning;\r\n}\r\n\r\n/* below css class replace bootstrap text color with daisy */\r\n.op-text-primary {\r\n @apply text-primary;\r\n}\r\n.op-text-secondary {\r\n @apply text-secondary;\r\n}\r\n.op-text-info {\r\n @apply text-info;\r\n}\r\n.op-text-success{\r\n @apply text-success;\r\n}\r\n.op-text-warning {\r\n @apply text-warning;\r\n}\r\n.op-border-primary{\r\n @apply border-primary\r\n}\r\n/* CSS for scrollbar customization */\r\n* {\r\n scrollbar-width: thin; /* For Firefox */\r\n scrollbar-color: gray; /* For Firefox */\r\n}\r\n\r\n/* For webkit-based browsers like Chrome, Safari */\r\n*::-webkit-scrollbar {\r\n width: 5px;\r\n}\r\n\r\n*::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n}\r\n\r\n*::-webkit-scrollbar-thumb {\r\n background-color: gray;\r\n border-radius: 10px;\r\n}"],"sourceRoot":""}]);
+}`, "",{"version":3,"sources":["webpack://./src/index.css"],"names":[],"mappings":"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mB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,+BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,0BAAmB;EAAnB,uBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,0BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,yBAAmB;UAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,4BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB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;AAxED;;EAAA;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,gBAwEC;IAxED;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,gBAwEC;IAxED;EAwEC;;EAxED;IAAA,oBAwEC;IAxED;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,iBAwEC;IAxED;EAwEC;;EAxED;IAAA,mBAwEC;IAxED;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,eAwEC;IAxED;EAwEC;;EAxED;IAAA,mBAwEC;IAxED;EAwEC;;EAxED;IAAA,mBAwEC;IAxED;EAwEC;;EAxED;IAAA,kBAwEC;IAxED;EAwEC;AAAA;;AAxED;;EAAA;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,gBAwEC;IAxED;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,mBAwEC;IAxED;EAwEC;AAAA;;AAxED;;EAAA;IAAA;EAwEC;;EAxED;IAAA;EAwEC;AAAA;;AAxED;;EAAA;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA,kBAwEC;IAxED;EAwEC;;EAxED;IAAA,iBAwEC;IAxED;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;;EAxED;IAAA;EAwEC;AAAA;;AAxED;EAAA,0BAwEC;EAxED,uBAwEC;EAxED;AAwEC;;AAxED;;EAAA;IAAA,sBAwEC;IAxED;EAwEC;;EAxED;IAAA,kBAwEC;IAxED;EAwEC;AAAA","sourcesContent":["@tailwind base;\r\n@tailwind components;\r\n@tailwind utilities;\r\n\r\nbody {\r\n background-color: white;\r\n}\r\n\r\n/* Custom CSS to hide scrollbar */\r\n.hide-scrollbar::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.hide-scrollbar {\r\n -ms-overflow-style: none; /* IE and Edge */\r\n scrollbar-width: none; /* Firefox */\r\n}\r\n\r\n/* below css class replace bootstrap background color with daisy */\r\n.op-bg-primary {\r\n @apply bg-primary;\r\n}\r\n.op-bg-secondary {\r\n @apply bg-secondary;\r\n}\r\n.op-bg-info {\r\n @apply bg-info;\r\n}\r\n.op-bg-success{\r\n @apply bg-success;\r\n}\r\n.op-bg-warning {\r\n @apply bg-warning;\r\n}\r\n\r\n/* below css class replace bootstrap text color with daisy */\r\n.op-text-primary {\r\n @apply text-primary;\r\n}\r\n.op-text-secondary {\r\n @apply text-secondary;\r\n}\r\n.op-text-info {\r\n @apply text-info;\r\n}\r\n.op-text-success{\r\n @apply text-success;\r\n}\r\n.op-text-warning {\r\n @apply text-warning;\r\n}\r\n.op-border-primary{\r\n @apply border-primary\r\n}\r\n/* CSS for scrollbar customization */\r\n* {\r\n scrollbar-width: thin; /* For Firefox */\r\n scrollbar-color: gray; /* For Firefox */\r\n}\r\n\r\n/* For webkit-based browsers like Chrome, Safari */\r\n*::-webkit-scrollbar {\r\n width: 5px;\r\n}\r\n\r\n*::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n}\r\n\r\n*::-webkit-scrollbar-thumb {\r\n background-color: gray;\r\n border-radius: 10px;\r\n}"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -36819,25 +37738,6 @@ var getNonce = function () {
};
-/***/ }),
-
-/***/ "./node_modules/html-parse-stringify/dist/html-parse-stringify.module.js":
-/*!*******************************************************************************!*\
- !*** ./node_modules/html-parse-stringify/dist/html-parse-stringify.module.js ***!
- \*******************************************************************************/
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
-/* harmony export */ });
-/* harmony import */ var void_elements__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! void-elements */ "./node_modules/void-elements/index.js");
-/* harmony import */ var void_elements__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(void_elements__WEBPACK_IMPORTED_MODULE_0__);
-var t=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?(".*?"|'.*?')/g;function n(n){var r={type:"tag",name:"",voidElement:!1,attrs:{},children:[]},i=n.match(/<\/?([^\s]+?)[/\s>]/);if(i&&(r.name=i[1],((void_elements__WEBPACK_IMPORTED_MODULE_0___default())[i[1]]||"/"===n.charAt(n.length-2))&&(r.voidElement=!0),r.name.startsWith("!--"))){var s=n.indexOf("--\x3e");return{type:"comment",comment:-1!==s?n.slice(4,s):""}}for(var a=new RegExp(t),c=null;null!==(c=a.exec(n));)if(c[0].trim())if(c[1]){var o=c[1].trim(),l=[o,""];o.indexOf("=")>-1&&(l=o.split("=")),r.attrs[l[0]]=l[1],a.lastIndex--}else c[2]&&(r.attrs[c[2]]=c[3].trim().substring(1,c[3].length-1));return r}var r=/<[a-zA-Z0-9\-\!\/](?:"[^"]*"|'[^']*'|[^'">])*>/g,i=/^\s*$/,s=Object.create(null);function a(e,t){switch(t.type){case"text":return e+t.content;case"tag":return e+="<"+t.name+(t.attrs?function(e){var t=[];for(var n in e)t.push(n+'="'+e[n]+'"');return t.length?" "+t.join(" "):""}(t.attrs):"")+(t.voidElement?"/>":">"),t.voidElement?e:e+t.children.reduce(a,"")+""+t.name+">";case"comment":return e+"\x3c!--"+t.comment+"--\x3e"}}var c={parse:function(e,t){t||(t={}),t.components||(t.components=s);var a,c=[],o=[],l=-1,m=!1;if(0!==e.indexOf("<")){var u=e.indexOf("<");c.push({type:"text",content:-1===u?e:e.substring(0,u)})}return e.replace(r,function(r,s){if(m){if(r!==""+a.name+">")return;m=!1}var u,f="/"!==r.charAt(1),h=r.startsWith("\x3c!--"),p=s+r.length,d=e.charAt(p);if(h){var v=n(r);return l<0?(c.push(v),c):((u=o[l]).children.push(v),c)}if(f&&(l++,"tag"===(a=n(r)).type&&t.components[a.name]&&(a.type="component",m=!0),a.voidElement||m||!d||"<"===d||a.children.push({type:"text",content:e.slice(p,e.indexOf("<",p))}),0===l&&c.push(a),(u=o[l-1])&&u.children.push(a),o[l]=a),(!f||a.voidElement)&&(l>-1&&(a.voidElement||a.name===r.slice(2,-1))&&(l--,a=-1===l?c:o[l]),!m&&"<"!==d&&d)){u=-1===l?c:o[l].children;var x=e.indexOf("<",p),g=e.slice(p,-1===x?void 0:x);i.test(g)&&(g=" "),(x>-1&&l+u.length>=0||" "!==g)&&u.push({type:"text",content:g})}}),c},stringify:function(e){return e.reduce(function(e,t){return e+a("",t)},"")}};/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (c);
-//# sourceMappingURL=html-parse-stringify.module.js.map
-
-
/***/ }),
/***/ "./node_modules/is-what/dist/index.esm.js":
@@ -158954,37 +159854,6 @@ function version(uuid) {
}
var _default = exports["default"] = version;
-/***/ }),
-
-/***/ "./node_modules/void-elements/index.js":
-/*!*********************************************!*\
- !*** ./node_modules/void-elements/index.js ***!
- \*********************************************/
-/***/ ((module) => {
-
-/**
- * This file automatically generated from `pre-publish.js`.
- * Do not manually edit.
- */
-
-module.exports = {
- "area": true,
- "base": true,
- "br": true,
- "col": true,
- "embed": true,
- "hr": true,
- "img": true,
- "input": true,
- "link": true,
- "meta": true,
- "param": true,
- "source": true,
- "track": true,
- "wbr": true
-};
-
-
/***/ }),
/***/ "./node_modules/warning/warning.js":
@@ -171198,7 +172067,7 @@ function _objectWithoutPropertiesLoose(r, e) {
if (null == r) return {};
var t = {};
for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
- if (e.includes(n)) continue;
+ if (e.indexOf(n) >= 0) continue;
t[n] = r[n];
}
return t;
@@ -210421,979 +211290,6 @@ function getGlobalContext() {
/***/ }),
-/***/ "./node_modules/react-i18next/dist/es/I18nextProvider.js":
-/*!***************************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/I18nextProvider.js ***!
- \***************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ I18nextProvider: () => (/* binding */ I18nextProvider)
-/* harmony export */ });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
-/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js");
-
-
-function I18nextProvider({
- i18n,
- defaultNS,
- children
-}) {
- const value = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({
- i18n,
- defaultNS
- }), [i18n, defaultNS]);
- return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_context_js__WEBPACK_IMPORTED_MODULE_1__.I18nContext.Provider, {
- value
- }, children);
-}
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/Trans.js":
-/*!*****************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/Trans.js ***!
- \*****************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ Trans: () => (/* binding */ Trans),
-/* harmony export */ nodesToString: () => (/* reexport safe */ _TransWithoutContext_js__WEBPACK_IMPORTED_MODULE_1__.nodesToString)
-/* harmony export */ });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
-/* harmony import */ var _TransWithoutContext_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TransWithoutContext.js */ "./node_modules/react-i18next/dist/es/TransWithoutContext.js");
-/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js");
-
-
-
-
-function Trans({
- children,
- count,
- parent,
- i18nKey,
- context,
- tOptions = {},
- values,
- defaults,
- components,
- ns,
- i18n: i18nFromProps,
- t: tFromProps,
- shouldUnescape,
- ...additionalProps
-}) {
- const {
- i18n: i18nFromContext,
- defaultNS: defaultNSFromContext
- } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_js__WEBPACK_IMPORTED_MODULE_2__.I18nContext) || {};
- const i18n = i18nFromProps || i18nFromContext || (0,_context_js__WEBPACK_IMPORTED_MODULE_2__.getI18n)();
- const t = tFromProps || i18n?.t.bind(i18n);
- return (0,_TransWithoutContext_js__WEBPACK_IMPORTED_MODULE_1__.Trans)({
- children,
- count,
- parent,
- i18nKey,
- context,
- tOptions,
- values,
- defaults,
- components,
- ns: ns || t?.ns || defaultNSFromContext || i18n?.options?.defaultNS,
- i18n,
- t: tFromProps,
- shouldUnescape,
- ...additionalProps
- });
-}
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/TransWithoutContext.js":
-/*!*******************************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/TransWithoutContext.js ***!
- \*******************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ Trans: () => (/* binding */ Trans),
-/* harmony export */ nodesToString: () => (/* binding */ nodesToString)
-/* harmony export */ });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
-/* harmony import */ var html_parse_stringify__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-parse-stringify */ "./node_modules/html-parse-stringify/dist/html-parse-stringify.module.js");
-/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./node_modules/react-i18next/dist/es/utils.js");
-/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./defaults.js */ "./node_modules/react-i18next/dist/es/defaults.js");
-/* harmony import */ var _i18nInstance_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./i18nInstance.js */ "./node_modules/react-i18next/dist/es/i18nInstance.js");
-
-
-
-
-
-const hasChildren = (node, checkLength) => {
- if (!node) return false;
- const base = node.props?.children ?? node.children;
- if (checkLength) return base.length > 0;
- return !!base;
-};
-const getChildren = node => {
- if (!node) return [];
- const children = node.props?.children ?? node.children;
- return node.props?.i18nIsDynamicList ? getAsArray(children) : children;
-};
-const hasValidReactChildren = children => Array.isArray(children) && children.every(react__WEBPACK_IMPORTED_MODULE_0__.isValidElement);
-const getAsArray = data => Array.isArray(data) ? data : [data];
-const mergeProps = (source, target) => {
- const newTarget = {
- ...target
- };
- newTarget.props = Object.assign(source.props, target.props);
- return newTarget;
-};
-const nodesToString = (children, i18nOptions) => {
- if (!children) return '';
- let stringNode = '';
- const childrenArray = getAsArray(children);
- const keepArray = i18nOptions?.transSupportBasicHtmlNodes ? i18nOptions.transKeepBasicHtmlNodesFor ?? [] : [];
- childrenArray.forEach((child, childIndex) => {
- if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(child)) {
- stringNode += `${child}`;
- } else if ((0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(child)) {
- const {
- props,
- type
- } = child;
- const childPropsCount = Object.keys(props).length;
- const shouldKeepChild = keepArray.indexOf(type) > -1;
- const childChildren = props.children;
- if (!childChildren && shouldKeepChild && !childPropsCount) {
- stringNode += `<${type}/>`;
- } else if (!childChildren && (!shouldKeepChild || childPropsCount) || props.i18nIsDynamicList) {
- stringNode += `<${childIndex}>${childIndex}>`;
- } else if (shouldKeepChild && childPropsCount === 1 && (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(childChildren)) {
- stringNode += `<${type}>${childChildren}${type}>`;
- } else {
- const content = nodesToString(childChildren, i18nOptions);
- stringNode += `<${childIndex}>${content}${childIndex}>`;
- }
- } else if (child === null) {
- (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warn)(`Trans: the passed in value is invalid - seems you passed in a null child.`);
- } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(child)) {
- const {
- format,
- ...clone
- } = child;
- const keys = Object.keys(clone);
- if (keys.length === 1) {
- const value = format ? `${keys[0]}, ${format}` : keys[0];
- stringNode += `{{${value}}}`;
- } else {
- (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warn)(`react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.`, child);
- }
- } else {
- (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warn)(`Trans: the passed in value is invalid - seems you passed in a variable like {number} - please pass in variables for interpolation as full objects like {{number}}.`, child);
- }
- });
- return stringNode;
-};
-const renderNodes = (children, targetString, i18n, i18nOptions, combinedTOpts, shouldUnescape) => {
- if (targetString === '') return [];
- const keepArray = i18nOptions.transKeepBasicHtmlNodesFor || [];
- const emptyChildrenButNeedsHandling = targetString && new RegExp(keepArray.map(keep => `<${keep}`).join('|')).test(targetString);
- if (!children && !emptyChildrenButNeedsHandling && !shouldUnescape) return [targetString];
- const data = {};
- const getData = childs => {
- const childrenArray = getAsArray(childs);
- childrenArray.forEach(child => {
- if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(child)) return;
- if (hasChildren(child)) getData(getChildren(child));else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(child) && !(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(child)) Object.assign(data, child);
- });
- };
- getData(children);
- const ast = html_parse_stringify__WEBPACK_IMPORTED_MODULE_1__["default"].parse(`<0>${targetString}0>`);
- const opts = {
- ...data,
- ...combinedTOpts
- };
- const renderInner = (child, node, rootReactNode) => {
- const childs = getChildren(child);
- const mappedChildren = mapAST(childs, node.children, rootReactNode);
- return hasValidReactChildren(childs) && mappedChildren.length === 0 || child.props?.i18nIsDynamicList ? childs : mappedChildren;
- };
- const pushTranslatedJSX = (child, inner, mem, i, isVoid) => {
- if (child.dummy) {
- child.children = inner;
- mem.push((0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(child, {
- key: i
- }, isVoid ? undefined : inner));
- } else {
- mem.push(...react__WEBPACK_IMPORTED_MODULE_0__.Children.map([child], c => {
- const props = {
- ...c.props
- };
- delete props.i18nIsDynamicList;
- return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(c.type, {
- ...props,
- key: i,
- ref: c.ref
- }, isVoid ? null : inner);
- }));
- }
- };
- const mapAST = (reactNode, astNode, rootReactNode) => {
- const reactNodes = getAsArray(reactNode);
- const astNodes = getAsArray(astNode);
- return astNodes.reduce((mem, node, i) => {
- const translationContent = node.children?.[0]?.content && i18n.services.interpolator.interpolate(node.children[0].content, opts, i18n.language);
- if (node.type === 'tag') {
- let tmp = reactNodes[parseInt(node.name, 10)];
- if (rootReactNode.length === 1 && !tmp) tmp = rootReactNode[0][node.name];
- if (!tmp) tmp = {};
- const child = Object.keys(node.attrs).length !== 0 ? mergeProps({
- props: node.attrs
- }, tmp) : tmp;
- const isElement = (0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(child);
- const isValidTranslationWithChildren = isElement && hasChildren(node, true) && !node.voidElement;
- const isEmptyTransWithHTML = emptyChildrenButNeedsHandling && (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(child) && child.dummy && !isElement;
- const isKnownComponent = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(children) && Object.hasOwnProperty.call(children, node.name);
- if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(child)) {
- const value = i18n.services.interpolator.interpolate(child, opts, i18n.language);
- mem.push(value);
- } else if (hasChildren(child) || isValidTranslationWithChildren) {
- const inner = renderInner(child, node, rootReactNode);
- pushTranslatedJSX(child, inner, mem, i);
- } else if (isEmptyTransWithHTML) {
- const inner = mapAST(reactNodes, node.children, rootReactNode);
- pushTranslatedJSX(child, inner, mem, i);
- } else if (Number.isNaN(parseFloat(node.name))) {
- if (isKnownComponent) {
- const inner = renderInner(child, node, rootReactNode);
- pushTranslatedJSX(child, inner, mem, i, node.voidElement);
- } else if (i18nOptions.transSupportBasicHtmlNodes && keepArray.indexOf(node.name) > -1) {
- if (node.voidElement) {
- mem.push((0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(node.name, {
- key: `${node.name}-${i}`
- }));
- } else {
- const inner = mapAST(reactNodes, node.children, rootReactNode);
- mem.push((0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(node.name, {
- key: `${node.name}-${i}`
- }, inner));
- }
- } else if (node.voidElement) {
- mem.push(`<${node.name} />`);
- } else {
- const inner = mapAST(reactNodes, node.children, rootReactNode);
- mem.push(`<${node.name}>${inner}${node.name}>`);
- }
- } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(child) && !isElement) {
- const content = node.children[0] ? translationContent : null;
- if (content) mem.push(content);
- } else {
- pushTranslatedJSX(child, translationContent, mem, i, node.children.length !== 1 || !translationContent);
- }
- } else if (node.type === 'text') {
- const wrapTextNodes = i18nOptions.transWrapTextNodes;
- const content = shouldUnescape ? i18nOptions.unescape(i18n.services.interpolator.interpolate(node.content, opts, i18n.language)) : i18n.services.interpolator.interpolate(node.content, opts, i18n.language);
- if (wrapTextNodes) {
- mem.push((0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(wrapTextNodes, {
- key: `${node.name}-${i}`
- }, content));
- } else {
- mem.push(content);
- }
- }
- return mem;
- }, []);
- };
- const result = mapAST([{
- dummy: true,
- children: children || []
- }], ast, getAsArray(children || []));
- return getChildren(result[0]);
-};
-function Trans({
- children,
- count,
- parent,
- i18nKey,
- context,
- tOptions = {},
- values,
- defaults,
- components,
- ns,
- i18n: i18nFromProps,
- t: tFromProps,
- shouldUnescape,
- ...additionalProps
-}) {
- const i18n = i18nFromProps || (0,_i18nInstance_js__WEBPACK_IMPORTED_MODULE_4__.getI18n)();
- if (!i18n) {
- (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warnOnce)('You will need to pass in an i18next instance by using i18nextReactModule');
- return children;
- }
- const t = tFromProps || i18n.t.bind(i18n) || (k => k);
- const reactI18nextOptions = {
- ...(0,_defaults_js__WEBPACK_IMPORTED_MODULE_3__.getDefaults)(),
- ...i18n.options?.react
- };
- let namespaces = ns || t.ns || i18n.options?.defaultNS;
- namespaces = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(namespaces) ? [namespaces] : namespaces || ['translation'];
- const nodeAsString = nodesToString(children, reactI18nextOptions);
- const defaultValue = defaults || nodeAsString || reactI18nextOptions.transEmptyNodeValue || i18nKey;
- const {
- hashTransKey
- } = reactI18nextOptions;
- const key = i18nKey || (hashTransKey ? hashTransKey(nodeAsString || defaultValue) : nodeAsString || defaultValue);
- if (i18n.options?.interpolation?.defaultVariables) {
- values = values && Object.keys(values).length > 0 ? {
- ...values,
- ...i18n.options.interpolation.defaultVariables
- } : {
- ...i18n.options.interpolation.defaultVariables
- };
- }
- const interpolationOverride = values || count !== undefined || !children ? tOptions.interpolation : {
- interpolation: {
- ...tOptions.interpolation,
- prefix: '#$?',
- suffix: '?$#'
- }
- };
- const combinedTOpts = {
- ...tOptions,
- context: context || tOptions.context,
- count,
- ...values,
- ...interpolationOverride,
- defaultValue,
- ns: namespaces
- };
- const translation = key ? t(key, combinedTOpts) : defaultValue;
- if (components) {
- Object.keys(components).forEach(c => {
- const comp = components[c];
- if (typeof comp.type === 'function' || !comp.props || !comp.props.children || translation.indexOf(`${c}/>`) < 0 && translation.indexOf(`${c} />`) < 0) return;
- function Componentized() {
- return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, comp);
- }
- components[c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(Componentized);
- });
- }
- const content = renderNodes(components || children, translation, i18n, reactI18nextOptions, combinedTOpts, shouldUnescape);
- const useAsParent = parent ?? reactI18nextOptions.defaultTransParent;
- return useAsParent ? (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(useAsParent, additionalProps, content) : content;
-}
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/Translation.js":
-/*!***********************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/Translation.js ***!
- \***********************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ Translation: () => (/* binding */ Translation)
-/* harmony export */ });
-/* harmony import */ var _useTranslation_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./useTranslation.js */ "./node_modules/react-i18next/dist/es/useTranslation.js");
-
-const Translation = ({
- ns,
- children,
- ...options
-}) => {
- const [t, i18n, ready] = (0,_useTranslation_js__WEBPACK_IMPORTED_MODULE_0__.useTranslation)(ns, options);
- return children(t, {
- i18n,
- lng: i18n.language
- }, ready);
-};
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/context.js":
-/*!*******************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/context.js ***!
- \*******************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ I18nContext: () => (/* binding */ I18nContext),
-/* harmony export */ ReportNamespaces: () => (/* binding */ ReportNamespaces),
-/* harmony export */ composeInitialProps: () => (/* binding */ composeInitialProps),
-/* harmony export */ getDefaults: () => (/* reexport safe */ _defaults_js__WEBPACK_IMPORTED_MODULE_1__.getDefaults),
-/* harmony export */ getI18n: () => (/* reexport safe */ _i18nInstance_js__WEBPACK_IMPORTED_MODULE_2__.getI18n),
-/* harmony export */ getInitialProps: () => (/* binding */ getInitialProps),
-/* harmony export */ initReactI18next: () => (/* reexport safe */ _initReactI18next_js__WEBPACK_IMPORTED_MODULE_3__.initReactI18next),
-/* harmony export */ setDefaults: () => (/* reexport safe */ _defaults_js__WEBPACK_IMPORTED_MODULE_1__.setDefaults),
-/* harmony export */ setI18n: () => (/* reexport safe */ _i18nInstance_js__WEBPACK_IMPORTED_MODULE_2__.setI18n)
-/* harmony export */ });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
-/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaults.js */ "./node_modules/react-i18next/dist/es/defaults.js");
-/* harmony import */ var _i18nInstance_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./i18nInstance.js */ "./node_modules/react-i18next/dist/es/i18nInstance.js");
-/* harmony import */ var _initReactI18next_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./initReactI18next.js */ "./node_modules/react-i18next/dist/es/initReactI18next.js");
-
-
-
-
-
-const I18nContext = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();
-class ReportNamespaces {
- constructor() {
- this.usedNamespaces = {};
- }
- addUsedNamespaces(namespaces) {
- namespaces.forEach(ns => {
- this.usedNamespaces[ns] ??= true;
- });
- }
- getUsedNamespaces = () => Object.keys(this.usedNamespaces);
-}
-const composeInitialProps = ForComponent => async ctx => {
- const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {};
- const i18nInitialProps = getInitialProps();
- return {
- ...componentsInitialProps,
- ...i18nInitialProps
- };
-};
-const getInitialProps = () => {
- const i18n = (0,_i18nInstance_js__WEBPACK_IMPORTED_MODULE_2__.getI18n)();
- const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? [];
- const ret = {};
- const initialI18nStore = {};
- i18n.languages.forEach(l => {
- initialI18nStore[l] = {};
- namespaces.forEach(ns => {
- initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};
- });
- });
- ret.initialI18nStore = initialI18nStore;
- ret.initialLanguage = i18n.language;
- return ret;
-};
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/defaults.js":
-/*!********************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/defaults.js ***!
- \********************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ getDefaults: () => (/* binding */ getDefaults),
-/* harmony export */ setDefaults: () => (/* binding */ setDefaults)
-/* harmony export */ });
-/* harmony import */ var _unescape_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./unescape.js */ "./node_modules/react-i18next/dist/es/unescape.js");
-
-let defaultOptions = {
- bindI18n: 'languageChanged',
- bindI18nStore: '',
- transEmptyNodeValue: '',
- transSupportBasicHtmlNodes: true,
- transWrapTextNodes: '',
- transKeepBasicHtmlNodesFor: ['br', 'strong', 'i', 'p'],
- useSuspense: true,
- unescape: _unescape_js__WEBPACK_IMPORTED_MODULE_0__.unescape
-};
-const setDefaults = (options = {}) => {
- defaultOptions = {
- ...defaultOptions,
- ...options
- };
-};
-const getDefaults = () => defaultOptions;
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/i18nInstance.js":
-/*!************************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/i18nInstance.js ***!
- \************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ getI18n: () => (/* binding */ getI18n),
-/* harmony export */ setI18n: () => (/* binding */ setI18n)
-/* harmony export */ });
-let i18nInstance;
-const setI18n = instance => {
- i18nInstance = instance;
-};
-const getI18n = () => i18nInstance;
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/index.js":
-/*!*****************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/index.js ***!
- \*****************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ I18nContext: () => (/* reexport safe */ _context_js__WEBPACK_IMPORTED_MODULE_11__.I18nContext),
-/* harmony export */ I18nextProvider: () => (/* reexport safe */ _I18nextProvider_js__WEBPACK_IMPORTED_MODULE_5__.I18nextProvider),
-/* harmony export */ Trans: () => (/* reexport safe */ _Trans_js__WEBPACK_IMPORTED_MODULE_0__.Trans),
-/* harmony export */ TransWithoutContext: () => (/* reexport safe */ _TransWithoutContext_js__WEBPACK_IMPORTED_MODULE_1__.Trans),
-/* harmony export */ Translation: () => (/* reexport safe */ _Translation_js__WEBPACK_IMPORTED_MODULE_4__.Translation),
-/* harmony export */ composeInitialProps: () => (/* reexport safe */ _context_js__WEBPACK_IMPORTED_MODULE_11__.composeInitialProps),
-/* harmony export */ date: () => (/* binding */ date),
-/* harmony export */ getDefaults: () => (/* reexport safe */ _defaults_js__WEBPACK_IMPORTED_MODULE_9__.getDefaults),
-/* harmony export */ getI18n: () => (/* reexport safe */ _i18nInstance_js__WEBPACK_IMPORTED_MODULE_10__.getI18n),
-/* harmony export */ getInitialProps: () => (/* reexport safe */ _context_js__WEBPACK_IMPORTED_MODULE_11__.getInitialProps),
-/* harmony export */ initReactI18next: () => (/* reexport safe */ _initReactI18next_js__WEBPACK_IMPORTED_MODULE_8__.initReactI18next),
-/* harmony export */ number: () => (/* binding */ number),
-/* harmony export */ plural: () => (/* binding */ plural),
-/* harmony export */ select: () => (/* binding */ select),
-/* harmony export */ selectOrdinal: () => (/* binding */ selectOrdinal),
-/* harmony export */ setDefaults: () => (/* reexport safe */ _defaults_js__WEBPACK_IMPORTED_MODULE_9__.setDefaults),
-/* harmony export */ setI18n: () => (/* reexport safe */ _i18nInstance_js__WEBPACK_IMPORTED_MODULE_10__.setI18n),
-/* harmony export */ time: () => (/* binding */ time),
-/* harmony export */ useSSR: () => (/* reexport safe */ _useSSR_js__WEBPACK_IMPORTED_MODULE_7__.useSSR),
-/* harmony export */ useTranslation: () => (/* reexport safe */ _useTranslation_js__WEBPACK_IMPORTED_MODULE_2__.useTranslation),
-/* harmony export */ withSSR: () => (/* reexport safe */ _withSSR_js__WEBPACK_IMPORTED_MODULE_6__.withSSR),
-/* harmony export */ withTranslation: () => (/* reexport safe */ _withTranslation_js__WEBPACK_IMPORTED_MODULE_3__.withTranslation)
-/* harmony export */ });
-/* harmony import */ var _Trans_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Trans.js */ "./node_modules/react-i18next/dist/es/Trans.js");
-/* harmony import */ var _TransWithoutContext_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TransWithoutContext.js */ "./node_modules/react-i18next/dist/es/TransWithoutContext.js");
-/* harmony import */ var _useTranslation_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./useTranslation.js */ "./node_modules/react-i18next/dist/es/useTranslation.js");
-/* harmony import */ var _withTranslation_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./withTranslation.js */ "./node_modules/react-i18next/dist/es/withTranslation.js");
-/* harmony import */ var _Translation_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Translation.js */ "./node_modules/react-i18next/dist/es/Translation.js");
-/* harmony import */ var _I18nextProvider_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./I18nextProvider.js */ "./node_modules/react-i18next/dist/es/I18nextProvider.js");
-/* harmony import */ var _withSSR_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./withSSR.js */ "./node_modules/react-i18next/dist/es/withSSR.js");
-/* harmony import */ var _useSSR_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./useSSR.js */ "./node_modules/react-i18next/dist/es/useSSR.js");
-/* harmony import */ var _initReactI18next_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./initReactI18next.js */ "./node_modules/react-i18next/dist/es/initReactI18next.js");
-/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./defaults.js */ "./node_modules/react-i18next/dist/es/defaults.js");
-/* harmony import */ var _i18nInstance_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./i18nInstance.js */ "./node_modules/react-i18next/dist/es/i18nInstance.js");
-/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js");
-
-
-
-
-
-
-
-
-
-
-
-
-const date = () => '';
-const time = () => '';
-const number = () => '';
-const select = () => '';
-const plural = () => '';
-const selectOrdinal = () => '';
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/initReactI18next.js":
-/*!****************************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/initReactI18next.js ***!
- \****************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ initReactI18next: () => (/* binding */ initReactI18next)
-/* harmony export */ });
-/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaults.js */ "./node_modules/react-i18next/dist/es/defaults.js");
-/* harmony import */ var _i18nInstance_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./i18nInstance.js */ "./node_modules/react-i18next/dist/es/i18nInstance.js");
-
-
-const initReactI18next = {
- type: '3rdParty',
- init(instance) {
- (0,_defaults_js__WEBPACK_IMPORTED_MODULE_0__.setDefaults)(instance.options.react);
- (0,_i18nInstance_js__WEBPACK_IMPORTED_MODULE_1__.setI18n)(instance);
- }
-};
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/unescape.js":
-/*!********************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/unescape.js ***!
- \********************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ unescape: () => (/* binding */ unescape)
-/* harmony export */ });
-const matchHtmlEntity = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g;
-const htmlEntities = {
- '&': '&',
- '&': '&',
- '<': '<',
- '<': '<',
- '>': '>',
- '>': '>',
- ''': "'",
- ''': "'",
- '"': '"',
- '"': '"',
- ' ': ' ',
- ' ': ' ',
- '©': '©',
- '©': '©',
- '®': '®',
- '®': '®',
- '…': '…',
- '…': '…',
- '/': '/',
- '/': '/'
-};
-const unescapeHtmlEntity = m => htmlEntities[m];
-const unescape = text => text.replace(matchHtmlEntity, unescapeHtmlEntity);
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/useSSR.js":
-/*!******************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/useSSR.js ***!
- \******************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ useSSR: () => (/* binding */ useSSR)
-/* harmony export */ });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
-/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js");
-
-
-const useSSR = (initialI18nStore, initialLanguage, props = {}) => {
- const {
- i18n: i18nFromProps
- } = props;
- const {
- i18n: i18nFromContext
- } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_js__WEBPACK_IMPORTED_MODULE_1__.I18nContext) || {};
- const i18n = i18nFromProps || i18nFromContext || (0,_context_js__WEBPACK_IMPORTED_MODULE_1__.getI18n)();
- if (i18n.options?.isClone) return;
- if (initialI18nStore && !i18n.initializedStoreOnce) {
- i18n.services.resourceStore.data = initialI18nStore;
- i18n.options.ns = Object.values(initialI18nStore).reduce((mem, lngResources) => {
- Object.keys(lngResources).forEach(ns => {
- if (mem.indexOf(ns) < 0) mem.push(ns);
- });
- return mem;
- }, i18n.options.ns);
- i18n.initializedStoreOnce = true;
- i18n.isInitialized = true;
- }
- if (initialLanguage && !i18n.initializedLanguageOnce) {
- i18n.changeLanguage(initialLanguage);
- i18n.initializedLanguageOnce = true;
- }
-};
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/useTranslation.js":
-/*!**************************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/useTranslation.js ***!
- \**************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ useTranslation: () => (/* binding */ useTranslation)
-/* harmony export */ });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
-/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js");
-/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./node_modules/react-i18next/dist/es/utils.js");
-
-
-
-const usePrevious = (value, ignore) => {
- const ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
- (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
- ref.current = ignore ? ref.current : value;
- }, [value, ignore]);
- return ref.current;
-};
-const alwaysNewT = (i18n, language, namespace, keyPrefix) => i18n.getFixedT(language, namespace, keyPrefix);
-const useMemoizedT = (i18n, language, namespace, keyPrefix) => (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(alwaysNewT(i18n, language, namespace, keyPrefix), [i18n, language, namespace, keyPrefix]);
-const useTranslation = (ns, props = {}) => {
- const {
- i18n: i18nFromProps
- } = props;
- const {
- i18n: i18nFromContext,
- defaultNS: defaultNSFromContext
- } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_js__WEBPACK_IMPORTED_MODULE_1__.I18nContext) || {};
- const i18n = i18nFromProps || i18nFromContext || (0,_context_js__WEBPACK_IMPORTED_MODULE_1__.getI18n)();
- if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new _context_js__WEBPACK_IMPORTED_MODULE_1__.ReportNamespaces();
- if (!i18n) {
- (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warnOnce)('You will need to pass in an i18next instance by using initReactI18next');
- const notReadyT = (k, optsOrDefaultValue) => {
- if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(optsOrDefaultValue)) return optsOrDefaultValue;
- if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(optsOrDefaultValue) && (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue;
- return Array.isArray(k) ? k[k.length - 1] : k;
- };
- const retNotReady = [notReadyT, {}, false];
- retNotReady.t = notReadyT;
- retNotReady.i18n = {};
- retNotReady.ready = false;
- return retNotReady;
- }
- if (i18n.options.react?.wait) (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warnOnce)('It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.');
- const i18nOptions = {
- ...(0,_context_js__WEBPACK_IMPORTED_MODULE_1__.getDefaults)(),
- ...i18n.options.react,
- ...props
- };
- const {
- useSuspense,
- keyPrefix
- } = i18nOptions;
- let namespaces = ns || defaultNSFromContext || i18n.options?.defaultNS;
- namespaces = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(namespaces) ? [namespaces] : namespaces || ['translation'];
- i18n.reportNamespaces.addUsedNamespaces?.(namespaces);
- const ready = (i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.hasLoadedNamespace)(n, i18n, i18nOptions));
- const memoGetT = useMemoizedT(i18n, props.lng || null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);
- const getT = () => memoGetT;
- const getNewT = () => alwaysNewT(i18n, props.lng || null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);
- const [t, setT] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(getT);
- let joinedNS = namespaces.join();
- if (props.lng) joinedNS = `${props.lng}${joinedNS}`;
- const previousJoinedNS = usePrevious(joinedNS);
- const isMounted = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(true);
- (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
- const {
- bindI18n,
- bindI18nStore
- } = i18nOptions;
- isMounted.current = true;
- if (!ready && !useSuspense) {
- if (props.lng) {
- (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.loadLanguages)(i18n, props.lng, namespaces, () => {
- if (isMounted.current) setT(getNewT);
- });
- } else {
- (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.loadNamespaces)(i18n, namespaces, () => {
- if (isMounted.current) setT(getNewT);
- });
- }
- }
- if (ready && previousJoinedNS && previousJoinedNS !== joinedNS && isMounted.current) {
- setT(getNewT);
- }
- const boundReset = () => {
- if (isMounted.current) setT(getNewT);
- };
- if (bindI18n) i18n?.on(bindI18n, boundReset);
- if (bindI18nStore) i18n?.store.on(bindI18nStore, boundReset);
- return () => {
- isMounted.current = false;
- if (i18n) bindI18n?.split(' ').forEach(e => i18n.off(e, boundReset));
- if (bindI18nStore && i18n) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, boundReset));
- };
- }, [i18n, joinedNS]);
- (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
- if (isMounted.current && ready) {
- setT(getT);
- }
- }, [i18n, keyPrefix, ready]);
- const ret = [t, i18n, ready];
- ret.t = t;
- ret.i18n = i18n;
- ret.ready = ready;
- if (ready) return ret;
- if (!ready && !useSuspense) return ret;
- throw new Promise(resolve => {
- if (props.lng) {
- (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.loadLanguages)(i18n, props.lng, namespaces, () => resolve());
- } else {
- (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.loadNamespaces)(i18n, namespaces, () => resolve());
- }
- });
-};
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/utils.js":
-/*!*****************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/utils.js ***!
- \*****************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ getDisplayName: () => (/* binding */ getDisplayName),
-/* harmony export */ hasLoadedNamespace: () => (/* binding */ hasLoadedNamespace),
-/* harmony export */ isObject: () => (/* binding */ isObject),
-/* harmony export */ isString: () => (/* binding */ isString),
-/* harmony export */ loadLanguages: () => (/* binding */ loadLanguages),
-/* harmony export */ loadNamespaces: () => (/* binding */ loadNamespaces),
-/* harmony export */ warn: () => (/* binding */ warn),
-/* harmony export */ warnOnce: () => (/* binding */ warnOnce)
-/* harmony export */ });
-const warn = (...args) => {
- if (console?.warn) {
- if (isString(args[0])) args[0] = `react-i18next:: ${args[0]}`;
- console.warn(...args);
- }
-};
-const alreadyWarned = {};
-const warnOnce = (...args) => {
- if (isString(args[0]) && alreadyWarned[args[0]]) return;
- if (isString(args[0])) alreadyWarned[args[0]] = new Date();
- warn(...args);
-};
-const loadedClb = (i18n, cb) => () => {
- if (i18n.isInitialized) {
- cb();
- } else {
- const initialized = () => {
- setTimeout(() => {
- i18n.off('initialized', initialized);
- }, 0);
- cb();
- };
- i18n.on('initialized', initialized);
- }
-};
-const loadNamespaces = (i18n, ns, cb) => {
- i18n.loadNamespaces(ns, loadedClb(i18n, cb));
-};
-const loadLanguages = (i18n, lng, ns, cb) => {
- if (isString(ns)) ns = [ns];
- ns.forEach(n => {
- if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n);
- });
- i18n.loadLanguages(lng, loadedClb(i18n, cb));
-};
-const hasLoadedNamespace = (ns, i18n, options = {}) => {
- if (!i18n.languages || !i18n.languages.length) {
- warnOnce('i18n.languages were undefined or empty', i18n.languages);
- return true;
- }
- return i18n.hasLoadedNamespace(ns, {
- lng: options.lng,
- precheck: (i18nInstance, loadNotPending) => {
- if (options.bindI18n?.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;
- }
- });
-};
-const getDisplayName = Component => Component.displayName || Component.name || (isString(Component) && Component.length > 0 ? Component : 'Unknown');
-const isString = obj => typeof obj === 'string';
-const isObject = obj => typeof obj === 'object' && obj !== null;
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/withSSR.js":
-/*!*******************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/withSSR.js ***!
- \*******************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ withSSR: () => (/* binding */ withSSR)
-/* harmony export */ });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
-/* harmony import */ var _useSSR_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useSSR.js */ "./node_modules/react-i18next/dist/es/useSSR.js");
-/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js");
-/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils.js */ "./node_modules/react-i18next/dist/es/utils.js");
-
-
-
-
-const withSSR = () => function Extend(WrappedComponent) {
- function I18nextWithSSR({
- initialI18nStore,
- initialLanguage,
- ...rest
- }) {
- (0,_useSSR_js__WEBPACK_IMPORTED_MODULE_1__.useSSR)(initialI18nStore, initialLanguage);
- return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(WrappedComponent, {
- ...rest
- });
- }
- I18nextWithSSR.getInitialProps = (0,_context_js__WEBPACK_IMPORTED_MODULE_2__.composeInitialProps)(WrappedComponent);
- I18nextWithSSR.displayName = `withI18nextSSR(${(0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getDisplayName)(WrappedComponent)})`;
- I18nextWithSSR.WrappedComponent = WrappedComponent;
- return I18nextWithSSR;
-};
-
-/***/ }),
-
-/***/ "./node_modules/react-i18next/dist/es/withTranslation.js":
-/*!***************************************************************!*\
- !*** ./node_modules/react-i18next/dist/es/withTranslation.js ***!
- \***************************************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ withTranslation: () => (/* binding */ withTranslation)
-/* harmony export */ });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
-/* harmony import */ var _useTranslation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useTranslation.js */ "./node_modules/react-i18next/dist/es/useTranslation.js");
-/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./node_modules/react-i18next/dist/es/utils.js");
-
-
-
-const withTranslation = (ns, options = {}) => function Extend(WrappedComponent) {
- function I18nextWithTranslation({
- forwardedRef,
- ...rest
- }) {
- const [t, i18n, ready] = (0,_useTranslation_js__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(ns, {
- ...rest,
- keyPrefix: options.keyPrefix
- });
- const passDownProps = {
- ...rest,
- t,
- i18n,
- tReady: ready
- };
- if (options.withRef && forwardedRef) {
- passDownProps.ref = forwardedRef;
- } else if (!options.withRef && forwardedRef) {
- passDownProps.forwardedRef = forwardedRef;
- }
- return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(WrappedComponent, passDownProps);
- }
- I18nextWithTranslation.displayName = `withI18nextTranslation(${(0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.getDisplayName)(WrappedComponent)})`;
- I18nextWithTranslation.WrappedComponent = WrappedComponent;
- const forwardRef = (props, ref) => (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(I18nextWithTranslation, Object.assign({}, props, {
- forwardedRef: ref
- }));
- return options.withRef ? (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(forwardRef) : I18nextWithTranslation;
-};
-
-/***/ }),
-
/***/ "./node_modules/react-pdf/dist/esm/Document.js":
/*!*****************************************************!*\
!*** ./node_modules/react-pdf/dist/esm/Document.js ***!
@@ -217053,11 +216949,9 @@ const PublicScriptFileWrapper = _ref => {
window.updatePublicTemplateProps = setProps;
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_pages_PdfRequestFiles__WEBPACK_IMPORTED_MODULE_3__["default"], props);
};
-const appId =
-//"legadranaxn";
-"opensign";
-const serverUrl = "http://localhost:8080/app";
-//"https://app.opensignlabs.com/api/app";
+const appId = "legadranaxn";
+// "opensign";
+const serverUrl = "https://app.opensignlabs.com/api/app";
// "https://staging-app.opensignlabs.com/api/app";
localStorage.setItem("baseUrl", "".concat(serverUrl, "/"));
localStorage.setItem("parseAppId", appId);
@@ -217093,4 +216987,4 @@ root.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createEle
/******/ })()
;
});
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsbUVBQVc7QUFDckI7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHFFQUFXO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFLLFdBQVc7TUFDZCxPQUFPO1FBQUVzRSxLQUFLLEVBQUUsR0FBRztRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNuQyxLQUFLLE9BQU87TUFDVixPQUFPO1FBQUV2RixLQUFLLEVBQUUsR0FBRztRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNuQyxLQUFLLFVBQVU7TUFDYixPQUFPO1FBQUV2RixLQUFLLEVBQUUsRUFBRTtRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNsQyxLQUFLckQsZUFBZTtNQUNsQixPQUFPO1FBQUVsQyxLQUFLLEVBQUUsR0FBRztRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNuQyxLQUFLLFVBQVU7TUFDYixPQUFPO1FBQUV2RixLQUFLLEVBQUUsR0FBRztRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNuQyxLQUFLLFVBQVU7TUFDYixPQUFPO1FBQUV2RixLQUFLLEVBQUUsRUFBRTtRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNsQyxLQUFLLE1BQU07TUFDVCxPQUFPO1FBQUV2RixLQUFLLEVBQUUsR0FBRztRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNuQyxLQUFLLFNBQVM7TUFDWixPQUFPO1FBQUV2RixLQUFLLEVBQUUsR0FBRztRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNuQyxLQUFLLFdBQVc7TUFDZCxPQUFPO1FBQUV2RixLQUFLLEVBQUUsR0FBRztRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNuQyxLQUFLLE1BQU07TUFDVCxPQUFPO1FBQUV2RixLQUFLLEVBQUUsR0FBRztRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNuQyxLQUFLLE9BQU87TUFDVixPQUFPO1FBQUV2RixLQUFLLEVBQUUsRUFBRTtRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNsQyxLQUFLLE9BQU87TUFDVixPQUFPO1FBQUV2RixLQUFLLEVBQUUsR0FBRztRQUFFdUYsTUFBTSxFQUFFO01BQUcsQ0FBQztJQUNu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Q2pCO0FBQy9FLDhCQUE4QixzRUFBMkIsQ0FBQywrRUFBcUM7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLGlJQUFpSSxRQUFRLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksV0FBVyxVQUFVLEtBQUssS0FBSyxZQUFZLFdBQVcsVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsTUFBTSxNQUFNLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFlBQVksTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLE9BQU8sVUFBVSxZQUFZLFdBQVcsT0FBTyxPQUFPLFVBQVUsVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsTUFBTSxLQUFLLFVBQVUsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxVQUFVLFVBQVUsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFlBQVksV0FBVyxLQUFLLEtBQUssVUFBVSxLQUFLLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLFlBQVksTUFBTSxLQUFLLFVBQVUsVUFBVSxZQUFZLE1BQU0sS0FBSyxZQUFZLFdBQVcsVUFBVSxNQUFNLEtBQUssVUFBVSxZQUFZLE1BQU0sTUFBTSxZQUFZLFdBQVcsVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLGFBQWEsTUFBTSxLQUFLLFVBQVUsS0FBSyxNQUFNLFlBQVksV0FBVyxLQUFLLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksV0FBVyxLQUFLLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsS0FBSyxLQUFLLFlBQVksYUFBYSxhQUFhLE1BQU0sS0FBSyxVQUFVLFlBQVksV0FBVyxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsWUFBWSxNQUFNLEtBQUssVUFBVSxZQUFZLGFBQWEsTUFBTSxLQUFLLFVBQVUsWUFBWSxNQUFNLEtBQUssWUFBWSxXQUFXLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFVBQVUsS0FBSyxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsTUFBTSxLQUFLLFVBQVUsTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLEtBQUssWUFBWSxhQUFhLFdBQVcsS0FBSyxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksYUFBYSxXQUFXLEtBQUssS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxPQUFPLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLE9BQU8sUUFBUSxVQUFVLE1BQU0sUUFBUSxZQUFZLGFBQWEsTUFBTSxRQUFRLFlBQVksTUFBTSxRQUFRLFlBQVksYUFBYSxXQUFXLEtBQUssUUFBUSxZQUFZLE1BQU0sUUFBUSxVQUFVLE1BQU0sUUFBUSxVQUFVLEtBQUssUUFBUSxZQUFZLGFBQWEsYUFBYSxXQUFXLEtBQUssUUFBUSxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxNQUFNLFFBQVEsWUFBWSxNQUFNLFFBQVEsWUFBWSxXQUFXLEtBQUssY0FBYyxZQUFZLGFBQWEsV0FBVyxLQUFLLGNBQWMsWUFBWSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsTUFBTSxRQUFRLFlBQVksTUFBTSxvQkFBb0IsYUFBYSxNQUFNLG1DQUFtQyxhQUFhLFdBQVcsS0FBSyxRQUFRLFVBQVUsVUFBVSxLQUFLLFFBQVEsWUFBWSxNQUFNLFFBQVEsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLEtBQUssS0FBSyxZQUFZLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxPQUFPLFVBQVUsTUFBTSxVQUFVLFlBQVksTUFBTSxPQUFPLFlBQVksV0FBVyxVQUFVLE1BQU0sT0FBTyxZQUFZLGFBQWEsV0FBVyxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxNQUFNLE9BQU8sVUFBVSxNQUFNLE9BQU8sVUFBVSxZQUFZLE9BQU8sT0FBTyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsTUFBTSxPQUFPLFlBQVksYUFBYSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE9BQU8sWUFBWSxNQUFNLE9BQU8sWUFBWSxNQUFNLE9BQU8sWUFBWSxNQUFNLE9BQU8sWUFBWSxXQUFXLE1BQU0sS0FBSyxVQUFVLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLFVBQVUsVUFBVSxZQUFZLGFBQWEsTUFBTSxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksV0FBVyxV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QUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixtQ0FBbUM7QUFDL0QsNEJBQTRCLG1DQUFtQztBQUMvRDtBQUNBO0FBQ0EsNEJBQTRCLG1DQUFtQztBQUMvRCw0QkFBNEIsbUNBQW1DO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLGdCQUFnQixtQ0FBbUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1Qix5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLE9BQU8saUZBQWlGLFlBQVksTUFBTSxPQUFPLHFCQUFxQixvQkFBb0IscUJBQXFCLHFCQUFxQixNQUFNLE1BQU0sV0FBVyxNQUFNLFlBQVksTUFBTSxNQUFNLHFCQUFxQiwrQkFBK0Isb0JBQW9CLHFCQUFxQixxQkFBcUIscUJBQXFCLHFCQUFxQixNQUFNLE9BQU8sTUFBTSxLQUFLLG9CQUFvQixxQkFBcUIsTUFBTSxRQUFRLE1BQU0sS0FBSyxvQkFBb0Isb0JBQW9CLHFCQUFxQixNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsV0FBVyxNQUFNLE1BQU0sTUFBTSxVQUFVLFdBQVcsV0FBVyxNQUFNLE1BQU0sTUFBTSxLQUFLLFVBQVUsV0FBVyxNQUFNLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxTQUFTLE1BQU0sUUFBUSxxQkFBcUIscUJBQXFCLHFCQUFxQixvQkFBb0IsTUFBTSxNQUFNLE1BQU0sS0FBSyxVQUFVLE1BQU0sTUFBTSxNQUFNLE1BQU0sVUFBVSxVQUFVLFdBQVcsV0FBVyxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLFFBQVEsTUFBTSxLQUFLLG9CQUFvQixxQkFBcUIscUJBQXFCLE1BQU0sUUFBUSxNQUFNLFNBQVMscUJBQXFCLHFCQUFxQixxQkFBcUIsb0JBQW9CLHFCQUFxQixxQkFBcUIscUJBQXFCLG9CQUFvQixvQkFBb0Isb0JBQW9CLE1BQU0sTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE9BQU8sTUFBTSxRQUFRLHFCQUFxQixxQkFBcUIscUJBQXFCLE1BQU0sTUFBTSxNQUFNLEtBQUssVUFBVSxNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsTUFBTSxNQUFNLE1BQU0sS0FBSyxXQUFXLE1BQU0sTUFBTSxNQUFNLE1BQU0sVUFBVSxNQUFNLE9BQU8sTUFBTSxLQUFLLHFCQUFxQixxQkFBcUIsTUFBTSxNQUFNLE1BQU0sS0FBSyxXQUFXLE1BQU0sT0FBTyxNQUFNLEtBQUsscUJBQXFCLG9CQUFvQixNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsTUFBTSxNQUFNLE1BQU0saUJBQWlCLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLE9BQU8sV0FBVyxVQUFVLFVBQVUsTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLE1BQU0sTUFBTSxNQUFNLEtBQUssV0FBVyxNQUFNLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixvQkFBb0IsTUFBTSxNQUFNLE1BQU0sTUFBTSxVQUFVLE1BQU0sTUFBTSxLQUFLLEtBQUssVUFBVSxNQUFNLFFBQVEsTUFBTSxZQUFZLG9CQUFvQixxQkFBcUIsTUFBTSxNQUFNLE1BQU0sTUFBTSxVQUFVLFVBQVUsTUFBTSxXQUFXLEtBQUssVUFBVSxNQUFNLE1BQU0sV0FBVyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLE1BQU0sS0FBSyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLE1BQU0sS0FBSyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsS0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssTUFBTSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxZQUFZLE1BQU0sTUFBTSxLQUFLLE1BQU0sWUFBWSxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsS0FBSyxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxPQUFPLFdBQVcsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsYUFBYSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxRQUFRLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sT0FBTyxPQUFPLEtBQUssUUFBUSxNQUFNLFVBQVUsTUFBTSxNQUFNLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sT0FBTyxLQUFLLEtBQUssTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxPQUFPLE1BQU0sV0FBVyxhQUFhLE1BQU0sT0FBTyxPQUFPLEtBQUssS0FBSyxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsTUFBTSxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFdBQVcsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLFlBQVksWUFBWSxhQUFhLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxZQUFZLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFNBQVMsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLE9BQU8sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLFFBQVEsS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU8sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLFFBQVEsTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGdCQUFnQixNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxRQUFRLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFFBQVEsV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFNBQVMsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxTQUFTLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE9BQU8sTUFBTSxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxRQUFRLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLFlBQVksWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksWUFBWSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxTQUFTLFlBQVksWUFBWSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLE1BQU0sT0FBTyxNQUFNLE1BQU0sT0FBTyxNQUFNLE1BQU0sTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxNQUFNLE1BQU0sUUFBUSxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxNQUFNLE9BQU8sYUFBYSxhQUFhLFdBQVcsTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sU0FBUyxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxRQUFRLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxZQUFZLE1BQU0sTUFBTSxPQUFPLEtBQUssWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLFFBQVEsTUFBTSxNQUFNLE9BQU8sTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLFlBQVksT0FBTyxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLE9BQU8sWUFBWSxNQUFNLFVBQVUsTUFBTSxLQUFLLHdCQUF3Qix1QkFBdUIsT0FBTyxZQUFZLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsS0FBSyxLQUFLLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxhQUFhLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLGFBQWEsTUFBTSx3QkFBd0IseUJBQXlCLE9BQU8sWUFBWSxNQUFNLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLE9BQU8sS0FBSyxXQUFXLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sV0FBVyxZQUFZLE1BQU0sT0FBTyxNQUFNLFdBQVcsWUFBWSxNQUFNLE9BQU8sTUFBTSxXQUFXLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxXQUFXLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFdBQVcsTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFN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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sZ0dBQWdHLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxNQUFNLE9BQU8sV0FBVyxNQUFNLFFBQVEsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxNQUFNLEtBQUssWUFBWSxhQUFhLE9BQU8sUUFBUSxZQUFZLGFBQWEsT0FBTyxRQUFRLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxXQUFXLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxNQUFNLEtBQUssVUFBVSxZQUFZLFFBQVEsS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsT0FBTyxZQUFZLE1BQU0sWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLFdBQVcsT0FBTyxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLE9BQU8sT0FBTyxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxNQUFNLE1B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SEFBNEg7QUFDNUgsZ0lBQWdJO0FBQ2hJLGdJQUFnSTtBQUNoSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RCxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTywyRkFBMkYsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLFdBQVcsVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLFdBQVcsVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxNQUFNLE9BQU8sYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE1BQU0sS0FBSyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLE9BQU8sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLE1BQU0sWUFBWSxPQUFPLE1BQU0sWUFBWSxPQUFPLE1BQU0sWUFBWSxPQUFPLE1BQU0sWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFVBQVUsWUFBWSxXQUFXLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksV0FBVyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLE9BQU8sT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsV0FBVyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVks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O0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELGFBQWE7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsYUFBYTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FB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LG1CQUFPLENBQUMsd0RBQWM7QUFDcEMsY0FBYyxtQkFBTyxDQUFDLHNEQUFhOztBQUVuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLGNBQWM7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELFdBQVc7QUFDNUQ7QUFDQSxpREFBaUQsV0FBVztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9IQUFvSDtBQUNwSCxnSEFBZ0g7QUFDaEgsMEhBQTBIO0FBQzFILDRIQUE0SDtBQUM1SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFdBQVc7QUFDdkI7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FB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QWE7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakRxRTs7QUFFckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0EsOENBQThDO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxNQUFNLElBQXFDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQSxrQ0FBa0MsUUFBUTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FB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YTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkLFlBQVksV0FBVztBQUN2QixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVzWTs7Ozs7Ozs7Ozs7QUN0VXRZO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0S0Q7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNqRUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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QUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsSUFBSTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RJRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNsTEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDMUtEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDOUdEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDekZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdEZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3hGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDckZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNB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Q0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0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QTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDaEdEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDNUZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxLQUFLO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDOUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNyTkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNB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QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDckxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNE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QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQy9IRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzNFRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNyR0Q7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDbkVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0SUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM3R0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdlNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELElBQUksS0FBNEQ7QUFDaEUsSUFBSSxDQUN5QjtBQUM3QixDQUFDLHNCQUFzQjs7QUFFdkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsU0FBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHlCQUF5QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFlBQVk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRCxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixJQUFJO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0dBQXdHLElBQUksd0JBQXdCLElBQUksdURBQXVELElBQUk7QUFDbk0scUVBQXFFLElBQUk7QUFDekUsNEJBQTRCO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJDQUEyQyxZQUFZO0FBQ3ZEO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixZQUFZO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLE9BQU87QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQjtBQUNwQiwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFVBQVU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFhO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFPO0FBQ3hDLGdCQUFnQiw4RUFBZSxJQUFXLE9BQU8sQ0FBQztBQUNsRDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixFQUFFLElBQUksRUFBRTtBQUNwQztBQUNBLDRCQUE0QixFQUFFLElBQUksRUFBRTtBQUNwQztBQUNBO0FBQ0EscUNBQXFDLEVBQUU7QUFDdkMsK0JBQStCLEVBQUU7QUFDakMsaUNBQWlDLEVBQUU7QUFDbkMsK0JBQStCLEVBQUU7QUFDakMsNkJBQTZCLEVBQUUsSUFBSSxFQUFFO0FBQ3JDLDRCQUE0QixFQUFFO0FBQzlCLG1DQUFtQyxHQUFHO0FBQ3RDLDZCQUE2QixFQUFFO0FBQy9CLCtCQUErQixFQUFFLElBQUksRUFBRTtBQUN2Qyw4QkFBOEIsRUFBRSxJQUFJLEVBQUU7QUFDdEMsNEJBQTRCLEVBQUU7QUFDOUIsMkJBQTJCLEVBQUU7QUFDN0IseUJBQXlCLEVBQUU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsSUFBSSwwREFBMEQsSUFBSSxxRUFBcUUsRUFBRTtBQUNqTTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUMsT0FBTztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLE9BQU87QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwrQkFBK0I7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBLGVBQWUsT0FBTztBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsbUNBQW1DLGlCQUFpQjtBQUNwRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG9CQUFvQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQjtBQUNsQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw0R0FBNEc7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msc0JBQXNCO0FBQzFEO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLHNCQUFzQjtBQUMxRDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE9BQU87QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE9BQU87QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxPQUFPO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLE9BQU87QUFDNUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLG1CQUFtQjtBQUN6QztBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0Esb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxDQUFDOzs7Ozs7Ozs7Ozs7QUN2akxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCOztBQUV0Qjs7QUFFQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUU7QUFDbkU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5Qix3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCOztBQUUvQiw0QkFBNEI7QUFDNUIscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakMsMEJBQTBCO0FBQzFCLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLG1CQUFtQjtBQUNuQixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsZUFBZTtBQUNmLGtCQUFrQjtBQUNsQiw0QkFBNEI7QUFDNUIsbUJBQW1COztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNqMURhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7OztBQ3pEYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQjtBQUNwQixvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QjtBQUNBLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCOzs7QUFHQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsSUFBSTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsSUFBSTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMsNENBQTRDO0FBQzVDLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQix1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQywwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYTtBQUNiO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeFZhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixtQkFBTyxDQUFDLGdFQUFpQjtBQUM3QyxvQkFBb0IsbUJBQU8sQ0FBQywwREFBVztBQUN2QyxvQkFBb0IsbUJBQU8sQ0FBQyxzREFBUztBQUNyQyxvQkFBb0IsbUJBQU8sQ0FBQywwREFBVztBQUN2QyxvQkFBb0IsbUJBQU8sQ0FBQyw0REFBWTs7QUFFeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7OztBQUdBLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIsMkJBQTJCO0FBQzNCLDJCQUEyQjtBQUMzQiwyQkFBMkI7QUFDM0IsMkJBQTJCO0FBQzNCLDJCQUEyQjtBQUMzQiwyQkFBMkI7QUFDM0IsMkJBQTJCO0FBQzNCLDJCQUEyQjtBQUMzQiwrQkFBK0I7QUFDL0IsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2Qix1QkFBdUI7O0FBRXZCOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLDZCQUE2QjtBQUM3Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0EsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4Qjs7QUFFOUI7QUFDQSw4QkFBOEI7QUFDOUIsOEJBQThCOztBQUU5QjtBQUNBLDhCQUE4QjtBQUM5Qiw4QkFBOEI7O0FBRTlCO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBLGdDQUFnQztBQUNoQyxnQ0FBZ0M7QUFDaEMsOEJBQThCO0FBQzlCLDhCQUE4Qjs7QUFFOUI7QUFDQSw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsaUNBQWlDOztBQUVqQyxvQ0FBb0M7QUFDcEMsb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRCxtQ0FBbUM7QUFDbkMsbUNBQW1DO0FBQ25DLG1DQUFtQztBQUNuQyxtQ0FBbUM7QUFDbkMsbUNBQW1DO0FBQ25DOztBQUVBO0FBQ0E7O0FBRUEsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZTtBQUNmLHVDQUF1Qzs7QUFFdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsd0JBQXdCOztBQUV4Qix3RUFBd0UsU0FBUzs7QUFFakY7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkIsd0VBQXdFLFNBQVM7O0FBRWpGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUIsb0NBQW9DO0FBQ3BDLGdDQUFnQztBQUNoQyxvQ0FBb0M7QUFDcEMsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QixtQ0FBbUM7QUFDbkM7O0FBRUEsU0FBUzs7QUFFVDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QiwwQkFBMEI7OztBQUd2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsNEJBQTRCO0FBQzVCLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksRUFBRTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEVBQUU7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxFQUFFO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RkFBNkYsYUFBYTtBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1DQUFtQyxFQUFFLGlCQUFpQixHQUFHLFFBQVE7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsY0FBYyxtQ0FBbUMsRUFBRSxpQkFBaUIsR0FBRyxTQUFTO0FBQ2hGLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlO0FBQzlCO0FBQ0E7Ozs7Ozs7Ozs7O0FDallhOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLG9KQUE4RDtBQUNuRyw2QkFBNkIsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDM0Y7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBZTtBQUNmLHdDQUF3QyxtQkFBTyxDQUFDLG9JQUFzRDtBQUN0RyxxQ0FBcUMsbUJBQU8sQ0FBQyxzSUFBdUQ7QUFDcEcsc0NBQXNDLG1CQUFPLENBQUMsc0hBQStDO0FBQzdGLGtDQUFrQyxtQkFBTyxDQUFDLGdJQUFvRDtBQUM5RiwyQkFBMkIsbUJBQU8sQ0FBQyxzRkFBdUI7QUFDMUQsc0NBQXNDLG1CQUFPLENBQUMsOERBQVc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyw2QkFBNkI7QUFDbEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLDZCQUE2QjtBQUNsQyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlOzs7Ozs7Ozs7OztBQ3BFakI7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2YsdURBQXVELG1CQUFPLENBQUMsMEhBQXlDO0FBQ3hHLHdEQUF3RCxtQkFBTyxDQUFDLGdIQUFvQztBQUNwRztBQUNBO0FBQ0EsZUFBZSxrQkFBZTs7Ozs7Ozs7Ozs7QUNaakI7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysd0NBQXdDLG1CQUFPLENBQUMsb0lBQXNEO0FBQ3RHLHNDQUFzQyxtQkFBTyxDQUFDLDBJQUF5RDtBQUN2RyxrQ0FBa0MsbUJBQU8sQ0FBQyxnSUFBb0Q7QUFDOUYsMkJBQTJCLG1CQUFPLENBQUMsc0ZBQXVCO0FBQzFELGdEQUFnRCxtQkFBTyxDQUFDLDRHQUFrQztBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBZTs7Ozs7Ozs7Ozs7QUN0RmpCOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLG9KQUE4RDtBQUNuRyw2QkFBNkIsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDM0Y7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBa0IsR0FBRyxxQkFBcUIsR0FBRyxtQkFBbUI7QUFDaEUsMkJBQTJCO0FBQzNCLHlDQUF5QyxtQkFBTyxDQUFDLGdKQUE0RDtBQUM3RyxvQkFBb0IsbUJBQW1CO0FBQ3ZDLG1CQUFtQixrQkFBa0I7QUFDckMsc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDZmE7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELDJCQUEyQjtBQUMzQixvQkFBb0I7QUFDcEIseUJBQXlCO0FBQ3pCLDBCQUEwQjtBQUMxQiw4QkFBOEI7QUFDOUIsdUJBQXVCO0FBQ3ZCLHdCQUF3QjtBQUN4QixvQkFBb0I7QUFDcEIscUJBQXFCO0FBQ3JCLHVDQUF1QyxtQkFBTyxDQUFDLDBJQUF5RDtBQUN4RyxzQ0FBc0MsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDcEcsd0NBQXdDLG1CQUFPLENBQUMsb0lBQXNEO0FBQ3RHLHFDQUFxQyxtQkFBTyxDQUFDLDREQUFVO0FBQ3ZELDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFLHdDQUF3QyxtQkFBTyxDQUFDLGtFQUFhO0FBQzdELDRDQUE0QyxtQkFBTyxDQUFDLDBFQUFpQjtBQUNyRSx3Q0FBd0MsbUJBQU8sQ0FBQyxrRUFBYTtBQUM3RCxlQUFlLG1CQUFPLENBQUMsOERBQVc7QUFDbEM7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixtQkFBbUI7QUFDbkIsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUJBQXVCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1QixLQUFLLGFBQWE7QUFDekMseUJBQXlCLE1BQU0sVUFBVSxJQUFJO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNqTGE7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysc0NBQXNDLG1CQUFPLENBQUMsb0lBQXNEO0FBQ3BHLHNDQUFzQyxtQkFBTyxDQUFDLDBJQUF5RDtBQUN2RyxxQ0FBcUMsbUJBQU8sQ0FBQyxzSUFBdUQ7QUFDcEcsb0NBQW9DLG1CQUFPLENBQUMsb0lBQXNEO0FBQ2xHLHdDQUF3QyxtQkFBTyxDQUFDLDBJQUF5RDtBQUN6RyxrQ0FBa0MsbUJBQU8sQ0FBQyxnSUFBb0Q7QUFDOUYsc0NBQXNDLG1CQUFPLENBQUMsMElBQXlEO0FBQ3ZHLG1DQUFtQyxtQkFBTyxDQUFDLDhIQUFtRDtBQUM5RixxQ0FBcUMsbUJBQU8sQ0FBQyw0REFBVTtBQUN2RCxxQ0FBcUMsbUJBQU8sQ0FBQyw0REFBVTtBQUN2RCx5Q0FBeUMsbUJBQU8sQ0FBQyxvRUFBYztBQUMvRCwyQ0FBMkMsbUJBQU8sQ0FBQyx3RUFBZ0I7QUFDbkUsNENBQTRDLG1CQUFPLENBQUMsMEVBQWlCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0EsY0FBYyxnQkFBZ0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsTUFBTTtBQUNqQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsSUFBSTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsU0FBUztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isd0JBQXdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHdCQUF3QjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQix3QkFBd0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdGQUF3RixJQUFJO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RkFBOEYsSUFBSSxXQUFXLGtCQUFrQjtBQUMvSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLDBCQUEwQiw0QkFBNEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLDBCQUEwQiw0QkFBNEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLDBCQUEwQiw0QkFBNEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNIO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxnQkFBZ0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3RUFBd0UsYUFBYTtBQUNyRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFLHdDQUF3QztBQUN4QyxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDcFpqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsa0JBQWU7QUFDZixtQ0FBbUMsbUJBQU8sQ0FBQyw4SEFBbUQ7QUFDOUYsOENBQThDLG1CQUFPLENBQUMsc0hBQStDO0FBQ3JHLDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx1QkFBdUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOLDZCQUE2QixVQUFVO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFD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QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVSxFQUFFO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVUsRUFBRTtBQUNaO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isd0JBQXdCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7QUNwY1k7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysc0NBQXNDLG1CQUFPLENBQUMsb0lBQXNEO0FBQ3BHLDhDQUE4QyxtQkFBTyxDQUFDLHNIQUErQztBQUNyRyw0Q0FBNEMsbUJBQU8sQ0FBQywwRUFBaUI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGtDQUFrQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGtDQUFrQztBQUNsRCxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSwwQkFBMEI7QUFDdkMsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw4QkFBOEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsZ0JBQWdCO0FBQzdCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsOEJBQThCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsOEJBQThCO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGNBQWM7QUFDZCxlQUFlLFlBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDdkpqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsa0JBQWU7QUFDZiw4Q0FBOEMsbUJBQU8sQ0FBQyxzSEFBK0M7QUFDckcsc0NBQXNDLG1CQUFPLENBQUMsMElBQXlEO0FBQ3ZHLHNDQUFzQyxtQkFBTyxDQUFDLDBJQUF5RDtBQUN2RyxtQ0FBbUMsbUJBQU8sQ0FBQyw4SEFBbUQ7QUFDOUYsb0NBQW9DLG1CQUFPLENBQUMsb0lBQXNEO0FBQ2xHLGtDQUFrQyxtQkFBTyxDQUFDLGdJQUFvRDtBQUM5RixxQ0FBcUMsbUJBQU8sQ0FBQyxzSUFBdUQ7QUFDcEcsb0NBQW9DLG1CQUFPLENBQUMsa0lBQXFEO0FBQ2pHLHFDQUFxQyxtQkFBTyxDQUFDLHNJQUF1RDtBQUNwRyx1Q0FBdUMsbUJBQU8sQ0FBQywwSUFBeUQ7QUFDeEcsbUNBQW1DLG1CQUFPLENBQUMsa0lBQXFEO0FBQ2hHLHFDQUFxQyxtQkFBTyxDQUFDLHNJQUF1RDtBQUNwRyxzQ0FBc0MsbUJBQU8sQ0FBQyxzSEFBK0M7QUFDN0YsbUNBQW1DLG1CQUFPLENBQUMsa0lBQXFEO0FBQ2hHLHNDQUFzQyxtQkFBTyxDQUFDLG9JQUFzRDtBQUNwRyxzQ0FBc0MsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDcEcsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakUscUNBQXFDLG1CQUFPLENBQUMsNERBQVU7QUFDdkQsb0JBQW9CLG1CQUFPLENBQUMsd0VBQWdCO0FBQzVDLHlDQUF5QyxtQkFBTyxDQUFDLG9FQUFjO0FBQy9ELDRDQUE0QyxtQkFBTyxDQUFDLDBFQUFpQjtBQUNyRSwwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRSwyQ0FBMkMsbUJBQU8sQ0FBQyx3RUFBZ0I7QUFDbkUsMkJBQTJCLG1CQUFPLENBQUMsc0ZBQXVCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0YsTUFBTTtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUksRUFBRTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSSxFQUFFO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUksRUFBRTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHlCQUF5QjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFdBQVc7QUFDeEIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFdBQVc7QUFDeEIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsZ0JBQWdCO0FBQzdCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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UUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0Esd0VBQXdFLGFBQWE7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0EsMkVBQTJFLGVBQWU7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0EsMkVBQTJFLGVBQWU7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0EsMkVBQTJFLGVBQWU7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsWUFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sZUFBZTtBQUNyQjtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0NBQWtDLDJGQUEyRjtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFlBQVk7QUFDWjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQixRQUFRLGlEQUFRO0FBQ2hCLFFBQVEsaURBQVE7QUFDaEIsUUFBUSxpREFBUTtBQUNoQjtBQUNBLHNCQUFzQiwyQ0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQVE7QUFDaEIsUUFBUSxpREFBUTtBQUNoQixRQUFRLGlEQUFRO0FBQ2hCLFFBQVEsaURBQVE7QUFDaEI7QUFDQSxzQkFBc0IsMkNBQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCLFFBQVEsaURBQVE7QUFDaEIsUUFBUSxpREFBUTtBQUNoQixRQUFRLGlEQUFRO0FBQ2hCO0FBQ0Esc0JBQXNCLDJDQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQixRQUFRLGlEQUFRO0FBQ2hCLFFBQVEsaURBQVE7QUFDaEIsUUFBUSxpREFBUTtBQUNoQjtBQUNBLHNCQUFzQiwyQ0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQVE7QUFDaEIsUUFBUSxpREFB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LHNEQUFjO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxrREFBZTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0Msa0RBQWU7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0Msa0RBQWU7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdEQUFRLGlCQUFp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OUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGdEQUFhO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGdEQUFhO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0RBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsd0RBQU87QUFDckQsc0NBQXNDLHlEQUFRO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsd0RBQU87QUFDaEQsaUNBQWlDLDBEQUFTO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdC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QTtBQUNBO0FBQ0E7QUFDa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUMwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFNBQVM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsU0FBUztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGVBQWU7QUFDN0QsOEJBQThC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Q3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pJd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFVBQVU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELHFEQUFXO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFVBQVU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQscURBQVc7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsOEJBQThCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDViw4QkFBOEI7QUFDOUIsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEtBQUs7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw0QkFBNEI7QUFDNUIsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxTQUFTLEtBQXFDO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isc0JBQXNCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQiwyQkFBMkI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDLDRGQUE0RixDQUFNO0FBQzdJO0FBQ0E7O0FBRUEsb0JBQW9CLGdDQUFnQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQixnQ0FBZ0M7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlIQUFpSDtBQUNqSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7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QXFDO0FBQ3JDLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsMEVBQTBFLDZFQUE2RTtBQUN2SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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OztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTs7O0FBR1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSw4REFBOEQ7QUFDOUQsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLFNBQVM7QUFDVCx1QkFBdUI7QUFDdkI7QUFDQSxTQUFTO0FBQ1QsdUJBQXVCO0FBQ3ZCO0FBQ0EsU0FBUztBQUNULHdCQUF3QjtBQUN4QjtBQUNBLFNBQVM7QUFDVCx3QkFBd0I7QUFDeEI7QUFDQSxTQUFTO0FBQ1QsaUNBQWlDO0FBQ2pDO0FBQ0EsU0FBUztBQUNULDJCQUEyQjtBQUMzQjtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRDs7QUFFM0Q7QUFDQTs7QUFFQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0EsZ0ZBQWdGO0FBQ2hGO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7O0FBR2xCO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtFQUFrRTtBQUNsRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGlDQUFpQyxJQUFJO0FBQzNDO0FBQ0E7QUFDQSxNQUFNLGlDQUFpQyxJQUFJO0FBQzNDO0FBQ0EsNkRBQTZEO0FBQzdELE1BQU0saUNBQWlDLElBQUk7QUFDM0M7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDZOQUE2TjtBQUM3TjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZFQUE2RSxZQUFZO0FBQ3pGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlJQUFpSSw4QkFBOEI7QUFDL0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtRkFBbUY7QUFDbkY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUSwwQ0FBMEM7OztBQUdsRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnR0FBZ0c7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QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFlBQVksV0FBVztBQUN2Qjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDO0FBQzNDOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7O0FBRUEsc0NBQXNDO0FBQ3RDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLGlCQUFpQjs7QUFFakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxlQUFlO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSLHdFQUF3RTs7QUFFeEU7QUFDQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFROzs7QUFHUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxNQUFNO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxXQUFXLE1BQU07QUFDakI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRjs7QUFFM0Y7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDs7QUFFdkQsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ04sSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBLHlDQUF5Qzs7QUFFekM7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QztBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDOztBQUU5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLHVDQUF1Qzs7QUFFdkMsK0JBQStCO0FBQy9COztBQUVBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQSwwRUFBMEU7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUywyQ0FBMkM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFO0FBQ0E7O0FBRUEsb0JBQW9CLGlDQUFpQztBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQiw0Q0FBNEM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEVBQTRFOztBQUU1RSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7O0FBRUEsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7O0FBR0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7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Q0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4R0FBOEc7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKLGtCQUFrQixrQkFBa0I7QUFDcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHdCQUF3QjtBQUNuQyxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyx3QkFBd0I7QUFDbkMsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkIsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsUUFBUTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRTtBQUMvRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJHQUEyRztBQUMzRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRiwyVEFBMlQ7QUFDM1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLCtDQUErQyxRQUFRO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0oscUJBQXFCLCtCQUErQjtBQUNwRDtB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QUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw0QkFBNEI7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sMkVBQTJFLG9HQUFvRyxrQ0FBa0M7QUFDdk47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTSxvR0FBb0c7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1FQUFtRTs7QUFFbkUsK0ZBQStGO0FBQy9GOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw0QkFBNEI7QUFDbEQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLHdCQUF3QjtBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkRBQTJEO0FBQzNEO0FBQ0EsZ0ZBQWdGO0FBQ2hGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBLGNBQWM7OztBQUdkO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLDJ2QkFBMnZCOztBQUUzdkI7QUFDQTtBQUNBO0FBQ0EscUNBQXFDOztBQUVyQyx3REFBd0Q7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQSxFQUFFLG1CQUFtQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJLGNBQWM7QUFDbEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdCQUFnQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUyxjQUFjO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSwrQ0FBK0M7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLCtDQUErQztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsK0NBQStDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOzs7QUFHQSwwRUFBMEU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwySEFBMkg7QUFDM0g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvRUFBb0U7O0FBRXBFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEVBQUU7OztBQUdGLDJEQUEyRDs7QUFFM0QscURBQXFEO0FBQ3JEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7O0FBRUEsMkhBQTJIO0FBQzNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEU7QUFDMUU7O0FBRUE7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7O0FBRUE7O0FBRUEsYUFBYSxrQkFBa0I7QUFDL0I7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQyxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7O0FBRTVELDJEQUEyRDs7QUFFM0QsK0RBQStEOztBQUUvRDtBQUNBLDhEQUE4RDtBQUM5RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBLGtDQUFrQzs7QUFFbEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHNKQUFzSjs7QUFFdEoscUNBQXFDO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQThEO0FBQzlELHFEQUFxRDtBQUNyRCwyREFBMkQ7QUFDM0QsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0M7O0FBRS9DOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhIQUE4SCx5Q0FBeUM7QUFDdks7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsa0RBQWtEO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLDZCQUE2QjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOLHdFQUF3RTs7QUFFeEUsV0FBVyw2QkFBNkI7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsV0FBVyxpQ0FBaUM7QUFDNUM7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOLHdFQUF3RTs7QUFFeEUsV0FBVyxZQUFZO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLE1BQU07QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCOztBQUU1Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzRkFBc0Y7O0FBRXRGLDREQUE0RDtBQUM1RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDZCQUE2QjtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFD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b0Isb0JBQW9CO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7O0FBRUEsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQThEOztBQUU5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7O0FBRTlEO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7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QUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCOztBQUU3QixxQ0FBcUM7O0FBRXJDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLDJDQUEyQztBQUNqRDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrRkFBa0Y7QUFDbEY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0lBQWdJO0FBQ2hJO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSx5S0FBeUssMENBQTBDO0FBQ25OO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DOzs7QUFHbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7O0FBRTlCLGdEQUFnRDtBQUNoRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxlQUFlO0FBQ3pCLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdFQUFnRTs7QUFFaEU7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQztBQUNoQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKLGlHQUFpRztBQUNqRyxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4SUFBOEk7O0FBRTlJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Ysa0VBQWtFLDRDQUE0QztBQUM5Rzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0MsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0Esc0RBQXNEO0FBQ3REOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUlBQW1JO0FBQ25JO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtSUFBbUk7QUFDbkk7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLFFBQVEsSUFBSTtBQUNaO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOzs7QUFHQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQSxpSEFBaUg7QUFDakg7QUFDQTtBQUNBOztBQUVBLHlDQUF5QztBQUN6QyxNQUFNLEtBQUssRUFLTjtBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGdEQUFnRDs7QUFFaEQsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSxJ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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7OztBQUdWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ04sbUNBQW1DO0FBQ25DOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7O0FBRWpEO0FBQ0E7QUFDQSx5RUFBeUU7O0FBRXpFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1RUFBdUU7O0FBRXZFO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7OztBQUdBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSxzRUFBc0U7O0FBRXRFLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTix5Q0FBeUM7O0FBRXpDO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBO0FBQ0EsSUFBSTtBQUNKLCtHQUErRztBQUMvRztBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLGdHQUFnRztBQUNoRzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0EsSUFBSTs7O0FBR0osMEVBQTBFOztBQUUxRTtBQUNBO0FBQ0EsNEZBQTRGO0FBQzVGOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUdBQXVHO0FBQ3ZHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQyw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxnR0FBZ0c7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5TkFBeU4sR0FBRzs7QUFFNU47QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IscUJBQXFCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOzs7QUFHWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBLDBDQUEwQzs7QUFFMUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0hBQWdIO0FBQ2hIO0FBQ0E7O0FBRUEsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsZ0hBQWdIO0FBQ2hIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7O0FBR0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7O0FBRTdEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsb0NBQW9DO0FBQzVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDREQUE0RDtBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7O0FBRUEsc0hBQXNIOztBQUV0SCxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtHQUFrRztBQUNsRztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBLGtHQUFrRztBQUNsRztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjOzs7QUFHZDtBQUNBO0FBQ0E7O0FBRUEscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsY0FBYzs7QUFFZDs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQSxZQUFZOzs7QUFHWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxpRUFBaUU7QUFDakU7O0FBRUEsc0lBQXNJOztBQUV0STtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7O0FBRVosVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFEQUFxRDs7QUFFckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQSxnRUFBZ0U7QUFDaEU7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHdFQUF3RTs7QUFFeEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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O0FBQ25EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTs7O0FBR0EsaUVBQWlFO0FBQ2pFOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVEsNElBQTRJO0FBQ3BKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQSxzREFBc0Q7O0FBRXREO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7O0FBRUEsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJLCtCQUErQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSSwrQkFBK0I7QUFDbkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7QUFFVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBOztBQUVBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdEQUFnRDtBQUNoRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTs7QUFFdkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHNCQUFzQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGOztBQUU1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCOztBQUU1QixrQ0FBa0M7O0FBRWxDLCtCQUErQjs7QUFFL0IsMkJBQTJCOztBQUUzQiw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzREFBc0Q7O0FBRXRELG1EQUFtRDs7QUFFbkQseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0M7QUFDL0M7O0FBRUEsOENBQThDOztBQUU5Qyx5REFBeUQ7O0FBRXpELDZDQUE2Qzs7QUFFN0MsK0NBQStDO0FBQy9DOztBQUVBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBLGdDQUFnQztBQUNoQzs7QUFFQSxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0MsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEO0FBQ2hEOztBQUVBLGdEQUFnRDs7QUFFaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSiwrREFBK0Q7O0FBRS9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZFQUE2RTtBQUM3RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RkFBNEY7O0FBRTVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvRUFBb0U7OztBQUdwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCLG1CQUFtQjtBQUM3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLG9GQUFvRjtBQUNwRjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkNBQTZDO0FBQzdDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR047QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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QTRCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw0Q0FBNEM7QUFDcEQ7OztBQUdBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUEsa0RBQWtEOztBQUVsRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUhBQW1IOztBQUVuSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sR0FBRztBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDhMQUE4TCxvREFBb0QsRUFBRTtBQUNwUCxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbU9BQW1PLG9EQUFvRCxFQUFFO0FBQ3pSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQzs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSixnREFBZ0Q7O0FBRWhELHdDQUF3QztBQUN4Qzs7QUFFQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQsd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLGlCQUFpQjtBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3TEFBd0w7O0FBRXhMLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwwRUFBMEU7QUFDMUU7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxHQUFHO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdEOztBQUV4RDtBQUNBLG1DQUFtQzs7QUFFbkM7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0RBQXdELFFBQVE7O0FBRWhFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLGdMQUFnTCw4QkFBOEI7QUFDOU07QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQSw2REFBNkQ7O0FBRTdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEOztBQUVoRDs7QUFFQTtBQUNBLG9CQUFvQiwyQkFBMkI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSx1REFBdUQ7O0FBRXZEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSyxHQUFHO0FBQ1I7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQSw4RUFBOEU7O0FBRTlFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FB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QU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7O0FBRVY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUc7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSwrRUFBK0U7QUFDL0U7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxrQkFBZTtB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O0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxnQkFBZ0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7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QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSxpQ0FBaUM7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUZBQW1GLGNBQWM7QUFDakcsK0VBQStFLGNBQWM7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM3TmE7O0FBRWIs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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLHNEQUFXO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzREFBc0Q7O0FBRXREO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLG9EQUFhO0FBQzFCOztBQUVBO0FBQ0EsR0FBRyxDQUFDLDRDQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSCxDQUFDLGlFQUFlLGlCQUFpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuV0Y7QUFDd0I7QUFDNkQ7QUFD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QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQSxpREFBaUQsVUFBVTtBQUMzRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLHFEQUFxRCxVQUFVO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLDBCQUEwQjtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUMsd0NBQXdDOztBQUV6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLG9EQUFvRDs7QUFFckQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNENBQWU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLDhDQUFHOztBQUV6QjtBQUNBO0FBQ0E7O0FBRUEsV0FBVyxnREFBbUIsQ0FBQywwREFBYTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLENBQUMsNENBQWU7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLDhDQUFHOztBQUV6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUMsQ0FBQyw0Q0FBZTs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUFnQyxxREFBUzs7QUFFekM7QUFDQTtBQUNBLG9CQUFvQixxREFBUztBQUM3QixHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsdUJBQXVCLGdEQUFtQjtBQUMxQztBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBOztBQUVBLHVDQUF1Qzs7QUFFdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRjs7QUFFckY7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1EQUFtRDs7QUFFbkQsNkZBQTZGO0FBQzdGO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJIQUEySDtBQUMzSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9FQUFvRTs7QUFFcEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2QsV0FBVyxlQUFlO0FBQzFCLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssR0FBRzs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxHQUFHO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdB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MEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0Q7O0FBRXBEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtB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Uzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0EsZ0ZBQWdGO0FBQ2hGO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7O0FBR2xCO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdEQUFTO0FBQ3pDO0FBQ0EsOEJBQThCLHNEQUFRO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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LHNCQUFzQixnQ0FBZ0M7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEMsU0FBUztBQUNuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0NBQXNDLFdBQVc7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FB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O0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNFFBQTRRLG1CQUFtQixzREFBc0QsV0FBVyxlQUFlO0FBQy9XO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esd0NBQXdDLEtBQXFDLHlEQUF5RCxDQUFJO0FBQzFJOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDLGdCQUFnQixnREFBVTtBQUNoRTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxzREFBc0QsMERBQUs7QUFDM0Q7QUFDQSxHQUFHOztBQUVILE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0ZBQStGLGFBQWE7QUFDNUc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxVQUFVLEtBQXFDLElBQUkscURBQWM7QUFDakU7QUFDQTtBQUNBOztBQUVBLGFBQWEsMERBQW1CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RkFBdUY7QUFDdkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdDQUFnQztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0Ysa0JBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsYUFBYTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHFFQUFhO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFaVQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlJalQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRW1UOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5SG5UO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ3lFO0FBQ3pFLG1CQUFtQiwwQ0FBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyw4Q0FBZ0I7QUFDM0I7QUFDQTs7QUFFQTtBQUNpRTtBQUNqRTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyw4Q0FBUSxVQUFVLDhDQUFRO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxv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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFeUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2THpIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxLQUFxQztBQUNsRDtBQUNBO0FBQ0EsOEJBQThCLE9BQU8sa0ZBQWtGLE9BQU87QUFDOUgsR0FBRztBQUNIO0FBQ0EsaUtBQWlLLE1BQU07QUFDdkssR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxNQUFNO0FBQ3BELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLE1BQU07QUFDckQ7QUFDQTtBQUNBO0FBQ0EsSUFBSSxDQUFFO0FBQ047QUFDQSxNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQSwrQkFBK0IsSUFBSTtBQUNuQztBQUNBO0FBQ0Esa0NBQWtDLE1BQU07QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxnQkFBZ0I7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEIsZUFBZSxVQUFVO0FBQ3pCLGVBQWUsVUFBVTtBQUN6QixpQkFBaUIsS0FBSztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxnQkFBZ0I7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLG1CQUFtQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLCtCQUErQixrQkFBa0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxtQ0FBbUMsbUJBQW1CO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFlBQVksZUFBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxXQUFXLElBQUksaUJBQWlCO0FBQ3JFO0FBQ0EsdUJBQXVCLG1CQUFtQixvQkFBb0IsMkRBQTJELElBQUk7QUFDN0g7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLFVBQVUsZUFBZTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxjQUFjLFdBQVc7QUFDekI7QUFDQSxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBLDhCQUFtQixHQUFHLDBCQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsSUFBSTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixJQUFJO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLElBQUk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdGQUFnRixDQUF3cEI7QUFDeHVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixvQ0FBb0MsR0FBRztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsbUNBQW1DLFdBQVcsSUFBSTtBQUMxRixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsYUFBYSxFQUFFLFNBQVM7QUFDM0M7QUFDQSxzREFBc0QsSUFBSTtBQUMxRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLE1BQU07QUFDekMsb0NBQW9DLE9BQU87QUFDM0M7QUFDQTtBQUNBLHVDQUF1QyxPQUFPLEVBQUUsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU87QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZLGdCQUFnQixXQUFXO0FBQzNELHdCQUF3QixHQUFHO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFFBQVEsR0FBRyxRQUFRO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFVBQVU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixRQUFRO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsR0FBRztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLE9BQU87QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZLGFBQWEsV0FBVztBQUN4RCx3QkFBd0IsR0FBRztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLE9BQU87QUFDakMsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFlBQVksa0JBQWtCLFdBQVc7QUFDN0Qsd0JBQXdCLEdBQUc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUSxHQUFHLFFBQVEsR0FBRyxXQUFXLEdBQUcsV0FBVztBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFFBQVE7QUFDOUI7QUFDQTtBQUNBLDJCQUEyQixRQUFRO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFNBQVM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsWUFBWSxPQUFPLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLEdBQUc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sc0JBQXNCLFdBQVc7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0JBQWdCO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7OztBQU1EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ2pCQUFnakIsZ0JBQWdCO0FBQ2hrQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixxQkFBcUI7QUFDbEQsNEJBQTRCLHFCQUFxQjtBQUNqRDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixvQkFBb0IscUJBQXFCO0FBQ3pDLG1CQUFtQixxQkFBcUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qix1Q0FBdUM7QUFDckU7QUFDQSxpQ0FBaUMseUNBQXlDO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG1EQUFtRDtBQUMxRTtBQUNBO0FBQ0Esd0JBQXdCLHFEQUFxRDtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLG1DQUFtQyw4Q0FBOEM7QUFDakYsb0NBQW9DLDhDQUE4QztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsd0VBQXdFLEtBQUs7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsdUNBQXVDO0FBQy9EO0FBQ0E7QUFDQSxRQUFRO0FBQ1Isd0JBQXdCLHVDQUF1QztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSxLQUFLO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFFBQVE7QUFDakQ7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7OztBQUlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLElBQUksR0FBRywyQkFBMkI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IseUNBQXlDLGtCQUFrQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsdUNBQXVDLHNCQUFzQixNQUFNLEdBQUc7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsV0FBVyxFQUFFLHNCQUFzQjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsUUFBUTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsU0FBUyxXQUFXLEVBQUU7QUFDOUQsOEJBQThCLGVBQWUsZUFBZSxFQUFFLE1BQU0sS0FBSztBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEUsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLDZCQUE2QjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGVBQWUsU0FBUyxXQUFXLEVBQUU7QUFDakU7QUFDQTtBQUNBLDBCQUEwQixlQUFlLGdCQUFnQixFQUFFLE1BQU0sS0FBSztBQUN0RSxNQUFNO0FBQ04sZ0NBQWdDLDZCQUE2QjtBQUM3RDtBQUNBLHNDQUFzQyw2QkFBNkIsSUFBSTtBQUN2RTtBQUNBLDBCQUEwQixlQUFlLDRCQUE0QixFQUFFLEVBQUUsSUFBSSxNQUFNLEtBQUs7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixzREFBc0QsR0FBRztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLE9BQU87QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILDBCQUEwQixPQUFPO0FBQ2pDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsV0FBVztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixVQUFVO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsVUFBVTtBQUM1QjtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLE1BQU07QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxVQUFVO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCLDZDQUE2QyxjQUFjO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZUFBZTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFFBQVE7QUFDakQ7QUFDQTtBQUNBLElBQUk7QUFDSixXQUFXLGVBQWU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFFBQVE7QUFDN0M7QUFDQTtBQUNBLElBQUk7QUFDSixxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFdBQVc7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFlBQVk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsV0FBVztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFdBQVc7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxzQkFBc0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGlCQUFpQjtBQUNqQztBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsZ0JBQWdCLGlCQUFpQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLElBQUk7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osdUNBQXVDLGFBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsWUFBWTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsS0FBSyxLQUFLLHFCQUFxQjtBQUN2RjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixRQUFRLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixLQUFLLFNBQVM7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxxQkFBcUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsUUFBUTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxXQUFXO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxZQUFZO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsV0FBVztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHFEQUFxRCxPQUFPO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsRUFBRTtBQUNoRDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7OztBQUlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLE9BQU8sMEJBQTBCLElBQUk7QUFDN0c7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsSUFBSTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxNQUFNLEdBQUcsUUFBUTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFdBQVcsR0FBRyxhQUFhO0FBQ3hFO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7O0FBSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxVQUFVO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxVQUFVO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsTUFBTSxHQUFHLFFBQVE7QUFDeEQ7QUFDQTtBQUNBLDhEQUE4RCxVQUFVO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLHdEQUF3RCxLQUFLO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QiwwQ0FBMEM7QUFDbkUsd0JBQXdCLDBDQUEwQztBQUNsRSxNQUFNO0FBQ04seUJBQXlCLGVBQWUsRUFBRSxnQkFBZ0I7QUFDMUQsd0JBQXdCLGVBQWUsRUFBRSxlQUFlO0FBQ3hEO0FBQ0EsMkJBQTJCLGVBQWUsRUFBRSxpREFBaUQ7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLDJCQUEyQiwyQkFBMkI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0Esc0JBQXNCLHVCQUF1QixLQUFLLFdBQVc7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLDhCQUE4QixrQ0FBa0MsSUFBSSxVQUFVO0FBQzlFO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixpQkFBaUIsT0FBTyxVQUFVO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQixLQUFLLFdBQVc7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixnQ0FBZ0M7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxRQUFRO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxzRkFBc0Y7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsSUFBSSxHQUFHO0FBQzVDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw2QkFBNkI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsZ0ZBQWdGLGVBQWU7QUFDL0YsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELE9BQU87QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQsZUFBZTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQWdCLEdBQUcsbUNBQW1DO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSwrQ0FBK0MsY0FBYztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsS0FBSztBQUNqRTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsS0FBSztBQUMxRDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsaUJBQWlCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsUUFBUSxRQUFRLFFBQVEsR0FBRyxRQUFRO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUUsTUFBTTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0Ysb0JB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QTtBQUNBOztBQUVBLENBQUM7Ozs7OztBQU1EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sb0JBQW9CLG9DQUFvQztBQUN4RCxtQkFBbUIsa0RBQWtEO0FBQ3JFO0FB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QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLEdBQUc7QUFDMUU7QUFDQTtBQUNBLFVBQVU7QUFDViw4REFBOEQsR0FBRztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsaUJBQWlCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLFVBQVU7QUFDeEQ7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FB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QUUsR0FBRztBQUMvRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELFdBQVc7QUFDdkUsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxlQUFlO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLG9CQUFvQixrQkFBa0I7QUFDdEMsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLDBDQUEwQyxRQUFRO0FBQ2xEO0FBQ0E7QUFDQSxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLHVCQUF1Qix3QkFBd0IsYUFBYSx1REFBdUQ7QUFDbkg7QUFDQSwyQ0FBMkMsaUNBQWlDLEdBQUc7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpQkFBaUIsRUFBRSxHQUFHO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSxHQUFHO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsS0FBSztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sNkJBQTZCLGVBQWU7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix3QkFBd0IsRUFBRSxNQUFNLEVBQUUsdUJBQXVCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw2QkFBNkIsZUFBZTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsUUFBUTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDRCQUE0QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7O0FBT0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7O0FBTUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsTUFBTSxFQUFFLHNCQUFzQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHFCQUFxQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLEtBQUs7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7Ozs7O0FBUUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDBCQUEwQixpQkFBaUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDBCQUEwQixpQkFBaUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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UTtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsWUFBWTtBQUN4RCxJQUFJO0FBQ0o7QUFDQTtBQUNBLDRCQUE0QixZQUFZO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxXQUFXLFFBQVEsYUFBYSwrQ0FBK0MsTUFBTTtBQUM5RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQXFDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixZQUFZLE1BQU0sTUFBTSxxQ0FBcUMsNkJBQTZCO0FBQ3pIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxrREFBa0Qsa0NBQWtDO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxZQUFZLElBQXFDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsU0FBUztBQUNuQixrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSw2Q0FBNkM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEtBQUs7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHdCQUF3QjtBQUNsQztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxnQkFBZ0I7QUFDaEIsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQSxHQUFHO0FBQ0gsSUFBSTtBQUNKO0FBVUU7QUFDRjs7Ozs7Ozs7Ozs7Ozs7O0FDdHVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGLGFBQWE7QUFDekc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWE7QUFDYixhQUFhOztBQUViO0FB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cmNlcyI6WyJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL2lzLXByb3AtdmFsaWQvZGlzdC9pcy1wcm9wLXZhbGlkLmJyb3dzZXIuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL2lzLXByb3AtdmFsaWQvbm9kZV9tb2R1bGVzL0BlbW90aW9uL21lbW9pemUvZGlzdC9tZW1vaXplLmJyb3dzZXIuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9yZWFjdC9kaXN0L2Zsb2F0aW5nLXVpLnJlYWN0LmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi9zdGFuZGFyZC1mb250cy9lcy9FbmNvZGluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi9zdGFuZGFyZC1mb250cy9lcy9Gb250LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BwZGYtbGliL3N0YW5kYXJkLWZvbnRzL2VzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BwZGYtbGliL3N0YW5kYXJkLWZvbnRzL2VzL3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BwZGYtbGliL3VwbmcvVVBORy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9hcmlhLWhpZGRlbi9kaXN0L2VzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL1RpdGxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL0JvcmRlclJlc2l6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9EZWZhdWx0U2lnbmF0dXJlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1BkZkhlYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QZGZab29tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1BsYWNlaG9sZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1BsYWNlaG9sZGVyQm9yZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1BsYWNlaG9sZGVyVHlwZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QcmV2TmV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9SZW5kZXJBbGxQZGZQYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1JlbmRlclBkZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9TaWduUGFkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1NpZ25lckxpc3RDb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvVmVyaWZ5RW1haWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29uc3RhbnQvVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29uc3RhbnQvYXBwaW5mby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb25zdGFudC9jb25zdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9qc29uL3BsYW5zQXJyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3BhZ2VzL1BkZlJlcXVlc3RGaWxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL0FsZXJ0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3ByaW1pdGl2ZXMvSGFuZGxlRXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcHJpbWl0aXZlcy9Mb2FkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcHJpbWl0aXZlcy9Mb2FkZXJXaXRoTXNnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3ByaW1pdGl2ZXMvTW9kYWxVaS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL1BkZkRlY2xpbmVNb2RhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL1RvdXJDb250ZW50V2l0aEJ0bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9yZWR1eC9yZWR1Y2Vycy9TaG93VGVuYW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3JlZHV4L3JlZHVjZXJzL1RvdXJTdGVwc1JlZHVjZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcmVkdXgvcmVkdWNlcnMvaW5mb1JlZHVjZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcmVkdXgvcmVkdWNlcnMvc2hvd0hlYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9yZWR1eC9zdG9yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jbHN4L2Rpc3QvY2xzeC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jbmJ1aWxkZXIvZXNtL2NuYi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvYWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9jaXBoZXItY29yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvY29yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvZW5jLWJhc2U2NC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvZW5jLXV0ZjguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2V2cGtkZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvaG1hYy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvbWQ1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9zaGExLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvYmxhY2stYWxwaGEuY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvbWF1dmUuY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvdmlvbGV0LmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL2Rpc3QvcmVhY3QtZGF0ZXBpY2tlci5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvaW5kZXguY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3N0eWxlcy9vcGVuc2lnbmRyaXZlLmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9zdHlsZXMvc2lnbmF0dXJlLmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9hZGRMZWFkaW5nWmVyb3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9kZWZhdWx0TG9jYWxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZGVmYXVsdE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvZm9ybWF0dGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2Zvcm1hdC9saWdodEZvcm1hdHRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvbG9uZ0Zvcm1hdHRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvcHJvdGVjdGVkVG9rZW5zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZERheXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkSG91cnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWlsbGlzZWNvbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1pbnV0ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTW9udGhzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFF1YXJ0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFNlY29uZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkV2Vla3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkWWVhcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0cnVjdEZyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZkRheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZk1vbnRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mV2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheU9mWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXlzSW5Nb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREZWZhdWx0T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRIb3Vycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRJU09EYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRJU09XZWVrWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRNaW51dGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldE1vbnRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFF1YXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0U2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRUaW1lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vla1llYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0WWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0FmdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzQmVmb3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0VxdWFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZURheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVNb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVRdWFydGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNWYWxpZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1dpdGhpbkludGVydmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTG9jYWxpemVGbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoRm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0RGlzdGFuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0TG9uZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9sb2NhbGl6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9tYXRjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tYXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlSVNPLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvU2V0dGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvY29uc3RhbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvQU1QTU1pZG5pZ2h0UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9BTVBNUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXRlUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXlPZlllYXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RheVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5UGVyaW9kUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9FcmFQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0V4dGVuZGVkWWVhclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRnJhY3Rpb25PZlNlY29uZFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjBUbzExUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMHRvMjNQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIxVG8yNFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjF0bzEyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09EYXlQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1RpbWV6b25lUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09UaW1lem9uZVdpdGhaUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09XZWVrUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09XZWVrWWVhclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTG9jYWxEYXlQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsV2Vla1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTG9jYWxXZWVrWWVhclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTWludXRlUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Nb250aFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvUXVhcnRlclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU2Vjb25kUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1N0YW5kQWxvbmVNb250aFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvVGltZXN0YW1wU2Vjb25kc1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvWWVhclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXREYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0SG91cnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0SVNPRGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT1dlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0TWludXRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRNb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRRdWFydGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFNlY29uZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0V2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZEYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZklTT1dlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZklTT1dlZWtZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZNb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mUXVhcnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vla1llYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViRGF5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNb250aHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViUXVhcnRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViV2Vla3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViWWVhcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvdG9EYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RyYW5zcG9zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9ub2RlX21vZHVsZXMvcmVkdXgvZXMvcmVkdXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9hc3NldHMvaW1hZ2VzL2xvZ28ucG5nIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvZGlzdC9GaWxlU2F2ZXIubWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvY29tbWFuZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9mb2N1c0luc2lkZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2ZvY3VzSXNIaWRkZW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9mb2N1c1NvbHZlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2ZvY3VzYWJsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9tb3ZlRm9jdXNJbnNpZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9yZXR1cm4tZm9jdXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9zaWJsaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvc29sdmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvRE9NdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9hbGwtYWZmZWN0ZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2F1dG8tZm9jdXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9jb3JyZWN0Rm9jdXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9maXJzdEZvY3VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvZ2V0QWN0aXZlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2lzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvcGFyZW50aW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvc2FmZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL3RhYk9yZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvdGFiVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy90YWJiYWJsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtb3V0bGluZS1tYW5hZ2VyL2ZvY3VzLW91dGxpbmUtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9nZXQtbm9uY2UvZGlzdC9lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaHRtbC1wYXJzZS1zdHJpbmdpZnkvZGlzdC9odG1sLXBhcnNlLXN0cmluZ2lmeS5tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaXMtd2hhdC9kaXN0L2luZGV4LmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2guZGVib3VuY2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbWVyZ2UtYW55dGhpbmcvZGlzdC9pbmRleC5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWR6LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIta3cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1seS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLW1hLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItcHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1zYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXRuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hei5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLWJkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS1jaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZHYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWF1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tY2EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1nYi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWllLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLW56LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tc2cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLWRvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtbXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy11cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9maWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2Z5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWRldmEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nb20tbGF0bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2d1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oaS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oeS1hbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC1jaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvamEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9qdi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2thLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva28uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS1rbXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbGIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21pLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy1teS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9teS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25iLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC1iZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9vYy1sbmMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wYS1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3BsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQtYnIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3JvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcnUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2kuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci1jeXJsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGV0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGwtcGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bS1sYXRuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWctY24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXotbGF0bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3V6LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdmkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS94LXBzZXVkby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3lvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtY24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1oay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLW1vLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtdHcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS8gc3luYyBeXFwuXFwvLiokIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL2RlZmxhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvaW5mbGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvc3RyaW5ncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2RlZmxhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9nemhlYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9tZXNzYWdlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3RyZWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvenN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9BbmFseXRpY3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQW5vbnltb3VzVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQ2xvdWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQ29yZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQ3J5cHRvQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9FdmVudEVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvRXZlbnR1YWxseVF1ZXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0ZhY2Vib29rVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvSW5zdGFsbGF0aW9uQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9MaXZlUXVlcnlDbGllbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvTGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5kZWZhdWx0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvT2JqZWN0U3RhdGVNdXRhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvT2ZmbGluZVF1ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlQUNMLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlQ0xQLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlQ29uZmlnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlRXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VGaWxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlR2VvUG9pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VIb29rcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUluc3RhbGxhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUxpdmVRdWVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZU9wLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlUG9seWdvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVF1ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlUmVsYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VSb2xlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlU2NoZW1hLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlU2Vzc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVVzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUHVzaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9SRVNUQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TaW5nbGVJbnN0YW5jZVN0YXRlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Tb2NrZXQud2VhcHAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TdG9yYWdlQ29udHJvbGxlci5icm93c2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1N0b3JhZ2VDb250cm9sbGVyLndlYXBwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1Rhc2tRdWV1ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9VbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9XZWJTb2NrZXRDb250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1hoci53ZWFwcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9hcnJheUNvbnRhaW5zT2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2NhbkJlU2VyaWFsaXplZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9kZWNvZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvZW5jb2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2VxdWFscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9lc2NhcGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvaXNSZXZvY2FibGVTZXNzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL3BhcnNlRGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9wcm9taXNlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvdW5pcXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL3Vuc2F2ZWRDaGlsZHJlbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci91dWlkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkRvY3VtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkRvY3VtZW50T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZFbWJlZGRlZEZpbGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGRW1iZWRkZWRQYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkZvbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGSW1hZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGSmF2YVNjcmlwdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZQYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERlBhZ2VPcHRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1N0YW5kYXJkRm9udHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvY29sb3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkJ1dHRvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkNoZWNrQm94LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGRHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZGaWVsZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkZvcm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZPcHRpb25MaXN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGUmFkaW9Hcm91cC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERlNpZ25hdHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERlRleHRGaWVsZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL2FwcGVhcmFuY2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvaW1hZ2UvYWxpZ25tZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2ltYWdlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL29iamVjdHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvb3BlcmF0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9vcGVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvcm90YXRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL3NpemVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL3N2Z1BhdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvdGV4dC9hbGlnbm1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvdGV4dC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS90ZXh0L2xheW91dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvUERGQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvUERGT2JqZWN0Q29waWVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvQnV0dG9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvQ2hlY2tCb3guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9DaG9pY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9Db21ib0JveC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0ZpZWxkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvRm9ybS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0xpc3RCb3guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9Ob25UZXJtaW5hbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1B1c2hCdXR0b24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9SYWRpb0J1dHRvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1NpZ25hdHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1Rlcm1pbmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvVGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9BcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hbm5vdGF0aW9uL0JvcmRlclN0eWxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hbm5vdGF0aW9uL1BERkFubm90YXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fubm90YXRpb24vUERGV2lkZ2V0QW5ub3RhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9mbGFncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZG9jdW1lbnQvUERGQ3Jvc3NSZWZTZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9kb2N1bWVudC9QREZIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2RvY3VtZW50L1BERlRyYWlsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2RvY3VtZW50L1BERlRyYWlsZXJEaWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvQ01hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0N1c3RvbUZvbnRFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0N1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0ZpbGVFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0ZvbnRGbGFncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0phdmFTY3JpcHRFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0pwZWdFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL1BERlBhZ2VFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL1BuZ0VtYmVkZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvU3RhbmRhcmRGb250RW1iZWRkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2ludGVyYWN0aXZlL1ZpZXdlclByZWZlcmVuY2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERkFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERkJvb2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGRGljdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZIZXhTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGSW52YWxpZE9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZOYW1lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERk51bGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGTnVtYmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERk9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZSYXdTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGUmVmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERlN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29wZXJhdG9ycy9QREZPcGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb3BlcmF0b3JzL1BERk9wZXJhdG9yTmFtZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3BhcnNlci9CYXNlUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9wYXJzZXIvQnl0ZVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERk9iamVjdFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERk9iamVjdFN0cmVhbVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERlBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERlhSZWZTdHJlYW1QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvQXNjaWk4NVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9Bc2NpaUhleFN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9EZWNvZGVTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvRmxhdGVTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvTFpXU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJlYW1zL1J1bkxlbmd0aFN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9TdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvZGVjb2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJ1Y3R1cmVzL1BERkNhdGFsb2cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGQ29udGVudFN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZDcm9zc1JlZlN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZGbGF0ZVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZPYmplY3RTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGUGFnZUxlYWYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGUGFnZVRyZWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9DaGFyQ29kZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9EZWxpbWl0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvSXJyZWd1bGFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvS2V5d29yZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9OdW1lcmljLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvV2hpdGVzcGFjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvd3JpdGVycy9QREZTdHJlYW1Xcml0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3dyaXRlcnMvUERGV3JpdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy90eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL0NhY2hlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvYXJyYXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvYXN5bmMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9iYXNlNjQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9lcnJvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL251bWJlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9vYmplY3RzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvcGRmRG9jRW5jb2RpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9wbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9ybmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9zdHJpbmdzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvdW5pY29kZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL3ZhbGlkYXRvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3ByaW50LWpzL2Rpc3QvcHJpbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvaGFzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZS1yZXNpemFibGUvbGliL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlLXJlc2l6YWJsZS9saWIvcmVzaXplci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1jbGllbnRzaWRlLWVmZmVjdC9saWIvaW5kZXguZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtY29uZmV0dGkvZGlzdC9yZWFjdC1jb25mZXR0aS5taW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9kaXN0L3JlYWN0LWRhdGVwaWNrZXIubWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy9EcmFnZ2FibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy9EcmFnZ2FibGVDb3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvY2pzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvdXRpbHMvZG9tRm5zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvdXRpbHMvZ2V0UHJlZml4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvdXRpbHMvbG9nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvdXRpbHMvcG9zaXRpb25GbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy91dGlscy9zaGltcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvbm9kZV9tb2R1bGVzL2Nsc3gvZGlzdC9jbHN4Lm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZmFzdC1jb21wYXJlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvQXV0b0ZvY3VzSW5zaWRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvQ29tYmluYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9Gb2N1c0d1YXJkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvRnJlZUZvY3VzSW5zaWRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvTG9jay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L01vdmVGb2N1c0luc2lkZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L1RyYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9VSS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvbWVkaXVtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvbmFuby1ldmVudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9zY29wZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3VzZS1mb2N1cy1zY29wZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3VzZS1mb2N1cy1zdGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaGVsbWV0L2VzL0hlbG1ldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1vbmNsaWNrb3V0c2lkZS9kaXN0L3JlYWN0LW9uY2xpY2tvdXRzaWRlLmVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwtYmFyL2Rpc3QvZXMyMDE1L2NvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsLWJhci9kaXN0L2VzMjAxNS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXIvZGlzdC9lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXIvZGlzdC9lczIwMTUvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9Db21iaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L1NpZGVFZmZlY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9VSS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L2FnZ3Jlc2l2ZUNhcHR1cmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9oYW5kbGVTY3JvbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9tZWRpdW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9zaWRlY2FyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJuZC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc2Nyb2xsYmFycy1jdXN0b20vZGlzdC9yc2MuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXNpZGUtZWZmZWN0L2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1zaWduYXR1cmUtY2FudmFzL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXN0eWxlLXNpbmdsZXRvbi9kaXN0L2VzMjAxNS9jb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc3R5bGUtc2luZ2xldG9uL2Rpc3QvZXMyMDE1L2hvb2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc3R5bGUtc2luZ2xldG9uL2Rpc3QvZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXN0eWxlLXNpbmdsZXRvbi9kaXN0L2VzMjAxNS9zaW5nbGV0b24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC9qc3gtcnVudGltZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9kaXN0L3JlYWN0b3VyLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvY2xhc3NuYW1lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3RvdXIvbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVnZXgtcGFyc2VyL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3QvYW5jaG9yU2Nyb2xsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Njcm9sbC1zbW9vdGgvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3Qvb2JzZXJ2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3Qvc2Nyb2xsU21vb3RoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Njcm9sbC1zbW9vdGgvZGlzdC90b29scy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGxwYXJlbnQvc2Nyb2xscGFyZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvZGlzdC9yZWFjdC1kYXRlcGlja2VyLmNzcz8zZjQzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2luZGV4LmNzcz8wNTM4Iiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3N0eWxlcy9vcGVuc2lnbmRyaXZlLmNzcz82M2QwIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3N0eWxlcy9zaWduYXR1cmUuY3NzP2M2M2MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZWQtY29tcG9uZW50cy9kaXN0L3N0eWxlZC1jb21wb25lbnRzLmJyb3dzZXIuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlZC1jb21wb25lbnRzL25vZGVfbW9kdWxlcy9AZW1vdGlvbi91bml0bGVzcy9kaXN0L3VuaXRsZXNzLmJyb3dzZXIuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlZC1jb21wb25lbnRzL25vZGVfbW9kdWxlcy9tZW1vaXplLW9uZS9kaXN0L21lbW9pemUtb25lLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZWQtY29tcG9uZW50cy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlZC1jb21wb25lbnRzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZWQtY29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3R5bGlzLXJ1bGUtc2hlZXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGVkLWNvbXBvbmVudHMvbm9kZV9tb2R1bGVzL3N0eWxpcy9zdHlsaXMubWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3RhYmJhYmxlL2Rpc3QvaW5kZXguZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3RyaW0tY2FudmFzL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1jYWxsYmFjay1yZWYvZGlzdC9lczIwMTUvYXNzaWduUmVmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1jYWxsYmFjay1yZWYvZGlzdC9lczIwMTUvdXNlTWVyZ2VSZWYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLWNhbGxiYWNrLXJlZi9kaXN0L2VzMjAxNS91c2VSZWYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLXNpZGVjYXIvZGlzdC9lczIwMTUvZXhwb3J0cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91c2Utc2lkZWNhci9kaXN0L2VzMjAxNS9tZWRpdW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXdpdGgtc2VsZWN0b3IuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvd2l0aC1zZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9tYXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL25hdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9uaWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvcGFyc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvcm5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3NoYTEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3YxLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3YxVG9WNi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92My5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92MzUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjZUb1YxLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3Y3LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdm9pZC1lbGVtZW50cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy93YXJuaW5nL3dhcm5pbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvd3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy96b29tLWxldmVsL2Rpc3Qvem9vbS1sZXZlbC5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvaWdub3JlZHxEOlxcb2ZmaWNlQXBwbGljYXRpb25zXFxPcGVuLXNpZ25cXHVwZGF0ZUhpZ2hSZXNvbHV0aW9uXFxPcGVuU2lnblxcYXBwc1xcT3BlblNpZ25cXG5vZGVfbW9kdWxlc1xcY3J5cHRvLWpzfGNyeXB0byIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2JpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZXZlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zcGxpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvbnVtYmVyL2lzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2NyZWF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9mcmVlemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3BhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXQtaW50ZXJ2YWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXQtdGltZW91dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3dlYWstbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy90b1ByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvdG9Qcm9wZXJ0eUtleS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvdHlwZW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9hY3R1YWwvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvYWN0dWFsL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvYWN0dWFsL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvYWN0dWFsL3N5bWJvbC90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L2lzLWFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2V2ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9maW5kLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvcmVkdWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL3NsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL3NvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvc3BsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvZnVuY3Rpb24vdmlydHVhbC9iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2V2ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2ZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2luY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL3NsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9zb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9zcGxpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL3N0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9qc29uL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvbWFwL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2NyZWF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9mcmVlemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvcGFyc2UtaW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9zZXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3N0cmluZy92aXJ0dWFsL2luY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9zdHJpbmcvdmlydHVhbC9zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvc3ltYm9sL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9zeW1ib2wvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3N5bWJvbC90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3dlYWstbWFwL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mZWF0dXJlcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mZWF0dXJlcy9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZmVhdHVyZXMvc3ltYm9sL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZnVsbC9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mdWxsL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZnVsbC9zeW1ib2wvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2Z1bGwvc3ltYm9sL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2EtY2FsbGFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hLXNldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLW5vbi1leHRlbnNpYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1zb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jYWxsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RhdGUtdG8taXNvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kb20taXRlcmFibGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2VuZ2luZS1pcy1idW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbmdpbmUtaXMtZGVuby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2VuZ2luZS1pcy1pZS1vci1lZGdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy1wZWJibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2V4cG9ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2ZhaWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnJlZXppbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi1hcHBseS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWFjY2Vzc29yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLWRpcmVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtanNvbi1yZXBsYWNlci1mdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtc2V0LXJlY29yZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL21hcC1oZWxwZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbWF0aC10cnVuYy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wYXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3F1ZXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2FmZS1nZXQtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zY2hlZHVsZXJzLWZpeC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1jbG9uZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1kaWZmZXJlbmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaW50ZXJzZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWlzLWRpc2pvaW50LWZyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaXMtc3Vic2V0LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWlzLXN1cGVyc2V0LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWl0ZXJhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1zaXplLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtc3ltbWV0cmljLWRpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC11bmlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N0cmluZy1wYWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zdHJpbmctcmVwZWF0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3ltYm9sLWRlZmluZS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zeW1ib2wtaXMtcmVnaXN0ZXJlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N5bWJvbC1pcy13ZWxsLWtub3duLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3ltYm9sLXJlZ2lzdHJ5LWRldGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Rhc2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3dlYWstbWFwLWJhc2ljLWRldGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLXdyYXBwZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmV2ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5maW5kLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmZpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LnNsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmRhdGUudG8tanNvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5kYXRlLnRvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmpzb24udG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5tYXAuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMubWFwLmdyb3VwLWJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmZyZWV6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmFueS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmNhdGNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5yYWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UucmVqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UucmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLndpdGgtcmVzb2x2ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnJlZmxlY3QudG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LmRpZmZlcmVuY2UudjIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LmludGVyc2VjdGlvbi52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuaXMtZGlzam9pbnQtZnJvbS52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuaXMtc3Vic2V0LW9mLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5pcy1zdXBlcnNldC1vZi52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LnN5bW1ldHJpYy1kaWZmZXJlbmNlLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC51bmlvbi52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuZm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5oYXMtaW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmlzLWNvbmNhdC1zcHJlYWRhYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmtleS1mb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLWFsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLnJlcGxhY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuc3BsaXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wudW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMud2Vhay1tYXAuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMud2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LmZ1bmN0aW9uLm1ldGFkYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuYXN5bmMtZGlzcG9zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLmN1c3RvbS1tYXRjaGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuZGlzcG9zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXJlZ2lzdGVyZWQtc3ltYm9sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtcmVnaXN0ZXJlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXdlbGwta25vd24tc3ltYm9sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtd2VsbC1rbm93bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLm1hdGNoZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5tZXRhZGF0YS1rZXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5wYXR0ZXJuLW1hdGNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucmVwbGFjZS1hbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL3dlYi5zZXQtaW50ZXJ2YWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvd2ViLnNldC10aW1lb3V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL3dlYi50aW1lcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS9mcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS92aXJ0dWFsL2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS92aXJ0dWFsL2Zvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvdmlydHVhbC9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvdmlydHVhbC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvY29uY2F0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2V2ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmlsdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmluZC1pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvcmVkdWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc3BsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9qc29uL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL21hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL251bWJlci9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZnJlZXplLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvc2V0LWludGVydmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvc2V0LXRpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zZXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zeW1ib2wvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zeW1ib2wvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvd2Vhay1tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1ByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1Byb3BlcnR5S2V5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvY29yZS9kaXN0L2Zsb2F0aW5nLXVpLmNvcmUubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9kb20vZGlzdC9mbG9hdGluZy11aS5kb20ubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9yZWFjdC1kb20vZGlzdC9mbG9hdGluZy11aS5yZWFjdC1kb20ubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9yZWFjdC9kaXN0L2Zsb2F0aW5nLXVpLnJlYWN0LnV0aWxzLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvdXRpbHMvZGlzdC9mbG9hdGluZy11aS51dGlscy5kb20ubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS91dGlscy9kaXN0L2Zsb2F0aW5nLXVpLnV0aWxzLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtYXJyb3cvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWFycm93L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1hcnJvdy9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtYXJyb3cvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1zbG90L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcHJpbWl0aXZlL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29udGV4dC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZHJvcGRvd24tbWVudS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWlkL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3Qtc2xvdC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZHJvcGRvd24tbWVudS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWYvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWRyb3Bkb3duLW1lbnUvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtY29udHJvbGxhYmxlLXN0YXRlL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3QvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWZvY3VzLWd1YXJkcy9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZm9jdXMtc2NvcGUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWZvY3VzLXNjb3BlL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1mb2N1cy1zY29wZS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZm9jdXMtc2NvcGUvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1zbG90L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1mb2N1cy1zY29wZS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWYvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LW1lbnUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LW1lbnUvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9wcmltaXRpdmUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LW1lbnUvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1jb2xsZWN0aW9uL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1tZW51L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1tZW51L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29udGV4dC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtbWVudS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWRpcmVjdGlvbi9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtbWVudS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWRpc21pc3NhYmxlLWxheWVyL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1tZW51L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtaWQvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LW1lbnUvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wb3J0YWwvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LW1lbnUvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wcmVzZW5jZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtbWVudS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtbWVudS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXJvdmluZy1mb2N1cy9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtbWVudS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXNsb3QvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LW1lbnUvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1tZW51L25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWNvbnRyb2xsYWJsZS1zdGF0ZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtbWVudS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1lc2NhcGUta2V5ZG93bi9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtbWVudS9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1sYXlvdXQtZWZmZWN0L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wb3BwZXIvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXBvcHBlci9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmcy9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtcG9wcGVyL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29udGV4dC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtcG9wcGVyL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wb3BwZXIvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1zbG90L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wb3BwZXIvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wb3BwZXIvbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtbGF5b3V0LWVmZmVjdC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLXNpemUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1zaXplL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3QvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvQXNhcFF1ZXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvYXNhcC9kaXN0L1Jhd1Rhc2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvVGFza0ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvYXNhcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9tYWtlUmVxdWVzdENhbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9pbnZhcmlhbnQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVkdXhqcy90b29sa2l0L2Rpc3QvcmVkdXgtdG9vbGtpdC5tb2Rlcm4ubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy9hZGFwdGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMvZmV0Y2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvc0Vycm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zSGVhZGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3RyYW5zZm9ybURhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2Vudi9kYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2JpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tcG9zZVNpZ25hbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0Fic29sdXRlVVJMLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbnVsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VQcm90b2NvbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wcm9ncmVzc0V2ZW50UmVkdWNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9yZXNvbHZlQ29uZmlnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwcmVhZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90aHJvdHRsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b0Zvcm1EYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3RvVVJMRW5jb2RlZEZvcm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdHJhY2tTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2NsYXNzZXMvQmxvYi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9jbGFzc2VzL0Zvcm1EYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2NsYXNzZXMvVVJMU2VhcmNoUGFyYW1zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9jb21tb24vdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jbHN4L2Rpc3QvY2xzeC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGVxdWFsL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9iZWdpbkRyYWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2Ryb3AuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2VuZERyYWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2hvdmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvbG9jYWwvc2V0Q2xpZW50T2Zmc2V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9wdWJsaXNoRHJhZ1NvdXJjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL3JlZ2lzdHJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvY2xhc3Nlcy9EcmFnRHJvcE1hbmFnZXJJbXBsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvY2xhc3Nlcy9EcmFnRHJvcE1vbml0b3JJbXBsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvY2xhc3Nlcy9IYW5kbGVyUmVnaXN0cnlJbXBsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvY29udHJhY3RzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvY3JlYXRlRHJhZ0Ryb3BNYW5hZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvaW50ZXJmYWNlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL2RpcnR5SGFuZGxlcklkcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL2RyYWdPZmZzZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9yZWR1Y2Vycy9kcmFnT3BlcmF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvcmVkdWNlcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9yZWR1Y2Vycy9yZWZDb3VudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL3N0YXRlSWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC91dGlscy9jb29yZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC91dGlscy9kaXJ0aW5lc3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC91dGlscy9lcXVhbGl0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL2dldE5leHRVbmlxdWVJZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL2pzX3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvdXRpbHMvbWF0Y2hlc1R5cGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaWRiLWtleXZhbC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ltbWVyL2Rpc3QvaW1tZXIubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21ha2UtY2FuY2VsbGFibGUtcHJvbWlzZS9kaXN0L2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tYWtlLWV2ZW50LXByb3BzL2Rpc3QvZXNtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21lcmdlLXJlZnMvZGlzdC9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmanMtZGlzdC9idWlsZC9wZGYubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvQnJvd3NlckRldGVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvRW50ZXJMZWF2ZUNvdW50ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9IVE1MNUJhY2tlbmRJbXBsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvTW9ub3RvbmljSW50ZXJwb2xhbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9OYXRpdmVEcmFnU291cmNlcy9OYXRpdmVEcmFnU291cmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvTmF0aXZlRHJhZ1NvdXJjZXMvZ2V0RGF0YUZyb21EYXRhVHJhbnNmZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9OYXRpdmVEcmFnU291cmNlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L05hdGl2ZURyYWdTb3VyY2VzL25hdGl2ZVR5cGVzQ29uZmlnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvTmF0aXZlVHlwZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9PZmZzZXRVdGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L09wdGlvbnNSZWFkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9nZXRFbXB0eUltYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC91dGlscy9qc191dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQvZGlzdC9jb3JlL0RuZENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kL2Rpc3QvY29yZS9EbmRQcm92aWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvSTE4bmV4dFByb3ZpZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9UcmFucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvVHJhbnNXaXRob3V0Q29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvVHJhbnNsYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL2NvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL2RlZmF1bHRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9pMThuSW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9pbml0UmVhY3RJMThuZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy91bmVzY2FwZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvdXNlU1NSLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy91c2VUcmFuc2xhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL3dpdGhTU1IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL3dpdGhUcmFuc2xhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vRG9jdW1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL0RvY3VtZW50Q29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vTGlua1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL01lc3NhZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1BhZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1BhZ2VDb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9QYWdlL0Fubm90YXRpb25MYXllci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vUGFnZS9DYW52YXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1BhZ2UvVGV4dExheWVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9QYXNzd29yZFJlc3BvbnNlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vU3RydWN0VHJlZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vU3RydWN0VHJlZUl0ZW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC9ob29rcy91c2VEb2N1bWVudENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC9ob29rcy91c2VQYWdlQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vc2hhcmVkL2hvb2tzL3VzZVJlc29sdmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9zaGFyZWQvc3RydWN0VHJlZVV0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9zaGFyZWQvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZGlzdC9yZWFjdC1yZWR1eC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVkdXgtdGh1bmsvZGlzdC9yZWR1eC10aHVuay5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVkdXgvZGlzdC9yZWR1eC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVzZWxlY3QvZGlzdC9yZXNlbGVjdC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc2lnbmF0dXJlX3BhZC9kaXN0L3NpZ25hdHVyZV9wYWQubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3RpbnktaW52YXJpYW50L2Rpc3QvZXNtL3RpbnktaW52YXJpYW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2NyZWF0ZSBmYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3NjcmlwdC9QdWJsaWNUZW1wbGF0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlB1YmxpY1RlbXBsYXRlXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlB1YmxpY1RlbXBsYXRlXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlB1YmxpY1RlbXBsYXRlXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsImltcG9ydCBtZW1vaXplIGZyb20gJ0BlbW90aW9uL21lbW9pemUnO1xuXG52YXIgcmVhY3RQcm9wc1JlZ2V4ID0gL14oKGNoaWxkcmVufGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MfGtleXxyZWZ8YXV0b0ZvY3VzfGRlZmF1bHRWYWx1ZXxkZWZhdWx0Q2hlY2tlZHxpbm5lckhUTUx8c3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nfHN1cHByZXNzSHlkcmF0aW9uV2FybmluZ3x2YWx1ZUxpbmt8YWNjZXB0fGFjY2VwdENoYXJzZXR8YWNjZXNzS2V5fGFjdGlvbnxhbGxvd3xhbGxvd1VzZXJNZWRpYXxhbGxvd1BheW1lbnRSZXF1ZXN0fGFsbG93RnVsbFNjcmVlbnxhbGxvd1RyYW5zcGFyZW5jeXxhbHR8YXN5bmN8YXV0b0NvbXBsZXRlfGF1dG9QbGF5fGNhcHR1cmV8Y2VsbFBhZGRpbmd8Y2VsbFNwYWNpbmd8Y2hhbGxlbmdlfGNoYXJTZXR8Y2hlY2tlZHxjaXRlfGNsYXNzSUR8Y2xhc3NOYW1lfGNvbHN8Y29sU3Bhbnxjb250ZW50fGNvbnRlbnRFZGl0YWJsZXxjb250ZXh0TWVudXxjb250cm9sc3xjb250cm9sc0xpc3R8Y29vcmRzfGNyb3NzT3JpZ2lufGRhdGF8ZGF0ZVRpbWV8ZGVjb2Rpbmd8ZGVmYXVsdHxkZWZlcnxkaXJ8ZGlzYWJsZWR8ZGlzYWJsZVBpY3R1cmVJblBpY3R1cmV8ZG93bmxvYWR8ZHJhZ2dhYmxlfGVuY1R5cGV8Zm9ybXxmb3JtQWN0aW9ufGZvcm1FbmNUeXBlfGZvcm1NZXRob2R8Zm9ybU5vVmFsaWRhdGV8Zm9ybVRhcmdldHxmcmFtZUJvcmRlcnxoZWFkZXJzfGhlaWdodHxoaWRkZW58aGlnaHxocmVmfGhyZWZMYW5nfGh0bWxGb3J8aHR0cEVxdWl2fGlkfGlucHV0TW9kZXxpbnRlZ3JpdHl8aXN8a2V5UGFyYW1zfGtleVR5cGV8a2luZHxsYWJlbHxsYW5nfGxpc3R8bG9hZGluZ3xsb29wfGxvd3xtYXJnaW5IZWlnaHR8bWFyZ2luV2lkdGh8bWF4fG1heExlbmd0aHxtZWRpYXxtZWRpYUdyb3VwfG1ldGhvZHxtaW58bWluTGVuZ3RofG11bHRpcGxlfG11dGVkfG5hbWV8bm9uY2V8bm9WYWxpZGF0ZXxvcGVufG9wdGltdW18cGF0dGVybnxwbGFjZWhvbGRlcnxwbGF5c0lubGluZXxwb3N0ZXJ8cHJlbG9hZHxwcm9maWxlfHJhZGlvR3JvdXB8cmVhZE9ubHl8cmVmZXJyZXJQb2xpY3l8cmVsfHJlcXVpcmVkfHJldmVyc2VkfHJvbGV8cm93c3xyb3dTcGFufHNhbmRib3h8c2NvcGV8c2NvcGVkfHNjcm9sbGluZ3xzZWFtbGVzc3xzZWxlY3RlZHxzaGFwZXxzaXplfHNpemVzfHNsb3R8c3BhbnxzcGVsbENoZWNrfHNyY3xzcmNEb2N8c3JjTGFuZ3xzcmNTZXR8c3RhcnR8c3RlcHxzdHlsZXxzdW1tYXJ5fHRhYkluZGV4fHRhcmdldHx0aXRsZXx0eXBlfHVzZU1hcHx2YWx1ZXx3aWR0aHx3bW9kZXx3cmFwfGFib3V0fGRhdGF0eXBlfGlubGlzdHxwcmVmaXh8cHJvcGVydHl8cmVzb3VyY2V8dHlwZW9mfHZvY2FifGF1dG9DYXBpdGFsaXplfGF1dG9Db3JyZWN0fGF1dG9TYXZlfGNvbG9yfGluZXJ0fGl0ZW1Qcm9wfGl0ZW1TY29wZXxpdGVtVHlwZXxpdGVtSUR8aXRlbVJlZnxvbnxyZXN1bHRzfHNlY3VyaXR5fHVuc2VsZWN0YWJsZXxhY2NlbnRIZWlnaHR8YWNjdW11bGF0ZXxhZGRpdGl2ZXxhbGlnbm1lbnRCYXNlbGluZXxhbGxvd1Jlb3JkZXJ8YWxwaGFiZXRpY3xhbXBsaXR1ZGV8YXJhYmljRm9ybXxhc2NlbnR8YXR0cmlidXRlTmFtZXxhdHRyaWJ1dGVUeXBlfGF1dG9SZXZlcnNlfGF6aW11dGh8YmFzZUZyZXF1ZW5jeXxiYXNlbGluZVNoaWZ0fGJhc2VQcm9maWxlfGJib3h8YmVnaW58Ymlhc3xieXxjYWxjTW9kZXxjYXBIZWlnaHR8Y2xpcHxjbGlwUGF0aFVuaXRzfGNsaXBQYXRofGNsaXBSdWxlfGNvbG9ySW50ZXJwb2xhdGlvbnxjb2xvckludGVycG9sYXRpb25GaWx0ZXJzfGNvbG9yUHJvZmlsZXxjb2xvclJlbmRlcmluZ3xjb250ZW50U2NyaXB0VHlwZXxjb250ZW50U3R5bGVUeXBlfGN1cnNvcnxjeHxjeXxkfGRlY2VsZXJhdGV8ZGVzY2VudHxkaWZmdXNlQ29uc3RhbnR8ZGlyZWN0aW9ufGRpc3BsYXl8ZGl2aXNvcnxkb21pbmFudEJhc2VsaW5lfGR1cnxkeHxkeXxlZGdlTW9kZXxlbGV2YXRpb258ZW5hYmxlQmFja2dyb3VuZHxlbmR8ZXhwb25lbnR8ZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZHxmaWxsfGZpbGxPcGFjaXR5fGZpbGxSdWxlfGZpbHRlcnxmaWx0ZXJSZXN8ZmlsdGVyVW5pdHN8Zmxvb2RDb2xvcnxmbG9vZE9wYWNpdHl8Zm9jdXNhYmxlfGZvbnRGYW1pbHl8Zm9udFNpemV8Zm9udFNpemVBZGp1c3R8Zm9udFN0cmV0Y2h8Zm9udFN0eWxlfGZvbnRWYXJpYW50fGZvbnRXZWlnaHR8Zm9ybWF0fGZyb218ZnJ8Znh8Znl8ZzF8ZzJ8Z2x5cGhOYW1lfGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsfGdseXBoT3JpZW50YXRpb25WZXJ0aWNhbHxnbHlwaFJlZnxncmFkaWVudFRyYW5zZm9ybXxncmFkaWVudFVuaXRzfGhhbmdpbmd8aG9yaXpBZHZYfGhvcml6T3JpZ2luWHxpZGVvZ3JhcGhpY3xpbWFnZVJlbmRlcmluZ3xpbnxpbjJ8aW50ZXJjZXB0fGt8azF8azJ8azN8azR8a2VybmVsTWF0cml4fGtlcm5lbFVuaXRMZW5ndGh8a2VybmluZ3xrZXlQb2ludHN8a2V5U3BsaW5lc3xrZXlUaW1lc3xsZW5ndGhBZGp1c3R8bGV0dGVyU3BhY2luZ3xsaWdodGluZ0NvbG9yfGxpbWl0aW5nQ29uZUFuZ2xlfGxvY2FsfG1hcmtlckVuZHxtYXJrZXJNaWR8bWFya2VyU3RhcnR8bWFya2VySGVpZ2h0fG1hcmtlclVuaXRzfG1hcmtlcldpZHRofG1hc2t8bWFza0NvbnRlbnRVbml0c3xtYXNrVW5pdHN8bWF0aGVtYXRpY2FsfG1vZGV8bnVtT2N0YXZlc3xvZmZzZXR8b3BhY2l0eXxvcGVyYXRvcnxvcmRlcnxvcmllbnR8b3JpZW50YXRpb258b3JpZ2lufG92ZXJmbG93fG92ZXJsaW5lUG9zaXRpb258b3ZlcmxpbmVUaGlja25lc3N8cGFub3NlMXxwYWludE9yZGVyfHBhdGhMZW5ndGh8cGF0dGVybkNvbnRlbnRVbml0c3xwYXR0ZXJuVHJhbnNmb3JtfHBhdHRlcm5Vbml0c3xwb2ludGVyRXZlbnRzfHBvaW50c3xwb2ludHNBdFh8cG9pbnRzQXRZfHBvaW50c0F0WnxwcmVzZXJ2ZUFscGhhfHByZXNlcnZlQXNwZWN0UmF0aW98cHJpbWl0aXZlVW5pdHN8cnxyYWRpdXN8cmVmWHxyZWZZfHJlbmRlcmluZ0ludGVudHxyZXBlYXRDb3VudHxyZXBlYXREdXJ8cmVxdWlyZWRFeHRlbnNpb25zfHJlcXVpcmVkRmVhdHVyZXN8cmVzdGFydHxyZXN1bHR8cm90YXRlfHJ4fHJ5fHNjYWxlfHNlZWR8c2hhcGVSZW5kZXJpbmd8c2xvcGV8c3BhY2luZ3xzcGVjdWxhckNvbnN0YW50fHNwZWN1bGFyRXhwb25lbnR8c3BlZWR8c3ByZWFkTWV0aG9kfHN0YXJ0T2Zmc2V0fHN0ZERldmlhdGlvbnxzdGVtaHxzdGVtdnxzdGl0Y2hUaWxlc3xzdG9wQ29sb3J8c3RvcE9wYWNpdHl8c3RyaWtldGhyb3VnaFBvc2l0aW9ufHN0cmlrZXRocm91Z2hUaGlja25lc3N8c3RyaW5nfHN0cm9rZXxzdHJva2VEYXNoYXJyYXl8c3Ryb2tlRGFzaG9mZnNldHxzdHJva2VMaW5lY2FwfHN0cm9rZUxpbmVqb2lufHN0cm9rZU1pdGVybGltaXR8c3Ryb2tlT3BhY2l0eXxzdHJva2VXaWR0aHxzdXJmYWNlU2NhbGV8c3lzdGVtTGFuZ3VhZ2V8dGFibGVWYWx1ZXN8dGFyZ2V0WHx0YXJnZXRZfHRleHRBbmNob3J8dGV4dERlY29yYXRpb258dGV4dFJlbmRlcmluZ3x0ZXh0TGVuZ3RofHRvfHRyYW5zZm9ybXx1MXx1Mnx1bmRlcmxpbmVQb3NpdGlvbnx1bmRlcmxpbmVUaGlja25lc3N8dW5pY29kZXx1bmljb2RlQmlkaXx1bmljb2RlUmFuZ2V8dW5pdHNQZXJFbXx2QWxwaGFiZXRpY3x2SGFuZ2luZ3x2SWRlb2dyYXBoaWN8dk1hdGhlbWF0aWNhbHx2YWx1ZXN8dmVjdG9yRWZmZWN0fHZlcnNpb258dmVydEFkdll8dmVydE9yaWdpblh8dmVydE9yaWdpbll8dmlld0JveHx2aWV3VGFyZ2V0fHZpc2liaWxpdHl8d2lkdGhzfHdvcmRTcGFjaW5nfHdyaXRpbmdNb2RlfHh8eEhlaWdodHx4MXx4Mnx4Q2hhbm5lbFNlbGVjdG9yfHhsaW5rQWN0dWF0ZXx4bGlua0FyY3JvbGV8eGxpbmtIcmVmfHhsaW5rUm9sZXx4bGlua1Nob3d8eGxpbmtUaXRsZXx4bGlua1R5cGV8eG1sQmFzZXx4bWxuc3x4bWxuc1hsaW5rfHhtbExhbmd8eG1sU3BhY2V8eXx5MXx5Mnx5Q2hhbm5lbFNlbGVjdG9yfHp8em9vbUFuZFBhbnxmb3J8Y2xhc3N8YXV0b2ZvY3VzKXwoKFtEZF1bQWFdW1R0XVtBYV18W0FhXVtScl1bSWldW0FhXXx4KS0uKikpJC87IC8vIGh0dHBzOi8vZXNiZW5jaC5jb20vYmVuY2gvNWJmZWU2OGE0Y2Q3ZTYwMDllZjYxZDIzXG5cbnZhciBpbmRleCA9IG1lbW9pemUoZnVuY3Rpb24gKHByb3ApIHtcbiAgcmV0dXJuIHJlYWN0UHJvcHNSZWdleC50ZXN0KHByb3ApIHx8IHByb3AuY2hhckNvZGVBdCgwKSA9PT0gMTExXG4gIC8qIG8gKi9cbiAgJiYgcHJvcC5jaGFyQ29kZUF0KDEpID09PSAxMTBcbiAgLyogbiAqL1xuICAmJiBwcm9wLmNoYXJDb2RlQXQoMikgPCA5MTtcbn1cbi8qIForMSAqL1xuKTtcblxuZXhwb3J0IGRlZmF1bHQgaW5kZXg7XG4iLCJmdW5jdGlvbiBtZW1vaXplKGZuKSB7XG4gIHZhciBjYWNoZSA9IHt9O1xuICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgIGlmIChjYWNoZVthcmddID09PSB1bmRlZmluZWQpIGNhY2hlW2FyZ10gPSBmbihhcmcpO1xuICAgIHJldHVybiBjYWNoZVthcmddO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZW1vaXplO1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0LCB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHN0b3BFdmVudCwgZ2V0RG9jdW1lbnQsIGlzTW91c2VMaWtlUG9pbnRlclR5cGUsIGNvbnRhaW5zLCBhY3RpdmVFbGVtZW50LCBpc1NhZmFyaSwgaXNUeXBlYWJsZUNvbWJvYm94LCBpc1ZpcnR1YWxDbGljaywgaXNWaXJ0dWFsUG9pbnRlckV2ZW50LCBnZXRUYXJnZXQsIGdldFBsYXRmb3JtLCBpc1R5cGVhYmxlRWxlbWVudCwgaXNSZWFjdEV2ZW50LCBpc1Jvb3RFbGVtZW50LCBpc0V2ZW50VGFyZ2V0V2l0aGluLCBpc01hYywgZ2V0VXNlckFnZW50IH0gZnJvbSAnQGZsb2F0aW5nLXVpL3JlYWN0L3V0aWxzJztcbmltcG9ydCB7IGZsb29yIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzJztcbmltcG9ydCB7IHBsYXRmb3JtLCBnZXRPdmVyZmxvd0FuY2VzdG9ycywgdXNlRmxvYXRpbmcgYXMgdXNlRmxvYXRpbmckMSwgb2Zmc2V0LCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gJ0BmbG9hdGluZy11aS9yZWFjdC1kb20nO1xuZXhwb3J0IHsgYXJyb3csIGF1dG9QbGFjZW1lbnQsIGF1dG9VcGRhdGUsIGNvbXB1dGVQb3NpdGlvbiwgZGV0ZWN0T3ZlcmZsb3csIGZsaXAsIGdldE92ZXJmbG93QW5jZXN0b3JzLCBoaWRlLCBpbmxpbmUsIGxpbWl0U2hpZnQsIG9mZnNldCwgcGxhdGZvcm0sIHNoaWZ0LCBzaXplIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBpc0VsZW1lbnQsIGdldE5vZGVOYW1lLCBpc0hUTUxFbGVtZW50LCBnZXRXaW5kb3csIGlzTGFzdFRyYXZlcnNhYmxlTm9kZSwgZ2V0UGFyZW50Tm9kZSwgZ2V0Q29tcHV0ZWRTdHlsZSB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscy9kb20nO1xuaW1wb3J0IHsgdGFiYmFibGUsIGlzVGFiYmFibGUgfSBmcm9tICd0YWJiYWJsZSc7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwsIGZsdXNoU3luYyB9IGZyb20gJ3JlYWN0LWRvbSc7XG5cbi8qKlxuICogTWVyZ2VzIGFuIGFycmF5IG9mIHJlZnMgaW50byBhIHNpbmdsZSBtZW1vaXplZCBjYWxsYmFjayByZWYgb3IgYG51bGxgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3JlYWN0LXV0aWxzI3VzZW1lcmdlcmVmc1xuICovXG5mdW5jdGlvbiB1c2VNZXJnZVJlZnMocmVmcykge1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHJlZnMuZXZlcnkocmVmID0+IHJlZiA9PSBudWxsKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSA9PiB7XG4gICAgICByZWZzLmZvckVhY2gocmVmID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZWYodmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgICAgICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIHJlZnMpO1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbXVpL21hdGVyaWFsLXVpL2lzc3Vlcy80MTE5MCNpc3N1ZWNvbW1lbnQtMjA0MDg3MzM3OVxuY29uc3QgU2FmZVJlYWN0ID0ge1xuICAuLi5SZWFjdFxufTtcblxuY29uc3QgdXNlSW5zZXJ0aW9uRWZmZWN0ID0gU2FmZVJlYWN0LnVzZUluc2VydGlvbkVmZmVjdDtcbmNvbnN0IHVzZVNhZmVJbnNlcnRpb25FZmZlY3QgPSB1c2VJbnNlcnRpb25FZmZlY3QgfHwgKGZuID0+IGZuKCkpO1xuZnVuY3Rpb24gdXNlRWZmZWN0RXZlbnQoY2FsbGJhY2spIHtcbiAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKCgpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIGFuIGV2ZW50IGhhbmRsZXIgd2hpbGUgcmVuZGVyaW5nLicpO1xuICAgIH1cbiAgfSk7XG4gIHVzZVNhZmVJbnNlcnRpb25FZmZlY3QoKCkgPT4ge1xuICAgIHJlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG4gIH0pO1xuICByZXR1cm4gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZi5jdXJyZW50ID09IG51bGwgPyB2b2lkIDAgOiByZWYuY3VycmVudCguLi5hcmdzKTtcbiAgfSwgW10pO1xufVxuXG5jb25zdCBBUlJPV19VUCA9ICdBcnJvd1VwJztcbmNvbnN0IEFSUk9XX0RPV04gPSAnQXJyb3dEb3duJztcbmNvbnN0IEFSUk9XX0xFRlQgPSAnQXJyb3dMZWZ0JztcbmNvbnN0IEFSUk9XX1JJR0hUID0gJ0Fycm93UmlnaHQnO1xuZnVuY3Rpb24gaXNEaWZmZXJlbnRSb3coaW5kZXgsIGNvbHMsIHByZXZSb3cpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoaW5kZXggLyBjb2xzKSAhPT0gcHJldlJvdztcbn1cbmZ1bmN0aW9uIGlzSW5kZXhPdXRPZkJvdW5kcyhsaXN0UmVmLCBpbmRleCkge1xuICByZXR1cm4gaW5kZXggPCAwIHx8IGluZGV4ID49IGxpc3RSZWYuY3VycmVudC5sZW5ndGg7XG59XG5mdW5jdGlvbiBnZXRNaW5JbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXMpIHtcbiAgcmV0dXJuIGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICBkaXNhYmxlZEluZGljZXNcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRNYXhJbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXMpIHtcbiAgcmV0dXJuIGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgc3RhcnRpbmdJbmRleDogbGlzdFJlZi5jdXJyZW50Lmxlbmd0aCxcbiAgICBkaXNhYmxlZEluZGljZXNcbiAgfSk7XG59XG5mdW5jdGlvbiBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCBfdGVtcCkge1xuICBsZXQge1xuICAgIHN0YXJ0aW5nSW5kZXggPSAtMSxcbiAgICBkZWNyZW1lbnQgPSBmYWxzZSxcbiAgICBkaXNhYmxlZEluZGljZXMsXG4gICAgYW1vdW50ID0gMVxuICB9ID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA7XG4gIGNvbnN0IGxpc3QgPSBsaXN0UmVmLmN1cnJlbnQ7XG4gIGxldCBpbmRleCA9IHN0YXJ0aW5nSW5kZXg7XG4gIGRvIHtcbiAgICBpbmRleCArPSBkZWNyZW1lbnQgPyAtYW1vdW50IDogYW1vdW50O1xuICB9IHdoaWxlIChpbmRleCA+PSAwICYmIGluZGV4IDw9IGxpc3QubGVuZ3RoIC0gMSAmJiBpc0Rpc2FibGVkKGxpc3QsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpKTtcbiAgcmV0dXJuIGluZGV4O1xufVxuZnVuY3Rpb24gZ2V0R3JpZE5hdmlnYXRlZEluZGV4KGVsZW1lbnRzUmVmLCBfcmVmKSB7XG4gIGxldCB7XG4gICAgZXZlbnQsXG4gICAgb3JpZW50YXRpb24sXG4gICAgbG9vcCxcbiAgICBjb2xzLFxuICAgIGRpc2FibGVkSW5kaWNlcyxcbiAgICBtaW5JbmRleCxcbiAgICBtYXhJbmRleCxcbiAgICBwcmV2SW5kZXgsXG4gICAgc3RvcEV2ZW50OiBzdG9wID0gZmFsc2VcbiAgfSA9IF9yZWY7XG4gIGxldCBuZXh0SW5kZXggPSBwcmV2SW5kZXg7XG4gIGlmIChldmVudC5rZXkgPT09IEFSUk9XX1VQKSB7XG4gICAgc3RvcCAmJiBzdG9wRXZlbnQoZXZlbnQpO1xuICAgIGlmIChwcmV2SW5kZXggPT09IC0xKSB7XG4gICAgICBuZXh0SW5kZXggPSBtYXhJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgc3RhcnRpbmdJbmRleDogbmV4dEluZGV4LFxuICAgICAgICBhbW91bnQ6IGNvbHMsXG4gICAgICAgIGRlY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICB9KTtcbiAgICAgIGlmIChsb29wICYmIChwcmV2SW5kZXggLSBjb2xzIDwgbWluSW5kZXggfHwgbmV4dEluZGV4IDwgMCkpIHtcbiAgICAgICAgY29uc3QgY29sID0gcHJldkluZGV4ICUgY29scztcbiAgICAgICAgY29uc3QgbWF4Q29sID0gbWF4SW5kZXggJSBjb2xzO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtYXhJbmRleCAtIChtYXhDb2wgLSBjb2wpO1xuICAgICAgICBpZiAobWF4Q29sID09PSBjb2wpIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBtYXhJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBtYXhDb2wgPiBjb2wgPyBvZmZzZXQgOiBvZmZzZXQgLSBjb2xzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0luZGV4T3V0T2ZCb3VuZHMoZWxlbWVudHNSZWYsIG5leHRJbmRleCkpIHtcbiAgICAgIG5leHRJbmRleCA9IHByZXZJbmRleDtcbiAgICB9XG4gIH1cbiAgaWYgKGV2ZW50LmtleSA9PT0gQVJST1dfRE9XTikge1xuICAgIHN0b3AgJiYgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICBpZiAocHJldkluZGV4ID09PSAtMSkge1xuICAgICAgbmV4dEluZGV4ID0gbWluSW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCxcbiAgICAgICAgYW1vdW50OiBjb2xzLFxuICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgIH0pO1xuICAgICAgaWYgKGxvb3AgJiYgcHJldkluZGV4ICsgY29scyA+IG1heEluZGV4KSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4ICUgY29scyAtIGNvbHMsXG4gICAgICAgICAgYW1vdW50OiBjb2xzLFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSW5kZXhPdXRPZkJvdW5kcyhlbGVtZW50c1JlZiwgbmV4dEluZGV4KSkge1xuICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbWFpbnMgb24gdGhlIHNhbWUgcm93L2NvbHVtbi5cbiAgaWYgKG9yaWVudGF0aW9uID09PSAnYm90aCcpIHtcbiAgICBjb25zdCBwcmV2Um93ID0gZmxvb3IocHJldkluZGV4IC8gY29scyk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gQVJST1dfUklHSFQpIHtcbiAgICAgIHN0b3AgJiYgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIGlmIChwcmV2SW5kZXggJSBjb2xzICE9PSBjb2xzIC0gMSkge1xuICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChsb29wICYmIGlzRGlmZmVyZW50Um93KG5leHRJbmRleCwgY29scywgcHJldlJvdykpIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4IC0gcHJldkluZGV4ICUgY29scyAtIDEsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsb29wKSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4IC0gcHJldkluZGV4ICUgY29scyAtIDEsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlmZmVyZW50Um93KG5leHRJbmRleCwgY29scywgcHJldlJvdykpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSBBUlJPV19MRUZUKSB7XG4gICAgICBzdG9wICYmIHN0b3BFdmVudChldmVudCk7XG4gICAgICBpZiAocHJldkluZGV4ICUgY29scyAhPT0gMCkge1xuICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCxcbiAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobG9vcCAmJiBpc0RpZmZlcmVudFJvdyhuZXh0SW5kZXgsIGNvbHMsIHByZXZSb3cpKSB7XG4gICAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCArIChjb2xzIC0gcHJldkluZGV4ICUgY29scyksXG4gICAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsb29wKSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4ICsgKGNvbHMgLSBwcmV2SW5kZXggJSBjb2xzKSxcbiAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlmZmVyZW50Um93KG5leHRJbmRleCwgY29scywgcHJldlJvdykpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsYXN0Um93ID0gZmxvb3IobWF4SW5kZXggLyBjb2xzKSA9PT0gcHJldlJvdztcbiAgICBpZiAoaXNJbmRleE91dE9mQm91bmRzKGVsZW1lbnRzUmVmLCBuZXh0SW5kZXgpKSB7XG4gICAgICBpZiAobG9vcCAmJiBsYXN0Um93KSB7XG4gICAgICAgIG5leHRJbmRleCA9IGV2ZW50LmtleSA9PT0gQVJST1dfTEVGVCA/IG1heEluZGV4IDogZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXggLSBwcmV2SW5kZXggJSBjb2xzIC0gMSxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0SW5kZXggPSBwcmV2SW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXh0SW5kZXg7XG59XG5cbi8qKiBGb3IgZWFjaCBjZWxsIGluZGV4LCBnZXRzIHRoZSBpdGVtIGluZGV4IHRoYXQgb2NjdXBpZXMgdGhhdCBjZWxsICovXG5mdW5jdGlvbiBidWlsZENlbGxNYXAoc2l6ZXMsIGNvbHMsIGRlbnNlKSB7XG4gIGNvbnN0IGNlbGxNYXAgPSBbXTtcbiAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuICBzaXplcy5mb3JFYWNoKChfcmVmMiwgaW5kZXgpID0+IHtcbiAgICBsZXQge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gX3JlZjI7XG4gICAgaWYgKHdpZHRoID4gY29scykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbRmxvYXRpbmcgVUldOiBJbnZhbGlkIGdyaWQgLSBpdGVtIHdpZHRoIGF0IGluZGV4IFwiICsgaW5kZXggKyBcIiBpcyBncmVhdGVyIHRoYW4gZ3JpZCBjb2x1bW5zXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaXRlbVBsYWNlZCA9IGZhbHNlO1xuICAgIGlmIChkZW5zZSkge1xuICAgICAgc3RhcnRJbmRleCA9IDA7XG4gICAgfVxuICAgIHdoaWxlICghaXRlbVBsYWNlZCkge1xuICAgICAgY29uc3QgdGFyZ2V0Q2VsbHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7XG4gICAgICAgICAgdGFyZ2V0Q2VsbHMucHVzaChzdGFydEluZGV4ICsgaSArIGogKiBjb2xzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0SW5kZXggJSBjb2xzICsgd2lkdGggPD0gY29scyAmJiB0YXJnZXRDZWxscy5ldmVyeShjZWxsID0+IGNlbGxNYXBbY2VsbF0gPT0gbnVsbCkpIHtcbiAgICAgICAgdGFyZ2V0Q2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgICBjZWxsTWFwW2NlbGxdID0gaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICBpdGVtUGxhY2VkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0SW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vIGNvbnZlcnQgaW50byBhIG5vbi1zcGFyc2UgYXJyYXlcbiAgcmV0dXJuIFsuLi5jZWxsTWFwXTtcbn1cblxuLyoqIEdldHMgY2VsbCBpbmRleCBvZiBhbiBpdGVtJ3MgY29ybmVyIG9yIC0xIHdoZW4gaW5kZXggaXMgLTEuICovXG5mdW5jdGlvbiBnZXRDZWxsSW5kZXhPZkNvcm5lcihpbmRleCwgc2l6ZXMsIGNlbGxNYXAsIGNvbHMsIGNvcm5lcikge1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gLTE7XG4gIGNvbnN0IGZpcnN0Q2VsbEluZGV4ID0gY2VsbE1hcC5pbmRleE9mKGluZGV4KTtcbiAgY29uc3Qgc2l6ZUl0ZW0gPSBzaXplc1tpbmRleF07XG4gIHN3aXRjaCAoY29ybmVyKSB7XG4gICAgY2FzZSAndGwnOlxuICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4O1xuICAgIGNhc2UgJ3RyJzpcbiAgICAgIGlmICghc2l6ZUl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4ICsgc2l6ZUl0ZW0ud2lkdGggLSAxO1xuICAgIGNhc2UgJ2JsJzpcbiAgICAgIGlmICghc2l6ZUl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4ICsgKHNpemVJdGVtLmhlaWdodCAtIDEpICogY29scztcbiAgICBjYXNlICdicic6XG4gICAgICByZXR1cm4gY2VsbE1hcC5sYXN0SW5kZXhPZihpbmRleCk7XG4gIH1cbn1cblxuLyoqIEdldHMgYWxsIGNlbGwgaW5kaWNlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNwZWNpZmllZCBpbmRpY2VzICovXG5mdW5jdGlvbiBnZXRDZWxsSW5kaWNlcyhpbmRpY2VzLCBjZWxsTWFwKSB7XG4gIHJldHVybiBjZWxsTWFwLmZsYXRNYXAoKGluZGV4LCBjZWxsSW5kZXgpID0+IGluZGljZXMuaW5jbHVkZXMoaW5kZXgpID8gW2NlbGxJbmRleF0gOiBbXSk7XG59XG5mdW5jdGlvbiBpc0Rpc2FibGVkKGxpc3QsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpIHtcbiAgaWYgKGRpc2FibGVkSW5kaWNlcykge1xuICAgIHJldHVybiBkaXNhYmxlZEluZGljZXMuaW5jbHVkZXMoaW5kZXgpO1xuICB9XG4gIGNvbnN0IGVsZW1lbnQgPSBsaXN0W2luZGV4XTtcbiAgcmV0dXJuIGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcpID09PSAndHJ1ZSc7XG59XG5cbmxldCByYWZJZCA9IDA7XG5mdW5jdGlvbiBlbnF1ZXVlRm9jdXMoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgcHJldmVudFNjcm9sbCA9IGZhbHNlLFxuICAgIGNhbmNlbFByZXZpb3VzID0gdHJ1ZSxcbiAgICBzeW5jID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGNhbmNlbFByZXZpb3VzICYmIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgY29uc3QgZXhlYyA9ICgpID0+IGVsID09IG51bGwgPyB2b2lkIDAgOiBlbC5mb2N1cyh7XG4gICAgcHJldmVudFNjcm9sbFxuICB9KTtcbiAgaWYgKHN5bmMpIHtcbiAgICBleGVjKCk7XG4gIH0gZWxzZSB7XG4gICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZXhlYyk7XG4gIH1cbn1cblxudmFyIGluZGV4ID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDtcblxuZnVuY3Rpb24gc29ydEJ5RG9jdW1lbnRQb3NpdGlvbihhLCBiKSB7XG4gIGNvbnN0IHBvc2l0aW9uID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKTtcbiAgaWYgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcgfHwgcG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAocG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyB8fCBwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTlMpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGFyZU1hcHNFcXVhbChtYXAxLCBtYXAyKSB7XG4gIGlmIChtYXAxLnNpemUgIT09IG1hcDIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBtYXAxLmVudHJpZXMoKSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbWFwMi5nZXQoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IEZsb2F0aW5nTGlzdENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIHJlZ2lzdGVyOiAoKSA9PiB7fSxcbiAgdW5yZWdpc3RlcjogKCkgPT4ge30sXG4gIG1hcDogLyojX19QVVJFX18qL25ldyBNYXAoKSxcbiAgZWxlbWVudHNSZWY6IHtcbiAgICBjdXJyZW50OiBbXVxuICB9XG59KTtcbi8qKlxuICogUHJvdmlkZXMgY29udGV4dCBmb3IgYSBsaXN0IG9mIGl0ZW1zIHdpdGhpbiB0aGUgZmxvYXRpbmcgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ0xpc3RcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdMaXN0KHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBlbGVtZW50c1JlZixcbiAgICBsYWJlbHNSZWZcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbbWFwLCBzZXRNYXBdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gbmV3IE1hcCgpKTtcbiAgY29uc3QgcmVnaXN0ZXIgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBzZXRNYXAocHJldk1hcCA9PiBuZXcgTWFwKHByZXZNYXApLnNldChub2RlLCBudWxsKSk7XG4gIH0sIFtdKTtcbiAgY29uc3QgdW5yZWdpc3RlciA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIHNldE1hcChwcmV2TWFwID0+IHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAocHJldk1hcCk7XG4gICAgICBtYXAuZGVsZXRlKG5vZGUpO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9KTtcbiAgfSwgW10pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShuZXdNYXAua2V5cygpKS5zb3J0KHNvcnRCeURvY3VtZW50UG9zaXRpb24pO1xuICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBuZXdNYXAuc2V0KG5vZGUsIGluZGV4KTtcbiAgICB9KTtcbiAgICBpZiAoIWFyZU1hcHNFcXVhbChtYXAsIG5ld01hcCkpIHtcbiAgICAgIHNldE1hcChuZXdNYXApO1xuICAgIH1cbiAgfSwgW21hcF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmxvYXRpbmdMaXN0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgICByZWdpc3RlcixcbiAgICAgIHVucmVnaXN0ZXIsXG4gICAgICBtYXAsXG4gICAgICBlbGVtZW50c1JlZixcbiAgICAgIGxhYmVsc1JlZlxuICAgIH0pLCBbcmVnaXN0ZXIsIHVucmVnaXN0ZXIsIG1hcCwgZWxlbWVudHNSZWYsIGxhYmVsc1JlZl0pXG4gIH0sIGNoaWxkcmVuKTtcbn1cbi8qKlxuICogVXNlZCB0byByZWdpc3RlciBhIGxpc3QgaXRlbSBhbmQgaXRzIGluZGV4IChET00gcG9zaXRpb24pIGluIHRoZVxuICogYEZsb2F0aW5nTGlzdGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdMaXN0I3VzZWxpc3RpdGVtXG4gKi9cbmZ1bmN0aW9uIHVzZUxpc3RJdGVtKHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgbGFiZWxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgcmVnaXN0ZXIsXG4gICAgdW5yZWdpc3RlcixcbiAgICBtYXAsXG4gICAgZWxlbWVudHNSZWYsXG4gICAgbGFiZWxzUmVmXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KEZsb2F0aW5nTGlzdENvbnRleHQpO1xuICBjb25zdCBbaW5kZXgkMSwgc2V0SW5kZXhdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IGNvbXBvbmVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgcmVmID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgY29tcG9uZW50UmVmLmN1cnJlbnQgPSBub2RlO1xuICAgIGlmIChpbmRleCQxICE9PSBudWxsKSB7XG4gICAgICBlbGVtZW50c1JlZi5jdXJyZW50W2luZGV4JDFdID0gbm9kZTtcbiAgICAgIGlmIChsYWJlbHNSZWYpIHtcbiAgICAgICAgdmFyIF9ub2RlJHRleHRDb250ZW50O1xuICAgICAgICBjb25zdCBpc0xhYmVsRGVmaW5lZCA9IGxhYmVsICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGxhYmVsc1JlZi5jdXJyZW50W2luZGV4JDFdID0gaXNMYWJlbERlZmluZWQgPyBsYWJlbCA6IChfbm9kZSR0ZXh0Q29udGVudCA9IG5vZGUgPT0gbnVsbCA/IHZvaWQgMCA6IG5vZGUudGV4dENvbnRlbnQpICE9IG51bGwgPyBfbm9kZSR0ZXh0Q29udGVudCA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCBbaW5kZXgkMSwgZWxlbWVudHNSZWYsIGxhYmVsc1JlZiwgbGFiZWxdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBjb21wb25lbnRSZWYuY3VycmVudDtcbiAgICBpZiAobm9kZSkge1xuICAgICAgcmVnaXN0ZXIobm9kZSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB1bnJlZ2lzdGVyKG5vZGUpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtyZWdpc3RlciwgdW5yZWdpc3Rlcl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBjb21wb25lbnRSZWYuY3VycmVudCA/IG1hcC5nZXQoY29tcG9uZW50UmVmLmN1cnJlbnQpIDogbnVsbDtcbiAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgc2V0SW5kZXgoaW5kZXgpO1xuICAgIH1cbiAgfSwgW21hcF0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJlZixcbiAgICBpbmRleDogaW5kZXgkMSA9PSBudWxsID8gLTEgOiBpbmRleCQxXG4gIH0pLCBbaW5kZXgkMSwgcmVmXSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckpzeChyZW5kZXIsIGNvbXB1dGVkUHJvcHMpIHtcbiAgaWYgKHR5cGVvZiByZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gcmVuZGVyKGNvbXB1dGVkUHJvcHMpO1xuICB9XG4gIGlmIChyZW5kZXIpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChyZW5kZXIsIGNvbXB1dGVkUHJvcHMpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBjb21wdXRlZFByb3BzKTtcbn1cbmNvbnN0IENvbXBvc2l0ZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGFjdGl2ZUluZGV4OiAwLFxuICBvbk5hdmlnYXRlOiAoKSA9PiB7fVxufSk7XG5jb25zdCBob3Jpem9udGFsS2V5cyA9IFtBUlJPV19MRUZULCBBUlJPV19SSUdIVF07XG5jb25zdCB2ZXJ0aWNhbEtleXMgPSBbQVJST1dfVVAsIEFSUk9XX0RPV05dO1xuY29uc3QgYWxsS2V5cyA9IFsuLi5ob3Jpem9udGFsS2V5cywgLi4udmVydGljYWxLZXlzXTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIHRhYiBzdG9wIHdob3NlIGl0ZW1zIGFyZSBuYXZpZ2F0ZWQgYnkgYXJyb3cga2V5cywgd2hpY2hcbiAqIHByb3ZpZGVzIGxpc3QgbmF2aWdhdGlvbiBvdXRzaWRlIG9mIGZsb2F0aW5nIGVsZW1lbnQgY29udGV4dHMuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgdG8gZW5hYmxlIG5hdmlnYXRpb24gb2YgYSBsaXN0IG9mIGl0ZW1zIHRoYXQgYXJlbuKAmXQgcGFydCBvZiBhXG4gKiBmbG9hdGluZyBlbGVtZW50LiBBIG1lbnViYXIgaXMgYW4gZXhhbXBsZSBvZiBhIGNvbXBvc2l0ZSwgd2l0aCBlYWNoIHJlZmVyZW5jZVxuICogZWxlbWVudCBiZWluZyBhbiBpdGVtLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0NvbXBvc2l0ZVxuICovXG5jb25zdCBDb21wb3NpdGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBDb21wb3NpdGUocHJvcHMsIGZvcndhcmRlZFJlZikge1xuICBjb25zdCB7XG4gICAgcmVuZGVyLFxuICAgIG9yaWVudGF0aW9uID0gJ2JvdGgnLFxuICAgIGxvb3AgPSB0cnVlLFxuICAgIGNvbHMgPSAxLFxuICAgIGRpc2FibGVkSW5kaWNlcyxcbiAgICBhY3RpdmVJbmRleDogZXh0ZXJuYWxBY3RpdmVJbmRleCxcbiAgICBvbk5hdmlnYXRlOiBleHRlcm5hbFNldEFjdGl2ZUluZGV4LFxuICAgIGl0ZW1TaXplcyxcbiAgICBkZW5zZSA9IGZhbHNlLFxuICAgIC4uLmRvbVByb3BzXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgW2ludGVybmFsQWN0aXZlSW5kZXgsIGludGVybmFsU2V0QWN0aXZlSW5kZXhdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gIGNvbnN0IGFjdGl2ZUluZGV4ID0gZXh0ZXJuYWxBY3RpdmVJbmRleCAhPSBudWxsID8gZXh0ZXJuYWxBY3RpdmVJbmRleCA6IGludGVybmFsQWN0aXZlSW5kZXg7XG4gIGNvbnN0IG9uTmF2aWdhdGUgPSB1c2VFZmZlY3RFdmVudChleHRlcm5hbFNldEFjdGl2ZUluZGV4ICE9IG51bGwgPyBleHRlcm5hbFNldEFjdGl2ZUluZGV4IDogaW50ZXJuYWxTZXRBY3RpdmVJbmRleCk7XG4gIGNvbnN0IGVsZW1lbnRzUmVmID0gUmVhY3QudXNlUmVmKFtdKTtcbiAgY29uc3QgcmVuZGVyRWxlbWVudFByb3BzID0gcmVuZGVyICYmIHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicgPyByZW5kZXIucHJvcHMgOiB7fTtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGFjdGl2ZUluZGV4LFxuICAgIG9uTmF2aWdhdGVcbiAgfSksIFthY3RpdmVJbmRleCwgb25OYXZpZ2F0ZV0pO1xuICBjb25zdCBpc0dyaWQgPSBjb2xzID4gMTtcbiAgZnVuY3Rpb24gaGFuZGxlS2V5RG93bihldmVudCkge1xuICAgIGlmICghYWxsS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG4gICAgbGV0IG5leHRJbmRleCA9IGFjdGl2ZUluZGV4O1xuICAgIGNvbnN0IG1pbkluZGV4ID0gZ2V0TWluSW5kZXgoZWxlbWVudHNSZWYsIGRpc2FibGVkSW5kaWNlcyk7XG4gICAgY29uc3QgbWF4SW5kZXggPSBnZXRNYXhJbmRleChlbGVtZW50c1JlZiwgZGlzYWJsZWRJbmRpY2VzKTtcbiAgICBpZiAoaXNHcmlkKSB7XG4gICAgICBjb25zdCBzaXplcyA9IGl0ZW1TaXplcyB8fCBBcnJheS5mcm9tKHtcbiAgICAgICAgbGVuZ3RoOiBlbGVtZW50c1JlZi5jdXJyZW50Lmxlbmd0aFxuICAgICAgfSwgKCkgPT4gKHtcbiAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgIGhlaWdodDogMVxuICAgICAgfSkpO1xuICAgICAgLy8gVG8gY2FsY3VsYXRlIG1vdmVtZW50cyBvbiB0aGUgZ3JpZCwgd2UgdXNlIGh5cG90aGV0aWNhbCBjZWxsIGluZGljZXNcbiAgICAgIC8vIGFzIGlmIGV2ZXJ5IGl0ZW0gd2FzIDF4MSwgdGhlbiBjb252ZXJ0IGJhY2sgdG8gcmVhbCBpbmRpY2VzLlxuICAgICAgY29uc3QgY2VsbE1hcCA9IGJ1aWxkQ2VsbE1hcChzaXplcywgY29scywgZGVuc2UpO1xuICAgICAgY29uc3QgbWluR3JpZEluZGV4ID0gY2VsbE1hcC5maW5kSW5kZXgoaW5kZXggPT4gaW5kZXggIT0gbnVsbCAmJiAhaXNEaXNhYmxlZChlbGVtZW50c1JlZi5jdXJyZW50LCBpbmRleCwgZGlzYWJsZWRJbmRpY2VzKSk7XG4gICAgICAvLyBsYXN0IGVuYWJsZWQgaW5kZXhcbiAgICAgIGNvbnN0IG1heEdyaWRJbmRleCA9IGNlbGxNYXAucmVkdWNlKChmb3VuZEluZGV4LCBpbmRleCwgY2VsbEluZGV4KSA9PiBpbmRleCAhPSBudWxsICYmICFpc0Rpc2FibGVkKGVsZW1lbnRzUmVmLmN1cnJlbnQsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpID8gY2VsbEluZGV4IDogZm91bmRJbmRleCwgLTEpO1xuICAgICAgbmV4dEluZGV4ID0gY2VsbE1hcFtnZXRHcmlkTmF2aWdhdGVkSW5kZXgoe1xuICAgICAgICBjdXJyZW50OiBjZWxsTWFwLm1hcChpdGVtSW5kZXggPT4gaXRlbUluZGV4ID8gZWxlbWVudHNSZWYuY3VycmVudFtpdGVtSW5kZXhdIDogbnVsbClcbiAgICAgIH0sIHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgICBsb29wLFxuICAgICAgICBjb2xzLFxuICAgICAgICAvLyB0cmVhdCB1bmRlZmluZWQgKGVtcHR5IGdyaWQgc3BhY2VzKSBhcyBkaXNhYmxlZCBpbmRpY2VzIHNvIHdlXG4gICAgICAgIC8vIGRvbid0IGVuZCB1cCBpbiB0aGVtXG4gICAgICAgIGRpc2FibGVkSW5kaWNlczogZ2V0Q2VsbEluZGljZXMoWy4uLihkaXNhYmxlZEluZGljZXMgfHwgZWxlbWVudHNSZWYuY3VycmVudC5tYXAoKF8sIGluZGV4KSA9PiBpc0Rpc2FibGVkKGVsZW1lbnRzUmVmLmN1cnJlbnQsIGluZGV4KSA/IGluZGV4IDogdW5kZWZpbmVkKSksIHVuZGVmaW5lZF0sIGNlbGxNYXApLFxuICAgICAgICBtaW5JbmRleDogbWluR3JpZEluZGV4LFxuICAgICAgICBtYXhJbmRleDogbWF4R3JpZEluZGV4LFxuICAgICAgICBwcmV2SW5kZXg6IGdldENlbGxJbmRleE9mQ29ybmVyKGFjdGl2ZUluZGV4ID4gbWF4SW5kZXggPyBtaW5JbmRleCA6IGFjdGl2ZUluZGV4LCBzaXplcywgY2VsbE1hcCwgY29scyxcbiAgICAgICAgLy8gdXNlIGEgY29ybmVyIG1hdGNoaW5nIHRoZSBlZGdlIGNsb3Nlc3QgdG8gdGhlIGRpcmVjdGlvbiB3ZSdyZVxuICAgICAgICAvLyBtb3ZpbmcgaW4gc28gd2UgZG9uJ3QgZW5kIHVwIGluIHRoZSBzYW1lIGl0ZW0uIFByZWZlclxuICAgICAgICAvLyB0b3AvbGVmdCBvdmVyIGJvdHRvbS9yaWdodC5cbiAgICAgICAgZXZlbnQua2V5ID09PSBBUlJPV19ET1dOID8gJ2JsJyA6IGV2ZW50LmtleSA9PT0gQVJST1dfUklHSFQgPyAndHInIDogJ3RsJylcbiAgICAgIH0pXTsgLy8gbmF2aWdhdGVkIGNlbGwgd2lsbCBuZXZlciBiZSBudWxsaXNoXG4gICAgfVxuICAgIGNvbnN0IHRvRW5kS2V5cyA9IHtcbiAgICAgIGhvcml6b250YWw6IFtBUlJPV19SSUdIVF0sXG4gICAgICB2ZXJ0aWNhbDogW0FSUk9XX0RPV05dLFxuICAgICAgYm90aDogW0FSUk9XX1JJR0hULCBBUlJPV19ET1dOXVxuICAgIH1bb3JpZW50YXRpb25dO1xuICAgIGNvbnN0IHRvU3RhcnRLZXlzID0ge1xuICAgICAgaG9yaXpvbnRhbDogW0FSUk9XX0xFRlRdLFxuICAgICAgdmVydGljYWw6IFtBUlJPV19VUF0sXG4gICAgICBib3RoOiBbQVJST1dfTEVGVCwgQVJST1dfVVBdXG4gICAgfVtvcmllbnRhdGlvbl07XG4gICAgY29uc3QgcHJldmVudGVkS2V5cyA9IGlzR3JpZCA/IGFsbEtleXMgOiB7XG4gICAgICBob3Jpem9udGFsOiBob3Jpem9udGFsS2V5cyxcbiAgICAgIHZlcnRpY2FsOiB2ZXJ0aWNhbEtleXMsXG4gICAgICBib3RoOiBhbGxLZXlzXG4gICAgfVtvcmllbnRhdGlvbl07XG4gICAgaWYgKG5leHRJbmRleCA9PT0gYWN0aXZlSW5kZXggJiYgWy4uLnRvRW5kS2V5cywgLi4udG9TdGFydEtleXNdLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgIGlmIChsb29wICYmIG5leHRJbmRleCA9PT0gbWF4SW5kZXggJiYgdG9FbmRLZXlzLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gbWluSW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKGxvb3AgJiYgbmV4dEluZGV4ID09PSBtaW5JbmRleCAmJiB0b1N0YXJ0S2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgIG5leHRJbmRleCA9IG1heEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBuZXh0SW5kZXgsXG4gICAgICAgICAgZGVjcmVtZW50OiB0b1N0YXJ0S2V5cy5pbmNsdWRlcyhldmVudC5rZXkpLFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5leHRJbmRleCAhPT0gYWN0aXZlSW5kZXggJiYgIWlzSW5kZXhPdXRPZkJvdW5kcyhlbGVtZW50c1JlZiwgbmV4dEluZGV4KSkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAocHJldmVudGVkS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICBvbk5hdmlnYXRlKG5leHRJbmRleCk7XG5cbiAgICAgIC8vIFdhaXQgZm9yIEZvY3VzTWFuYWdlciBgcmV0dXJuRm9jdXNgIHRvIGV4ZWN1dGUuXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGVucXVldWVGb2N1cyhlbGVtZW50c1JlZi5jdXJyZW50W25leHRJbmRleF0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbXB1dGVkUHJvcHMgPSB7XG4gICAgLi4uZG9tUHJvcHMsXG4gICAgLi4ucmVuZGVyRWxlbWVudFByb3BzLFxuICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICdhcmlhLW9yaWVudGF0aW9uJzogb3JpZW50YXRpb24gPT09ICdib3RoJyA/IHVuZGVmaW5lZCA6IG9yaWVudGF0aW9uLFxuICAgIG9uS2V5RG93bihlKSB7XG4gICAgICBkb21Qcm9wcy5vbktleURvd24gPT0gbnVsbCB8fCBkb21Qcm9wcy5vbktleURvd24oZSk7XG4gICAgICByZW5kZXJFbGVtZW50UHJvcHMub25LZXlEb3duID09IG51bGwgfHwgcmVuZGVyRWxlbWVudFByb3BzLm9uS2V5RG93bihlKTtcbiAgICAgIGhhbmRsZUtleURvd24oZSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9zaXRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmxvYXRpbmdMaXN0LCB7XG4gICAgZWxlbWVudHNSZWY6IGVsZW1lbnRzUmVmXG4gIH0sIHJlbmRlckpzeChyZW5kZXIsIGNvbXB1dGVkUHJvcHMpKSk7XG59KTtcbi8qKlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0NvbXBvc2l0ZVxuICovXG5jb25zdCBDb21wb3NpdGVJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ29tcG9zaXRlSXRlbShwcm9wcywgZm9yd2FyZGVkUmVmKSB7XG4gIGNvbnN0IHtcbiAgICByZW5kZXIsXG4gICAgLi4uZG9tUHJvcHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCByZW5kZXJFbGVtZW50UHJvcHMgPSByZW5kZXIgJiYgdHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJyA/IHJlbmRlci5wcm9wcyA6IHt9O1xuICBjb25zdCB7XG4gICAgYWN0aXZlSW5kZXgsXG4gICAgb25OYXZpZ2F0ZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb21wb3NpdGVDb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIHJlZixcbiAgICBpbmRleFxuICB9ID0gdXNlTGlzdEl0ZW0oKTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VSZWZzKFtyZWYsIGZvcndhcmRlZFJlZiwgcmVuZGVyRWxlbWVudFByb3BzLnJlZl0pO1xuICBjb25zdCBpc0FjdGl2ZSA9IGFjdGl2ZUluZGV4ID09PSBpbmRleDtcbiAgY29uc3QgY29tcHV0ZWRQcm9wcyA9IHtcbiAgICAuLi5kb21Qcm9wcyxcbiAgICAuLi5yZW5kZXJFbGVtZW50UHJvcHMsXG4gICAgcmVmOiBtZXJnZWRSZWYsXG4gICAgdGFiSW5kZXg6IGlzQWN0aXZlID8gMCA6IC0xLFxuICAgICdkYXRhLWFjdGl2ZSc6IGlzQWN0aXZlID8gJycgOiB1bmRlZmluZWQsXG4gICAgb25Gb2N1cyhlKSB7XG4gICAgICBkb21Qcm9wcy5vbkZvY3VzID09IG51bGwgfHwgZG9tUHJvcHMub25Gb2N1cyhlKTtcbiAgICAgIHJlbmRlckVsZW1lbnRQcm9wcy5vbkZvY3VzID09IG51bGwgfHwgcmVuZGVyRWxlbWVudFByb3BzLm9uRm9jdXMoZSk7XG4gICAgICBvbk5hdmlnYXRlKGluZGV4KTtcbiAgICB9XG4gIH07XG4gIHJldHVybiByZW5kZXJKc3gocmVuZGVyLCBjb21wdXRlZFByb3BzKTtcbn0pO1xuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxubGV0IHNlcnZlckhhbmRvZmZDb21wbGV0ZSA9IGZhbHNlO1xubGV0IGNvdW50ID0gMDtcbmNvbnN0IGdlbklkID0gKCkgPT4gLy8gRW5zdXJlIHRoZSBpZCBpcyB1bmlxdWUgd2l0aCBtdWx0aXBsZSBpbmRlcGVuZGVudCB2ZXJzaW9ucyBvZiBGbG9hdGluZyBVSVxuLy8gb24gPFJlYWN0IDE4XG5cImZsb2F0aW5nLXVpLVwiICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNikgKyBjb3VudCsrO1xuZnVuY3Rpb24gdXNlRmxvYXRpbmdJZCgpIHtcbiAgY29uc3QgW2lkLCBzZXRJZF0gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBzZXJ2ZXJIYW5kb2ZmQ29tcGxldGUgPyBnZW5JZCgpIDogdW5kZWZpbmVkKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChpZCA9PSBudWxsKSB7XG4gICAgICBzZXRJZChnZW5JZCgpKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2VydmVySGFuZG9mZkNvbXBsZXRlID0gdHJ1ZTtcbiAgfSwgW10pO1xuICByZXR1cm4gaWQ7XG59XG5jb25zdCB1c2VSZWFjdElkID0gU2FmZVJlYWN0LnVzZUlkO1xuXG4vKipcbiAqIFVzZXMgUmVhY3QgMTgncyBidWlsdC1pbiBgdXNlSWQoKWAgd2hlbiBhdmFpbGFibGUsIG9yIGZhbGxzIGJhY2sgdG8gYVxuICogc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50IChyZXF1aXJpbmcgYSBkb3VibGUgcmVuZGVyKSBpbXBsZW1lbnRhdGlvbiBmb3JcbiAqIGVhcmxpZXIgUmVhY3QgdmVyc2lvbnMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvcmVhY3QtdXRpbHMjdXNlaWRcbiAqL1xuY29uc3QgdXNlSWQgPSB1c2VSZWFjdElkIHx8IHVzZUZsb2F0aW5nSWQ7XG5cbmxldCBkZXZNZXNzYWdlU2V0O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBkZXZNZXNzYWdlU2V0ID0gLyojX19QVVJFX18qL25ldyBTZXQoKTtcbn1cbmZ1bmN0aW9uIHdhcm4oKSB7XG4gIHZhciBfZGV2TWVzc2FnZVNldDtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2VzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIG1lc3NhZ2VzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIGNvbnN0IG1lc3NhZ2UgPSBcIkZsb2F0aW5nIFVJOiBcIiArIG1lc3NhZ2VzLmpvaW4oJyAnKTtcbiAgaWYgKCEoKF9kZXZNZXNzYWdlU2V0ID0gZGV2TWVzc2FnZVNldCkgIT0gbnVsbCAmJiBfZGV2TWVzc2FnZVNldC5oYXMobWVzc2FnZSkpKSB7XG4gICAgdmFyIF9kZXZNZXNzYWdlU2V0MjtcbiAgICAoX2Rldk1lc3NhZ2VTZXQyID0gZGV2TWVzc2FnZVNldCkgPT0gbnVsbCB8fCBfZGV2TWVzc2FnZVNldDIuYWRkKG1lc3NhZ2UpO1xuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoKSB7XG4gIHZhciBfZGV2TWVzc2FnZVNldDM7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgbWVzc2FnZXMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBtZXNzYWdlc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG4gIGNvbnN0IG1lc3NhZ2UgPSBcIkZsb2F0aW5nIFVJOiBcIiArIG1lc3NhZ2VzLmpvaW4oJyAnKTtcbiAgaWYgKCEoKF9kZXZNZXNzYWdlU2V0MyA9IGRldk1lc3NhZ2VTZXQpICE9IG51bGwgJiYgX2Rldk1lc3NhZ2VTZXQzLmhhcyhtZXNzYWdlKSkpIHtcbiAgICB2YXIgX2Rldk1lc3NhZ2VTZXQ0O1xuICAgIChfZGV2TWVzc2FnZVNldDQgPSBkZXZNZXNzYWdlU2V0KSA9PSBudWxsIHx8IF9kZXZNZXNzYWdlU2V0NC5hZGQobWVzc2FnZSk7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBwb2ludGluZyBhcnJvdyB0cmlhbmdsZS5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ0Fycm93XG4gKi9cbmNvbnN0IEZsb2F0aW5nQXJyb3cgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGbG9hdGluZ0Fycm93KHByb3BzLCByZWYpIHtcbiAgY29uc3Qge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIGZsb2F0aW5nXG4gICAgICB9LFxuICAgICAgbWlkZGxld2FyZURhdGE6IHtcbiAgICAgICAgYXJyb3dcbiAgICAgIH1cbiAgICB9LFxuICAgIHdpZHRoID0gMTQsXG4gICAgaGVpZ2h0ID0gNyxcbiAgICB0aXBSYWRpdXMgPSAwLFxuICAgIHN0cm9rZVdpZHRoID0gMCxcbiAgICBzdGF0aWNPZmZzZXQsXG4gICAgc3Ryb2tlLFxuICAgIGQsXG4gICAgc3R5bGU6IHtcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIC4uLnJlc3RTdHlsZVxuICAgIH0gPSB7fSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICghcmVmKSB7XG4gICAgICB3YXJuKCdUaGUgYHJlZmAgcHJvcCBpcyByZXF1aXJlZCBmb3IgYEZsb2F0aW5nQXJyb3dgLicpO1xuICAgIH1cbiAgfVxuICBjb25zdCBjbGlwUGF0aElkID0gdXNlSWQoKTtcbiAgaWYgKCFmbG9hdGluZykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gU3Ryb2tlcyBtdXN0IGJlIGRvdWJsZSB0aGUgYm9yZGVyIHdpZHRoLCB0aGlzIGVuc3VyZXMgdGhlIHN0cm9rZSdzIHdpZHRoXG4gIC8vIHdvcmtzIGFzIHlvdSdkIGV4cGVjdC5cbiAgY29uc3QgY29tcHV0ZWRTdHJva2VXaWR0aCA9IHN0cm9rZVdpZHRoICogMjtcbiAgY29uc3QgaGFsZlN0cm9rZVdpZHRoID0gY29tcHV0ZWRTdHJva2VXaWR0aCAvIDI7XG4gIGNvbnN0IHN2Z1ggPSB3aWR0aCAvIDIgKiAodGlwUmFkaXVzIC8gLTggKyAxKTtcbiAgY29uc3Qgc3ZnWSA9IGhlaWdodCAvIDIgKiB0aXBSYWRpdXMgLyA0O1xuICBjb25zdCBbc2lkZSwgYWxpZ25tZW50XSA9IHBsYWNlbWVudC5zcGxpdCgnLScpO1xuICBjb25zdCBpc1JUTCA9IHBsYXRmb3JtLmlzUlRMKGZsb2F0aW5nKTtcbiAgY29uc3QgaXNDdXN0b21TaGFwZSA9ICEhZDtcbiAgY29uc3QgaXNWZXJ0aWNhbFNpZGUgPSBzaWRlID09PSAndG9wJyB8fCBzaWRlID09PSAnYm90dG9tJztcbiAgY29uc3QgeU9mZnNldFByb3AgPSBzdGF0aWNPZmZzZXQgJiYgYWxpZ25tZW50ID09PSAnZW5kJyA/ICdib3R0b20nIDogJ3RvcCc7XG4gIGxldCB4T2Zmc2V0UHJvcCA9IHN0YXRpY09mZnNldCAmJiBhbGlnbm1lbnQgPT09ICdlbmQnID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgaWYgKHN0YXRpY09mZnNldCAmJiBpc1JUTCkge1xuICAgIHhPZmZzZXRQcm9wID0gYWxpZ25tZW50ID09PSAnZW5kJyA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gIH1cbiAgY29uc3QgYXJyb3dYID0gKGFycm93ID09IG51bGwgPyB2b2lkIDAgOiBhcnJvdy54KSAhPSBudWxsID8gc3RhdGljT2Zmc2V0IHx8IGFycm93LnggOiAnJztcbiAgY29uc3QgYXJyb3dZID0gKGFycm93ID09IG51bGwgPyB2b2lkIDAgOiBhcnJvdy55KSAhPSBudWxsID8gc3RhdGljT2Zmc2V0IHx8IGFycm93LnkgOiAnJztcbiAgY29uc3QgZFZhbHVlID0gZCB8fCAnTTAsMCcgKyAoXCIgSFwiICsgd2lkdGgpICsgKFwiIExcIiArICh3aWR0aCAtIHN2Z1gpICsgXCIsXCIgKyAoaGVpZ2h0IC0gc3ZnWSkpICsgKFwiIFFcIiArIHdpZHRoIC8gMiArIFwiLFwiICsgaGVpZ2h0ICsgXCIgXCIgKyBzdmdYICsgXCIsXCIgKyAoaGVpZ2h0IC0gc3ZnWSkpICsgJyBaJztcbiAgY29uc3Qgcm90YXRpb24gPSB7XG4gICAgdG9wOiBpc0N1c3RvbVNoYXBlID8gJ3JvdGF0ZSgxODBkZWcpJyA6ICcnLFxuICAgIGxlZnQ6IGlzQ3VzdG9tU2hhcGUgPyAncm90YXRlKDkwZGVnKScgOiAncm90YXRlKC05MGRlZyknLFxuICAgIGJvdHRvbTogaXNDdXN0b21TaGFwZSA/ICcnIDogJ3JvdGF0ZSgxODBkZWcpJyxcbiAgICByaWdodDogaXNDdXN0b21TaGFwZSA/ICdyb3RhdGUoLTkwZGVnKScgOiAncm90YXRlKDkwZGVnKSdcbiAgfVtzaWRlXTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlLFxuICAgIHJlZjogcmVmLFxuICAgIHdpZHRoOiBpc0N1c3RvbVNoYXBlID8gd2lkdGggOiB3aWR0aCArIGNvbXB1dGVkU3Ryb2tlV2lkdGgsXG4gICAgaGVpZ2h0OiB3aWR0aCxcbiAgICB2aWV3Qm94OiBcIjAgMCBcIiArIHdpZHRoICsgXCIgXCIgKyAoaGVpZ2h0ID4gd2lkdGggPyBoZWlnaHQgOiB3aWR0aCksXG4gICAgc3R5bGU6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgW3hPZmZzZXRQcm9wXTogYXJyb3dYLFxuICAgICAgW3lPZmZzZXRQcm9wXTogYXJyb3dZLFxuICAgICAgW3NpZGVdOiBpc1ZlcnRpY2FsU2lkZSB8fCBpc0N1c3RvbVNoYXBlID8gJzEwMCUnIDogXCJjYWxjKDEwMCUgLSBcIiArIGNvbXB1dGVkU3Ryb2tlV2lkdGggLyAyICsgXCJweClcIixcbiAgICAgIHRyYW5zZm9ybTogXCJcIiArIHJvdGF0aW9uICsgKHRyYW5zZm9ybSAhPSBudWxsID8gdHJhbnNmb3JtIDogJycpLFxuICAgICAgLi4ucmVzdFN0eWxlXG4gICAgfVxuICB9KSwgY29tcHV0ZWRTdHJva2VXaWR0aCA+IDAgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGlwUGF0aDogXCJ1cmwoI1wiICsgY2xpcFBhdGhJZCArIFwiKVwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHN0cm9rZTogc3Ryb2tlXG4gICAgLy8gQWNjb3VudCBmb3IgdGhlIHN0cm9rZSBvbiB0aGUgZmlsbCBwYXRoIHJlbmRlcmVkIGJlbG93LlxuICAgICxcbiAgICBzdHJva2VXaWR0aDogY29tcHV0ZWRTdHJva2VXaWR0aCArIChkID8gMCA6IDEpLFxuICAgIGQ6IGRWYWx1ZVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBzdHJva2U6IGNvbXB1dGVkU3Ryb2tlV2lkdGggJiYgIWQgPyByZXN0LmZpbGwgOiAnbm9uZScsXG4gICAgZDogZFZhbHVlXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIsIHtcbiAgICBpZDogY2xpcFBhdGhJZFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IC1oYWxmU3Ryb2tlV2lkdGgsXG4gICAgeTogaGFsZlN0cm9rZVdpZHRoICogKGlzQ3VzdG9tU2hhcGUgPyAtMSA6IDEpLFxuICAgIHdpZHRoOiB3aWR0aCArIGNvbXB1dGVkU3Ryb2tlV2lkdGgsXG4gICAgaGVpZ2h0OiB3aWR0aFxuICB9KSkpO1xufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVB1YlN1YigpIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICByZXR1cm4ge1xuICAgIGVtaXQoZXZlbnQsIGRhdGEpIHtcbiAgICAgIHZhciBfbWFwJGdldDtcbiAgICAgIChfbWFwJGdldCA9IG1hcC5nZXQoZXZlbnQpKSA9PSBudWxsIHx8IF9tYXAkZ2V0LmZvckVhY2goaGFuZGxlciA9PiBoYW5kbGVyKGRhdGEpKTtcbiAgICB9LFxuICAgIG9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgbWFwLnNldChldmVudCwgWy4uLihtYXAuZ2V0KGV2ZW50KSB8fCBbXSksIGxpc3RlbmVyXSk7XG4gICAgfSxcbiAgICBvZmYoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgX21hcCRnZXQyO1xuICAgICAgbWFwLnNldChldmVudCwgKChfbWFwJGdldDIgPSBtYXAuZ2V0KGV2ZW50KSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9tYXAkZ2V0Mi5maWx0ZXIobCA9PiBsICE9PSBsaXN0ZW5lcikpIHx8IFtdKTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IEZsb2F0aW5nTm9kZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmNvbnN0IEZsb2F0aW5nVHJlZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXJlbnQgbm9kZSBpZCBmb3IgbmVzdGVkIGZsb2F0aW5nIGVsZW1lbnRzLCBpZiBhdmFpbGFibGUuXG4gKiBSZXR1cm5zIGBudWxsYCBmb3IgdG9wLWxldmVsIGZsb2F0aW5nIGVsZW1lbnRzLlxuICovXG5jb25zdCB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCA9ICgpID0+IHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0O1xuICByZXR1cm4gKChfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRmxvYXRpbmdOb2RlQ29udGV4dCkpID09IG51bGwgPyB2b2lkIDAgOiBfUmVhY3QkdXNlQ29udGV4dC5pZCkgfHwgbnVsbDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmVhcmVzdCBmbG9hdGluZyB0cmVlIGNvbnRleHQsIGlmIGF2YWlsYWJsZS5cbiAqL1xuY29uc3QgdXNlRmxvYXRpbmdUcmVlID0gKCkgPT4gUmVhY3QudXNlQ29udGV4dChGbG9hdGluZ1RyZWVDb250ZXh0KTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBub2RlIGludG8gdGhlIGBGbG9hdGluZ1RyZWVgLCByZXR1cm5pbmcgaXRzIGlkLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nVHJlZVxuICovXG5mdW5jdGlvbiB1c2VGbG9hdGluZ05vZGVJZChjdXN0b21QYXJlbnRJZCkge1xuICBjb25zdCBpZCA9IHVzZUlkKCk7XG4gIGNvbnN0IHRyZWUgPSB1c2VGbG9hdGluZ1RyZWUoKTtcbiAgY29uc3QgcmVhY3RQYXJlbnRJZCA9IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkKCk7XG4gIGNvbnN0IHBhcmVudElkID0gY3VzdG9tUGFyZW50SWQgfHwgcmVhY3RQYXJlbnRJZDtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICBpZCxcbiAgICAgIHBhcmVudElkXG4gICAgfTtcbiAgICB0cmVlID09IG51bGwgfHwgdHJlZS5hZGROb2RlKG5vZGUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0cmVlID09IG51bGwgfHwgdHJlZS5yZW1vdmVOb2RlKG5vZGUpO1xuICAgIH07XG4gIH0sIFt0cmVlLCBpZCwgcGFyZW50SWRdKTtcbiAgcmV0dXJuIGlkO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHBhcmVudCBub2RlIGNvbnRleHQgZm9yIG5lc3RlZCBmbG9hdGluZyBlbGVtZW50cy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ1RyZWVcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdOb2RlKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBpZFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBhcmVudElkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZsb2F0aW5nTm9kZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgICAgaWQsXG4gICAgICBwYXJlbnRJZFxuICAgIH0pLCBbaWQsIHBhcmVudElkXSlcbiAgfSwgY2hpbGRyZW4pO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGNvbnRleHQgZm9yIG5lc3RlZCBmbG9hdGluZyBlbGVtZW50cyB3aGVuIHRoZXkgYXJlIG5vdCBjaGlsZHJlbiBvZlxuICogZWFjaCBvdGhlciBvbiB0aGUgRE9NLlxuICogVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGluIGFsbCBjYXNlcywgZXhjZXB0IHdoZW4gdGhlcmUgbXVzdCBiZSBleHBsaWNpdCBjb21tdW5pY2F0aW9uIGJldHdlZW4gcGFyZW50IGFuZCBjaGlsZCBmbG9hdGluZyBlbGVtZW50cy4gSXQgaXMgbmVjZXNzYXJ5IGZvcjpcbiAqIC0gVGhlIGBidWJibGVzYCBvcHRpb24gaW4gdGhlIGB1c2VEaXNtaXNzKClgIEhvb2tcbiAqIC0gTmVzdGVkIHZpcnR1YWwgbGlzdCBuYXZpZ2F0aW9uXG4gKiAtIE5lc3RlZCBmbG9hdGluZyBlbGVtZW50cyB0aGF0IGVhY2ggb3BlbiBvbiBob3ZlclxuICogLSBDdXN0b20gY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHBhcmVudCBhbmQgY2hpbGQgZmxvYXRpbmcgZWxlbWVudHNcbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ1RyZWVcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdUcmVlKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlblxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IG5vZGVzUmVmID0gUmVhY3QudXNlUmVmKFtdKTtcbiAgY29uc3QgYWRkTm9kZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIG5vZGVzUmVmLmN1cnJlbnQgPSBbLi4ubm9kZXNSZWYuY3VycmVudCwgbm9kZV07XG4gIH0sIFtdKTtcbiAgY29uc3QgcmVtb3ZlTm9kZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIG5vZGVzUmVmLmN1cnJlbnQgPSBub2Rlc1JlZi5jdXJyZW50LmZpbHRlcihuID0+IG4gIT09IG5vZGUpO1xuICB9LCBbXSk7XG4gIGNvbnN0IGV2ZW50cyA9IFJlYWN0LnVzZVN0YXRlKCgpID0+IGNyZWF0ZVB1YlN1YigpKVswXTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZsb2F0aW5nVHJlZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgICAgbm9kZXNSZWYsXG4gICAgICBhZGROb2RlLFxuICAgICAgcmVtb3ZlTm9kZSxcbiAgICAgIGV2ZW50c1xuICAgIH0pLCBbYWRkTm9kZSwgcmVtb3ZlTm9kZSwgZXZlbnRzXSlcbiAgfSwgY2hpbGRyZW4pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBdHRyaWJ1dGUobmFtZSkge1xuICByZXR1cm4gXCJkYXRhLWZsb2F0aW5nLXVpLVwiICsgbmFtZTtcbn1cblxuZnVuY3Rpb24gdXNlTGF0ZXN0UmVmKHZhbHVlKSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZih2YWx1ZSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlZjtcbn1cblxuY29uc3Qgc2FmZVBvbHlnb25JZGVudGlmaWVyID0gLyojX19QVVJFX18qL2NyZWF0ZUF0dHJpYnV0ZSgnc2FmZS1wb2x5Z29uJyk7XG5mdW5jdGlvbiBnZXREZWxheSh2YWx1ZSwgcHJvcCwgcG9pbnRlclR5cGUpIHtcbiAgaWYgKHBvaW50ZXJUeXBlICYmICFpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlKSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdm9pZCAwIDogdmFsdWVbcHJvcF07XG59XG4vKipcbiAqIE9wZW5zIHRoZSBmbG9hdGluZyBlbGVtZW50IHdoaWxlIGhvdmVyaW5nIG92ZXIgdGhlIHJlZmVyZW5jZSBlbGVtZW50LCBsaWtlXG4gKiBDU1MgYDpob3ZlcmAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlSG92ZXJcbiAqL1xuZnVuY3Rpb24gdXNlSG92ZXIoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBkYXRhUmVmLFxuICAgIGV2ZW50cyxcbiAgICBlbGVtZW50czoge1xuICAgICAgZG9tUmVmZXJlbmNlLFxuICAgICAgZmxvYXRpbmdcbiAgICB9XG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgZGVsYXkgPSAwLFxuICAgIGhhbmRsZUNsb3NlID0gbnVsbCxcbiAgICBtb3VzZU9ubHkgPSBmYWxzZSxcbiAgICByZXN0TXMgPSAwLFxuICAgIG1vdmUgPSB0cnVlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBjb25zdCBwYXJlbnRJZCA9IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkKCk7XG4gIGNvbnN0IGhhbmRsZUNsb3NlUmVmID0gdXNlTGF0ZXN0UmVmKGhhbmRsZUNsb3NlKTtcbiAgY29uc3QgZGVsYXlSZWYgPSB1c2VMYXRlc3RSZWYoZGVsYXkpO1xuICBjb25zdCBwb2ludGVyVHlwZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBjb25zdCB0aW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKC0xKTtcbiAgY29uc3QgaGFuZGxlclJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBjb25zdCByZXN0VGltZW91dFJlZiA9IFJlYWN0LnVzZVJlZigtMSk7XG4gIGNvbnN0IGJsb2NrTW91c2VNb3ZlUmVmID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICBjb25zdCBwZXJmb3JtZWRQb2ludGVyRXZlbnRzTXV0YXRpb25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCB1bmJpbmRNb3VzZU1vdmVSZWYgPSBSZWFjdC51c2VSZWYoKCkgPT4ge30pO1xuICBjb25zdCBpc0hvdmVyT3BlbiA9IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICB2YXIgX2RhdGFSZWYkY3VycmVudCRvcGVuO1xuICAgIGNvbnN0IHR5cGUgPSAoX2RhdGFSZWYkY3VycmVudCRvcGVuID0gZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhUmVmJGN1cnJlbnQkb3Blbi50eXBlO1xuICAgIHJldHVybiAodHlwZSA9PSBudWxsID8gdm9pZCAwIDogdHlwZS5pbmNsdWRlcygnbW91c2UnKSkgJiYgdHlwZSAhPT0gJ21vdXNlZG93bic7XG4gIH0sIFtkYXRhUmVmXSk7XG5cbiAgLy8gV2hlbiBjbG9zaW5nIGJlZm9yZSBvcGVuaW5nLCBjbGVhciB0aGUgZGVsYXkgdGltZW91dHMgdG8gY2FuY2VsIGl0XG4gIC8vIGZyb20gc2hvd2luZy5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZnVuY3Rpb24gb25PcGVuQ2hhbmdlKF9yZWYpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIG9wZW5cbiAgICAgIH0gPSBfcmVmO1xuICAgICAgaWYgKCFvcGVuKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICBjbGVhclRpbWVvdXQocmVzdFRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICAgIGJsb2NrTW91c2VNb3ZlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBldmVudHMub24oJ29wZW5jaGFuZ2UnLCBvbk9wZW5DaGFuZ2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBldmVudHMub2ZmKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICB9O1xuICB9LCBbZW5hYmxlZCwgZXZlbnRzXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkIHx8ICFoYW5kbGVDbG9zZVJlZi5jdXJyZW50IHx8ICFvcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uTGVhdmUoZXZlbnQpIHtcbiAgICAgIGlmIChpc0hvdmVyT3BlbigpKSB7XG4gICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsICdob3ZlcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBodG1sID0gZ2V0RG9jdW1lbnQoZmxvYXRpbmcpLmRvY3VtZW50RWxlbWVudDtcbiAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvbkxlYXZlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaHRtbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25MZWF2ZSk7XG4gICAgfTtcbiAgfSwgW2Zsb2F0aW5nLCBvcGVuLCBvbk9wZW5DaGFuZ2UsIGVuYWJsZWQsIGhhbmRsZUNsb3NlUmVmLCBpc0hvdmVyT3Blbl0pO1xuICBjb25zdCBjbG9zZVdpdGhEZWxheSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCwgcnVuRWxzZUJyYW5jaCwgcmVhc29uKSB7XG4gICAgaWYgKHJ1bkVsc2VCcmFuY2ggPT09IHZvaWQgMCkge1xuICAgICAgcnVuRWxzZUJyYW5jaCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChyZWFzb24gPT09IHZvaWQgMCkge1xuICAgICAgcmVhc29uID0gJ2hvdmVyJztcbiAgICB9XG4gICAgY29uc3QgY2xvc2VEZWxheSA9IGdldERlbGF5KGRlbGF5UmVmLmN1cnJlbnQsICdjbG9zZScsIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQpO1xuICAgIGlmIChjbG9zZURlbGF5ICYmICFoYW5kbGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudCwgcmVhc29uKSwgY2xvc2VEZWxheSk7XG4gICAgfSBlbHNlIGlmIChydW5FbHNlQnJhbmNoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsIHJlYXNvbik7XG4gICAgfVxuICB9LCBbZGVsYXlSZWYsIG9uT3BlbkNoYW5nZV0pO1xuICBjb25zdCBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlciA9IHVzZUVmZmVjdEV2ZW50KCgpID0+IHtcbiAgICB1bmJpbmRNb3VzZU1vdmVSZWYuY3VycmVudCgpO1xuICAgIGhhbmRsZXJSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgfSk7XG4gIGNvbnN0IGNsZWFyUG9pbnRlckV2ZW50cyA9IHVzZUVmZmVjdEV2ZW50KCgpID0+IHtcbiAgICBpZiAocGVyZm9ybWVkUG9pbnRlckV2ZW50c011dGF0aW9uUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBnZXREb2N1bWVudChmbG9hdGluZykuYm9keTtcbiAgICAgIGJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgYm9keS5yZW1vdmVBdHRyaWJ1dGUoc2FmZVBvbHlnb25JZGVudGlmaWVyKTtcbiAgICAgIHBlcmZvcm1lZFBvaW50ZXJFdmVudHNNdXRhdGlvblJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICAvLyBSZWdpc3RlcmluZyB0aGUgbW91c2UgZXZlbnRzIG9uIHRoZSByZWZlcmVuY2UgZGlyZWN0bHkgdG8gYnlwYXNzIFJlYWN0J3NcbiAgLy8gZGVsZWdhdGlvbiBzeXN0ZW0uIElmIHRoZSBjdXJzb3Igd2FzIG9uIGEgZGlzYWJsZWQgZWxlbWVudCBhbmQgdGhlbiBlbnRlcmVkXG4gIC8vIHRoZSByZWZlcmVuY2UgKG5vIGdhcCksIGBtb3VzZWVudGVyYCBkb2Vzbid0IGZpcmUgaW4gdGhlIGRlbGVnYXRpb24gc3lzdGVtLlxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0NsaWNrTGlrZU9wZW5FdmVudCgpIHtcbiAgICAgIHJldHVybiBkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ID8gWydjbGljaycsICdtb3VzZWRvd24nXS5pbmNsdWRlcyhkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50LnR5cGUpIDogZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uTW91c2VFbnRlcihldmVudCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICBibG9ja01vdXNlTW92ZVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBpZiAobW91c2VPbmx5ICYmICFpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQpIHx8IHJlc3RNcyA+IDAgJiYgIWdldERlbGF5KGRlbGF5UmVmLmN1cnJlbnQsICdvcGVuJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3BlbkRlbGF5ID0gZ2V0RGVsYXkoZGVsYXlSZWYuY3VycmVudCwgJ29wZW4nLCBwb2ludGVyVHlwZVJlZi5jdXJyZW50KTtcbiAgICAgIGlmIChvcGVuRGVsYXkpIHtcbiAgICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudCwgJ2hvdmVyJyk7XG4gICAgICAgIH0sIG9wZW5EZWxheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQsICdob3ZlcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoZXZlbnQpIHtcbiAgICAgIGlmIChpc0NsaWNrTGlrZU9wZW5FdmVudCgpKSByZXR1cm47XG4gICAgICB1bmJpbmRNb3VzZU1vdmVSZWYuY3VycmVudCgpO1xuICAgICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoZmxvYXRpbmcpO1xuICAgICAgY2xlYXJUaW1lb3V0KHJlc3RUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgaWYgKGhhbmRsZUNsb3NlUmVmLmN1cnJlbnQgJiYgZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCkge1xuICAgICAgICAvLyBQcmV2ZW50IGNsZWFyaW5nIGBvblNjcm9sbE1vdXNlTGVhdmVgIHRpbWVvdXQuXG4gICAgICAgIGlmICghb3Blbikge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZXJSZWYuY3VycmVudCA9IGhhbmRsZUNsb3NlUmVmLmN1cnJlbnQoe1xuICAgICAgICAgIC4uLmRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQsXG4gICAgICAgICAgdHJlZSxcbiAgICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICAgIHk6IGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgb25DbG9zZSgpIHtcbiAgICAgICAgICAgIGNsZWFyUG9pbnRlckV2ZW50cygpO1xuICAgICAgICAgICAgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIoKTtcbiAgICAgICAgICAgIGNsb3NlV2l0aERlbGF5KGV2ZW50LCB0cnVlLCAnc2FmZS1wb2x5Z29uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJSZWYuY3VycmVudDtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZXIpO1xuICAgICAgICB1bmJpbmRNb3VzZU1vdmVSZWYuY3VycmVudCA9ICgpID0+IHtcbiAgICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlcik7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQWxsb3cgaW50ZXJhY3Rpdml0eSB3aXRob3V0IGBzYWZlUG9seWdvbmAgb24gdG91Y2ggZGV2aWNlcy4gV2l0aCBhXG4gICAgICAvLyBwb2ludGVyLCBhIHNob3J0IGNsb3NlIGRlbGF5IGlzIGFuIGFsdGVybmF0aXZlLCBzbyBpdCBzaG91bGQgd29ya1xuICAgICAgLy8gY29uc2lzdGVudGx5LlxuICAgICAgY29uc3Qgc2hvdWxkQ2xvc2UgPSBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID09PSAndG91Y2gnID8gIWNvbnRhaW5zKGZsb2F0aW5nLCBldmVudC5yZWxhdGVkVGFyZ2V0KSA6IHRydWU7XG4gICAgICBpZiAoc2hvdWxkQ2xvc2UpIHtcbiAgICAgICAgY2xvc2VXaXRoRGVsYXkoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBjbG9zZXMgYWZ0ZXIgc2Nyb2xsaW5nIGV2ZW4gaWYgdGhlIHBvaW50ZXJcbiAgICAvLyBkaWQgbm90IG1vdmUuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2Rpc2N1c3Npb25zLzE2OTJcbiAgICBmdW5jdGlvbiBvblNjcm9sbE1vdXNlTGVhdmUoZXZlbnQpIHtcbiAgICAgIGlmIChpc0NsaWNrTGlrZU9wZW5FdmVudCgpKSByZXR1cm47XG4gICAgICBpZiAoIWRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQpIHJldHVybjtcbiAgICAgIGhhbmRsZUNsb3NlUmVmLmN1cnJlbnQgPT0gbnVsbCB8fCBoYW5kbGVDbG9zZVJlZi5jdXJyZW50KHtcbiAgICAgICAgLi4uZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCxcbiAgICAgICAgdHJlZSxcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSxcbiAgICAgICAgb25DbG9zZSgpIHtcbiAgICAgICAgICBjbGVhclBvaW50ZXJFdmVudHMoKTtcbiAgICAgICAgICBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlcigpO1xuICAgICAgICAgIGNsb3NlV2l0aERlbGF5KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSkoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KGRvbVJlZmVyZW5jZSkpIHtcbiAgICAgIGNvbnN0IHJlZiA9IGRvbVJlZmVyZW5jZTtcbiAgICAgIG9wZW4gJiYgcmVmLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblNjcm9sbE1vdXNlTGVhdmUpO1xuICAgICAgZmxvYXRpbmcgPT0gbnVsbCB8fCBmbG9hdGluZy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25TY3JvbGxNb3VzZUxlYXZlKTtcbiAgICAgIG1vdmUgJiYgcmVmLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VFbnRlciwge1xuICAgICAgICBvbmNlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJlZi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgb25Nb3VzZUVudGVyKTtcbiAgICAgIHJlZi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25Nb3VzZUxlYXZlKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIG9wZW4gJiYgcmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblNjcm9sbE1vdXNlTGVhdmUpO1xuICAgICAgICBmbG9hdGluZyA9PSBudWxsIHx8IGZsb2F0aW5nLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblNjcm9sbE1vdXNlTGVhdmUpO1xuICAgICAgICBtb3ZlICYmIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlRW50ZXIpO1xuICAgICAgICByZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIG9uTW91c2VFbnRlcik7XG4gICAgICAgIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25Nb3VzZUxlYXZlKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZG9tUmVmZXJlbmNlLCBmbG9hdGluZywgZW5hYmxlZCwgY29udGV4dCwgbW91c2VPbmx5LCByZXN0TXMsIG1vdmUsIGNsb3NlV2l0aERlbGF5LCBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlciwgY2xlYXJQb2ludGVyRXZlbnRzLCBvbk9wZW5DaGFuZ2UsIG9wZW4sIHRyZWUsIGRlbGF5UmVmLCBoYW5kbGVDbG9zZVJlZiwgZGF0YVJlZl0pO1xuXG4gIC8vIEJsb2NrIHBvaW50ZXItZXZlbnRzIG9mIGV2ZXJ5IGVsZW1lbnQgb3RoZXIgdGhhbiB0aGUgcmVmZXJlbmNlIGFuZCBmbG9hdGluZ1xuICAvLyB3aGlsZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBpcyBvcGVuIGFuZCBoYXMgYSBgaGFuZGxlQ2xvc2VgIGhhbmRsZXIuIEFsc29cbiAgLy8gaGFuZGxlcyBuZXN0ZWQgZmxvYXRpbmcgZWxlbWVudHMuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMTcyMlxuICBpbmRleCgoKSA9PiB7XG4gICAgdmFyIF9oYW5kbGVDbG9zZVJlZiRjdXJyZTtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wZW4gJiYgKF9oYW5kbGVDbG9zZVJlZiRjdXJyZSA9IGhhbmRsZUNsb3NlUmVmLmN1cnJlbnQpICE9IG51bGwgJiYgX2hhbmRsZUNsb3NlUmVmJGN1cnJlLl9fb3B0aW9ucy5ibG9ja1BvaW50ZXJFdmVudHMgJiYgaXNIb3Zlck9wZW4oKSkge1xuICAgICAgY29uc3QgYm9keSA9IGdldERvY3VtZW50KGZsb2F0aW5nKS5ib2R5O1xuICAgICAgYm9keS5zZXRBdHRyaWJ1dGUoc2FmZVBvbHlnb25JZGVudGlmaWVyLCAnJyk7XG4gICAgICBib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICBwZXJmb3JtZWRQb2ludGVyRXZlbnRzTXV0YXRpb25SZWYuY3VycmVudCA9IHRydWU7XG4gICAgICBpZiAoaXNFbGVtZW50KGRvbVJlZmVyZW5jZSkgJiYgZmxvYXRpbmcpIHtcbiAgICAgICAgdmFyIF90cmVlJG5vZGVzUmVmJGN1cnJlbjtcbiAgICAgICAgY29uc3QgcmVmID0gZG9tUmVmZXJlbmNlO1xuICAgICAgICBjb25zdCBwYXJlbnRGbG9hdGluZyA9IHRyZWUgPT0gbnVsbCB8fCAoX3RyZWUkbm9kZXNSZWYkY3VycmVuID0gdHJlZS5ub2Rlc1JlZi5jdXJyZW50LmZpbmQobm9kZSA9PiBub2RlLmlkID09PSBwYXJlbnRJZCkpID09IG51bGwgfHwgKF90cmVlJG5vZGVzUmVmJGN1cnJlbiA9IF90cmVlJG5vZGVzUmVmJGN1cnJlbi5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX3RyZWUkbm9kZXNSZWYkY3VycmVuLmVsZW1lbnRzLmZsb2F0aW5nO1xuICAgICAgICBpZiAocGFyZW50RmxvYXRpbmcpIHtcbiAgICAgICAgICBwYXJlbnRGbG9hdGluZy5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmVmLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIGZsb2F0aW5nLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgcmVmLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgICBmbG9hdGluZy5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgb3BlbiwgcGFyZW50SWQsIGZsb2F0aW5nLCBkb21SZWZlcmVuY2UsIHRyZWUsIGhhbmRsZUNsb3NlUmVmLCBpc0hvdmVyT3Blbl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIoKTtcbiAgICAgIGNsZWFyUG9pbnRlckV2ZW50cygpO1xuICAgIH1cbiAgfSwgW29wZW4sIGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyLCBjbGVhclBvaW50ZXJFdmVudHNdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIoKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgY2xlYXJUaW1lb3V0KHJlc3RUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgY2xlYXJQb2ludGVyRXZlbnRzKCk7XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIGRvbVJlZmVyZW5jZSwgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIsIGNsZWFyUG9pbnRlckV2ZW50c10pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFBvaW50ZXJSZWYoZXZlbnQpIHtcbiAgICAgIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPSBldmVudC5wb2ludGVyVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICBvblBvaW50ZXJEb3duOiBzZXRQb2ludGVyUmVmLFxuICAgICAgICBvblBvaW50ZXJFbnRlcjogc2V0UG9pbnRlclJlZixcbiAgICAgICAgb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoKSB7XG4gICAgICAgICAgICBpZiAoIWJsb2NrTW91c2VNb3ZlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnaG92ZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1vdXNlT25seSAmJiAhaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZVJlZi5jdXJyZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3BlbiB8fCByZXN0TXMgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHJlc3RUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICAgIGlmIChwb2ludGVyVHlwZVJlZi5jdXJyZW50ID09PSAndG91Y2gnKSB7XG4gICAgICAgICAgICBoYW5kbGVNb3VzZU1vdmUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdFRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGhhbmRsZU1vdXNlTW92ZSwgcmVzdE1zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmbG9hdGluZzoge1xuICAgICAgICBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTW91c2VMZWF2ZShldmVudCkge1xuICAgICAgICAgIGNsb3NlV2l0aERlbGF5KGV2ZW50Lm5hdGl2ZUV2ZW50LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LCBbZW5hYmxlZCwgbW91c2VPbmx5LCBvcGVuLCByZXN0TXMsIG9uT3BlbkNoYW5nZSwgY2xvc2VXaXRoRGVsYXldKTtcbn1cblxuY29uc3QgTk9PUCA9ICgpID0+IHt9O1xuY29uc3QgRmxvYXRpbmdEZWxheUdyb3VwQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgZGVsYXk6IDAsXG4gIGluaXRpYWxEZWxheTogMCxcbiAgdGltZW91dE1zOiAwLFxuICBjdXJyZW50SWQ6IG51bGwsXG4gIHNldEN1cnJlbnRJZDogTk9PUCxcbiAgc2V0U3RhdGU6IE5PT1AsXG4gIGlzSW5zdGFudFBoYXNlOiBmYWxzZVxufSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVzZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGB1c2VEZWxheUdyb3VwKClgIGluc3RlYWQuXG4gKi9cbmNvbnN0IHVzZURlbGF5R3JvdXBDb250ZXh0ID0gKCkgPT4gUmVhY3QudXNlQ29udGV4dChGbG9hdGluZ0RlbGF5R3JvdXBDb250ZXh0KTtcbi8qKlxuICogUHJvdmlkZXMgY29udGV4dCBmb3IgYSBncm91cCBvZiBmbG9hdGluZyBlbGVtZW50cyB0aGF0IHNob3VsZCBzaGFyZSBhXG4gKiBgZGVsYXlgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nRGVsYXlHcm91cFxuICovXG5mdW5jdGlvbiBGbG9hdGluZ0RlbGF5R3JvdXAocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGRlbGF5LFxuICAgIHRpbWVvdXRNcyA9IDBcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IFJlYWN0LnVzZVJlZHVjZXIoKHByZXYsIG5leHQpID0+ICh7XG4gICAgLi4ucHJldixcbiAgICAuLi5uZXh0XG4gIH0pLCB7XG4gICAgZGVsYXksXG4gICAgdGltZW91dE1zLFxuICAgIGluaXRpYWxEZWxheTogZGVsYXksXG4gICAgY3VycmVudElkOiBudWxsLFxuICAgIGlzSW5zdGFudFBoYXNlOiBmYWxzZVxuICB9KTtcbiAgY29uc3QgaW5pdGlhbEN1cnJlbnRJZFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2V0Q3VycmVudElkID0gUmVhY3QudXNlQ2FsbGJhY2soY3VycmVudElkID0+IHtcbiAgICBzZXRTdGF0ZSh7XG4gICAgICBjdXJyZW50SWRcbiAgICB9KTtcbiAgfSwgW10pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKHN0YXRlLmN1cnJlbnRJZCkge1xuICAgICAgaWYgKGluaXRpYWxDdXJyZW50SWRSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICBpbml0aWFsQ3VycmVudElkUmVmLmN1cnJlbnQgPSBzdGF0ZS5jdXJyZW50SWQ7XG4gICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5pc0luc3RhbnRQaGFzZSkge1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgaXNJbnN0YW50UGhhc2U6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0ZS5pc0luc3RhbnRQaGFzZSkge1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgaXNJbnN0YW50UGhhc2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaW5pdGlhbEN1cnJlbnRJZFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH0sIFtzdGF0ZS5jdXJyZW50SWQsIHN0YXRlLmlzSW5zdGFudFBoYXNlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGbG9hdGluZ0RlbGF5R3JvdXBDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2V0U3RhdGUsXG4gICAgICBzZXRDdXJyZW50SWRcbiAgICB9KSwgW3N0YXRlLCBzZXRDdXJyZW50SWRdKVxuICB9LCBjaGlsZHJlbik7XG59XG4vKipcbiAqIEVuYWJsZXMgZ3JvdXBpbmcgd2hlbiBjYWxsZWQgaW5zaWRlIGEgY29tcG9uZW50IHRoYXQncyBhIGNoaWxkIG9mIGFcbiAqIGBGbG9hdGluZ0RlbGF5R3JvdXBgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nRGVsYXlHcm91cFxuICovXG5mdW5jdGlvbiB1c2VEZWxheUdyb3VwKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZmxvYXRpbmdJZFxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGlkOiBvcHRpb25JZFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaWQgPSBvcHRpb25JZCAhPSBudWxsID8gb3B0aW9uSWQgOiBmbG9hdGluZ0lkO1xuICBjb25zdCBncm91cENvbnRleHQgPSB1c2VEZWxheUdyb3VwQ29udGV4dCgpO1xuICBjb25zdCB7XG4gICAgY3VycmVudElkLFxuICAgIHNldEN1cnJlbnRJZCxcbiAgICBpbml0aWFsRGVsYXksXG4gICAgc2V0U3RhdGUsXG4gICAgdGltZW91dE1zXG4gIH0gPSBncm91cENvbnRleHQ7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWN1cnJlbnRJZCkgcmV0dXJuO1xuICAgIHNldFN0YXRlKHtcbiAgICAgIGRlbGF5OiB7XG4gICAgICAgIG9wZW46IDEsXG4gICAgICAgIGNsb3NlOiBnZXREZWxheShpbml0aWFsRGVsYXksICdjbG9zZScpXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGN1cnJlbnRJZCAhPT0gaWQpIHtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgfVxuICB9LCBbaWQsIG9uT3BlbkNoYW5nZSwgc2V0U3RhdGUsIGN1cnJlbnRJZCwgaW5pdGlhbERlbGF5XSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBmdW5jdGlvbiB1bnNldCgpIHtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGRlbGF5OiBpbml0aWFsRGVsYXksXG4gICAgICAgIGN1cnJlbnRJZDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghY3VycmVudElkKSByZXR1cm47XG4gICAgaWYgKCFvcGVuICYmIGN1cnJlbnRJZCA9PT0gaWQpIHtcbiAgICAgIGlmICh0aW1lb3V0TXMpIHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KHVuc2V0LCB0aW1lb3V0TXMpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHVuc2V0KCk7XG4gICAgfVxuICB9LCBbb3Blbiwgc2V0U3RhdGUsIGN1cnJlbnRJZCwgaWQsIG9uT3BlbkNoYW5nZSwgaW5pdGlhbERlbGF5LCB0aW1lb3V0TXNdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChzZXRDdXJyZW50SWQgPT09IE5PT1AgfHwgIW9wZW4pIHJldHVybjtcbiAgICBzZXRDdXJyZW50SWQoaWQpO1xuICB9LCBbb3Blbiwgc2V0Q3VycmVudElkLCBpZF0pO1xuICByZXR1cm4gZ3JvdXBDb250ZXh0O1xufVxuXG5mdW5jdGlvbiBnZXRBbmNlc3RvcnMobm9kZXMsIGlkKSB7XG4gIHZhciBfbm9kZXMkZmluZDtcbiAgbGV0IGFsbEFuY2VzdG9ycyA9IFtdO1xuICBsZXQgY3VycmVudFBhcmVudElkID0gKF9ub2RlcyRmaW5kID0gbm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IGlkKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlcyRmaW5kLnBhcmVudElkO1xuICB3aGlsZSAoY3VycmVudFBhcmVudElkKSB7XG4gICAgY29uc3QgY3VycmVudE5vZGUgPSBub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gY3VycmVudFBhcmVudElkKTtcbiAgICBjdXJyZW50UGFyZW50SWQgPSBjdXJyZW50Tm9kZSA9PSBudWxsID8gdm9pZCAwIDogY3VycmVudE5vZGUucGFyZW50SWQ7XG4gICAgaWYgKGN1cnJlbnROb2RlKSB7XG4gICAgICBhbGxBbmNlc3RvcnMgPSBhbGxBbmNlc3RvcnMuY29uY2F0KGN1cnJlbnROb2RlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFsbEFuY2VzdG9ycztcbn1cblxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obm9kZXMsIGlkKSB7XG4gIGxldCBhbGxDaGlsZHJlbiA9IG5vZGVzLmZpbHRlcihub2RlID0+IHtcbiAgICB2YXIgX25vZGUkY29udGV4dDtcbiAgICByZXR1cm4gbm9kZS5wYXJlbnRJZCA9PT0gaWQgJiYgKChfbm9kZSRjb250ZXh0ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dC5vcGVuKTtcbiAgfSk7XG4gIGxldCBjdXJyZW50Q2hpbGRyZW4gPSBhbGxDaGlsZHJlbjtcbiAgd2hpbGUgKGN1cnJlbnRDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBjdXJyZW50Q2hpbGRyZW4gPSBub2Rlcy5maWx0ZXIobm9kZSA9PiB7XG4gICAgICB2YXIgX2N1cnJlbnRDaGlsZHJlbjtcbiAgICAgIHJldHVybiAoX2N1cnJlbnRDaGlsZHJlbiA9IGN1cnJlbnRDaGlsZHJlbikgPT0gbnVsbCA/IHZvaWQgMCA6IF9jdXJyZW50Q2hpbGRyZW4uc29tZShuID0+IHtcbiAgICAgICAgdmFyIF9ub2RlJGNvbnRleHQyO1xuICAgICAgICByZXR1cm4gbm9kZS5wYXJlbnRJZCA9PT0gbi5pZCAmJiAoKF9ub2RlJGNvbnRleHQyID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDIub3Blbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBhbGxDaGlsZHJlbiA9IGFsbENoaWxkcmVuLmNvbmNhdChjdXJyZW50Q2hpbGRyZW4pO1xuICB9XG4gIHJldHVybiBhbGxDaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGdldERlZXBlc3ROb2RlKG5vZGVzLCBpZCkge1xuICBsZXQgZGVlcGVzdE5vZGVJZDtcbiAgbGV0IG1heERlcHRoID0gLTE7XG4gIGZ1bmN0aW9uIGZpbmREZWVwZXN0KG5vZGVJZCwgZGVwdGgpIHtcbiAgICBpZiAoZGVwdGggPiBtYXhEZXB0aCkge1xuICAgICAgZGVlcGVzdE5vZGVJZCA9IG5vZGVJZDtcbiAgICAgIG1heERlcHRoID0gZGVwdGg7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4obm9kZXMsIG5vZGVJZCk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICBmaW5kRGVlcGVzdChjaGlsZC5pZCwgZGVwdGggKyAxKTtcbiAgICB9KTtcbiAgfVxuICBmaW5kRGVlcGVzdChpZCwgMCk7XG4gIHJldHVybiBub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gZGVlcGVzdE5vZGVJZCk7XG59XG5cbi8vIE1vZGlmaWVkIHRvIGFkZCBjb25kaXRpb25hbCBgYXJpYS1oaWRkZW5gIHN1cHBvcnQ6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L2FyaWEtaGlkZGVuL2Jsb2IvOTIyMGM4ZjRhNGZkMzVmNjNiZWU1NTEwYTlmNDFhMzcyNjQzODJkNC9zcmMvaW5kZXgudHNcbmxldCBjb3VudGVyTWFwID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG5sZXQgdW5jb250cm9sbGVkRWxlbWVudHNTZXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbmxldCBtYXJrZXJNYXAgPSB7fTtcbmxldCBsb2NrQ291bnQgPSAwO1xuY29uc3Qgc3VwcG9ydHNJbmVydCA9ICgpID0+IHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2luZXJ0JyBpbiBIVE1MRWxlbWVudC5wcm90b3R5cGU7XG5jb25zdCB1bndyYXBIb3N0ID0gbm9kZSA9PiBub2RlICYmIChub2RlLmhvc3QgfHwgdW53cmFwSG9zdChub2RlLnBhcmVudE5vZGUpKTtcbmNvbnN0IGNvcnJlY3RFbGVtZW50cyA9IChwYXJlbnQsIHRhcmdldHMpID0+IHRhcmdldHMubWFwKHRhcmdldCA9PiB7XG4gIGlmIChwYXJlbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgY29uc3QgY29ycmVjdGVkVGFyZ2V0ID0gdW53cmFwSG9zdCh0YXJnZXQpO1xuICBpZiAocGFyZW50LmNvbnRhaW5zKGNvcnJlY3RlZFRhcmdldCkpIHtcbiAgICByZXR1cm4gY29ycmVjdGVkVGFyZ2V0O1xuICB9XG4gIHJldHVybiBudWxsO1xufSkuZmlsdGVyKHggPT4geCAhPSBudWxsKTtcbmZ1bmN0aW9uIGFwcGx5QXR0cmlidXRlVG9PdGhlcnModW5jb3JyZWN0ZWRBdm9pZEVsZW1lbnRzLCBib2R5LCBhcmlhSGlkZGVuLCBpbmVydCkge1xuICBjb25zdCBtYXJrZXJOYW1lID0gJ2RhdGEtZmxvYXRpbmctdWktaW5lcnQnO1xuICBjb25zdCBjb250cm9sQXR0cmlidXRlID0gaW5lcnQgPyAnaW5lcnQnIDogYXJpYUhpZGRlbiA/ICdhcmlhLWhpZGRlbicgOiBudWxsO1xuICBjb25zdCBhdm9pZEVsZW1lbnRzID0gY29ycmVjdEVsZW1lbnRzKGJvZHksIHVuY29ycmVjdGVkQXZvaWRFbGVtZW50cyk7XG4gIGNvbnN0IGVsZW1lbnRzVG9LZWVwID0gbmV3IFNldCgpO1xuICBjb25zdCBlbGVtZW50c1RvU3RvcCA9IG5ldyBTZXQoYXZvaWRFbGVtZW50cyk7XG4gIGNvbnN0IGhpZGRlbkVsZW1lbnRzID0gW107XG4gIGlmICghbWFya2VyTWFwW21hcmtlck5hbWVdKSB7XG4gICAgbWFya2VyTWFwW21hcmtlck5hbWVdID0gbmV3IFdlYWtNYXAoKTtcbiAgfVxuICBjb25zdCBtYXJrZXJDb3VudGVyID0gbWFya2VyTWFwW21hcmtlck5hbWVdO1xuICBhdm9pZEVsZW1lbnRzLmZvckVhY2goa2VlcCk7XG4gIGRlZXAoYm9keSk7XG4gIGVsZW1lbnRzVG9LZWVwLmNsZWFyKCk7XG4gIGZ1bmN0aW9uIGtlZXAoZWwpIHtcbiAgICBpZiAoIWVsIHx8IGVsZW1lbnRzVG9LZWVwLmhhcyhlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudHNUb0tlZXAuYWRkKGVsKTtcbiAgICBlbC5wYXJlbnROb2RlICYmIGtlZXAoZWwucGFyZW50Tm9kZSk7XG4gIH1cbiAgZnVuY3Rpb24gZGVlcChwYXJlbnQpIHtcbiAgICBpZiAoIXBhcmVudCB8fCBlbGVtZW50c1RvU3RvcC5oYXMocGFyZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBbXS5mb3JFYWNoLmNhbGwocGFyZW50LmNoaWxkcmVuLCBub2RlID0+IHtcbiAgICAgIGlmIChnZXROb2RlTmFtZShub2RlKSA9PT0gJ3NjcmlwdCcpIHJldHVybjtcbiAgICAgIGlmIChlbGVtZW50c1RvS2VlcC5oYXMobm9kZSkpIHtcbiAgICAgICAgZGVlcChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGF0dHIgPSBjb250cm9sQXR0cmlidXRlID8gbm9kZS5nZXRBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSkgOiBudWxsO1xuICAgICAgICBjb25zdCBhbHJlYWR5SGlkZGVuID0gYXR0ciAhPT0gbnVsbCAmJiBhdHRyICE9PSAnZmFsc2UnO1xuICAgICAgICBjb25zdCBjb3VudGVyVmFsdWUgPSAoY291bnRlck1hcC5nZXQobm9kZSkgfHwgMCkgKyAxO1xuICAgICAgICBjb25zdCBtYXJrZXJWYWx1ZSA9IChtYXJrZXJDb3VudGVyLmdldChub2RlKSB8fCAwKSArIDE7XG4gICAgICAgIGNvdW50ZXJNYXAuc2V0KG5vZGUsIGNvdW50ZXJWYWx1ZSk7XG4gICAgICAgIG1hcmtlckNvdW50ZXIuc2V0KG5vZGUsIG1hcmtlclZhbHVlKTtcbiAgICAgICAgaGlkZGVuRWxlbWVudHMucHVzaChub2RlKTtcbiAgICAgICAgaWYgKGNvdW50ZXJWYWx1ZSA9PT0gMSAmJiBhbHJlYWR5SGlkZGVuKSB7XG4gICAgICAgICAgdW5jb250cm9sbGVkRWxlbWVudHNTZXQuYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrZXJWYWx1ZSA9PT0gMSkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG1hcmtlck5hbWUsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFscmVhZHlIaWRkZW4gJiYgY29udHJvbEF0dHJpYnV0ZSkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGNvbnRyb2xBdHRyaWJ1dGUsICd0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBsb2NrQ291bnQrKztcbiAgcmV0dXJuICgpID0+IHtcbiAgICBoaWRkZW5FbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgY291bnRlclZhbHVlID0gKGNvdW50ZXJNYXAuZ2V0KGVsZW1lbnQpIHx8IDApIC0gMTtcbiAgICAgIGNvbnN0IG1hcmtlclZhbHVlID0gKG1hcmtlckNvdW50ZXIuZ2V0KGVsZW1lbnQpIHx8IDApIC0gMTtcbiAgICAgIGNvdW50ZXJNYXAuc2V0KGVsZW1lbnQsIGNvdW50ZXJWYWx1ZSk7XG4gICAgICBtYXJrZXJDb3VudGVyLnNldChlbGVtZW50LCBtYXJrZXJWYWx1ZSk7XG4gICAgICBpZiAoIWNvdW50ZXJWYWx1ZSkge1xuICAgICAgICBpZiAoIXVuY29udHJvbGxlZEVsZW1lbnRzU2V0LmhhcyhlbGVtZW50KSAmJiBjb250cm9sQXR0cmlidXRlKSB7XG4gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5jb250cm9sbGVkRWxlbWVudHNTZXQuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgaWYgKCFtYXJrZXJWYWx1ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShtYXJrZXJOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsb2NrQ291bnQtLTtcbiAgICBpZiAoIWxvY2tDb3VudCkge1xuICAgICAgY291bnRlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICBjb3VudGVyTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHVuY29udHJvbGxlZEVsZW1lbnRzU2V0ID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgIG1hcmtlck1hcCA9IHt9O1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIG1hcmtPdGhlcnMoYXZvaWRFbGVtZW50cywgYXJpYUhpZGRlbiwgaW5lcnQpIHtcbiAgaWYgKGFyaWFIaWRkZW4gPT09IHZvaWQgMCkge1xuICAgIGFyaWFIaWRkZW4gPSBmYWxzZTtcbiAgfVxuICBpZiAoaW5lcnQgPT09IHZvaWQgMCkge1xuICAgIGluZXJ0ID0gZmFsc2U7XG4gIH1cbiAgY29uc3QgYm9keSA9IGdldERvY3VtZW50KGF2b2lkRWxlbWVudHNbMF0pLmJvZHk7XG4gIHJldHVybiBhcHBseUF0dHJpYnV0ZVRvT3RoZXJzKGF2b2lkRWxlbWVudHMuY29uY2F0KEFycmF5LmZyb20oYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbYXJpYS1saXZlXScpKSksIGJvZHksIGFyaWFIaWRkZW4sIGluZXJ0KTtcbn1cblxuY29uc3QgZ2V0VGFiYmFibGVPcHRpb25zID0gKCkgPT4gKHtcbiAgZ2V0U2hhZG93Um9vdDogdHJ1ZSxcbiAgZGlzcGxheUNoZWNrOlxuICAvLyBKU0RPTSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgdGFiYmFibGVgIGxpYnJhcnkuIFRvIHNvbHZlIHRoaXMgd2UgY2FuXG4gIC8vIGNoZWNrIGlmIGBSZXNpemVPYnNlcnZlcmAgaXMgYSByZWFsIGZ1bmN0aW9uIChub3QgcG9seWZpbGxlZCksIHdoaWNoXG4gIC8vIGRldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgSlNET00tbGlrZS5cbiAgdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAnZnVuY3Rpb24nICYmIFJlc2l6ZU9ic2VydmVyLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1tuYXRpdmUgY29kZV0nKSA/ICdmdWxsJyA6ICdub25lJ1xufSk7XG5mdW5jdGlvbiBnZXRUYWJiYWJsZUluKGNvbnRhaW5lciwgZGlyZWN0aW9uKSB7XG4gIGNvbnN0IGFsbFRhYmJhYmxlID0gdGFiYmFibGUoY29udGFpbmVyLCBnZXRUYWJiYWJsZU9wdGlvbnMoKSk7XG4gIGlmIChkaXJlY3Rpb24gPT09ICdwcmV2Jykge1xuICAgIGFsbFRhYmJhYmxlLnJldmVyc2UoKTtcbiAgfVxuICBjb25zdCBhY3RpdmVJbmRleCA9IGFsbFRhYmJhYmxlLmluZGV4T2YoYWN0aXZlRWxlbWVudChnZXREb2N1bWVudChjb250YWluZXIpKSk7XG4gIGNvbnN0IG5leHRUYWJiYWJsZUVsZW1lbnRzID0gYWxsVGFiYmFibGUuc2xpY2UoYWN0aXZlSW5kZXggKyAxKTtcbiAgcmV0dXJuIG5leHRUYWJiYWJsZUVsZW1lbnRzWzBdO1xufVxuZnVuY3Rpb24gZ2V0TmV4dFRhYmJhYmxlKCkge1xuICByZXR1cm4gZ2V0VGFiYmFibGVJbihkb2N1bWVudC5ib2R5LCAnbmV4dCcpO1xufVxuZnVuY3Rpb24gZ2V0UHJldmlvdXNUYWJiYWJsZSgpIHtcbiAgcmV0dXJuIGdldFRhYmJhYmxlSW4oZG9jdW1lbnQuYm9keSwgJ3ByZXYnKTtcbn1cbmZ1bmN0aW9uIGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBjb250YWluZXIpIHtcbiAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lciB8fCBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgcmV0dXJuICFyZWxhdGVkVGFyZ2V0IHx8ICFjb250YWlucyhjb250YWluZXJFbGVtZW50LCByZWxhdGVkVGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIGRpc2FibGVGb2N1c0luc2lkZShjb250YWluZXIpIHtcbiAgY29uc3QgdGFiYmFibGVFbGVtZW50cyA9IHRhYmJhYmxlKGNvbnRhaW5lciwgZ2V0VGFiYmFibGVPcHRpb25zKCkpO1xuICB0YWJiYWJsZUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgZWxlbWVudC5kYXRhc2V0LnRhYmluZGV4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JykgfHwgJyc7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZW5hYmxlRm9jdXNJbnNpZGUoY29udGFpbmVyKSB7XG4gIGNvbnN0IGVsZW1lbnRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRhYmluZGV4XScpO1xuICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IHRhYmluZGV4ID0gZWxlbWVudC5kYXRhc2V0LnRhYmluZGV4O1xuICAgIGRlbGV0ZSBlbGVtZW50LmRhdGFzZXQudGFiaW5kZXg7XG4gICAgaWYgKHRhYmluZGV4KSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCB0YWJpbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIFNlZSBEaWVnbyBIYXoncyBTYW5kYm94IGZvciBtYWtpbmcgdGhpcyBsb2dpYyB3b3JrIHdlbGwgb24gU2FmYXJpL2lPUzpcbi8vIGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy90YWJiYWJsZS1wb3J0YWwtZjR0bmc/ZmlsZT0vc3JjL0ZvY3VzVHJhcC50c3hcblxuY29uc3QgSElEREVOX1NUWUxFUyA9IHtcbiAgYm9yZGVyOiAwLFxuICBjbGlwOiAncmVjdCgwIDAgMCAwKScsXG4gIGhlaWdodDogJzFweCcsXG4gIG1hcmdpbjogJy0xcHgnLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIHBhZGRpbmc6IDAsXG4gIHBvc2l0aW9uOiAnZml4ZWQnLFxuICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgd2lkdGg6ICcxcHgnLFxuICB0b3A6IDAsXG4gIGxlZnQ6IDBcbn07XG5sZXQgdGltZW91dElkO1xuZnVuY3Rpb24gc2V0QWN0aXZlRWxlbWVudE9uVGFiKGV2ZW50KSB7XG4gIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgZXZlbnQudGFyZ2V0O1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICB9XG59XG5jb25zdCBGb2N1c0d1YXJkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRm9jdXNHdWFyZChwcm9wcywgcmVmKSB7XG4gIGNvbnN0IFtyb2xlLCBzZXRSb2xlXSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoaXNTYWZhcmkoKSkge1xuICAgICAgLy8gVW5saWtlIG90aGVyIHNjcmVlbiByZWFkZXJzIHN1Y2ggYXMgTlZEQSBhbmQgSkFXUywgdGhlIHZpcnR1YWwgY3Vyc29yXG4gICAgICAvLyBvbiBWb2ljZU92ZXIgZG9lcyB0cmlnZ2VyIHRoZSBvbkZvY3VzIGV2ZW50LCBzbyB3ZSBjYW4gdXNlIHRoZSBmb2N1c1xuICAgICAgLy8gdHJhcCBlbGVtZW50LiBPbiBTYWZhcmksIG9ubHkgYnV0dG9ucyB0cmlnZ2VyIHRoZSBvbkZvY3VzIGV2ZW50LlxuICAgICAgLy8gTkI6IFwiZ3JvdXBcIiByb2xlIGluIHRoZSBTYW5kYm94IG5vIGxvbmdlciBhcHBlYXJzIHRvIHdvcmssIG11c3QgYmUgYVxuICAgICAgLy8gYnV0dG9uIHJvbGUuXG4gICAgICBzZXRSb2xlKCdidXR0b24nKTtcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHNldEFjdGl2ZUVsZW1lbnRPblRhYik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBzZXRBY3RpdmVFbGVtZW50T25UYWIpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgY29uc3QgcmVzdFByb3BzID0ge1xuICAgIHJlZixcbiAgICB0YWJJbmRleDogMCxcbiAgICAvLyBSb2xlIGlzIG9ubHkgZm9yIFZvaWNlT3ZlclxuICAgIHJvbGUsXG4gICAgJ2FyaWEtaGlkZGVuJzogcm9sZSA/IHVuZGVmaW5lZCA6IHRydWUsXG4gICAgW2NyZWF0ZUF0dHJpYnV0ZSgnZm9jdXMtZ3VhcmQnKV06ICcnLFxuICAgIHN0eWxlOiBISURERU5fU1RZTEVTXG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgX2V4dGVuZHMoe30sIHByb3BzLCByZXN0UHJvcHMpKTtcbn0pO1xuXG5jb25zdCBQb3J0YWxDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5jb25zdCBhdHRyID0gLyojX19QVVJFX18qL2NyZWF0ZUF0dHJpYnV0ZSgncG9ydGFsJyk7XG5cbi8qKlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nUG9ydGFsI3VzZWZsb2F0aW5ncG9ydGFsbm9kZVxuICovXG5mdW5jdGlvbiB1c2VGbG9hdGluZ1BvcnRhbE5vZGUocHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICByb290XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdW5pcXVlSWQgPSB1c2VJZCgpO1xuICBjb25zdCBwb3J0YWxDb250ZXh0ID0gdXNlUG9ydGFsQ29udGV4dCgpO1xuICBjb25zdCBbcG9ydGFsTm9kZSwgc2V0UG9ydGFsTm9kZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgcG9ydGFsTm9kZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwb3J0YWxOb2RlID09IG51bGwgfHwgcG9ydGFsTm9kZS5yZW1vdmUoKTtcbiAgICAgIC8vIEFsbG93IHRoZSBzdWJzZXF1ZW50IGxheW91dCBlZmZlY3RzIHRvIGNyZWF0ZSBhIG5ldyBub2RlIG9uIHVwZGF0ZXMuXG4gICAgICAvLyBUaGUgcG9ydGFsIG5vZGUgd2lsbCBzdGlsbCBiZSBjbGVhbmVkIHVwIG9uIHVubW91bnQuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzI0NTRcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgcG9ydGFsTm9kZVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sIFtwb3J0YWxOb2RlXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICAvLyBXYWl0IGZvciB0aGUgdW5pcXVlSWQgdG8gYmUgZ2VuZXJhdGVkIGJlZm9yZSBjcmVhdGluZyB0aGUgcG9ydGFsIG5vZGUgaW5cbiAgICAvLyBSZWFjdCA8MTggKHVzaW5nIGB1c2VGbG9hdGluZ0lkYCBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgYHVzZUlkYCkuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yNzc4XG4gICAgaWYgKCF1bmlxdWVJZCkgcmV0dXJuO1xuICAgIGlmIChwb3J0YWxOb2RlUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBjb25zdCBleGlzdGluZ0lkUm9vdCA9IGlkID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIDogbnVsbDtcbiAgICBpZiAoIWV4aXN0aW5nSWRSb290KSByZXR1cm47XG4gICAgY29uc3Qgc3ViUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN1YlJvb3QuaWQgPSB1bmlxdWVJZDtcbiAgICBzdWJSb290LnNldEF0dHJpYnV0ZShhdHRyLCAnJyk7XG4gICAgZXhpc3RpbmdJZFJvb3QuYXBwZW5kQ2hpbGQoc3ViUm9vdCk7XG4gICAgcG9ydGFsTm9kZVJlZi5jdXJyZW50ID0gc3ViUm9vdDtcbiAgICBzZXRQb3J0YWxOb2RlKHN1YlJvb3QpO1xuICB9LCBbaWQsIHVuaXF1ZUlkXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIXVuaXF1ZUlkKSByZXR1cm47XG4gICAgaWYgKHBvcnRhbE5vZGVSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGxldCBjb250YWluZXIgPSByb290IHx8IChwb3J0YWxDb250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpO1xuICAgIGlmIChjb250YWluZXIgJiYgIWlzRWxlbWVudChjb250YWluZXIpKSBjb250YWluZXIgPSBjb250YWluZXIuY3VycmVudDtcbiAgICBjb250YWluZXIgPSBjb250YWluZXIgfHwgZG9jdW1lbnQuYm9keTtcbiAgICBsZXQgaWRXcmFwcGVyID0gbnVsbDtcbiAgICBpZiAoaWQpIHtcbiAgICAgIGlkV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgaWRXcmFwcGVyLmlkID0gaWQ7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWRXcmFwcGVyKTtcbiAgICB9XG4gICAgY29uc3Qgc3ViUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN1YlJvb3QuaWQgPSB1bmlxdWVJZDtcbiAgICBzdWJSb290LnNldEF0dHJpYnV0ZShhdHRyLCAnJyk7XG4gICAgY29udGFpbmVyID0gaWRXcmFwcGVyIHx8IGNvbnRhaW5lcjtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3ViUm9vdCk7XG4gICAgcG9ydGFsTm9kZVJlZi5jdXJyZW50ID0gc3ViUm9vdDtcbiAgICBzZXRQb3J0YWxOb2RlKHN1YlJvb3QpO1xuICB9LCBbaWQsIHJvb3QsIHVuaXF1ZUlkLCBwb3J0YWxDb250ZXh0XSk7XG4gIHJldHVybiBwb3J0YWxOb2RlO1xufVxuLyoqXG4gKiBQb3J0YWxzIHRoZSBmbG9hdGluZyBlbGVtZW50IGludG8gYSBnaXZlbiBjb250YWluZXIgZWxlbWVudCDigJQgYnkgZGVmYXVsdCxcbiAqIG91dHNpZGUgb2YgdGhlIGFwcCByb290IGFuZCBpbnRvIHRoZSBib2R5LlxuICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZSBmbG9hdGluZyBlbGVtZW50IGNhbiBhcHBlYXIgb3V0c2lkZSBhbnlcbiAqIHBvdGVudGlhbCBwYXJlbnQgY29udGFpbmVycyB0aGF0IGNhdXNlIGNsaXBwaW5nIChzdWNoIGFzIGBvdmVyZmxvdzogaGlkZGVuYCksXG4gKiB3aGlsZSByZXRhaW5pbmcgaXRzIGxvY2F0aW9uIGluIHRoZSBSZWFjdCB0cmVlLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nUG9ydGFsXG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nUG9ydGFsKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBpZCxcbiAgICByb290ID0gbnVsbCxcbiAgICBwcmVzZXJ2ZVRhYk9yZGVyID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBvcnRhbE5vZGUgPSB1c2VGbG9hdGluZ1BvcnRhbE5vZGUoe1xuICAgIGlkLFxuICAgIHJvb3RcbiAgfSk7XG4gIGNvbnN0IFtmb2N1c01hbmFnZXJTdGF0ZSwgc2V0Rm9jdXNNYW5hZ2VyU3RhdGVdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IGJlZm9yZU91dHNpZGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGFmdGVyT3V0c2lkZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgYmVmb3JlSW5zaWRlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBhZnRlckluc2lkZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2hvdWxkUmVuZGVyR3VhcmRzID1cbiAgLy8gVGhlIEZvY3VzTWFuYWdlciBhbmQgdGhlcmVmb3JlIGZsb2F0aW5nIGVsZW1lbnQgYXJlIGN1cnJlbnRseSBvcGVuL1xuICAvLyByZW5kZXJlZC5cbiAgISFmb2N1c01hbmFnZXJTdGF0ZSAmJlxuICAvLyBHdWFyZHMgYXJlIG9ubHkgZm9yIG5vbi1tb2RhbCBmb2N1cyBtYW5hZ2VtZW50LlxuICAhZm9jdXNNYW5hZ2VyU3RhdGUubW9kYWwgJiZcbiAgLy8gRG9uJ3QgcmVuZGVyIGlmIHVubW91bnQgaXMgdHJhbnNpdGlvbmluZy5cbiAgZm9jdXNNYW5hZ2VyU3RhdGUub3BlbiAmJiBwcmVzZXJ2ZVRhYk9yZGVyICYmICEhKHJvb3QgfHwgcG9ydGFsTm9kZSk7XG5cbiAgLy8gaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3RhYmJhYmxlLXBvcnRhbC1mNHRuZz9maWxlPS9zcmMvVGFiYmFibGVQb3J0YWwudHN4XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFwb3J0YWxOb2RlIHx8ICFwcmVzZXJ2ZVRhYk9yZGVyIHx8IGZvY3VzTWFuYWdlclN0YXRlICE9IG51bGwgJiYgZm9jdXNNYW5hZ2VyU3RhdGUubW9kYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN1cmUgZWxlbWVudHMgaW5zaWRlIHRoZSBwb3J0YWwgZWxlbWVudCBhcmUgdGFiYmFibGUgb25seSB3aGVuIHRoZVxuICAgIC8vIHBvcnRhbCBoYXMgYWxyZWFkeSBiZWVuIGZvY3VzZWQsIGVpdGhlciBieSB0YWJiaW5nIGludG8gYSBmb2N1cyB0cmFwXG4gICAgLy8gZWxlbWVudCBvdXRzaWRlIG9yIHVzaW5nIHRoZSBtb3VzZS5cbiAgICBmdW5jdGlvbiBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICBpZiAocG9ydGFsTm9kZSAmJiBpc091dHNpZGVFdmVudChldmVudCkpIHtcbiAgICAgICAgY29uc3QgZm9jdXNpbmcgPSBldmVudC50eXBlID09PSAnZm9jdXNpbic7XG4gICAgICAgIGNvbnN0IG1hbmFnZUZvY3VzID0gZm9jdXNpbmcgPyBlbmFibGVGb2N1c0luc2lkZSA6IGRpc2FibGVGb2N1c0luc2lkZTtcbiAgICAgICAgbWFuYWdlRm9jdXMocG9ydGFsTm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIExpc3RlbiB0byB0aGUgZXZlbnQgb24gdGhlIGNhcHR1cmUgcGhhc2Ugc28gdGhleSBydW4gYmVmb3JlIHRoZSBmb2N1c1xuICAgIC8vIHRyYXAgZWxlbWVudHMgb25Gb2N1cyBwcm9wIGlzIGNhbGxlZC5cbiAgICBwb3J0YWxOb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvbkZvY3VzLCB0cnVlKTtcbiAgICBwb3J0YWxOb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25Gb2N1cywgdHJ1ZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHBvcnRhbE5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uRm9jdXMsIHRydWUpO1xuICAgICAgcG9ydGFsTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXMsIHRydWUpO1xuICAgIH07XG4gIH0sIFtwb3J0YWxOb2RlLCBwcmVzZXJ2ZVRhYk9yZGVyLCBmb2N1c01hbmFnZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogZm9jdXNNYW5hZ2VyU3RhdGUubW9kYWxdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgICAgcHJlc2VydmVUYWJPcmRlcixcbiAgICAgIGJlZm9yZU91dHNpZGVSZWYsXG4gICAgICBhZnRlck91dHNpZGVSZWYsXG4gICAgICBiZWZvcmVJbnNpZGVSZWYsXG4gICAgICBhZnRlckluc2lkZVJlZixcbiAgICAgIHBvcnRhbE5vZGUsXG4gICAgICBzZXRGb2N1c01hbmFnZXJTdGF0ZVxuICAgIH0pLCBbcHJlc2VydmVUYWJPcmRlciwgcG9ydGFsTm9kZV0pXG4gIH0sIHNob3VsZFJlbmRlckd1YXJkcyAmJiBwb3J0YWxOb2RlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzR3VhcmQsIHtcbiAgICBcImRhdGEtdHlwZVwiOiBcIm91dHNpZGVcIixcbiAgICByZWY6IGJlZm9yZU91dHNpZGVSZWYsXG4gICAgb25Gb2N1czogZXZlbnQgPT4ge1xuICAgICAgaWYgKGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBwb3J0YWxOb2RlKSkge1xuICAgICAgICB2YXIgX2JlZm9yZUluc2lkZVJlZiRjdXJyO1xuICAgICAgICAoX2JlZm9yZUluc2lkZVJlZiRjdXJyID0gYmVmb3JlSW5zaWRlUmVmLmN1cnJlbnQpID09IG51bGwgfHwgX2JlZm9yZUluc2lkZVJlZiRjdXJyLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcmV2VGFiYmFibGUgPSBnZXRQcmV2aW91c1RhYmJhYmxlKCkgfHwgKGZvY3VzTWFuYWdlclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBmb2N1c01hbmFnZXJTdGF0ZS5yZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KTtcbiAgICAgICAgcHJldlRhYmJhYmxlID09IG51bGwgfHwgcHJldlRhYmJhYmxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9KSwgc2hvdWxkUmVuZGVyR3VhcmRzICYmIHBvcnRhbE5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBcImFyaWEtb3duc1wiOiBwb3J0YWxOb2RlLmlkLFxuICAgIHN0eWxlOiBISURERU5fU1RZTEVTXG4gIH0pLCBwb3J0YWxOb2RlICYmIC8qI19fUFVSRV9fKi9jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHBvcnRhbE5vZGUpLCBzaG91bGRSZW5kZXJHdWFyZHMgJiYgcG9ydGFsTm9kZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0d1YXJkLCB7XG4gICAgXCJkYXRhLXR5cGVcIjogXCJvdXRzaWRlXCIsXG4gICAgcmVmOiBhZnRlck91dHNpZGVSZWYsXG4gICAgb25Gb2N1czogZXZlbnQgPT4ge1xuICAgICAgaWYgKGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBwb3J0YWxOb2RlKSkge1xuICAgICAgICB2YXIgX2FmdGVySW5zaWRlUmVmJGN1cnJlO1xuICAgICAgICAoX2FmdGVySW5zaWRlUmVmJGN1cnJlID0gYWZ0ZXJJbnNpZGVSZWYuY3VycmVudCkgPT0gbnVsbCB8fCBfYWZ0ZXJJbnNpZGVSZWYkY3VycmUuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHRUYWJiYWJsZSA9IGdldE5leHRUYWJiYWJsZSgpIHx8IChmb2N1c01hbmFnZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogZm9jdXNNYW5hZ2VyU3RhdGUucmVmcy5kb21SZWZlcmVuY2UuY3VycmVudCk7XG4gICAgICAgIG5leHRUYWJiYWJsZSA9PSBudWxsIHx8IG5leHRUYWJiYWJsZS5mb2N1cygpO1xuICAgICAgICAoZm9jdXNNYW5hZ2VyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGZvY3VzTWFuYWdlclN0YXRlLmNsb3NlT25Gb2N1c091dCkgJiYgKGZvY3VzTWFuYWdlclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBmb2N1c01hbmFnZXJTdGF0ZS5vbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9KSk7XG59XG5jb25zdCB1c2VQb3J0YWxDb250ZXh0ID0gKCkgPT4gUmVhY3QudXNlQ29udGV4dChQb3J0YWxDb250ZXh0KTtcblxuY29uc3QgTElTVF9MSU1JVCA9IDIwO1xubGV0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMgPSBbXTtcbmZ1bmN0aW9uIGFkZFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudChlbGVtZW50KSB7XG4gIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMgPSBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLmZpbHRlcihlbCA9PiBlbC5pc0Nvbm5lY3RlZCk7XG4gIGxldCB0YWJiYWJsZUVsID0gZWxlbWVudDtcbiAgaWYgKCF0YWJiYWJsZUVsIHx8IGdldE5vZGVOYW1lKHRhYmJhYmxlRWwpID09PSAnYm9keScpIHJldHVybjtcbiAgaWYgKCFpc1RhYmJhYmxlKHRhYmJhYmxlRWwsIGdldFRhYmJhYmxlT3B0aW9ucygpKSkge1xuICAgIGNvbnN0IHRhYmJhYmxlQ2hpbGQgPSB0YWJiYWJsZSh0YWJiYWJsZUVsLCBnZXRUYWJiYWJsZU9wdGlvbnMoKSlbMF07XG4gICAgaWYgKHRhYmJhYmxlQ2hpbGQpIHtcbiAgICAgIHRhYmJhYmxlRWwgPSB0YWJiYWJsZUNoaWxkO1xuICAgIH1cbiAgfVxuICBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLnB1c2godGFiYmFibGVFbCk7XG4gIGlmIChwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLmxlbmd0aCA+IExJU1RfTElNSVQpIHtcbiAgICBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzID0gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50cy5zbGljZSgtTElTVF9MSU1JVCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpIHtcbiAgcmV0dXJuIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMuc2xpY2UoKS5yZXZlcnNlKCkuZmluZChlbCA9PiBlbC5pc0Nvbm5lY3RlZCk7XG59XG5jb25zdCBWaXN1YWxseUhpZGRlbkRpc21pc3MgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBWaXN1YWxseUhpZGRlbkRpc21pc3MocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICByZWY6IHJlZixcbiAgICB0YWJJbmRleDogLTEsXG4gICAgc3R5bGU6IEhJRERFTl9TVFlMRVNcbiAgfSkpO1xufSk7XG4vKipcbiAqIFByb3ZpZGVzIGZvY3VzIG1hbmFnZW1lbnQgZm9yIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nRm9jdXNNYW5hZ2VyXG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nRm9jdXNNYW5hZ2VyKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjb250ZXh0LFxuICAgIGNoaWxkcmVuLFxuICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgb3JkZXIgPSBbJ2NvbnRlbnQnXSxcbiAgICBndWFyZHM6IF9ndWFyZHMgPSB0cnVlLFxuICAgIGluaXRpYWxGb2N1cyA9IDAsXG4gICAgcmV0dXJuRm9jdXMgPSB0cnVlLFxuICAgIG1vZGFsID0gdHJ1ZSxcbiAgICB2aXN1YWxseUhpZGRlbkRpc21pc3MgPSBmYWxzZSxcbiAgICBjbG9zZU9uRm9jdXNPdXQgPSB0cnVlXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgcmVmcyxcbiAgICBub2RlSWQsXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGV2ZW50cyxcbiAgICBkYXRhUmVmLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICBkb21SZWZlcmVuY2UsXG4gICAgICBmbG9hdGluZ1xuICAgIH1cbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGlnbm9yZUluaXRpYWxGb2N1cyA9IHR5cGVvZiBpbml0aWFsRm9jdXMgPT09ICdudW1iZXInICYmIGluaXRpYWxGb2N1cyA8IDA7XG4gIC8vIElmIHRoZSByZWZlcmVuY2UgaXMgYSBjb21ib2JveCBhbmQgaXMgdHlwZWFibGUgKGUuZy4gaW5wdXQvdGV4dGFyZWEpLFxuICAvLyB0aGVyZSBhcmUgZGlmZmVyZW50IGZvY3VzIHNlbWFudGljcy4gVGhlIGd1YXJkcyBzaG91bGQgbm90IGJlIHJlbmRlcmVkLCBidXRcbiAgLy8gYXJpYS1oaWRkZW4gc2hvdWxkIGJlIGFwcGxpZWQgdG8gYWxsIG5vZGVzIHN0aWxsLiBGdXJ0aGVyLCB0aGUgdmlzdWFsbHlcbiAgLy8gaGlkZGVuIGRpc21pc3MgYnV0dG9uIHNob3VsZCBvbmx5IGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBub3QgdGhlXG4gIC8vIHN0YXJ0LlxuICBjb25zdCBpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3ggPSBpc1R5cGVhYmxlQ29tYm9ib3goZG9tUmVmZXJlbmNlKSAmJiBpZ25vcmVJbml0aWFsRm9jdXM7XG5cbiAgLy8gRm9yY2UgdGhlIGd1YXJkcyB0byBiZSByZW5kZXJlZCBpZiB0aGUgYGluZXJ0YCBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZC5cbiAgY29uc3QgZ3VhcmRzID0gc3VwcG9ydHNJbmVydCgpID8gX2d1YXJkcyA6IHRydWU7XG4gIGNvbnN0IG9yZGVyUmVmID0gdXNlTGF0ZXN0UmVmKG9yZGVyKTtcbiAgY29uc3QgaW5pdGlhbEZvY3VzUmVmID0gdXNlTGF0ZXN0UmVmKGluaXRpYWxGb2N1cyk7XG4gIGNvbnN0IHJldHVybkZvY3VzUmVmID0gdXNlTGF0ZXN0UmVmKHJldHVybkZvY3VzKTtcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBjb25zdCBwb3J0YWxDb250ZXh0ID0gdXNlUG9ydGFsQ29udGV4dCgpO1xuICBjb25zdCBzdGFydERpc21pc3NCdXR0b25SZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGVuZERpc21pc3NCdXR0b25SZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IHByZXZlbnRSZXR1cm5Gb2N1c1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGlzUG9pbnRlckRvd25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBpc0luc2lkZVBvcnRhbCA9IHBvcnRhbENvbnRleHQgIT0gbnVsbDtcbiAgY29uc3QgZ2V0VGFiYmFibGVDb250ZW50ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIgPT09IHZvaWQgMCkge1xuICAgICAgY29udGFpbmVyID0gZmxvYXRpbmc7XG4gICAgfVxuICAgIHJldHVybiBjb250YWluZXIgPyB0YWJiYWJsZShjb250YWluZXIsIGdldFRhYmJhYmxlT3B0aW9ucygpKSA6IFtdO1xuICB9LCBbZmxvYXRpbmddKTtcbiAgY29uc3QgZ2V0VGFiYmFibGVFbGVtZW50cyA9IFJlYWN0LnVzZUNhbGxiYWNrKGNvbnRhaW5lciA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IGdldFRhYmJhYmxlQ29udGVudChjb250YWluZXIpO1xuICAgIHJldHVybiBvcmRlclJlZi5jdXJyZW50Lm1hcCh0eXBlID0+IHtcbiAgICAgIGlmIChkb21SZWZlcmVuY2UgJiYgdHlwZSA9PT0gJ3JlZmVyZW5jZScpIHtcbiAgICAgICAgcmV0dXJuIGRvbVJlZmVyZW5jZTtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyAmJiB0eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICAgIHJldHVybiBmbG9hdGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmZpbHRlcihCb29sZWFuKS5mbGF0KCk7XG4gIH0sIFtkb21SZWZlcmVuY2UsIGZsb2F0aW5nLCBvcmRlclJlZiwgZ2V0VGFiYmFibGVDb250ZW50XSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkIHx8ICFtb2RhbCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgLy8gVGhlIGZvY3VzIGd1YXJkcyBoYXZlIG5vdGhpbmcgdG8gZm9jdXMsIHNvIHdlIG5lZWQgdG8gc3RvcCB0aGUgZXZlbnQuXG4gICAgICAgIGlmIChjb250YWlucyhmbG9hdGluZywgYWN0aXZlRWxlbWVudChnZXREb2N1bWVudChmbG9hdGluZykpKSAmJiBnZXRUYWJiYWJsZUNvbnRlbnQoKS5sZW5ndGggPT09IDAgJiYgIWlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCkge1xuICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxzID0gZ2V0VGFiYmFibGVFbGVtZW50cygpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQpO1xuICAgICAgICBpZiAob3JkZXJSZWYuY3VycmVudFswXSA9PT0gJ3JlZmVyZW5jZScgJiYgdGFyZ2V0ID09PSBkb21SZWZlcmVuY2UpIHtcbiAgICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgZW5xdWV1ZUZvY3VzKGVsc1tlbHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbnF1ZXVlRm9jdXMoZWxzWzFdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGVyUmVmLmN1cnJlbnRbMV0gPT09ICdmbG9hdGluZycgJiYgdGFyZ2V0ID09PSBmbG9hdGluZyAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgZW5xdWV1ZUZvY3VzKGVsc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoZmxvYXRpbmcpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24pO1xuICAgIH07XG4gIH0sIFtkaXNhYmxlZCwgZG9tUmVmZXJlbmNlLCBmbG9hdGluZywgbW9kYWwsIG9yZGVyUmVmLCBpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3gsIGdldFRhYmJhYmxlQ29udGVudCwgZ2V0VGFiYmFibGVFbGVtZW50c10pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCB8fCAhY2xvc2VPbkZvY3VzT3V0KSByZXR1cm47XG5cbiAgICAvLyBJbiBTYWZhcmksIGJ1dHRvbnMgbG9zZSBmb2N1cyB3aGVuIHByZXNzaW5nIHRoZW0uXG4gICAgZnVuY3Rpb24gaGFuZGxlUG9pbnRlckRvd24oKSB7XG4gICAgICBpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlzUG9pbnRlckRvd25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZUZvY3VzT3V0c2lkZShldmVudCkge1xuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vdmVkVG9VbnJlbGF0ZWROb2RlID0gIShjb250YWlucyhkb21SZWZlcmVuY2UsIHJlbGF0ZWRUYXJnZXQpIHx8IGNvbnRhaW5zKGZsb2F0aW5nLCByZWxhdGVkVGFyZ2V0KSB8fCBjb250YWlucyhyZWxhdGVkVGFyZ2V0LCBmbG9hdGluZykgfHwgY29udGFpbnMocG9ydGFsQ29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlLCByZWxhdGVkVGFyZ2V0KSB8fCByZWxhdGVkVGFyZ2V0ICE9IG51bGwgJiYgcmVsYXRlZFRhcmdldC5oYXNBdHRyaWJ1dGUoY3JlYXRlQXR0cmlidXRlKCdmb2N1cy1ndWFyZCcpKSB8fCB0cmVlICYmIChnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkuZmluZChub2RlID0+IHtcbiAgICAgICAgICB2YXIgX25vZGUkY29udGV4dCwgX25vZGUkY29udGV4dDI7XG4gICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKChfbm9kZSRjb250ZXh0ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dC5lbGVtZW50cy5mbG9hdGluZywgcmVsYXRlZFRhcmdldCkgfHwgY29udGFpbnMoKF9ub2RlJGNvbnRleHQyID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDIuZWxlbWVudHMuZG9tUmVmZXJlbmNlLCByZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgfSkgfHwgZ2V0QW5jZXN0b3JzKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKS5maW5kKG5vZGUgPT4ge1xuICAgICAgICAgIHZhciBfbm9kZSRjb250ZXh0MywgX25vZGUkY29udGV4dDQ7XG4gICAgICAgICAgcmV0dXJuICgoX25vZGUkY29udGV4dDMgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0My5lbGVtZW50cy5mbG9hdGluZykgPT09IHJlbGF0ZWRUYXJnZXQgfHwgKChfbm9kZSRjb250ZXh0NCA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQ0LmVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgPT09IHJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgIH0pKSk7XG5cbiAgICAgICAgLy8gRm9jdXMgZGlkIG5vdCBtb3ZlIGluc2lkZSB0aGUgZmxvYXRpbmcgdHJlZSwgYW5kIHRoZXJlIGFyZSBubyB0YWJiYWJsZVxuICAgICAgICAvLyBwb3J0YWwgZ3VhcmRzIHRvIGhhbmRsZSBjbG9zaW5nLlxuICAgICAgICBpZiAocmVsYXRlZFRhcmdldCAmJiBtb3ZlZFRvVW5yZWxhdGVkTm9kZSAmJiAhaXNQb2ludGVyRG93blJlZi5jdXJyZW50ICYmXG4gICAgICAgIC8vIEZpeCBSZWFjdCAxOCBTdHJpY3QgTW9kZSByZXR1cm5Gb2N1cyBkdWUgdG8gZG91YmxlIHJlbmRlcmluZy5cbiAgICAgICAgcmVsYXRlZFRhcmdldCAhPT0gZ2V0UHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCkpIHtcbiAgICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZmxvYXRpbmcgJiYgaXNIVE1MRWxlbWVudChkb21SZWZlcmVuY2UpKSB7XG4gICAgICBkb21SZWZlcmVuY2UuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBoYW5kbGVGb2N1c091dHNpZGUpO1xuICAgICAgZG9tUmVmZXJlbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgIW1vZGFsICYmIGZsb2F0aW5nLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgaGFuZGxlRm9jdXNPdXRzaWRlKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRvbVJlZmVyZW5jZS5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGhhbmRsZUZvY3VzT3V0c2lkZSk7XG4gICAgICAgIGRvbVJlZmVyZW5jZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgIW1vZGFsICYmIGZsb2F0aW5nLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgaGFuZGxlRm9jdXNPdXRzaWRlKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZGlzYWJsZWQsIGRvbVJlZmVyZW5jZSwgZmxvYXRpbmcsIG1vZGFsLCBub2RlSWQsIHRyZWUsIHBvcnRhbENvbnRleHQsIG9uT3BlbkNoYW5nZSwgY2xvc2VPbkZvY3VzT3V0XSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdmFyIF9wb3J0YWxDb250ZXh0JHBvcnRhbDtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcblxuICAgIC8vIERvbid0IGhpZGUgcG9ydGFscyBuZXN0ZWQgd2l0aGluIHRoZSBwYXJlbnQgcG9ydGFsLlxuICAgIGNvbnN0IHBvcnRhbE5vZGVzID0gQXJyYXkuZnJvbSgocG9ydGFsQ29udGV4dCA9PSBudWxsIHx8IChfcG9ydGFsQ29udGV4dCRwb3J0YWwgPSBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpID09IG51bGwgPyB2b2lkIDAgOiBfcG9ydGFsQ29udGV4dCRwb3J0YWwucXVlcnlTZWxlY3RvckFsbChcIltcIiArIGNyZWF0ZUF0dHJpYnV0ZSgncG9ydGFsJykgKyBcIl1cIikpIHx8IFtdKTtcbiAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgIGNvbnN0IGluc2lkZUVsZW1lbnRzID0gW2Zsb2F0aW5nLCAuLi5wb3J0YWxOb2Rlcywgc3RhcnREaXNtaXNzQnV0dG9uUmVmLmN1cnJlbnQsIGVuZERpc21pc3NCdXR0b25SZWYuY3VycmVudCwgb3JkZXJSZWYuY3VycmVudC5pbmNsdWRlcygncmVmZXJlbmNlJykgfHwgaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94ID8gZG9tUmVmZXJlbmNlIDogbnVsbF0uZmlsdGVyKHggPT4geCAhPSBudWxsKTtcbiAgICAgIGNvbnN0IGNsZWFudXAgPSBtb2RhbCB8fCBpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3ggPyBtYXJrT3RoZXJzKGluc2lkZUVsZW1lbnRzLCBndWFyZHMsICFndWFyZHMpIDogbWFya090aGVycyhpbnNpZGVFbGVtZW50cyk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2Rpc2FibGVkLCBkb21SZWZlcmVuY2UsIGZsb2F0aW5nLCBtb2RhbCwgb3JkZXJSZWYsIHBvcnRhbENvbnRleHQsIGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCwgZ3VhcmRzXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQgfHwgIWZsb2F0aW5nKSByZXR1cm47XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoZmxvYXRpbmcpO1xuICAgIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGFjdGl2ZUVsZW1lbnQoZG9jKTtcblxuICAgIC8vIFdhaXQgZm9yIGFueSBsYXlvdXQgZWZmZWN0IHN0YXRlIHNldHRlcnMgdG8gZXhlY3V0ZSB0byBzZXQgYHRhYkluZGV4YC5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGdldFRhYmJhYmxlRWxlbWVudHMoZmxvYXRpbmcpO1xuICAgICAgY29uc3QgaW5pdGlhbEZvY3VzVmFsdWUgPSBpbml0aWFsRm9jdXNSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IGVsVG9Gb2N1cyA9ICh0eXBlb2YgaW5pdGlhbEZvY3VzVmFsdWUgPT09ICdudW1iZXInID8gZm9jdXNhYmxlRWxlbWVudHNbaW5pdGlhbEZvY3VzVmFsdWVdIDogaW5pdGlhbEZvY3VzVmFsdWUuY3VycmVudCkgfHwgZmxvYXRpbmc7XG4gICAgICBjb25zdCBmb2N1c0FscmVhZHlJbnNpZGVGbG9hdGluZ0VsID0gY29udGFpbnMoZmxvYXRpbmcsIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCk7XG4gICAgICBpZiAoIWlnbm9yZUluaXRpYWxGb2N1cyAmJiAhZm9jdXNBbHJlYWR5SW5zaWRlRmxvYXRpbmdFbCAmJiBvcGVuKSB7XG4gICAgICAgIGVucXVldWVGb2N1cyhlbFRvRm9jdXMsIHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiBlbFRvRm9jdXMgPT09IGZsb2F0aW5nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbZGlzYWJsZWQsIG9wZW4sIGZsb2F0aW5nLCBpZ25vcmVJbml0aWFsRm9jdXMsIGdldFRhYmJhYmxlRWxlbWVudHMsIGluaXRpYWxGb2N1c1JlZl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkIHx8ICFmbG9hdGluZykgcmV0dXJuO1xuICAgIGxldCBwcmV2ZW50UmV0dXJuRm9jdXNTY3JvbGwgPSBmYWxzZTtcbiAgICBjb25zdCBkb2MgPSBnZXREb2N1bWVudChmbG9hdGluZyk7XG4gICAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gYWN0aXZlRWxlbWVudChkb2MpO1xuICAgIGNvbnN0IGNvbnRleHREYXRhID0gZGF0YVJlZi5jdXJyZW50O1xuICAgIGxldCBvcGVuRXZlbnQgPSBjb250ZXh0RGF0YS5vcGVuRXZlbnQ7XG4gICAgYWRkUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCk7XG5cbiAgICAvLyBEaXNtaXNzaW5nIHZpYSBvdXRzaWRlIHByZXNzIHNob3VsZCBhbHdheXMgaWdub3JlIGByZXR1cm5Gb2N1c2AgdG9cbiAgICAvLyBwcmV2ZW50IHVud2FudGVkIHNjcm9sbGluZy5cbiAgICBmdW5jdGlvbiBvbk9wZW5DaGFuZ2UoX3JlZikge1xuICAgICAgbGV0IHtcbiAgICAgICAgb3BlbixcbiAgICAgICAgcmVhc29uLFxuICAgICAgICBldmVudCxcbiAgICAgICAgbmVzdGVkXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIG9wZW5FdmVudCA9IGV2ZW50O1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiA9PT0gJ2VzY2FwZS1rZXknICYmIHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQpIHtcbiAgICAgICAgYWRkUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiA9PT0gJ2hvdmVyJyAmJiBldmVudC50eXBlID09PSAnbW91c2VsZWF2ZScpIHtcbiAgICAgICAgcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiAhPT0gJ291dHNpZGUtcHJlc3MnKSByZXR1cm47XG4gICAgICBpZiAobmVzdGVkKSB7XG4gICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1Njcm9sbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9ICEoaXNWaXJ0dWFsQ2xpY2soZXZlbnQpIHx8IGlzVmlydHVhbFBvaW50ZXJFdmVudChldmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBldmVudHMub24oJ29wZW5jaGFuZ2UnLCBvbk9wZW5DaGFuZ2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBldmVudHMub2ZmKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUVsID0gYWN0aXZlRWxlbWVudChkb2MpO1xuICAgICAgY29uc3QgaXNGb2N1c0luc2lkZUZsb2F0aW5nVHJlZSA9IGNvbnRhaW5zKGZsb2F0aW5nLCBhY3RpdmVFbCkgfHwgdHJlZSAmJiBnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkuc29tZShub2RlID0+IHtcbiAgICAgICAgdmFyIF9ub2RlJGNvbnRleHQ1O1xuICAgICAgICByZXR1cm4gY29udGFpbnMoKF9ub2RlJGNvbnRleHQ1ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDUuZWxlbWVudHMuZmxvYXRpbmcsIGFjdGl2ZUVsKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2hvdWxkRm9jdXNSZWZlcmVuY2UgPSBpc0ZvY3VzSW5zaWRlRmxvYXRpbmdUcmVlIHx8IG9wZW5FdmVudCAmJiBbJ2NsaWNrJywgJ21vdXNlZG93biddLmluY2x1ZGVzKG9wZW5FdmVudC50eXBlKTtcbiAgICAgIGlmIChzaG91bGRGb2N1c1JlZmVyZW5jZSAmJiByZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KSB7XG4gICAgICAgIGFkZFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudChyZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJldHVybkVsZW1lbnQgPSBnZXRQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKTtcbiAgICAgIGlmIChcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICAgIHJldHVybkZvY3VzUmVmLmN1cnJlbnQgJiYgIXByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ICYmIGlzSFRNTEVsZW1lbnQocmV0dXJuRWxlbWVudCkgJiYgKFxuICAgICAgLy8gSWYgdGhlIGZvY3VzIG1vdmVkIHNvbWV3aGVyZSBlbHNlIGFmdGVyIG1vdW50LCBhdm9pZCByZXR1cm5pbmcgZm9jdXNcbiAgICAgIC8vIHNpbmNlIGl0IGxpa2VseSBlbnRlcmVkIGEgZGlmZmVyZW50IGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlXG4gICAgICAvLyByZXNwZWN0ZWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMjYwN1xuICAgICAgcmV0dXJuRWxlbWVudCAhPT0gYWN0aXZlRWwgJiYgYWN0aXZlRWwgIT09IGRvYy5ib2R5ID8gaXNGb2N1c0luc2lkZUZsb2F0aW5nVHJlZSA6IHRydWUpKSB7XG4gICAgICAgIGVucXVldWVGb2N1cyhyZXR1cm5FbGVtZW50LCB7XG4gICAgICAgICAgLy8gV2hlbiBkaXNtaXNzaW5nIG5lc3RlZCBmbG9hdGluZyBlbGVtZW50cywgYnkgdGhlIHRpbWUgdGhlIHJBRiBoYXNcbiAgICAgICAgICAvLyBleGVjdXRlZCwgdGhlIG1lbnVzIHdpbGwgYWxsIGhhdmUgYmVlbiB1bm1vdW50ZWQuIFdoZW4gdGhleSB0cnlcbiAgICAgICAgICAvLyB0byBnZXQgZm9jdXNlZCwgdGhlIGNhbGxzIGdldCBpZ25vcmVkIOKAlCBsZWF2aW5nIHRoZSByb290XG4gICAgICAgICAgLy8gcmVmZXJlbmNlIGZvY3VzZWQgYXMgZGVzaXJlZC5cbiAgICAgICAgICBjYW5jZWxQcmV2aW91czogZmFsc2UsXG4gICAgICAgICAgcHJldmVudFNjcm9sbDogcHJldmVudFJldHVybkZvY3VzU2Nyb2xsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtkaXNhYmxlZCwgZmxvYXRpbmcsIHJldHVybkZvY3VzUmVmLCBkYXRhUmVmLCByZWZzLCBldmVudHMsIHRyZWUsIG5vZGVJZF0pO1xuXG4gIC8vIFN5bmNocm9uaXplIHRoZSBgY29udGV4dGAgJiBgbW9kYWxgIHZhbHVlIHRvIHRoZSBGbG9hdGluZ1BvcnRhbCBjb250ZXh0LlxuICAvLyBJdCB3aWxsIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCBpdCBuZWVkcyB0byByZW5kZXIgaXRzIG93biBndWFyZHMuXG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQgfHwgIXBvcnRhbENvbnRleHQpIHJldHVybjtcbiAgICBwb3J0YWxDb250ZXh0LnNldEZvY3VzTWFuYWdlclN0YXRlKHtcbiAgICAgIG1vZGFsLFxuICAgICAgY2xvc2VPbkZvY3VzT3V0LFxuICAgICAgb3BlbixcbiAgICAgIG9uT3BlbkNoYW5nZSxcbiAgICAgIHJlZnNcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcG9ydGFsQ29udGV4dC5zZXRGb2N1c01hbmFnZXJTdGF0ZShudWxsKTtcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIHBvcnRhbENvbnRleHQsIG1vZGFsLCBvcGVuLCBvbk9wZW5DaGFuZ2UsIHJlZnMsIGNsb3NlT25Gb2N1c091dF0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkIHx8ICFmbG9hdGluZyB8fCB0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ2Z1bmN0aW9uJyB8fCBpZ25vcmVJbml0aWFsRm9jdXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlTXV0YXRpb24gPSAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJJbmRleCA9IGZsb2F0aW5nLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgIGlmIChvcmRlclJlZi5jdXJyZW50LmluY2x1ZGVzKCdmbG9hdGluZycpIHx8IGFjdGl2ZUVsZW1lbnQoZ2V0RG9jdW1lbnQoZmxvYXRpbmcpKSAhPT0gcmVmcy5kb21SZWZlcmVuY2UuY3VycmVudCAmJiBnZXRUYWJiYWJsZUNvbnRlbnQoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKHRhYkluZGV4ICE9PSAnMCcpIHtcbiAgICAgICAgICBmbG9hdGluZy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWJJbmRleCAhPT0gJy0xJykge1xuICAgICAgICBmbG9hdGluZy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBoYW5kbGVNdXRhdGlvbigpO1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoaGFuZGxlTXV0YXRpb24pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoZmxvYXRpbmcsIHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIGZsb2F0aW5nLCByZWZzLCBvcmRlclJlZiwgZ2V0VGFiYmFibGVDb250ZW50LCBpZ25vcmVJbml0aWFsRm9jdXNdKTtcbiAgZnVuY3Rpb24gcmVuZGVyRGlzbWlzc0J1dHRvbihsb2NhdGlvbikge1xuICAgIGlmIChkaXNhYmxlZCB8fCAhdmlzdWFsbHlIaWRkZW5EaXNtaXNzIHx8ICFtb2RhbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChWaXN1YWxseUhpZGRlbkRpc21pc3MsIHtcbiAgICAgIHJlZjogbG9jYXRpb24gPT09ICdzdGFydCcgPyBzdGFydERpc21pc3NCdXR0b25SZWYgOiBlbmREaXNtaXNzQnV0dG9uUmVmLFxuICAgICAgb25DbGljazogZXZlbnQgPT4gb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudClcbiAgICB9LCB0eXBlb2YgdmlzdWFsbHlIaWRkZW5EaXNtaXNzID09PSAnc3RyaW5nJyA/IHZpc3VhbGx5SGlkZGVuRGlzbWlzcyA6ICdEaXNtaXNzJyk7XG4gIH1cbiAgY29uc3Qgc2hvdWxkUmVuZGVyR3VhcmRzID0gIWRpc2FibGVkICYmIGd1YXJkcyAmJiAoaXNJbnNpZGVQb3J0YWwgfHwgbW9kYWwpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHNob3VsZFJlbmRlckd1YXJkcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0d1YXJkLCB7XG4gICAgXCJkYXRhLXR5cGVcIjogXCJpbnNpZGVcIixcbiAgICByZWY6IHBvcnRhbENvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IHBvcnRhbENvbnRleHQuYmVmb3JlSW5zaWRlUmVmLFxuICAgIG9uRm9jdXM6IGV2ZW50ID0+IHtcbiAgICAgIGlmIChtb2RhbCkge1xuICAgICAgICBjb25zdCBlbHMgPSBnZXRUYWJiYWJsZUVsZW1lbnRzKCk7XG4gICAgICAgIGVucXVldWVGb2N1cyhvcmRlclswXSA9PT0gJ3JlZmVyZW5jZScgPyBlbHNbMF0gOiBlbHNbZWxzLmxlbmd0aCAtIDFdKTtcbiAgICAgIH0gZWxzZSBpZiAocG9ydGFsQ29udGV4dCAhPSBudWxsICYmIHBvcnRhbENvbnRleHQucHJlc2VydmVUYWJPcmRlciAmJiBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpIHtcbiAgICAgICAgcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFRhYmJhYmxlID0gZ2V0TmV4dFRhYmJhYmxlKCkgfHwgZG9tUmVmZXJlbmNlO1xuICAgICAgICAgIG5leHRUYWJiYWJsZSA9PSBudWxsIHx8IG5leHRUYWJiYWJsZS5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfcG9ydGFsQ29udGV4dCRiZWZvcmU7XG4gICAgICAgICAgKF9wb3J0YWxDb250ZXh0JGJlZm9yZSA9IHBvcnRhbENvbnRleHQuYmVmb3JlT3V0c2lkZVJlZi5jdXJyZW50KSA9PSBudWxsIHx8IF9wb3J0YWxDb250ZXh0JGJlZm9yZS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KSwgIWlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCAmJiByZW5kZXJEaXNtaXNzQnV0dG9uKCdzdGFydCcpLCBjaGlsZHJlbiwgcmVuZGVyRGlzbWlzc0J1dHRvbignZW5kJyksIHNob3VsZFJlbmRlckd1YXJkcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0d1YXJkLCB7XG4gICAgXCJkYXRhLXR5cGVcIjogXCJpbnNpZGVcIixcbiAgICByZWY6IHBvcnRhbENvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IHBvcnRhbENvbnRleHQuYWZ0ZXJJbnNpZGVSZWYsXG4gICAgb25Gb2N1czogZXZlbnQgPT4ge1xuICAgICAgaWYgKG1vZGFsKSB7XG4gICAgICAgIGVucXVldWVGb2N1cyhnZXRUYWJiYWJsZUVsZW1lbnRzKClbMF0pO1xuICAgICAgfSBlbHNlIGlmIChwb3J0YWxDb250ZXh0ICE9IG51bGwgJiYgcG9ydGFsQ29udGV4dC5wcmVzZXJ2ZVRhYk9yZGVyICYmIHBvcnRhbENvbnRleHQucG9ydGFsTm9kZSkge1xuICAgICAgICBpZiAoY2xvc2VPbkZvY3VzT3V0KSB7XG4gICAgICAgICAgcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc091dHNpZGVFdmVudChldmVudCwgcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlKSkge1xuICAgICAgICAgIGNvbnN0IHByZXZUYWJiYWJsZSA9IGdldFByZXZpb3VzVGFiYmFibGUoKSB8fCBkb21SZWZlcmVuY2U7XG4gICAgICAgICAgcHJldlRhYmJhYmxlID09IG51bGwgfHwgcHJldlRhYmJhYmxlLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3J0YWxDb250ZXh0JGFmdGVyTztcbiAgICAgICAgICAoX3BvcnRhbENvbnRleHQkYWZ0ZXJPID0gcG9ydGFsQ29udGV4dC5hZnRlck91dHNpZGVSZWYuY3VycmVudCkgPT0gbnVsbCB8fCBfcG9ydGFsQ29udGV4dCRhZnRlck8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSkpO1xufVxuXG5jb25zdCBhY3RpdmVMb2NrcyA9IC8qI19fUFVSRV9fKi9uZXcgU2V0KCk7XG4vKipcbiAqIFByb3ZpZGVzIGJhc2Ugc3R5bGluZyBmb3IgYSBmaXhlZCBvdmVybGF5IGVsZW1lbnQgdG8gZGltIGNvbnRlbnQgb3IgYmxvY2tcbiAqIHBvaW50ZXIgZXZlbnRzIGJlaGluZCBhIGZsb2F0aW5nIGVsZW1lbnQuXG4gKiBJdCdzIGEgcmVndWxhciBgPGRpdj5gLCBzbyBpdCBjYW4gYmUgc3R5bGVkIHZpYSBhbnkgQ1NTIHNvbHV0aW9uIHlvdSBwcmVmZXIuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdPdmVybGF5XG4gKi9cbmNvbnN0IEZsb2F0aW5nT3ZlcmxheSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZsb2F0aW5nT3ZlcmxheShwcm9wcywgcmVmKSB7XG4gIGNvbnN0IHtcbiAgICBsb2NrU2Nyb2xsID0gZmFsc2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGxvY2tJZCA9IHVzZUlkKCk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWxvY2tTY3JvbGwpIHJldHVybjtcbiAgICBhY3RpdmVMb2Nrcy5hZGQobG9ja0lkKTtcbiAgICBjb25zdCBpc0lPUyA9IC9pUChob25lfGFkfG9kKXxpT1MvLnRlc3QoZ2V0UGxhdGZvcm0oKSk7XG4gICAgY29uc3QgYm9keVN0eWxlID0gZG9jdW1lbnQuYm9keS5zdHlsZTtcbiAgICAvLyBSVEwgPGJvZHk+IHNjcm9sbGJhclxuICAgIGNvbnN0IHNjcm9sbGJhclggPSBNYXRoLnJvdW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KSArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHBhZGRpbmdQcm9wID0gc2Nyb2xsYmFyWCA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0JztcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IHNjcm9sbFggPSBib2R5U3R5bGUubGVmdCA/IHBhcnNlRmxvYXQoYm9keVN0eWxlLmxlZnQpIDogd2luZG93LnBhZ2VYT2Zmc2V0O1xuICAgIGNvbnN0IHNjcm9sbFkgPSBib2R5U3R5bGUudG9wID8gcGFyc2VGbG9hdChib2R5U3R5bGUudG9wKSA6IHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgICBib2R5U3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICBpZiAoc2Nyb2xsYmFyV2lkdGgpIHtcbiAgICAgIGJvZHlTdHlsZVtwYWRkaW5nUHJvcF0gPSBzY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGlPUyBkb2Vzbid0IHJlc3BlY3QgYG92ZXJmbG93OiBoaWRkZW5gIG9uIGRvY3VtZW50LmJvZHksIGFuZCB0aGlzXG4gICAgLy8gdGVjaG5pcXVlIGhhcyBmZXdlciBzaWRlIGVmZmVjdHMuXG4gICAgaWYgKGlzSU9TKSB7XG4gICAgICB2YXIgX3dpbmRvdyR2aXN1YWxWaWV3cG9yLCBfd2luZG93JHZpc3VhbFZpZXdwb3IyO1xuICAgICAgLy8gaU9TIDEyIGRvZXMgbm90IHN1cHBvcnQgYHZpc3VhbFZpZXdwb3J0YC5cbiAgICAgIGNvbnN0IG9mZnNldExlZnQgPSAoKF93aW5kb3ckdmlzdWFsVmlld3BvciA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCkgPT0gbnVsbCA/IHZvaWQgMCA6IF93aW5kb3ckdmlzdWFsVmlld3Bvci5vZmZzZXRMZWZ0KSB8fCAwO1xuICAgICAgY29uc3Qgb2Zmc2V0VG9wID0gKChfd2luZG93JHZpc3VhbFZpZXdwb3IyID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PSBudWxsID8gdm9pZCAwIDogX3dpbmRvdyR2aXN1YWxWaWV3cG9yMi5vZmZzZXRUb3ApIHx8IDA7XG4gICAgICBPYmplY3QuYXNzaWduKGJvZHlTdHlsZSwge1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAtKHNjcm9sbFkgLSBNYXRoLmZsb29yKG9mZnNldFRvcCkpICsgXCJweFwiLFxuICAgICAgICBsZWZ0OiAtKHNjcm9sbFggLSBNYXRoLmZsb29yKG9mZnNldExlZnQpKSArIFwicHhcIixcbiAgICAgICAgcmlnaHQ6ICcwJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmVMb2Nrcy5kZWxldGUobG9ja0lkKTtcbiAgICAgIGlmIChhY3RpdmVMb2Nrcy5zaXplID09PSAwKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYm9keVN0eWxlLCB7XG4gICAgICAgICAgb3ZlcmZsb3c6ICcnLFxuICAgICAgICAgIFtwYWRkaW5nUHJvcF06ICcnXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaXNJT1MpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHlTdHlsZSwge1xuICAgICAgICAgICAgcG9zaXRpb246ICcnLFxuICAgICAgICAgICAgdG9wOiAnJyxcbiAgICAgICAgICAgIGxlZnQ6ICcnLFxuICAgICAgICAgICAgcmlnaHQ6ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2luZG93LnNjcm9sbFRvKHNjcm9sbFgsIHNjcm9sbFkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2xvY2tJZCwgbG9ja1Njcm9sbF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHJlZjogcmVmXG4gIH0sIHJlc3QsIHtcbiAgICBzdHlsZToge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICBvdmVyZmxvdzogJ2F1dG8nLFxuICAgICAgdG9wOiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgLi4ucmVzdC5zdHlsZVxuICAgIH1cbiAgfSkpO1xufSk7XG5cbmZ1bmN0aW9uIGlzQnV0dG9uVGFyZ2V0KGV2ZW50KSB7XG4gIHJldHVybiBpc0hUTUxFbGVtZW50KGV2ZW50LnRhcmdldCkgJiYgZXZlbnQudGFyZ2V0LnRhZ05hbWUgPT09ICdCVVRUT04nO1xufVxuZnVuY3Rpb24gaXNTcGFjZUlnbm9yZWQoZWxlbWVudCkge1xuICByZXR1cm4gaXNUeXBlYWJsZUVsZW1lbnQoZWxlbWVudCk7XG59XG4vKipcbiAqIE9wZW5zIG9yIGNsb3NlcyB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGVuIGNsaWNraW5nIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VDbGlja1xuICovXG5mdW5jdGlvbiB1c2VDbGljayhjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGRhdGFSZWYsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGRvbVJlZmVyZW5jZVxuICAgIH1cbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBldmVudDogZXZlbnRPcHRpb24gPSAnY2xpY2snLFxuICAgIHRvZ2dsZSA9IHRydWUsXG4gICAgaWdub3JlTW91c2UgPSBmYWxzZSxcbiAgICBrZXlib2FyZEhhbmRsZXJzID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBvaW50ZXJUeXBlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IGRpZEtleURvd25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICBvblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgICAgcG9pbnRlclR5cGVSZWYuY3VycmVudCA9IGV2ZW50LnBvaW50ZXJUeXBlO1xuICAgICAgICB9LFxuICAgICAgICBvbk1vdXNlRG93bihldmVudCkge1xuICAgICAgICAgIC8vIElnbm9yZSBhbGwgYnV0dG9ucyBleGNlcHQgZm9yIHRoZSBcIm1haW5cIiBidXR0b24uXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01vdXNlRXZlbnQvYnV0dG9uXG4gICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZVJlZi5jdXJyZW50LCB0cnVlKSAmJiBpZ25vcmVNb3VzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXZlbnRPcHRpb24gPT09ICdjbGljaycpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wZW4gJiYgdG9nZ2xlICYmIChkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ID8gZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudC50eXBlID09PSAnbW91c2Vkb3duJyA6IHRydWUpKSB7XG4gICAgICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUHJldmVudCBzdGVhbGluZyBmb2N1cyBmcm9tIHRoZSBmbG9hdGluZyBlbGVtZW50XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnRPcHRpb24gPT09ICdtb3VzZWRvd24nICYmIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQsIHRydWUpICYmIGlnbm9yZU1vdXNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcGVuICYmIHRvZ2dsZSAmJiAoZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCA/IGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQudHlwZSA9PT0gJ2NsaWNrJyA6IHRydWUpKSB7XG4gICAgICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgICAgIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgIWtleWJvYXJkSGFuZGxlcnMgfHwgaXNCdXR0b25UYXJnZXQoZXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJyAmJiAhaXNTcGFjZUlnbm9yZWQoZG9tUmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgLy8gUHJldmVudCBzY3JvbGxpbmdcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBkaWRLZXlEb3duUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICBpZiAob3BlbiAmJiB0b2dnbGUpIHtcbiAgICAgICAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ2NsaWNrJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25LZXlVcChldmVudCkge1xuICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFrZXlib2FyZEhhbmRsZXJzIHx8IGlzQnV0dG9uVGFyZ2V0KGV2ZW50KSB8fCBpc1NwYWNlSWdub3JlZChkb21SZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJyAmJiBkaWRLZXlEb3duUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGRpZEtleURvd25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKG9wZW4gJiYgdG9nZ2xlKSB7XG4gICAgICAgICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LCBbZW5hYmxlZCwgZGF0YVJlZiwgZXZlbnRPcHRpb24sIGlnbm9yZU1vdXNlLCBrZXlib2FyZEhhbmRsZXJzLCBkb21SZWZlcmVuY2UsIHRvZ2dsZSwgb3Blbiwgb25PcGVuQ2hhbmdlXSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpcnR1YWxFbGVtZW50KGRvbUVsZW1lbnQsIGRhdGEpIHtcbiAgbGV0IG9mZnNldFggPSBudWxsO1xuICBsZXQgb2Zmc2V0WSA9IG51bGw7XG4gIGxldCBpc0F1dG9VcGRhdGVFdmVudCA9IGZhbHNlO1xuICByZXR1cm4ge1xuICAgIGNvbnRleHRFbGVtZW50OiBkb21FbGVtZW50IHx8IHVuZGVmaW5lZCxcbiAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB7XG4gICAgICB2YXIgX2RhdGEkZGF0YVJlZiRjdXJyZW50O1xuICAgICAgY29uc3QgZG9tUmVjdCA9IChkb21FbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiBkb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSB8fCB7XG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH07XG4gICAgICBjb25zdCBpc1hBeGlzID0gZGF0YS5heGlzID09PSAneCcgfHwgZGF0YS5heGlzID09PSAnYm90aCc7XG4gICAgICBjb25zdCBpc1lBeGlzID0gZGF0YS5heGlzID09PSAneScgfHwgZGF0YS5heGlzID09PSAnYm90aCc7XG4gICAgICBjb25zdCBjYW5UcmFja0N1cnNvck9uQXV0b1VwZGF0ZSA9IFsnbW91c2VlbnRlcicsICdtb3VzZW1vdmUnXS5pbmNsdWRlcygoKF9kYXRhJGRhdGFSZWYkY3VycmVudCA9IGRhdGEuZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhJGRhdGFSZWYkY3VycmVudC50eXBlKSB8fCAnJykgJiYgZGF0YS5wb2ludGVyVHlwZSAhPT0gJ3RvdWNoJztcbiAgICAgIGxldCB3aWR0aCA9IGRvbVJlY3Qud2lkdGg7XG4gICAgICBsZXQgaGVpZ2h0ID0gZG9tUmVjdC5oZWlnaHQ7XG4gICAgICBsZXQgeCA9IGRvbVJlY3QueDtcbiAgICAgIGxldCB5ID0gZG9tUmVjdC55O1xuICAgICAgaWYgKG9mZnNldFggPT0gbnVsbCAmJiBkYXRhLnggJiYgaXNYQXhpcykge1xuICAgICAgICBvZmZzZXRYID0gZG9tUmVjdC54IC0gZGF0YS54O1xuICAgICAgfVxuICAgICAgaWYgKG9mZnNldFkgPT0gbnVsbCAmJiBkYXRhLnkgJiYgaXNZQXhpcykge1xuICAgICAgICBvZmZzZXRZID0gZG9tUmVjdC55IC0gZGF0YS55O1xuICAgICAgfVxuICAgICAgeCAtPSBvZmZzZXRYIHx8IDA7XG4gICAgICB5IC09IG9mZnNldFkgfHwgMDtcbiAgICAgIHdpZHRoID0gMDtcbiAgICAgIGhlaWdodCA9IDA7XG4gICAgICBpZiAoIWlzQXV0b1VwZGF0ZUV2ZW50IHx8IGNhblRyYWNrQ3Vyc29yT25BdXRvVXBkYXRlKSB7XG4gICAgICAgIHdpZHRoID0gZGF0YS5heGlzID09PSAneScgPyBkb21SZWN0LndpZHRoIDogMDtcbiAgICAgICAgaGVpZ2h0ID0gZGF0YS5heGlzID09PSAneCcgPyBkb21SZWN0LmhlaWdodCA6IDA7XG4gICAgICAgIHggPSBpc1hBeGlzICYmIGRhdGEueCAhPSBudWxsID8gZGF0YS54IDogeDtcbiAgICAgICAgeSA9IGlzWUF4aXMgJiYgZGF0YS55ICE9IG51bGwgPyBkYXRhLnkgOiB5O1xuICAgICAgfSBlbHNlIGlmIChpc0F1dG9VcGRhdGVFdmVudCAmJiAhY2FuVHJhY2tDdXJzb3JPbkF1dG9VcGRhdGUpIHtcbiAgICAgICAgaGVpZ2h0ID0gZGF0YS5heGlzID09PSAneCcgPyBkb21SZWN0LmhlaWdodCA6IGhlaWdodDtcbiAgICAgICAgd2lkdGggPSBkYXRhLmF4aXMgPT09ICd5JyA/IGRvbVJlY3Qud2lkdGggOiB3aWR0aDtcbiAgICAgIH1cbiAgICAgIGlzQXV0b1VwZGF0ZUV2ZW50ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHRvcDogeSxcbiAgICAgICAgcmlnaHQ6IHggKyB3aWR0aCxcbiAgICAgICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgICAgICBsZWZ0OiB4XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGlzTW91c2VCYXNlZEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBldmVudCAhPSBudWxsICYmIGV2ZW50LmNsaWVudFggIT0gbnVsbDtcbn1cbi8qKlxuICogUG9zaXRpb25zIHRoZSBmbG9hdGluZyBlbGVtZW50IHJlbGF0aXZlIHRvIGEgY2xpZW50IHBvaW50IChpbiB0aGUgdmlld3BvcnQpLFxuICogc3VjaCBhcyB0aGUgbW91c2UgcG9zaXRpb24uIEJ5IGRlZmF1bHQsIGl0IGZvbGxvd3MgdGhlIG1vdXNlIGN1cnNvci5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VDbGllbnRQb2ludFxuICovXG5mdW5jdGlvbiB1c2VDbGllbnRQb2ludChjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZGF0YVJlZixcbiAgICBlbGVtZW50czoge1xuICAgICAgZmxvYXRpbmcsXG4gICAgICBkb21SZWZlcmVuY2VcbiAgICB9LFxuICAgIHJlZnNcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBheGlzID0gJ2JvdGgnLFxuICAgIHggPSBudWxsLFxuICAgIHkgPSBudWxsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgaW5pdGlhbFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGNsZWFudXBMaXN0ZW5lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgW3BvaW50ZXJUeXBlLCBzZXRQb2ludGVyVHlwZV0gPSBSZWFjdC51c2VTdGF0ZSgpO1xuICBjb25zdCBbcmVhY3RpdmUsIHNldFJlYWN0aXZlXSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgY29uc3Qgc2V0UmVmZXJlbmNlID0gdXNlRWZmZWN0RXZlbnQoKHgsIHkpID0+IHtcbiAgICBpZiAoaW5pdGlhbFJlZi5jdXJyZW50KSByZXR1cm47XG5cbiAgICAvLyBQcmV2ZW50IHNldHRpbmcgaWYgdGhlIG9wZW4gZXZlbnQgd2FzIG5vdCBhIG1vdXNlLWxpa2Ugb25lXG4gICAgLy8gKGUuZy4gZm9jdXMgdG8gb3BlbiwgdGhlbiBob3ZlciBvdmVyIHRoZSByZWZlcmVuY2UgZWxlbWVudCkuXG4gICAgLy8gT25seSBhcHBseSBpZiB0aGUgZXZlbnQgZXhpc3RzLlxuICAgIGlmIChkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ICYmICFpc01vdXNlQmFzZWRFdmVudChkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWZzLnNldFBvc2l0aW9uUmVmZXJlbmNlKGNyZWF0ZVZpcnR1YWxFbGVtZW50KGRvbVJlZmVyZW5jZSwge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBheGlzLFxuICAgICAgZGF0YVJlZixcbiAgICAgIHBvaW50ZXJUeXBlXG4gICAgfSkpO1xuICB9KTtcbiAgY29uc3QgaGFuZGxlUmVmZXJlbmNlRW50ZXJPck1vdmUgPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgaWYgKHggIT0gbnVsbCB8fCB5ICE9IG51bGwpIHJldHVybjtcbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIHNldFJlZmVyZW5jZShldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICB9IGVsc2UgaWYgKCFjbGVhbnVwTGlzdGVuZXJSZWYuY3VycmVudCkge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBjbGVhbnVwLCB0aGVyZSdzIG5vIGxpc3RlbmVyLCBidXQgd2Ugd2FudCB0byBlbnN1cmVcbiAgICAgIC8vIHdlIGFkZCB0aGUgbGlzdGVuZXIgaWYgdGhlIGN1cnNvciBsYW5kZWQgb24gdGhlIGZsb2F0aW5nIGVsZW1lbnQgYW5kXG4gICAgICAvLyB0aGVuIGJhY2sgb24gdGhlIHJlZmVyZW5jZSAoaS5lLiBpdCdzIGludGVyYWN0aXZlKS5cbiAgICAgIHNldFJlYWN0aXZlKFtdKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIElmIHRoZSBwb2ludGVyIGlzIGEgbW91c2UtbGlrZSBwb2ludGVyLCB3ZSB3YW50IHRvIGNvbnRpbnVlIGZvbGxvd2luZyB0aGVcbiAgLy8gbW91c2UgZXZlbiBpZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBpcyB0cmFuc2l0aW9uaW5nIG91dC4gT24gdG91Y2hcbiAgLy8gZGV2aWNlcywgdGhpcyBpcyB1bmRlc2lyYWJsZSBiZWNhdXNlIHRoZSBmbG9hdGluZyBlbGVtZW50IHdpbGwgbW92ZSB0b1xuICAvLyB0aGUgZGlzbWlzc2FsIHRvdWNoIHBvaW50LlxuICBjb25zdCBvcGVuQ2hlY2sgPSBpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlKSA/IGZsb2F0aW5nIDogb3BlbjtcbiAgY29uc3QgYWRkTGlzdGVuZXIgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gRXhwbGljaXRseSBzcGVjaWZpZWQgYHhgL2B5YCBjb29yZGluYXRlcyBzaG91bGRuJ3QgYWRkIGEgbGlzdGVuZXIuXG4gICAgaWYgKCFvcGVuQ2hlY2sgfHwgIWVuYWJsZWQgfHwgeCAhPSBudWxsIHx8IHkgIT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhmbG9hdGluZyk7XG4gICAgZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQpO1xuICAgICAgaWYgKCFjb250YWlucyhmbG9hdGluZywgdGFyZ2V0KSkge1xuICAgICAgICBzZXRSZWZlcmVuY2UoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgY2xlYW51cExpc3RlbmVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQgfHwgaXNNb3VzZUJhc2VkRXZlbnQoZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCkpIHtcbiAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIGNsZWFudXBMaXN0ZW5lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH07XG4gICAgICBjbGVhbnVwTGlzdGVuZXJSZWYuY3VycmVudCA9IGNsZWFudXA7XG4gICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9XG4gICAgcmVmcy5zZXRQb3NpdGlvblJlZmVyZW5jZShkb21SZWZlcmVuY2UpO1xuICB9LCBbb3BlbkNoZWNrLCBlbmFibGVkLCB4LCB5LCBmbG9hdGluZywgZGF0YVJlZiwgcmVmcywgZG9tUmVmZXJlbmNlLCBzZXRSZWZlcmVuY2VdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gYWRkTGlzdGVuZXIoKTtcbiAgfSwgW2FkZExpc3RlbmVyLCByZWFjdGl2ZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlbmFibGVkICYmICFmbG9hdGluZykge1xuICAgICAgaW5pdGlhbFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgZmxvYXRpbmddKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQgJiYgb3Blbikge1xuICAgICAgaW5pdGlhbFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG4gIH0sIFtlbmFibGVkLCBvcGVuXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoZW5hYmxlZCAmJiAoeCAhPSBudWxsIHx8IHkgIT0gbnVsbCkpIHtcbiAgICAgIGluaXRpYWxSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgc2V0UmVmZXJlbmNlKHgsIHkpO1xuICAgIH1cbiAgfSwgW2VuYWJsZWQsIHgsIHksIHNldFJlZmVyZW5jZV0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm4ge307XG4gICAgZnVuY3Rpb24gc2V0UG9pbnRlclR5cGVSZWYoX3JlZikge1xuICAgICAgbGV0IHtcbiAgICAgICAgcG9pbnRlclR5cGVcbiAgICAgIH0gPSBfcmVmO1xuICAgICAgc2V0UG9pbnRlclR5cGUocG9pbnRlclR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgIG9uUG9pbnRlckRvd246IHNldFBvaW50ZXJUeXBlUmVmLFxuICAgICAgICBvblBvaW50ZXJFbnRlcjogc2V0UG9pbnRlclR5cGVSZWYsXG4gICAgICAgIG9uTW91c2VNb3ZlOiBoYW5kbGVSZWZlcmVuY2VFbnRlck9yTW92ZSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBoYW5kbGVSZWZlcmVuY2VFbnRlck9yTW92ZVxuICAgICAgfVxuICAgIH07XG4gIH0sIFtlbmFibGVkLCBoYW5kbGVSZWZlcmVuY2VFbnRlck9yTW92ZV0pO1xufVxuXG5jb25zdCBidWJibGVIYW5kbGVyS2V5cyA9IHtcbiAgcG9pbnRlcmRvd246ICdvblBvaW50ZXJEb3duJyxcbiAgbW91c2Vkb3duOiAnb25Nb3VzZURvd24nLFxuICBjbGljazogJ29uQ2xpY2snXG59O1xuY29uc3QgY2FwdHVyZUhhbmRsZXJLZXlzID0ge1xuICBwb2ludGVyZG93bjogJ29uUG9pbnRlckRvd25DYXB0dXJlJyxcbiAgbW91c2Vkb3duOiAnb25Nb3VzZURvd25DYXB0dXJlJyxcbiAgY2xpY2s6ICdvbkNsaWNrQ2FwdHVyZSdcbn07XG5jb25zdCBub3JtYWxpemVQcm9wID0gbm9ybWFsaXphYmxlID0+IHtcbiAgdmFyIF9ub3JtYWxpemFibGUkZXNjYXBlSywgX25vcm1hbGl6YWJsZSRvdXRzaWRlO1xuICByZXR1cm4ge1xuICAgIGVzY2FwZUtleTogdHlwZW9mIG5vcm1hbGl6YWJsZSA9PT0gJ2Jvb2xlYW4nID8gbm9ybWFsaXphYmxlIDogKF9ub3JtYWxpemFibGUkZXNjYXBlSyA9IG5vcm1hbGl6YWJsZSA9PSBudWxsID8gdm9pZCAwIDogbm9ybWFsaXphYmxlLmVzY2FwZUtleSkgIT0gbnVsbCA/IF9ub3JtYWxpemFibGUkZXNjYXBlSyA6IGZhbHNlLFxuICAgIG91dHNpZGVQcmVzczogdHlwZW9mIG5vcm1hbGl6YWJsZSA9PT0gJ2Jvb2xlYW4nID8gbm9ybWFsaXphYmxlIDogKF9ub3JtYWxpemFibGUkb3V0c2lkZSA9IG5vcm1hbGl6YWJsZSA9PSBudWxsID8gdm9pZCAwIDogbm9ybWFsaXphYmxlLm91dHNpZGVQcmVzcykgIT0gbnVsbCA/IF9ub3JtYWxpemFibGUkb3V0c2lkZSA6IHRydWVcbiAgfTtcbn07XG4vKipcbiAqIENsb3NlcyB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGVuIGEgZGlzbWlzc2FsIGlzIHJlcXVlc3RlZCDigJQgYnkgZGVmYXVsdCwgd2hlblxuICogdGhlIHVzZXIgcHJlc3NlcyB0aGUgYGVzY2FwZWAga2V5IG9yIG91dHNpZGUgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlRGlzbWlzc1xuICovXG5mdW5jdGlvbiB1c2VEaXNtaXNzKGNvbnRleHQsIHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIHJlZmVyZW5jZSxcbiAgICAgIGRvbVJlZmVyZW5jZSxcbiAgICAgIGZsb2F0aW5nXG4gICAgfSxcbiAgICBkYXRhUmVmXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgZXNjYXBlS2V5ID0gdHJ1ZSxcbiAgICBvdXRzaWRlUHJlc3M6IHVuc3RhYmxlX291dHNpZGVQcmVzcyA9IHRydWUsXG4gICAgb3V0c2lkZVByZXNzRXZlbnQgPSAncG9pbnRlcmRvd24nLFxuICAgIHJlZmVyZW5jZVByZXNzID0gZmFsc2UsXG4gICAgcmVmZXJlbmNlUHJlc3NFdmVudCA9ICdwb2ludGVyZG93bicsXG4gICAgYW5jZXN0b3JTY3JvbGwgPSBmYWxzZSxcbiAgICBidWJibGVzLFxuICAgIGNhcHR1cmVcbiAgfSA9IHByb3BzO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGNvbnN0IG91dHNpZGVQcmVzc0ZuID0gdXNlRWZmZWN0RXZlbnQodHlwZW9mIHVuc3RhYmxlX291dHNpZGVQcmVzcyA9PT0gJ2Z1bmN0aW9uJyA/IHVuc3RhYmxlX291dHNpZGVQcmVzcyA6ICgpID0+IGZhbHNlKTtcbiAgY29uc3Qgb3V0c2lkZVByZXNzID0gdHlwZW9mIHVuc3RhYmxlX291dHNpZGVQcmVzcyA9PT0gJ2Z1bmN0aW9uJyA/IG91dHNpZGVQcmVzc0ZuIDogdW5zdGFibGVfb3V0c2lkZVByZXNzO1xuICBjb25zdCBpbnNpZGVSZWFjdFRyZWVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBlbmRlZE9yU3RhcnRlZEluc2lkZVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHtcbiAgICBlc2NhcGVLZXk6IGVzY2FwZUtleUJ1YmJsZXMsXG4gICAgb3V0c2lkZVByZXNzOiBvdXRzaWRlUHJlc3NCdWJibGVzXG4gIH0gPSBub3JtYWxpemVQcm9wKGJ1YmJsZXMpO1xuICBjb25zdCB7XG4gICAgZXNjYXBlS2V5OiBlc2NhcGVLZXlDYXB0dXJlLFxuICAgIG91dHNpZGVQcmVzczogb3V0c2lkZVByZXNzQ2FwdHVyZVxuICB9ID0gbm9ybWFsaXplUHJvcChjYXB0dXJlKTtcbiAgY29uc3QgY2xvc2VPbkVzY2FwZUtleURvd24gPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgdmFyIF9kYXRhUmVmJGN1cnJlbnQkZmxvYTtcbiAgICBpZiAoIW9wZW4gfHwgIWVuYWJsZWQgfHwgIWVzY2FwZUtleSB8fCBldmVudC5rZXkgIT09ICdFc2NhcGUnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5vZGVJZCA9IChfZGF0YVJlZiRjdXJyZW50JGZsb2EgPSBkYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX2RhdGFSZWYkY3VycmVudCRmbG9hLm5vZGVJZDtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRyZWUgPyBnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkgOiBbXTtcbiAgICBpZiAoIWVzY2FwZUtleUJ1YmJsZXMpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IHNob3VsZERpc21pc3MgPSB0cnVlO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICB2YXIgX2NoaWxkJGNvbnRleHQ7XG4gICAgICAgICAgaWYgKChfY2hpbGQkY29udGV4dCA9IGNoaWxkLmNvbnRleHQpICE9IG51bGwgJiYgX2NoaWxkJGNvbnRleHQub3BlbiAmJiAhY2hpbGQuY29udGV4dC5kYXRhUmVmLmN1cnJlbnQuX19lc2NhcGVLZXlCdWJibGVzKSB7XG4gICAgICAgICAgICBzaG91bGREaXNtaXNzID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFzaG91bGREaXNtaXNzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgaXNSZWFjdEV2ZW50KGV2ZW50KSA/IGV2ZW50Lm5hdGl2ZUV2ZW50IDogZXZlbnQsICdlc2NhcGUta2V5Jyk7XG4gIH0pO1xuICBjb25zdCBjbG9zZU9uRXNjYXBlS2V5RG93bkNhcHR1cmUgPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgdmFyIF9nZXRUYXJnZXQyO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdmFyIF9nZXRUYXJnZXQ7XG4gICAgICBjbG9zZU9uRXNjYXBlS2V5RG93bihldmVudCk7XG4gICAgICAoX2dldFRhcmdldCA9IGdldFRhcmdldChldmVudCkpID09IG51bGwgfHwgX2dldFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2FsbGJhY2spO1xuICAgIH07XG4gICAgKF9nZXRUYXJnZXQyID0gZ2V0VGFyZ2V0KGV2ZW50KSkgPT0gbnVsbCB8fCBfZ2V0VGFyZ2V0Mi5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2FsbGJhY2spO1xuICB9KTtcbiAgY29uc3QgY2xvc2VPblByZXNzT3V0c2lkZSA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICB2YXIgX2RhdGFSZWYkY3VycmVudCRmbG9hMjtcbiAgICAvLyBHaXZlbiBkZXZlbG9wZXJzIGNhbiBzdG9wIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGUgc3ludGhldGljIGV2ZW50LFxuICAgIC8vIHdlIGNhbiBvbmx5IGJlIGNvbmZpZGVudCB3aXRoIGEgcG9zaXRpdmUgdmFsdWUuXG4gICAgY29uc3QgaW5zaWRlUmVhY3RUcmVlID0gaW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQ7XG4gICAgaW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSBmYWxzZTtcblxuICAgIC8vIFdoZW4gY2xpY2sgb3V0c2lkZSBpcyBsYXp5IChgY2xpY2tgIGV2ZW50KSwgaGFuZGxlIGRyYWdnaW5nLlxuICAgIC8vIERvbid0IGNsb3NlIGlmOlxuICAgIC8vIC0gVGhlIGNsaWNrIHN0YXJ0ZWQgaW5zaWRlIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICAgIC8vIC0gVGhlIGNsaWNrIGVuZGVkIGluc2lkZSB0aGUgZmxvYXRpbmcgZWxlbWVudC5cbiAgICBjb25zdCBlbmRlZE9yU3RhcnRlZEluc2lkZSA9IGVuZGVkT3JTdGFydGVkSW5zaWRlUmVmLmN1cnJlbnQ7XG4gICAgZW5kZWRPclN0YXJ0ZWRJbnNpZGVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGlmIChvdXRzaWRlUHJlc3NFdmVudCA9PT0gJ2NsaWNrJyAmJiBlbmRlZE9yU3RhcnRlZEluc2lkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5zaWRlUmVhY3RUcmVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3V0c2lkZVByZXNzID09PSAnZnVuY3Rpb24nICYmICFvdXRzaWRlUHJlc3MoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudCk7XG4gICAgY29uc3QgaW5lcnRTZWxlY3RvciA9IFwiW1wiICsgY3JlYXRlQXR0cmlidXRlKCdpbmVydCcpICsgXCJdXCI7XG4gICAgY29uc3QgbWFya2VycyA9IGdldERvY3VtZW50KGZsb2F0aW5nKS5xdWVyeVNlbGVjdG9yQWxsKGluZXJ0U2VsZWN0b3IpO1xuICAgIGxldCB0YXJnZXRSb290QW5jZXN0b3IgPSBpc0VsZW1lbnQodGFyZ2V0KSA/IHRhcmdldCA6IG51bGw7XG4gICAgd2hpbGUgKHRhcmdldFJvb3RBbmNlc3RvciAmJiAhaXNMYXN0VHJhdmVyc2FibGVOb2RlKHRhcmdldFJvb3RBbmNlc3RvcikpIHtcbiAgICAgIGNvbnN0IG5leHRQYXJlbnQgPSBnZXRQYXJlbnROb2RlKHRhcmdldFJvb3RBbmNlc3Rvcik7XG4gICAgICBpZiAoaXNMYXN0VHJhdmVyc2FibGVOb2RlKG5leHRQYXJlbnQpIHx8ICFpc0VsZW1lbnQobmV4dFBhcmVudCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0YXJnZXRSb290QW5jZXN0b3IgPSBuZXh0UGFyZW50O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBjbGljayBvY2N1cnJlZCBvbiBhIHRoaXJkLXBhcnR5IGVsZW1lbnQgaW5qZWN0ZWQgYWZ0ZXIgdGhlXG4gICAgLy8gZmxvYXRpbmcgZWxlbWVudCByZW5kZXJlZC5cbiAgICBpZiAobWFya2Vycy5sZW5ndGggJiYgaXNFbGVtZW50KHRhcmdldCkgJiYgIWlzUm9vdEVsZW1lbnQodGFyZ2V0KSAmJlxuICAgIC8vIENsaWNrZWQgb24gYSBkaXJlY3QgYW5jZXN0b3IgKGUuZy4gRmxvYXRpbmdPdmVybGF5KS5cbiAgICAhY29udGFpbnModGFyZ2V0LCBmbG9hdGluZykgJiZcbiAgICAvLyBJZiB0aGUgdGFyZ2V0IHJvb3QgZWxlbWVudCBjb250YWlucyBub25lIG9mIHRoZSBtYXJrZXJzLCB0aGVuIHRoZVxuICAgIC8vIGVsZW1lbnQgd2FzIGluamVjdGVkIGFmdGVyIHRoZSBmbG9hdGluZyBlbGVtZW50IHJlbmRlcmVkLlxuICAgIEFycmF5LmZyb20obWFya2VycykuZXZlcnkobWFya2VyID0+ICFjb250YWlucyh0YXJnZXRSb290QW5jZXN0b3IsIG1hcmtlcikpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWNrIG9jY3VycmVkIG9uIHRoZSBzY3JvbGxiYXJcbiAgICBpZiAoaXNIVE1MRWxlbWVudCh0YXJnZXQpICYmIGZsb2F0aW5nKSB7XG4gICAgICAvLyBJbiBGaXJlZm94LCBgdGFyZ2V0LnNjcm9sbFdpZHRoID4gdGFyZ2V0LmNsaWVudFdpZHRoYCBmb3IgaW5saW5lXG4gICAgICAvLyBlbGVtZW50cy5cbiAgICAgIGNvbnN0IGNhblNjcm9sbFggPSB0YXJnZXQuY2xpZW50V2lkdGggPiAwICYmIHRhcmdldC5zY3JvbGxXaWR0aCA+IHRhcmdldC5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IGNhblNjcm9sbFkgPSB0YXJnZXQuY2xpZW50SGVpZ2h0ID4gMCAmJiB0YXJnZXQuc2Nyb2xsSGVpZ2h0ID4gdGFyZ2V0LmNsaWVudEhlaWdodDtcbiAgICAgIGxldCB4Q29uZCA9IGNhblNjcm9sbFkgJiYgZXZlbnQub2Zmc2V0WCA+IHRhcmdldC5jbGllbnRXaWR0aDtcblxuICAgICAgLy8gSW4gc29tZSBicm93c2VycyBpdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIDxib2R5PiAob3Igd2luZG93KVxuICAgICAgLy8gc2Nyb2xsYmFyIHRvIHRoZSBsZWZ0IHNpZGUsIGJ1dCBpcyB2ZXJ5IHJhcmUgYW5kIGlzIGRpZmZpY3VsdCB0b1xuICAgICAgLy8gY2hlY2sgZm9yLiBQbHVzLCBmb3IgbW9kYWwgZGlhbG9ncyB3aXRoIGJhY2tkcm9wcywgaXQgaXMgbW9yZVxuICAgICAgLy8gaW1wb3J0YW50IHRoYXQgdGhlIGJhY2tkcm9wIGlzIGNoZWNrZWQgYnV0IG5vdCBzbyBtdWNoIHRoZSB3aW5kb3cuXG4gICAgICBpZiAoY2FuU2Nyb2xsWSkge1xuICAgICAgICBjb25zdCBpc1JUTCA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5kaXJlY3Rpb24gPT09ICdydGwnO1xuICAgICAgICBpZiAoaXNSVEwpIHtcbiAgICAgICAgICB4Q29uZCA9IGV2ZW50Lm9mZnNldFggPD0gdGFyZ2V0Lm9mZnNldFdpZHRoIC0gdGFyZ2V0LmNsaWVudFdpZHRoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoeENvbmQgfHwgY2FuU2Nyb2xsWCAmJiBldmVudC5vZmZzZXRZID4gdGFyZ2V0LmNsaWVudEhlaWdodCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5vZGVJZCA9IChfZGF0YVJlZiRjdXJyZW50JGZsb2EyID0gZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhUmVmJGN1cnJlbnQkZmxvYTIubm9kZUlkO1xuICAgIGNvbnN0IHRhcmdldElzSW5zaWRlQ2hpbGRyZW4gPSB0cmVlICYmIGdldENoaWxkcmVuKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKS5zb21lKG5vZGUgPT4ge1xuICAgICAgdmFyIF9ub2RlJGNvbnRleHQ7XG4gICAgICByZXR1cm4gaXNFdmVudFRhcmdldFdpdGhpbihldmVudCwgKF9ub2RlJGNvbnRleHQgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0LmVsZW1lbnRzLmZsb2F0aW5nKTtcbiAgICB9KTtcbiAgICBpZiAoaXNFdmVudFRhcmdldFdpdGhpbihldmVudCwgZmxvYXRpbmcpIHx8IGlzRXZlbnRUYXJnZXRXaXRoaW4oZXZlbnQsIGRvbVJlZmVyZW5jZSkgfHwgdGFyZ2V0SXNJbnNpZGVDaGlsZHJlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRyZWUgPyBnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkgOiBbXTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHNob3VsZERpc21pc3MgPSB0cnVlO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIHZhciBfY2hpbGQkY29udGV4dDI7XG4gICAgICAgIGlmICgoX2NoaWxkJGNvbnRleHQyID0gY2hpbGQuY29udGV4dCkgIT0gbnVsbCAmJiBfY2hpbGQkY29udGV4dDIub3BlbiAmJiAhY2hpbGQuY29udGV4dC5kYXRhUmVmLmN1cnJlbnQuX19vdXRzaWRlUHJlc3NCdWJibGVzKSB7XG4gICAgICAgICAgc2hvdWxkRGlzbWlzcyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIXNob3VsZERpc21pc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50LCAnb3V0c2lkZS1wcmVzcycpO1xuICB9KTtcbiAgY29uc3QgY2xvc2VPblByZXNzT3V0c2lkZUNhcHR1cmUgPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgdmFyIF9nZXRUYXJnZXQ0O1xuICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdmFyIF9nZXRUYXJnZXQzO1xuICAgICAgY2xvc2VPblByZXNzT3V0c2lkZShldmVudCk7XG4gICAgICAoX2dldFRhcmdldDMgPSBnZXRUYXJnZXQoZXZlbnQpKSA9PSBudWxsIHx8IF9nZXRUYXJnZXQzLnJlbW92ZUV2ZW50TGlzdGVuZXIob3V0c2lkZVByZXNzRXZlbnQsIGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIChfZ2V0VGFyZ2V0NCA9IGdldFRhcmdldChldmVudCkpID09IG51bGwgfHwgX2dldFRhcmdldDQuYWRkRXZlbnRMaXN0ZW5lcihvdXRzaWRlUHJlc3NFdmVudCwgY2FsbGJhY2spO1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW9wZW4gfHwgIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGF0YVJlZi5jdXJyZW50Ll9fZXNjYXBlS2V5QnViYmxlcyA9IGVzY2FwZUtleUJ1YmJsZXM7XG4gICAgZGF0YVJlZi5jdXJyZW50Ll9fb3V0c2lkZVByZXNzQnViYmxlcyA9IG91dHNpZGVQcmVzc0J1YmJsZXM7XG4gICAgZnVuY3Rpb24gb25TY3JvbGwoZXZlbnQpIHtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsICdhbmNlc3Rvci1zY3JvbGwnKTtcbiAgICB9XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoZmxvYXRpbmcpO1xuICAgIGVzY2FwZUtleSAmJiBkb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVzY2FwZUtleUNhcHR1cmUgPyBjbG9zZU9uRXNjYXBlS2V5RG93bkNhcHR1cmUgOiBjbG9zZU9uRXNjYXBlS2V5RG93biwgZXNjYXBlS2V5Q2FwdHVyZSk7XG4gICAgb3V0c2lkZVByZXNzICYmIGRvYy5hZGRFdmVudExpc3RlbmVyKG91dHNpZGVQcmVzc0V2ZW50LCBvdXRzaWRlUHJlc3NDYXB0dXJlID8gY2xvc2VPblByZXNzT3V0c2lkZUNhcHR1cmUgOiBjbG9zZU9uUHJlc3NPdXRzaWRlLCBvdXRzaWRlUHJlc3NDYXB0dXJlKTtcbiAgICBsZXQgYW5jZXN0b3JzID0gW107XG4gICAgaWYgKGFuY2VzdG9yU2Nyb2xsKSB7XG4gICAgICBpZiAoaXNFbGVtZW50KGRvbVJlZmVyZW5jZSkpIHtcbiAgICAgICAgYW5jZXN0b3JzID0gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZG9tUmVmZXJlbmNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0VsZW1lbnQoZmxvYXRpbmcpKSB7XG4gICAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5jb25jYXQoZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZmxvYXRpbmcpKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNFbGVtZW50KHJlZmVyZW5jZSkgJiYgcmVmZXJlbmNlICYmIHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkge1xuICAgICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMuY29uY2F0KGdldE92ZXJmbG93QW5jZXN0b3JzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElnbm9yZSB0aGUgdmlzdWFsIHZpZXdwb3J0IGZvciBzY3JvbGxpbmcgZGlzbWlzc2FsIChhbGxvdyBwaW5jaC16b29tKVxuICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5maWx0ZXIoYW5jZXN0b3IgPT4ge1xuICAgICAgdmFyIF9kb2MkZGVmYXVsdFZpZXc7XG4gICAgICByZXR1cm4gYW5jZXN0b3IgIT09ICgoX2RvYyRkZWZhdWx0VmlldyA9IGRvYy5kZWZhdWx0VmlldykgPT0gbnVsbCA/IHZvaWQgMCA6IF9kb2MkZGVmYXVsdFZpZXcudmlzdWFsVmlld3BvcnQpO1xuICAgIH0pO1xuICAgIGFuY2VzdG9ycy5mb3JFYWNoKGFuY2VzdG9yID0+IHtcbiAgICAgIGFuY2VzdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBlc2NhcGVLZXkgJiYgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlc2NhcGVLZXlDYXB0dXJlID8gY2xvc2VPbkVzY2FwZUtleURvd25DYXB0dXJlIDogY2xvc2VPbkVzY2FwZUtleURvd24sIGVzY2FwZUtleUNhcHR1cmUpO1xuICAgICAgb3V0c2lkZVByZXNzICYmIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKG91dHNpZGVQcmVzc0V2ZW50LCBvdXRzaWRlUHJlc3NDYXB0dXJlID8gY2xvc2VPblByZXNzT3V0c2lkZUNhcHR1cmUgOiBjbG9zZU9uUHJlc3NPdXRzaWRlLCBvdXRzaWRlUHJlc3NDYXB0dXJlKTtcbiAgICAgIGFuY2VzdG9ycy5mb3JFYWNoKGFuY2VzdG9yID0+IHtcbiAgICAgICAgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGwpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW2RhdGFSZWYsIGZsb2F0aW5nLCBkb21SZWZlcmVuY2UsIHJlZmVyZW5jZSwgZXNjYXBlS2V5LCBvdXRzaWRlUHJlc3MsIG91dHNpZGVQcmVzc0V2ZW50LCBvcGVuLCBvbk9wZW5DaGFuZ2UsIGFuY2VzdG9yU2Nyb2xsLCBlbmFibGVkLCBlc2NhcGVLZXlCdWJibGVzLCBvdXRzaWRlUHJlc3NCdWJibGVzLCBjbG9zZU9uRXNjYXBlS2V5RG93biwgZXNjYXBlS2V5Q2FwdHVyZSwgY2xvc2VPbkVzY2FwZUtleURvd25DYXB0dXJlLCBjbG9zZU9uUHJlc3NPdXRzaWRlLCBvdXRzaWRlUHJlc3NDYXB0dXJlLCBjbG9zZU9uUHJlc3NPdXRzaWRlQ2FwdHVyZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGluc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gIH0sIFtvdXRzaWRlUHJlc3MsIG91dHNpZGVQcmVzc0V2ZW50XSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICBvbktleURvd246IGNsb3NlT25Fc2NhcGVLZXlEb3duLFxuICAgICAgICBbYnViYmxlSGFuZGxlcktleXNbcmVmZXJlbmNlUHJlc3NFdmVudF1dOiBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKHJlZmVyZW5jZVByZXNzKSB7XG4gICAgICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAncmVmZXJlbmNlLXByZXNzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmxvYXRpbmc6IHtcbiAgICAgICAgb25LZXlEb3duOiBjbG9zZU9uRXNjYXBlS2V5RG93bixcbiAgICAgICAgb25Nb3VzZURvd24oKSB7XG4gICAgICAgICAgZW5kZWRPclN0YXJ0ZWRJbnNpZGVSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTW91c2VVcCgpIHtcbiAgICAgICAgICBlbmRlZE9yU3RhcnRlZEluc2lkZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgW2NhcHR1cmVIYW5kbGVyS2V5c1tvdXRzaWRlUHJlc3NFdmVudF1dOiAoKSA9PiB7XG4gICAgICAgICAgaW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIHJlZmVyZW5jZVByZXNzLCBvdXRzaWRlUHJlc3NFdmVudCwgcmVmZXJlbmNlUHJlc3NFdmVudCwgb25PcGVuQ2hhbmdlLCBjbG9zZU9uRXNjYXBlS2V5RG93bl0pO1xufVxuXG5mdW5jdGlvbiB1c2VGbG9hdGluZ1Jvb3RDb250ZXh0KG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIG9wZW4gPSBmYWxzZSxcbiAgICBvbk9wZW5DaGFuZ2U6IG9uT3BlbkNoYW5nZVByb3AsXG4gICAgZWxlbWVudHM6IGVsZW1lbnRzUHJvcFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZmxvYXRpbmdJZCA9IHVzZUlkKCk7XG4gIGNvbnN0IGRhdGFSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICBjb25zdCBbZXZlbnRzXSA9IFJlYWN0LnVzZVN0YXRlKCgpID0+IGNyZWF0ZVB1YlN1YigpKTtcbiAgY29uc3QgbmVzdGVkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKSAhPSBudWxsO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc3Qgb3B0aW9uRG9tUmVmZXJlbmNlID0gZWxlbWVudHNQcm9wLnJlZmVyZW5jZTtcbiAgICBpZiAob3B0aW9uRG9tUmVmZXJlbmNlICYmICFpc0VsZW1lbnQob3B0aW9uRG9tUmVmZXJlbmNlKSkge1xuICAgICAgZXJyb3IoJ0Nhbm5vdCBwYXNzIGEgdmlydHVhbCBlbGVtZW50IHRvIHRoZSBgZWxlbWVudHMucmVmZXJlbmNlYCBvcHRpb24sJywgJ2FzIGl0IG11c3QgYmUgYSByZWFsIERPTSBlbGVtZW50LiBVc2UgYHJlZnMuc2V0UG9zaXRpb25SZWZlcmVuY2UoKWAnLCAnaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW3Bvc2l0aW9uUmVmZXJlbmNlLCBzZXRQb3NpdGlvblJlZmVyZW5jZV0gPSBSZWFjdC51c2VTdGF0ZShlbGVtZW50c1Byb3AucmVmZXJlbmNlKTtcbiAgY29uc3Qgb25PcGVuQ2hhbmdlID0gdXNlRWZmZWN0RXZlbnQoKG9wZW4sIGV2ZW50LCByZWFzb24pID0+IHtcbiAgICBkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ID0gb3BlbiA/IGV2ZW50IDogdW5kZWZpbmVkO1xuICAgIGV2ZW50cy5lbWl0KCdvcGVuY2hhbmdlJywge1xuICAgICAgb3BlbixcbiAgICAgIGV2ZW50LFxuICAgICAgcmVhc29uLFxuICAgICAgbmVzdGVkXG4gICAgfSk7XG4gICAgb25PcGVuQ2hhbmdlUHJvcCA9PSBudWxsIHx8IG9uT3BlbkNoYW5nZVByb3Aob3BlbiwgZXZlbnQsIHJlYXNvbik7XG4gIH0pO1xuICBjb25zdCByZWZzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHNldFBvc2l0aW9uUmVmZXJlbmNlXG4gIH0pLCBbXSk7XG4gIGNvbnN0IGVsZW1lbnRzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJlZmVyZW5jZTogcG9zaXRpb25SZWZlcmVuY2UgfHwgZWxlbWVudHNQcm9wLnJlZmVyZW5jZSB8fCBudWxsLFxuICAgIGZsb2F0aW5nOiBlbGVtZW50c1Byb3AuZmxvYXRpbmcgfHwgbnVsbCxcbiAgICBkb21SZWZlcmVuY2U6IGVsZW1lbnRzUHJvcC5yZWZlcmVuY2VcbiAgfSksIFtwb3NpdGlvblJlZmVyZW5jZSwgZWxlbWVudHNQcm9wLnJlZmVyZW5jZSwgZWxlbWVudHNQcm9wLmZsb2F0aW5nXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZGF0YVJlZixcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBlbGVtZW50cyxcbiAgICBldmVudHMsXG4gICAgZmxvYXRpbmdJZCxcbiAgICByZWZzXG4gIH0pLCBbb3Blbiwgb25PcGVuQ2hhbmdlLCBlbGVtZW50cywgZXZlbnRzLCBmbG9hdGluZ0lkLCByZWZzXSk7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhIGZsb2F0aW5nIGVsZW1lbnQgYW5kIGNvbnRleHQgdG8gYWRkIGludGVyYWN0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VGbG9hdGluZ1xuICovXG5mdW5jdGlvbiB1c2VGbG9hdGluZyhvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG5vZGVJZFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaW50ZXJuYWxSb290Q29udGV4dCA9IHVzZUZsb2F0aW5nUm9vdENvbnRleHQoe1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIHJlZmVyZW5jZTogbnVsbCxcbiAgICAgIGZsb2F0aW5nOiBudWxsLFxuICAgICAgLi4ub3B0aW9ucy5lbGVtZW50c1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHJvb3RDb250ZXh0ID0gb3B0aW9ucy5yb290Q29udGV4dCB8fCBpbnRlcm5hbFJvb3RDb250ZXh0O1xuICBjb25zdCBjb21wdXRlZEVsZW1lbnRzID0gcm9vdENvbnRleHQuZWxlbWVudHM7XG4gIGNvbnN0IFtfZG9tUmVmZXJlbmNlLCBzZXREb21SZWZlcmVuY2VdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtwb3NpdGlvblJlZmVyZW5jZSwgX3NldFBvc2l0aW9uUmVmZXJlbmNlXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBvcHRpb25Eb21SZWZlcmVuY2UgPSBjb21wdXRlZEVsZW1lbnRzID09IG51bGwgPyB2b2lkIDAgOiBjb21wdXRlZEVsZW1lbnRzLnJlZmVyZW5jZTtcbiAgY29uc3QgZG9tUmVmZXJlbmNlID0gb3B0aW9uRG9tUmVmZXJlbmNlIHx8IF9kb21SZWZlcmVuY2U7XG4gIGNvbnN0IGRvbVJlZmVyZW5jZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRvbVJlZmVyZW5jZSkge1xuICAgICAgZG9tUmVmZXJlbmNlUmVmLmN1cnJlbnQgPSBkb21SZWZlcmVuY2U7XG4gICAgfVxuICB9LCBbZG9tUmVmZXJlbmNlXSk7XG4gIGNvbnN0IHBvc2l0aW9uID0gdXNlRmxvYXRpbmckMSh7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBlbGVtZW50czoge1xuICAgICAgLi4uY29tcHV0ZWRFbGVtZW50cyxcbiAgICAgIC4uLihwb3NpdGlvblJlZmVyZW5jZSAmJiB7XG4gICAgICAgIHJlZmVyZW5jZTogcG9zaXRpb25SZWZlcmVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9KTtcbiAgY29uc3Qgc2V0UG9zaXRpb25SZWZlcmVuY2UgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBjb25zdCBjb21wdXRlZFBvc2l0aW9uUmVmZXJlbmNlID0gaXNFbGVtZW50KG5vZGUpID8ge1xuICAgICAgZ2V0Qm91bmRpbmdDbGllbnRSZWN0OiAoKSA9PiBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgY29udGV4dEVsZW1lbnQ6IG5vZGVcbiAgICB9IDogbm9kZTtcbiAgICAvLyBTdG9yZSB0aGUgcG9zaXRpb25SZWZlcmVuY2UgaW4gc3RhdGUgaWYgdGhlIERPTSByZWZlcmVuY2UgaXMgc3BlY2lmaWVkIGV4dGVybmFsbHkgdmlhIHRoZVxuICAgIC8vIGBlbGVtZW50cy5yZWZlcmVuY2VgIG9wdGlvbi4gVGhpcyBlbnN1cmVzIHRoYXQgaXQgd29uJ3QgYmUgb3ZlcnJpZGRlbiBvbiBmdXR1cmUgcmVuZGVycy5cbiAgICBfc2V0UG9zaXRpb25SZWZlcmVuY2UoY29tcHV0ZWRQb3NpdGlvblJlZmVyZW5jZSk7XG4gICAgcG9zaXRpb24ucmVmcy5zZXRSZWZlcmVuY2UoY29tcHV0ZWRQb3NpdGlvblJlZmVyZW5jZSk7XG4gIH0sIFtwb3NpdGlvbi5yZWZzXSk7XG4gIGNvbnN0IHNldFJlZmVyZW5jZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIGlmIChpc0VsZW1lbnQobm9kZSkgfHwgbm9kZSA9PT0gbnVsbCkge1xuICAgICAgZG9tUmVmZXJlbmNlUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgc2V0RG9tUmVmZXJlbmNlKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIEJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZvciBwYXNzaW5nIGEgdmlydHVhbCBlbGVtZW50IHRvIGByZWZlcmVuY2VgXG4gICAgLy8gYWZ0ZXIgaXQgaGFzIHNldCB0aGUgRE9NIHJlZmVyZW5jZS5cbiAgICBpZiAoaXNFbGVtZW50KHBvc2l0aW9uLnJlZnMucmVmZXJlbmNlLmN1cnJlbnQpIHx8IHBvc2l0aW9uLnJlZnMucmVmZXJlbmNlLmN1cnJlbnQgPT09IG51bGwgfHxcbiAgICAvLyBEb24ndCBhbGxvdyBzZXR0aW5nIHZpcnR1YWwgZWxlbWVudHMgdXNpbmcgdGhlIG9sZCB0ZWNobmlxdWUgYmFjayB0b1xuICAgIC8vIGBudWxsYCB0byBzdXBwb3J0IGBwb3NpdGlvblJlZmVyZW5jZWAgKyBhbiB1bnN0YWJsZSBgcmVmZXJlbmNlYFxuICAgIC8vIGNhbGxiYWNrIHJlZi5cbiAgICBub2RlICE9PSBudWxsICYmICFpc0VsZW1lbnQobm9kZSkpIHtcbiAgICAgIHBvc2l0aW9uLnJlZnMuc2V0UmVmZXJlbmNlKG5vZGUpO1xuICAgIH1cbiAgfSwgW3Bvc2l0aW9uLnJlZnNdKTtcbiAgY29uc3QgcmVmcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5wb3NpdGlvbi5yZWZzLFxuICAgIHNldFJlZmVyZW5jZSxcbiAgICBzZXRQb3NpdGlvblJlZmVyZW5jZSxcbiAgICBkb21SZWZlcmVuY2U6IGRvbVJlZmVyZW5jZVJlZlxuICB9KSwgW3Bvc2l0aW9uLnJlZnMsIHNldFJlZmVyZW5jZSwgc2V0UG9zaXRpb25SZWZlcmVuY2VdKTtcbiAgY29uc3QgZWxlbWVudHMgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgLi4ucG9zaXRpb24uZWxlbWVudHMsXG4gICAgZG9tUmVmZXJlbmNlOiBkb21SZWZlcmVuY2VcbiAgfSksIFtwb3NpdGlvbi5lbGVtZW50cywgZG9tUmVmZXJlbmNlXSk7XG4gIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgLi4ucG9zaXRpb24sXG4gICAgLi4ucm9vdENvbnRleHQsXG4gICAgcmVmcyxcbiAgICBlbGVtZW50cyxcbiAgICBub2RlSWRcbiAgfSksIFtwb3NpdGlvbiwgcmVmcywgZWxlbWVudHMsIG5vZGVJZCwgcm9vdENvbnRleHRdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHJvb3RDb250ZXh0LmRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQgPSBjb250ZXh0O1xuICAgIGNvbnN0IG5vZGUgPSB0cmVlID09IG51bGwgPyB2b2lkIDAgOiB0cmVlLm5vZGVzUmVmLmN1cnJlbnQuZmluZChub2RlID0+IG5vZGUuaWQgPT09IG5vZGVJZCk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIG5vZGUuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5wb3NpdGlvbixcbiAgICBjb250ZXh0LFxuICAgIHJlZnMsXG4gICAgZWxlbWVudHNcbiAgfSksIFtwb3NpdGlvbiwgcmVmcywgZWxlbWVudHMsIGNvbnRleHRdKTtcbn1cblxuLyoqXG4gKiBPcGVucyB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGlsZSB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgaGFzIGZvY3VzLCBsaWtlIENTU1xuICogYDpmb2N1c2AuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlRm9jdXNcbiAqL1xuZnVuY3Rpb24gdXNlRm9jdXMoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBldmVudHMsXG4gICAgZGF0YVJlZixcbiAgICBlbGVtZW50czoge1xuICAgICAgZG9tUmVmZXJlbmNlXG4gICAgfVxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIHZpc2libGVPbmx5ID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGJsb2NrRm9jdXNSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCB0aW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IGtleWJvYXJkTW9kYWxpdHlSZWYgPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhkb21SZWZlcmVuY2UpO1xuXG4gICAgLy8gSWYgdGhlIHJlZmVyZW5jZSB3YXMgZm9jdXNlZCBhbmQgdGhlIHVzZXIgbGVmdCB0aGUgdGFiL3dpbmRvdywgYW5kIHRoZVxuICAgIC8vIGZsb2F0aW5nIGVsZW1lbnQgd2FzIG5vdCBvcGVuLCB0aGUgZm9jdXMgc2hvdWxkIGJlIGJsb2NrZWQgd2hlbiB0aGV5XG4gICAgLy8gcmV0dXJuIHRvIHRoZSB0YWIvd2luZG93LlxuICAgIGZ1bmN0aW9uIG9uQmx1cigpIHtcbiAgICAgIGlmICghb3BlbiAmJiBpc0hUTUxFbGVtZW50KGRvbVJlZmVyZW5jZSkgJiYgZG9tUmVmZXJlbmNlID09PSBhY3RpdmVFbGVtZW50KGdldERvY3VtZW50KGRvbVJlZmVyZW5jZSkpKSB7XG4gICAgICAgIGJsb2NrRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uS2V5RG93bigpIHtcbiAgICAgIGtleWJvYXJkTW9kYWxpdHlSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgb25CbHVyKTtcbiAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgdHJ1ZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgb25CbHVyKTtcbiAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duLCB0cnVlKTtcbiAgICB9O1xuICB9LCBbZG9tUmVmZXJlbmNlLCBvcGVuLCBlbmFibGVkXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uT3BlbkNoYW5nZShfcmVmKSB7XG4gICAgICBsZXQge1xuICAgICAgICByZWFzb25cbiAgICAgIH0gPSBfcmVmO1xuICAgICAgaWYgKHJlYXNvbiA9PT0gJ3JlZmVyZW5jZS1wcmVzcycgfHwgcmVhc29uID09PSAnZXNjYXBlLWtleScpIHtcbiAgICAgICAgYmxvY2tGb2N1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXZlbnRzLm9uKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZXZlbnRzLm9mZignb3BlbmNoYW5nZScsIG9uT3BlbkNoYW5nZSk7XG4gICAgfTtcbiAgfSwgW2V2ZW50cywgZW5hYmxlZF0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICBvblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKGlzVmlydHVhbFBvaW50ZXJFdmVudChldmVudC5uYXRpdmVFdmVudCkpIHJldHVybjtcbiAgICAgICAgICBrZXlib2FyZE1vZGFsaXR5UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Nb3VzZUxlYXZlKCkge1xuICAgICAgICAgIGJsb2NrRm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKGJsb2NrRm9jdXNSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudC5uYXRpdmVFdmVudCk7XG4gICAgICAgICAgaWYgKHZpc2libGVPbmx5ICYmIGlzRWxlbWVudCh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyBNYWMgU2FmYXJpIHVucmVsaWFibHkgbWF0Y2hlcyBgOmZvY3VzLXZpc2libGVgIG9uIHRoZSByZWZlcmVuY2VcbiAgICAgICAgICAgICAgLy8gaWYgZm9jdXMgd2FzIG91dHNpZGUgdGhlIHBhZ2UgaW5pdGlhbGx5IC0gdXNlIHRoZSBmYWxsYmFja1xuICAgICAgICAgICAgICAvLyBpbnN0ZWFkLlxuICAgICAgICAgICAgICBpZiAoaXNTYWZhcmkoKSAmJiBpc01hYygpKSB0aHJvdyBFcnJvcigpO1xuICAgICAgICAgICAgICBpZiAoIXRhcmdldC5tYXRjaGVzKCc6Zm9jdXMtdmlzaWJsZScpKSByZXR1cm47XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIC8vIE9sZCBicm93c2VycyB3aWxsIHRocm93IGFuIGVycm9yIHdoZW4gdXNpbmcgYDpmb2N1cy12aXNpYmxlYC5cbiAgICAgICAgICAgICAgaWYgKCFrZXlib2FyZE1vZGFsaXR5UmVmLmN1cnJlbnQgJiYgIWlzVHlwZWFibGVFbGVtZW50KHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnZm9jdXMnKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25CbHVyKGV2ZW50KSB7XG4gICAgICAgICAgYmxvY2tGb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG5cbiAgICAgICAgICAvLyBIaXQgdGhlIG5vbi1tb2RhbCBmb2N1cyBtYW5hZ2VtZW50IHBvcnRhbCBndWFyZC4gRm9jdXMgd2lsbCBiZVxuICAgICAgICAgIC8vIG1vdmVkIGludG8gdGhlIGZsb2F0aW5nIGVsZW1lbnQgaW1tZWRpYXRlbHkgYWZ0ZXIuXG4gICAgICAgICAgY29uc3QgbW92ZWRUb0ZvY3VzR3VhcmQgPSBpc0VsZW1lbnQocmVsYXRlZFRhcmdldCkgJiYgcmVsYXRlZFRhcmdldC5oYXNBdHRyaWJ1dGUoY3JlYXRlQXR0cmlidXRlKCdmb2N1cy1ndWFyZCcpKSAmJiByZWxhdGVkVGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJykgPT09ICdvdXRzaWRlJztcblxuICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSB3aW5kb3cgYmx1ciBsaXN0ZW5lciB0byBmaXJlLlxuICAgICAgICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHZhciBfZGF0YVJlZiRjdXJyZW50JGZsb2E7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVFbCA9IGFjdGl2ZUVsZW1lbnQoZG9tUmVmZXJlbmNlID8gZG9tUmVmZXJlbmNlLm93bmVyRG9jdW1lbnQgOiBkb2N1bWVudCk7XG5cbiAgICAgICAgICAgIC8vIEZvY3VzIGxlZnQgdGhlIHBhZ2UsIGtlZXAgaXQgb3Blbi5cbiAgICAgICAgICAgIGlmICghcmVsYXRlZFRhcmdldCAmJiBhY3RpdmVFbCA9PT0gZG9tUmVmZXJlbmNlKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFdoZW4gZm9jdXNpbmcgdGhlIHJlZmVyZW5jZSBlbGVtZW50IChlLmcuIHJlZ3VsYXIgY2xpY2spLCB0aGVuXG4gICAgICAgICAgICAvLyBjbGlja2luZyBpbnRvIHRoZSBmbG9hdGluZyBlbGVtZW50LCBwcmV2ZW50IGl0IGZyb20gaGlkaW5nLlxuICAgICAgICAgICAgLy8gTm90ZTogaXQgbXVzdCBiZSBmb2N1c2FibGUsIGUuZy4gYHRhYmluZGV4PVwiLTFcImAuXG4gICAgICAgICAgICAvLyBXZSBjYW4gbm90IHJlbHkgb24gcmVsYXRlZFRhcmdldCB0byBwb2ludCB0byB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhcyBpdCB3aWxsIG9ubHkgcG9pbnQgdG8gdGhlIHNoYWRvdyBob3N0IG9mIHRoZSBuZXdseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBub3QgdGhlIGVsZW1lbnQgdGhhdCBhY3R1YWxseSBoYXMgcmVjZWl2ZWQgZm9jdXMgaWYgaXQgaXMgbG9jYXRlZFxuICAgICAgICAgICAgLy8gaW5zaWRlIGEgc2hhZG93IHJvb3QuXG4gICAgICAgICAgICBpZiAoY29udGFpbnMoKF9kYXRhUmVmJGN1cnJlbnQkZmxvYSA9IGRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfZGF0YVJlZiRjdXJyZW50JGZsb2EucmVmcy5mbG9hdGluZy5jdXJyZW50LCBhY3RpdmVFbCkgfHwgY29udGFpbnMoZG9tUmVmZXJlbmNlLCBhY3RpdmVFbCkgfHwgbW92ZWRUb0ZvY3VzR3VhcmQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ2ZvY3VzJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LCBbZW5hYmxlZCwgdmlzaWJsZU9ubHksIGRhdGFSZWYsIGRvbVJlZmVyZW5jZSwgb25PcGVuQ2hhbmdlXSk7XG59XG5cbmNvbnN0IEFDVElWRV9LRVkgPSAnYWN0aXZlJztcbmNvbnN0IFNFTEVDVEVEX0tFWSA9ICdzZWxlY3RlZCc7XG5mdW5jdGlvbiBtZXJnZVByb3BzKHVzZXJQcm9wcywgcHJvcHNMaXN0LCBlbGVtZW50S2V5KSB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaXNJdGVtID0gZWxlbWVudEtleSA9PT0gJ2l0ZW0nO1xuICBsZXQgZG9tVXNlclByb3BzID0gdXNlclByb3BzO1xuICBpZiAoaXNJdGVtICYmIHVzZXJQcm9wcykge1xuICAgIGNvbnN0IHtcbiAgICAgIFtBQ1RJVkVfS0VZXTogXyxcbiAgICAgIFtTRUxFQ1RFRF9LRVldOiBfXyxcbiAgICAgIC4uLnZhbGlkUHJvcHNcbiAgICB9ID0gdXNlclByb3BzO1xuICAgIGRvbVVzZXJQcm9wcyA9IHZhbGlkUHJvcHM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi4oZWxlbWVudEtleSA9PT0gJ2Zsb2F0aW5nJyAmJiB7XG4gICAgICB0YWJJbmRleDogLTFcbiAgICB9KSxcbiAgICAuLi5kb21Vc2VyUHJvcHMsXG4gICAgLi4ucHJvcHNMaXN0Lm1hcCh2YWx1ZSA9PiB7XG4gICAgICBjb25zdCBwcm9wc09yR2V0UHJvcHMgPSB2YWx1ZSA/IHZhbHVlW2VsZW1lbnRLZXldIDogbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHNPckdldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB1c2VyUHJvcHMgPyBwcm9wc09yR2V0UHJvcHModXNlclByb3BzKSA6IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHNPckdldFByb3BzO1xuICAgIH0pLmNvbmNhdCh1c2VyUHJvcHMpLnJlZHVjZSgoYWNjLCBwcm9wcykgPT4ge1xuICAgICAgaWYgKCFwcm9wcykge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLmZvckVhY2goX3JlZiA9PiB7XG4gICAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSBfcmVmO1xuICAgICAgICBpZiAoaXNJdGVtICYmIFtBQ1RJVkVfS0VZLCBTRUxFQ1RFRF9LRVldLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5pbmRleE9mKCdvbicpID09PSAwKSB7XG4gICAgICAgICAgaWYgKCFtYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIG1hcC5zZXQoa2V5LCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBfbWFwJGdldDtcbiAgICAgICAgICAgIChfbWFwJGdldCA9IG1hcC5nZXQoa2V5KSkgPT0gbnVsbCB8fCBfbWFwJGdldC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGFjY1trZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX21hcCRnZXQyO1xuICAgICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoX21hcCRnZXQyID0gbWFwLmdldChrZXkpKSA9PSBudWxsID8gdm9pZCAwIDogX21hcCRnZXQyLm1hcChmbiA9PiBmbiguLi5hcmdzKSkuZmluZCh2YWwgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KVxuICB9O1xufVxuLyoqXG4gKiBNZXJnZXMgYW4gYXJyYXkgb2YgaW50ZXJhY3Rpb24gaG9va3MnIHByb3BzIGludG8gcHJvcCBnZXR0ZXJzLCBhbGxvd2luZ1xuICogZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgdG8gYmUgY29tcG9zZWQgdG9nZXRoZXIgd2l0aG91dCBvdmVyd3JpdGluZyBvbmVcbiAqIGFub3RoZXIuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlSW50ZXJhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHVzZUludGVyYWN0aW9ucyhwcm9wc0xpc3QpIHtcbiAgaWYgKHByb3BzTGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHNMaXN0ID0gW107XG4gIH1cbiAgLy8gVGhlIGRlcGVuZGVuY2llcyBhcmUgYSBkeW5hbWljIGFycmF5LCBzbyB3ZSBjYW4ndCB1c2UgdGhlIGxpbnRlcidzXG4gIC8vIHN1Z2dlc3Rpb24gdG8gYWRkIGl0IHRvIHRoZSBkZXBzIGFycmF5LlxuICBjb25zdCBkZXBzID0gcHJvcHNMaXN0O1xuICBjb25zdCBnZXRSZWZlcmVuY2VQcm9wcyA9IFJlYWN0LnVzZUNhbGxiYWNrKHVzZXJQcm9wcyA9PiBtZXJnZVByb3BzKHVzZXJQcm9wcywgcHJvcHNMaXN0LCAncmVmZXJlbmNlJyksXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgZGVwcyk7XG4gIGNvbnN0IGdldEZsb2F0aW5nUHJvcHMgPSBSZWFjdC51c2VDYWxsYmFjayh1c2VyUHJvcHMgPT4gbWVyZ2VQcm9wcyh1c2VyUHJvcHMsIHByb3BzTGlzdCwgJ2Zsb2F0aW5nJyksXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgZGVwcyk7XG4gIGNvbnN0IGdldEl0ZW1Qcm9wcyA9IFJlYWN0LnVzZUNhbGxiYWNrKHVzZXJQcm9wcyA9PiBtZXJnZVByb3BzKHVzZXJQcm9wcywgcHJvcHNMaXN0LCAnaXRlbScpLFxuICAvLyBHcmFudWxhcmx5IGNoZWNrIGZvciBgaXRlbWAgY2hhbmdlcywgYmVjYXVzZSB0aGUgYGdldEl0ZW1Qcm9wc2AgZ2V0dGVyXG4gIC8vIHNob3VsZCBiZSBhcyByZWZlcmVudGlhbGx5IHN0YWJsZSBhcyBwb3NzaWJsZSBzaW5jZSBpdCBtYXkgYmUgcGFzc2VkIGFzXG4gIC8vIGEgcHJvcCB0byBtYW55IGNvbXBvbmVudHMuIEFsbCBgaXRlbWAga2V5IHZhbHVlcyBtdXN0IHRoZXJlZm9yZSBiZVxuICAvLyBtZW1vaXplZC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICBwcm9wc0xpc3QubWFwKGtleSA9PiBrZXkgPT0gbnVsbCA/IHZvaWQgMCA6IGtleS5pdGVtKSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZ2V0UmVmZXJlbmNlUHJvcHMsXG4gICAgZ2V0RmxvYXRpbmdQcm9wcyxcbiAgICBnZXRJdGVtUHJvcHNcbiAgfSksIFtnZXRSZWZlcmVuY2VQcm9wcywgZ2V0RmxvYXRpbmdQcm9wcywgZ2V0SXRlbVByb3BzXSk7XG59XG5cbmxldCBpc1ByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGRvU3dpdGNoKG9yaWVudGF0aW9uLCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCkge1xuICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7XG4gICAgY2FzZSAndmVydGljYWwnOlxuICAgICAgcmV0dXJuIHZlcnRpY2FsO1xuICAgIGNhc2UgJ2hvcml6b250YWwnOlxuICAgICAgcmV0dXJuIGhvcml6b250YWw7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB2ZXJ0aWNhbCB8fCBob3Jpem9udGFsO1xuICB9XG59XG5mdW5jdGlvbiBpc01haW5PcmllbnRhdGlvbktleShrZXksIG9yaWVudGF0aW9uKSB7XG4gIGNvbnN0IHZlcnRpY2FsID0ga2V5ID09PSBBUlJPV19VUCB8fCBrZXkgPT09IEFSUk9XX0RPV047XG4gIGNvbnN0IGhvcml6b250YWwgPSBrZXkgPT09IEFSUk9XX0xFRlQgfHwga2V5ID09PSBBUlJPV19SSUdIVDtcbiAgcmV0dXJuIGRvU3dpdGNoKG9yaWVudGF0aW9uLCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCk7XG59XG5mdW5jdGlvbiBpc01haW5PcmllbnRhdGlvblRvRW5kS2V5KGtleSwgb3JpZW50YXRpb24sIHJ0bCkge1xuICBjb25zdCB2ZXJ0aWNhbCA9IGtleSA9PT0gQVJST1dfRE9XTjtcbiAgY29uc3QgaG9yaXpvbnRhbCA9IHJ0bCA/IGtleSA9PT0gQVJST1dfTEVGVCA6IGtleSA9PT0gQVJST1dfUklHSFQ7XG4gIHJldHVybiBkb1N3aXRjaChvcmllbnRhdGlvbiwgdmVydGljYWwsIGhvcml6b250YWwpIHx8IGtleSA9PT0gJ0VudGVyJyB8fCBrZXkgPT09ICcgJyB8fCBrZXkgPT09ICcnO1xufVxuZnVuY3Rpb24gaXNDcm9zc09yaWVudGF0aW9uT3BlbktleShrZXksIG9yaWVudGF0aW9uLCBydGwpIHtcbiAgY29uc3QgdmVydGljYWwgPSBydGwgPyBrZXkgPT09IEFSUk9XX0xFRlQgOiBrZXkgPT09IEFSUk9XX1JJR0hUO1xuICBjb25zdCBob3Jpem9udGFsID0ga2V5ID09PSBBUlJPV19ET1dOO1xuICByZXR1cm4gZG9Td2l0Y2gob3JpZW50YXRpb24sIHZlcnRpY2FsLCBob3Jpem9udGFsKTtcbn1cbmZ1bmN0aW9uIGlzQ3Jvc3NPcmllbnRhdGlvbkNsb3NlS2V5KGtleSwgb3JpZW50YXRpb24sIHJ0bCkge1xuICBjb25zdCB2ZXJ0aWNhbCA9IHJ0bCA/IGtleSA9PT0gQVJST1dfUklHSFQgOiBrZXkgPT09IEFSUk9XX0xFRlQ7XG4gIGNvbnN0IGhvcml6b250YWwgPSBrZXkgPT09IEFSUk9XX1VQO1xuICByZXR1cm4gZG9Td2l0Y2gob3JpZW50YXRpb24sIHZlcnRpY2FsLCBob3Jpem9udGFsKTtcbn1cbi8qKlxuICogQWRkcyBhcnJvdyBrZXktYmFzZWQgbmF2aWdhdGlvbiBvZiBhIGxpc3Qgb2YgaXRlbXMsIGVpdGhlciB1c2luZyByZWFsIERPTVxuICogZm9jdXMgb3IgdmlydHVhbCBmb2N1cy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VMaXN0TmF2aWdhdGlvblxuICovXG5mdW5jdGlvbiB1c2VMaXN0TmF2aWdhdGlvbihjb250ZXh0LCBwcm9wcykge1xuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGRvbVJlZmVyZW5jZSxcbiAgICAgIGZsb2F0aW5nXG4gICAgfVxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGxpc3RSZWYsXG4gICAgYWN0aXZlSW5kZXgsXG4gICAgb25OYXZpZ2F0ZTogdW5zdGFibGVfb25OYXZpZ2F0ZSA9ICgpID0+IHt9LFxuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIHNlbGVjdGVkSW5kZXggPSBudWxsLFxuICAgIGFsbG93RXNjYXBlID0gZmFsc2UsXG4gICAgbG9vcCA9IGZhbHNlLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIHJ0bCA9IGZhbHNlLFxuICAgIHZpcnR1YWwgPSBmYWxzZSxcbiAgICBmb2N1c0l0ZW1Pbk9wZW4gPSAnYXV0bycsXG4gICAgZm9jdXNJdGVtT25Ib3ZlciA9IHRydWUsXG4gICAgb3Blbk9uQXJyb3dLZXlEb3duID0gdHJ1ZSxcbiAgICBkaXNhYmxlZEluZGljZXMgPSB1bmRlZmluZWQsXG4gICAgb3JpZW50YXRpb24gPSAndmVydGljYWwnLFxuICAgIGNvbHMgPSAxLFxuICAgIHNjcm9sbEl0ZW1JbnRvVmlldyA9IHRydWUsXG4gICAgdmlydHVhbEl0ZW1SZWYsXG4gICAgaXRlbVNpemVzLFxuICAgIGRlbnNlID0gZmFsc2VcbiAgfSA9IHByb3BzO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKGFsbG93RXNjYXBlKSB7XG4gICAgICBpZiAoIWxvb3ApIHtcbiAgICAgICAgd2FybignYHVzZUxpc3ROYXZpZ2F0aW9uYCBsb29waW5nIG11c3QgYmUgZW5hYmxlZCB0byBhbGxvdyBlc2NhcGluZy4nKTtcbiAgICAgIH1cbiAgICAgIGlmICghdmlydHVhbCkge1xuICAgICAgICB3YXJuKCdgdXNlTGlzdE5hdmlnYXRpb25gIG11c3QgYmUgdmlydHVhbCB0byBhbGxvdyBlc2NhcGluZy4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9yaWVudGF0aW9uID09PSAndmVydGljYWwnICYmIGNvbHMgPiAxKSB7XG4gICAgICB3YXJuKCdJbiBncmlkIGxpc3QgbmF2aWdhdGlvbiBtb2RlIChgY29sc2AgPiAxKSwgdGhlIGBvcmllbnRhdGlvbmAgc2hvdWxkJywgJ2JlIGVpdGhlciBcImhvcml6b250YWxcIiBvciBcImJvdGhcIi4nKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGFyZW50SWQgPSB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCgpO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGNvbnN0IG9uTmF2aWdhdGUgPSB1c2VFZmZlY3RFdmVudCh1bnN0YWJsZV9vbk5hdmlnYXRlKTtcbiAgY29uc3QgZm9jdXNJdGVtT25PcGVuUmVmID0gUmVhY3QudXNlUmVmKGZvY3VzSXRlbU9uT3Blbik7XG4gIGNvbnN0IGluZGV4UmVmID0gUmVhY3QudXNlUmVmKHNlbGVjdGVkSW5kZXggIT0gbnVsbCA/IHNlbGVjdGVkSW5kZXggOiAtMSk7XG4gIGNvbnN0IGtleVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgaXNQb2ludGVyTW9kYWxpdHlSZWYgPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gIGNvbnN0IHByZXZpb3VzT25OYXZpZ2F0ZVJlZiA9IFJlYWN0LnVzZVJlZihvbk5hdmlnYXRlKTtcbiAgY29uc3QgcHJldmlvdXNNb3VudGVkUmVmID0gUmVhY3QudXNlUmVmKCEhZmxvYXRpbmcpO1xuICBjb25zdCBmb3JjZVN5bmNGb2N1cyA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGZvcmNlU2Nyb2xsSW50b1ZpZXdSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBkaXNhYmxlZEluZGljZXNSZWYgPSB1c2VMYXRlc3RSZWYoZGlzYWJsZWRJbmRpY2VzKTtcbiAgY29uc3QgbGF0ZXN0T3BlblJlZiA9IHVzZUxhdGVzdFJlZihvcGVuKTtcbiAgY29uc3Qgc2Nyb2xsSXRlbUludG9WaWV3UmVmID0gdXNlTGF0ZXN0UmVmKHNjcm9sbEl0ZW1JbnRvVmlldyk7XG4gIGNvbnN0IGZsb2F0aW5nUmVmID0gdXNlTGF0ZXN0UmVmKGZsb2F0aW5nKTtcbiAgY29uc3Qgc2VsZWN0ZWRJbmRleFJlZiA9IHVzZUxhdGVzdFJlZihzZWxlY3RlZEluZGV4KTtcbiAgY29uc3QgW2FjdGl2ZUlkLCBzZXRBY3RpdmVJZF0gPSBSZWFjdC51c2VTdGF0ZSgpO1xuICBjb25zdCBbdmlydHVhbElkLCBzZXRWaXJ0dWFsSWRdID0gUmVhY3QudXNlU3RhdGUoKTtcbiAgY29uc3QgZm9jdXNJdGVtID0gdXNlRWZmZWN0RXZlbnQoZnVuY3Rpb24gKGxpc3RSZWYsIGluZGV4UmVmLCBmb3JjZVNjcm9sbEludG9WaWV3KSB7XG4gICAgaWYgKGZvcmNlU2Nyb2xsSW50b1ZpZXcgPT09IHZvaWQgMCkge1xuICAgICAgZm9yY2VTY3JvbGxJbnRvVmlldyA9IGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBydW5Gb2N1cyhpdGVtKSB7XG4gICAgICBpZiAodmlydHVhbCkge1xuICAgICAgICBzZXRBY3RpdmVJZChpdGVtLmlkKTtcbiAgICAgICAgdHJlZSA9PSBudWxsIHx8IHRyZWUuZXZlbnRzLmVtaXQoJ3ZpcnR1YWxmb2N1cycsIGl0ZW0pO1xuICAgICAgICBpZiAodmlydHVhbEl0ZW1SZWYpIHtcbiAgICAgICAgICB2aXJ0dWFsSXRlbVJlZi5jdXJyZW50ID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5xdWV1ZUZvY3VzKGl0ZW0sIHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlLFxuICAgICAgICAgIC8vIE1hYyBTYWZhcmkgZG9lcyBub3QgbW92ZSB0aGUgdmlydHVhbCBjdXJzb3IgdW5sZXNzIHRoZSBmb2N1cyBjYWxsXG4gICAgICAgICAgLy8gaXMgc3luYy4gSG93ZXZlciwgZm9yIHRoZSB2ZXJ5IGZpcnN0IGZvY3VzIGNhbGwsIHdlIG5lZWQgdG8gd2FpdFxuICAgICAgICAgIC8vIGZvciB0aGUgcG9zaXRpb24gdG8gYmUgcmVhZHkgaW4gb3JkZXIgdG8gcHJldmVudCB1bndhbnRlZFxuICAgICAgICAgIC8vIHNjcm9sbGluZy4gVGhpcyBtZWFucyB0aGUgdmlydHVhbCBjdXJzb3Igd2lsbCBub3QgbW92ZSB0byB0aGUgZmlyc3RcbiAgICAgICAgICAvLyBpdGVtIHdoZW4gZmlyc3Qgb3BlbmluZyB0aGUgZmxvYXRpbmcgZWxlbWVudCwgYnV0IHdpbGwgb25cbiAgICAgICAgICAvLyBzdWJzZXF1ZW50IGNhbGxzLiBgcHJldmVudFNjcm9sbGAgaXMgc3VwcG9ydGVkIGluIG1vZGVybiBTYWZhcmksXG4gICAgICAgICAgLy8gc28gd2UgY2FuIHVzZSB0aGF0IGluc3RlYWQuXG4gICAgICAgICAgLy8gaU9TIFNhZmFyaSBtdXN0IGJlIGFzeW5jIG9yIHRoZSBmaXJzdCBpdGVtIHdpbGwgbm90IGJlIGZvY3VzZWQuXG4gICAgICAgICAgc3luYzogaXNNYWMoKSAmJiBpc1NhZmFyaSgpID8gaXNQcmV2ZW50U2Nyb2xsU3VwcG9ydGVkIHx8IGZvcmNlU3luY0ZvY3VzLmN1cnJlbnQgOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5pdGlhbEl0ZW0gPSBsaXN0UmVmLmN1cnJlbnRbaW5kZXhSZWYuY3VycmVudF07XG4gICAgaWYgKGluaXRpYWxJdGVtKSB7XG4gICAgICBydW5Gb2N1cyhpbml0aWFsSXRlbSk7XG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBjb25zdCB3YWl0ZWRJdGVtID0gbGlzdFJlZi5jdXJyZW50W2luZGV4UmVmLmN1cnJlbnRdIHx8IGluaXRpYWxJdGVtO1xuICAgICAgaWYgKCF3YWl0ZWRJdGVtKSByZXR1cm47XG4gICAgICBpZiAoIWluaXRpYWxJdGVtKSB7XG4gICAgICAgIHJ1bkZvY3VzKHdhaXRlZEl0ZW0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2Nyb2xsSW50b1ZpZXdPcHRpb25zID0gc2Nyb2xsSXRlbUludG9WaWV3UmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBzaG91bGRTY3JvbGxJbnRvVmlldyA9IHNjcm9sbEludG9WaWV3T3B0aW9ucyAmJiBpdGVtICYmIChmb3JjZVNjcm9sbEludG9WaWV3IHx8ICFpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50KTtcbiAgICAgIGlmIChzaG91bGRTY3JvbGxJbnRvVmlldykge1xuICAgICAgICAvLyBKU0RPTSBkb2Vzbid0IHN1cHBvcnQgYC5zY3JvbGxJbnRvVmlldygpYCBidXQgaXQncyB3aWRlbHkgc3VwcG9ydGVkXG4gICAgICAgIC8vIGJ5IGFsbCBicm93c2Vycy5cbiAgICAgICAgd2FpdGVkSXRlbS5zY3JvbGxJbnRvVmlldyA9PSBudWxsIHx8IHdhaXRlZEl0ZW0uc2Nyb2xsSW50b1ZpZXcodHlwZW9mIHNjcm9sbEludG9WaWV3T3B0aW9ucyA9PT0gJ2Jvb2xlYW4nID8ge1xuICAgICAgICAgIGJsb2NrOiAnbmVhcmVzdCcsXG4gICAgICAgICAgaW5saW5lOiAnbmVhcmVzdCdcbiAgICAgICAgfSA6IHNjcm9sbEludG9WaWV3T3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykuZm9jdXMoe1xuICAgICAgZ2V0IHByZXZlbnRTY3JvbGwoKSB7XG4gICAgICAgIGlzUHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW10pO1xuXG4gIC8vIFN5bmMgYHNlbGVjdGVkSW5kZXhgIHRvIGJlIHRoZSBgYWN0aXZlSW5kZXhgIHVwb24gb3BlbmluZyB0aGUgZmxvYXRpbmdcbiAgLy8gZWxlbWVudC4gQWxzbywgcmVzZXQgYGFjdGl2ZUluZGV4YCB1cG9uIGNsb3NpbmcgdGhlIGZsb2F0aW5nIGVsZW1lbnQuXG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wZW4gJiYgZmxvYXRpbmcpIHtcbiAgICAgIGlmIChmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCAmJiBzZWxlY3RlZEluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgLy8gUmVnYXJkbGVzcyBvZiB0aGUgcG9pbnRlciBtb2RhbGl0eSwgd2Ugd2FudCB0byBlbnN1cmUgdGhlIHNlbGVjdGVkXG4gICAgICAgIC8vIGl0ZW0gY29tZXMgaW50byB2aWV3IHdoZW4gdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXMgb3BlbmVkLlxuICAgICAgICBmb3JjZVNjcm9sbEludG9WaWV3UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gc2VsZWN0ZWRJbmRleDtcbiAgICAgICAgb25OYXZpZ2F0ZShzZWxlY3RlZEluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZXZpb3VzTW91bnRlZFJlZi5jdXJyZW50KSB7XG4gICAgICAvLyBTaW5jZSB0aGUgdXNlciBjYW4gc3BlY2lmeSBgb25OYXZpZ2F0ZWAgY29uZGl0aW9uYWxseVxuICAgICAgLy8gKG9uTmF2aWdhdGU6IG9wZW4gPyBzZXRBY3RpdmVJbmRleCA6IHNldFNlbGVjdGVkSW5kZXgpLFxuICAgICAgLy8gd2Ugc3RvcmUgYW5kIGNhbGwgdGhlIHByZXZpb3VzIGZ1bmN0aW9uLlxuICAgICAgaW5kZXhSZWYuY3VycmVudCA9IC0xO1xuICAgICAgcHJldmlvdXNPbk5hdmlnYXRlUmVmLmN1cnJlbnQobnVsbCk7XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgb3BlbiwgZmxvYXRpbmcsIHNlbGVjdGVkSW5kZXgsIG9uTmF2aWdhdGVdKTtcblxuICAvLyBTeW5jIGBhY3RpdmVJbmRleGAgdG8gYmUgdGhlIGZvY3VzZWQgaXRlbSB3aGlsZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBpc1xuICAvLyBvcGVuLlxuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcGVuICYmIGZsb2F0aW5nKSB7XG4gICAgICBpZiAoYWN0aXZlSW5kZXggPT0gbnVsbCkge1xuICAgICAgICBmb3JjZVN5bmNGb2N1cy5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4UmVmLmN1cnJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHdoaWxlIHRoZSBmbG9hdGluZyBlbGVtZW50IHdhcyBvcGVuIChlLmcuIHRoZSBsaXN0IGNoYW5nZWQpLlxuICAgICAgICBpZiAocHJldmlvdXNNb3VudGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gLTE7XG4gICAgICAgICAgZm9jdXNJdGVtKGxpc3RSZWYsIGluZGV4UmVmKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWwgc3luYy5cbiAgICAgICAgaWYgKCFwcmV2aW91c01vdW50ZWRSZWYuY3VycmVudCAmJiBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCAmJiAoa2V5UmVmLmN1cnJlbnQgIT0gbnVsbCB8fCBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCA9PT0gdHJ1ZSAmJiBrZXlSZWYuY3VycmVudCA9PSBudWxsKSkge1xuICAgICAgICAgIGxldCBydW5zID0gMDtcbiAgICAgICAgICBjb25zdCB3YWl0Rm9yTGlzdFBvcHVsYXRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChsaXN0UmVmLmN1cnJlbnRbMF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBBdm9pZCBsZXR0aW5nIHRoZSBicm93c2VyIHBhaW50IGlmIHBvc3NpYmxlIG9uIHRoZSBmaXJzdCB0cnksXG4gICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgckFGLiBEb24ndCB0cnkgbW9yZSB0aGFuIHR3aWNlLCBzaW5jZSBzb21ldGhpbmdcbiAgICAgICAgICAgICAgLy8gaXMgd3Jvbmcgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgICBpZiAocnVucyA8IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlZHVsZXIgPSBydW5zID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIDogcXVldWVNaWNyb3Rhc2s7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVyKHdhaXRGb3JMaXN0UG9wdWxhdGVkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBydW5zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0ga2V5UmVmLmN1cnJlbnQgPT0gbnVsbCB8fCBpc01haW5PcmllbnRhdGlvblRvRW5kS2V5KGtleVJlZi5jdXJyZW50LCBvcmllbnRhdGlvbiwgcnRsKSB8fCBuZXN0ZWQgPyBnZXRNaW5JbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXNSZWYuY3VycmVudCkgOiBnZXRNYXhJbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXNSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgIGtleVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHdhaXRGb3JMaXN0UG9wdWxhdGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzSW5kZXhPdXRPZkJvdW5kcyhsaXN0UmVmLCBhY3RpdmVJbmRleCkpIHtcbiAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGFjdGl2ZUluZGV4O1xuICAgICAgICBmb2N1c0l0ZW0obGlzdFJlZiwgaW5kZXhSZWYsIGZvcmNlU2Nyb2xsSW50b1ZpZXdSZWYuY3VycmVudCk7XG4gICAgICAgIGZvcmNlU2Nyb2xsSW50b1ZpZXdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9wZW4sIGZsb2F0aW5nLCBhY3RpdmVJbmRleCwgc2VsZWN0ZWRJbmRleFJlZiwgbmVzdGVkLCBsaXN0UmVmLCBvcmllbnRhdGlvbiwgcnRsLCBvbk5hdmlnYXRlLCBmb2N1c0l0ZW0sIGRpc2FibGVkSW5kaWNlc1JlZl0pO1xuXG4gIC8vIEVuc3VyZSB0aGUgcGFyZW50IGZsb2F0aW5nIGVsZW1lbnQgaGFzIGZvY3VzIHdoZW4gYSBuZXN0ZWQgY2hpbGQgY2xvc2VzXG4gIC8vIHRvIGFsbG93IGFycm93IGtleSBuYXZpZ2F0aW9uIHRvIHdvcmsgYWZ0ZXIgdGhlIHBvaW50ZXIgbGVhdmVzIHRoZSBjaGlsZC5cbiAgaW5kZXgoKCkgPT4ge1xuICAgIHZhciBfbm9kZXMkZmluZDtcbiAgICBpZiAoIWVuYWJsZWQgfHwgZmxvYXRpbmcgfHwgIXRyZWUgfHwgdmlydHVhbCB8fCAhcHJldmlvdXNNb3VudGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZXMgPSB0cmVlLm5vZGVzUmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgcGFyZW50ID0gKF9ub2RlcyRmaW5kID0gbm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IHBhcmVudElkKSkgPT0gbnVsbCB8fCAoX25vZGVzJGZpbmQgPSBfbm9kZXMkZmluZC5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGVzJGZpbmQuZWxlbWVudHMuZmxvYXRpbmc7XG4gICAgY29uc3QgYWN0aXZlRWwgPSBhY3RpdmVFbGVtZW50KGdldERvY3VtZW50KGZsb2F0aW5nKSk7XG4gICAgY29uc3QgdHJlZUNvbnRhaW5zQWN0aXZlRWwgPSBub2Rlcy5zb21lKG5vZGUgPT4gbm9kZS5jb250ZXh0ICYmIGNvbnRhaW5zKG5vZGUuY29udGV4dC5lbGVtZW50cy5mbG9hdGluZywgYWN0aXZlRWwpKTtcbiAgICBpZiAocGFyZW50ICYmICF0cmVlQ29udGFpbnNBY3RpdmVFbCAmJiBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50KSB7XG4gICAgICBwYXJlbnQuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtlbmFibGVkLCBmbG9hdGluZywgdHJlZSwgcGFyZW50SWQsIHZpcnR1YWxdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCB8fCAhdHJlZSB8fCAhdmlydHVhbCB8fCBwYXJlbnRJZCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIGhhbmRsZVZpcnR1YWxGb2N1cyhpdGVtKSB7XG4gICAgICBzZXRWaXJ0dWFsSWQoaXRlbS5pZCk7XG4gICAgICBpZiAodmlydHVhbEl0ZW1SZWYpIHtcbiAgICAgICAgdmlydHVhbEl0ZW1SZWYuY3VycmVudCA9IGl0ZW07XG4gICAgICB9XG4gICAgfVxuICAgIHRyZWUuZXZlbnRzLm9uKCd2aXJ0dWFsZm9jdXMnLCBoYW5kbGVWaXJ0dWFsRm9jdXMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0cmVlLmV2ZW50cy5vZmYoJ3ZpcnR1YWxmb2N1cycsIGhhbmRsZVZpcnR1YWxGb2N1cyk7XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIHRyZWUsIHZpcnR1YWwsIHBhcmVudElkLCB2aXJ0dWFsSXRlbVJlZl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgcHJldmlvdXNPbk5hdmlnYXRlUmVmLmN1cnJlbnQgPSBvbk5hdmlnYXRlO1xuICAgIHByZXZpb3VzTW91bnRlZFJlZi5jdXJyZW50ID0gISFmbG9hdGluZztcbiAgfSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIGtleVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH0sIFtvcGVuXSk7XG4gIGNvbnN0IGhhc0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggIT0gbnVsbDtcbiAgY29uc3QgaXRlbSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHN5bmNDdXJyZW50VGFyZ2V0KGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIGlmICghb3BlbikgcmV0dXJuO1xuICAgICAgY29uc3QgaW5kZXggPSBsaXN0UmVmLmN1cnJlbnQuaW5kZXhPZihjdXJyZW50VGFyZ2V0KTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgb25OYXZpZ2F0ZShpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgb25Gb2N1cyhfcmVmKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgc3luY0N1cnJlbnRUYXJnZXQoY3VycmVudFRhcmdldCk7XG4gICAgICB9LFxuICAgICAgb25DbGljazogX3JlZjIgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGN1cnJlbnRUYXJnZXRcbiAgICAgICAgfSA9IF9yZWYyO1xuICAgICAgICByZXR1cm4gY3VycmVudFRhcmdldC5mb2N1cyh7XG4gICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyBTYWZhcmlcbiAgICAgIC4uLihmb2N1c0l0ZW1PbkhvdmVyICYmIHtcbiAgICAgICAgb25Nb3VzZU1vdmUoX3JlZjMpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICAgIH0gPSBfcmVmMztcbiAgICAgICAgICBzeW5jQ3VycmVudFRhcmdldChjdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Qb2ludGVyTGVhdmUoX3JlZjQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgcG9pbnRlclR5cGVcbiAgICAgICAgICB9ID0gX3JlZjQ7XG4gICAgICAgICAgaWYgKCFpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50IHx8IHBvaW50ZXJUeXBlID09PSAndG91Y2gnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgICAgICBmb2N1c0l0ZW0obGlzdFJlZiwgaW5kZXhSZWYpO1xuICAgICAgICAgIG9uTmF2aWdhdGUobnVsbCk7XG4gICAgICAgICAgaWYgKCF2aXJ0dWFsKSB7XG4gICAgICAgICAgICBlbnF1ZXVlRm9jdXMoZmxvYXRpbmdSZWYuY3VycmVudCwge1xuICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gcHJvcHM7XG4gIH0sIFtvcGVuLCBmbG9hdGluZ1JlZiwgZm9jdXNJdGVtLCBmb2N1c0l0ZW1PbkhvdmVyLCBsaXN0UmVmLCBvbk5hdmlnYXRlLCB2aXJ0dWFsXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgZGlzYWJsZWRJbmRpY2VzID0gZGlzYWJsZWRJbmRpY2VzUmVmLmN1cnJlbnQ7XG4gICAgZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBmb3JjZVN5bmNGb2N1cy5jdXJyZW50ID0gdHJ1ZTtcblxuICAgICAgLy8gSWYgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXMgYW5pbWF0aW5nIG91dCwgaWdub3JlIG5hdmlnYXRpb24uIE90aGVyd2lzZSxcbiAgICAgIC8vIHRoZSBgYWN0aXZlSW5kZXhgIGdldHMgc2V0IHRvIDAgZGVzcGl0ZSBub3QgYmVpbmcgb3BlbiBzbyB0aGUgbmV4dCB0aW1lXG4gICAgICAvLyB0aGUgdXNlciBBcnJvd0Rvd25zLCB0aGUgZmlyc3QgaXRlbSB3b24ndCBiZSBmb2N1c2VkLlxuICAgICAgaWYgKCFsYXRlc3RPcGVuUmVmLmN1cnJlbnQgJiYgZXZlbnQuY3VycmVudFRhcmdldCA9PT0gZmxvYXRpbmdSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobmVzdGVkICYmIGlzQ3Jvc3NPcmllbnRhdGlvbkNsb3NlS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCkpIHtcbiAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ2xpc3QtbmF2aWdhdGlvbicpO1xuICAgICAgICBpZiAoaXNIVE1MRWxlbWVudChkb21SZWZlcmVuY2UpICYmICF2aXJ0dWFsKSB7XG4gICAgICAgICAgZG9tUmVmZXJlbmNlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gaW5kZXhSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IG1pbkluZGV4ID0gZ2V0TWluSW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzKTtcbiAgICAgIGNvbnN0IG1heEluZGV4ID0gZ2V0TWF4SW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzKTtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdIb21lJykge1xuICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gbWluSW5kZXg7XG4gICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW5kJykge1xuICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gbWF4SW5kZXg7XG4gICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdyaWQgbmF2aWdhdGlvbi5cbiAgICAgIGlmIChjb2xzID4gMSkge1xuICAgICAgICBjb25zdCBzaXplcyA9IGl0ZW1TaXplcyB8fCBBcnJheS5mcm9tKHtcbiAgICAgICAgICBsZW5ndGg6IGxpc3RSZWYuY3VycmVudC5sZW5ndGhcbiAgICAgICAgfSwgKCkgPT4gKHtcbiAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICBoZWlnaHQ6IDFcbiAgICAgICAgfSkpO1xuICAgICAgICAvLyBUbyBjYWxjdWxhdGUgbW92ZW1lbnRzIG9uIHRoZSBncmlkLCB3ZSB1c2UgaHlwb3RoZXRpY2FsIGNlbGwgaW5kaWNlc1xuICAgICAgICAvLyBhcyBpZiBldmVyeSBpdGVtIHdhcyAxeDEsIHRoZW4gY29udmVydCBiYWNrIHRvIHJlYWwgaW5kaWNlcy5cbiAgICAgICAgY29uc3QgY2VsbE1hcCA9IGJ1aWxkQ2VsbE1hcChzaXplcywgY29scywgZGVuc2UpO1xuICAgICAgICBjb25zdCBtaW5HcmlkSW5kZXggPSBjZWxsTWFwLmZpbmRJbmRleChpbmRleCA9PiBpbmRleCAhPSBudWxsICYmICFpc0Rpc2FibGVkKGxpc3RSZWYuY3VycmVudCwgaW5kZXgsIGRpc2FibGVkSW5kaWNlcykpO1xuICAgICAgICAvLyBsYXN0IGVuYWJsZWQgaW5kZXhcbiAgICAgICAgY29uc3QgbWF4R3JpZEluZGV4ID0gY2VsbE1hcC5yZWR1Y2UoKGZvdW5kSW5kZXgsIGluZGV4LCBjZWxsSW5kZXgpID0+IGluZGV4ICE9IG51bGwgJiYgIWlzRGlzYWJsZWQobGlzdFJlZi5jdXJyZW50LCBpbmRleCwgZGlzYWJsZWRJbmRpY2VzKSA/IGNlbGxJbmRleCA6IGZvdW5kSW5kZXgsIC0xKTtcbiAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGNlbGxNYXBbZ2V0R3JpZE5hdmlnYXRlZEluZGV4KHtcbiAgICAgICAgICBjdXJyZW50OiBjZWxsTWFwLm1hcChpdGVtSW5kZXggPT4gaXRlbUluZGV4ICE9IG51bGwgPyBsaXN0UmVmLmN1cnJlbnRbaXRlbUluZGV4XSA6IG51bGwpXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICBvcmllbnRhdGlvbixcbiAgICAgICAgICBsb29wLFxuICAgICAgICAgIGNvbHMsXG4gICAgICAgICAgLy8gdHJlYXQgdW5kZWZpbmVkIChlbXB0eSBncmlkIHNwYWNlcykgYXMgZGlzYWJsZWQgaW5kaWNlcyBzbyB3ZVxuICAgICAgICAgIC8vIGRvbid0IGVuZCB1cCBpbiB0aGVtXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzOiBnZXRDZWxsSW5kaWNlcyhbLi4uKGRpc2FibGVkSW5kaWNlcyB8fCBsaXN0UmVmLmN1cnJlbnQubWFwKChfLCBpbmRleCkgPT4gaXNEaXNhYmxlZChsaXN0UmVmLmN1cnJlbnQsIGluZGV4KSA/IGluZGV4IDogdW5kZWZpbmVkKSksIHVuZGVmaW5lZF0sIGNlbGxNYXApLFxuICAgICAgICAgIG1pbkluZGV4OiBtaW5HcmlkSW5kZXgsXG4gICAgICAgICAgbWF4SW5kZXg6IG1heEdyaWRJbmRleCxcbiAgICAgICAgICBwcmV2SW5kZXg6IGdldENlbGxJbmRleE9mQ29ybmVyKGluZGV4UmVmLmN1cnJlbnQgPiBtYXhJbmRleCA/IG1pbkluZGV4IDogaW5kZXhSZWYuY3VycmVudCwgc2l6ZXMsIGNlbGxNYXAsIGNvbHMsXG4gICAgICAgICAgLy8gdXNlIGEgY29ybmVyIG1hdGNoaW5nIHRoZSBlZGdlIGNsb3Nlc3QgdG8gdGhlIGRpcmVjdGlvblxuICAgICAgICAgIC8vIHdlJ3JlIG1vdmluZyBpbiBzbyB3ZSBkb24ndCBlbmQgdXAgaW4gdGhlIHNhbWUgaXRlbS4gUHJlZmVyXG4gICAgICAgICAgLy8gdG9wL2xlZnQgb3ZlciBib3R0b20vcmlnaHQuXG4gICAgICAgICAgZXZlbnQua2V5ID09PSBBUlJPV19ET1dOID8gJ2JsJyA6IGV2ZW50LmtleSA9PT0gQVJST1dfUklHSFQgPyAndHInIDogJ3RsJyksXG4gICAgICAgICAgc3RvcEV2ZW50OiB0cnVlXG4gICAgICAgIH0pXTsgLy8gbmF2aWdhdGVkIGNlbGwgd2lsbCBuZXZlciBiZSBudWxsaXNoXG5cbiAgICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnYm90aCcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc01haW5PcmllbnRhdGlvbktleShldmVudC5rZXksIG9yaWVudGF0aW9uKSkge1xuICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBpbmRleCBpZiBubyBpdGVtIGlzIGZvY3VzZWQuXG4gICAgICAgIGlmIChvcGVuICYmICF2aXJ0dWFsICYmIGFjdGl2ZUVsZW1lbnQoZXZlbnQuY3VycmVudFRhcmdldC5vd25lckRvY3VtZW50KSA9PT0gZXZlbnQuY3VycmVudFRhcmdldCkge1xuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBpc01haW5PcmllbnRhdGlvblRvRW5kS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCkgPyBtaW5JbmRleCA6IG1heEluZGV4O1xuICAgICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc01haW5PcmllbnRhdGlvblRvRW5kS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCkpIHtcbiAgICAgICAgICBpZiAobG9vcCkge1xuICAgICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGN1cnJlbnRJbmRleCA+PSBtYXhJbmRleCA/IGFsbG93RXNjYXBlICYmIGN1cnJlbnRJbmRleCAhPT0gbGlzdFJlZi5jdXJyZW50Lmxlbmd0aCA/IC0xIDogbWluSW5kZXggOiBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCB7XG4gICAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IE1hdGgubWluKG1heEluZGV4LCBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCB7XG4gICAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChsb29wKSB7XG4gICAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gY3VycmVudEluZGV4IDw9IG1pbkluZGV4ID8gYWxsb3dFc2NhcGUgJiYgY3VycmVudEluZGV4ICE9PSAtMSA/IGxpc3RSZWYuY3VycmVudC5sZW5ndGggOiBtYXhJbmRleCA6IGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBNYXRoLm1heChtaW5JbmRleCwgZmluZE5vbkRpc2FibGVkSW5kZXgobGlzdFJlZiwge1xuICAgICAgICAgICAgICBzdGFydGluZ0luZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgICAgIGRlY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0luZGV4T3V0T2ZCb3VuZHMobGlzdFJlZiwgaW5kZXhSZWYuY3VycmVudCkpIHtcbiAgICAgICAgICBvbk5hdmlnYXRlKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tWaXJ0dWFsTW91c2UoZXZlbnQpIHtcbiAgICAgIGlmIChmb2N1c0l0ZW1Pbk9wZW4gPT09ICdhdXRvJyAmJiBpc1ZpcnR1YWxDbGljayhldmVudC5uYXRpdmVFdmVudCkpIHtcbiAgICAgICAgZm9jdXNJdGVtT25PcGVuUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1ZpcnR1YWxQb2ludGVyKGV2ZW50KSB7XG4gICAgICAvLyBgcG9pbnRlcmRvd25gIGZpcmVzIGZpcnN0LCByZXNldCB0aGUgc3RhdGUgdGhlbiBwZXJmb3JtIHRoZSBjaGVja3MuXG4gICAgICBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCA9IGZvY3VzSXRlbU9uT3BlbjtcbiAgICAgIGlmIChmb2N1c0l0ZW1Pbk9wZW4gPT09ICdhdXRvJyAmJiBpc1ZpcnR1YWxQb2ludGVyRXZlbnQoZXZlbnQubmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIGZvY3VzSXRlbU9uT3BlblJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJpYUFjdGl2ZURlc2NlbmRhbnRQcm9wID0gdmlydHVhbCAmJiBvcGVuICYmIGhhc0FjdGl2ZUluZGV4ICYmIHtcbiAgICAgICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiB2aXJ0dWFsSWQgfHwgYWN0aXZlSWRcbiAgICB9O1xuICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSBsaXN0UmVmLmN1cnJlbnQuZmluZChpdGVtID0+IChpdGVtID09IG51bGwgPyB2b2lkIDAgOiBpdGVtLmlkKSA9PT0gYWN0aXZlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICByZWZlcmVuY2U6IHtcbiAgICAgICAgLi4uYXJpYUFjdGl2ZURlc2NlbmRhbnRQcm9wLFxuICAgICAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgICAgICBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgY29uc3QgaXNBcnJvd0tleSA9IGV2ZW50LmtleS5pbmRleE9mKCdBcnJvdycpID09PSAwO1xuICAgICAgICAgIGNvbnN0IGlzQ3Jvc3NPcGVuS2V5ID0gaXNDcm9zc09yaWVudGF0aW9uT3BlbktleShldmVudC5rZXksIG9yaWVudGF0aW9uLCBydGwpO1xuICAgICAgICAgIGNvbnN0IGlzQ3Jvc3NDbG9zZUtleSA9IGlzQ3Jvc3NPcmllbnRhdGlvbkNsb3NlS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCk7XG4gICAgICAgICAgY29uc3QgaXNNYWluS2V5ID0gaXNNYWluT3JpZW50YXRpb25LZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbik7XG4gICAgICAgICAgY29uc3QgaXNOYXZpZ2F0aW9uS2V5ID0gKG5lc3RlZCA/IGlzQ3Jvc3NPcGVuS2V5IDogaXNNYWluS2V5KSB8fCBldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5LnRyaW0oKSA9PT0gJyc7XG4gICAgICAgICAgaWYgKHZpcnR1YWwgJiYgb3Blbikge1xuICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSB0cmVlID09IG51bGwgPyB2b2lkIDAgOiB0cmVlLm5vZGVzUmVmLmN1cnJlbnQuZmluZChub2RlID0+IG5vZGUucGFyZW50SWQgPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBkZWVwZXN0Tm9kZSA9IHRyZWUgJiYgcm9vdE5vZGUgPyBnZXREZWVwZXN0Tm9kZSh0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIHJvb3ROb2RlLmlkKSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaXNBcnJvd0tleSAmJiBkZWVwZXN0Tm9kZSAmJiB2aXJ0dWFsSXRlbVJlZikge1xuICAgICAgICAgICAgICBjb25zdCBldmVudE9iamVjdCA9IG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywge1xuICAgICAgICAgICAgICAgIGtleTogZXZlbnQua2V5LFxuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChpc0Nyb3NzT3BlbktleSB8fCBpc0Nyb3NzQ2xvc2VLZXkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2RlZXBlc3ROb2RlJGNvbnRleHQsIF9kZWVwZXN0Tm9kZSRjb250ZXh0MjtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRUYXJnZXQgPSAoKF9kZWVwZXN0Tm9kZSRjb250ZXh0ID0gZGVlcGVzdE5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kZWVwZXN0Tm9kZSRjb250ZXh0LmVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hJdGVtID0gaXNDcm9zc0Nsb3NlS2V5ICYmICFpc0N1cnJlbnRUYXJnZXQgPyAoX2RlZXBlc3ROb2RlJGNvbnRleHQyID0gZGVlcGVzdE5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kZWVwZXN0Tm9kZSRjb250ZXh0Mi5lbGVtZW50cy5kb21SZWZlcmVuY2UgOiBpc0Nyb3NzT3BlbktleSA/IGFjdGl2ZUl0ZW0gOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgICBkaXNwYXRjaEl0ZW0uZGlzcGF0Y2hFdmVudChldmVudE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICBzZXRWaXJ0dWFsSWQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGlzTWFpbktleSAmJiBkZWVwZXN0Tm9kZS5jb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlZXBlc3ROb2RlLmNvbnRleHQub3BlbiAmJiBkZWVwZXN0Tm9kZS5wYXJlbnRJZCAmJiBldmVudC5jdXJyZW50VGFyZ2V0ICE9PSBkZWVwZXN0Tm9kZS5jb250ZXh0LmVsZW1lbnRzLmRvbVJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIF9kZWVwZXN0Tm9kZSRjb250ZXh0JDtcbiAgICAgICAgICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgICAoX2RlZXBlc3ROb2RlJGNvbnRleHQkID0gZGVlcGVzdE5vZGUuY29udGV4dC5lbGVtZW50cy5kb21SZWZlcmVuY2UpID09IG51bGwgfHwgX2RlZXBlc3ROb2RlJGNvbnRleHQkLmRpc3BhdGNoRXZlbnQoZXZlbnRPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9uS2V5RG93bihldmVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYSBmbG9hdGluZyBlbGVtZW50IHNob3VsZCBub3Qgb3BlbiBvbiBhcnJvdyBrZXkgZG93biwgYXZvaWRcbiAgICAgICAgICAvLyBzZXR0aW5nIGBhY3RpdmVJbmRleGAgd2hpbGUgaXQncyBjbG9zZWQuXG4gICAgICAgICAgaWYgKCFvcGVuICYmICFvcGVuT25BcnJvd0tleURvd24gJiYgaXNBcnJvd0tleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNOYXZpZ2F0aW9uS2V5KSB7XG4gICAgICAgICAgICBrZXlSZWYuY3VycmVudCA9IG5lc3RlZCAmJiBpc01haW5LZXkgPyBudWxsIDogZXZlbnQua2V5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmVzdGVkKSB7XG4gICAgICAgICAgICBpZiAoaXNDcm9zc09wZW5LZXkpIHtcbiAgICAgICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gZ2V0TWluSW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzKTtcbiAgICAgICAgICAgICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudC5uYXRpdmVFdmVudCwgJ2xpc3QtbmF2aWdhdGlvbicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc01haW5LZXkpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgaWYgKCFvcGVuICYmIG9wZW5PbkFycm93S2V5RG93bikge1xuICAgICAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdsaXN0LW5hdmlnYXRpb24nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9uS2V5RG93bihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25Gb2N1cygpIHtcbiAgICAgICAgICBpZiAob3BlbiAmJiAhdmlydHVhbCkge1xuICAgICAgICAgICAgb25OYXZpZ2F0ZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uUG9pbnRlckRvd246IGNoZWNrVmlydHVhbFBvaW50ZXIsXG4gICAgICAgIG9uTW91c2VEb3duOiBjaGVja1ZpcnR1YWxNb3VzZSxcbiAgICAgICAgb25DbGljazogY2hlY2tWaXJ0dWFsTW91c2VcbiAgICAgIH0sXG4gICAgICBmbG9hdGluZzoge1xuICAgICAgICAnYXJpYS1vcmllbnRhdGlvbic6IG9yaWVudGF0aW9uID09PSAnYm90aCcgPyB1bmRlZmluZWQgOiBvcmllbnRhdGlvbixcbiAgICAgICAgLi4uKCFpc1R5cGVhYmxlQ29tYm9ib3goZG9tUmVmZXJlbmNlKSAmJiBhcmlhQWN0aXZlRGVzY2VuZGFudFByb3ApLFxuICAgICAgICBvbktleURvd24sXG4gICAgICAgIG9uUG9pbnRlck1vdmUoKSB7XG4gICAgICAgICAgaXNQb2ludGVyTW9kYWxpdHlSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBpdGVtXG4gICAgfTtcbiAgfSwgW2RvbVJlZmVyZW5jZSwgZmxvYXRpbmdSZWYsIGFjdGl2ZUlkLCB2aXJ0dWFsSWQsIGRpc2FibGVkSW5kaWNlc1JlZiwgbGF0ZXN0T3BlblJlZiwgbGlzdFJlZiwgZW5hYmxlZCwgb3JpZW50YXRpb24sIHJ0bCwgdmlydHVhbCwgb3BlbiwgaGFzQWN0aXZlSW5kZXgsIG5lc3RlZCwgc2VsZWN0ZWRJbmRleCwgb3Blbk9uQXJyb3dLZXlEb3duLCBhbGxvd0VzY2FwZSwgY29scywgbG9vcCwgZm9jdXNJdGVtT25PcGVuLCBvbk5hdmlnYXRlLCBvbk9wZW5DaGFuZ2UsIGl0ZW0sIHRyZWUsIHZpcnR1YWxJdGVtUmVmLCBpdGVtU2l6ZXMsIGRlbnNlXSk7XG59XG5cbmNvbnN0IGNvbXBvbmVudFJvbGVUb0FyaWFSb2xlTWFwID0gLyojX19QVVJFX18qL25ldyBNYXAoW1snc2VsZWN0JywgJ2xpc3Rib3gnXSwgWydjb21ib2JveCcsICdsaXN0Ym94J10sIFsnbGFiZWwnLCBmYWxzZV1dKTtcblxuLyoqXG4gKiBBZGRzIGJhc2Ugc2NyZWVuIHJlYWRlciBwcm9wcyB0byB0aGUgcmVmZXJlbmNlIGFuZCBmbG9hdGluZyBlbGVtZW50cyBmb3IgYVxuICogZ2l2ZW4gZmxvYXRpbmcgZWxlbWVudCBgcm9sZWAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlUm9sZVxuICovXG5mdW5jdGlvbiB1c2VSb2xlKGNvbnRleHQsIHByb3BzKSB7XG4gIHZhciBfY29tcG9uZW50Um9sZVRvQXJpYVI7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBmbG9hdGluZ0lkXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgcm9sZSA9ICdkaWFsb2cnXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgYXJpYVJvbGUgPSAoX2NvbXBvbmVudFJvbGVUb0FyaWFSID0gY29tcG9uZW50Um9sZVRvQXJpYVJvbGVNYXAuZ2V0KHJvbGUpKSAhPSBudWxsID8gX2NvbXBvbmVudFJvbGVUb0FyaWFSIDogcm9sZTtcbiAgY29uc3QgcmVmZXJlbmNlSWQgPSB1c2VJZCgpO1xuICBjb25zdCBwYXJlbnRJZCA9IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkKCk7XG4gIGNvbnN0IGlzTmVzdGVkID0gcGFyZW50SWQgIT0gbnVsbDtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IGZsb2F0aW5nUHJvcHMgPSB7XG4gICAgICBpZDogZmxvYXRpbmdJZCxcbiAgICAgIC4uLihhcmlhUm9sZSAmJiB7XG4gICAgICAgIHJvbGU6IGFyaWFSb2xlXG4gICAgICB9KVxuICAgIH07XG4gICAgaWYgKGFyaWFSb2xlID09PSAndG9vbHRpcCcgfHwgcm9sZSA9PT0gJ2xhYmVsJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgW1wiYXJpYS1cIiArIChyb2xlID09PSAnbGFiZWwnID8gJ2xhYmVsbGVkYnknIDogJ2Rlc2NyaWJlZGJ5JyldOiBvcGVuID8gZmxvYXRpbmdJZCA6IHVuZGVmaW5lZFxuICAgICAgICB9LFxuICAgICAgICBmbG9hdGluZzogZmxvYXRpbmdQcm9wc1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICAnYXJpYS1leHBhbmRlZCc6IG9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgICAnYXJpYS1oYXNwb3B1cCc6IGFyaWFSb2xlID09PSAnYWxlcnRkaWFsb2cnID8gJ2RpYWxvZycgOiBhcmlhUm9sZSxcbiAgICAgICAgJ2FyaWEtY29udHJvbHMnOiBvcGVuID8gZmxvYXRpbmdJZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgLi4uKGFyaWFSb2xlID09PSAnbGlzdGJveCcgJiYge1xuICAgICAgICAgIHJvbGU6ICdjb21ib2JveCdcbiAgICAgICAgfSksXG4gICAgICAgIC4uLihhcmlhUm9sZSA9PT0gJ21lbnUnICYmIHtcbiAgICAgICAgICBpZDogcmVmZXJlbmNlSWRcbiAgICAgICAgfSksXG4gICAgICAgIC4uLihhcmlhUm9sZSA9PT0gJ21lbnUnICYmIGlzTmVzdGVkICYmIHtcbiAgICAgICAgICByb2xlOiAnbWVudWl0ZW0nXG4gICAgICAgIH0pLFxuICAgICAgICAuLi4ocm9sZSA9PT0gJ3NlbGVjdCcgJiYge1xuICAgICAgICAgICdhcmlhLWF1dG9jb21wbGV0ZSc6ICdub25lJ1xuICAgICAgICB9KSxcbiAgICAgICAgLi4uKHJvbGUgPT09ICdjb21ib2JveCcgJiYge1xuICAgICAgICAgICdhcmlhLWF1dG9jb21wbGV0ZSc6ICdsaXN0J1xuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIGZsb2F0aW5nOiB7XG4gICAgICAgIC4uLmZsb2F0aW5nUHJvcHMsXG4gICAgICAgIC4uLihhcmlhUm9sZSA9PT0gJ21lbnUnICYmIHtcbiAgICAgICAgICAnYXJpYS1sYWJlbGxlZGJ5JzogcmVmZXJlbmNlSWRcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBpdGVtKF9yZWYpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBhY3RpdmUsXG4gICAgICAgICAgc2VsZWN0ZWRcbiAgICAgICAgfSA9IF9yZWY7XG4gICAgICAgIGNvbnN0IGNvbW1vblByb3BzID0ge1xuICAgICAgICAgIHJvbGU6ICdvcHRpb24nLFxuICAgICAgICAgIC4uLihhY3RpdmUgJiYge1xuICAgICAgICAgICAgaWQ6IGZsb2F0aW5nSWQgKyBcIi1vcHRpb25cIlxuICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRm9yIGBtZW51YCwgd2UgYXJlIHVuYWJsZSB0byB0ZWxsIGlmIHRoZSBpdGVtIGlzIGEgYG1lbnVpdGVtcmFkaW9gXG4gICAgICAgIC8vIG9yIGBtZW51aXRlbWNoZWNrYm94YC4gRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHJlYXNvbnMsIGFsc29cbiAgICAgICAgLy8gYXZvaWQgZGVmYXVsdGluZyB0byBgbWVudWl0ZW1gIGFzIGl0IG1heSBvdmVyd3JpdGUgY3VzdG9tIHJvbGUgcHJvcHMuXG4gICAgICAgIHN3aXRjaCAocm9sZSkge1xuICAgICAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgICAgICAgICAgJ2FyaWEtc2VsZWN0ZWQnOiBhY3RpdmUgJiYgc2VsZWN0ZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgY2FzZSAnY29tYm9ib3gnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICAgICAgIC4uLihhY3RpdmUgJiYge1xuICAgICAgICAgICAgICAgICAgJ2FyaWEtc2VsZWN0ZWQnOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIHJvbGUsIGFyaWFSb2xlLCBvcGVuLCBmbG9hdGluZ0lkLCByZWZlcmVuY2VJZCwgaXNOZXN0ZWRdKTtcbn1cblxuLy8gQ29udmVydHMgYSBKUyBzdHlsZSBrZXkgbGlrZSBgYmFja2dyb3VuZENvbG9yYCB0byBhIENTUyB0cmFuc2l0aW9uLXByb3BlcnR5XG4vLyBsaWtlIGBiYWNrZ3JvdW5kLWNvbG9yYC5cbmNvbnN0IGNhbWVsQ2FzZVRvS2ViYWJDYXNlID0gc3RyID0+IHN0ci5yZXBsYWNlKC9bQS1aXSsoPyFbYS16XSl8W0EtWl0vZywgKCQsIG9mcykgPT4gKG9mcyA/ICctJyA6ICcnKSArICQudG9Mb3dlckNhc2UoKSk7XG5mdW5jdGlvbiBleGVjV2l0aEFyZ3NPclJldHVybih2YWx1ZU9yRm4sIGFyZ3MpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZU9yRm4gPT09ICdmdW5jdGlvbicgPyB2YWx1ZU9yRm4oYXJncykgOiB2YWx1ZU9yRm47XG59XG5mdW5jdGlvbiB1c2VEZWxheVVubW91bnQob3BlbiwgZHVyYXRpb25Ncykge1xuICBjb25zdCBbaXNNb3VudGVkLCBzZXRJc01vdW50ZWRdID0gUmVhY3QudXNlU3RhdGUob3Blbik7XG4gIGlmIChvcGVuICYmICFpc01vdW50ZWQpIHtcbiAgICBzZXRJc01vdW50ZWQodHJ1ZSk7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW9wZW4gJiYgaXNNb3VudGVkKSB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBzZXRJc01vdW50ZWQoZmFsc2UpLCBkdXJhdGlvbk1zKTtcbiAgICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgfVxuICB9LCBbb3BlbiwgaXNNb3VudGVkLCBkdXJhdGlvbk1zXSk7XG4gIHJldHVybiBpc01vdW50ZWQ7XG59XG4vKipcbiAqIFByb3ZpZGVzIGEgc3RhdHVzIHN0cmluZyB0byBhcHBseSBDU1MgdHJhbnNpdGlvbnMgdG8gYSBmbG9hdGluZyBlbGVtZW50LFxuICogY29ycmVjdGx5IGhhbmRsaW5nIHBsYWNlbWVudC1hd2FyZSB0cmFuc2l0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VUcmFuc2l0aW9uI3VzZXRyYW5zaXRpb25zdGF0dXNcbiAqL1xuZnVuY3Rpb24gdXNlVHJhbnNpdGlvblN0YXR1cyhjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGZsb2F0aW5nXG4gICAgfVxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGR1cmF0aW9uID0gMjUwXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgaXNOdW1iZXJEdXJhdGlvbiA9IHR5cGVvZiBkdXJhdGlvbiA9PT0gJ251bWJlcic7XG4gIGNvbnN0IGNsb3NlRHVyYXRpb24gPSAoaXNOdW1iZXJEdXJhdGlvbiA/IGR1cmF0aW9uIDogZHVyYXRpb24uY2xvc2UpIHx8IDA7XG4gIGNvbnN0IFtzdGF0dXMsIHNldFN0YXR1c10gPSBSZWFjdC51c2VTdGF0ZSgndW5tb3VudGVkJyk7XG4gIGNvbnN0IGlzTW91bnRlZCA9IHVzZURlbGF5VW5tb3VudChvcGVuLCBjbG9zZUR1cmF0aW9uKTtcbiAgaWYgKCFpc01vdW50ZWQgJiYgc3RhdHVzID09PSAnY2xvc2UnKSB7XG4gICAgc2V0U3RhdHVzKCd1bm1vdW50ZWQnKTtcbiAgfVxuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFmbG9hdGluZykgcmV0dXJuO1xuICAgIGlmIChvcGVuKSB7XG4gICAgICBzZXRTdGF0dXMoJ2luaXRpYWwnKTtcbiAgICAgIGNvbnN0IGZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgc2V0U3RhdHVzKCdvcGVuJyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGZyYW1lKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHNldFN0YXR1cygnY2xvc2UnKTtcbiAgfSwgW29wZW4sIGZsb2F0aW5nXSk7XG4gIHJldHVybiB7XG4gICAgaXNNb3VudGVkLFxuICAgIHN0YXR1c1xuICB9O1xufVxuLyoqXG4gKiBQcm92aWRlcyBzdHlsZXMgdG8gYXBwbHkgQ1NTIHRyYW5zaXRpb25zIHRvIGEgZmxvYXRpbmcgZWxlbWVudCwgY29ycmVjdGx5XG4gKiBoYW5kbGluZyBwbGFjZW1lbnQtYXdhcmUgdHJhbnNpdGlvbnMuIFdyYXBwZXIgYXJvdW5kIGB1c2VUcmFuc2l0aW9uU3RhdHVzYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VUcmFuc2l0aW9uI3VzZXRyYW5zaXRpb25zdHlsZXNcbiAqL1xuZnVuY3Rpb24gdXNlVHJhbnNpdGlvblN0eWxlcyhjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIGluaXRpYWw6IHVuc3RhYmxlX2luaXRpYWwgPSB7XG4gICAgICBvcGFjaXR5OiAwXG4gICAgfSxcbiAgICBvcGVuOiB1bnN0YWJsZV9vcGVuLFxuICAgIGNsb3NlOiB1bnN0YWJsZV9jbG9zZSxcbiAgICBjb21tb246IHVuc3RhYmxlX2NvbW1vbixcbiAgICBkdXJhdGlvbiA9IDI1MFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBsYWNlbWVudCA9IGNvbnRleHQucGxhY2VtZW50O1xuICBjb25zdCBzaWRlID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIGNvbnN0IGZuQXJncyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBzaWRlLFxuICAgIHBsYWNlbWVudFxuICB9KSwgW3NpZGUsIHBsYWNlbWVudF0pO1xuICBjb25zdCBpc051bWJlckR1cmF0aW9uID0gdHlwZW9mIGR1cmF0aW9uID09PSAnbnVtYmVyJztcbiAgY29uc3Qgb3BlbkR1cmF0aW9uID0gKGlzTnVtYmVyRHVyYXRpb24gPyBkdXJhdGlvbiA6IGR1cmF0aW9uLm9wZW4pIHx8IDA7XG4gIGNvbnN0IGNsb3NlRHVyYXRpb24gPSAoaXNOdW1iZXJEdXJhdGlvbiA/IGR1cmF0aW9uIDogZHVyYXRpb24uY2xvc2UpIHx8IDA7XG4gIGNvbnN0IFtzdHlsZXMsIHNldFN0eWxlc10gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiAoe1xuICAgIC4uLmV4ZWNXaXRoQXJnc09yUmV0dXJuKHVuc3RhYmxlX2NvbW1vbiwgZm5BcmdzKSxcbiAgICAuLi5leGVjV2l0aEFyZ3NPclJldHVybih1bnN0YWJsZV9pbml0aWFsLCBmbkFyZ3MpXG4gIH0pKTtcbiAgY29uc3Qge1xuICAgIGlzTW91bnRlZCxcbiAgICBzdGF0dXNcbiAgfSA9IHVzZVRyYW5zaXRpb25TdGF0dXMoY29udGV4dCwge1xuICAgIGR1cmF0aW9uXG4gIH0pO1xuICBjb25zdCBpbml0aWFsUmVmID0gdXNlTGF0ZXN0UmVmKHVuc3RhYmxlX2luaXRpYWwpO1xuICBjb25zdCBvcGVuUmVmID0gdXNlTGF0ZXN0UmVmKHVuc3RhYmxlX29wZW4pO1xuICBjb25zdCBjbG9zZVJlZiA9IHVzZUxhdGVzdFJlZih1bnN0YWJsZV9jbG9zZSk7XG4gIGNvbnN0IGNvbW1vblJlZiA9IHVzZUxhdGVzdFJlZih1bnN0YWJsZV9jb21tb24pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3QgaW5pdGlhbFN0eWxlcyA9IGV4ZWNXaXRoQXJnc09yUmV0dXJuKGluaXRpYWxSZWYuY3VycmVudCwgZm5BcmdzKTtcbiAgICBjb25zdCBjbG9zZVN0eWxlcyA9IGV4ZWNXaXRoQXJnc09yUmV0dXJuKGNsb3NlUmVmLmN1cnJlbnQsIGZuQXJncyk7XG4gICAgY29uc3QgY29tbW9uU3R5bGVzID0gZXhlY1dpdGhBcmdzT3JSZXR1cm4oY29tbW9uUmVmLmN1cnJlbnQsIGZuQXJncyk7XG4gICAgY29uc3Qgb3BlblN0eWxlcyA9IGV4ZWNXaXRoQXJnc09yUmV0dXJuKG9wZW5SZWYuY3VycmVudCwgZm5BcmdzKSB8fCBPYmplY3Qua2V5cyhpbml0aWFsU3R5bGVzKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICBhY2Nba2V5XSA9ICcnO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICBzZXRTdHlsZXMoc3R5bGVzID0+ICh7XG4gICAgICAgIHRyYW5zaXRpb25Qcm9wZXJ0eTogc3R5bGVzLnRyYW5zaXRpb25Qcm9wZXJ0eSxcbiAgICAgICAgLi4uY29tbW9uU3R5bGVzLFxuICAgICAgICAuLi5pbml0aWFsU3R5bGVzXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09ICdvcGVuJykge1xuICAgICAgc2V0U3R5bGVzKHtcbiAgICAgICAgdHJhbnNpdGlvblByb3BlcnR5OiBPYmplY3Qua2V5cyhvcGVuU3R5bGVzKS5tYXAoY2FtZWxDYXNlVG9LZWJhYkNhc2UpLmpvaW4oJywnKSxcbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBvcGVuRHVyYXRpb24gKyBcIm1zXCIsXG4gICAgICAgIC4uLmNvbW1vblN0eWxlcyxcbiAgICAgICAgLi4ub3BlblN0eWxlc1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09ICdjbG9zZScpIHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IGNsb3NlU3R5bGVzIHx8IGluaXRpYWxTdHlsZXM7XG4gICAgICBzZXRTdHlsZXMoe1xuICAgICAgICB0cmFuc2l0aW9uUHJvcGVydHk6IE9iamVjdC5rZXlzKHN0eWxlcykubWFwKGNhbWVsQ2FzZVRvS2ViYWJDYXNlKS5qb2luKCcsJyksXG4gICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogY2xvc2VEdXJhdGlvbiArIFwibXNcIixcbiAgICAgICAgLi4uY29tbW9uU3R5bGVzLFxuICAgICAgICAuLi5zdHlsZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW2Nsb3NlRHVyYXRpb24sIGNsb3NlUmVmLCBpbml0aWFsUmVmLCBvcGVuUmVmLCBjb21tb25SZWYsIG9wZW5EdXJhdGlvbiwgc3RhdHVzLCBmbkFyZ3NdKTtcbiAgcmV0dXJuIHtcbiAgICBpc01vdW50ZWQsXG4gICAgc3R5bGVzXG4gIH07XG59XG5cbi8qKlxuICogUHJvdmlkZXMgYSBtYXRjaGluZyBjYWxsYmFjayB0aGF0IGNhbiBiZSB1c2VkIHRvIGZvY3VzIGFuIGl0ZW0gYXMgdGhlIHVzZXJcbiAqIHR5cGVzLCBvZnRlbiB1c2VkIGluIHRhbmRlbSB3aXRoIGB1c2VMaXN0TmF2aWdhdGlvbigpYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VUeXBlYWhlYWRcbiAqL1xuZnVuY3Rpb24gdXNlVHlwZWFoZWFkKGNvbnRleHQsIHByb3BzKSB7XG4gIHZhciBfcmVmO1xuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBkYXRhUmVmXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgbGlzdFJlZixcbiAgICBhY3RpdmVJbmRleCxcbiAgICBvbk1hdGNoOiB1bnN0YWJsZV9vbk1hdGNoLFxuICAgIG9uVHlwaW5nQ2hhbmdlOiB1bnN0YWJsZV9vblR5cGluZ0NoYW5nZSxcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBmaW5kTWF0Y2ggPSBudWxsLFxuICAgIHJlc2V0TXMgPSA3NTAsXG4gICAgaWdub3JlS2V5cyA9IFtdLFxuICAgIHNlbGVjdGVkSW5kZXggPSBudWxsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdGltZW91dElkUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IHN0cmluZ1JlZiA9IFJlYWN0LnVzZVJlZignJyk7XG4gIGNvbnN0IHByZXZJbmRleFJlZiA9IFJlYWN0LnVzZVJlZigoX3JlZiA9IHNlbGVjdGVkSW5kZXggIT0gbnVsbCA/IHNlbGVjdGVkSW5kZXggOiBhY3RpdmVJbmRleCkgIT0gbnVsbCA/IF9yZWYgOiAtMSk7XG4gIGNvbnN0IG1hdGNoSW5kZXhSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IG9uTWF0Y2ggPSB1c2VFZmZlY3RFdmVudCh1bnN0YWJsZV9vbk1hdGNoKTtcbiAgY29uc3Qgb25UeXBpbmdDaGFuZ2UgPSB1c2VFZmZlY3RFdmVudCh1bnN0YWJsZV9vblR5cGluZ0NoYW5nZSk7XG4gIGNvbnN0IGZpbmRNYXRjaFJlZiA9IHVzZUxhdGVzdFJlZihmaW5kTWF0Y2gpO1xuICBjb25zdCBpZ25vcmVLZXlzUmVmID0gdXNlTGF0ZXN0UmVmKGlnbm9yZUtleXMpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWRSZWYuY3VycmVudCk7XG4gICAgICBtYXRjaEluZGV4UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgc3RyaW5nUmVmLmN1cnJlbnQgPSAnJztcbiAgICB9XG4gIH0sIFtvcGVuXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICAvLyBTeW5jIGFycm93IGtleSBuYXZpZ2F0aW9uIGJ1dCBub3QgdHlwZWFoZWFkIG5hdmlnYXRpb24uXG4gICAgaWYgKG9wZW4gJiYgc3RyaW5nUmVmLmN1cnJlbnQgPT09ICcnKSB7XG4gICAgICB2YXIgX3JlZjI7XG4gICAgICBwcmV2SW5kZXhSZWYuY3VycmVudCA9IChfcmVmMiA9IHNlbGVjdGVkSW5kZXggIT0gbnVsbCA/IHNlbGVjdGVkSW5kZXggOiBhY3RpdmVJbmRleCkgIT0gbnVsbCA/IF9yZWYyIDogLTE7XG4gICAgfVxuICB9LCBbb3Blbiwgc2VsZWN0ZWRJbmRleCwgYWN0aXZlSW5kZXhdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRUeXBpbmdDaGFuZ2UodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoIWRhdGFSZWYuY3VycmVudC50eXBpbmcpIHtcbiAgICAgICAgICBkYXRhUmVmLmN1cnJlbnQudHlwaW5nID0gdmFsdWU7XG4gICAgICAgICAgb25UeXBpbmdDaGFuZ2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGF0YVJlZi5jdXJyZW50LnR5cGluZykge1xuICAgICAgICAgIGRhdGFSZWYuY3VycmVudC50eXBpbmcgPSB2YWx1ZTtcbiAgICAgICAgICBvblR5cGluZ0NoYW5nZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0TWF0Y2hpbmdJbmRleChsaXN0LCBvcmRlcmVkTGlzdCwgc3RyaW5nKSB7XG4gICAgICBjb25zdCBzdHIgPSBmaW5kTWF0Y2hSZWYuY3VycmVudCA/IGZpbmRNYXRjaFJlZi5jdXJyZW50KG9yZGVyZWRMaXN0LCBzdHJpbmcpIDogb3JkZXJlZExpc3QuZmluZCh0ZXh0ID0+ICh0ZXh0ID09IG51bGwgPyB2b2lkIDAgOiB0ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZihzdHJpbmcudG9Mb2NhbGVMb3dlckNhc2UoKSkpID09PSAwKTtcbiAgICAgIHJldHVybiBzdHIgPyBsaXN0LmluZGV4T2Yoc3RyKSA6IC0xO1xuICAgIH1cbiAgICBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IGxpc3RDb250ZW50ID0gbGlzdFJlZi5jdXJyZW50O1xuICAgICAgaWYgKHN0cmluZ1JlZi5jdXJyZW50Lmxlbmd0aCA+IDAgJiYgc3RyaW5nUmVmLmN1cnJlbnRbMF0gIT09ICcgJykge1xuICAgICAgICBpZiAoZ2V0TWF0Y2hpbmdJbmRleChsaXN0Q29udGVudCwgbGlzdENvbnRlbnQsIHN0cmluZ1JlZi5jdXJyZW50KSA9PT0gLTEpIHtcbiAgICAgICAgICBzZXRUeXBpbmdDaGFuZ2UoZmFsc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxpc3RDb250ZW50ID09IG51bGwgfHwgaWdub3JlS2V5c1JlZi5jdXJyZW50LmluY2x1ZGVzKGV2ZW50LmtleSkgfHxcbiAgICAgIC8vIENoYXJhY3RlciBrZXkuXG4gICAgICBldmVudC5rZXkubGVuZ3RoICE9PSAxIHx8XG4gICAgICAvLyBNb2RpZmllciBrZXkuXG4gICAgICBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChvcGVuICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgIHNldFR5cGluZ0NoYW5nZSh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQmFpbCBvdXQgaWYgdGhlIGxpc3QgY29udGFpbnMgYSB3b3JkIGxpa2UgXCJsbGFtYVwiIG9yIFwiYWFyb25cIi4gVE9ETzpcbiAgICAgIC8vIGFsbG93IGl0IGluIHRoaXMgY2FzZSwgdG9vLlxuICAgICAgY29uc3QgYWxsb3dSYXBpZFN1Y2Nlc3Npb25PZkZpcnN0TGV0dGVyID0gbGlzdENvbnRlbnQuZXZlcnkodGV4dCA9PiB7XG4gICAgICAgIHZhciBfdGV4dCQsIF90ZXh0JDI7XG4gICAgICAgIHJldHVybiB0ZXh0ID8gKChfdGV4dCQgPSB0ZXh0WzBdKSA9PSBudWxsID8gdm9pZCAwIDogX3RleHQkLnRvTG9jYWxlTG93ZXJDYXNlKCkpICE9PSAoKF90ZXh0JDIgPSB0ZXh0WzFdKSA9PSBudWxsID8gdm9pZCAwIDogX3RleHQkMi50b0xvY2FsZUxvd2VyQ2FzZSgpKSA6IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIGN5Y2xlIHRocm91Z2ggaXRlbXMgdGhhdCBzdGFydCB3aXRoIHRoZSBzYW1lIGxldHRlclxuICAgICAgLy8gaW4gcmFwaWQgc3VjY2Vzc2lvbi5cbiAgICAgIGlmIChhbGxvd1JhcGlkU3VjY2Vzc2lvbk9mRmlyc3RMZXR0ZXIgJiYgc3RyaW5nUmVmLmN1cnJlbnQgPT09IGV2ZW50LmtleSkge1xuICAgICAgICBzdHJpbmdSZWYuY3VycmVudCA9ICcnO1xuICAgICAgICBwcmV2SW5kZXhSZWYuY3VycmVudCA9IG1hdGNoSW5kZXhSZWYuY3VycmVudDtcbiAgICAgIH1cbiAgICAgIHN0cmluZ1JlZi5jdXJyZW50ICs9IGV2ZW50LmtleTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWRSZWYuY3VycmVudCk7XG4gICAgICB0aW1lb3V0SWRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzdHJpbmdSZWYuY3VycmVudCA9ICcnO1xuICAgICAgICBwcmV2SW5kZXhSZWYuY3VycmVudCA9IG1hdGNoSW5kZXhSZWYuY3VycmVudDtcbiAgICAgICAgc2V0VHlwaW5nQ2hhbmdlKGZhbHNlKTtcbiAgICAgIH0sIHJlc2V0TXMpO1xuICAgICAgY29uc3QgcHJldkluZGV4ID0gcHJldkluZGV4UmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBpbmRleCA9IGdldE1hdGNoaW5nSW5kZXgobGlzdENvbnRlbnQsIFsuLi5saXN0Q29udGVudC5zbGljZSgocHJldkluZGV4IHx8IDApICsgMSksIC4uLmxpc3RDb250ZW50LnNsaWNlKDAsIChwcmV2SW5kZXggfHwgMCkgKyAxKV0sIHN0cmluZ1JlZi5jdXJyZW50KTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgb25NYXRjaChpbmRleCk7XG4gICAgICAgIG1hdGNoSW5kZXhSZWYuY3VycmVudCA9IGluZGV4O1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgIT09ICcgJykge1xuICAgICAgICBzdHJpbmdSZWYuY3VycmVudCA9ICcnO1xuICAgICAgICBzZXRUeXBpbmdDaGFuZ2UoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgIG9uS2V5RG93blxuICAgICAgfSxcbiAgICAgIGZsb2F0aW5nOiB7XG4gICAgICAgIG9uS2V5RG93bixcbiAgICAgICAgb25LZXlVcChldmVudCkge1xuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgICAgICAgc2V0VHlwaW5nQ2hhbmdlKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LCBbZW5hYmxlZCwgb3BlbiwgZGF0YVJlZiwgbGlzdFJlZiwgcmVzZXRNcywgaWdub3JlS2V5c1JlZiwgZmluZE1hdGNoUmVmLCBvbk1hdGNoLCBvblR5cGluZ0NoYW5nZV0pO1xufVxuXG5mdW5jdGlvbiBnZXRBcmdzV2l0aEN1c3RvbUZsb2F0aW5nSGVpZ2h0KHN0YXRlLCBoZWlnaHQpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICByZWN0czoge1xuICAgICAgLi4uc3RhdGUucmVjdHMsXG4gICAgICBmbG9hdGluZzoge1xuICAgICAgICAuLi5zdGF0ZS5yZWN0cy5mbG9hdGluZyxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuLyoqXG4gKiBQb3NpdGlvbnMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgc3VjaCB0aGF0IGFuIGlubmVyIGVsZW1lbnQgaW5zaWRlXG4gKiBvZiBpdCBpcyBhbmNob3JlZCB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaW5uZXJcbiAqL1xuY29uc3QgaW5uZXIgPSBwcm9wcyA9PiAoe1xuICBuYW1lOiAnaW5uZXInLFxuICBvcHRpb25zOiBwcm9wcyxcbiAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBsaXN0UmVmLFxuICAgICAgb3ZlcmZsb3dSZWYsXG4gICAgICBvbkZhbGxiYWNrQ2hhbmdlLFxuICAgICAgb2Zmc2V0OiBpbm5lck9mZnNldCA9IDAsXG4gICAgICBpbmRleCA9IDAsXG4gICAgICBtaW5JdGVtc1Zpc2libGUgPSA0LFxuICAgICAgcmVmZXJlbmNlT3ZlcmZsb3dUaHJlc2hvbGQgPSAwLFxuICAgICAgc2Nyb2xsUmVmLFxuICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlY3RzLFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgZmxvYXRpbmdcbiAgICAgIH1cbiAgICB9ID0gc3RhdGU7XG4gICAgY29uc3QgaXRlbSA9IGxpc3RSZWYuY3VycmVudFtpbmRleF07XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKCFzdGF0ZS5wbGFjZW1lbnQuc3RhcnRzV2l0aCgnYm90dG9tJykpIHtcbiAgICAgICAgd2FybignYHBsYWNlbWVudGAgc2lkZSBtdXN0IGJlIFwiYm90dG9tXCIgd2hlbiB1c2luZyB0aGUgYGlubmVyYCcsICdtaWRkbGV3YXJlLicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgbmV4dEFyZ3MgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIC4uLihhd2FpdCBvZmZzZXQoLWl0ZW0ub2Zmc2V0VG9wIC0gZmxvYXRpbmcuY2xpZW50VG9wIC0gcmVjdHMucmVmZXJlbmNlLmhlaWdodCAvIDIgLSBpdGVtLm9mZnNldEhlaWdodCAvIDIgLSBpbm5lck9mZnNldCkuZm4oc3RhdGUpKVxuICAgIH07XG4gICAgY29uc3QgZWwgPSAoc2Nyb2xsUmVmID09IG51bGwgPyB2b2lkIDAgOiBzY3JvbGxSZWYuY3VycmVudCkgfHwgZmxvYXRpbmc7XG4gICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhnZXRBcmdzV2l0aEN1c3RvbUZsb2F0aW5nSGVpZ2h0KG5leHRBcmdzLCBlbC5zY3JvbGxIZWlnaHQpLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgIGNvbnN0IHJlZk92ZXJmbG93ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3cobmV4dEFyZ3MsIHtcbiAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyxcbiAgICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICAgIH0pO1xuICAgIGNvbnN0IGRpZmZZID0gTWF0aC5tYXgoMCwgb3ZlcmZsb3cudG9wKTtcbiAgICBjb25zdCBuZXh0WSA9IG5leHRBcmdzLnkgKyBkaWZmWTtcbiAgICBjb25zdCBtYXhIZWlnaHQgPSBNYXRoLm1heCgwLCBlbC5zY3JvbGxIZWlnaHQgLSBkaWZmWSAtIE1hdGgubWF4KDAsIG92ZXJmbG93LmJvdHRvbSkpO1xuICAgIGVsLnN0eWxlLm1heEhlaWdodCA9IG1heEhlaWdodCArIFwicHhcIjtcbiAgICBlbC5zY3JvbGxUb3AgPSBkaWZmWTtcblxuICAgIC8vIFRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UsIGZhbGxiYWNrIHRvIHN0YW5kYXJkIGFuY2hvcmVkIHBvc2l0aW9uaW5nXG4gICAgaWYgKG9uRmFsbGJhY2tDaGFuZ2UpIHtcbiAgICAgIGlmIChlbC5vZmZzZXRIZWlnaHQgPCBpdGVtLm9mZnNldEhlaWdodCAqIE1hdGgubWluKG1pbkl0ZW1zVmlzaWJsZSwgbGlzdFJlZi5jdXJyZW50Lmxlbmd0aCAtIDEpIC0gMSB8fCByZWZPdmVyZmxvdy50b3AgPj0gLXJlZmVyZW5jZU92ZXJmbG93VGhyZXNob2xkIHx8IHJlZk92ZXJmbG93LmJvdHRvbSA+PSAtcmVmZXJlbmNlT3ZlcmZsb3dUaHJlc2hvbGQpIHtcbiAgICAgICAgZmx1c2hTeW5jKCgpID0+IG9uRmFsbGJhY2tDaGFuZ2UodHJ1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmx1c2hTeW5jKCgpID0+IG9uRmFsbGJhY2tDaGFuZ2UoZmFsc2UpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG92ZXJmbG93UmVmKSB7XG4gICAgICBvdmVyZmxvd1JlZi5jdXJyZW50ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3coZ2V0QXJnc1dpdGhDdXN0b21GbG9hdGluZ0hlaWdodCh7XG4gICAgICAgIC4uLm5leHRBcmdzLFxuICAgICAgICB5OiBuZXh0WVxuICAgICAgfSwgZWwub2Zmc2V0SGVpZ2h0KSwgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHk6IG5leHRZXG4gICAgfTtcbiAgfVxufSk7XG4vKipcbiAqIENoYW5nZXMgdGhlIGBpbm5lcmAgbWlkZGxld2FyZSdzIGBvZmZzZXRgIHVwb24gYSBgd2hlZWxgIGV2ZW50IHRvXG4gKiBleHBhbmQgdGhlIGZsb2F0aW5nIGVsZW1lbnQncyBoZWlnaHQsIHJldmVhbGluZyBtb3JlIGxpc3QgaXRlbXMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaW5uZXJcbiAqL1xuZnVuY3Rpb24gdXNlSW5uZXJPZmZzZXQoY29udGV4dCwgcHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZWxlbWVudHNcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBvdmVyZmxvd1JlZixcbiAgICBzY3JvbGxSZWYsXG4gICAgb25DaGFuZ2U6IHVuc3RhYmxlX29uQ2hhbmdlXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qgb25DaGFuZ2UgPSB1c2VFZmZlY3RFdmVudCh1bnN0YWJsZV9vbkNoYW5nZSk7XG4gIGNvbnN0IGNvbnRyb2xsZWRTY3JvbGxpbmdSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBwcmV2U2Nyb2xsVG9wUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBpbml0aWFsT3ZlcmZsb3dSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uV2hlZWwoZSkge1xuICAgICAgaWYgKGUuY3RybEtleSB8fCAhZWwgfHwgb3ZlcmZsb3dSZWYuY3VycmVudCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRZID0gZS5kZWx0YVk7XG4gICAgICBjb25zdCBpc0F0VG9wID0gb3ZlcmZsb3dSZWYuY3VycmVudC50b3AgPj0gLTAuNTtcbiAgICAgIGNvbnN0IGlzQXRCb3R0b20gPSBvdmVyZmxvd1JlZi5jdXJyZW50LmJvdHRvbSA+PSAtMC41O1xuICAgICAgY29uc3QgcmVtYWluaW5nU2Nyb2xsID0gZWwuc2Nyb2xsSGVpZ2h0IC0gZWwuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3Qgc2lnbiA9IGRZIDwgMCA/IC0xIDogMTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGRZIDwgMCA/ICdtYXgnIDogJ21pbic7XG4gICAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0IDw9IGVsLmNsaWVudEhlaWdodCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXRUb3AgJiYgZFkgPiAwIHx8ICFpc0F0Qm90dG9tICYmIGRZIDwgMCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGZsdXNoU3luYygoKSA9PiB7XG4gICAgICAgICAgb25DaGFuZ2UoZCA9PiBkICsgTWF0aFttZXRob2RdKGRZLCByZW1haW5pbmdTY3JvbGwgKiBzaWduKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICgvZmlyZWZveC9pLnRlc3QoZ2V0VXNlckFnZW50KCkpKSB7XG4gICAgICAgIC8vIE5lZWRlZCB0byBwcm9wYWdhdGUgc2Nyb2xsaW5nIGR1cmluZyBtb21lbnR1bSBzY3JvbGxpbmcgcGhhc2Ugb25jZVxuICAgICAgICAvLyBpdCBnZXRzIGxpbWl0ZWQgYnkgdGhlIGJvdW5kYXJ5LiBVWCBpbXByb3ZlbWVudCwgbm90IGNyaXRpY2FsLlxuICAgICAgICBlbC5zY3JvbGxUb3AgKz0gZFk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVsID0gKHNjcm9sbFJlZiA9PSBudWxsID8gdm9pZCAwIDogc2Nyb2xsUmVmLmN1cnJlbnQpIHx8IGVsZW1lbnRzLmZsb2F0aW5nO1xuICAgIGlmIChvcGVuICYmIGVsKSB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uV2hlZWwpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgcG9zaXRpb24gdG8gYmUgcmVhZHkuXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBwcmV2U2Nyb2xsVG9wUmVmLmN1cnJlbnQgPSBlbC5zY3JvbGxUb3A7XG4gICAgICAgIGlmIChvdmVyZmxvd1JlZi5jdXJyZW50ICE9IG51bGwpIHtcbiAgICAgICAgICBpbml0aWFsT3ZlcmZsb3dSZWYuY3VycmVudCA9IHtcbiAgICAgICAgICAgIC4uLm92ZXJmbG93UmVmLmN1cnJlbnRcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHByZXZTY3JvbGxUb3BSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgIGluaXRpYWxPdmVyZmxvd1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbldoZWVsKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgb3BlbiwgZWxlbWVudHMuZmxvYXRpbmcsIG92ZXJmbG93UmVmLCBzY3JvbGxSZWYsIG9uQ2hhbmdlXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGZsb2F0aW5nOiB7XG4gICAgICAgIG9uS2V5RG93bigpIHtcbiAgICAgICAgICBjb250cm9sbGVkU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvbldoZWVsKCkge1xuICAgICAgICAgIGNvbnRyb2xsZWRTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBvblBvaW50ZXJNb3ZlKCkge1xuICAgICAgICAgIGNvbnRyb2xsZWRTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBvblNjcm9sbCgpIHtcbiAgICAgICAgICBjb25zdCBlbCA9IChzY3JvbGxSZWYgPT0gbnVsbCA/IHZvaWQgMCA6IHNjcm9sbFJlZi5jdXJyZW50KSB8fCBlbGVtZW50cy5mbG9hdGluZztcbiAgICAgICAgICBpZiAoIW92ZXJmbG93UmVmLmN1cnJlbnQgfHwgIWVsIHx8ICFjb250cm9sbGVkU2Nyb2xsaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXZTY3JvbGxUb3BSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsRGlmZiA9IGVsLnNjcm9sbFRvcCAtIHByZXZTY3JvbGxUb3BSZWYuY3VycmVudDtcbiAgICAgICAgICAgIGlmIChvdmVyZmxvd1JlZi5jdXJyZW50LmJvdHRvbSA8IC0wLjUgJiYgc2Nyb2xsRGlmZiA8IC0xIHx8IG92ZXJmbG93UmVmLmN1cnJlbnQudG9wIDwgLTAuNSAmJiBzY3JvbGxEaWZmID4gMSkge1xuICAgICAgICAgICAgICBmbHVzaFN5bmMoKCkgPT4gb25DaGFuZ2UoZCA9PiBkICsgc2Nyb2xsRGlmZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFtGaXJlZm94XSBXYWl0IGZvciB0aGUgaGVpZ2h0IGNoYW5nZSB0byBoYXZlIGJlZW4gYXBwbGllZC5cbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgcHJldlNjcm9sbFRvcFJlZi5jdXJyZW50ID0gZWwuc2Nyb2xsVG9wO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIG92ZXJmbG93UmVmLCBlbGVtZW50cy5mbG9hdGluZywgc2Nyb2xsUmVmLCBvbkNoYW5nZV0pO1xufVxuXG5mdW5jdGlvbiBpc1BvaW50SW5Qb2x5Z29uKHBvaW50LCBwb2x5Z29uKSB7XG4gIGNvbnN0IFt4LCB5XSA9IHBvaW50O1xuICBsZXQgaXNJbnNpZGUgPSBmYWxzZTtcbiAgY29uc3QgbGVuZ3RoID0gcG9seWdvbi5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwLCBqID0gbGVuZ3RoIC0gMTsgaSA8IGxlbmd0aDsgaiA9IGkrKykge1xuICAgIGNvbnN0IFt4aSwgeWldID0gcG9seWdvbltpXSB8fCBbMCwgMF07XG4gICAgY29uc3QgW3hqLCB5al0gPSBwb2x5Z29uW2pdIHx8IFswLCAwXTtcbiAgICBjb25zdCBpbnRlcnNlY3QgPSB5aSA+PSB5ICE9PSB5aiA+PSB5ICYmIHggPD0gKHhqIC0geGkpICogKHkgLSB5aSkgLyAoeWogLSB5aSkgKyB4aTtcbiAgICBpZiAoaW50ZXJzZWN0KSB7XG4gICAgICBpc0luc2lkZSA9ICFpc0luc2lkZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGlzSW5zaWRlO1xufVxuZnVuY3Rpb24gaXNJbnNpZGUocG9pbnQsIHJlY3QpIHtcbiAgcmV0dXJuIHBvaW50WzBdID49IHJlY3QueCAmJiBwb2ludFswXSA8PSByZWN0LnggKyByZWN0LndpZHRoICYmIHBvaW50WzFdID49IHJlY3QueSAmJiBwb2ludFsxXSA8PSByZWN0LnkgKyByZWN0LmhlaWdodDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgc2FmZSBwb2x5Z29uIGFyZWEgdGhhdCB0aGUgdXNlciBjYW4gdHJhdmVyc2Ugd2l0aG91dCBjbG9zaW5nIHRoZVxuICogZmxvYXRpbmcgZWxlbWVudCBvbmNlIGxlYXZpbmcgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUhvdmVyI3NhZmVwb2x5Z29uXG4gKi9cbmZ1bmN0aW9uIHNhZmVQb2x5Z29uKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgYnVmZmVyID0gMC41LFxuICAgIGJsb2NrUG9pbnRlckV2ZW50cyA9IGZhbHNlLFxuICAgIHJlcXVpcmVJbnRlbnQgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuICBsZXQgdGltZW91dElkO1xuICBsZXQgaGFzTGFuZGVkID0gZmFsc2U7XG4gIGxldCBsYXN0WCA9IG51bGw7XG4gIGxldCBsYXN0WSA9IG51bGw7XG4gIGxldCBsYXN0Q3Vyc29yVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICBmdW5jdGlvbiBnZXRDdXJzb3JTcGVlZCh4LCB5KSB7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IGN1cnJlbnRUaW1lIC0gbGFzdEN1cnNvclRpbWU7XG4gICAgaWYgKGxhc3RYID09PSBudWxsIHx8IGxhc3RZID09PSBudWxsIHx8IGVsYXBzZWRUaW1lID09PSAwKSB7XG4gICAgICBsYXN0WCA9IHg7XG4gICAgICBsYXN0WSA9IHk7XG4gICAgICBsYXN0Q3Vyc29yVGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRlbHRhWCA9IHggLSBsYXN0WDtcbiAgICBjb25zdCBkZWx0YVkgPSB5IC0gbGFzdFk7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICBjb25zdCBzcGVlZCA9IGRpc3RhbmNlIC8gZWxhcHNlZFRpbWU7IC8vIHB4IC8gbXNcblxuICAgIGxhc3RYID0geDtcbiAgICBsYXN0WSA9IHk7XG4gICAgbGFzdEN1cnNvclRpbWUgPSBjdXJyZW50VGltZTtcbiAgICByZXR1cm4gc3BlZWQ7XG4gIH1cbiAgY29uc3QgZm4gPSBfcmVmID0+IHtcbiAgICBsZXQge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBlbGVtZW50cyxcbiAgICAgIG9uQ2xvc2UsXG4gICAgICBub2RlSWQsXG4gICAgICB0cmVlXG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgaWYgKCFlbGVtZW50cy5kb21SZWZlcmVuY2UgfHwgIWVsZW1lbnRzLmZsb2F0aW5nIHx8IHBsYWNlbWVudCA9PSBudWxsIHx8IHggPT0gbnVsbCB8fCB5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBjbGllbnRYLFxuICAgICAgICBjbGllbnRZXG4gICAgICB9ID0gZXZlbnQ7XG4gICAgICBjb25zdCBjbGllbnRQb2ludCA9IFtjbGllbnRYLCBjbGllbnRZXTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudCk7XG4gICAgICBjb25zdCBpc0xlYXZlID0gZXZlbnQudHlwZSA9PT0gJ21vdXNlbGVhdmUnO1xuICAgICAgY29uc3QgaXNPdmVyRmxvYXRpbmdFbCA9IGNvbnRhaW5zKGVsZW1lbnRzLmZsb2F0aW5nLCB0YXJnZXQpO1xuICAgICAgY29uc3QgaXNPdmVyUmVmZXJlbmNlRWwgPSBjb250YWlucyhlbGVtZW50cy5kb21SZWZlcmVuY2UsIHRhcmdldCk7XG4gICAgICBjb25zdCByZWZSZWN0ID0gZWxlbWVudHMuZG9tUmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnRzLmZsb2F0aW5nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgc2lkZSA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICAgICAgY29uc3QgY3Vyc29yTGVhdmVGcm9tUmlnaHQgPSB4ID4gcmVjdC5yaWdodCAtIHJlY3Qud2lkdGggLyAyO1xuICAgICAgY29uc3QgY3Vyc29yTGVhdmVGcm9tQm90dG9tID0geSA+IHJlY3QuYm90dG9tIC0gcmVjdC5oZWlnaHQgLyAyO1xuICAgICAgY29uc3QgaXNPdmVyUmVmZXJlbmNlUmVjdCA9IGlzSW5zaWRlKGNsaWVudFBvaW50LCByZWZSZWN0KTtcbiAgICAgIGNvbnN0IGlzRmxvYXRpbmdXaWRlciA9IHJlY3Qud2lkdGggPiByZWZSZWN0LndpZHRoO1xuICAgICAgY29uc3QgaXNGbG9hdGluZ1RhbGxlciA9IHJlY3QuaGVpZ2h0ID4gcmVmUmVjdC5oZWlnaHQ7XG4gICAgICBjb25zdCBsZWZ0ID0gKGlzRmxvYXRpbmdXaWRlciA/IHJlZlJlY3QgOiByZWN0KS5sZWZ0O1xuICAgICAgY29uc3QgcmlnaHQgPSAoaXNGbG9hdGluZ1dpZGVyID8gcmVmUmVjdCA6IHJlY3QpLnJpZ2h0O1xuICAgICAgY29uc3QgdG9wID0gKGlzRmxvYXRpbmdUYWxsZXIgPyByZWZSZWN0IDogcmVjdCkudG9wO1xuICAgICAgY29uc3QgYm90dG9tID0gKGlzRmxvYXRpbmdUYWxsZXIgPyByZWZSZWN0IDogcmVjdCkuYm90dG9tO1xuICAgICAgaWYgKGlzT3ZlckZsb2F0aW5nRWwpIHtcbiAgICAgICAgaGFzTGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpc0xlYXZlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNPdmVyUmVmZXJlbmNlRWwpIHtcbiAgICAgICAgaGFzTGFuZGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNPdmVyUmVmZXJlbmNlRWwgJiYgIWlzTGVhdmUpIHtcbiAgICAgICAgaGFzTGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmV2ZW50IG92ZXJsYXBwaW5nIGZsb2F0aW5nIGVsZW1lbnQgZnJvbSBiZWluZyBzdHVjayBpbiBhbiBvcGVuLWNsb3NlXG4gICAgICAvLyBsb29wOiBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzE5MTBcbiAgICAgIGlmIChpc0xlYXZlICYmIGlzRWxlbWVudChldmVudC5yZWxhdGVkVGFyZ2V0KSAmJiBjb250YWlucyhlbGVtZW50cy5mbG9hdGluZywgZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBhbnkgbmVzdGVkIGNoaWxkIGlzIG9wZW4sIGFib3J0LlxuICAgICAgaWYgKHRyZWUgJiYgZ2V0Q2hpbGRyZW4odHJlZS5ub2Rlc1JlZi5jdXJyZW50LCBub2RlSWQpLnNvbWUoX3JlZjIgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgfSA9IF9yZWYyO1xuICAgICAgICByZXR1cm4gY29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogY29udGV4dC5vcGVuO1xuICAgICAgfSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgcG9pbnRlciBpcyBsZWF2aW5nIGZyb20gdGhlIG9wcG9zaXRlIHNpZGUsIHRoZSBcImJ1ZmZlclwiIGxvZ2ljXG4gICAgICAvLyBjcmVhdGVzIGEgcG9pbnQgd2hlcmUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgcmVtYWlucyBvcGVuLCBidXQgc2hvdWxkIGJlXG4gICAgICAvLyBpZ25vcmVkLlxuICAgICAgLy8gQSBjb25zdGFudCBvZiAxIGhhbmRsZXMgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzLlxuICAgICAgaWYgKHNpZGUgPT09ICd0b3AnICYmIHkgPj0gcmVmUmVjdC5ib3R0b20gLSAxIHx8IHNpZGUgPT09ICdib3R0b20nICYmIHkgPD0gcmVmUmVjdC50b3AgKyAxIHx8IHNpZGUgPT09ICdsZWZ0JyAmJiB4ID49IHJlZlJlY3QucmlnaHQgLSAxIHx8IHNpZGUgPT09ICdyaWdodCcgJiYgeCA8PSByZWZSZWN0LmxlZnQgKyAxKSB7XG4gICAgICAgIHJldHVybiBjbG9zZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZ25vcmUgd2hlbiB0aGUgY3Vyc29yIGlzIHdpdGhpbiB0aGUgcmVjdGFuZ3VsYXIgdHJvdWdoIGJldHdlZW4gdGhlXG4gICAgICAvLyB0d28gZWxlbWVudHMuIFNpbmNlIHRoZSB0cmlhbmdsZSBpcyBjcmVhdGVkIGZyb20gdGhlIGN1cnNvciBwb2ludCxcbiAgICAgIC8vIHdoaWNoIGNhbiBzdGFydCBiZXlvbmQgdGhlIHJlZiBlbGVtZW50J3MgZWRnZSwgdHJhdmVyc2luZyBiYWNrIGFuZFxuICAgICAgLy8gZm9ydGggZnJvbSB0aGUgcmVmIHRvIHRoZSBmbG9hdGluZyBlbGVtZW50IGNhbiBjYXVzZSBpdCB0byBjbG9zZS4gVGhpc1xuICAgICAgLy8gZW5zdXJlcyBpdCBhbHdheXMgcmVtYWlucyBvcGVuIGluIHRoYXQgY2FzZS5cbiAgICAgIGxldCByZWN0UG9seSA9IFtdO1xuICAgICAgc3dpdGNoIChzaWRlKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgcmVjdFBvbHkgPSBbW2xlZnQsIHJlZlJlY3QudG9wICsgMV0sIFtsZWZ0LCByZWN0LmJvdHRvbSAtIDFdLCBbcmlnaHQsIHJlY3QuYm90dG9tIC0gMV0sIFtyaWdodCwgcmVmUmVjdC50b3AgKyAxXV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgcmVjdFBvbHkgPSBbW2xlZnQsIHJlY3QudG9wICsgMV0sIFtsZWZ0LCByZWZSZWN0LmJvdHRvbSAtIDFdLCBbcmlnaHQsIHJlZlJlY3QuYm90dG9tIC0gMV0sIFtyaWdodCwgcmVjdC50b3AgKyAxXV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIHJlY3RQb2x5ID0gW1tyZWN0LnJpZ2h0IC0gMSwgYm90dG9tXSwgW3JlY3QucmlnaHQgLSAxLCB0b3BdLCBbcmVmUmVjdC5sZWZ0ICsgMSwgdG9wXSwgW3JlZlJlY3QubGVmdCArIDEsIGJvdHRvbV1dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgcmVjdFBvbHkgPSBbW3JlZlJlY3QucmlnaHQgLSAxLCBib3R0b21dLCBbcmVmUmVjdC5yaWdodCAtIDEsIHRvcF0sIFtyZWN0LmxlZnQgKyAxLCB0b3BdLCBbcmVjdC5sZWZ0ICsgMSwgYm90dG9tXV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXRQb2x5Z29uKF9yZWYzKSB7XG4gICAgICAgIGxldCBbeCwgeV0gPSBfcmVmMztcbiAgICAgICAgc3dpdGNoIChzaWRlKSB7XG4gICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRPbmUgPSBbaXNGbG9hdGluZ1dpZGVyID8geCArIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHggKyBidWZmZXIgKiA0IDogeCAtIGJ1ZmZlciAqIDQsIHkgKyBidWZmZXIgKyAxXTtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRUd28gPSBbaXNGbG9hdGluZ1dpZGVyID8geCAtIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHggKyBidWZmZXIgKiA0IDogeCAtIGJ1ZmZlciAqIDQsIHkgKyBidWZmZXIgKyAxXTtcbiAgICAgICAgICAgICAgY29uc3QgY29tbW9uUG9pbnRzID0gW1tyZWN0LmxlZnQsIGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8gcmVjdC5ib3R0b20gLSBidWZmZXIgOiBpc0Zsb2F0aW5nV2lkZXIgPyByZWN0LmJvdHRvbSAtIGJ1ZmZlciA6IHJlY3QudG9wXSwgW3JlY3QucmlnaHQsIGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8gaXNGbG9hdGluZ1dpZGVyID8gcmVjdC5ib3R0b20gLSBidWZmZXIgOiByZWN0LnRvcCA6IHJlY3QuYm90dG9tIC0gYnVmZmVyXV07XG4gICAgICAgICAgICAgIHJldHVybiBbY3Vyc29yUG9pbnRPbmUsIGN1cnNvclBvaW50VHdvLCAuLi5jb21tb25Qb2ludHNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50T25lID0gW2lzRmxvYXRpbmdXaWRlciA/IHggKyBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyB4ICsgYnVmZmVyICogNCA6IHggLSBidWZmZXIgKiA0LCB5IC0gYnVmZmVyXTtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRUd28gPSBbaXNGbG9hdGluZ1dpZGVyID8geCAtIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHggKyBidWZmZXIgKiA0IDogeCAtIGJ1ZmZlciAqIDQsIHkgLSBidWZmZXJdO1xuICAgICAgICAgICAgICBjb25zdCBjb21tb25Qb2ludHMgPSBbW3JlY3QubGVmdCwgY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyByZWN0LnRvcCArIGJ1ZmZlciA6IGlzRmxvYXRpbmdXaWRlciA/IHJlY3QudG9wICsgYnVmZmVyIDogcmVjdC5ib3R0b21dLCBbcmVjdC5yaWdodCwgY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyBpc0Zsb2F0aW5nV2lkZXIgPyByZWN0LnRvcCArIGJ1ZmZlciA6IHJlY3QuYm90dG9tIDogcmVjdC50b3AgKyBidWZmZXJdXTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtjdXJzb3JQb2ludE9uZSwgY3Vyc29yUG9pbnRUd28sIC4uLmNvbW1vblBvaW50c107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50T25lID0gW3ggKyBidWZmZXIgKyAxLCBpc0Zsb2F0aW5nVGFsbGVyID8geSArIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyB5ICsgYnVmZmVyICogNCA6IHkgLSBidWZmZXIgKiA0XTtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRUd28gPSBbeCArIGJ1ZmZlciArIDEsIGlzRmxvYXRpbmdUYWxsZXIgPyB5IC0gYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHkgKyBidWZmZXIgKiA0IDogeSAtIGJ1ZmZlciAqIDRdO1xuICAgICAgICAgICAgICBjb25zdCBjb21tb25Qb2ludHMgPSBbW2N1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHJlY3QucmlnaHQgLSBidWZmZXIgOiBpc0Zsb2F0aW5nVGFsbGVyID8gcmVjdC5yaWdodCAtIGJ1ZmZlciA6IHJlY3QubGVmdCwgcmVjdC50b3BdLCBbY3Vyc29yTGVhdmVGcm9tQm90dG9tID8gaXNGbG9hdGluZ1RhbGxlciA/IHJlY3QucmlnaHQgLSBidWZmZXIgOiByZWN0LmxlZnQgOiByZWN0LnJpZ2h0IC0gYnVmZmVyLCByZWN0LmJvdHRvbV1dO1xuICAgICAgICAgICAgICByZXR1cm4gWy4uLmNvbW1vblBvaW50cywgY3Vyc29yUG9pbnRPbmUsIGN1cnNvclBvaW50VHdvXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50T25lID0gW3ggLSBidWZmZXIsIGlzRmxvYXRpbmdUYWxsZXIgPyB5ICsgYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHkgKyBidWZmZXIgKiA0IDogeSAtIGJ1ZmZlciAqIDRdO1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludFR3byA9IFt4IC0gYnVmZmVyLCBpc0Zsb2F0aW5nVGFsbGVyID8geSAtIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyB5ICsgYnVmZmVyICogNCA6IHkgLSBidWZmZXIgKiA0XTtcbiAgICAgICAgICAgICAgY29uc3QgY29tbW9uUG9pbnRzID0gW1tjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyByZWN0LmxlZnQgKyBidWZmZXIgOiBpc0Zsb2F0aW5nVGFsbGVyID8gcmVjdC5sZWZ0ICsgYnVmZmVyIDogcmVjdC5yaWdodCwgcmVjdC50b3BdLCBbY3Vyc29yTGVhdmVGcm9tQm90dG9tID8gaXNGbG9hdGluZ1RhbGxlciA/IHJlY3QubGVmdCArIGJ1ZmZlciA6IHJlY3QucmlnaHQgOiByZWN0LmxlZnQgKyBidWZmZXIsIHJlY3QuYm90dG9tXV07XG4gICAgICAgICAgICAgIHJldHVybiBbY3Vyc29yUG9pbnRPbmUsIGN1cnNvclBvaW50VHdvLCAuLi5jb21tb25Qb2ludHNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNQb2ludEluUG9seWdvbihbY2xpZW50WCwgY2xpZW50WV0sIHJlY3RQb2x5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaGFzTGFuZGVkICYmICFpc092ZXJSZWZlcmVuY2VSZWN0KSB7XG4gICAgICAgIHJldHVybiBjbG9zZSgpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0xlYXZlICYmIHJlcXVpcmVJbnRlbnQpIHtcbiAgICAgICAgY29uc3QgY3Vyc29yU3BlZWQgPSBnZXRDdXJzb3JTcGVlZChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgICAgY29uc3QgY3Vyc29yU3BlZWRUaHJlc2hvbGQgPSAwLjE7XG4gICAgICAgIGlmIChjdXJzb3JTcGVlZCAhPT0gbnVsbCAmJiBjdXJzb3JTcGVlZCA8IGN1cnNvclNwZWVkVGhyZXNob2xkKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNQb2ludEluUG9seWdvbihbY2xpZW50WCwgY2xpZW50WV0sIGdldFBvbHlnb24oW3gsIHldKSkpIHtcbiAgICAgICAgY2xvc2UoKTtcbiAgICAgIH0gZWxzZSBpZiAoIWhhc0xhbmRlZCAmJiByZXF1aXJlSW50ZW50KSB7XG4gICAgICAgIHRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KGNsb3NlLCA0MCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgZm4uX19vcHRpb25zID0ge1xuICAgIGJsb2NrUG9pbnRlckV2ZW50c1xuICB9O1xuICByZXR1cm4gZm47XG59XG5cbmV4cG9ydCB7IENvbXBvc2l0ZSwgQ29tcG9zaXRlSXRlbSwgRmxvYXRpbmdBcnJvdywgRmxvYXRpbmdEZWxheUdyb3VwLCBGbG9hdGluZ0ZvY3VzTWFuYWdlciwgRmxvYXRpbmdMaXN0LCBGbG9hdGluZ05vZGUsIEZsb2F0aW5nT3ZlcmxheSwgRmxvYXRpbmdQb3J0YWwsIEZsb2F0aW5nVHJlZSwgaW5uZXIsIHNhZmVQb2x5Z29uLCB1c2VDbGljaywgdXNlQ2xpZW50UG9pbnQsIHVzZURlbGF5R3JvdXAsIHVzZURlbGF5R3JvdXBDb250ZXh0LCB1c2VEaXNtaXNzLCB1c2VGbG9hdGluZywgdXNlRmxvYXRpbmdOb2RlSWQsIHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkLCB1c2VGbG9hdGluZ1BvcnRhbE5vZGUsIHVzZUZsb2F0aW5nUm9vdENvbnRleHQsIHVzZUZsb2F0aW5nVHJlZSwgdXNlRm9jdXMsIHVzZUhvdmVyLCB1c2VJZCwgdXNlSW5uZXJPZmZzZXQsIHVzZUludGVyYWN0aW9ucywgdXNlTGlzdEl0ZW0sIHVzZUxpc3ROYXZpZ2F0aW9uLCB1c2VNZXJnZVJlZnMsIHVzZVJvbGUsIHVzZVRyYW5zaXRpb25TdGF0dXMsIHVzZVRyYW5zaXRpb25TdHlsZXMsIHVzZVR5cGVhaGVhZCB9O1xuIiwiLyogdHNsaW50OmRpc2FibGUgbWF4LWNsYXNzZXMtcGVyLWZpbGUgKi9cbmltcG9ydCB7IGRlY29tcHJlc3NKc29uLCBwYWRTdGFydCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEFsbEVuY29kaW5nc0NvbXByZXNzZWQgZnJvbSAnLi9hbGwtZW5jb2RpbmdzLmNvbXByZXNzZWQuanNvbic7XG52YXIgZGVjb21wcmVzc2VkRW5jb2RpbmdzID0gZGVjb21wcmVzc0pzb24oQWxsRW5jb2RpbmdzQ29tcHJlc3NlZCk7XG52YXIgYWxsVW5pY29kZU1hcHBpbmdzID0gSlNPTi5wYXJzZShkZWNvbXByZXNzZWRFbmNvZGluZ3MpO1xudmFyIEVuY29kaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEVuY29kaW5nKG5hbWUsIHVuaWNvZGVNYXBwaW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmNhbkVuY29kZVVuaWNvZGVDb2RlUG9pbnQgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY29kZVBvaW50IGluIF90aGlzLnVuaWNvZGVNYXBwaW5ncztcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbmNvZGVVbmljb2RlQ29kZVBvaW50ID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgICAgICAgICAgdmFyIG1hcHBlZCA9IF90aGlzLnVuaWNvZGVNYXBwaW5nc1tjb2RlUG9pbnRdO1xuICAgICAgICAgICAgaWYgKCFtYXBwZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuICAgICAgICAgICAgICAgIHZhciBoZXhDb2RlID0gXCIweFwiICsgcGFkU3RhcnQoY29kZVBvaW50LnRvU3RyaW5nKDE2KSwgNCwgJzAnKTtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gX3RoaXMubmFtZSArIFwiIGNhbm5vdCBlbmNvZGUgXFxcIlwiICsgc3RyICsgXCJcXFwiIChcIiArIGhleENvZGUgKyBcIilcIjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGNvZGU6IG1hcHBlZFswXSwgbmFtZTogbWFwcGVkWzFdIH07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc3VwcG9ydGVkQ29kZVBvaW50cyA9IE9iamVjdC5rZXlzKHVuaWNvZGVNYXBwaW5ncylcbiAgICAgICAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgICAgICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9KTtcbiAgICAgICAgdGhpcy51bmljb2RlTWFwcGluZ3MgPSB1bmljb2RlTWFwcGluZ3M7XG4gICAgfVxuICAgIHJldHVybiBFbmNvZGluZztcbn0oKSk7XG5leHBvcnQgdmFyIEVuY29kaW5ncyA9IHtcbiAgICBTeW1ib2w6IG5ldyBFbmNvZGluZygnU3ltYm9sJywgYWxsVW5pY29kZU1hcHBpbmdzLnN5bWJvbCksXG4gICAgWmFwZkRpbmdiYXRzOiBuZXcgRW5jb2RpbmcoJ1phcGZEaW5nYmF0cycsIGFsbFVuaWNvZGVNYXBwaW5ncy56YXBmZGluZ2JhdHMpLFxuICAgIFdpbkFuc2k6IG5ldyBFbmNvZGluZygnV2luQW5zaScsIGFsbFVuaWNvZGVNYXBwaW5ncy53aW4xMjUyKSxcbn07XG4iLCJpbXBvcnQgeyBkZWNvbXByZXNzSnNvbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IENvdXJpZXJCb2xkQ29tcHJlc3NlZCBmcm9tICcuL0NvdXJpZXItQm9sZC5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IENvdXJpZXJCb2xkT2JsaXF1ZUNvbXByZXNzZWQgZnJvbSAnLi9Db3VyaWVyLUJvbGRPYmxpcXVlLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgQ291cmllck9ibGlxdWVDb21wcmVzc2VkIGZyb20gJy4vQ291cmllci1PYmxpcXVlLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgQ291cmllckNvbXByZXNzZWQgZnJvbSAnLi9Db3VyaWVyLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgSGVsdmV0aWNhQm9sZENvbXByZXNzZWQgZnJvbSAnLi9IZWx2ZXRpY2EtQm9sZC5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IEhlbHZldGljYUJvbGRPYmxpcXVlQ29tcHJlc3NlZCBmcm9tICcuL0hlbHZldGljYS1Cb2xkT2JsaXF1ZS5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IEhlbHZldGljYU9ibGlxdWVDb21wcmVzc2VkIGZyb20gJy4vSGVsdmV0aWNhLU9ibGlxdWUuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBIZWx2ZXRpY2FDb21wcmVzc2VkIGZyb20gJy4vSGVsdmV0aWNhLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgVGltZXNCb2xkQ29tcHJlc3NlZCBmcm9tICcuL1RpbWVzLUJvbGQuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBUaW1lc0JvbGRJdGFsaWNDb21wcmVzc2VkIGZyb20gJy4vVGltZXMtQm9sZEl0YWxpYy5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IFRpbWVzSXRhbGljQ29tcHJlc3NlZCBmcm9tICcuL1RpbWVzLUl0YWxpYy5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IFRpbWVzUm9tYW5Db21wcmVzc2VkIGZyb20gJy4vVGltZXMtUm9tYW4uY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBTeW1ib2xDb21wcmVzc2VkIGZyb20gJy4vU3ltYm9sLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgWmFwZkRpbmdiYXRzQ29tcHJlc3NlZCBmcm9tICcuL1phcGZEaW5nYmF0cy5jb21wcmVzc2VkLmpzb24nO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgY29tcHJlc3NlZEpzb25Gb3JGb250TmFtZSA9IHtcbiAgICAnQ291cmllcic6IENvdXJpZXJDb21wcmVzc2VkLFxuICAgICdDb3VyaWVyLUJvbGQnOiBDb3VyaWVyQm9sZENvbXByZXNzZWQsXG4gICAgJ0NvdXJpZXItT2JsaXF1ZSc6IENvdXJpZXJPYmxpcXVlQ29tcHJlc3NlZCxcbiAgICAnQ291cmllci1Cb2xkT2JsaXF1ZSc6IENvdXJpZXJCb2xkT2JsaXF1ZUNvbXByZXNzZWQsXG4gICAgJ0hlbHZldGljYSc6IEhlbHZldGljYUNvbXByZXNzZWQsXG4gICAgJ0hlbHZldGljYS1Cb2xkJzogSGVsdmV0aWNhQm9sZENvbXByZXNzZWQsXG4gICAgJ0hlbHZldGljYS1PYmxpcXVlJzogSGVsdmV0aWNhT2JsaXF1ZUNvbXByZXNzZWQsXG4gICAgJ0hlbHZldGljYS1Cb2xkT2JsaXF1ZSc6IEhlbHZldGljYUJvbGRPYmxpcXVlQ29tcHJlc3NlZCxcbiAgICAnVGltZXMtUm9tYW4nOiBUaW1lc1JvbWFuQ29tcHJlc3NlZCxcbiAgICAnVGltZXMtQm9sZCc6IFRpbWVzQm9sZENvbXByZXNzZWQsXG4gICAgJ1RpbWVzLUl0YWxpYyc6IFRpbWVzSXRhbGljQ29tcHJlc3NlZCxcbiAgICAnVGltZXMtQm9sZEl0YWxpYyc6IFRpbWVzQm9sZEl0YWxpY0NvbXByZXNzZWQsXG4gICAgJ1N5bWJvbCc6IFN5bWJvbENvbXByZXNzZWQsXG4gICAgJ1phcGZEaW5nYmF0cyc6IFphcGZEaW5nYmF0c0NvbXByZXNzZWQsXG59O1xuZXhwb3J0IHZhciBGb250TmFtZXM7XG4oZnVuY3Rpb24gKEZvbnROYW1lcykge1xuICAgIEZvbnROYW1lc1tcIkNvdXJpZXJcIl0gPSBcIkNvdXJpZXJcIjtcbiAgICBGb250TmFtZXNbXCJDb3VyaWVyQm9sZFwiXSA9IFwiQ291cmllci1Cb2xkXCI7XG4gICAgRm9udE5hbWVzW1wiQ291cmllck9ibGlxdWVcIl0gPSBcIkNvdXJpZXItT2JsaXF1ZVwiO1xuICAgIEZvbnROYW1lc1tcIkNvdXJpZXJCb2xkT2JsaXF1ZVwiXSA9IFwiQ291cmllci1Cb2xkT2JsaXF1ZVwiO1xuICAgIEZvbnROYW1lc1tcIkhlbHZldGljYVwiXSA9IFwiSGVsdmV0aWNhXCI7XG4gICAgRm9udE5hbWVzW1wiSGVsdmV0aWNhQm9sZFwiXSA9IFwiSGVsdmV0aWNhLUJvbGRcIjtcbiAgICBGb250TmFtZXNbXCJIZWx2ZXRpY2FPYmxpcXVlXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICAgIEZvbnROYW1lc1tcIkhlbHZldGljYUJvbGRPYmxpcXVlXCJdID0gXCJIZWx2ZXRpY2EtQm9sZE9ibGlxdWVcIjtcbiAgICBGb250TmFtZXNbXCJUaW1lc1JvbWFuXCJdID0gXCJUaW1lcy1Sb21hblwiO1xuICAgIEZvbnROYW1lc1tcIlRpbWVzUm9tYW5Cb2xkXCJdID0gXCJUaW1lcy1Cb2xkXCI7XG4gICAgRm9udE5hbWVzW1wiVGltZXNSb21hbkl0YWxpY1wiXSA9IFwiVGltZXMtSXRhbGljXCI7XG4gICAgRm9udE5hbWVzW1wiVGltZXNSb21hbkJvbGRJdGFsaWNcIl0gPSBcIlRpbWVzLUJvbGRJdGFsaWNcIjtcbiAgICBGb250TmFtZXNbXCJTeW1ib2xcIl0gPSBcIlN5bWJvbFwiO1xuICAgIEZvbnROYW1lc1tcIlphcGZEaW5nYmF0c1wiXSA9IFwiWmFwZkRpbmdiYXRzXCI7XG59KShGb250TmFtZXMgfHwgKEZvbnROYW1lcyA9IHt9KSk7XG52YXIgZm9udENhY2hlID0ge307XG52YXIgRm9udCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGb250KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmdldFdpZHRoT2ZHbHlwaCA9IGZ1bmN0aW9uIChnbHlwaE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DaGFyV2lkdGhzW2dseXBoTmFtZV07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0WEF4aXNLZXJuaW5nRm9yUGFpciA9IGZ1bmN0aW9uIChsZWZ0R2x5cGhOYW1lLCByaWdodEdseXBoTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIChfdGhpcy5LZXJuUGFpclhBbW91bnRzW2xlZnRHbHlwaE5hbWVdIHx8IHt9KVtyaWdodEdseXBoTmFtZV07XG4gICAgICAgIH07XG4gICAgfVxuICAgIEZvbnQubG9hZCA9IGZ1bmN0aW9uIChmb250TmFtZSkge1xuICAgICAgICB2YXIgY2FjaGVkRm9udCA9IGZvbnRDYWNoZVtmb250TmFtZV07XG4gICAgICAgIGlmIChjYWNoZWRGb250KVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEZvbnQ7XG4gICAgICAgIHZhciBqc29uID0gZGVjb21wcmVzc0pzb24oY29tcHJlc3NlZEpzb25Gb3JGb250TmFtZVtmb250TmFtZV0pO1xuICAgICAgICB2YXIgZm9udCA9IE9iamVjdC5hc3NpZ24obmV3IEZvbnQoKSwgSlNPTi5wYXJzZShqc29uKSk7XG4gICAgICAgIGZvbnQuQ2hhcldpZHRocyA9IGZvbnQuQ2hhck1ldHJpY3MucmVkdWNlKGZ1bmN0aW9uIChhY2MsIG1ldHJpYykge1xuICAgICAgICAgICAgYWNjW21ldHJpYy5OXSA9IG1ldHJpYy5XWDtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgZm9udC5LZXJuUGFpclhBbW91bnRzID0gZm9udC5LZXJuUGFpcnMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIF9hKSB7XG4gICAgICAgICAgICB2YXIgbmFtZTEgPSBfYVswXSwgbmFtZTIgPSBfYVsxXSwgd2lkdGggPSBfYVsyXTtcbiAgICAgICAgICAgIGlmICghYWNjW25hbWUxXSlcbiAgICAgICAgICAgICAgICBhY2NbbmFtZTFdID0ge307XG4gICAgICAgICAgICBhY2NbbmFtZTFdW25hbWUyXSA9IHdpZHRoO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuICAgICAgICBmb250Q2FjaGVbZm9udE5hbWVdID0gZm9udDtcbiAgICAgICAgcmV0dXJuIGZvbnQ7XG4gICAgfTtcbiAgICByZXR1cm4gRm9udDtcbn0oKSk7XG5leHBvcnQgeyBGb250IH07XG4iLCJleHBvcnQgKiBmcm9tICcuL0ZvbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9FbmNvZGluZyc7XG4iLCIvKlxuICogVGhlIGBjaGFyc2AsIGBsb29rdXBgLCBhbmQgYGRlY29kZUZyb21CYXNlNjRgIG1lbWJlcnMgb2YgdGhpcyBmaWxlIGFyZVxuICogbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgICAgYmFzZTY0LWFycmF5YnVmZmVyXG4gKiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlclxuICpcbiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTIgTmlrbGFzIHZvbiBIZXJ0emVuXG4gKiAgICAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqL1xuaW1wb3J0IHBha28gZnJvbSAncGFrbyc7XG52YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG4vLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguXG52YXIgbG9va3VwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpO1xufVxuZXhwb3J0IHZhciBkZWNvZGVGcm9tQmFzZTY0ID0gZnVuY3Rpb24gKGJhc2U2NCkge1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBiYXNlNjQubGVuZ3RoICogMC43NTtcbiAgICB2YXIgbGVuID0gYmFzZTY0Lmxlbmd0aDtcbiAgICB2YXIgaTtcbiAgICB2YXIgcCA9IDA7XG4gICAgdmFyIGVuY29kZWQxO1xuICAgIHZhciBlbmNvZGVkMjtcbiAgICB2YXIgZW5jb2RlZDM7XG4gICAgdmFyIGVuY29kZWQ0O1xuICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlckxlbmd0aCk7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgICAgIGVuY29kZWQxID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkpXTtcbiAgICAgICAgZW5jb2RlZDIgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDEpXTtcbiAgICAgICAgZW5jb2RlZDMgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDIpXTtcbiAgICAgICAgZW5jb2RlZDQgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDMpXTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMSA8PCAyKSB8IChlbmNvZGVkMiA+PiA0KTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDIgJiAxNSkgPDwgNCkgfCAoZW5jb2RlZDMgPj4gMik7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQzICYgMykgPDwgNikgfCAoZW5jb2RlZDQgJiA2Myk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn07XG52YXIgYXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn07XG5leHBvcnQgdmFyIGRlY29tcHJlc3NKc29uID0gZnVuY3Rpb24gKGNvbXByZXNzZWRKc29uKSB7XG4gICAgcmV0dXJuIGFycmF5VG9TdHJpbmcocGFrby5pbmZsYXRlKGRlY29kZUZyb21CYXNlNjQoY29tcHJlc3NlZEpzb24pKSk7XG59O1xuZXhwb3J0IHZhciBwYWRTdGFydCA9IGZ1bmN0aW9uICh2YWx1ZSwgbGVuZ3RoLCBwYWRDaGFyKSB7XG4gICAgdmFyIHBhZGRpbmcgPSAnJztcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsZW5ndGggLSB2YWx1ZS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgcGFkZGluZyArPSBwYWRDaGFyO1xuICAgIH1cbiAgICByZXR1cm4gcGFkZGluZyArIHZhbHVlO1xufTtcbiIsImltcG9ydCBwYWtvIGZyb20gJ3Bha28nO1xuXG52YXIgVVBORyA9IHt9O1xuXG5cdFxuXG5VUE5HLnRvUkdCQTggPSBmdW5jdGlvbihvdXQpXG57XG5cdHZhciB3ID0gb3V0LndpZHRoLCBoID0gb3V0LmhlaWdodDtcblx0aWYob3V0LnRhYnMuYWNUTD09bnVsbCkgcmV0dXJuIFtVUE5HLnRvUkdCQTguZGVjb2RlSW1hZ2Uob3V0LmRhdGEsIHcsIGgsIG91dCkuYnVmZmVyXTtcblx0XG5cdHZhciBmcm1zID0gW107XG5cdGlmKG91dC5mcmFtZXNbMF0uZGF0YT09bnVsbCkgb3V0LmZyYW1lc1swXS5kYXRhID0gb3V0LmRhdGE7XG5cdFxuXHR2YXIgbGVuID0gdypoKjQsIGltZyA9IG5ldyBVaW50OEFycmF5KGxlbiksIGVtcHR5ID0gbmV3IFVpbnQ4QXJyYXkobGVuKSwgcHJldj1uZXcgVWludDhBcnJheShsZW4pO1xuXHRmb3IodmFyIGk9MDsgaTxvdXQuZnJhbWVzLmxlbmd0aDsgaSsrKVxuXHR7XG5cdFx0dmFyIGZybSA9IG91dC5mcmFtZXNbaV07XG5cdFx0dmFyIGZ4PWZybS5yZWN0LngsIGZ5PWZybS5yZWN0LnksIGZ3ID0gZnJtLnJlY3Qud2lkdGgsIGZoID0gZnJtLnJlY3QuaGVpZ2h0O1xuXHRcdHZhciBmZGF0YSA9IFVQTkcudG9SR0JBOC5kZWNvZGVJbWFnZShmcm0uZGF0YSwgZncsZmgsIG91dCk7XG5cdFx0XG5cdFx0aWYoaSE9MCkgZm9yKHZhciBqPTA7IGo8bGVuOyBqKyspIHByZXZbal09aW1nW2pdO1xuXHRcdFxuXHRcdGlmICAgICAoZnJtLmJsZW5kPT0wKSBVUE5HLl9jb3B5VGlsZShmZGF0YSwgZncsIGZoLCBpbWcsIHcsIGgsIGZ4LCBmeSwgMCk7XG5cdFx0ZWxzZSBpZihmcm0uYmxlbmQ9PTEpIFVQTkcuX2NvcHlUaWxlKGZkYXRhLCBmdywgZmgsIGltZywgdywgaCwgZngsIGZ5LCAxKTtcblx0XHRcblx0XHRmcm1zLnB1c2goaW1nLmJ1ZmZlci5zbGljZSgwKSk7XG5cdFx0XG5cdFx0aWYgICAgIChmcm0uZGlzcG9zZT09MCkge31cblx0XHRlbHNlIGlmKGZybS5kaXNwb3NlPT0xKSBVUE5HLl9jb3B5VGlsZShlbXB0eSwgZncsIGZoLCBpbWcsIHcsIGgsIGZ4LCBmeSwgMCk7XG5cdFx0ZWxzZSBpZihmcm0uZGlzcG9zZT09MikgZm9yKHZhciBqPTA7IGo8bGVuOyBqKyspIGltZ1tqXT1wcmV2W2pdO1xuXHR9XG5cdHJldHVybiBmcm1zO1xufVxuVVBORy50b1JHQkE4LmRlY29kZUltYWdlID0gZnVuY3Rpb24oZGF0YSwgdywgaCwgb3V0KVxue1xuXHR2YXIgYXJlYSA9IHcqaCwgYnBwID0gVVBORy5kZWNvZGUuX2dldEJQUChvdXQpO1xuXHR2YXIgYnBsID0gTWF0aC5jZWlsKHcqYnBwLzgpO1x0Ly8gYnl0ZXMgcGVyIGxpbmVcblxuXHR2YXIgYmYgPSBuZXcgVWludDhBcnJheShhcmVhKjQpLCBiZjMyID0gbmV3IFVpbnQzMkFycmF5KGJmLmJ1ZmZlcik7XG5cdHZhciBjdHlwZSA9IG91dC5jdHlwZSwgZGVwdGggPSBvdXQuZGVwdGg7XG5cdHZhciBycyA9IFVQTkcuX2Jpbi5yZWFkVXNob3J0O1xuXHRcblx0Ly9jb25zb2xlLmxvZyhjdHlwZSwgZGVwdGgpO1xuXHR2YXIgdGltZSA9IERhdGUubm93KCk7XG5cblx0aWYgICAgIChjdHlwZT09NikgeyAvLyBSR0IgKyBhbHBoYVxuXHRcdHZhciBxYXJlYSA9IGFyZWE8PDI7XG5cdFx0aWYoZGVwdGg9PSA4KSBmb3IodmFyIGk9MDsgaTxxYXJlYTtpKz00KSB7ICBiZltpXSA9IGRhdGFbaV07ICBiZltpKzFdID0gZGF0YVtpKzFdOyAgYmZbaSsyXSA9IGRhdGFbaSsyXTsgIGJmW2krM10gPSBkYXRhW2krM107IH1cblx0XHRpZihkZXB0aD09MTYpIGZvcih2YXIgaT0wOyBpPHFhcmVhO2krKyApIHsgIGJmW2ldID0gZGF0YVtpPDwxXTsgIH1cblx0fVxuXHRlbHNlIGlmKGN0eXBlPT0yKSB7XHQvLyBSR0Jcblx0XHR2YXIgdHM9b3V0LnRhYnNbXCJ0Uk5TXCJdO1xuXHRcdGlmKHRzPT1udWxsKSB7XG5cdFx0XHRpZihkZXB0aD09IDgpIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHRpPWkqMzsgIGJmMzJbaV0gPSAoMjU1PDwyNCl8KGRhdGFbdGkrMl08PDE2KXwoZGF0YVt0aSsxXTw8OCl8ZGF0YVt0aV07ICB9XG5cdFx0XHRpZihkZXB0aD09MTYpIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHRpPWkqNjsgIGJmMzJbaV0gPSAoMjU1PDwyNCl8KGRhdGFbdGkrNF08PDE2KXwoZGF0YVt0aSsyXTw8OCl8ZGF0YVt0aV07ICB9XG5cdFx0fVxuXHRcdGVsc2UgeyAgdmFyIHRyPXRzWzBdLCB0Zz10c1sxXSwgdGI9dHNbMl07XG5cdFx0XHRpZihkZXB0aD09IDgpIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHFpPWk8PDIsIHRpPWkqMzsgIGJmMzJbaV0gPSAoMjU1PDwyNCl8KGRhdGFbdGkrMl08PDE2KXwoZGF0YVt0aSsxXTw8OCl8ZGF0YVt0aV07XG5cdFx0XHRcdGlmKGRhdGFbdGldICAgPT10ciAmJiBkYXRhW3RpKzFdICAgPT10ZyAmJiBkYXRhW3RpKzJdICAgPT10YikgYmZbcWkrM10gPSAwOyAgfVxuXHRcdFx0aWYoZGVwdGg9PTE2KSBmb3IodmFyIGk9MDsgaTxhcmVhOyBpKyspIHsgIHZhciBxaT1pPDwyLCB0aT1pKjY7ICBiZjMyW2ldID0gKDI1NTw8MjQpfChkYXRhW3RpKzRdPDwxNil8KGRhdGFbdGkrMl08PDgpfGRhdGFbdGldO1xuXHRcdFx0XHRpZihycyhkYXRhLHRpKT09dHIgJiYgcnMoZGF0YSx0aSsyKT09dGcgJiYgcnMoZGF0YSx0aSs0KT09dGIpIGJmW3FpKzNdID0gMDsgIH1cblx0XHR9XG5cdH1cblx0ZWxzZSBpZihjdHlwZT09Mykge1x0Ly8gcGFsZXR0ZVxuXHRcdHZhciBwPW91dC50YWJzW1wiUExURVwiXSwgYXA9b3V0LnRhYnNbXCJ0Uk5TXCJdLCB0bD1hcD9hcC5sZW5ndGg6MDtcblx0XHQvL2NvbnNvbGUubG9nKHAsIGFwKTtcblx0XHRpZihkZXB0aD09MSkgZm9yKHZhciB5PTA7IHk8aDsgeSsrKSB7ICB2YXIgczAgPSB5KmJwbCwgdDAgPSB5Knc7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTx3OyBpKyspIHsgdmFyIHFpPSh0MCtpKTw8Miwgaj0oKGRhdGFbczArKGk+PjMpXT4+KDctKChpJjcpPDwwKSkpJiAxKSwgY2o9MypqOyAgYmZbcWldPXBbY2pdOyAgYmZbcWkrMV09cFtjaisxXTsgIGJmW3FpKzJdPXBbY2orMl07ICBiZltxaSszXT0oajx0bCk/YXBbal06MjU1OyAgfVxuXHRcdH1cblx0XHRpZihkZXB0aD09MikgZm9yKHZhciB5PTA7IHk8aDsgeSsrKSB7ICB2YXIgczAgPSB5KmJwbCwgdDAgPSB5Knc7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTx3OyBpKyspIHsgdmFyIHFpPSh0MCtpKTw8Miwgaj0oKGRhdGFbczArKGk+PjIpXT4+KDYtKChpJjMpPDwxKSkpJiAzKSwgY2o9MypqOyAgYmZbcWldPXBbY2pdOyAgYmZbcWkrMV09cFtjaisxXTsgIGJmW3FpKzJdPXBbY2orMl07ICBiZltxaSszXT0oajx0bCk/YXBbal06MjU1OyAgfVxuXHRcdH1cblx0XHRpZihkZXB0aD09NCkgZm9yKHZhciB5PTA7IHk8aDsgeSsrKSB7ICB2YXIgczAgPSB5KmJwbCwgdDAgPSB5Knc7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTx3OyBpKyspIHsgdmFyIHFpPSh0MCtpKTw8Miwgaj0oKGRhdGFbczArKGk+PjEpXT4+KDQtKChpJjEpPDwyKSkpJjE1KSwgY2o9MypqOyAgYmZbcWldPXBbY2pdOyAgYmZbcWkrMV09cFtjaisxXTsgIGJmW3FpKzJdPXBbY2orMl07ICBiZltxaSszXT0oajx0bCk/YXBbal06MjU1OyAgfVxuXHRcdH1cblx0XHRpZihkZXB0aD09OCkgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrICkgeyAgdmFyIHFpPWk8PDIsIGo9ZGF0YVtpXSAgICAgICAgICAgICAgICAgICAgICAsIGNqPTMqajsgIGJmW3FpXT1wW2NqXTsgIGJmW3FpKzFdPXBbY2orMV07ICBiZltxaSsyXT1wW2NqKzJdOyAgYmZbcWkrM109KGo8dGwpP2FwW2pdOjI1NTsgIH1cblx0fVxuXHRlbHNlIGlmKGN0eXBlPT00KSB7XHQvLyBncmF5ICsgYWxwaGFcblx0XHRpZihkZXB0aD09IDgpICBmb3IodmFyIGk9MDsgaTxhcmVhOyBpKyspIHsgIHZhciBxaT1pPDwyLCBkaT1pPDwxLCBncj1kYXRhW2RpXTsgIGJmW3FpXT1ncjsgIGJmW3FpKzFdPWdyOyAgYmZbcWkrMl09Z3I7ICBiZltxaSszXT1kYXRhW2RpKzFdOyAgfVxuXHRcdGlmKGRlcHRoPT0xNikgIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHFpPWk8PDIsIGRpPWk8PDIsIGdyPWRhdGFbZGldOyAgYmZbcWldPWdyOyAgYmZbcWkrMV09Z3I7ICBiZltxaSsyXT1ncjsgIGJmW3FpKzNdPWRhdGFbZGkrMl07ICB9XG5cdH1cblx0ZWxzZSBpZihjdHlwZT09MCkge1x0Ly8gZ3JheVxuXHRcdHZhciB0ciA9IG91dC50YWJzW1widFJOU1wiXSA/IG91dC50YWJzW1widFJOU1wiXSA6IC0xO1xuXHRcdGZvcih2YXIgeT0wOyB5PGg7IHkrKykge1xuXHRcdFx0dmFyIG9mZiA9IHkqYnBsLCB0byA9IHkqdztcblx0XHRcdGlmICAgICAoZGVwdGg9PSAxKSBmb3IodmFyIHg9MDsgeDx3OyB4KyspIHsgIHZhciBncj0yNTUqKChkYXRhW29mZisoeD4+PjMpXT4+Pig3IC0oKHgmNykgICApKSkmIDEpLCBhbD0oZ3I9PXRyKjI1NSk/MDoyNTU7ICBiZjMyW3RvK3hdPShhbDw8MjQpfChncjw8MTYpfChncjw8OCl8Z3I7ICB9XG5cdFx0XHRlbHNlIGlmKGRlcHRoPT0gMikgZm9yKHZhciB4PTA7IHg8dzsgeCsrKSB7ICB2YXIgZ3I9IDg1KigoZGF0YVtvZmYrKHg+Pj4yKV0+Pj4oNiAtKCh4JjMpPDwxKSkpJiAzKSwgYWw9KGdyPT10ciogODUpPzA6MjU1OyAgYmYzMlt0byt4XT0oYWw8PDI0KXwoZ3I8PDE2KXwoZ3I8PDgpfGdyOyAgfVxuXHRcdFx0ZWxzZSBpZihkZXB0aD09IDQpIGZvcih2YXIgeD0wOyB4PHc7IHgrKykgeyAgdmFyIGdyPSAxNyooKGRhdGFbb2ZmKyh4Pj4+MSldPj4+KDQgLSgoeCYxKTw8MikpKSYxNSksIGFsPShncj09dHIqIDE3KT8wOjI1NTsgIGJmMzJbdG8reF09KGFsPDwyNCl8KGdyPDwxNil8KGdyPDw4KXxncjsgIH1cblx0XHRcdGVsc2UgaWYoZGVwdGg9PSA4KSBmb3IodmFyIHg9MDsgeDx3OyB4KyspIHsgIHZhciBncj1kYXRhW29mZisgICAgIHhdLCBhbD0oZ3IgICAgICAgICAgICAgICAgID09dHIpPzA6MjU1OyAgYmYzMlt0byt4XT0oYWw8PDI0KXwoZ3I8PDE2KXwoZ3I8PDgpfGdyOyAgfVxuXHRcdFx0ZWxzZSBpZihkZXB0aD09MTYpIGZvcih2YXIgeD0wOyB4PHc7IHgrKykgeyAgdmFyIGdyPWRhdGFbb2ZmKyh4PDwxKV0sIGFsPShycyhkYXRhLG9mZisoeDw8aSkpPT10cik/MDoyNTU7ICBiZjMyW3RvK3hdPShhbDw8MjQpfChncjw8MTYpfChncjw8OCl8Z3I7ICB9XG5cdFx0fVxuXHR9XG5cdC8vY29uc29sZS5sb2coRGF0ZS5ub3coKS10aW1lKTtcblx0cmV0dXJuIGJmO1xufVxuXG5cblxuVVBORy5kZWNvZGUgPSBmdW5jdGlvbihidWZmKVxue1xuXHR2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGJ1ZmYpLCBvZmZzZXQgPSA4LCBiaW4gPSBVUE5HLl9iaW4sIHJVcyA9IGJpbi5yZWFkVXNob3J0LCByVWkgPSBiaW4ucmVhZFVpbnQ7XG5cdHZhciBvdXQgPSB7dGFiczp7fSwgZnJhbWVzOltdfTtcblx0dmFyIGRkID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpLCBkb2ZmID0gMDtcdCAvLyBwdXQgYWxsIElEQVQgZGF0YSBpbnRvIGl0XG5cdHZhciBmZCwgZm9mZiA9IDA7XHQvLyBmcmFtZXNcblx0XG5cdHZhciBtZ2NrID0gWzB4ODksIDB4NTAsIDB4NGUsIDB4NDcsIDB4MGQsIDB4MGEsIDB4MWEsIDB4MGFdO1xuXHRmb3IodmFyIGk9MDsgaTw4OyBpKyspIGlmKGRhdGFbaV0hPW1nY2tbaV0pIHRocm93IFwiVGhlIGlucHV0IGlzIG5vdCBhIFBORyBmaWxlIVwiO1xuXG5cdHdoaWxlKG9mZnNldDxkYXRhLmxlbmd0aClcblx0e1xuXHRcdHZhciBsZW4gID0gYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCk7ICBvZmZzZXQgKz0gNDtcblx0XHR2YXIgdHlwZSA9IGJpbi5yZWFkQVNDSUkoZGF0YSwgb2Zmc2V0LCA0KTsgIG9mZnNldCArPSA0O1xuXHRcdC8vY29uc29sZS5sb2codHlwZSxsZW4pO1xuXHRcdFxuXHRcdGlmICAgICAodHlwZT09XCJJSERSXCIpICB7ICBVUE5HLmRlY29kZS5fSUhEUihkYXRhLCBvZmZzZXQsIG91dCk7ICB9XG5cdFx0ZWxzZSBpZih0eXBlPT1cIklEQVRcIikge1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8bGVuOyBpKyspIGRkW2RvZmYraV0gPSBkYXRhW29mZnNldCtpXTtcblx0XHRcdGRvZmYgKz0gbGVuO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiYWNUTFwiKSAge1xuXHRcdFx0b3V0LnRhYnNbdHlwZV0gPSB7ICBudW1fZnJhbWVzOnJVaShkYXRhLCBvZmZzZXQpLCBudW1fcGxheXM6clVpKGRhdGEsIG9mZnNldCs0KSAgfTtcblx0XHRcdGZkID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiZmNUTFwiKSAge1xuXHRcdFx0aWYoZm9mZiE9MCkgeyAgdmFyIGZyID0gb3V0LmZyYW1lc1tvdXQuZnJhbWVzLmxlbmd0aC0xXTtcblx0XHRcdFx0ZnIuZGF0YSA9IFVQTkcuZGVjb2RlLl9kZWNvbXByZXNzKG91dCwgZmQuc2xpY2UoMCxmb2ZmKSwgZnIucmVjdC53aWR0aCwgZnIucmVjdC5oZWlnaHQpOyAgZm9mZj0wO1xuXHRcdFx0fVxuXHRcdFx0dmFyIHJjdCA9IHt4OnJVaShkYXRhLCBvZmZzZXQrMTIpLHk6clVpKGRhdGEsIG9mZnNldCsxNiksd2lkdGg6clVpKGRhdGEsIG9mZnNldCs0KSxoZWlnaHQ6clVpKGRhdGEsIG9mZnNldCs4KX07XG5cdFx0XHR2YXIgZGVsID0gclVzKGRhdGEsIG9mZnNldCsyMik7ICBkZWwgPSByVXMoZGF0YSwgb2Zmc2V0KzIwKSAvIChkZWw9PTA/MTAwOmRlbCk7XG5cdFx0XHR2YXIgZnJtID0ge3JlY3Q6cmN0LCBkZWxheTpNYXRoLnJvdW5kKGRlbCoxMDAwKSwgZGlzcG9zZTpkYXRhW29mZnNldCsyNF0sIGJsZW5kOmRhdGFbb2Zmc2V0KzI1XX07XG5cdFx0XHQvL2NvbnNvbGUubG9nKGZybSk7XG5cdFx0XHRvdXQuZnJhbWVzLnB1c2goZnJtKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImZkQVRcIikge1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8bGVuLTQ7IGkrKykgZmRbZm9mZitpXSA9IGRhdGFbb2Zmc2V0K2krNF07XG5cdFx0XHRmb2ZmICs9IGxlbi00O1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwicEhZc1wiKSB7XG5cdFx0XHRvdXQudGFic1t0eXBlXSA9IFtiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KSwgYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCs0KSwgZGF0YVtvZmZzZXQrOF1dO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiY0hSTVwiKSB7XG5cdFx0XHRvdXQudGFic1t0eXBlXSA9IFtdO1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8ODsgaSsrKSBvdXQudGFic1t0eXBlXS5wdXNoKGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQraSo0KSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJ0RVh0XCIpIHtcblx0XHRcdGlmKG91dC50YWJzW3R5cGVdPT1udWxsKSBvdXQudGFic1t0eXBlXSA9IHt9O1xuXHRcdFx0dmFyIG56ID0gYmluLm5leHRaZXJvKGRhdGEsIG9mZnNldCk7XG5cdFx0XHR2YXIga2V5dyA9IGJpbi5yZWFkQVNDSUkoZGF0YSwgb2Zmc2V0LCBuei1vZmZzZXQpO1xuXHRcdFx0dmFyIHRleHQgPSBiaW4ucmVhZEFTQ0lJKGRhdGEsIG56KzEsIG9mZnNldCtsZW4tbnotMSk7XG5cdFx0XHRvdXQudGFic1t0eXBlXVtrZXl3XSA9IHRleHQ7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJpVFh0XCIpIHtcblx0XHRcdGlmKG91dC50YWJzW3R5cGVdPT1udWxsKSBvdXQudGFic1t0eXBlXSA9IHt9O1xuXHRcdFx0dmFyIG56ID0gMCwgb2ZmID0gb2Zmc2V0O1xuXHRcdFx0bnogPSBiaW4ubmV4dFplcm8oZGF0YSwgb2ZmKTtcblx0XHRcdHZhciBrZXl3ID0gYmluLnJlYWRBU0NJSShkYXRhLCBvZmYsIG56LW9mZik7ICBvZmYgPSBueiArIDE7XG5cdFx0XHR2YXIgY2ZsYWcgPSBkYXRhW29mZl0sIGNtZXRoID0gZGF0YVtvZmYrMV07ICBvZmYrPTI7XG5cdFx0XHRueiA9IGJpbi5uZXh0WmVybyhkYXRhLCBvZmYpO1xuXHRcdFx0dmFyIGx0YWcgPSBiaW4ucmVhZEFTQ0lJKGRhdGEsIG9mZiwgbnotb2ZmKTsgIG9mZiA9IG56ICsgMTtcblx0XHRcdG56ID0gYmluLm5leHRaZXJvKGRhdGEsIG9mZik7XG5cdFx0XHR2YXIgdGtleXcgPSBiaW4ucmVhZFVURjgoZGF0YSwgb2ZmLCBuei1vZmYpOyAgb2ZmID0gbnogKyAxO1xuXHRcdFx0dmFyIHRleHQgID0gYmluLnJlYWRVVEY4KGRhdGEsIG9mZiwgbGVuLShvZmYtb2Zmc2V0KSk7XG5cdFx0XHRvdXQudGFic1t0eXBlXVtrZXl3XSA9IHRleHQ7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJQTFRFXCIpIHtcblx0XHRcdG91dC50YWJzW3R5cGVdID0gYmluLnJlYWRCeXRlcyhkYXRhLCBvZmZzZXQsIGxlbik7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJoSVNUXCIpIHtcblx0XHRcdHZhciBwbCA9IG91dC50YWJzW1wiUExURVwiXS5sZW5ndGgvMztcblx0XHRcdG91dC50YWJzW3R5cGVdID0gW107ICBmb3IodmFyIGk9MDsgaTxwbDsgaSsrKSBvdXQudGFic1t0eXBlXS5wdXNoKHJVcyhkYXRhLCBvZmZzZXQraSoyKSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJ0Uk5TXCIpIHtcblx0XHRcdGlmICAgICAob3V0LmN0eXBlPT0zKSBvdXQudGFic1t0eXBlXSA9IGJpbi5yZWFkQnl0ZXMoZGF0YSwgb2Zmc2V0LCBsZW4pO1xuXHRcdFx0ZWxzZSBpZihvdXQuY3R5cGU9PTApIG91dC50YWJzW3R5cGVdID0gclVzKGRhdGEsIG9mZnNldCk7XG5cdFx0XHRlbHNlIGlmKG91dC5jdHlwZT09Mikgb3V0LnRhYnNbdHlwZV0gPSBbIHJVcyhkYXRhLG9mZnNldCksclVzKGRhdGEsb2Zmc2V0KzIpLHJVcyhkYXRhLG9mZnNldCs0KSBdO1xuXHRcdFx0Ly9lbHNlIGNvbnNvbGUubG9nKFwidFJOUyBmb3IgdW5zdXBwb3J0ZWQgY29sb3IgdHlwZVwiLG91dC5jdHlwZSwgbGVuKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImdBTUFcIikgb3V0LnRhYnNbdHlwZV0gPSBiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KS8xMDAwMDA7XG5cdFx0ZWxzZSBpZih0eXBlPT1cInNSR0JcIikgb3V0LnRhYnNbdHlwZV0gPSBkYXRhW29mZnNldF07XG5cdFx0ZWxzZSBpZih0eXBlPT1cImJLR0RcIilcblx0XHR7XG5cdFx0XHRpZiAgICAgKG91dC5jdHlwZT09MCB8fCBvdXQuY3R5cGU9PTQpIG91dC50YWJzW3R5cGVdID0gW3JVcyhkYXRhLCBvZmZzZXQpXTtcblx0XHRcdGVsc2UgaWYob3V0LmN0eXBlPT0yIHx8IG91dC5jdHlwZT09Nikgb3V0LnRhYnNbdHlwZV0gPSBbclVzKGRhdGEsIG9mZnNldCksIHJVcyhkYXRhLCBvZmZzZXQrMiksIHJVcyhkYXRhLCBvZmZzZXQrNCldO1xuXHRcdFx0ZWxzZSBpZihvdXQuY3R5cGU9PTMpIG91dC50YWJzW3R5cGVdID0gZGF0YVtvZmZzZXRdO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiSUVORFwiKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0Ly9lbHNlIHsgIGxvZyhcInVua25vd24gY2h1bmsgdHlwZVwiLCB0eXBlLCBsZW4pOyAgfVxuXHRcdG9mZnNldCArPSBsZW47XG5cdFx0dmFyIGNyYyA9IGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQpOyAgb2Zmc2V0ICs9IDQ7XG5cdH1cblx0aWYoZm9mZiE9MCkgeyAgdmFyIGZyID0gb3V0LmZyYW1lc1tvdXQuZnJhbWVzLmxlbmd0aC0xXTtcblx0XHRmci5kYXRhID0gVVBORy5kZWNvZGUuX2RlY29tcHJlc3Mob3V0LCBmZC5zbGljZSgwLGZvZmYpLCBmci5yZWN0LndpZHRoLCBmci5yZWN0LmhlaWdodCk7ICBmb2ZmPTA7XG5cdH1cdFxuXHRvdXQuZGF0YSA9IFVQTkcuZGVjb2RlLl9kZWNvbXByZXNzKG91dCwgZGQsIG91dC53aWR0aCwgb3V0LmhlaWdodCk7XG5cdFxuXHRkZWxldGUgb3V0LmNvbXByZXNzOyAgZGVsZXRlIG91dC5pbnRlcmxhY2U7ICBkZWxldGUgb3V0LmZpbHRlcjtcblx0cmV0dXJuIG91dDtcbn1cblxuVVBORy5kZWNvZGUuX2RlY29tcHJlc3MgPSBmdW5jdGlvbihvdXQsIGRkLCB3LCBoKSB7XG5cdHZhciB0aW1lID0gRGF0ZS5ub3coKTtcblx0dmFyIGJwcCA9IFVQTkcuZGVjb2RlLl9nZXRCUFAob3V0KSwgYnBsID0gTWF0aC5jZWlsKHcqYnBwLzgpLCBidWZmID0gbmV3IFVpbnQ4QXJyYXkoKGJwbCsxK291dC5pbnRlcmxhY2UpKmgpO1xuXHRkZCA9IFVQTkcuZGVjb2RlLl9pbmZsYXRlKGRkLGJ1ZmYpO1xuXHQvL2NvbnNvbGUubG9nKGRkLmxlbmd0aCwgYnVmZi5sZW5ndGgpO1xuXHQvL2NvbnNvbGUubG9nKERhdGUubm93KCktdGltZSk7XG5cblx0dmFyIHRpbWU9RGF0ZS5ub3coKTtcblx0aWYgICAgIChvdXQuaW50ZXJsYWNlPT0wKSBkZCA9IFVQTkcuZGVjb2RlLl9maWx0ZXJaZXJvKGRkLCBvdXQsIDAsIHcsIGgpO1xuXHRlbHNlIGlmKG91dC5pbnRlcmxhY2U9PTEpIGRkID0gVVBORy5kZWNvZGUuX3JlYWRJbnRlcmxhY2UoZGQsIG91dCk7XG5cdC8vY29uc29sZS5sb2coRGF0ZS5ub3coKS10aW1lKTtcblx0cmV0dXJuIGRkO1xufVxuXG5VUE5HLmRlY29kZS5faW5mbGF0ZSA9IGZ1bmN0aW9uKGRhdGEsIGJ1ZmYpIHsgIHZhciBvdXQ9VVBOR1tcImluZmxhdGVSYXdcIl0obmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsIDIsZGF0YS5sZW5ndGgtNiksYnVmZik7ICByZXR1cm4gb3V0OyAgfVxuVVBORy5pbmZsYXRlUmF3PWZ1bmN0aW9uKCl7dmFyIEg9e307SC5IPXt9O0guSC5OPWZ1bmN0aW9uKE4sVyl7dmFyIFI9VWludDhBcnJheSxpPTAsbT0wLEo9MCxoPTAsUT0wLFg9MCx1PTAsdz0wLGQ9MCx2LEM7XG5pZihOWzBdPT0zJiZOWzFdPT0wKXJldHVybiBXP1c6bmV3IFIoMCk7dmFyIFY9SC5ILG49Vi5iLEE9Vi5lLGw9Vi5SLE09Vi5uLEk9Vi5BLGU9Vi5aLGI9Vi5tLFo9Vz09bnVsbDtcbmlmKFopVz1uZXcgUihOLmxlbmd0aD4+PjI8PDMpO3doaWxlKGk9PTApe2k9bihOLGQsMSk7bT1uKE4sZCsxLDIpO2QrPTM7aWYobT09MCl7aWYoKGQmNykhPTApZCs9OC0oZCY3KTtcbnZhciBEPShkPj4+MykrNCxxPU5bRC00XXxOW0QtM108PDg7aWYoWilXPUguSC5XKFcsdytxKTtXLnNldChuZXcgUihOLmJ1ZmZlcixOLmJ5dGVPZmZzZXQrRCxxKSx3KTtkPUQrcTw8MztcbncrPXE7Y29udGludWV9aWYoWilXPUguSC5XKFcsdysoMTw8MTcpKTtpZihtPT0xKXt2PWIuSjtDPWIuaDtYPSgxPDw5KS0xO3U9KDE8PDUpLTF9aWYobT09Mil7Sj1BKE4sZCw1KSsyNTc7XG5oPUEoTixkKzUsNSkrMTtRPUEoTixkKzEwLDQpKzQ7ZCs9MTQ7dmFyIEU9ZCxqPTE7Zm9yKHZhciBjPTA7YzwzODtjKz0yKXtiLlFbY109MDtiLlFbYysxXT0wfWZvcih2YXIgYz0wO1xuYzxRO2MrKyl7dmFyIEs9QShOLGQrYyozLDMpO2IuUVsoYi5YW2NdPDwxKSsxXT1LO2lmKEs+ailqPUt9ZCs9MypRO00oYi5RLGopO0koYi5RLGosYi51KTt2PWIudztDPWIuZDtcbmQ9bChiLnUsKDE8PGopLTEsSitoLE4sZCxiLnYpO3ZhciByPVYuVihiLnYsMCxKLGIuQyk7WD0oMTw8ciktMTt2YXIgUz1WLlYoYi52LEosaCxiLkQpO3U9KDE8PFMpLTE7TShiLkMscik7XG5JKGIuQyxyLHYpO00oYi5ELFMpO0koYi5ELFMsQyl9d2hpbGUoITApe3ZhciBUPXZbZShOLGQpJlhdO2QrPVQmMTU7dmFyIHA9VD4+PjQ7aWYocD4+Pjg9PTApe1dbdysrXT1wfWVsc2UgaWYocD09MjU2KXticmVha31lbHNle3ZhciB6PXcrcC0yNTQ7XG5pZihwPjI2NCl7dmFyIF89Yi5xW3AtMjU3XTt6PXcrKF8+Pj4zKStBKE4sZCxfJjcpO2QrPV8mN312YXIgJD1DW2UoTixkKSZ1XTtkKz0kJjE1O3ZhciBzPSQ+Pj40LFk9Yi5jW3NdLGE9KFk+Pj40KStuKE4sZCxZJjE1KTtcbmQrPVkmMTU7d2hpbGUodzx6KXtXW3ddPVdbdysrLWFdO1dbd109V1t3KystYV07V1t3XT1XW3crKy1hXTtXW3ddPVdbdysrLWFdfXc9en19fXJldHVybiBXLmxlbmd0aD09dz9XOlcuc2xpY2UoMCx3KX07XG5ILkguVz1mdW5jdGlvbihOLFcpe3ZhciBSPU4ubGVuZ3RoO2lmKFc8PVIpcmV0dXJuIE47dmFyIFY9bmV3IFVpbnQ4QXJyYXkoUjw8MSk7Vi5zZXQoTiwwKTtyZXR1cm4gVn07XG5ILkguUj1mdW5jdGlvbihOLFcsUixWLG4sQSl7dmFyIGw9SC5ILmUsTT1ILkguWixJPTA7d2hpbGUoSTxSKXt2YXIgZT1OW00oVixuKSZXXTtuKz1lJjE1O3ZhciBiPWU+Pj40O1xuaWYoYjw9MTUpe0FbSV09YjtJKyt9ZWxzZXt2YXIgWj0wLG09MDtpZihiPT0xNil7bT0zK2woVixuLDIpO24rPTI7Wj1BW0ktMV19ZWxzZSBpZihiPT0xNyl7bT0zK2woVixuLDMpO1xubis9M31lbHNlIGlmKGI9PTE4KXttPTExK2woVixuLDcpO24rPTd9dmFyIEo9SSttO3doaWxlKEk8Sil7QVtJXT1aO0krK319fXJldHVybiBufTtILkguVj1mdW5jdGlvbihOLFcsUixWKXt2YXIgbj0wLEE9MCxsPVYubGVuZ3RoPj4+MTtcbndoaWxlKEE8Uil7dmFyIE09TltBK1ddO1ZbQTw8MV09MDtWWyhBPDwxKSsxXT1NO2lmKE0+biluPU07QSsrfXdoaWxlKEE8bCl7VltBPDwxXT0wO1ZbKEE8PDEpKzFdPTA7QSsrfXJldHVybiBufTtcbkguSC5uPWZ1bmN0aW9uKE4sVyl7dmFyIFI9SC5ILm0sVj1OLmxlbmd0aCxuLEEsbCxNLEksZT1SLmo7Zm9yKHZhciBNPTA7TTw9VztNKyspZVtNXT0wO2ZvcihNPTE7TTxWO00rPTIpZVtOW01dXSsrO1xudmFyIGI9Ui5LO249MDtlWzBdPTA7Zm9yKEE9MTtBPD1XO0ErKyl7bj1uK2VbQS0xXTw8MTtiW0FdPW59Zm9yKGw9MDtsPFY7bCs9Mil7ST1OW2wrMV07aWYoSSE9MCl7TltsXT1iW0ldO1xuYltJXSsrfX19O0guSC5BPWZ1bmN0aW9uKE4sVyxSKXt2YXIgVj1OLmxlbmd0aCxuPUguSC5tLEE9bi5yO2Zvcih2YXIgbD0wO2w8VjtsKz0yKWlmKE5bbCsxXSE9MCl7dmFyIE09bD4+MSxJPU5bbCsxXSxlPU08PDR8SSxiPVctSSxaPU5bbF08PGIsbT1aKygxPDxiKTtcbndoaWxlKFohPW0pe3ZhciBKPUFbWl0+Pj4xNS1XO1JbSl09ZTtaKyt9fX07SC5ILmw9ZnVuY3Rpb24oTixXKXt2YXIgUj1ILkgubS5yLFY9MTUtVztmb3IodmFyIG49MDtuPE4ubGVuZ3RoO1xubis9Mil7dmFyIEE9TltuXTw8Vy1OW24rMV07TltuXT1SW0FdPj4+Vn19O0guSC5NPWZ1bmN0aW9uKE4sVyxSKXtSPVI8PChXJjcpO3ZhciBWPVc+Pj4zO05bVl18PVI7TltWKzFdfD1SPj4+OH07XG5ILkguST1mdW5jdGlvbihOLFcsUil7Uj1SPDwoVyY3KTt2YXIgVj1XPj4+MztOW1ZdfD1SO05bVisxXXw9Uj4+Pjg7TltWKzJdfD1SPj4+MTZ9O0guSC5lPWZ1bmN0aW9uKE4sVyxSKXtyZXR1cm4oTltXPj4+M118TlsoVz4+PjMpKzFdPDw4KT4+PihXJjcpJigxPDxSKS0xfTtcbkguSC5iPWZ1bmN0aW9uKE4sVyxSKXtyZXR1cm4oTltXPj4+M118TlsoVz4+PjMpKzFdPDw4fE5bKFc+Pj4zKSsyXTw8MTYpPj4+KFcmNykmKDE8PFIpLTF9O0guSC5aPWZ1bmN0aW9uKE4sVyl7cmV0dXJuKE5bVz4+PjNdfE5bKFc+Pj4zKSsxXTw8OHxOWyhXPj4+MykrMl08PDE2KT4+PihXJjcpfTtcbkguSC5pPWZ1bmN0aW9uKE4sVyl7cmV0dXJuKE5bVz4+PjNdfE5bKFc+Pj4zKSsxXTw8OHxOWyhXPj4+MykrMl08PDE2fE5bKFc+Pj4zKSszXTw8MjQpPj4+KFcmNyl9O0guSC5tPWZ1bmN0aW9uKCl7dmFyIE49VWludDE2QXJyYXksVz1VaW50MzJBcnJheTtcbnJldHVybntLOm5ldyBOKDE2KSxqOm5ldyBOKDE2KSxYOlsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSxTOlszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDk5OSw5OTksOTk5XSxUOlswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsMCwwLDBdLHE6bmV3IE4oMzIpLHA6WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3Nyw2NTUzNSw2NTUzNV0sejpbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywwLDBdLGM6bmV3IFcoMzIpLEo6bmV3IE4oNTEyKSxfOltdLGg6bmV3IE4oMzIpLCQ6W10sdzpuZXcgTigzMjc2OCksQzpbXSx2OltdLGQ6bmV3IE4oMzI3NjgpLEQ6W10sdTpuZXcgTig1MTIpLFE6W10scjpuZXcgTigxPDwxNSksczpuZXcgVygyODYpLFk6bmV3IFcoMzApLGE6bmV3IFcoMTkpLHQ6bmV3IFcoMTVlMyksazpuZXcgTigxPDwxNiksZzpuZXcgTigxPDwxNSl9fSgpO1xuKGZ1bmN0aW9uKCl7dmFyIE49SC5ILm0sVz0xPDwxNTtmb3IodmFyIFI9MDtSPFc7UisrKXt2YXIgVj1SO1Y9KFYmMjg2MzMxMTUzMCk+Pj4xfChWJjE0MzE2NTU3NjUpPDwxO1xuVj0oViYzNDM1OTczODM2KT4+PjJ8KFYmODU4OTkzNDU5KTw8MjtWPShWJjQwNDIzMjIxNjApPj4+NHwoViYyNTI2NDUxMzUpPDw0O1Y9KFYmNDI3ODI1NTM2MCk+Pj44fChWJjE2NzExOTM1KTw8ODtcbk4ucltSXT0oVj4+PjE2fFY8PDE2KT4+PjE3fWZ1bmN0aW9uIG4oQSxsLE0pe3doaWxlKGwtLSE9MClBLnB1c2goMCxNKX1mb3IodmFyIFI9MDtSPDMyO1IrKyl7Ti5xW1JdPU4uU1tSXTw8M3xOLlRbUl07XG5OLmNbUl09Ti5wW1JdPDw0fE4ueltSXX1uKE4uXywxNDQsOCk7bihOLl8sMjU1LTE0Myw5KTtuKE4uXywyNzktMjU1LDcpO24oTi5fLDI4Ny0yNzksOCk7SC5ILm4oTi5fLDkpO1xuSC5ILkEoTi5fLDksTi5KKTtILkgubChOLl8sOSk7bihOLiQsMzIsNSk7SC5ILm4oTi4kLDUpO0guSC5BKE4uJCw1LE4uaCk7SC5ILmwoTi4kLDUpO24oTi5RLDE5LDApO24oTi5DLDI4NiwwKTtcbm4oTi5ELDMwLDApO24oTi52LDMyMCwwKX0oKSk7cmV0dXJuIEguSC5OfSgpXG5cblxuVVBORy5kZWNvZGUuX3JlYWRJbnRlcmxhY2UgPSBmdW5jdGlvbihkYXRhLCBvdXQpXG57XG5cdHZhciB3ID0gb3V0LndpZHRoLCBoID0gb3V0LmhlaWdodDtcblx0dmFyIGJwcCA9IFVQTkcuZGVjb2RlLl9nZXRCUFAob3V0KSwgY2JwcCA9IGJwcD4+MywgYnBsID0gTWF0aC5jZWlsKHcqYnBwLzgpO1xuXHR2YXIgaW1nID0gbmV3IFVpbnQ4QXJyYXkoIGggKiBicGwgKTtcblx0dmFyIGRpID0gMDtcblxuXHR2YXIgc3RhcnRpbmdfcm93ICA9IFsgMCwgMCwgNCwgMCwgMiwgMCwgMSBdO1xuXHR2YXIgc3RhcnRpbmdfY29sICA9IFsgMCwgNCwgMCwgMiwgMCwgMSwgMCBdO1xuXHR2YXIgcm93X2luY3JlbWVudCA9IFsgOCwgOCwgOCwgNCwgNCwgMiwgMiBdO1xuXHR2YXIgY29sX2luY3JlbWVudCA9IFsgOCwgOCwgNCwgNCwgMiwgMiwgMSBdO1xuXG5cdHZhciBwYXNzPTA7XG5cdHdoaWxlKHBhc3M8Nylcblx0e1xuXHRcdHZhciByaSA9IHJvd19pbmNyZW1lbnRbcGFzc10sIGNpID0gY29sX2luY3JlbWVudFtwYXNzXTtcblx0XHR2YXIgc3cgPSAwLCBzaCA9IDA7XG5cdFx0dmFyIGNyID0gc3RhcnRpbmdfcm93W3Bhc3NdOyAgd2hpbGUoY3I8aCkgeyAgY3IrPXJpOyAgc2grKzsgIH1cblx0XHR2YXIgY2MgPSBzdGFydGluZ19jb2xbcGFzc107ICB3aGlsZShjYzx3KSB7ICBjYys9Y2k7ICBzdysrOyAgfVxuXHRcdHZhciBicGxsID0gTWF0aC5jZWlsKHN3KmJwcC84KTtcblx0XHRVUE5HLmRlY29kZS5fZmlsdGVyWmVybyhkYXRhLCBvdXQsIGRpLCBzdywgc2gpO1xuXG5cdFx0dmFyIHk9MCwgcm93ID0gc3RhcnRpbmdfcm93W3Bhc3NdO1xuXHRcdHdoaWxlKHJvdzxoKVxuXHRcdHtcblx0XHRcdHZhciBjb2wgPSBzdGFydGluZ19jb2xbcGFzc107XG5cdFx0XHR2YXIgY2RpID0gKGRpK3kqYnBsbCk8PDM7XG5cblx0XHRcdHdoaWxlKGNvbDx3KVxuXHRcdFx0e1xuXHRcdFx0XHRpZihicHA9PTEpIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZGF0YVtjZGk+PjNdOyAgdmFsID0gKHZhbD4+KDctKGNkaSY3KSkpJjE7XG5cdFx0XHRcdFx0aW1nW3JvdypicGwgKyAoY29sPj4zKV0gfD0gKHZhbCA8PCAoNy0oKGNvbCY3KTw8MCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihicHA9PTIpIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZGF0YVtjZGk+PjNdOyAgdmFsID0gKHZhbD4+KDYtKGNkaSY3KSkpJjM7XG5cdFx0XHRcdFx0aW1nW3JvdypicGwgKyAoY29sPj4yKV0gfD0gKHZhbCA8PCAoNi0oKGNvbCYzKTw8MSkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihicHA9PTQpIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZGF0YVtjZGk+PjNdOyAgdmFsID0gKHZhbD4+KDQtKGNkaSY3KSkpJjE1O1xuXHRcdFx0XHRcdGltZ1tyb3cqYnBsICsgKGNvbD4+MSldIHw9ICh2YWwgPDwgKDQtKChjb2wmMSk8PDIpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoYnBwPj04KSB7XG5cdFx0XHRcdFx0dmFyIGlpID0gcm93KmJwbCtjb2wqY2JwcDtcblx0XHRcdFx0XHRmb3IodmFyIGo9MDsgajxjYnBwOyBqKyspIGltZ1tpaStqXSA9IGRhdGFbKGNkaT4+Mykral07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2RpKz1icHA7ICBjb2wrPWNpO1xuXHRcdFx0fVxuXHRcdFx0eSsrOyAgcm93ICs9IHJpO1xuXHRcdH1cblx0XHRpZihzdypzaCE9MCkgZGkgKz0gc2ggKiAoMSArIGJwbGwpO1xuXHRcdHBhc3MgPSBwYXNzICsgMTtcblx0fVxuXHRyZXR1cm4gaW1nO1xufVxuXG5VUE5HLmRlY29kZS5fZ2V0QlBQID0gZnVuY3Rpb24ob3V0KSB7XG5cdHZhciBub2MgPSBbMSxudWxsLDMsMSwyLG51bGwsNF1bb3V0LmN0eXBlXTtcblx0cmV0dXJuIG5vYyAqIG91dC5kZXB0aDtcbn1cblxuVVBORy5kZWNvZGUuX2ZpbHRlclplcm8gPSBmdW5jdGlvbihkYXRhLCBvdXQsIG9mZiwgdywgaClcbntcblx0dmFyIGJwcCA9IFVQTkcuZGVjb2RlLl9nZXRCUFAob3V0KSwgYnBsID0gTWF0aC5jZWlsKHcqYnBwLzgpLCBwYWV0aCA9IFVQTkcuZGVjb2RlLl9wYWV0aDtcblx0YnBwID0gTWF0aC5jZWlsKGJwcC84KTtcblx0XG5cdHZhciBpPTAsIGRpPTEsIHR5cGU9ZGF0YVtvZmZdLCB4PTA7XG5cdFxuXHRpZih0eXBlPjEpIGRhdGFbb2ZmXT1bMCwwLDFdW3R5cGUtMl07ICBcblx0aWYodHlwZT09MykgZm9yKHg9YnBwOyB4PGJwbDsgeCsrKSBkYXRhW3grMV0gPSAoZGF0YVt4KzFdICsgKGRhdGFbeCsxLWJwcF0+Pj4xKSApJjI1NTtcblxuXHRmb3IodmFyIHk9MDsgeTxoOyB5KyspICB7XG5cdFx0aSA9IG9mZit5KmJwbDsgZGkgPSBpK3krMTtcblx0XHR0eXBlID0gZGF0YVtkaS0xXTsgeD0wO1xuXG5cdFx0aWYgICAgICh0eXBlPT0wKSAgIGZvcig7IHg8YnBsOyB4KyspIGRhdGFbaSt4XSA9IGRhdGFbZGkreF07XG5cdFx0ZWxzZSBpZih0eXBlPT0xKSB7IGZvcig7IHg8YnBwOyB4KyspIGRhdGFbaSt4XSA9IGRhdGFbZGkreF07XG5cdFx0XHRcdFx0XHQgICBmb3IoOyB4PGJwbDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArIGRhdGFbaSt4LWJwcF0pOyAgfVxuXHRcdGVsc2UgaWYodHlwZT09MikgeyBmb3IoOyB4PGJwbDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArIGRhdGFbaSt4LWJwbF0pOyAgfVxuXHRcdGVsc2UgaWYodHlwZT09MykgeyBmb3IoOyB4PGJwcDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArICggZGF0YVtpK3gtYnBsXT4+PjEpKTtcblx0XHRcdCAgICAgICAgICAgICAgIGZvcig7IHg8YnBsOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgKChkYXRhW2kreC1icGxdK2RhdGFbaSt4LWJwcF0pPj4+MSkgKTsgIH1cblx0XHRlbHNlICAgICAgICAgICAgIHsgZm9yKDsgeDxicHA7IHgrKykgZGF0YVtpK3hdID0gKGRhdGFbZGkreF0gKyBwYWV0aCgwLCBkYXRhW2kreC1icGxdLCAwKSk7XG5cdFx0XHRcdFx0XHQgICBmb3IoOyB4PGJwbDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArIHBhZXRoKGRhdGFbaSt4LWJwcF0sIGRhdGFbaSt4LWJwbF0sIGRhdGFbaSt4LWJwcC1icGxdKSApOyAgfVxuXHR9XG5cdHJldHVybiBkYXRhO1xufVxuXG5VUE5HLmRlY29kZS5fcGFldGggPSBmdW5jdGlvbihhLGIsYylcbntcblx0dmFyIHAgPSBhK2ItYywgcGEgPSAocC1hKSwgcGIgPSAocC1iKSwgcGMgPSAocC1jKTtcblx0aWYgKHBhKnBhIDw9IHBiKnBiICYmIHBhKnBhIDw9IHBjKnBjKSAgcmV0dXJuIGE7XG5cdGVsc2UgaWYgKHBiKnBiIDw9IHBjKnBjKSAgcmV0dXJuIGI7XG5cdHJldHVybiBjO1xufVxuXG5VUE5HLmRlY29kZS5fSUhEUiA9IGZ1bmN0aW9uKGRhdGEsIG9mZnNldCwgb3V0KVxue1xuXHR2YXIgYmluID0gVVBORy5fYmluO1xuXHRvdXQud2lkdGggID0gYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCk7ICBvZmZzZXQgKz0gNDtcblx0b3V0LmhlaWdodCA9IGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQpOyAgb2Zmc2V0ICs9IDQ7XG5cdG91dC5kZXB0aCAgICAgPSBkYXRhW29mZnNldF07ICBvZmZzZXQrKztcblx0b3V0LmN0eXBlICAgICA9IGRhdGFbb2Zmc2V0XTsgIG9mZnNldCsrO1xuXHRvdXQuY29tcHJlc3MgID0gZGF0YVtvZmZzZXRdOyAgb2Zmc2V0Kys7XG5cdG91dC5maWx0ZXIgICAgPSBkYXRhW29mZnNldF07ICBvZmZzZXQrKztcblx0b3V0LmludGVybGFjZSA9IGRhdGFbb2Zmc2V0XTsgIG9mZnNldCsrO1xufVxuXG5VUE5HLl9iaW4gPSB7XG5cdG5leHRaZXJvICAgOiBmdW5jdGlvbihkYXRhLHApICB7ICB3aGlsZShkYXRhW3BdIT0wKSBwKys7ICByZXR1cm4gcDsgIH0sXG5cdHJlYWRVc2hvcnQgOiBmdW5jdGlvbihidWZmLHApICB7ICByZXR1cm4gKGJ1ZmZbcF08PCA4KSB8IGJ1ZmZbcCsxXTsgIH0sXG5cdHdyaXRlVXNob3J0OiBmdW5jdGlvbihidWZmLHAsbil7ICBidWZmW3BdID0gKG4+PjgpJjI1NTsgIGJ1ZmZbcCsxXSA9IG4mMjU1OyAgfSxcblx0cmVhZFVpbnQgICA6IGZ1bmN0aW9uKGJ1ZmYscCkgIHsgIHJldHVybiAoYnVmZltwXSooMjU2KjI1NioyNTYpKSArICgoYnVmZltwKzFdPDwxNikgfCAoYnVmZltwKzJdPDwgOCkgfCBidWZmW3ArM10pOyAgfSxcblx0d3JpdGVVaW50ICA6IGZ1bmN0aW9uKGJ1ZmYscCxuKXsgIGJ1ZmZbcF09KG4+PjI0KSYyNTU7ICBidWZmW3ArMV09KG4+PjE2KSYyNTU7ICBidWZmW3ArMl09KG4+PjgpJjI1NTsgIGJ1ZmZbcCszXT1uJjI1NTsgIH0sXG5cdHJlYWRBU0NJSSAgOiBmdW5jdGlvbihidWZmLHAsbCl7ICB2YXIgcyA9IFwiXCI7ICBmb3IodmFyIGk9MDsgaTxsOyBpKyspIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZmW3AraV0pOyAgcmV0dXJuIHM7ICAgIH0sXG5cdHdyaXRlQVNDSUkgOiBmdW5jdGlvbihkYXRhLHAscyl7ICBmb3IodmFyIGk9MDsgaTxzLmxlbmd0aDsgaSsrKSBkYXRhW3AraV0gPSBzLmNoYXJDb2RlQXQoaSk7ICB9LFxuXHRyZWFkQnl0ZXMgIDogZnVuY3Rpb24oYnVmZixwLGwpeyAgdmFyIGFyciA9IFtdOyAgIGZvcih2YXIgaT0wOyBpPGw7IGkrKykgYXJyLnB1c2goYnVmZltwK2ldKTsgICByZXR1cm4gYXJyOyAgfSxcblx0cGFkIDogZnVuY3Rpb24obikgeyByZXR1cm4gbi5sZW5ndGggPCAyID8gXCIwXCIgKyBuIDogbjsgfSxcblx0cmVhZFVURjggOiBmdW5jdGlvbihidWZmLCBwLCBsKSB7XG5cdFx0dmFyIHMgPSBcIlwiLCBucztcblx0XHRmb3IodmFyIGk9MDsgaTxsOyBpKyspIHMgKz0gXCIlXCIgKyBVUE5HLl9iaW4ucGFkKGJ1ZmZbcCtpXS50b1N0cmluZygxNikpO1xuXHRcdHRyeSB7ICBucyA9IGRlY29kZVVSSUNvbXBvbmVudChzKTsgfVxuXHRcdGNhdGNoKGUpIHsgIHJldHVybiBVUE5HLl9iaW4ucmVhZEFTQ0lJKGJ1ZmYsIHAsIGwpOyAgfVxuXHRcdHJldHVybiAgbnM7XG5cdH1cbn1cblVQTkcuX2NvcHlUaWxlID0gZnVuY3Rpb24oc2IsIHN3LCBzaCwgdGIsIHR3LCB0aCwgeG9mZiwgeW9mZiwgbW9kZSlcbntcblx0dmFyIHcgPSBNYXRoLm1pbihzdyx0dyksIGggPSBNYXRoLm1pbihzaCx0aCk7XG5cdHZhciBzaT0wLCB0aT0wO1xuXHRmb3IodmFyIHk9MDsgeTxoOyB5KyspXG5cdFx0Zm9yKHZhciB4PTA7IHg8dzsgeCsrKVxuXHRcdHtcblx0XHRcdGlmKHhvZmY+PTAgJiYgeW9mZj49MCkgeyAgc2kgPSAoeSpzdyt4KTw8MjsgIHRpID0gKCggeW9mZit5KSp0dyt4b2ZmK3gpPDwyOyAgfVxuXHRcdFx0ZWxzZSAgICAgICAgICAgICAgICAgICB7ICBzaSA9ICgoLXlvZmYreSkqc3cteG9mZit4KTw8MjsgIHRpID0gKHkqdHcreCk8PDI7ICB9XG5cdFx0XHRcblx0XHRcdGlmICAgICAobW9kZT09MCkgeyAgdGJbdGldID0gc2Jbc2ldOyAgdGJbdGkrMV0gPSBzYltzaSsxXTsgIHRiW3RpKzJdID0gc2Jbc2krMl07ICB0Ylt0aSszXSA9IHNiW3NpKzNdOyAgfVxuXHRcdFx0ZWxzZSBpZihtb2RlPT0xKSB7XG5cdFx0XHRcdHZhciBmYSA9IHNiW3NpKzNdKigxLzI1NSksIGZyPXNiW3NpXSpmYSwgZmc9c2Jbc2krMV0qZmEsIGZiPXNiW3NpKzJdKmZhOyBcblx0XHRcdFx0dmFyIGJhID0gdGJbdGkrM10qKDEvMjU1KSwgYnI9dGJbdGldKmJhLCBiZz10Ylt0aSsxXSpiYSwgYmI9dGJbdGkrMl0qYmE7IFxuXHRcdFx0XHRcblx0XHRcdFx0dmFyIGlmYT0xLWZhLCBvYSA9IGZhK2JhKmlmYSwgaW9hID0gKG9hPT0wPzA6MS9vYSk7XG5cdFx0XHRcdHRiW3RpKzNdID0gMjU1Km9hOyAgXG5cdFx0XHRcdHRiW3RpKzBdID0gKGZyK2JyKmlmYSkqaW9hOyAgXG5cdFx0XHRcdHRiW3RpKzFdID0gKGZnK2JnKmlmYSkqaW9hOyAgIFxuXHRcdFx0XHR0Ylt0aSsyXSA9IChmYitiYippZmEpKmlvYTsgIFxuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZihtb2RlPT0yKXtcdC8vIGNvcHkgb25seSBkaWZmZXJlbmNlcywgb3RoZXJ3aXNlIHplcm9cblx0XHRcdFx0dmFyIGZhID0gc2Jbc2krM10sIGZyPXNiW3NpXSwgZmc9c2Jbc2krMV0sIGZiPXNiW3NpKzJdOyBcblx0XHRcdFx0dmFyIGJhID0gdGJbdGkrM10sIGJyPXRiW3RpXSwgYmc9dGJbdGkrMV0sIGJiPXRiW3RpKzJdOyBcblx0XHRcdFx0aWYoZmE9PWJhICYmIGZyPT1iciAmJiBmZz09YmcgJiYgZmI9PWJiKSB7ICB0Ylt0aV09MDsgIHRiW3RpKzFdPTA7ICB0Ylt0aSsyXT0wOyAgdGJbdGkrM109MDsgIH1cblx0XHRcdFx0ZWxzZSB7ICB0Ylt0aV09ZnI7ICB0Ylt0aSsxXT1mZzsgIHRiW3RpKzJdPWZiOyAgdGJbdGkrM109ZmE7ICB9XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKG1vZGU9PTMpe1x0Ly8gY2hlY2sgaWYgY2FuIGJlIGJsZW5kZWRcblx0XHRcdFx0dmFyIGZhID0gc2Jbc2krM10sIGZyPXNiW3NpXSwgZmc9c2Jbc2krMV0sIGZiPXNiW3NpKzJdOyBcblx0XHRcdFx0dmFyIGJhID0gdGJbdGkrM10sIGJyPXRiW3RpXSwgYmc9dGJbdGkrMV0sIGJiPXRiW3RpKzJdOyBcblx0XHRcdFx0aWYoZmE9PWJhICYmIGZyPT1iciAmJiBmZz09YmcgJiYgZmI9PWJiKSBjb250aW51ZTtcblx0XHRcdFx0Ly9pZihmYSE9MjU1ICYmIGJhIT0wKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdGlmKGZhPDIyMCAmJiBiYT4yMCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0cmV0dXJuIHRydWU7XG59XG5cblxuXG5cblVQTkcuZW5jb2RlID0gZnVuY3Rpb24oYnVmcywgdywgaCwgcHMsIGRlbHMsIHRhYnMsIGZvcmJpZFBsdGUpXG57XG5cdGlmKHBzPT1udWxsKSBwcz0wO1xuXHRpZihmb3JiaWRQbHRlPT1udWxsKSBmb3JiaWRQbHRlID0gZmFsc2U7XG5cblx0dmFyIG5pbWcgPSBVUE5HLmVuY29kZS5jb21wcmVzcyhidWZzLCB3LCBoLCBwcywgW2ZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIGZvcmJpZFBsdGVdKTtcblx0VVBORy5lbmNvZGUuY29tcHJlc3NQTkcobmltZywgLTEpO1xuXHRcblx0cmV0dXJuIFVQTkcuZW5jb2RlLl9tYWluKG5pbWcsIHcsIGgsIGRlbHMsIHRhYnMpO1xufVxuXG5VUE5HLmVuY29kZUxMID0gZnVuY3Rpb24oYnVmcywgdywgaCwgY2MsIGFjLCBkZXB0aCwgZGVscywgdGFicykge1xuXHR2YXIgbmltZyA9IHsgIGN0eXBlOiAwICsgKGNjPT0xID8gMCA6IDIpICsgKGFjPT0wID8gMCA6IDQpLCAgICAgIGRlcHRoOiBkZXB0aCwgIGZyYW1lczogW10gIH07XG5cdFxuXHR2YXIgdGltZSA9IERhdGUubm93KCk7XG5cdHZhciBiaXBwID0gKGNjK2FjKSpkZXB0aCwgYmlwbCA9IGJpcHAgKiB3O1xuXHRmb3IodmFyIGk9MDsgaTxidWZzLmxlbmd0aDsgaSsrKVxuXHRcdG5pbWcuZnJhbWVzLnB1c2goeyAgcmVjdDp7eDowLHk6MCx3aWR0aDp3LGhlaWdodDpofSwgIGltZzpuZXcgVWludDhBcnJheShidWZzW2ldKSwgYmxlbmQ6MCwgZGlzcG9zZToxLCBicHA6TWF0aC5jZWlsKGJpcHAvOCksIGJwbDpNYXRoLmNlaWwoYmlwbC84KSAgfSk7XG5cdFxuXHRVUE5HLmVuY29kZS5jb21wcmVzc1BORyhuaW1nLCAwLCB0cnVlKTtcblx0XG5cdHZhciBvdXQgPSBVUE5HLmVuY29kZS5fbWFpbihuaW1nLCB3LCBoLCBkZWxzLCB0YWJzKTtcblx0cmV0dXJuIG91dDtcbn1cblxuVVBORy5lbmNvZGUuX21haW4gPSBmdW5jdGlvbihuaW1nLCB3LCBoLCBkZWxzLCB0YWJzKSB7XG5cdGlmKHRhYnM9PW51bGwpIHRhYnM9e307XG5cdHZhciBjcmMgPSBVUE5HLmNyYy5jcmMsIHdVaSA9IFVQTkcuX2Jpbi53cml0ZVVpbnQsIHdVcyA9IFVQTkcuX2Jpbi53cml0ZVVzaG9ydCwgd0FzID0gVVBORy5fYmluLndyaXRlQVNDSUk7XG5cdHZhciBvZmZzZXQgPSA4LCBhbmltID0gbmltZy5mcmFtZXMubGVuZ3RoPjEsIHBsdEFscGhhID0gZmFsc2U7XG5cdFxuXHR2YXIgbGVuZyA9IDggKyAoMTYrNSs0KSAvKisgKDkrNCkqLyArIChhbmltID8gMjAgOiAwKTtcblx0aWYodGFic1tcInNSR0JcIl0hPW51bGwpIGxlbmcgKz0gOCsxKzQ7XG5cdGlmKHRhYnNbXCJwSFlzXCJdIT1udWxsKSBsZW5nICs9IDgrOSs0O1xuXHRpZihuaW1nLmN0eXBlPT0zKSB7XG5cdFx0dmFyIGRsID0gbmltZy5wbHRlLmxlbmd0aDtcblx0XHRmb3IodmFyIGk9MDsgaTxkbDsgaSsrKSBpZigobmltZy5wbHRlW2ldPj4+MjQpIT0yNTUpIHBsdEFscGhhID0gdHJ1ZTtcblx0XHRsZW5nICs9ICg4ICsgZGwqMyArIDQpICsgKHBsdEFscGhhID8gKDggKyBkbCoxICsgNCkgOiAwKTtcblx0fVxuXHRmb3IodmFyIGo9MDsgajxuaW1nLmZyYW1lcy5sZW5ndGg7IGorKylcblx0e1xuXHRcdHZhciBmciA9IG5pbWcuZnJhbWVzW2pdO1xuXHRcdGlmKGFuaW0pIGxlbmcgKz0gMzg7XG5cdFx0bGVuZyArPSBmci5jaW1nLmxlbmd0aCArIDEyO1xuXHRcdGlmKGohPTApIGxlbmcrPTQ7XG5cdH1cblx0bGVuZyArPSAxMjsgXG5cdFxuXHR2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGxlbmcpO1xuXHR2YXIgd3I9WzB4ODksIDB4NTAsIDB4NGUsIDB4NDcsIDB4MGQsIDB4MGEsIDB4MWEsIDB4MGFdO1xuXHRmb3IodmFyIGk9MDsgaTw4OyBpKyspIGRhdGFbaV09d3JbaV07XG5cdFxuXHR3VWkoZGF0YSxvZmZzZXQsIDEzKTsgICAgIG9mZnNldCs9NDtcblx0d0FzKGRhdGEsb2Zmc2V0LFwiSUhEUlwiKTsgIG9mZnNldCs9NDtcblx0d1VpKGRhdGEsb2Zmc2V0LHcpOyAgb2Zmc2V0Kz00O1xuXHR3VWkoZGF0YSxvZmZzZXQsaCk7ICBvZmZzZXQrPTQ7XG5cdGRhdGFbb2Zmc2V0XSA9IG5pbWcuZGVwdGg7ICBvZmZzZXQrKzsgIC8vIGRlcHRoXG5cdGRhdGFbb2Zmc2V0XSA9IG5pbWcuY3R5cGU7ICBvZmZzZXQrKzsgIC8vIGN0eXBlXG5cdGRhdGFbb2Zmc2V0XSA9IDA7ICBvZmZzZXQrKzsgIC8vIGNvbXByZXNzXG5cdGRhdGFbb2Zmc2V0XSA9IDA7ICBvZmZzZXQrKzsgIC8vIGZpbHRlclxuXHRkYXRhW29mZnNldF0gPSAwOyAgb2Zmc2V0Kys7ICAvLyBpbnRlcmxhY2Vcblx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC0xNywxNykpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblxuXHQvLyAxMyBieXRlcyB0byBzYXksIHRoYXQgaXQgaXMgc1JHQlxuXHRpZih0YWJzW1wic1JHQlwiXSE9bnVsbCkge1xuXHRcdHdVaShkYXRhLG9mZnNldCwgMSk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdHdBcyhkYXRhLG9mZnNldCxcInNSR0JcIik7ICBvZmZzZXQrPTQ7XG5cdFx0ZGF0YVtvZmZzZXRdID0gdGFic1tcInNSR0JcIl07ICBvZmZzZXQrKztcblx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTUsNSkpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblx0fVxuXHRpZih0YWJzW1wicEhZc1wiXSE9bnVsbCkge1xuXHRcdHdVaShkYXRhLG9mZnNldCwgOSk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdHdBcyhkYXRhLG9mZnNldCxcInBIWXNcIik7ICBvZmZzZXQrPTQ7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCB0YWJzW1wicEhZc1wiXVswXSk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdHdVaShkYXRhLG9mZnNldCwgdGFic1tcInBIWXNcIl1bMV0pOyAgICAgIG9mZnNldCs9NDtcblx0XHRkYXRhW29mZnNldF09dGFic1tcInBIWXNcIl1bMl07XHRcdFx0b2Zmc2V0Kys7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC0xMywxMykpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblx0fVxuXG5cdGlmKGFuaW0pIHtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIDgpOyAgICAgIG9mZnNldCs9NDtcblx0XHR3QXMoZGF0YSxvZmZzZXQsXCJhY1RMXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdHdVaShkYXRhLG9mZnNldCwgbmltZy5mcmFtZXMubGVuZ3RoKTsgICAgIG9mZnNldCs9NDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIHRhYnNbXCJsb29wXCJdIT1udWxsP3RhYnNbXCJsb29wXCJdOjApOyAgICAgIG9mZnNldCs9NDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTEyLDEyKSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHR9XG5cblx0aWYobmltZy5jdHlwZT09Mykge1xuXHRcdHZhciBkbCA9IG5pbWcucGx0ZS5sZW5ndGg7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCBkbCozKTsgIG9mZnNldCs9NDtcblx0XHR3QXMoZGF0YSxvZmZzZXQsXCJQTFRFXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdGZvcih2YXIgaT0wOyBpPGRsOyBpKyspe1xuXHRcdFx0dmFyIHRpPWkqMywgYz1uaW1nLnBsdGVbaV0sIHI9KGMpJjI1NSwgZz0oYz4+PjgpJjI1NSwgYj0oYz4+PjE2KSYyNTU7XG5cdFx0XHRkYXRhW29mZnNldCt0aSswXT1yOyAgZGF0YVtvZmZzZXQrdGkrMV09ZzsgIGRhdGFbb2Zmc2V0K3RpKzJdPWI7XG5cdFx0fVxuXHRcdG9mZnNldCs9ZGwqMztcblx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LWRsKjMtNCxkbCozKzQpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cblx0XHRpZihwbHRBbHBoYSkge1xuXHRcdFx0d1VpKGRhdGEsb2Zmc2V0LCBkbCk7ICBvZmZzZXQrPTQ7XG5cdFx0XHR3QXMoZGF0YSxvZmZzZXQsXCJ0Uk5TXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8ZGw7IGkrKykgIGRhdGFbb2Zmc2V0K2ldPShuaW1nLnBsdGVbaV0+Pj4yNCkmMjU1O1xuXHRcdFx0b2Zmc2V0Kz1kbDtcblx0XHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtZGwtNCxkbCs0KSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHRcdH1cblx0fVxuXHRcblx0dmFyIGZpID0gMDtcblx0Zm9yKHZhciBqPTA7IGo8bmltZy5mcmFtZXMubGVuZ3RoOyBqKyspXG5cdHtcblx0XHR2YXIgZnIgPSBuaW1nLmZyYW1lc1tqXTtcblx0XHRpZihhbmltKSB7XG5cdFx0XHR3VWkoZGF0YSwgb2Zmc2V0LCAyNik7ICAgICBvZmZzZXQrPTQ7XG5cdFx0XHR3QXMoZGF0YSwgb2Zmc2V0LFwiZmNUTFwiKTsgIG9mZnNldCs9NDtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIGZpKyspOyAgIG9mZnNldCs9NDtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIGZyLnJlY3Qud2lkdGggKTsgICBvZmZzZXQrPTQ7XG5cdFx0XHR3VWkoZGF0YSwgb2Zmc2V0LCBmci5yZWN0LmhlaWdodCk7ICAgb2Zmc2V0Kz00O1xuXHRcdFx0d1VpKGRhdGEsIG9mZnNldCwgZnIucmVjdC54KTsgICBvZmZzZXQrPTQ7XG5cdFx0XHR3VWkoZGF0YSwgb2Zmc2V0LCBmci5yZWN0LnkpOyAgIG9mZnNldCs9NDtcblx0XHRcdHdVcyhkYXRhLCBvZmZzZXQsIGRlbHNbal0pOyAgIG9mZnNldCs9Mjtcblx0XHRcdHdVcyhkYXRhLCBvZmZzZXQsICAxMDAwKTsgICBvZmZzZXQrPTI7XG5cdFx0XHRkYXRhW29mZnNldF0gPSBmci5kaXNwb3NlOyAgb2Zmc2V0Kys7XHQvLyBkaXNwb3NlXG5cdFx0XHRkYXRhW29mZnNldF0gPSBmci5ibGVuZCAgOyAgb2Zmc2V0Kys7XHQvLyBibGVuZFxuXHRcdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC0zMCwzMCkpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblx0XHR9XG5cdFx0XHRcdFxuXHRcdHZhciBpbWdkID0gZnIuY2ltZywgZGwgPSBpbWdkLmxlbmd0aDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIGRsKyhqPT0wPzA6NCkpOyAgICAgb2Zmc2V0Kz00O1xuXHRcdHZhciBpb2ZmID0gb2Zmc2V0O1xuXHRcdHdBcyhkYXRhLG9mZnNldCwoaj09MCk/XCJJREFUXCI6XCJmZEFUXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdGlmKGohPTApIHsgIHdVaShkYXRhLCBvZmZzZXQsIGZpKyspOyAgb2Zmc2V0Kz00OyAgfVxuXHRcdGRhdGEuc2V0KGltZ2Qsb2Zmc2V0KTtcblx0XHRvZmZzZXQgKz0gZGw7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLGlvZmYsb2Zmc2V0LWlvZmYpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cdH1cblxuXHR3VWkoZGF0YSxvZmZzZXQsIDApOyAgICAgb2Zmc2V0Kz00O1xuXHR3QXMoZGF0YSxvZmZzZXQsXCJJRU5EXCIpOyAgb2Zmc2V0Kz00O1xuXHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTQsNCkpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblxuXHRyZXR1cm4gZGF0YS5idWZmZXI7XG59XG5cblVQTkcuZW5jb2RlLmNvbXByZXNzUE5HID0gZnVuY3Rpb24ob3V0LCBmaWx0ZXIsIGxldmVsWmVybykge1xuXHRmb3IodmFyIGk9MDsgaTxvdXQuZnJhbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGZybSA9IG91dC5mcmFtZXNbaV0sIG53PWZybS5yZWN0LndpZHRoLCBuaD1mcm0ucmVjdC5oZWlnaHQ7XG5cdFx0dmFyIGZkYXRhID0gbmV3IFVpbnQ4QXJyYXkobmgqZnJtLmJwbCtuaCk7XG5cdFx0ZnJtLmNpbWcgPSBVUE5HLmVuY29kZS5fZmlsdGVyWmVybyhmcm0uaW1nLG5oLGZybS5icHAsZnJtLmJwbCxmZGF0YSwgZmlsdGVyLCBsZXZlbFplcm8pO1xuXHR9XG59XG5cblxuXG5VUE5HLmVuY29kZS5jb21wcmVzcyA9IGZ1bmN0aW9uKGJ1ZnMsIHcsIGgsIHBzLCBwcm1zKSAvLyBwcm1zOiAgb25seUJsZW5kLCBtaW5CaXRzLCBmb3JiaWRQbHRlXG57XG5cdC8vdmFyIHRpbWUgPSBEYXRlLm5vdygpO1xuXHR2YXIgb25seUJsZW5kID0gcHJtc1swXSwgZXZlbkNyZCA9IHBybXNbMV0sIGZvcmJpZFByZXYgPSBwcm1zWzJdLCBtaW5CaXRzID0gcHJtc1szXSwgZm9yYmlkUGx0ZSA9IHBybXNbNF07XG5cdFxuXHR2YXIgY3R5cGUgPSA2LCBkZXB0aCA9IDgsIGFscGhhQW5kPTI1NVxuXHRcblx0Zm9yKHZhciBqPTA7IGo8YnVmcy5sZW5ndGg7IGorKykgIHsgIC8vIHdoZW4gbm90IHF1YW50aXplZCwgb3RoZXIgZnJhbWVzIGNhbiBjb250YWluIGNvbG9ycywgdGhhdCBhcmUgbm90IGluIGFuIGluaXRpYWwgZnJhbWVcblx0XHR2YXIgaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnVmc1tqXSksIGlsZW4gPSBpbWcubGVuZ3RoO1xuXHRcdGZvcih2YXIgaT0wOyBpPGlsZW47IGkrPTQpIGFscGhhQW5kICY9IGltZ1tpKzNdO1xuXHR9XG5cdHZhciBnb3RBbHBoYSA9IChhbHBoYUFuZCE9MjU1KTtcblx0XG5cdC8vY29uc29sZS5sb2coXCJhbHBoYSBjaGVja1wiLCBEYXRlLm5vdygpLXRpbWUpOyAgdGltZSA9IERhdGUubm93KCk7XG5cdFxuXHQvL3ZhciBicnV0ZSA9IGdvdEFscGhhICYmIGZvckdJRjtcdFx0Ly8gYnJ1dGUgOiBmcmFtZXMgY2FuIG9ubHkgYmUgY29waWVkLCBub3QgXCJibGVuZGVkXCJcblx0dmFyIGZybXMgPSBVUE5HLmVuY29kZS5mcmFtaXplKGJ1ZnMsIHcsIGgsIG9ubHlCbGVuZCwgZXZlbkNyZCwgZm9yYmlkUHJldik7XG5cdC8vY29uc29sZS5sb2coXCJmcmFtaXplXCIsIERhdGUubm93KCktdGltZSk7ICB0aW1lID0gRGF0ZS5ub3coKTtcblx0XG5cdHZhciBjbWFwPXt9LCBwbHRlPVtdLCBpbmRzPVtdOyAgXG5cdFxuXHRpZihwcyE9MCkge1xuXHRcdHZhciBuYnVmcyA9IFtdOyAgZm9yKHZhciBpPTA7IGk8ZnJtcy5sZW5ndGg7IGkrKykgbmJ1ZnMucHVzaChmcm1zW2ldLmltZy5idWZmZXIpO1xuXHRcdFxuXHRcdHZhciBhYnVmID0gVVBORy5lbmNvZGUuY29uY2F0UkdCQShuYnVmcyksIHFyZXMgPSBVUE5HLnF1YW50aXplKGFidWYsIHBzKTsgIFxuXHRcdHZhciBjb2YgPSAwLCBiYiA9IG5ldyBVaW50OEFycmF5KHFyZXMuYWJ1Zik7XG5cdFx0Zm9yKHZhciBpPTA7IGk8ZnJtcy5sZW5ndGg7IGkrKykgeyAgdmFyIHRpPWZybXNbaV0uaW1nLCBibG49dGkubGVuZ3RoOyAgaW5kcy5wdXNoKG5ldyBVaW50OEFycmF5KHFyZXMuaW5kcy5idWZmZXIsIGNvZj4+MiwgYmxuPj4yKSk7XG5cdFx0XHRmb3IodmFyIGo9MDsgajxibG47IGorPTQpIHsgIHRpW2pdPWJiW2NvZitqXTsgIHRpW2orMV09YmJbY29mK2orMV07ICB0aVtqKzJdPWJiW2NvZitqKzJdOyAgdGlbaiszXT1iYltjb2YraiszXTsgIH0gICAgY29mKz1ibG47ICB9XG5cdFx0XG5cdFx0Zm9yKHZhciBpPTA7IGk8cXJlcy5wbHRlLmxlbmd0aDsgaSsrKSBwbHRlLnB1c2gocXJlcy5wbHRlW2ldLmVzdC5yZ2JhKTtcblx0XHQvL2NvbnNvbGUubG9nKFwicXVhbnRpemVcIiwgRGF0ZS5ub3coKS10aW1lKTsgIHRpbWUgPSBEYXRlLm5vdygpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIHdoYXQgaWYgcHM9PTAsIGJ1dCB0aGVyZSBhcmUgPD0yNTYgY29sb3JzPyAgd2Ugc3RpbGwgbmVlZCB0byBkZXRlY3QsIGlmIHRoZSBwYWxldHRlIGNvdWxkIGJlIHVzZWRcblx0XHRmb3IodmFyIGo9MDsgajxmcm1zLmxlbmd0aDsgaisrKSAgeyAgLy8gd2hlbiBub3QgcXVhbnRpemVkLCBvdGhlciBmcmFtZXMgY2FuIGNvbnRhaW4gY29sb3JzLCB0aGF0IGFyZSBub3QgaW4gYW4gaW5pdGlhbCBmcmFtZVxuXHRcdFx0dmFyIGZybSA9IGZybXNbal0sIGltZzMyID0gbmV3IFVpbnQzMkFycmF5KGZybS5pbWcuYnVmZmVyKSwgbnc9ZnJtLnJlY3Qud2lkdGgsIGlsZW4gPSBpbWczMi5sZW5ndGg7XG5cdFx0XHR2YXIgaW5kID0gbmV3IFVpbnQ4QXJyYXkoaWxlbik7ICBpbmRzLnB1c2goaW5kKTtcblx0XHRcdGZvcih2YXIgaT0wOyBpPGlsZW47IGkrKykge1xuXHRcdFx0XHR2YXIgYyA9IGltZzMyW2ldO1xuXHRcdFx0XHRpZiAgICAgKGkhPTAgJiYgYz09aW1nMzJbaS0gMV0pIGluZFtpXT1pbmRbaS0xXTtcblx0XHRcdFx0ZWxzZSBpZihpPm53ICYmIGM9PWltZzMyW2ktbnddKSBpbmRbaV09aW5kW2ktbnddO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR2YXIgY21jID0gY21hcFtjXTtcblx0XHRcdFx0XHRpZihjbWM9PW51bGwpIHsgIGNtYXBbY109Y21jPXBsdGUubGVuZ3RoOyAgcGx0ZS5wdXNoKGMpOyAgaWYocGx0ZS5sZW5ndGg+PTMwMCkgYnJlYWs7ICB9XG5cdFx0XHRcdFx0aW5kW2ldPWNtYztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvL2NvbnNvbGUubG9nKFwibWFrZSBwYWxldHRlXCIsIERhdGUubm93KCktdGltZSk7ICB0aW1lID0gRGF0ZS5ub3coKTtcblx0fVxuXHRcblx0dmFyIGNjPXBsdGUubGVuZ3RoOyAvL2NvbnNvbGUubG9nKFwiY29sb3JzOlwiLGNjKTtcblx0aWYoY2M8PTI1NiAmJiBmb3JiaWRQbHRlPT1mYWxzZSkge1xuXHRcdGlmKGNjPD0gMikgZGVwdGg9MTsgIGVsc2UgaWYoY2M8PSA0KSBkZXB0aD0yOyAgZWxzZSBpZihjYzw9MTYpIGRlcHRoPTQ7ICBlbHNlIGRlcHRoPTg7XG5cdFx0ZGVwdGggPSAgTWF0aC5tYXgoZGVwdGgsIG1pbkJpdHMpO1xuXHR9XG5cdFxuXHRmb3IodmFyIGo9MDsgajxmcm1zLmxlbmd0aDsgaisrKVxuXHR7XG5cdFx0dmFyIGZybSA9IGZybXNbal0sIG54PWZybS5yZWN0LngsIG55PWZybS5yZWN0LnksIG53PWZybS5yZWN0LndpZHRoLCBuaD1mcm0ucmVjdC5oZWlnaHQ7XG5cdFx0dmFyIGNpbWcgPSBmcm0uaW1nLCBjaW1nMzIgPSBuZXcgVWludDMyQXJyYXkoY2ltZy5idWZmZXIpO1xuXHRcdHZhciBicGwgPSA0Km53LCBicHA9NDtcblx0XHRpZihjYzw9MjU2ICYmIGZvcmJpZFBsdGU9PWZhbHNlKSB7XG5cdFx0XHRicGwgPSBNYXRoLmNlaWwoZGVwdGgqbncvOCk7XG5cdFx0XHR2YXIgbmltZyA9IG5ldyBVaW50OEFycmF5KGJwbCpuaCk7XG5cdFx0XHR2YXIgaW5qID0gaW5kc1tqXTtcblx0XHRcdGZvcih2YXIgeT0wOyB5PG5oOyB5KyspIHsgIHZhciBpPXkqYnBsLCBpaT15Km53O1xuXHRcdFx0XHRpZiAgICAgKGRlcHRoPT04KSBmb3IodmFyIHg9MDsgeDxudzsgeCsrKSBuaW1nW2krKHgpICAgXSAgID0gIChpbmpbaWkreF0gICAgICAgICAgICAgKTtcblx0XHRcdFx0ZWxzZSBpZihkZXB0aD09NCkgZm9yKHZhciB4PTA7IHg8bnc7IHgrKykgbmltZ1tpKyh4Pj4xKV0gIHw9ICAoaW5qW2lpK3hdPDwoNC0oeCYxKSo0KSk7XG5cdFx0XHRcdGVsc2UgaWYoZGVwdGg9PTIpIGZvcih2YXIgeD0wOyB4PG53OyB4KyspIG5pbWdbaSsoeD4+MildICB8PSAgKGlualtpaSt4XTw8KDYtKHgmMykqMikpO1xuXHRcdFx0XHRlbHNlIGlmKGRlcHRoPT0xKSBmb3IodmFyIHg9MDsgeDxudzsgeCsrKSBuaW1nW2krKHg+PjMpXSAgfD0gIChpbmpbaWkreF08PCg3LSh4JjcpKjEpKTtcblx0XHRcdH1cblx0XHRcdGNpbWc9bmltZzsgIGN0eXBlPTM7ICBicHA9MTtcblx0XHR9XG5cdFx0ZWxzZSBpZihnb3RBbHBoYT09ZmFsc2UgJiYgZnJtcy5sZW5ndGg9PTEpIHtcdC8vIHNvbWUgbmV4dCBcInJlZHVjZWRcIiBmcmFtZXMgbWF5IGNvbnRhaW4gYWxwaGEgZm9yIGJsZW5kaW5nXG5cdFx0XHR2YXIgbmltZyA9IG5ldyBVaW50OEFycmF5KG53Km5oKjMpLCBhcmVhPW53Km5oO1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7IHZhciB0aT1pKjMsIHFpPWkqNDsgIG5pbWdbdGldPWNpbWdbcWldOyAgbmltZ1t0aSsxXT1jaW1nW3FpKzFdOyAgbmltZ1t0aSsyXT1jaW1nW3FpKzJdOyAgfVxuXHRcdFx0Y2ltZz1uaW1nOyAgY3R5cGU9MjsgIGJwcD0zOyAgYnBsPTMqbnc7XG5cdFx0fVxuXHRcdGZybS5pbWc9Y2ltZzsgIGZybS5icGw9YnBsOyAgZnJtLmJwcD1icHA7XG5cdH1cblx0Ly9jb25zb2xlLmxvZyhcImNvbG9ycyA9PiBwYWxldHRlIGluZGljZXNcIiwgRGF0ZS5ub3coKS10aW1lKTsgIHRpbWUgPSBEYXRlLm5vdygpO1xuXHRcblx0cmV0dXJuIHtjdHlwZTpjdHlwZSwgZGVwdGg6ZGVwdGgsIHBsdGU6cGx0ZSwgZnJhbWVzOmZybXMgIH07XG59XG5VUE5HLmVuY29kZS5mcmFtaXplID0gZnVuY3Rpb24oYnVmcyx3LGgsYWx3YXlzQmxlbmQsZXZlbkNyZCxmb3JiaWRQcmV2KSB7XG5cdC8qICBESVNQT1NFXG5cdCAgICAtIDAgOiBubyBjaGFuZ2Vcblx0XHQtIDEgOiBjbGVhciB0byB0cmFuc3BhcmVudFxuXHRcdC0gMiA6IHJldHN0b3JlIHRvIGNvbnRlbnQgYmVmb3JlIHJlbmRlcmluZyAocHJldmlvdXMgZnJhbWUgZGlzcG9zZWQpXG5cdFx0QkxFTkRcblx0XHQtIDAgOiByZXBsYWNlXG5cdFx0LSAxIDogYmxlbmRcblx0Ki9cblx0dmFyIGZybXMgPSBbXTtcblx0Zm9yKHZhciBqPTA7IGo8YnVmcy5sZW5ndGg7IGorKykge1xuXHRcdHZhciBjaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnVmc1tqXSksIGNpbWczMiA9IG5ldyBVaW50MzJBcnJheShjaW1nLmJ1ZmZlcik7XG5cdFx0dmFyIG5pbWc7XG5cdFx0XG5cdFx0dmFyIG54PTAsIG55PTAsIG53PXcsIG5oPWgsIGJsZW5kPWFsd2F5c0JsZW5kPzE6MDtcblx0XHRpZihqIT0wKSB7XG5cdFx0XHR2YXIgdGxpbSA9IChmb3JiaWRQcmV2IHx8IGFsd2F5c0JsZW5kIHx8IGo9PTEgfHwgZnJtc1tqLTJdLmRpc3Bvc2UhPTApPzE6MiwgdHN0cCA9IDAsIHRhcmVhID0gMWU5O1xuXHRcdFx0Zm9yKHZhciBpdD0wOyBpdDx0bGltOyBpdCsrKVxuXHRcdFx0e1xuXHRcdFx0XHR2YXIgcGltZyA9IG5ldyBVaW50OEFycmF5KGJ1ZnNbai0xLWl0XSksIHAzMiA9IG5ldyBVaW50MzJBcnJheShidWZzW2otMS1pdF0pO1xuXHRcdFx0XHR2YXIgbWl4PXcsbWl5PWgsbWF4PS0xLG1heT0tMTtcblx0XHRcdFx0Zm9yKHZhciB5PTA7IHk8aDsgeSsrKSBmb3IodmFyIHg9MDsgeDx3OyB4KyspIHtcblx0XHRcdFx0XHR2YXIgaSA9IHkqdyt4O1xuXHRcdFx0XHRcdGlmKGNpbWczMltpXSE9cDMyW2ldKSB7XG5cdFx0XHRcdFx0XHRpZih4PG1peCkgbWl4PXg7ICBpZih4Pm1heCkgbWF4PXg7XG5cdFx0XHRcdFx0XHRpZih5PG1peSkgbWl5PXk7ICBpZih5Pm1heSkgbWF5PXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKG1heD09LTEpIG1peD1taXk9bWF4PW1heT0wO1xuXHRcdFx0XHRpZihldmVuQ3JkKSB7ICBpZigobWl4JjEpPT0xKW1peC0tOyAgaWYoKG1peSYxKT09MSltaXktLTsgIH1cblx0XHRcdFx0dmFyIHNhcmVhID0gKG1heC1taXgrMSkqKG1heS1taXkrMSk7XG5cdFx0XHRcdGlmKHNhcmVhPHRhcmVhKSB7XG5cdFx0XHRcdFx0dGFyZWEgPSBzYXJlYTsgIHRzdHAgPSBpdDtcblx0XHRcdFx0XHRueCA9IG1peDsgbnkgPSBtaXk7IG53ID0gbWF4LW1peCsxOyBuaCA9IG1heS1taXkrMTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHQvLyBhbHdheXNCbGVuZDogcG9rdWQgemppc3TDrW0sIMW+ZSBibGVuZGl0IG5lbHplLCBuYXN0YXbDrW0gcMWZZWRjaG96w61tdSBzbsOtbWt1IGRpc3Bvc2U9MS4gWmFqaXN0w61tLCBhYnkgb2JzYWhvdmFsIG3Fr2ogb2Jkw6lsbsOtay5cblx0XHRcdHZhciBwaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnVmc1tqLTEtdHN0cF0pO1xuXHRcdFx0aWYodHN0cD09MSkgZnJtc1tqLTFdLmRpc3Bvc2UgPSAyO1xuXHRcdFx0XG5cdFx0XHRuaW1nID0gbmV3IFVpbnQ4QXJyYXkobncqbmgqNCk7XG5cdFx0XHRVUE5HLl9jb3B5VGlsZShwaW1nLHcsaCwgbmltZyxudyxuaCwgLW54LC1ueSwgMCk7XG5cdFx0XHRcblx0XHRcdGJsZW5kID0gIFVQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBuaW1nLG53LG5oLCAtbngsLW55LCAzKSA/IDEgOiAwO1xuXHRcdFx0aWYoYmxlbmQ9PTEpIFVQTkcuZW5jb2RlLl9wcmVwYXJlRGlmZihjaW1nLHcsaCxuaW1nLHt4Om54LHk6bnksd2lkdGg6bncsaGVpZ2h0Om5ofSk7XG5cdFx0XHRlbHNlICAgICAgICAgVVBORy5fY29weVRpbGUoY2ltZyx3LGgsIG5pbWcsbncsbmgsIC1ueCwtbnksIDApO1xuXHRcdFx0Ly9VUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgbmltZyxudyxuaCwgLW54LC1ueSwgYmxlbmQ9PTE/MjowKTtcblx0XHR9XG5cdFx0ZWxzZSBuaW1nID0gY2ltZy5zbGljZSgwKTtcdC8vIGltZyBtYXkgYmUgcmV3cml0dGVuIGZ1cnRoZXIgLi4uIGRvbid0IHJld3JpdGUgaW5wdXRcblx0XHRcblx0XHRmcm1zLnB1c2goe3JlY3Q6e3g6bngseTpueSx3aWR0aDpudyxoZWlnaHQ6bmh9LCBpbWc6bmltZywgYmxlbmQ6YmxlbmQsIGRpc3Bvc2U6MH0pO1xuXHR9XG5cdFxuXHRcblx0aWYoYWx3YXlzQmxlbmQpIGZvcih2YXIgaj0wOyBqPGZybXMubGVuZ3RoOyBqKyspIHtcblx0XHR2YXIgZnJtID0gZnJtc1tqXTsgIGlmKGZybS5ibGVuZD09MSkgY29udGludWU7XG5cdFx0dmFyIHIwID0gZnJtLnJlY3QsIHIxID0gZnJtc1tqLTFdLnJlY3Rcblx0XHR2YXIgbWlYID0gTWF0aC5taW4ocjAueCwgcjEueCksIG1pWSA9IE1hdGgubWluKHIwLnksIHIxLnkpO1xuXHRcdHZhciBtYVggPSBNYXRoLm1heChyMC54K3IwLndpZHRoLCByMS54K3IxLndpZHRoKSwgbWFZID0gTWF0aC5tYXgocjAueStyMC5oZWlnaHQsIHIxLnkrcjEuaGVpZ2h0KTtcblx0XHR2YXIgciA9IHt4Om1pWCwgeTptaVksIHdpZHRoOm1hWC1taVgsIGhlaWdodDptYVktbWlZfTtcblx0XHRcblx0XHRmcm1zW2otMV0uZGlzcG9zZSA9IDE7XG5cdFx0aWYoai0xIT0wKSBcblx0XHRVUE5HLmVuY29kZS5fdXBkYXRlRnJhbWUoYnVmcywgdyxoLGZybXMsIGotMSxyLCBldmVuQ3JkKTtcblx0XHRVUE5HLmVuY29kZS5fdXBkYXRlRnJhbWUoYnVmcywgdyxoLGZybXMsIGogICxyLCBldmVuQ3JkKTtcblx0fVxuXHR2YXIgYXJlYSA9IDA7XG5cdGlmKGJ1ZnMubGVuZ3RoIT0xKSBmb3IodmFyIGk9MDsgaTxmcm1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGZybSA9IGZybXNbaV07XG5cdFx0YXJlYSArPSBmcm0ucmVjdC53aWR0aCpmcm0ucmVjdC5oZWlnaHQ7XG5cdFx0Ly9pZihpPT0wIHx8IGZybS5ibGVuZCE9MSkgY29udGludWU7XG5cdFx0Ly92YXIgb2IgPSBuZXcgVWludDhBcnJheShcblx0XHQvL2NvbnNvbGUubG9nKGZybS5ibGVuZCwgZnJtLmRpc3Bvc2UsIGZybS5yZWN0KTtcblx0fVxuXHQvL2lmKGFyZWEhPTApIGNvbnNvbGUubG9nKGFyZWEpO1xuXHRyZXR1cm4gZnJtcztcbn1cblVQTkcuZW5jb2RlLl91cGRhdGVGcmFtZSA9IGZ1bmN0aW9uKGJ1ZnMsIHcsaCwgZnJtcywgaSwgciwgZXZlbkNyZCkge1xuXHR2YXIgVTggPSBVaW50OEFycmF5LCBVMzIgPSBVaW50MzJBcnJheTtcblx0dmFyIHBpbWcgPSBuZXcgVTgoYnVmc1tpLTFdKSwgcGltZzMyID0gbmV3IFUzMihidWZzW2ktMV0pLCBuaW1nID0gaSsxPGJ1ZnMubGVuZ3RoID8gbmV3IFU4KGJ1ZnNbaSsxXSk6bnVsbDtcblx0dmFyIGNpbWcgPSBuZXcgVTgoYnVmc1tpXSksIGNpbWczMiA9IG5ldyBVMzIoY2ltZy5idWZmZXIpO1xuXHRcblx0dmFyIG1peD13LG1peT1oLG1heD0tMSxtYXk9LTE7XG5cdGZvcih2YXIgeT0wOyB5PHIuaGVpZ2h0OyB5KyspIGZvcih2YXIgeD0wOyB4PHIud2lkdGg7IHgrKykge1xuXHRcdHZhciBjeCA9IHIueCt4LCBjeSA9IHIueSt5O1xuXHRcdHZhciBqID0gY3kqdytjeCwgY2MgPSBjaW1nMzJbal07XG5cdFx0Ly8gbm8gbmVlZCB0byBkcmF3IHRyYW5zcGFyZW5jeSwgb3IgdG8gZGlzcG9zZSBpdC4gT3IsIGlmIHdyaXRpbmcgdGhlIHNhbWUgY29sb3IgYW5kIHRoZSBuZXh0IG9uZSBkb2VzIG5vdCBuZWVkIHRyYW5zcGFyZW5jeS5cblx0XHRpZihjYz09MCB8fCAoZnJtc1tpLTFdLmRpc3Bvc2U9PTAgJiYgcGltZzMyW2pdPT1jYyAmJiAobmltZz09bnVsbCB8fCBuaW1nW2oqNCszXSE9MCkpLyoqLykge31cblx0XHRlbHNlIHtcblx0XHRcdGlmKGN4PG1peCkgbWl4PWN4OyAgaWYoY3g+bWF4KSBtYXg9Y3g7XG5cdFx0XHRpZihjeTxtaXkpIG1peT1jeTsgIGlmKGN5Pm1heSkgbWF5PWN5O1xuXHRcdH1cblx0fVxuXHRpZihtYXg9PS0xKSBtaXg9bWl5PW1heD1tYXk9MDtcblx0aWYoZXZlbkNyZCkgeyAgaWYoKG1peCYxKT09MSltaXgtLTsgIGlmKChtaXkmMSk9PTEpbWl5LS07ICB9XG5cdHIgPSB7eDptaXgsIHk6bWl5LCB3aWR0aDptYXgtbWl4KzEsIGhlaWdodDptYXktbWl5KzF9O1xuXHRcblx0dmFyIGZyID0gZnJtc1tpXTsgIGZyLnJlY3QgPSByOyAgZnIuYmxlbmQgPSAxOyAgZnIuaW1nID0gbmV3IFVpbnQ4QXJyYXkoci53aWR0aCpyLmhlaWdodCo0KTtcblx0aWYoZnJtc1tpLTFdLmRpc3Bvc2U9PTApIHtcblx0XHRVUE5HLl9jb3B5VGlsZShwaW1nLHcsaCwgZnIuaW1nLHIud2lkdGgsci5oZWlnaHQsIC1yLngsLXIueSwgMCk7XG5cdFx0VVBORy5lbmNvZGUuX3ByZXBhcmVEaWZmKGNpbWcsdyxoLGZyLmltZyxyKTtcblx0XHQvL1VQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBmci5pbWcsci53aWR0aCxyLmhlaWdodCwgLXIueCwtci55LCAyKTtcblx0fVxuXHRlbHNlXG5cdFx0VVBORy5fY29weVRpbGUoY2ltZyx3LGgsIGZyLmltZyxyLndpZHRoLHIuaGVpZ2h0LCAtci54LC1yLnksIDApO1xufVxuVVBORy5lbmNvZGUuX3ByZXBhcmVEaWZmID0gZnVuY3Rpb24oY2ltZywgdyxoLCBuaW1nLCByZWMpIHtcblx0VVBORy5fY29weVRpbGUoY2ltZyx3LGgsIG5pbWcscmVjLndpZHRoLHJlYy5oZWlnaHQsIC1yZWMueCwtcmVjLnksIDIpO1xuXHQvKlxuXHR2YXIgbjMyID0gbmV3IFVpbnQzMkFycmF5KG5pbWcuYnVmZmVyKTtcblx0dmFyIG9nID0gbmV3IFVpbnQ4QXJyYXkocmVjLndpZHRoKnJlYy5oZWlnaHQqNCksIG8zMiA9IG5ldyBVaW50MzJBcnJheShvZy5idWZmZXIpO1xuXHRVUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgb2cscmVjLndpZHRoLHJlYy5oZWlnaHQsIC1yZWMueCwtcmVjLnksIDApO1xuXHRmb3IodmFyIGk9NDsgaTxuaW1nLmxlbmd0aDsgaSs9NCkge1xuXHRcdGlmKG5pbWdbaS0xXSE9MCAmJiBuaW1nW2krM109PTAgJiYgbzMyW2k+Pj4yXT09bzMyWyhpPj4+MiktMV0pIHtcblx0XHRcdG4zMltpPj4+Ml09bzMyW2k+Pj4yXTtcblx0XHRcdC8vdmFyIGogPSBpLCBjPXAzMlsoaT4+PjIpLTFdO1xuXHRcdFx0Ly93aGlsZShwMzJbaj4+PjJdPT1jKSB7ICBuMzJbaj4+PjJdPWM7ICBqKz00OyAgfVxuXHRcdH1cblx0fVxuXHRmb3IodmFyIGk9bmltZy5sZW5ndGgtODsgaT4wOyBpLT00KSB7XG5cdFx0aWYobmltZ1tpKzddIT0wICYmIG5pbWdbaSszXT09MCAmJiBvMzJbaT4+PjJdPT1vMzJbKGk+Pj4yKSsxXSkge1xuXHRcdFx0bjMyW2k+Pj4yXT1vMzJbaT4+PjJdO1xuXHRcdFx0Ly92YXIgaiA9IGksIGM9cDMyWyhpPj4+MiktMV07XG5cdFx0XHQvL3doaWxlKHAzMltqPj4+Ml09PWMpIHsgIG4zMltqPj4+Ml09YzsgIGorPTQ7ICB9XG5cdFx0fVxuXHR9Ki9cbn1cblxuVVBORy5lbmNvZGUuX2ZpbHRlclplcm8gPSBmdW5jdGlvbihpbWcsaCxicHAsYnBsLGRhdGEsIGZpbHRlciwgbGV2ZWxaZXJvKVxue1xuXHR2YXIgZmxzID0gW10sIGZ0cnk9WzAsMSwyLDMsNF07XG5cdGlmICAgICAoZmlsdGVyIT0tMSkgICAgICAgICAgICAgZnRyeT1bZmlsdGVyXTtcblx0ZWxzZSBpZihoKmJwbD41MDAwMDAgfHwgYnBwPT0xKSBmdHJ5PVswXTtcblx0dmFyIG9wdHM7ICBpZihsZXZlbFplcm8pIG9wdHM9e2xldmVsOjB9O1xuXHRcblx0dmFyIENNUFIgPSAobGV2ZWxaZXJvICYmIFVaSVAhPW51bGwpID8gVVpJUCA6IHBha287XG5cdFxuXHRmb3IodmFyIGk9MDsgaTxmdHJ5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0Zm9yKHZhciB5PTA7IHk8aDsgeSsrKSBVUE5HLmVuY29kZS5fZmlsdGVyTGluZShkYXRhLCBpbWcsIHksIGJwbCwgYnBwLCBmdHJ5W2ldKTtcblx0XHQvL3ZhciBuaW1nID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuXHRcdC8vdmFyIHN6ID0gVVpJUC5GLmRlZmxhdGUoZGF0YSwgbmltZyk7ICBmbHMucHVzaChuaW1nLnNsaWNlKDAsc3opKTtcblx0XHQvL3ZhciBkZmwgPSBwYWtvW1wiZGVmbGF0ZVwiXShkYXRhKSwgZGw9ZGZsLmxlbmd0aC00O1xuXHRcdC8vdmFyIGNyYyA9IChkZmxbZGwrM108PDI0KXwoZGZsW2RsKzJdPDwxNil8KGRmbFtkbCsxXTw8OCl8KGRmbFtkbCswXTw8MCk7XG5cdFx0Ly9jb25zb2xlLmxvZyhjcmMsIFVaSVAuYWRsZXIoZGF0YSwyLGRhdGEubGVuZ3RoLTYpKTtcblx0XHRmbHMucHVzaChDTVBSW1wiZGVmbGF0ZVwiXShkYXRhLG9wdHMpKTtcblx0fVxuXHR2YXIgdGksIHRzaXplPTFlOTtcblx0Zm9yKHZhciBpPTA7IGk8ZmxzLmxlbmd0aDsgaSsrKSBpZihmbHNbaV0ubGVuZ3RoPHRzaXplKSB7ICB0aT1pOyAgdHNpemU9ZmxzW2ldLmxlbmd0aDsgIH1cblx0cmV0dXJuIGZsc1t0aV07XG59XG5VUE5HLmVuY29kZS5fZmlsdGVyTGluZSA9IGZ1bmN0aW9uKGRhdGEsIGltZywgeSwgYnBsLCBicHAsIHR5cGUpXG57XG5cdHZhciBpID0geSpicGwsIGRpID0gaSt5LCBwYWV0aCA9IFVQTkcuZGVjb2RlLl9wYWV0aFxuXHRkYXRhW2RpXT10eXBlOyAgZGkrKztcblxuXHRpZih0eXBlPT0wKSB7XG5cdFx0aWYoYnBsPDUwMCkgZm9yKHZhciB4PTA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSBpbWdbaSt4XTtcblx0XHRlbHNlIGRhdGEuc2V0KG5ldyBVaW50OEFycmF5KGltZy5idWZmZXIsaSxicGwpLGRpKTtcblx0fVxuXHRlbHNlIGlmKHR5cGU9PTEpIHtcblx0XHRmb3IodmFyIHg9ICAwOyB4PGJwcDsgeCsrKSBkYXRhW2RpK3hdID0gIGltZ1tpK3hdO1xuXHRcdGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0taW1nW2kreC1icHBdKzI1NikmMjU1O1xuXHR9XG5cdGVsc2UgaWYoeT09MCkge1xuXHRcdGZvcih2YXIgeD0gIDA7IHg8YnBwOyB4KyspIGRhdGFbZGkreF0gPSBpbWdbaSt4XTtcblxuXHRcdGlmKHR5cGU9PTIpIGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSBpbWdbaSt4XTtcblx0XHRpZih0eXBlPT0zKSBmb3IodmFyIHg9YnBwOyB4PGJwbDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdIC0gKGltZ1tpK3gtYnBwXT4+MSkgKzI1NikmMjU1O1xuXHRcdGlmKHR5cGU9PTQpIGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0gLSBwYWV0aChpbWdbaSt4LWJwcF0sIDAsIDApICsyNTYpJjI1NTtcblx0fVxuXHRlbHNlIHtcblx0XHRpZih0eXBlPT0yKSB7IGZvcih2YXIgeD0gIDA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0rMjU2IC0gaW1nW2kreC1icGxdKSYyNTU7ICB9XG5cdFx0aWYodHlwZT09MykgeyBmb3IodmFyIHg9ICAwOyB4PGJwcDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdKzI1NiAtIChpbWdbaSt4LWJwbF0+PjEpKSYyNTU7XG5cdFx0XHRcdFx0ICBmb3IodmFyIHg9YnBwOyB4PGJwbDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdKzI1NiAtICgoaW1nW2kreC1icGxdK2ltZ1tpK3gtYnBwXSk+PjEpKSYyNTU7ICB9XG5cdFx0aWYodHlwZT09NCkgeyBmb3IodmFyIHg9ICAwOyB4PGJwcDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdKzI1NiAtIHBhZXRoKDAsIGltZ1tpK3gtYnBsXSwgMCkpJjI1NTtcblx0XHRcdFx0XHQgIGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0rMjU2IC0gcGFldGgoaW1nW2kreC1icHBdLCBpbWdbaSt4LWJwbF0sIGltZ1tpK3gtYnBwLWJwbF0pKSYyNTU7ICB9XG5cdH1cbn1cblxuVVBORy5jcmMgPSB7XG5cdHRhYmxlIDogKCBmdW5jdGlvbigpIHtcblx0ICAgdmFyIHRhYiA9IG5ldyBVaW50MzJBcnJheSgyNTYpO1xuXHQgICBmb3IgKHZhciBuPTA7IG48MjU2OyBuKyspIHtcblx0XHRcdHZhciBjID0gbjtcblx0XHRcdGZvciAodmFyIGs9MDsgazw4OyBrKyspIHtcblx0XHRcdFx0aWYgKGMgJiAxKSAgYyA9IDB4ZWRiODgzMjAgXiAoYyA+Pj4gMSk7XG5cdFx0XHRcdGVsc2UgICAgICAgIGMgPSBjID4+PiAxO1xuXHRcdFx0fVxuXHRcdFx0dGFiW25dID0gYzsgIH1cblx0XHRyZXR1cm4gdGFiOyAgfSkoKSxcblx0dXBkYXRlIDogZnVuY3Rpb24oYywgYnVmLCBvZmYsIGxlbikge1xuXHRcdGZvciAodmFyIGk9MDsgaTxsZW47IGkrKykgIGMgPSBVUE5HLmNyYy50YWJsZVsoYyBeIGJ1ZltvZmYraV0pICYgMHhmZl0gXiAoYyA+Pj4gOCk7XG5cdFx0cmV0dXJuIGM7XG5cdH0sXG5cdGNyYyA6IGZ1bmN0aW9uKGIsbyxsKSAgeyAgcmV0dXJuIFVQTkcuY3JjLnVwZGF0ZSgweGZmZmZmZmZmLGIsbyxsKSBeIDB4ZmZmZmZmZmY7ICB9XG59XG5cblxuVVBORy5xdWFudGl6ZSA9IGZ1bmN0aW9uKGFidWYsIHBzKVxue1x0XG5cdHZhciBvaW1nID0gbmV3IFVpbnQ4QXJyYXkoYWJ1ZiksIG5pbWcgPSBvaW1nLnNsaWNlKDApLCBuaW1nMzIgPSBuZXcgVWludDMyQXJyYXkobmltZy5idWZmZXIpO1xuXHRcblx0dmFyIEtEID0gVVBORy5xdWFudGl6ZS5nZXRLRHRyZWUobmltZywgcHMpO1xuXHR2YXIgcm9vdCA9IEtEWzBdLCBsZWFmcyA9IEtEWzFdO1xuXHRcblx0dmFyIHBsYW5lRHN0ID0gVVBORy5xdWFudGl6ZS5wbGFuZURzdDtcblx0dmFyIHNiID0gb2ltZywgdGIgPSBuaW1nMzIsIGxlbj1zYi5sZW5ndGg7XG5cdFx0XG5cdHZhciBpbmRzID0gbmV3IFVpbnQ4QXJyYXkob2ltZy5sZW5ndGg+PjIpO1xuXHRmb3IodmFyIGk9MDsgaTxsZW47IGkrPTQpIHtcblx0XHR2YXIgcj1zYltpXSooMS8yNTUpLCBnPXNiW2krMV0qKDEvMjU1KSwgYj1zYltpKzJdKigxLzI1NSksIGE9c2JbaSszXSooMS8yNTUpO1xuXHRcdFxuXHRcdC8vICBleGFjdCwgYnV0IHRvbyBzbG93IDooXG5cdFx0dmFyIG5kID0gVVBORy5xdWFudGl6ZS5nZXROZWFyZXN0KHJvb3QsIHIsIGcsIGIsIGEpO1xuXHRcdC8vdmFyIG5kID0gcm9vdDtcblx0XHQvL3doaWxlKG5kLmxlZnQpIG5kID0gKHBsYW5lRHN0KG5kLmVzdCxyLGcsYixhKTw9MCkgPyBuZC5sZWZ0IDogbmQucmlnaHQ7XG5cdFx0XG5cdFx0aW5kc1tpPj4yXSA9IG5kLmluZDtcblx0XHR0YltpPj4yXSA9IG5kLmVzdC5yZ2JhO1xuXHR9XG5cdHJldHVybiB7ICBhYnVmOm5pbWcuYnVmZmVyLCBpbmRzOmluZHMsIHBsdGU6bGVhZnMgIH07XG59XG5cblVQTkcucXVhbnRpemUuZ2V0S0R0cmVlID0gZnVuY3Rpb24obmltZywgcHMsIGVycikge1xuXHRpZihlcnI9PW51bGwpIGVyciA9IDAuMDAwMTtcblx0dmFyIG5pbWczMiA9IG5ldyBVaW50MzJBcnJheShuaW1nLmJ1ZmZlcik7XG5cdFxuXHR2YXIgcm9vdCA9IHtpMDowLCBpMTpuaW1nLmxlbmd0aCwgYnN0Om51bGwsIGVzdDpudWxsLCB0ZHN0OjAsIGxlZnQ6bnVsbCwgcmlnaHQ6bnVsbCB9OyAgLy8gYmFzaWMgc3RhdGlzdGljLCBleHRyYSBzdGF0aXN0aWNcblx0cm9vdC5ic3QgPSBVUE5HLnF1YW50aXplLnN0YXRzKCAgbmltZyxyb290LmkwLCByb290LmkxICApOyAgcm9vdC5lc3QgPSBVUE5HLnF1YW50aXplLmVzdGF0cyggcm9vdC5ic3QgKTtcblx0dmFyIGxlYWZzID0gW3Jvb3RdO1xuXHRcblx0d2hpbGUobGVhZnMubGVuZ3RoPHBzKVxuXHR7XG5cdFx0dmFyIG1heEwgPSAwLCBtaT0wO1xuXHRcdGZvcih2YXIgaT0wOyBpPGxlYWZzLmxlbmd0aDsgaSsrKSBpZihsZWFmc1tpXS5lc3QuTCA+IG1heEwpIHsgIG1heEw9bGVhZnNbaV0uZXN0Lkw7ICBtaT1pOyAgfVxuXHRcdGlmKG1heEw8ZXJyKSBicmVhaztcblx0XHR2YXIgbm9kZSA9IGxlYWZzW21pXTtcblx0XHRcblx0XHR2YXIgczAgPSBVUE5HLnF1YW50aXplLnNwbGl0UGl4ZWxzKG5pbWcsbmltZzMyLCBub2RlLmkwLCBub2RlLmkxLCBub2RlLmVzdC5lLCBub2RlLmVzdC5lTXEyNTUpO1xuXHRcdHZhciBzMHdyb25nID0gKG5vZGUuaTA+PXMwIHx8IG5vZGUuaTE8PXMwKTtcblx0XHQvL2NvbnNvbGUubG9nKG1heEwsIGxlYWZzLmxlbmd0aCwgbWkpO1xuXHRcdGlmKHMwd3JvbmcpIHsgIG5vZGUuZXN0Lkw9MDsgIGNvbnRpbnVlOyAgfVxuXHRcdFxuXHRcdFxuXHRcdHZhciBsbiA9IHtpMDpub2RlLmkwLCBpMTpzMCwgYnN0Om51bGwsIGVzdDpudWxsLCB0ZHN0OjAsIGxlZnQ6bnVsbCwgcmlnaHQ6bnVsbCB9OyAgbG4uYnN0ID0gVVBORy5xdWFudGl6ZS5zdGF0cyggbmltZywgbG4uaTAsIGxuLmkxICk7ICBcblx0XHRsbi5lc3QgPSBVUE5HLnF1YW50aXplLmVzdGF0cyggbG4uYnN0ICk7XG5cdFx0dmFyIHJuID0ge2kwOnMwLCBpMTpub2RlLmkxLCBic3Q6bnVsbCwgZXN0Om51bGwsIHRkc3Q6MCwgbGVmdDpudWxsLCByaWdodDpudWxsIH07ICBybi5ic3QgPSB7UjpbXSwgbTpbXSwgTjpub2RlLmJzdC5OLWxuLmJzdC5OfTtcblx0XHRmb3IodmFyIGk9MDsgaTwxNjsgaSsrKSBybi5ic3QuUltpXSA9IG5vZGUuYnN0LlJbaV0tbG4uYnN0LlJbaV07XG5cdFx0Zm9yKHZhciBpPTA7IGk8IDQ7IGkrKykgcm4uYnN0Lm1baV0gPSBub2RlLmJzdC5tW2ldLWxuLmJzdC5tW2ldO1xuXHRcdHJuLmVzdCA9IFVQTkcucXVhbnRpemUuZXN0YXRzKCBybi5ic3QgKTtcblx0XHRcblx0XHRub2RlLmxlZnQgPSBsbjsgIG5vZGUucmlnaHQgPSBybjtcblx0XHRsZWFmc1ttaV09bG47ICBsZWFmcy5wdXNoKHJuKTtcblx0fVxuXHRsZWFmcy5zb3J0KGZ1bmN0aW9uKGEsYikgeyAgcmV0dXJuIGIuYnN0Lk4tYS5ic3QuTjsgIH0pO1xuXHRmb3IodmFyIGk9MDsgaTxsZWFmcy5sZW5ndGg7IGkrKykgbGVhZnNbaV0uaW5kPWk7XG5cdHJldHVybiBbcm9vdCwgbGVhZnNdO1xufVxuXG5VUE5HLnF1YW50aXplLmdldE5lYXJlc3QgPSBmdW5jdGlvbihuZCwgcixnLGIsYSlcbntcblx0aWYobmQubGVmdD09bnVsbCkgeyAgbmQudGRzdCA9IFVQTkcucXVhbnRpemUuZGlzdChuZC5lc3QucSxyLGcsYixhKTsgIHJldHVybiBuZDsgIH1cblx0dmFyIHBsYW5lRHN0ID0gVVBORy5xdWFudGl6ZS5wbGFuZURzdChuZC5lc3QscixnLGIsYSk7XG5cdFxuXHR2YXIgbm9kZTAgPSBuZC5sZWZ0LCBub2RlMSA9IG5kLnJpZ2h0O1xuXHRpZihwbGFuZURzdD4wKSB7ICBub2RlMD1uZC5yaWdodDsgIG5vZGUxPW5kLmxlZnQ7ICB9XG5cdFxuXHR2YXIgbG4gPSBVUE5HLnF1YW50aXplLmdldE5lYXJlc3Qobm9kZTAsIHIsZyxiLGEpO1xuXHRpZihsbi50ZHN0PD1wbGFuZURzdCpwbGFuZURzdCkgcmV0dXJuIGxuO1xuXHR2YXIgcm4gPSBVUE5HLnF1YW50aXplLmdldE5lYXJlc3Qobm9kZTEsIHIsZyxiLGEpO1xuXHRyZXR1cm4gcm4udGRzdDxsbi50ZHN0ID8gcm4gOiBsbjtcbn1cblVQTkcucXVhbnRpemUucGxhbmVEc3QgPSBmdW5jdGlvbihlc3QsIHIsZyxiLGEpIHsgIHZhciBlID0gZXN0LmU7ICByZXR1cm4gZVswXSpyICsgZVsxXSpnICsgZVsyXSpiICsgZVszXSphIC0gZXN0LmVNcTsgIH1cblVQTkcucXVhbnRpemUuZGlzdCAgICAgPSBmdW5jdGlvbihxLCAgIHIsZyxiLGEpIHsgIHZhciBkMD1yLXFbMF0sIGQxPWctcVsxXSwgZDI9Yi1xWzJdLCBkMz1hLXFbM107ICByZXR1cm4gZDAqZDArZDEqZDErZDIqZDIrZDMqZDM7ICB9XG5cblVQTkcucXVhbnRpemUuc3BsaXRQaXhlbHMgPSBmdW5jdGlvbihuaW1nLCBuaW1nMzIsIGkwLCBpMSwgZSwgZU1xKVxue1xuXHR2YXIgdmVjRG90ID0gVVBORy5xdWFudGl6ZS52ZWNEb3Q7XG5cdGkxLT00O1xuXHR2YXIgc2hmcyA9IDA7XG5cdHdoaWxlKGkwPGkxKVxuXHR7XG5cdFx0d2hpbGUodmVjRG90KG5pbWcsIGkwLCBlKTw9ZU1xKSBpMCs9NDtcblx0XHR3aGlsZSh2ZWNEb3QobmltZywgaTEsIGUpPiBlTXEpIGkxLT00O1xuXHRcdGlmKGkwPj1pMSkgYnJlYWs7XG5cdFx0XG5cdFx0dmFyIHQgPSBuaW1nMzJbaTA+PjJdOyAgbmltZzMyW2kwPj4yXSA9IG5pbWczMltpMT4+Ml07ICBuaW1nMzJbaTE+PjJdPXQ7XG5cdFx0XG5cdFx0aTArPTQ7ICBpMS09NDtcblx0fVxuXHR3aGlsZSh2ZWNEb3QobmltZywgaTAsIGUpPmVNcSkgaTAtPTQ7XG5cdHJldHVybiBpMCs0O1xufVxuVVBORy5xdWFudGl6ZS52ZWNEb3QgPSBmdW5jdGlvbihuaW1nLCBpLCBlKVxue1xuXHRyZXR1cm4gbmltZ1tpXSplWzBdICsgbmltZ1tpKzFdKmVbMV0gKyBuaW1nW2krMl0qZVsyXSArIG5pbWdbaSszXSplWzNdO1xufVxuVVBORy5xdWFudGl6ZS5zdGF0cyA9IGZ1bmN0aW9uKG5pbWcsIGkwLCBpMSl7XG5cdHZhciBSID0gWzAsMCwwLDAsICAwLDAsMCwwLCAgMCwwLDAsMCwgIDAsMCwwLDBdO1xuXHR2YXIgbSA9IFswLDAsMCwwXTtcblx0dmFyIE4gPSAoaTEtaTApPj4yO1xuXHRmb3IodmFyIGk9aTA7IGk8aTE7IGkrPTQpXG5cdHtcblx0XHR2YXIgciA9IG5pbWdbaV0qKDEvMjU1KSwgZyA9IG5pbWdbaSsxXSooMS8yNTUpLCBiID0gbmltZ1tpKzJdKigxLzI1NSksIGEgPSBuaW1nW2krM10qKDEvMjU1KTtcblx0XHQvL3ZhciByID0gbmltZ1tpXSwgZyA9IG5pbWdbaSsxXSwgYiA9IG5pbWdbaSsyXSwgYSA9IG5pbWdbaSszXTtcblx0XHRtWzBdKz1yOyAgbVsxXSs9ZzsgIG1bMl0rPWI7ICBtWzNdKz1hO1xuXHRcdFxuXHRcdFJbIDBdICs9IHIqcjsgIFJbIDFdICs9IHIqZzsgIFJbIDJdICs9IHIqYjsgIFJbIDNdICs9IHIqYTsgIFxuXHRcdCAgICAgICAgICAgICAgIFJbIDVdICs9IGcqZzsgIFJbIDZdICs9IGcqYjsgIFJbIDddICs9IGcqYTsgXG5cdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlsxMF0gKz0gYipiOyAgUlsxMV0gKz0gYiphOyAgXG5cdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlsxNV0gKz0gYSphOyAgXG5cdH1cblx0Uls0XT1SWzFdOyAgUls4XT1SWzJdOyAgUls5XT1SWzZdOyAgUlsxMl09UlszXTsgIFJbMTNdPVJbN107ICBSWzE0XT1SWzExXTtcblx0XG5cdHJldHVybiB7UjpSLCBtOm0sIE46Tn07XG59XG5VUE5HLnF1YW50aXplLmVzdGF0cyA9IGZ1bmN0aW9uKHN0YXRzKXtcblx0dmFyIFIgPSBzdGF0cy5SLCBtID0gc3RhdHMubSwgTiA9IHN0YXRzLk47XG5cdFxuXHQvLyB3aGVuIGFsbCBzYW1wbGVzIGFyZSBlcXVhbCwgYnV0IE4gaXMgbGFyZ2UgKG1pbGxpb25zKSwgdGhlIFJqIGNhbiBiZSBub24temVybyAoIDAuMDAwMy4uLi4gLSBwcmVjaXNzaW9uIGVycm9yKVxuXHR2YXIgbTAgPSBtWzBdLCBtMSA9IG1bMV0sIG0yID0gbVsyXSwgbTMgPSBtWzNdLCBpTiA9IChOPT0wID8gMCA6IDEvTik7XG5cdHZhciBSaiA9IFtcblx0XHRSWyAwXSAtIG0wKm0wKmlOLCAgUlsgMV0gLSBtMCptMSppTiwgIFJbIDJdIC0gbTAqbTIqaU4sICBSWyAzXSAtIG0wKm0zKmlOLCAgXG5cdFx0UlsgNF0gLSBtMSptMCppTiwgIFJbIDVdIC0gbTEqbTEqaU4sICBSWyA2XSAtIG0xKm0yKmlOLCAgUlsgN10gLSBtMSptMyppTixcblx0XHRSWyA4XSAtIG0yKm0wKmlOLCAgUlsgOV0gLSBtMiptMSppTiwgIFJbMTBdIC0gbTIqbTIqaU4sICBSWzExXSAtIG0yKm0zKmlOLCAgXG5cdFx0UlsxMl0gLSBtMyptMCppTiwgIFJbMTNdIC0gbTMqbTEqaU4sICBSWzE0XSAtIG0zKm0yKmlOLCAgUlsxNV0gLSBtMyptMyppTiBcblx0XTtcblx0XG5cdHZhciBBID0gUmosIE0gPSBVUE5HLk00O1xuXHR2YXIgYiA9IFswLjUsMC41LDAuNSwwLjVdLCBtaSA9IDAsIHRtaSA9IDA7XG5cdFxuXHRpZihOIT0wKVxuXHRmb3IodmFyIGk9MDsgaTwxMDsgaSsrKSB7XG5cdFx0YiA9IE0ubXVsdFZlYyhBLCBiKTsgIHRtaSA9IE1hdGguc3FydChNLmRvdChiLGIpKTsgIGIgPSBNLnNtbCgxL3RtaSwgIGIpO1xuXHRcdGlmKE1hdGguYWJzKHRtaS1taSk8MWUtOSkgYnJlYWs7ICBtaSA9IHRtaTtcblx0fVx0XG5cdC8vYiA9IFswLDAsMSwwXTsgIG1pPU47XG5cdHZhciBxID0gW20wKmlOLCBtMSppTiwgbTIqaU4sIG0zKmlOXTtcblx0dmFyIGVNcTI1NSA9IE0uZG90KE0uc21sKDI1NSxxKSxiKTtcblx0XG5cdHJldHVybiB7ICBDb3Y6UmosIHE6cSwgZTpiLCBMOm1pLCAgZU1xMjU1OmVNcTI1NSwgZU1xIDogTS5kb3QoYixxKSxcblx0XHRcdFx0cmdiYTogKCgoTWF0aC5yb3VuZCgyNTUqcVszXSk8PDI0KSB8IChNYXRoLnJvdW5kKDI1NSpxWzJdKTw8MTYpIHwgIChNYXRoLnJvdW5kKDI1NSpxWzFdKTw8OCkgfCAoTWF0aC5yb3VuZCgyNTUqcVswXSk8PDApKT4+PjApICB9O1xufVxuVVBORy5NNCA9IHtcblx0bXVsdFZlYyA6IGZ1bmN0aW9uKG0sdikge1xuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bVsgMF0qdlswXSArIG1bIDFdKnZbMV0gKyBtWyAyXSp2WzJdICsgbVsgM10qdlszXSxcblx0XHRcdFx0bVsgNF0qdlswXSArIG1bIDVdKnZbMV0gKyBtWyA2XSp2WzJdICsgbVsgN10qdlszXSxcblx0XHRcdFx0bVsgOF0qdlswXSArIG1bIDldKnZbMV0gKyBtWzEwXSp2WzJdICsgbVsxMV0qdlszXSxcblx0XHRcdFx0bVsxMl0qdlswXSArIG1bMTNdKnZbMV0gKyBtWzE0XSp2WzJdICsgbVsxNV0qdlszXVxuXHRcdFx0XTtcblx0fSxcblx0ZG90IDogZnVuY3Rpb24oeCx5KSB7ICByZXR1cm4gIHhbMF0qeVswXSt4WzFdKnlbMV0reFsyXSp5WzJdK3hbM10qeVszXTsgIH0sXG5cdHNtbCA6IGZ1bmN0aW9uKGEseSkgeyAgcmV0dXJuIFthKnlbMF0sYSp5WzFdLGEqeVsyXSxhKnlbM11dOyAgfVxufVxuXG5VUE5HLmVuY29kZS5jb25jYXRSR0JBID0gZnVuY3Rpb24oYnVmcykge1xuXHR2YXIgdGxlbiA9IDA7XG5cdGZvcih2YXIgaT0wOyBpPGJ1ZnMubGVuZ3RoOyBpKyspIHRsZW4gKz0gYnVmc1tpXS5ieXRlTGVuZ3RoO1xuXHR2YXIgbmltZyA9IG5ldyBVaW50OEFycmF5KHRsZW4pLCBub2ZmPTA7XG5cdGZvcih2YXIgaT0wOyBpPGJ1ZnMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnVmc1tpXSksIGlsID0gaW1nLmxlbmd0aDtcblx0XHRmb3IodmFyIGo9MDsgajxpbDsgais9NCkgeyAgXG5cdFx0XHR2YXIgcj1pbWdbal0sIGc9aW1nW2orMV0sIGI9aW1nW2orMl0sIGEgPSBpbWdbaiszXTtcblx0XHRcdGlmKGE9PTApIHI9Zz1iPTA7XG5cdFx0XHRuaW1nW25vZmYral09cjsgIG5pbWdbbm9mZitqKzFdPWc7ICBuaW1nW25vZmYraisyXT1iOyAgbmltZ1tub2ZmK2orM109YTsgIH1cblx0XHRub2ZmICs9IGlsO1xuXHR9XG5cdHJldHVybiBuaW1nLmJ1ZmZlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVVBORztcblxuIiwidmFyIGdldERlZmF1bHRQYXJlbnQgPSBmdW5jdGlvbiAob3JpZ2luYWxUYXJnZXQpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHNhbXBsZVRhcmdldCA9IEFycmF5LmlzQXJyYXkob3JpZ2luYWxUYXJnZXQpID8gb3JpZ2luYWxUYXJnZXRbMF0gOiBvcmlnaW5hbFRhcmdldDtcbiAgICByZXR1cm4gc2FtcGxlVGFyZ2V0Lm93bmVyRG9jdW1lbnQuYm9keTtcbn07XG52YXIgY291bnRlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG52YXIgdW5jb250cm9sbGVkTm9kZXMgPSBuZXcgV2Vha01hcCgpO1xudmFyIG1hcmtlck1hcCA9IHt9O1xudmFyIGxvY2tDb3VudCA9IDA7XG52YXIgdW53cmFwSG9zdCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgKG5vZGUuaG9zdCB8fCB1bndyYXBIb3N0KG5vZGUucGFyZW50Tm9kZSkpO1xufTtcbnZhciBjb3JyZWN0VGFyZ2V0cyA9IGZ1bmN0aW9uIChwYXJlbnQsIHRhcmdldHMpIHtcbiAgICByZXR1cm4gdGFyZ2V0c1xuICAgICAgICAubWFwKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgaWYgKHBhcmVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb3JyZWN0ZWRUYXJnZXQgPSB1bndyYXBIb3N0KHRhcmdldCk7XG4gICAgICAgIGlmIChjb3JyZWN0ZWRUYXJnZXQgJiYgcGFyZW50LmNvbnRhaW5zKGNvcnJlY3RlZFRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JyZWN0ZWRUYXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcignYXJpYS1oaWRkZW4nLCB0YXJnZXQsICdpbiBub3QgY29udGFpbmVkIGluc2lkZScsIHBhcmVudCwgJy4gRG9pbmcgbm90aGluZycpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KVxuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiBCb29sZWFuKHgpOyB9KTtcbn07XG4vKipcbiAqIE1hcmtzIGV2ZXJ5dGhpbmcgZXhjZXB0IGdpdmVuIG5vZGUob3Igbm9kZXMpIGFzIGFyaWEtaGlkZGVuXG4gKiBAcGFyYW0ge0VsZW1lbnQgfCBFbGVtZW50W119IG9yaWdpbmFsVGFyZ2V0IC0gZWxlbWVudHMgdG8ga2VlcCBvbiB0aGUgcGFnZVxuICogQHBhcmFtIFtwYXJlbnROb2RlXSAtIHRvcCBlbGVtZW50LCBkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5XG4gKiBAcGFyYW0ge1N0cmluZ30gW21hcmtlck5hbWVdIC0gYSBzcGVjaWFsIGF0dHJpYnV0ZSB0byBtYXJrIGV2ZXJ5IG5vZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBbY29udHJvbEF0dHJpYnV0ZV0gLSBodG1sIEF0dHJpYnV0ZSB0byBjb250cm9sXG4gKiBAcmV0dXJuIHtVbmRvfSB1bmRvIGNvbW1hbmRcbiAqL1xudmFyIGFwcGx5QXR0cmlidXRlVG9PdGhlcnMgPSBmdW5jdGlvbiAob3JpZ2luYWxUYXJnZXQsIHBhcmVudE5vZGUsIG1hcmtlck5hbWUsIGNvbnRyb2xBdHRyaWJ1dGUpIHtcbiAgICB2YXIgdGFyZ2V0cyA9IGNvcnJlY3RUYXJnZXRzKHBhcmVudE5vZGUsIEFycmF5LmlzQXJyYXkob3JpZ2luYWxUYXJnZXQpID8gb3JpZ2luYWxUYXJnZXQgOiBbb3JpZ2luYWxUYXJnZXRdKTtcbiAgICBpZiAoIW1hcmtlck1hcFttYXJrZXJOYW1lXSkge1xuICAgICAgICBtYXJrZXJNYXBbbWFya2VyTmFtZV0gPSBuZXcgV2Vha01hcCgpO1xuICAgIH1cbiAgICB2YXIgbWFya2VyQ291bnRlciA9IG1hcmtlck1hcFttYXJrZXJOYW1lXTtcbiAgICB2YXIgaGlkZGVuTm9kZXMgPSBbXTtcbiAgICB2YXIgZWxlbWVudHNUb0tlZXAgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGVsZW1lbnRzVG9TdG9wID0gbmV3IFNldCh0YXJnZXRzKTtcbiAgICB2YXIga2VlcCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICBpZiAoIWVsIHx8IGVsZW1lbnRzVG9LZWVwLmhhcyhlbCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50c1RvS2VlcC5hZGQoZWwpO1xuICAgICAgICBrZWVwKGVsLnBhcmVudE5vZGUpO1xuICAgIH07XG4gICAgdGFyZ2V0cy5mb3JFYWNoKGtlZXApO1xuICAgIHZhciBkZWVwID0gZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICBpZiAoIXBhcmVudCB8fCBlbGVtZW50c1RvU3RvcC5oYXMocGFyZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocGFyZW50LmNoaWxkcmVuLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRzVG9LZWVwLmhhcyhub2RlKSkge1xuICAgICAgICAgICAgICAgIGRlZXAobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ciA9IG5vZGUuZ2V0QXR0cmlidXRlKGNvbnRyb2xBdHRyaWJ1dGUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWxyZWFkeUhpZGRlbiA9IGF0dHIgIT09IG51bGwgJiYgYXR0ciAhPT0gJ2ZhbHNlJztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50ZXJWYWx1ZSA9IChjb3VudGVyTWFwLmdldChub2RlKSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXJWYWx1ZSA9IChtYXJrZXJDb3VudGVyLmdldChub2RlKSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJNYXAuc2V0KG5vZGUsIGNvdW50ZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlckNvdW50ZXIuc2V0KG5vZGUsIG1hcmtlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJWYWx1ZSA9PT0gMSAmJiBhbHJlYWR5SGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNvbnRyb2xsZWROb2Rlcy5zZXQobm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtlclZhbHVlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShtYXJrZXJOYW1lLCAndHJ1ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWxyZWFkeUhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSwgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdhcmlhLWhpZGRlbjogY2Fubm90IG9wZXJhdGUgb24gJywgbm9kZSwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGRlZXAocGFyZW50Tm9kZSk7XG4gICAgZWxlbWVudHNUb0tlZXAuY2xlYXIoKTtcbiAgICBsb2NrQ291bnQrKztcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBoaWRkZW5Ob2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICB2YXIgY291bnRlclZhbHVlID0gY291bnRlck1hcC5nZXQobm9kZSkgLSAxO1xuICAgICAgICAgICAgdmFyIG1hcmtlclZhbHVlID0gbWFya2VyQ291bnRlci5nZXQobm9kZSkgLSAxO1xuICAgICAgICAgICAgY291bnRlck1hcC5zZXQobm9kZSwgY291bnRlclZhbHVlKTtcbiAgICAgICAgICAgIG1hcmtlckNvdW50ZXIuc2V0KG5vZGUsIG1hcmtlclZhbHVlKTtcbiAgICAgICAgICAgIGlmICghY291bnRlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1bmNvbnRyb2xsZWROb2Rlcy5oYXMobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuY29udHJvbGxlZE5vZGVzLmRlbGV0ZShub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbWFya2VyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShtYXJrZXJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxvY2tDb3VudC0tO1xuICAgICAgICBpZiAoIWxvY2tDb3VudCkge1xuICAgICAgICAgICAgLy8gY2xlYXJcbiAgICAgICAgICAgIGNvdW50ZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgY291bnRlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB1bmNvbnRyb2xsZWROb2RlcyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICBtYXJrZXJNYXAgPSB7fTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuLyoqXG4gKiBNYXJrcyBldmVyeXRoaW5nIGV4Y2VwdCBnaXZlbiBub2RlKG9yIG5vZGVzKSBhcyBhcmlhLWhpZGRlblxuICogQHBhcmFtIHtFbGVtZW50IHwgRWxlbWVudFtdfSBvcmlnaW5hbFRhcmdldCAtIGVsZW1lbnRzIHRvIGtlZXAgb24gdGhlIHBhZ2VcbiAqIEBwYXJhbSBbcGFyZW50Tm9kZV0gLSB0b3AgZWxlbWVudCwgZGVmYXVsdHMgdG8gZG9jdW1lbnQuYm9keVxuICogQHBhcmFtIHtTdHJpbmd9IFttYXJrZXJOYW1lXSAtIGEgc3BlY2lhbCBhdHRyaWJ1dGUgdG8gbWFyayBldmVyeSBub2RlXG4gKiBAcmV0dXJuIHtVbmRvfSB1bmRvIGNvbW1hbmRcbiAqL1xuZXhwb3J0IHZhciBoaWRlT3RoZXJzID0gZnVuY3Rpb24gKG9yaWdpbmFsVGFyZ2V0LCBwYXJlbnROb2RlLCBtYXJrZXJOYW1lKSB7XG4gICAgaWYgKG1hcmtlck5hbWUgPT09IHZvaWQgMCkgeyBtYXJrZXJOYW1lID0gJ2RhdGEtYXJpYS1oaWRkZW4nOyB9XG4gICAgdmFyIHRhcmdldHMgPSBBcnJheS5mcm9tKEFycmF5LmlzQXJyYXkob3JpZ2luYWxUYXJnZXQpID8gb3JpZ2luYWxUYXJnZXQgOiBbb3JpZ2luYWxUYXJnZXRdKTtcbiAgICB2YXIgYWN0aXZlUGFyZW50Tm9kZSA9IHBhcmVudE5vZGUgfHwgZ2V0RGVmYXVsdFBhcmVudChvcmlnaW5hbFRhcmdldCk7XG4gICAgaWYgKCFhY3RpdmVQYXJlbnROb2RlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9O1xuICAgIH1cbiAgICAvLyB3ZSBzaG91bGQgbm90IGhpZGUgYXJpYUxpdmUgZWxlbWVudHMgLSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L2FyaWEtaGlkZGVuL2lzc3Vlcy8xMFxuICAgIHRhcmdldHMucHVzaC5hcHBseSh0YXJnZXRzLCBBcnJheS5mcm9tKGFjdGl2ZVBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnW2FyaWEtbGl2ZV0nKSkpO1xuICAgIHJldHVybiBhcHBseUF0dHJpYnV0ZVRvT3RoZXJzKHRhcmdldHMsIGFjdGl2ZVBhcmVudE5vZGUsIG1hcmtlck5hbWUsICdhcmlhLWhpZGRlbicpO1xufTtcbi8qKlxuICogTWFya3MgZXZlcnl0aGluZyBleGNlcHQgZ2l2ZW4gbm9kZShvciBub2RlcykgYXMgaW5lcnRcbiAqIEBwYXJhbSB7RWxlbWVudCB8IEVsZW1lbnRbXX0gb3JpZ2luYWxUYXJnZXQgLSBlbGVtZW50cyB0byBrZWVwIG9uIHRoZSBwYWdlXG4gKiBAcGFyYW0gW3BhcmVudE5vZGVdIC0gdG9wIGVsZW1lbnQsIGRlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBbbWFya2VyTmFtZV0gLSBhIHNwZWNpYWwgYXR0cmlidXRlIHRvIG1hcmsgZXZlcnkgbm9kZVxuICogQHJldHVybiB7VW5kb30gdW5kbyBjb21tYW5kXG4gKi9cbmV4cG9ydCB2YXIgaW5lcnRPdGhlcnMgPSBmdW5jdGlvbiAob3JpZ2luYWxUYXJnZXQsIHBhcmVudE5vZGUsIG1hcmtlck5hbWUpIHtcbiAgICBpZiAobWFya2VyTmFtZSA9PT0gdm9pZCAwKSB7IG1hcmtlck5hbWUgPSAnZGF0YS1pbmVydC1lZCc7IH1cbiAgICB2YXIgYWN0aXZlUGFyZW50Tm9kZSA9IHBhcmVudE5vZGUgfHwgZ2V0RGVmYXVsdFBhcmVudChvcmlnaW5hbFRhcmdldCk7XG4gICAgaWYgKCFhY3RpdmVQYXJlbnROb2RlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9O1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHlBdHRyaWJ1dGVUb090aGVycyhvcmlnaW5hbFRhcmdldCwgYWN0aXZlUGFyZW50Tm9kZSwgbWFya2VyTmFtZSwgJ2luZXJ0Jyk7XG59O1xuLyoqXG4gKiBAcmV0dXJucyBpZiBjdXJyZW50IGJyb3dzZXIgc3VwcG9ydHMgaW5lcnRcbiAqL1xuZXhwb3J0IHZhciBzdXBwb3J0c0luZXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIEhUTUxFbGVtZW50LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgnaW5lcnQnKTtcbn07XG4vKipcbiAqIEF1dG9tYXRpYyBmdW5jdGlvbiB0byBcInN1cHByZXNzXCIgRE9NIGVsZW1lbnRzIC0gX2hpZGVfIG9yIF9pbmVydF8gaW4gdGhlIGJlc3QgcG9zc2libGUgd2F5XG4gKiBAcGFyYW0ge0VsZW1lbnQgfCBFbGVtZW50W119IG9yaWdpbmFsVGFyZ2V0IC0gZWxlbWVudHMgdG8ga2VlcCBvbiB0aGUgcGFnZVxuICogQHBhcmFtIFtwYXJlbnROb2RlXSAtIHRvcCBlbGVtZW50LCBkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5XG4gKiBAcGFyYW0ge1N0cmluZ30gW21hcmtlck5hbWVdIC0gYSBzcGVjaWFsIGF0dHJpYnV0ZSB0byBtYXJrIGV2ZXJ5IG5vZGVcbiAqIEByZXR1cm4ge1VuZG99IHVuZG8gY29tbWFuZFxuICovXG5leHBvcnQgdmFyIHN1cHByZXNzT3RoZXJzID0gZnVuY3Rpb24gKG9yaWdpbmFsVGFyZ2V0LCBwYXJlbnROb2RlLCBtYXJrZXJOYW1lKSB7XG4gICAgaWYgKG1hcmtlck5hbWUgPT09IHZvaWQgMCkgeyBtYXJrZXJOYW1lID0gJ2RhdGEtc3VwcHJlc3NlZCc7IH1cbiAgICByZXR1cm4gKHN1cHBvcnRzSW5lcnQoKSA/IGluZXJ0T3RoZXJzIDogaGlkZU90aGVycykob3JpZ2luYWxUYXJnZXQsIHBhcmVudE5vZGUsIG1hcmtlck5hbWUpO1xufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgSGVsbWV0IH0gZnJvbSBcInJlYWN0LWhlbG1ldFwiO1xyXG5cclxuZnVuY3Rpb24gVGl0bGUoeyB0aXRsZSwgZHJpdmUgfSkge1xyXG4gIHJldHVybiAoXHJcbiAgICA8SGVsbWV0PlxyXG4gICAgICA8dGl0bGU+e2RyaXZlID8gdGl0bGUgOiBgJHt0aXRsZX0gLSBPcGVuU2lnbuKEomB9PC90aXRsZT5cclxuICAgICAgPG1ldGEgbmFtZT1cImRlc2NyaXB0aW9uXCIgY29udGVudD17YCR7dGl0bGV9IC0gT3BlblNpZ27ihKJgfSAvPlxyXG4gICAgICA8bGlua1xyXG4gICAgICAgIHJlbD1cImljb25cIlxyXG4gICAgICAgIHR5cGU9XCJpbWFnZS9wbmdcIlxyXG4gICAgICAgIGhyZWY9e2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZmV2X0ljb25cIil9XHJcbiAgICAgICAgc2l6ZXM9XCI0MHg0MFwiXHJcbiAgICAgIC8+XHJcbiAgICA8L0hlbG1ldD5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUaXRsZTtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5cclxuZnVuY3Rpb24gQm9yZGVyUmVzaXplKHsgcmlnaHQsIHRvcCB9KSB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3NOYW1lPXtgJHtyaWdodCA/IGAtcmlnaHQtWzEycHhdYCA6IFwiLXJpZ2h0LVsxcHhdXCJ9ICR7XHJcbiAgICAgICAgdG9wID8gYC1ib3R0b20tWzExcHhdYCA6IFwiLWJvdHRvbS1bMXB4XVwiXHJcbiAgICAgIH0gYWJzb2x1dGUgaW5saW5lLWJsb2NrIHctWzE0cHhdIGgtWzE0cHhdIGhvdmVyOmN1cnNvci1zdy1yZXNpemUgYm9yZGVyLXItWzNweF0gYm9yZGVyLWItWzNweF0gYm9yZGVyLVsjMTg4YWUyXWB9XHJcbiAgICA+PC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQm9yZGVyUmVzaXplO1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5mdW5jdGlvbiBEZWZhdWx0U2lnbmF0dXJlKHsgZGVmYXVsdFNpZ25JbWcsIHh5UG9zdGlvbiwgc2V0RGVmYXVsdFNpZ25BbGVydCB9KSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcblxuICBjb25zdCBjb25maXJtVG9hZGREZWZhdWx0U2lnbiA9ICgpID0+IHtcbiAgICBpZiAoeHlQb3N0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIHNldERlZmF1bHRTaWduQWxlcnQoe1xuICAgICAgICBpc1Nob3c6IHRydWUsXG4gICAgICAgIGFsZXJ0TWVzc2FnZTogdChcImRlZmF1bHQtc2lnbi1hbGVydFwiKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldERlZmF1bHRTaWduQWxlcnQoe1xuICAgICAgICBpc1Nob3c6IHRydWUsXG4gICAgICAgIGFsZXJ0TWVzc2FnZTogdChcInBsZWFzZS1zZWxlY3QtcG9zaXRpb24hXCIpXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGRhdGEtdHV0PVwicmVhY3RvdXJUaGlyZFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC0yIHByLTIgcHQtMiBwYi0xIHRleHQtWzE1cHhdIHRleHQtYmFzZS1jb250ZW50IGZvbnQtc2VtaWJvbGQgYm9yZGVyLWItWzFweF0gYm9yZGVyLWJhc2UtMzAwXCI+XG4gICAgICAgIHt0KFwic2lnbmF0dXJlXCIpfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIG10LVsxMHB4XSBmb250LXNlbWlib2xkXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtYmFzZS1jb250ZW50XCI+e3QoXCJZb3VyLVNpZ25hdHVyZVwiKX08L3A+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtY2FyZCBzaGFkb3ctbWQgaC1bMTExcHhdIHctWzkwJV0gcC0yXCI+XG4gICAgICAgICAgPGltZ1xuICAgICAgICAgICAgYWx0PVwic2lnbmF0dXJlXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgb2JqZWN0LWNvbnRhaW5cIlxuICAgICAgICAgICAgc3JjPXtkZWZhdWx0U2lnbkltZ31cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXQtWzEwcHhdXCJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBjb25maXJtVG9hZGREZWZhdWx0U2lnbigpfVxuICAgICAgICA+XG4gICAgICAgICAge3QoXCJhdXRvLXNpZ24tYWxsXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBEZWZhdWx0U2lnbmF0dXJlO1xuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJldk5leHQgZnJvbSBcIi4vUHJldk5leHRcIjtcbmltcG9ydCB7XG4gIGhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGUsXG4gIGhhbmRsZURvd25sb2FkUGRmLFxuICBoYW5kbGVUb1ByaW50XG59IGZyb20gXCIuLi8uLi9jb25zdGFudC9VdGlsc1wiO1xuaW1wb3J0IFwiLi4vLi4vc3R5bGVzL3NpZ25hdHVyZS5jc3NcIjtcbmltcG9ydCAqIGFzIERyb3Bkb3duTWVudSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWRyb3Bkb3duLW1lbnVcIjtcbmltcG9ydCBNb2RhbFVpIGZyb20gXCIuLi8uLi9wcmltaXRpdmVzL01vZGFsVWlcIjtcbmltcG9ydCBMb2FkZXIgZnJvbSBcIi4uLy4uL3ByaW1pdGl2ZXMvTG9hZGVyXCI7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5cbmZ1bmN0aW9uIEhlYWRlcih7XG4gIGlzUGRmUmVxdWVzdEZpbGVzLFxuICBpc1BsYWNlaG9sZGVyLFxuICBzZXRJc0RlY2xpbmUsXG4gIHBhZ2VOdW1iZXIsXG4gIGFsbFBhZ2VzLFxuICBjaGFuZ2VQYWdlLFxuICBwZGZVcmwsXG4gIGVtYmVkV2lkZ2V0c0RhdGEsXG4gIHBkZkRldGFpbHMsXG4gIHNpZ25lclBvcyxcbiAgc2lnbmVyc2RhdGEsXG4gIGlzTWFpbFNlbmQsXG4gIGFsZXJ0U2VuZEVtYWlsLFxuICBpc0NvbXBsZXRlZCxcbiAgaXNTaG93SGVhZGVyLFxuICBkZWNsaW5lLFxuICBjdXJyZW50U2lnbmVyLFxuICBhbHJlYWR5U2lnbixcbiAgaXNTaWduWW91cnNlbGYsXG4gIHNldElzRW1haWwsXG4gIGNvbXBsZXRlQnRuVGl0bGUsXG4gIHNldElzRWRpdFRlbXBsYXRlLFxuICBpc1B1YmxpY1RlbXBsYXRlXG59KSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgZmlsdGVyUHJlZmlsbCA9XG4gICAgc2lnbmVyUG9zICYmIHNpZ25lclBvcz8uZmlsdGVyKChkYXRhKSA9PiBkYXRhLlJvbGUgIT09IFwicHJlZmlsbFwiKTtcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcbiAgY29uc3QgW2lzRG93bmxvYWRpbmcsIHNldElzRG93bmxvYWRpbmddID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IGlzR3Vlc3RTaWduZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImlzR3Vlc3RTaWduZXJcIik7XG5cbiAgLy9mdW5jdGlvbiBmb3Igc2hvdyBkZWNsaW5lIGFsZXJ0XG4gIGNvbnN0IGhhbmRsZURlY2xpbmVQZGZBbGVydCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50RGVjbGluZSA9IHsgY3Vycm50OiBcIlN1cmVcIiwgaXNEZWNsaW5lZDogdHJ1ZSB9O1xuICAgIHNldElzRGVjbGluZShjdXJyZW50RGVjbGluZSk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggcHktWzVweF1cIj5cbiAgICAgIHtpc01vYmlsZSAmJiBpc1Nob3dIZWFkZXIgPyAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBpZD1cIm5hdmJhclwiXG4gICAgICAgICAgY2xhc3NOYW1lPXtpc0d1ZXN0U2lnbmVyID8gXCJzdGlja3lTaWduZXJIZWFkXCIgOiBcInN0aWNreUhlYWRcIn1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgd2lkdGg6IGlzR3Vlc3RTaWduZXJcbiAgICAgICAgICAgICAgPyB3aW5kb3cuaW5uZXJXaWR0aFxuICAgICAgICAgICAgICA6IHdpbmRvdy5pbm5lcldpZHRoIC0gMzAgKyBcInB4XCJcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgcHktWzVweF0gcHgtWzEwcHhdIFwiPlxuICAgICAgICAgICAgPGRpdiBvbkNsaWNrPXsoKSA9PiB3aW5kb3cuaGlzdG9yeS5nbygtMil9PlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWFycm93LWxlZnQgdGV4dC1iYXNlLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxQcmV2TmV4dFxuICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxuICAgICAgICAgICAgICBhbGxQYWdlcz17YWxsUGFnZXN9XG4gICAgICAgICAgICAgIGNoYW5nZVBhZ2U9e2NoYW5nZVBhZ2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge3BkZlVybCAmJiBhbHJlYWR5U2lnbiA/IChcbiAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Sb290PlxuICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuVHJpZ2dlciBhc0NoaWxkPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvcC1saW5rIG9wLWxpbmstcHJpbWFyeSBuby11bmRlcmxpbmUgdGV4dC1bMTZweF0gZm9udC1zZW1pYm9sZCBwci1bM3B4XSBwbC1bNXB4XVwiPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWVsbGlwc2lzLXZcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuUG9ydGFsPlxuICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Db250ZW50XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIkRyb3Bkb3duTWVudUNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICBzaWRlT2Zmc2V0PXs1fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51Lkl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJEcm9wZG93bk1lbnVJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYocGRmRGV0YWlscywgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXJyb3ctZG93biBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJkb3dubG9hZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAge2lzQ29tcGxldGVkICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51Lkl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIkRyb3Bkb3duTWVudUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRG93bmxvYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9yZGVyLW5vbmUgYmctWyNmZmZdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXdhcmQgbXItWzNweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiY2VydGlmaWNhdGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICB7aXNTaWduWW91cnNlbGYgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc0VtYWlsKHRydWUpfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWVudmVsb3BlIG1yLVszcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcIm1haWxcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51Lkl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJEcm9wZG93bk1lbnVJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRvUHJpbnQoZSwgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcHJpbnQgbXItWzNweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwicHJpbnRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Db250ZW50PlxuICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlBvcnRhbD5cbiAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuUm9vdD5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWFyb3VuZCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICB7LyogY3VycmVudCBzaWduZXIgaXMgY2hlY2tpbmcgdXNlciBzZW5kIHJlcXVlc3QgYW5kIGNoZWNrIHN0YXR1cyBvZiBwZGYgc2lnbiB0aGFuIGlmIGN1cnJlbnQgXG4gICAgICAgICAgICAgICAgdXNlciBleGlzdCB0aGFuIHNob3cgZmluaXNoIGJ1dHRvbiBlbHNlIG5vXG4gICAgICAgICAgICAgICAgKi99XG4gICAgICAgICAgICAgICAge2N1cnJlbnRTaWduZXIgJiYgKFxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlclwiIGRhdGEtdHV0PVwicmVhY3RvdXJGaWZ0aFwiPlxuICAgICAgICAgICAgICAgICAgICB7ZGVjbGluZSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVjbGluZVBkZkFsZXJ0KCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LVtyZWRdIGJvcmRlci1ub25lIGZvbnQtWzY1MF0gdGV4dC1bMTRweF0gbXItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJkZWNsaW5lXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICB7aXNQbGFjZWhvbGRlciA/IChcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNNYWlsU2VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0U2VuZEVtYWlsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc01haWxTZW5kID8gXCJcIiA6IFwib3AtbGluay1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayBuby11bmRlcmxpbmUgZm9udC1bNjUwXSB0ZXh0LVsxNHB4XWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXR1dD1cImhlYWRlckFyZWFcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb21wbGV0ZUJ0blRpdGxlID8gY29tcGxldGVCdG5UaXRsZSA6IHQoXCJzZW5kXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwicmVhY3RvdXJUaGlyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGRmVXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRXaWRnZXRzRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGRmUmVxdWVzdEZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRXaWRnZXRzRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyLW5vbmUgZm9udC1bNjUwXSB0ZXh0LVsxNHB4XSBvcC1saW5rIG9wLWxpbmstcHJpbWFyeSBuby11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiZmluaXNoXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlJvb3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5UcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtWzY1MF0gdGV4dC1bMThweF0gcHgtMiBtbC1bNHB4XSB0ZXh0LWJhc2UtY29udGVudCBuby11bmRlcmxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1lbGxpcHNpcy12XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlBvcnRhbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZy13aGl0ZSBzaGFkb3ctbWQgcm91bmRlZC1mdWxsIHB4LTMgcHktMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGVPZmZzZXQ9ezV9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHRleHQtWzEzcHhdIGZvY3VzOm91dGxpbmUtbm9uZSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkUGRmKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRG93bmxvYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXJyb3ctZG93biBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1bNTAwXVwiPnt0KFwiZG93bmxvYWRcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Qb3J0YWw+XG4gICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlJvb3Q+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIHctZnVsbCBnYXAteS0xIG1sLTFcIj5cbiAgICAgICAgICA8UHJldk5leHRcbiAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XG4gICAgICAgICAgICBhbGxQYWdlcz17YWxsUGFnZXN9XG4gICAgICAgICAgICBjaGFuZ2VQYWdlPXtjaGFuZ2VQYWdlfVxuICAgICAgICAgIC8+XG4gICAgICAgICAge2lzUGxhY2Vob2xkZXIgPyAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggbXgtWzEwMHB4XSBsZzpteC0wIG9yZGVyLWxhc3QgbGc6b3JkZXItbm9uZVwiPlxuICAgICAgICAgICAgICAgIHshaXNNYWlsU2VuZCAmJlxuICAgICAgICAgICAgICAgICAgc2lnbmVyc2RhdGEubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgc2lnbmVyc2RhdGEubGVuZ3RoICE9PSBmaWx0ZXJQcmVmaWxsLmxlbmd0aCAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAge2ZpbHRlclByZWZpbGwubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1bI2Y1NDA1ZV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJhZGRcIil9IHtzaWduZXJzZGF0YS5sZW5ndGggLSBmaWx0ZXJQcmVmaWxsLmxlbmd0aH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwicmVjaXBpZW50c1wiKX0ge3QoXCJ3aWRnZXRzLW5hbWUuc2lnbmF0dXJlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XSB0ZXh0LVsjZjU0MDVlXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImFkZFwiKX0ge3NpZ25lcnNkYXRhLmxlbmd0aCAtIGZpbHRlclByZWZpbGwubGVuZ3RofXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJtb3JlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInJlY2lwaWVudHNcIil9IHt0KFwid2lkZ2V0cy1uYW1lLnNpZ25hdHVyZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICB7c2V0SXNFZGl0VGVtcGxhdGUgJiYgKFxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc0VkaXRUZW1wbGF0ZSh0cnVlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3V0bGluZS1ub25lIGJvcmRlci1ub25lIHRleHQtY2VudGVyIG1yLVszcHhdXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZ2VhciBmYS1sZ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gd2luZG93Lmhpc3RvcnkuZ28oLTIpfVxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0IG9wLWJ0bi1zbSBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3QoXCJiYWNrXCIpfVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc01haWxTZW5kICYmIHRydWV9XG4gICAgICAgICAgICAgICAgICBkYXRhLXR1dD1cImhlYWRlckFyZWFcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBhbGVydFNlbmRFbWFpbCgpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtjb21wbGV0ZUJ0blRpdGxlXG4gICAgICAgICAgICAgICAgICAgID8gY29tcGxldGVCdG5UaXRsZVxuICAgICAgICAgICAgICAgICAgICA6IGlzTWFpbFNlbmRcbiAgICAgICAgICAgICAgICAgICAgICA/IHQoXCJzZW50XCIpXG4gICAgICAgICAgICAgICAgICAgICAgOiB0KFwic2VuZFwiKX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApIDogaXNQZGZSZXF1ZXN0RmlsZXMgPyAoXG4gICAgICAgICAgICBhbHJlYWR5U2lnbiA/IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IGhhbmRsZVRvUHJpbnQoZSwgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKX1cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1uZXV0cmFsIG9wLWJ0bi1zbSBtci1bM3B4XSBzaGFkb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXByaW50IHB5LVszcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj57dChcInByaW50XCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB7aXNDb21wbGV0ZWQgJiYgKFxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlKHBkZkRldGFpbHMsIHNldElzRG93bmxvYWRpbmcpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnkgb3AtYnRuLXNtIG1yLVszcHhdIHNoYWRvd1wiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXdhcmQgcHktWzNweF1cIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPnt0KFwiY2VydGlmaWNhdGVcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkUGRmKHBkZkRldGFpbHMsIHBkZlVybCwgc2V0SXNEb3dubG9hZGluZylcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1kb3dubG9hZCBweS1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+e3QoXCJkb3dubG9hZFwiKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4XCIgZGF0YS10dXQ9XCJyZWFjdG91ckZpZnRoXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gd2luZG93Lmhpc3RvcnkuZ28oLTIpfVxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0IG9wLWJ0bi1zbSBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3QoXCJiYWNrXCIpfVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIHtjdXJyZW50U2lnbmVyICYmIChcbiAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXNlY29uZGFyeSBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVEZWNsaW5lUGRmQWxlcnQoKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt0KFwiZGVjbGluZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgb3AtYnRuLXNtIG1yLVszcHhdIHNoYWRvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZW1iZWRXaWRnZXRzRGF0YSgpfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3QoXCJmaW5pc2hcIil9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1uZXV0cmFsIG9wLWJ0bi1zbSBtci1bM3B4XSBzaGFkb3dcIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihwZGZEZXRhaWxzLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXJyb3ctZG93biBmb250LXNlbWlib2xkIGxnOmhpZGRlblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj57dChcImRvd25sb2FkXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIClcbiAgICAgICAgICApIDogaXNDb21wbGV0ZWQgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAge2lzQ29tcGxldGVkICYmIChcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGUocGRmRGV0YWlscywgc2V0SXNEb3dubG9hZGluZylcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tc2Vjb25kYXJ5IG9wLWJ0bi1zbSBnYXAtMCBmb250LW1lZGl1bSB0ZXh0LVsxMnB4XSBtci1bM3B4XSBzaGFkb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWF3YXJkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrIG1sLTFcIj5cbiAgICAgICAgICAgICAgICAgICAge3QoXCJjZXJ0aWZpY2F0ZVwiKX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBoYW5kbGVUb1ByaW50KGUsIHBkZlVybCwgc2V0SXNEb3dubG9hZGluZyl9XG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1uZXV0cmFsIG9wLWJ0bi1zbSBnYXAtMCBmb250LW1lZGl1bSB0ZXh0LVsxMnB4XSBtci1bM3B4XSBzaGFkb3dcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcHJpbnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrIG1sLTFcIj57dChcInByaW50XCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgb3AtYnRuLXNtIGdhcC0wIGZvbnQtbWVkaXVtIHRleHQtWzEycHhdIG1yLVszcHhdIHNoYWRvd1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkUGRmKHBkZkRldGFpbHMsIHBkZlVybCwgc2V0SXNEb3dubG9hZGluZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1kb3dubG9hZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2sgbWwtMVwiPnt0KFwiZG93bmxvYWRcIil9PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4taW5mbyBvcC1idG4tc20gZ2FwLTAgZm9udC1tZWRpdW0gdGV4dC1bMTJweF0gbXItWzNweF0gc2hhZG93XCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc0VtYWlsKHRydWUpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZW52ZWxvcGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrIG1sLTFcIj57dChcIm1haWxcIil9PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiBpc1B1YmxpY1RlbXBsYXRlID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4XCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgb3AtYnRuLXNtICBzaGFkb3dcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGVtYmVkV2lkZ2V0c0RhdGEoKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3QoXCJzaWduLW5vd1wiKX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4XCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB3aW5kb3cuaGlzdG9yeS5nbygtMil9XG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdCBvcC1idG4tc20gbXItWzNweF1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3QoXCJiYWNrXCIpfVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXItWzNweF1cIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghcGRmVXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtYmVkV2lkZ2V0c0RhdGEoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3QoXCJmaW5pc2hcIil9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAge2lzRG93bmxvYWRpbmcgPT09IFwicGRmXCIgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIHotWzIwMF0gaW5zZXQtMCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBiZy1ibGFjayBiZy1vcGFjaXR5LTMwXCI+XG4gICAgICAgICAgPExvYWRlciAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICA8TW9kYWxVaVxuICAgICAgICBpc09wZW49e2lzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIn1cbiAgICAgICAgdGl0bGU9e1xuICAgICAgICAgIGlzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIlxuICAgICAgICAgICAgPyB0KFwiZ2VuZXJhdGluZy1jZXJ0aWZpY2F0ZVwiKVxuICAgICAgICAgICAgOiB0KFwicGRmLWRvd25sb2FkXCIpXG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHNldElzRG93bmxvYWRpbmcoXCJcIil9XG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0zIG1kOnAtNSB0ZXh0LVsxM3B4XSBtZDp0ZXh0LWJhc2UgdGV4dC1jZW50ZXIgdGV4dC1iYXNlLWNvbnRlbnRcIj5cbiAgICAgICAgICB7aXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwifXtcIiBcIn1cbiAgICAgICAgICA8cD57dChcImdlbmVyYXRlLWNlcnRpZmljYXRlLWFsZXJ0XCIpfTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L01vZGFsVWk+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcblxuZnVuY3Rpb24gUGRmWm9vbShwcm9wcykge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG4gIGNvbnN0IG9uQ2xpY2tab29tSW4gPSAoKSA9PiB7XG4gICAgcHJvcHMuc2V0U2NhbGUocHJvcHMuc2NhbGUgKyAwLjEgKiBwcm9wcy5zY2FsZSk7XG4gICAgcHJvcHMuc2V0Wm9vbVBlcmNlbnQocHJvcHMuem9vbVBlcmNlbnQgKyAxMCk7XG4gIH07XG4gIGNvbnN0IG9uQ2xpY2tab29tT3V0ID0gKCkgPT4ge1xuICAgIGlmIChwcm9wcy56b29tUGVyY2VudCA+IDApIHtcbiAgICAgIGlmIChwcm9wcy56b29tUGVyY2VudCA9PT0gMTApIHtcbiAgICAgICAgcHJvcHMuc2V0U2NhbGUoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wcy5zZXRTY2FsZShwcm9wcy5zY2FsZSAtIDAuMSAqIHByb3BzLnNjYWxlKTtcbiAgICAgIH1cbiAgICAgIHByb3BzLnNldFpvb21QZXJjZW50KHByb3BzLnpvb21QZXJjZW50IC0gMTApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaGFuZGxlUmVzZXQgPSAoKSA9PiB7XG4gICAgcHJvcHMuc2V0U2NhbGUoMSk7XG4gICAgcHJvcHMuc2V0Wm9vbVBlcmNlbnQoMCk7XG4gIH07XG4gIHJldHVybiAoXG4gICAgLy8gbWQ6bXQtWzQxcHhdIHhsOm10LVs2M3B4XW10PVtdXG4gICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmZsZXggZmxleC1jb2wgZ2FwLTEgdGV4dC1jZW50ZXIgbWQ6dy1bNSVdIG10LVs1MHB4XSAyeGw6bXQtWzYzcHhdXCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzc05hbWU9XCJiZy1ncmF5LTUwIHB4LVs0cHhdIDJ4bDpweC1bMTVweF0gMnhsOnB5LVsxMHB4XSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIG9uQ2xpY2s9e29uQ2xpY2tab29tSW59XG4gICAgICAgIHRpdGxlPXt0KFwiem9vbS1pblwiKX1cbiAgICAgID5cbiAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtbWFnbmlmeWluZy1nbGFzcy1wbHVzIHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdXCI+PC9pPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3NOYW1lPVwiYmctZ3JheS01MCBweC1bNHB4XSAyeGw6cHgtWzE1cHhdIDJ4bDpweS1bMTBweF0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICBvbkNsaWNrPXtoYW5kbGVSZXNldH1cbiAgICAgICAgdGl0bGU9e3QoXCJyZXNldFwiKX1cbiAgICAgID5cbiAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtbWFnbmlmeWluZy1nbGFzcy1hcnJvd3Mtcm90YXRlIHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdXCI+PC9pPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3NOYW1lPVwiYmctZ3JheS01MCBweC1bNHB4XSAyeGw6cHgtWzE1cHhdIDJ4bDpweS1bMTBweF1cIlxuICAgICAgICBvbkNsaWNrPXtvbkNsaWNrWm9vbU91dH1cbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBjdXJzb3I6IHByb3BzLnpvb21QZXJjZW50ID4gMCA/IFwicG9pbnRlclwiIDogXCJkZWZhdWx0XCJcbiAgICAgICAgfX1cbiAgICAgICAgdGl0bGU9e3QoXCJ6b29tLW91dFwiKX1cbiAgICAgID5cbiAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtbWFnbmlmeWluZy1nbGFzcy1taW51cyB0ZXh0LWdyYXktNTAwIDJ4bDp0ZXh0LVszMHB4XVwiPjwvaT5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBkZlpvb207XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IEJvcmRlclJlc2l6ZSBmcm9tIFwiLi9Cb3JkZXJSZXNpemVcIjtcbmltcG9ydCBQbGFjZWhvbGRlckJvcmRlciBmcm9tIFwiLi9QbGFjZWhvbGRlckJvcmRlclwiO1xuaW1wb3J0IHsgUm5kIH0gZnJvbSBcInJlYWN0LXJuZFwiO1xuaW1wb3J0IHtcbiAgZGVmYXVsdFdpZHRoSGVpZ2h0LFxuICBnZXRDb250YWluZXJTY2FsZSxcbiAgaGFuZGxlQ29weU5leHRUb1dpZGdldCxcbiAgaXNUYWJBbmRNb2JpbGUsXG4gIG9uQ2hhbmdlSW5wdXQsXG4gIHJhZGlvQnV0dG9uV2lkZ2V0LFxuICB0ZXh0SW5wdXRXaWRnZXQsXG4gIHRleHRXaWRnZXRcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L1V0aWxzXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXJUeXBlIGZyb20gXCIuL1BsYWNlaG9sZGVyVHlwZVwiO1xuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XG5pbXBvcnQgXCIuLi8uLi9zdHlsZXMvb3BlbnNpZ25kcml2ZS5jc3NcIjtcblxuY29uc3Qgc2VsZWN0Rm9ybWF0ID0gKGRhdGEpID0+IHtcbiAgc3dpdGNoIChkYXRhKSB7XG4gICAgY2FzZSBcIkxcIjpcbiAgICAgIHJldHVybiBcIk1NL2RkL3l5eXlcIjtcbiAgICBjYXNlIFwiREQtTU0tWVlZWVwiOlxuICAgICAgcmV0dXJuIFwiZGQtTU0teXl5eVwiO1xuICAgIGNhc2UgXCJERC9NTS9ZWVlZXCI6XG4gICAgICByZXR1cm4gXCJkZC9NTS95eXl5XCI7XG4gICAgY2FzZSBcIkxMXCI6XG4gICAgICByZXR1cm4gXCJNTU1NIGRkLCB5eXl5XCI7XG4gICAgY2FzZSBcIkREIE1NTSwgWVlZWVwiOlxuICAgICAgcmV0dXJuIFwiZGQgTU1NLCB5eXl5XCI7XG4gICAgY2FzZSBcIllZWVktTU0tRERcIjpcbiAgICAgIHJldHVybiBcInl5eXktTU0tZGRcIjtcbiAgICBjYXNlIFwiTU0tREQtWVlZWVwiOlxuICAgICAgcmV0dXJuIFwiTU0tZGQteXl5eVwiO1xuICAgIGNhc2UgXCJNTS5ERC5ZWVlZXCI6XG4gICAgICByZXR1cm4gXCJNTS5kZC55eXl5XCI7XG4gICAgY2FzZSBcIk1NTSBERCwgWVlZWVwiOlxuICAgICAgcmV0dXJuIFwiTU1NIGRkLCB5eXl5XCI7XG4gICAgY2FzZSBcIkREIE1NTU0sIFlZWVlcIjpcbiAgICAgIHJldHVybiBcImRkIE1NTU0sIHl5eXlcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwiTU0vZGQveXl5eVwiO1xuICB9XG59O1xuXG5jb25zdCBjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQgPSAoZm9ybWF0KSA9PiB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSBcIk1NL2RkL3l5eXlcIjpcbiAgICAgIHJldHVybiBcIkxcIjtcbiAgICBjYXNlIFwiZGQtTU0teXl5eVwiOlxuICAgICAgcmV0dXJuIFwiREQtTU0tWVlZWVwiO1xuICAgIGNhc2UgXCJkZC9NTS95eXl5XCI6XG4gICAgICByZXR1cm4gXCJERC9NTS9ZWVlZXCI7XG4gICAgY2FzZSBcIk1NTU0gZGQsIHl5eXlcIjpcbiAgICAgIHJldHVybiBcIkxMXCI7XG4gICAgY2FzZSBcImRkIE1NTSwgeXl5eVwiOlxuICAgICAgcmV0dXJuIFwiREQgTU1NLCBZWVlZXCI7XG4gICAgY2FzZSBcInl5eXktTU0tZGRcIjpcbiAgICAgIHJldHVybiBcIllZWVktTU0tRERcIjtcbiAgICBjYXNlIFwiTU0tZGQteXl5eVwiOlxuICAgICAgcmV0dXJuIFwiTU0tREQtWVlZWVwiO1xuICAgIGNhc2UgXCJNTS5kZC55eXl5XCI6XG4gICAgICByZXR1cm4gXCJNTS5ERC5ZWVlZXCI7XG4gICAgY2FzZSBcIk1NTSBkZCwgeXl5eVwiOlxuICAgICAgcmV0dXJuIFwiTU1NIERELCBZWVlZXCI7XG4gICAgY2FzZSBcImRkIE1NTU0sIHl5eXlcIjpcbiAgICAgIHJldHVybiBcIkREIE1NTU0sIFlZWVlcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwiTFwiO1xuICB9XG59O1xuXG4vL2Z1bmN0aW9uIHRvIGdldCBkZWZhdWx0IGRhdGVcbmNvbnN0IGdldERlZmF1bHRkYXRlID0gKHNlbGVjdGVkRGF0ZSwgZm9ybWF0ID0gXCJkZC1NTS15eXl5XCIpID0+IHtcbiAgbGV0IGRhdGU7XG4gIGlmIChmb3JtYXQgJiYgZm9ybWF0ID09PSBcImRkLU1NLXl5eXlcIikge1xuICAgIGNvbnN0IG5ld2RhdGUgPSBzZWxlY3RlZERhdGVcbiAgICAgID8gc2VsZWN0ZWREYXRlXG4gICAgICA6IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoY2hhbmdlRGF0ZVRvTW9tZW50Rm9ybWF0KGZvcm1hdCkpO1xuICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IG5ld2RhdGUuc3BsaXQoXCItXCIpO1xuICAgIGRhdGUgPSBuZXcgRGF0ZShgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlID0gbmV3IERhdGUoc2VsZWN0ZWREYXRlKTtcbiAgfVxuICBjb25zdCB2YWx1ZSA9IGRhdGU7XG4gIHJldHVybiB2YWx1ZTtcbn07XG4vL2Z1bmN0aW9uIHRvIGdldCBkZWZhdWx0IGZvcm1hdFxuY29uc3QgZ2V0RGVmYXVsdEZvcm1hdCA9IChkYXRlRm9ybWF0KSA9PiBkYXRlRm9ybWF0IHx8IFwiTU0vZGQveXl5eVwiO1xuXG5mdW5jdGlvbiBQbGFjZWhvbGRlcihwcm9wcykge1xuICBjb25zdCBbcGxhY2Vob2xkZXJCb3JkZXIsIHNldFBsYWNlaG9sZGVyQm9yZGVyXSA9IHVzZVN0YXRlKHsgdzogMCwgaDogMCB9KTtcbiAgY29uc3QgW2lzRHJhZ2dpbmdFbmFibGVkLCBzZXREcmFnZ2luZ0VuYWJsZWRdID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtpc1Nob3dEYXRlRm9ybWF0LCBzZXRJc1Nob3dEYXRlRm9ybWF0XSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2NvbnRhaW5lclNjYWxlLCBzZXRDb250YWluZXJTY2FsZV0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbc2VsZWN0RGF0ZSwgc2V0U2VsZWN0RGF0ZV0gPSB1c2VTdGF0ZSh7XG4gICAgZGF0ZTpcbiAgICAgIHByb3BzLnBvcy50eXBlID09PSBcImRhdGVcIlxuICAgICAgICA/IG1vbWVudChcbiAgICAgICAgICAgIGdldERlZmF1bHRkYXRlKFxuICAgICAgICAgICAgICBwcm9wcz8ucG9zPy5vcHRpb25zPy5yZXNwb25zZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcbiAgICAgICAgICAgICkuZ2V0VGltZSgpXG4gICAgICAgICAgKS5mb3JtYXQoXG4gICAgICAgICAgICBjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXQpXG4gICAgICAgICAgKVxuICAgICAgICA6IFwiXCIsXG4gICAgZm9ybWF0OlxuICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiZGF0ZVwiXG4gICAgICAgID8gZ2V0RGVmYXVsdEZvcm1hdChwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LmZvcm1hdClcbiAgICAgICAgOiBcIlwiXG4gIH0pO1xuICBjb25zdCBbZGF0ZUZvcm1hdCwgc2V0RGF0ZUZvcm1hdF0gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtzdGFydERhdGUsIHNldFN0YXJ0RGF0ZV0gPSB1c2VTdGF0ZShcbiAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCIgJiZcbiAgICAgIGdldERlZmF1bHRkYXRlKFxuICAgICAgICBwcm9wcz8ucG9zPy5vcHRpb25zPy5yZXNwb25zZSxcbiAgICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcbiAgICAgIClcbiAgKTtcbiAgY29uc3QgW2dldENoZWNrYm94UmVuZGVyV2lkdGgsIHNldEdldENoZWNrYm94UmVuZGVyV2lkdGhdID0gdXNlU3RhdGUoe1xuICAgIHdpZHRoOiBudWxsLFxuICAgIGhlaWdodDogbnVsbFxuICB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGdldFBkZlBhZ2VXaWR0aCA9IHByb3BzLnBkZk9yaWdpbmFsV0guZmluZChcbiAgICAgIChkYXRhKSA9PiBkYXRhLnBhZ2VOdW1iZXIgPT09IHByb3BzLnBhZ2VOdW1iZXJcbiAgICApO1xuICAgIHNldENvbnRhaW5lclNjYWxlKHByb3BzLmNvbnRhaW5lcldILndpZHRoIC8gZ2V0UGRmUGFnZVdpZHRoLndpZHRoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtwcm9wcy5jb250YWluZXJXSC53aWR0aCwgcHJvcHMucGRmT3JpZ2luYWxXSF0pO1xuICBjb25zdCBkYXRlRm9ybWF0QXJyID0gW1xuICAgIFwiTFwiLFxuICAgIFwiREQtTU0tWVlZWVwiLFxuICAgIFwiWVlZWS1NTS1ERFwiLFxuICAgIFwiTU0uREQuWVlZWVwiLFxuICAgIFwiTU0tREQtWVlZWVwiLFxuICAgIFwiTU1NIERELCBZWVlZXCIsXG4gICAgXCJMTFwiLFxuICAgIFwiREQgTU1NLCBZWVlZXCIsXG4gICAgXCJERCBNTU1NLCBZWVlZXCJcbiAgXTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZVdpZHRoID0gKCkgPT4ge1xuICAgICAgY29uc3Qgcm5kRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByb3BzLnBvcy5rZXkpO1xuICAgICAgaWYgKHJuZEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBybmRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBzZXRHZXRDaGVja2JveFJlbmRlcldpZHRoKHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRGVsYXkgdG8gZW5zdXJlIHJlbmRlcmluZyBpcyBjb21wbGV0ZVxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCh1cGRhdGVXaWR0aCwgMCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfSwgW3Byb3BzLnBvc10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY2xvc2VNZW51T25PdXRzaWRlQ2xpY2sgPSAoZSkgPT4ge1xuICAgICAgaWYgKCFpc0RyYWdnaW5nRW5hYmxlZCAmJiAhZS50YXJnZXQuY2xvc2VzdChcIiNjaGFuZ2VJc0RyYWdnaW5nXCIpKSB7XG4gICAgICAgIHNldERyYWdnaW5nRW5hYmxlZCh0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNsb3NlTWVudU9uT3V0c2lkZUNsaWNrKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvLyBDbGVhbnVwIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBjbG9zZU1lbnVPbk91dHNpZGVDbGljayk7XG4gICAgfTtcbiAgfSwgW2lzRHJhZ2dpbmdFbmFibGVkXSk7XG4gIC8vZnVuY3Rpb24gY2hhbmdlIGZvcm1hdCBhcnJheSBsaXN0IHdpdGggc2VsZWN0ZWQgZGF0ZSBhbmQgZm9ybWF0XG4gIGNvbnN0IGNoYW5nZURhdGVGb3JtYXQgPSAoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlRGF0ZSA9IFtdO1xuICAgIGRhdGVGb3JtYXRBcnIubWFwKChkYXRhKSA9PiB7XG4gICAgICBsZXQgZGF0ZTtcbiAgICAgIGlmIChzZWxlY3REYXRlICYmIHNlbGVjdERhdGUuZm9ybWF0ID09PSBcImRkLU1NLXl5eXlcIikge1xuICAgICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBzZWxlY3REYXRlLmRhdGUuc3BsaXQoXCItXCIpO1xuICAgICAgICBkYXRlID0gbmV3IERhdGUoYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRlID0gbmV3IERhdGUoc2VsZWN0RGF0ZT8uZGF0ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSBtb21lbnQobWlsbGlzZWNvbmRzKS5mb3JtYXQoZGF0YSk7XG4gICAgICBjb25zdCBkYXRlT2JqID0ge1xuICAgICAgICBkYXRlOiBuZXdEYXRlLFxuICAgICAgICBmb3JtYXQ6IHNlbGVjdEZvcm1hdChkYXRhKVxuICAgICAgfTtcbiAgICAgIHVwZGF0ZURhdGUucHVzaChkYXRlT2JqKTtcbiAgICB9KTtcbiAgICBzZXREYXRlRm9ybWF0KHVwZGF0ZURhdGUpO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHByb3BzLmlzUGxhY2Vob2xkZXIgfHwgcHJvcHMuaXNTaWduWW91cnNlbGYpIHtcbiAgICAgIHNlbGVjdERhdGUgJiYgY2hhbmdlRGF0ZUZvcm1hdCgpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtzZWxlY3REYXRlXSk7XG5cbiAgLy9pdCBkZXRlY3Qgb3V0c2lkZSBjbGljayBvZiBkYXRlIGRyb3Bkb3duIG1lbnVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjbG9zZU1lbnVPbk91dHNpZGVDbGljayA9IChlKSA9PiB7XG4gICAgICBpZiAoaXNTaG93RGF0ZUZvcm1hdCAmJiAhZS50YXJnZXQuY2xvc2VzdChcIiNtZW51LWNvbnRhaW5lclwiKSkge1xuICAgICAgICBzZXRJc1Nob3dEYXRlRm9ybWF0KCFpc1Nob3dEYXRlRm9ybWF0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBjbG9zZU1lbnVPbk91dHNpZGVDbGljayk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIC8vIENsZWFudXAgdGhlIGV2ZW50IGxpc3RlbmVyIHdoZW4gdGhlIGNvbXBvbmVudCB1bm1vdW50c1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNsb3NlTWVudU9uT3V0c2lkZUNsaWNrKTtcbiAgICB9O1xuICB9LCBbaXNTaG93RGF0ZUZvcm1hdF0pO1xuXG4gIC8vYGhhbmRsZVdpZGdldElkYW5kUG9wdXBgIGlzIHVzZWQgdG8gc2V0IGN1cnJlbnQgd2lkZ2V0IGlkIGFuZCBvcGVuIHJlbGF0aXZlIHBvcHVwXG4gIGNvbnN0IGhhbmRsZVdpZGdldElkYW5kUG9wdXAgPSAoKSA9PiB7XG4gICAgaWYgKHByb3BzLnNldFNlbGVjdFdpZGdldElkKSB7XG4gICAgICBwcm9wcy5zZXRTZWxlY3RXaWRnZXRJZChwcm9wcy5wb3Mua2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWRnZXRUeXBlRXhpc3QgPSBbXG4gICAgICB0ZXh0SW5wdXRXaWRnZXQsXG4gICAgICBcImNoZWNrYm94XCIsXG4gICAgICBcIm5hbWVcIixcbiAgICAgIFwiY29tcGFueVwiLFxuICAgICAgXCJqb2IgdGl0bGVcIixcbiAgICAgIFwiZGF0ZVwiLFxuICAgICAgXCJlbWFpbFwiLFxuICAgICAgdGV4dFdpZGdldFxuICAgIF0uaW5jbHVkZXMocHJvcHMucG9zLnR5cGUpO1xuXG4gICAgaWYgKHdpZGdldFR5cGVFeGlzdCkge1xuICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkKGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKChwcm9wcy5pc05lZWRTaWduIHx8IHByb3BzLmlzU2lnbllvdXJzZWxmKSAmJiAhcHJvcHMuaXNEcmFnZ2luZykge1xuICAgICAgaWYgKHByb3BzPy5pc3B1YmxpY1RlbXBsYXRlKSB7XG4gICAgICAgIHByb3BzLmhhbmRsZVVzZXJEZXRhaWxzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvcHMucG9zLnR5cGUpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJzaWduYXR1cmVcIiB8fFxuICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwic3RhbXBcIiB8fFxuICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiaW1hZ2VcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJvcHMuc2V0SXNTaWduUGFkKHRydWUpO1xuICAgICAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcbiAgICAgICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zLmlzU3RhbXApO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJvcHMucG9zLnR5cGUgPT09IFwiaW5pdGlhbHNcIikge1xuICAgICAgICAgICAgcHJvcHMuc2V0SXNTaWduUGFkKHRydWUpO1xuICAgICAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcbiAgICAgICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zLmlzU3RhbXApO1xuICAgICAgICAgICAgcHJvcHMuc2V0SXNJbml0aWFsKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wcy5zZXRJc1NpZ25QYWQodHJ1ZSk7XG4gICAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcbiAgICAgICAgICBwcm9wcy5zZXRJc1N0YW1wKHByb3BzLnBvcz8uaXNTdGFtcCA/IHByb3BzLnBvcy5pc1N0YW1wIDogZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHByb3BzLmlzUGxhY2Vob2xkZXIgJiZcbiAgICAgICFwcm9wcy5pc0RyYWdnaW5nICYmXG4gICAgICBwcm9wcy5wb3MudHlwZSAhPT0gdGV4dFdpZGdldFxuICAgICkge1xuICAgICAgaWYgKHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkKSB7XG4gICAgICAgIHByb3BzLmhhbmRsZUxpbmtVc2VyKHByb3BzLmRhdGEuSWQpO1xuICAgICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcy5kYXRhLklkKTtcbiAgICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXG4gICAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcbiAgICAgICAgKTtcbiAgICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXByb3BzLnBvcy50eXBlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFwcm9wcy5wb3MudHlwZSAmJlxuICAgICAgICBwcm9wcy5pc05lZWRTaWduICYmXG4gICAgICAgIHByb3BzLmRhdGEuc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkXG4gICAgICApIHtcbiAgICAgICAgcHJvcHMuc2V0SXNTaWduUGFkKHRydWUpO1xuICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xuICAgICAgICBwcm9wcy5zZXRJc1N0YW1wKHByb3BzLnBvcy5pc1N0YW1wKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLnBvcy50eXBlID09PSBcInNpZ25hdHVyZVwiKSB8fFxuICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJzdGFtcFwiXG4gICAgICApIHtcbiAgICAgICAgcHJvcHMuc2V0SXNTaWduUGFkKHRydWUpO1xuICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xuICAgICAgICBwcm9wcy5zZXRJc1N0YW1wKHByb3BzLnBvcy5pc1N0YW1wKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5wb3MudHlwZSA9PT0gXCJkcm9wZG93blwiKSB7XG4gICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIgPSAoKSA9PiB7XG4gICAgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzICYmIHByb3BzLnNldEN1cnJXaWRnZXRzRGV0YWlscyhwcm9wcy5wb3MpO1xuICAgIGlmICghcHJvcHMuaXNOZWVkU2lnbikge1xuICAgICAgcHJvcHMuc2V0V2lkZ2V0VHlwZShwcm9wcy5wb3MudHlwZSk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkge1xuICAgICAgaGFuZGxlV2lkZ2V0SWRhbmRQb3B1cCgpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBwcm9wcz8uaXNOZWVkU2lnbiAmJlxuICAgICAgcHJvcHM/LnVuaXF1ZUlkICYmXG4gICAgICBwcm9wcy5kYXRhPy5JZCA9PT0gcHJvcHM/LnVuaXF1ZUlkXG4gICAgKSB7XG4gICAgICBoYW5kbGVXaWRnZXRJZGFuZFBvcHVwKCk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5pc1BsYWNlaG9sZGVyIHx8IHByb3BzLmlzU2lnbllvdXJzZWxmKSB7XG4gICAgICBoYW5kbGVXaWRnZXRJZGFuZFBvcHVwKCk7XG4gICAgfVxuICB9O1xuICAvL2BoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb25gIGlzIHVzZWQgc2V0IGN1cnJlbnQgd2lkZ2V0IGRldGFpbHMgYW5kIG9wZW4gc2V0dGluZyBvZiBpdFxuICBjb25zdCBoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb24gPSAoKSA9PiB7XG4gICAgaWYgKHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCkge1xuICAgICAgcHJvcHMuc2V0SXNSYWRpbyh0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLnBvcy50eXBlID09PSBcImRyb3Bkb3duXCIpIHtcbiAgICAgIHByb3BzPy5zZXRTaG93RHJvcGRvd24odHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICBwcm9wcz8uc2V0SXNDaGVja2JveCh0cnVlKTtcbiAgICB9XG4gICAgLy9jb25kaXRpb24gdG8gaGFuZGxlIHNldHRpbmcgaWNvbiBmb3Igc2lnbnlvdXItc2VsZiBmbG93IGZvciBhbGwgdHlwZSB0ZXh0IHdpZGdldHNcbiAgICBlbHNlIGlmIChcbiAgICAgIFtcbiAgICAgICAgdGV4dElucHV0V2lkZ2V0LFxuICAgICAgICB0ZXh0V2lkZ2V0LFxuICAgICAgICBcIm5hbWVcIixcbiAgICAgICAgXCJjb21wYW55XCIsXG4gICAgICAgIFwiam9iIHRpdGxlXCIsXG4gICAgICAgIFwiZW1haWxcIlxuICAgICAgXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSkgJiZcbiAgICAgIHByb3BzLmlzU2lnbllvdXJzZWxmXG4gICAgKSB7XG4gICAgICBwcm9wcy5oYW5kbGVUZXh0U2V0dGluZ01vZGFsKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wcz8uaGFuZGxlTmFtZU1vZGFsICYmIHByb3BzPy5oYW5kbGVOYW1lTW9kYWwodHJ1ZSk7XG4gICAgfVxuXG4gICAgLy9jb25kaXRpb24gZm9yIG9ubHkgcGxhY2Vob2xkZXIgYW5kIHRlbXBsYXRlIGZsb3dcbiAgICBpZiAocHJvcHMuZGF0YSAmJiBwcm9wcz8ucG9zPy50eXBlICE9PSB0ZXh0V2lkZ2V0KSB7XG4gICAgICBwcm9wcy5zZXRTaWduZXJPYmpJZChwcm9wcz8uZGF0YT8uc2lnbmVyT2JqSWQpO1xuICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHM/LmRhdGE/LklkKTtcbiAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxuICAgICAgKTtcblxuICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xuICAgIH1cbiAgICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgaW4gcGxhY2Vob2xkZXIgYW5kIHRlbXBsYXRlIGZsb3cgZm9yIHRleHQgd2lkZ2V0IHNpZ25lcklkIGZvciB0ZXh0IHdpZGdldHMgaSBoYXZlIHRvIHNldCB1bmlxdWVJZCBpbiB0ZW1wU2lnbmVySWQgYmVjYXVzZVxuICAgIC8vaXQgZG9lcyBub3QgaGF2ZSBhbnkgc2lnbmVyIHVzZXIgYW5kIGFueSBzaWduZXJvYmpJZFxuICAgIGVsc2UgaWYgKHByb3BzLmRhdGEgJiYgcHJvcHMucG9zLnR5cGUgPT09IHRleHRXaWRnZXQpIHtcbiAgICAgIHByb3BzLnNldFRlbXBTaWduZXJJZChwcm9wcy51bmlxdWVJZCk7XG4gICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcz8uZGF0YT8uSWQpO1xuICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXG4gICAgICAgIChkYXRhKSA9PiBkYXRhLklkID09PSBwcm9wcy5kYXRhLklkXG4gICAgICApO1xuICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xuICAgIH1cbiAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xuICAgIHByb3BzLnNldFdpZGdldFR5cGUocHJvcHMucG9zLnR5cGUpO1xuICAgIHByb3BzLnNldEN1cnJXaWRnZXRzRGV0YWlscyhwcm9wcy5wb3MpO1xuICB9O1xuICAvL2Z1bmN0aW9uIHRvIHNldCByZXF1aXJlZCBzdGF0ZSB2YWx1ZSBvbmNsaWNrIG9uIHdpZGdldCdzIGNvcHkgaWNvblxuICBjb25zdCBoYW5kbGVDb3B5UGxhY2Vob2xkZXIgPSAoZSkgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy9jb25kaXRpb24gdG8gaGFuZGxlIHRleHQgd2lkZ2V0IHNpZ25lciBvYmogaWQgYW5kIHVuaXF1ZSBpZFxuICAgIC8vd2hlbiB1c2VyIGNsaWNrIG9uIGNvcHkgaWNvbiBvZiB0ZXh0IHdpZGdldCBpbiB0aGF0IGNvbmRpdGlvbiB0ZXh0IHdpZGdldCBkb2VzIG5vdCBoYXZlIGFueSBzaWduZXJPYmpJZFxuICAgIC8vaW4gdGhhdCBjYXNlIGkgaGF2ZSB0byBzYXZlIGluIHRlbXBTaWduZXJJZCBhcyBhIHVuaXF1ZSBpZCBvZiBwcmV2aW91cyBzZWxlY3Qgc2lnbmVyJ3MgdW5pcXVlIGlkXG4gICAgLy9hbmQgb24gc2F2ZSBvciBjYW5jZWwgYnV0dG9uIG9mIGNvcHkgYWxsIHBhZ2UgcG9wdXAgaSBoYXZlIHNldCB0aGlzIHRlbXAgc2lnbmVyIElkIGluIHVuaXF1ZSBpZFxuXG4gICAgaWYgKHByb3BzLmRhdGEgJiYgcHJvcHM/LnBvcz8udHlwZSAhPT0gdGV4dFdpZGdldCkge1xuICAgICAgcHJvcHMuc2V0U2lnbmVyT2JqSWQocHJvcHM/LmRhdGE/LnNpZ25lck9iaklkKTtcbiAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzPy5kYXRhPy5JZCk7XG4gICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcbiAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcbiAgICAgICk7XG5cbiAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLmRhdGEgJiYgcHJvcHMucG9zLnR5cGUgPT09IHRleHRXaWRnZXQpIHtcbiAgICAgIHByb3BzLnNldFRlbXBTaWduZXJJZChwcm9wcy51bmlxdWVJZCk7XG4gICAgICBwcm9wcy5zZXRTaWduZXJPYmpJZChwcm9wcz8uZGF0YT8uc2lnbmVyT2JqSWQpO1xuICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHM/LmRhdGE/LklkKTtcbiAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxuICAgICAgKTtcbiAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcbiAgICB9XG5cbiAgICAvL2NoZWNraW5nIHdpZGdldCdzIHR5cGUgYW5kIG9wZW4gd2lkZ2V0IGNvcHkgbW9kYWwgZm9yIHJlcXVpcmVkIHdpZGdldHNcbiAgICBpZiAoXG4gICAgICBbXCJzaWduYXR1cmVcIiwgdGV4dFdpZGdldCwgXCJzdGFtcFwiLCBcImluaXRpYWxcIl0uaW5jbHVkZXMocHJvcHMucG9zLnR5cGUpXG4gICAgKSB7XG4gICAgICBwcm9wcy5zZXRJc1BhZ2VDb3B5KHRydWUpO1xuICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9mdW5jdGlvbiB0byBjcmVhdGUgbmV3IHdpZGdldCBuZXh0IHRvIGp1c3Qgd2lkZ2V0XG4gICAgICBoYW5kbGVDb3B5TmV4dFRvV2lkZ2V0KFxuICAgICAgICBwcm9wcy5wb3MsXG4gICAgICAgIHByb3BzLnBvcy50eXBlLFxuICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIC8vZnVuY3Rpb24gdG8gc2F2ZSBkYXRlIGFuZCBmb3JtYXQgb24gbG9jYWwgYXJyYXkgb25jaGFuZ2UgZGF0ZSBhbmQgb25jbGljayBmb3JtYXRcbiAgY29uc3QgaGFuZGxlU2F2ZURhdGUgPSAoZGF0YSwgaXNEYXRlQ2hhbmdlKSA9PiB7XG4gICAgbGV0IHVwZGF0ZURhdGUgPSBkYXRhLmRhdGU7XG4gICAgLy9jaGVjayBpZiBkYXRlIGNoYW5nZSBieSB1c2VyXG4gICAgaWYgKGlzRGF0ZUNoYW5nZSkge1xuICAgICAgLy9gY2hhbmdlRGF0ZVRvTW9tZW50Rm9ybWF0YCBpcyB1c2VkIHRvIGNvbnZlcnQgZGF0ZSBhcyBwZXIgcmVxdWlyZWQgdG8gbW9tZW50IHBhY2thZ2VcbiAgICAgIHVwZGF0ZURhdGUgPSBtb21lbnQoZGF0YS5kYXRlKS5mb3JtYXQoXG4gICAgICAgIGNoYW5nZURhdGVUb01vbWVudEZvcm1hdChkYXRhLmZvcm1hdClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vdXNpbmcgbW9tZW50IHBhY2thZ2UgaXMgdXNlZCB0byBjaGFuZ2UgZGF0ZSBhcyBwZXIgdGhlIGZvcm1hdCBwcm92aWRlZCBpbiBzZWxlY3REYXRlIG9iaiBlLmcuIC0gTU0vZGQveXl5eSAtPiAwMy8xMi8yMDI0XG4gICAgLy9gZ2V0RGVmYXVsdGRhdGVgIGlzIHVzZWQgdG8gY29udmVydCB1cGRhdGUgZGF0ZSBpbiBuZXcgRGF0ZSgpIGZvcm1hdFxuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQoXG4gICAgICBnZXREZWZhdWx0ZGF0ZSh1cGRhdGVEYXRlLCBkYXRhPy5mb3JtYXQpLmdldFRpbWUoKVxuICAgICkuZm9ybWF0KGNoYW5nZURhdGVUb01vbWVudEZvcm1hdChkYXRhPy5mb3JtYXQpKTtcblxuICAgIC8vYG9uQ2hhbmdlSW5wdXRgIGlzIHVzZWQgdG8gc2F2ZSBkYXRhIHJlbGF0ZWQgdG8gZGF0ZSBpbiBhIHBsYWNlaG9sZGVyIGZpZWxkXG4gICAgb25DaGFuZ2VJbnB1dChcbiAgICAgIGRhdGUsXG4gICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgcHJvcHMuaW5kZXgsXG4gICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGEuSWQsXG4gICAgICBmYWxzZSxcbiAgICAgIGRhdGE/LmZvcm1hdFxuICAgICk7XG4gICAgc2V0U2VsZWN0RGF0ZSh7IGRhdGU6IGRhdGUsIGZvcm1hdDogZGF0YT8uZm9ybWF0IH0pO1xuICB9O1xuICBjb25zdCBQbGFjZWhvbGRlckljb24gPSAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHByb3BzLmlzU2hvd0JvcmRlciAmJiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgeyhwcm9wcy5pc1BsYWNlaG9sZGVyIHx8IHByb3BzLmlzU2lnbllvdXJzZWxmKSAmJiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICB7LyogY29uZGl0aW9uIHRvIGFkZCBzZXR0aW5nIGljb24gZm9yIHNpZ255b3VyLXNlbGYgZmxvdyBmb3IgcGFydGljdWxhciB0ZXh0IHdpZGdldHNcbiAgICAgICAgICAgIGFuZCBhbHNvIGl0IGhhdmUgZGlmZnJlbnQgcG9zaXRpb24gXG4gICAgICAgICAgICAqL31cbiAgICAgICAgICAgICAge1tcbiAgICAgICAgICAgICAgICBcImNoZWNrYm94XCIsXG4gICAgICAgICAgICAgICAgdGV4dElucHV0V2lkZ2V0LFxuICAgICAgICAgICAgICAgIHRleHRXaWRnZXQsXG4gICAgICAgICAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjb21wYW55XCIsXG4gICAgICAgICAgICAgICAgXCJqb2IgdGl0bGVcIixcbiAgICAgICAgICAgICAgICBcImVtYWlsXCJcbiAgICAgICAgICAgICAgXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSkgJiYgcHJvcHMuaXNTaWduWW91cnNlbGYgPyAoXG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbigpO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIG9uVG91Y2hFbmQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbigpO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWdlYXIgaWNvblwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCIjMTg4YWUyXCIsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBcIjI5cHhcIixcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBcIi0xOXB4XCJcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAvKiBjb25kaXRpb24gdG8gYWRkIHNldHRpbmcgaWNvbiBmb3IgcGxhY2Vob2xkZXIgJiB0ZW1wbGF0ZSBmbG93IGZvciBhbGwgd2lkZ2V0cyBleGNlcHQgc2lnbmF0dXJlIGFuZCBkYXRlICovXG4gICAgICAgICAgICAgICAgKCghcHJvcHM/LnBvcz8udHlwZSAmJiBwcm9wcy5wb3MuaXNTdGFtcCkgfHxcbiAgICAgICAgICAgICAgICAgIChwcm9wcz8ucG9zPy50eXBlICYmXG4gICAgICAgICAgICAgICAgICAgICFbXCJkYXRlXCIsIFwic2lnbmF0dXJlXCJdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKSAmJlxuICAgICAgICAgICAgICAgICAgICAhcHJvcHMuaXNTaWduWW91cnNlbGYpKSAmJiAoXG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25DbGlja1NldHRpbmdJY29uKCk7XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIG9uVG91Y2hFbmQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZ2VhciBpY29uXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCIjMTg4YWUyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHByb3BzPy5wb3M/LnR5cGUgPT09IHRleHRXaWRnZXQgPyBcIjMycHhcIiA6IFwiNDdweFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHRvcDogXCItMTlweFwiXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgey8qIGNvbmRpdGlvbiBmb3IgdXNlcmljb24gZm9yIGFsbCB3aWRnZXRzIGV4Y2VwdCB0ZXh0IHdpZGdldHMgYW5kIHNpZ255b3VyLXNlbGYgZmxvdyAqL31cbiAgICAgICAgICAgICAge3Byb3BzLnBvcy50eXBlICE9PSB0ZXh0V2lkZ2V0ICYmICFwcm9wcy5pc1NpZ25Zb3Vyc2VsZiAmJiAoXG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwiYXNzaWduU2lnbmVyXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXVzZXIgaWNvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVMaW5rVXNlcihwcm9wcy5kYXRhLklkKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHMuZGF0YS5JZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLklkID09PSBwcm9wcy5kYXRhLklkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVMaW5rVXNlcihwcm9wcy5kYXRhLklkKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHMuZGF0YS5JZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLklkID09PSBwcm9wcy5kYXRhLklkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogXCIjMTg4YWUyXCIsIHJpZ2h0OiBcIjMycHhcIiwgdG9wOiBcIi0xOHB4XCIgfX1cbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7Lyogc2V0dGluZyBpY29uIG9ubHkgZm9yIGRhdGUgd2lkZ2V0cyAqL31cbiAgICAgICAgICB7cHJvcHMucG9zLnR5cGUgPT09IFwiZGF0ZVwiICYmIHNlbGVjdERhdGUgJiYgKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBpZD1cIm1lbnUtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICB6SW5kZXg6IFwiOTlcIixcbiAgICAgICAgICAgICAgICB0b3A6IFwiLTE5cHhcIixcbiAgICAgICAgICAgICAgICByaWdodDogcHJvcHMuaXNQbGFjZWhvbGRlciA/IFwiNjBweFwiIDogXCI0NHB4XCJcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtpc1Nob3dEYXRlRm9ybWF0ID8gXCJzaG93XCIgOiBcIlwifSBkcm9wZG93biBpY29uYH1cbiAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRJc1Nob3dEYXRlRm9ybWF0KCFpc1Nob3dEYXRlRm9ybWF0KTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xuICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHMuZGF0YS5JZCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgc2V0SXNTaG93RGF0ZUZvcm1hdCghaXNTaG93RGF0ZUZvcm1hdCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcy5kYXRhLklkKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZ2VhciBpY29uXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgY29sb3I6IFwiIzE4OGFlMlwiLFxuICAgICAgICAgICAgICAgICAgZm9udFNpemU6IFwiMTRweFwiXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XG4gICAgICAgICAgICAgICAgICBpc1Nob3dEYXRlRm9ybWF0ID8gXCJkcm9wZG93bi1tZW51IHNob3dcIiA6IFwiZHJvcGRvd24tbWVudVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duTWVudUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD17aXNTaG93RGF0ZUZvcm1hdCA/IFwidHJ1ZVwiIDogXCJmYWxzZVwifVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2RhdGVGb3JtYXQubWFwKChkYXRhLCBpbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtpbmR9XG4gICAgICAgICAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1Nob3dEYXRlRm9ybWF0KCFpc1Nob3dEYXRlRm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdERhdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTYXZlRGF0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU2hvd0RhdGVGb3JtYXQoIWlzU2hvd0RhdGVGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0RGF0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNhdmVEYXRlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZHJvcGRvd24taXRlbSB0ZXh0LVsxM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7ZGF0YT8uZGF0ZSA/IGRhdGE/LmRhdGUgOiBcIm5vZGF0YVwifVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAgey8qIGNvcHkgaWNvbiBmb3IgYWxsIHdpZGdldHMgKi99XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWNvcHkgaWNvblwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gaGFuZGxlQ29weVBsYWNlaG9sZGVyKGUpfVxuICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IGhhbmRsZUNvcHlQbGFjZWhvbGRlcihlKX1cbiAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiBcIiMxODhhZTJcIiwgcmlnaHQ6IFwiMTJweFwiLCB0b3A6IFwiLTE4cHhcIiB9fVxuICAgICAgICAgID48L2k+XG4gICAgICAgICAgey8qIGRlbGV0ZSBpY29uIGZvciBhbGwgd2lkZ2V0cyAqL31cbiAgICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtY2lyY2xlLXhtYXJrIGljb25cIlxuICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgLy9jb25kaXRpb24gZm9yIHRlbXBsYXRlIGFuZCBwbGFjZWhvbGRlciBmbG93XG4gICAgICAgICAgICAgIGlmIChwcm9wcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMuaGFuZGxlRGVsZXRlU2lnbihwcm9wcy5wb3Mua2V5LCBwcm9wcy5kYXRhLklkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL2NvbmRpdGlvbiBmb3Igc2lnbnlvdXItc2VsZiBmbG93XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZURlbGV0ZVNpZ24ocHJvcHMucG9zLmtleSk7XG4gICAgICAgICAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvL2ZvciBtb2JpbGUgYW5kIHRhYmxldCB0b3VjaCBldmVudFxuICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgLy9jb25kaXRpb24gZm9yIHRlbXBsYXRlIGFuZCBwbGFjZWhvbGRlciBmbG93XG4gICAgICAgICAgICAgIGlmIChwcm9wcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMuaGFuZGxlRGVsZXRlU2lnbihwcm9wcy5wb3Mua2V5LCBwcm9wcy5kYXRhPy5JZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9jb25kaXRpb24gZm9yIHNpZ255b3VyLXNlbGYgZmxvd1xuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVEZWxldGVTaWduKHByb3BzLnBvcy5rZXkpO1xuICAgICAgICAgICAgICAgIHByb3BzLnNldElzU3RhbXAoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IFwiIzE4OGFlMlwiLCByaWdodDogXCItOHB4XCIsIHRvcDogXCItMThweFwiIH19XG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgPC8+XG4gICAgICApXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgeFBvcyA9IChwb3MsIHNpZ25Zb3Vyc2VsZikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lclNjYWxlID0gZ2V0Q29udGFpbmVyU2NhbGUoXG4gICAgICBwcm9wcy5wZGZPcmlnaW5hbFdILFxuICAgICAgcHJvcHMucGFnZU51bWJlcixcbiAgICAgIHByb3BzLmNvbnRhaW5lcldIXG4gICAgKTtcbiAgICBjb25zdCByZXNpemVQb3MgPSBwb3MueFBvc2l0aW9uO1xuICAgIGlmIChzaWduWW91cnNlbGYpIHtcbiAgICAgIHJldHVybiByZXNpemVQb3MgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL2NoZWNraW5nIGJvdGggY29uZGl0aW9uIG1vYmlsZSBhbmQgZGVza3RvcCB2aWV3XG4gICAgICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xuICAgICAgICBpZiAocHJvcHMuc2NhbGUgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogcHJvcHMuc2NhbGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiAocG9zLnNjYWxlID09PSBjb250YWluZXJTY2FsZSkge1xuICAgICAgICAvLyAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBwcm9wcy5zY2FsZTtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIGNvbnRhaW5lclNjYWxlICogcHJvcHMuc2NhbGU7XG4gICAgICAgIC8vIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHlQb3MgPSAocG9zLCBzaWduWW91cnNlbGYpID0+IHtcbiAgICBjb25zdCBjb250YWluZXJTY2FsZSA9IGdldENvbnRhaW5lclNjYWxlKFxuICAgICAgcHJvcHMucGRmT3JpZ2luYWxXSCxcbiAgICAgIHByb3BzLnBhZ2VOdW1iZXIsXG4gICAgICBwcm9wcy5jb250YWluZXJXSFxuICAgICk7XG4gICAgY29uc3QgcmVzaXplUG9zID0gcG9zLnlQb3NpdGlvbjtcblxuICAgIGlmIChzaWduWW91cnNlbGYpIHtcbiAgICAgIHJldHVybiByZXNpemVQb3MgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL2NoZWNraW5nIGJvdGggY29uZGl0aW9uIG1vYmlsZSBhbmQgZGVza3RvcCB2aWV3XG4gICAgICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xuICAgICAgICBpZiAocHJvcHMuc2NhbGUgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogcHJvcHMuc2NhbGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBlbHNlIGlmIChwb3Muc2NhbGUgPT09IGNvbnRhaW5lclNjYWxlKSB7XG4gICAgICAvLyAgIGlmIChwcm9wcy5zY2FsZSA+IDEpIHtcbiAgICAgIC8vICAgICByZXR1cm4gcmVzaXplUG9zICogcG9zLnNjYWxlICogcHJvcHMuc2NhbGU7XG4gICAgICAvLyAgIH0gZWxzZSB7XG4gICAgICAvLyAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiByZXNpemVQb3MgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRDdXJzb3IgPSAoKSA9PiB7XG4gICAgaWYgKHByb3BzLmRhdGEgJiYgcHJvcHMuaXNOZWVkU2lnbikge1xuICAgICAgaWYgKHByb3BzPy5zaWduZXJPYmpJZCAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpIHtcbiAgICAgICAgcmV0dXJuIFwicG9pbnRlclwiO1xuICAgICAgfSBlbHNlIGlmIChwcm9wcz8udW5pcXVlSWQgJiYgcHJvcHMuZGF0YT8uSWQgPT09IHByb3BzLnVuaXF1ZUlkKSB7XG4gICAgICAgIHJldHVybiBcInBvaW50ZXJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIm5vdC1hbGxvd2VkXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcImFsbC1zY3JvbGxcIjtcbiAgICB9XG4gIH07XG4gIHJldHVybiAoXG4gICAgPFJuZFxuICAgICAgaWQ9e3Byb3BzLnBvcy5rZXl9XG4gICAgICBkYXRhLXR1dD17cHJvcHMucG9zLmtleSA9PT0gcHJvcHMudW5TaWduZWRXaWRnZXRJZCA/IFwiSXNTaWduZWRcIiA6IFwiXCJ9XG4gICAgICBrZXk9e3Byb3BzLnBvcy5rZXl9XG4gICAgICBsb2NrQXNwZWN0UmF0aW89e1xuICAgICAgICAhW1xuICAgICAgICAgIHRleHRXaWRnZXQsXG4gICAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICAgIFwibmFtZVwiLFxuICAgICAgICAgIFwiY29tcGFueVwiLFxuICAgICAgICAgIFwiam9iIHRpdGxlXCIsXG4gICAgICAgICAgdGV4dElucHV0V2lkZ2V0XG4gICAgICAgIF0uaW5jbHVkZXMocHJvcHMucG9zLnR5cGUpICYmXG4gICAgICAgIChwcm9wcy5wb3MuV2lkdGhcbiAgICAgICAgICA/IHByb3BzLnBvcy5XaWR0aCAvIHByb3BzLnBvcy5IZWlnaHRcbiAgICAgICAgICA6IGRlZmF1bHRXaWR0aEhlaWdodChwcm9wcy5wb3MudHlwZSkud2lkdGggL1xuICAgICAgICAgICAgZGVmYXVsdFdpZHRoSGVpZ2h0KHByb3BzLnBvcy50eXBlKS5oZWlnaHQpXG4gICAgICB9XG4gICAgICBlbmFibGVSZXNpemluZz17e1xuICAgICAgICB0b3A6IGZhbHNlLFxuICAgICAgICByaWdodDogZmFsc2UsXG4gICAgICAgIGJvdHRvbTogZmFsc2UsXG4gICAgICAgIGxlZnQ6IGZhbHNlLFxuICAgICAgICB0b3BSaWdodDogZmFsc2UsXG4gICAgICAgIGJvdHRvbVJpZ2h0OlxuICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuaXNOZWVkU2lnblxuICAgICAgICAgICAgPyBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQgJiZcbiAgICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwiY2hlY2tib3hcIiAmJlxuICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gcmFkaW9CdXR0b25XaWRnZXRcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2VcbiAgICAgICAgICAgIDogcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXG4gICAgICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgJiZcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSA9PT0gcHJvcHMuc2VsZWN0V2lkZ2V0SWQgJiZcbiAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgYm90dG9tTGVmdDogZmFsc2UsXG4gICAgICAgIHRvcExlZnQ6IGZhbHNlXG4gICAgICB9fVxuICAgICAgYm91bmRzPVwicGFyZW50XCJcbiAgICAgIGNsYXNzTmFtZT1cInNpZ25Zb3Vyc2VsZkJsb2NrXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgIzAwN2JmZlwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMnB4XCIsXG4gICAgICAgIHRleHRBbGlnbjpcbiAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJuYW1lXCIgJiZcbiAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJjb21wYW55XCIgJiZcbiAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJqb2IgdGl0bGVcIiAmJlxuICAgICAgICAgIFwiY2VudGVyXCIsXG4gICAgICAgIGN1cnNvcjogZ2V0Q3Vyc29yKCksXG4gICAgICAgIHpJbmRleDpcbiAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCJcbiAgICAgICAgICAgID8gcHJvcHMucG9zLmtleSA9PT0gcHJvcHMuc2VsZWN0V2lkZ2V0SWRcbiAgICAgICAgICAgICAgPyA5OSArIDFcbiAgICAgICAgICAgICAgOiA5OVxuICAgICAgICAgICAgOiBwcm9wcz8ucG9zPy56SW5kZXhcbiAgICAgICAgICAgICAgPyBwcm9wcy5wb3MuekluZGV4XG4gICAgICAgICAgICAgIDogXCI1XCIsXG4gICAgICAgIGJhY2tncm91bmQ6IHByb3BzLmRhdGEgPyBwcm9wcy5kYXRhLmJsb2NrQ29sb3IgOiBcInJnYigyMDMgMjMzIDIzNylcIlxuICAgICAgfX1cbiAgICAgIG9uRHJhZz17KCkgPT4ge1xuICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIHByb3BzLmhhbmRsZVRhYkRyYWcgJiYgcHJvcHMuaGFuZGxlVGFiRHJhZyhwcm9wcy5wb3Mua2V5KTtcbiAgICAgIH19XG4gICAgICBzaXplPXt7XG4gICAgICAgIHdpZHRoOlxuICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCB8fCBwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiXG4gICAgICAgICAgICA/IFwiYXV0b1wiXG4gICAgICAgICAgICA6IHByb3BzLnBvc1dpZHRoKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpLFxuICAgICAgICBoZWlnaHQ6XG4gICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0IHx8IHByb3BzLnBvcy50eXBlID09PSBcImNoZWNrYm94XCJcbiAgICAgICAgICAgID8gXCJhdXRvXCJcbiAgICAgICAgICAgIDogcHJvcHMucG9zSGVpZ2h0KHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpXG4gICAgICB9fVxuICAgICAgb25SZXNpemVTdGFydD17KCkgPT4ge1xuICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIHByb3BzLnNldElzUmVzaXplICYmIHByb3BzLnNldElzUmVzaXplKHRydWUpO1xuICAgICAgfX1cbiAgICAgIG9uUmVzaXplU3RvcD17KGUsIGRpcmVjdGlvbiwgcmVmKSA9PiB7XG4gICAgICAgIHByb3BzLnNldElzUmVzaXplICYmIHByb3BzLnNldElzUmVzaXplKGZhbHNlKTtcbiAgICAgICAgcHJvcHMuaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemUgJiZcbiAgICAgICAgICBwcm9wcy5oYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZShcbiAgICAgICAgICAgIHJlZixcbiAgICAgICAgICAgIHByb3BzLnBvcy5rZXksXG4gICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgIGNvbnRhaW5lclNjYWxlLFxuICAgICAgICAgICAgcHJvcHMuc2NhbGUsXG4gICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGEuSWQsXG4gICAgICAgICAgICBwcm9wcy5pc1Jlc2l6ZVxuICAgICAgICAgICk7XG4gICAgICB9fVxuICAgICAgZGlzYWJsZURyYWdnaW5nPXtcbiAgICAgICAgcHJvcHMuaXNOZWVkU2lnblxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogcHJvcHMuaXNQbGFjZWhvbGRlciAmJiAhW3RleHRXaWRnZXRdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKVxuICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgOiAhaXNEcmFnZ2luZ0VuYWJsZWRcbiAgICAgIH1cbiAgICAgIG9uRHJhZ1N0b3A9eyhldmVudCwgZHJhZ0VsZW1lbnQpID0+XG4gICAgICAgIHByb3BzLmhhbmRsZVN0b3AgJiZcbiAgICAgICAgcHJvcHMuaGFuZGxlU3RvcChldmVudCwgZHJhZ0VsZW1lbnQsIHByb3BzLmRhdGE/LklkLCBwcm9wcy5wb3M/LmtleSlcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uPXt7XG4gICAgICAgIHg6IHhQb3MocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiksXG4gICAgICAgIHk6IHlQb3MocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZilcbiAgICAgIH19XG4gICAgICBvblJlc2l6ZT17KGUsIGRpcmVjdGlvbiwgcmVmKSA9PiB7XG4gICAgICAgIHNldFBsYWNlaG9sZGVyQm9yZGVyKHtcbiAgICAgICAgICB3OiByZWYub2Zmc2V0V2lkdGggLyAocHJvcHMuc2NhbGUgKiBjb250YWluZXJTY2FsZSksXG4gICAgICAgICAgaDogcmVmLm9mZnNldEhlaWdodCAvIChwcm9wcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlKVxuICAgICAgICB9KTtcbiAgICAgIH19XG4gICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIoKX1cbiAgICA+XG4gICAgICB7cHJvcHMuaXNTaG93Qm9yZGVyICYmXG4gICAgICBwcm9wcy5wb3MudHlwZSAhPT0gcmFkaW9CdXR0b25XaWRnZXQgJiZcbiAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgJiZcbiAgICAgIHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkID8gKFxuICAgICAgICA8Qm9yZGVyUmVzaXplIHJpZ2h0PXstMTJ9IHRvcD17LTExfSAvPlxuICAgICAgKSA6IHByb3BzLmRhdGEgJiYgcHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5wb3MudHlwZSAhPT0gXCJjaGVja2JveFwiID8gKFxuICAgICAgICBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQgJiZcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXG4gICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgPyAoXG4gICAgICAgICAgPEJvcmRlclJlc2l6ZSAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDw+PC8+XG4gICAgICAgIClcbiAgICAgICkgOiAoXG4gICAgICAgIHByb3BzLnBvcy50eXBlICE9PSByYWRpb0J1dHRvbldpZGdldCAmJlxuICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJjaGVja2JveFwiICYmXG4gICAgICAgIHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkICYmIDxCb3JkZXJSZXNpemUgLz5cbiAgICAgICl9XG5cbiAgICAgIHtwcm9wcy5pc1Nob3dCb3JkZXIgJiYgcHJvcHMucG9zLmtleSA9PT0gcHJvcHMuc2VsZWN0V2lkZ2V0SWQgJiYgKFxuICAgICAgICA8UGxhY2Vob2xkZXJCb3JkZXJcbiAgICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQ9e3NldERyYWdnaW5nRW5hYmxlZH1cbiAgICAgICAgICBwb3M9e3Byb3BzLnBvc31cbiAgICAgICAgICBpc1BsYWNlaG9sZGVyPXtwcm9wcy5pc1BsYWNlaG9sZGVyfVxuICAgICAgICAgIGdldENoZWNrYm94UmVuZGVyV2lkdGg9e2dldENoZWNrYm94UmVuZGVyV2lkdGh9XG4gICAgICAgICAgc2NhbGU9e3Byb3BzLnNjYWxlfVxuICAgICAgICAgIGNvbnRhaW5lclNjYWxlPXtjb250YWluZXJTY2FsZX1cbiAgICAgICAgICBwbGFjZWhvbGRlckJvcmRlcj17cGxhY2Vob2xkZXJCb3JkZXJ9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAge2lzVGFiQW5kTW9iaWxlID8gKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1zdHJldGNoXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgbGVmdDogeFBvcyhwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKSxcbiAgICAgICAgICAgIHRvcDogeVBvcyhwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKSxcbiAgICAgICAgICAgIHdpZHRoOlxuICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQgfHxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgID8gXCJhdXRvXCJcbiAgICAgICAgICAgICAgICA6IHByb3BzLnBvc1dpZHRoKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpLFxuICAgICAgICAgICAgaGVpZ2h0OlxuICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQgfHxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgID8gXCJhdXRvXCJcbiAgICAgICAgICAgICAgICA6IHByb3BzLnBvc0hlaWdodChwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKSxcbiAgICAgICAgICAgIHpJbmRleDogXCIxMFwiXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvblRvdWNoRW5kPXsoKSA9PiBoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIoKX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIoKX1cbiAgICAgICAgPlxuICAgICAgICAgIHtwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiA8UGxhY2Vob2xkZXJJY29uIC8+fVxuXG4gICAgICAgICAgPFBsYWNlaG9sZGVyVHlwZVxuICAgICAgICAgICAgcG9zPXtwcm9wcy5wb3N9XG4gICAgICAgICAgICB4eVBvc3Rpb249e3Byb3BzLnh5UG9zdGlvbn1cbiAgICAgICAgICAgIGluZGV4PXtwcm9wcy5pbmRleH1cbiAgICAgICAgICAgIHNldFh5UG9zdGlvbj17cHJvcHMuc2V0WHlQb3N0aW9ufVxuICAgICAgICAgICAgZGF0YT17cHJvcHMuZGF0YX1cbiAgICAgICAgICAgIHNldFNpZ25LZXk9e3Byb3BzLnNldFNpZ25LZXl9XG4gICAgICAgICAgICBpc1Nob3dEcm9wZG93bj17cHJvcHM/LmlzU2hvd0Ryb3Bkb3dufVxuICAgICAgICAgICAgaXNQbGFjZWhvbGRlcj17cHJvcHMuaXNQbGFjZWhvbGRlcn1cbiAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtwcm9wcy5pc1NpZ25Zb3Vyc2VsZn1cbiAgICAgICAgICAgIHNpZ25lck9iaklkPXtwcm9wcy5zaWduZXJPYmpJZH1cbiAgICAgICAgICAgIGhhbmRsZVVzZXJOYW1lPXtwcm9wcy5oYW5kbGVVc2VyTmFtZX1cbiAgICAgICAgICAgIHNldERyYWdnaW5nRW5hYmxlZD17c2V0RHJhZ2dpbmdFbmFibGVkfVxuICAgICAgICAgICAgcGRmRGV0YWlscz17cHJvcHM/LnBkZkRldGFpbHMgJiYgcHJvcHM/LnBkZkRldGFpbHNbMF19XG4gICAgICAgICAgICBpc05lZWRTaWduPXtwcm9wcy5pc05lZWRTaWdufVxuICAgICAgICAgICAgc2V0U2VsZWN0RGF0ZT17c2V0U2VsZWN0RGF0ZX1cbiAgICAgICAgICAgIHNlbGVjdERhdGU9e3NlbGVjdERhdGV9XG4gICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtwcm9wcy5zZXRWYWxpZGF0ZUFsZXJ0fVxuICAgICAgICAgICAgc2V0U3RhcnREYXRlPXtzZXRTdGFydERhdGV9XG4gICAgICAgICAgICBzdGFydERhdGU9e3N0YXJ0RGF0ZX1cbiAgICAgICAgICAgIGhhbmRsZVNhdmVEYXRlPXtoYW5kbGVTYXZlRGF0ZX1cbiAgICAgICAgICAgIHhQb3M9e3Byb3BzLnhQb3N9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogKFxuICAgICAgICA8PlxuICAgICAgICAgIHtwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiA8UGxhY2Vob2xkZXJJY29uIC8+fVxuICAgICAgICAgIDxQbGFjZWhvbGRlclR5cGVcbiAgICAgICAgICAgIHBvcz17cHJvcHMucG9zfVxuICAgICAgICAgICAgeHlQb3N0aW9uPXtwcm9wcy54eVBvc3Rpb259XG4gICAgICAgICAgICBpbmRleD17cHJvcHMuaW5kZXh9XG4gICAgICAgICAgICBzZXRYeVBvc3Rpb249e3Byb3BzLnNldFh5UG9zdGlvbn1cbiAgICAgICAgICAgIGRhdGE9e3Byb3BzLmRhdGF9XG4gICAgICAgICAgICBzZXRTaWduS2V5PXtwcm9wcy5zZXRTaWduS2V5fVxuICAgICAgICAgICAgaXNTaG93RHJvcGRvd249e3Byb3BzPy5pc1Nob3dEcm9wZG93bn1cbiAgICAgICAgICAgIGlzUGxhY2Vob2xkZXI9e3Byb3BzLmlzUGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17cHJvcHMuaXNTaWduWW91cnNlbGZ9XG4gICAgICAgICAgICBzaWduZXJPYmpJZD17cHJvcHMuc2lnbmVyT2JqSWR9XG4gICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17cHJvcHMuaGFuZGxlVXNlck5hbWV9XG4gICAgICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQ9e3NldERyYWdnaW5nRW5hYmxlZH1cbiAgICAgICAgICAgIHBkZkRldGFpbHM9e3Byb3BzPy5wZGZEZXRhaWxzICYmIHByb3BzPy5wZGZEZXRhaWxzWzBdfVxuICAgICAgICAgICAgaXNOZWVkU2lnbj17cHJvcHMuaXNOZWVkU2lnbn1cbiAgICAgICAgICAgIHNldFNlbGVjdERhdGU9e3NldFNlbGVjdERhdGV9XG4gICAgICAgICAgICBzZWxlY3REYXRlPXtzZWxlY3REYXRlfVxuICAgICAgICAgICAgc2V0VmFsaWRhdGVBbGVydD17cHJvcHMuc2V0VmFsaWRhdGVBbGVydH1cbiAgICAgICAgICAgIHNldFN0YXJ0RGF0ZT17c2V0U3RhcnREYXRlfVxuICAgICAgICAgICAgc3RhcnREYXRlPXtzdGFydERhdGV9XG4gICAgICAgICAgICBoYW5kbGVTYXZlRGF0ZT17aGFuZGxlU2F2ZURhdGV9XG4gICAgICAgICAgICB4UG9zPXtwcm9wcy54UG9zfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvPlxuICAgICAgKX1cbiAgICA8L1JuZD5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXI7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB0aGVtZUNvbG9yIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L2NvbnN0XCI7XG5pbXBvcnQge1xuICBkZWZhdWx0V2lkdGhIZWlnaHQsXG4gIGlzTW9iaWxlLFxuICByYWRpb0J1dHRvbldpZGdldCxcbiAgcmVzaXplQm9yZGVyRXh0cmFXaWR0aCxcbiAgdGV4dFdpZGdldFxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcbmZ1bmN0aW9uIFBsYWNlaG9sZGVyQm9yZGVyKHByb3BzKSB7XG4gIGNvbnN0IGdldFJlc2l6ZUJvcmRlckV4dHJhV2lkdGggPSByZXNpemVCb3JkZXJFeHRyYVdpZHRoKCk7XG4gIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGRlZmF1bHRXaWR0aEhlaWdodChwcm9wcy5wb3MudHlwZSkud2lkdGg7XG4gIGNvbnN0IGRlZmF1bHRIZWlnaHQgPSBkZWZhdWx0V2lkdGhIZWlnaHQocHJvcHMucG9zLnR5cGUpLmhlaWdodDtcbiAgY29uc3Qgd2lkdGggPSAoKSA9PiB7XG4gICAgY29uc3QgZ2V0V2lkdGggPVxuICAgICAgcHJvcHMucGxhY2Vob2xkZXJCb3JkZXIudyB8fCBwcm9wcy5wb3MuV2lkdGggfHwgZGVmYXVsdFdpZHRoO1xuICAgIHJldHVybiAoXG4gICAgICBnZXRXaWR0aCAqIHByb3BzLnNjYWxlICogcHJvcHMuY29udGFpbmVyU2NhbGUgKyBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgaGVpZ2h0ID0gKCkgPT4ge1xuICAgIGNvbnN0IGdldEhlaWdodCA9XG4gICAgICBwcm9wcy5wbGFjZWhvbGRlckJvcmRlci5oIHx8IHByb3BzLnBvcy5IZWlnaHQgfHwgZGVmYXVsdEhlaWdodDtcblxuICAgIHJldHVybiAoXG4gICAgICBnZXRIZWlnaHQgKiBwcm9wcy5zY2FsZSAqIHByb3BzLmNvbnRhaW5lclNjYWxlICsgZ2V0UmVzaXplQm9yZGVyRXh0cmFXaWR0aFxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTWluV2lkdGggPSAoKSA9PiB7XG4gICAgaWYgKHByb3BzLnBvcy50eXBlID09PSBcImNoZWNrYm94XCIgfHwgcHJvcHMucG9zLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0KSB7XG4gICAgICByZXR1cm4gcHJvcHMuZ2V0Q2hlY2tib3hSZW5kZXJXaWR0aC53aWR0aCArIGdldFJlc2l6ZUJvcmRlckV4dHJhV2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB3aWR0aCgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaGFuZGxlTWluSGVpZ2h0ID0gKCkgPT4ge1xuICAgIGlmIChwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiIHx8IHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCkge1xuICAgICAgcmV0dXJuIHByb3BzLmdldENoZWNrYm94UmVuZGVyV2lkdGguaGVpZ2h0ICsgZ2V0UmVzaXplQm9yZGVyRXh0cmFXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGhlaWdodCgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBvbk1vdXNlRW50ZXI9eygpID0+ICFpc01vYmlsZSAmJiBwcm9wcz8uc2V0RHJhZ2dpbmdFbmFibGVkKHRydWUpfVxuICAgICAgb25Ub3VjaEVuZD17KCkgPT5cbiAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IHRleHRXaWRnZXQgJiYgcHJvcHM/LnNldERyYWdnaW5nRW5hYmxlZCh0cnVlKVxuICAgICAgfVxuICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5saW5lLWJsb2NrIHctWzE0cHhdIGgtWzE0cHhdICBib3JkZXItWzAuMnB4XSBvdmVyZmxvdy1oaWRkZW4gYm9yZGVyLWRhc2hlZFwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBib3JkZXJDb2xvcjogdGhlbWVDb2xvcixcbiAgICAgICAgbWluV2lkdGg6IGhhbmRsZU1pbldpZHRoKCkgfHwgMCxcbiAgICAgICAgbWluSGVpZ2h0OiBoYW5kbGVNaW5IZWlnaHQoKSB8fCAwXG4gICAgICB9fVxuICAgID48L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXJCb3JkZXI7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSwgZm9yd2FyZFJlZiwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICBnZXRNb250aCxcbiAgZ2V0WWVhcixcbiAgb25DaGFuZ2VIZWlnaHRPZlRleHRBcmVhLFxuICBvbkNoYW5nZUlucHV0LFxuICByYWRpb0J1dHRvbldpZGdldCxcbiAgcmFuZ2UsXG4gIHRleHRJbnB1dFdpZGdldCxcbiAgdGV4dFdpZGdldFxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gXCJyZWFjdC1kYXRlcGlja2VyXCI7XG5pbXBvcnQgXCJyZWFjdC1kYXRlcGlja2VyL2Rpc3QvcmVhY3QtZGF0ZXBpY2tlci5jc3NcIjtcbmltcG9ydCBcIi4uLy4uL3N0eWxlcy9zaWduYXR1cmUuY3NzXCI7XG5pbXBvcnQgUmVnZXhQYXJzZXIgZnJvbSBcInJlZ2V4LXBhcnNlclwiO1xuaW1wb3J0IHsgZW1haWxSZWdleCB9IGZyb20gXCIuLi8uLi9jb25zdGFudC9jb25zdFwiO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuY29uc3QgdGV4dFdpZGdldENscyA9XG4gIFwidy1mdWxsIGgtZnVsbCBtZDptaW4tdy1mdWxsIG1kOm1pbi1oLWZ1bGwgei1bOTk5XSB0ZXh0LVsxMnB4XSByb3VuZGVkLVsycHhdIGJvcmRlci1bMXB4XSBib3JkZXItWyMwMDdiZmZdIG92ZXJmbG93LWhpZGRlbiByZXNpemUtbm9uZSBvdXRsaW5lLW5vbmUgdGV4dC1iYXNlLWNvbnRlbnQgaXRlbS1jZW50ZXIgd2hpdGVzcGFjZS1wcmUtd3JhcCBiZy13aGl0ZVwiO1xuY29uc3Qgc2VsZWN0V2lkZ2V0Q2xzID1cbiAgXCJ3LWZ1bGwgaC1mdWxsIGFic29sdXRlIGxlZnQtMCB0b3AtMCBib3JkZXItWzFweF0gYm9yZGVyLVsjMDA3YmZmXSByb3VuZGVkLVsycHhdIGZvY3VzOm91dGxpbmUtbm9uZSB0ZXh0LWJhc2UtY29udGVudFwiO1xuZnVuY3Rpb24gUGxhY2Vob2xkZXJUeXBlKHByb3BzKSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgdHlwZSA9IHByb3BzPy5wb3M/LnR5cGU7XG4gIGNvbnN0IHdpZGdldFR5cGVUcmFzbGF0aW9uID0gdChgd2lkZ2V0cy1uYW1lLiR7cHJvcHM/LnBvcz8udHlwZX1gKTtcbiAgY29uc3QgW3NlbGVjdE9wdGlvbiwgc2V0U2VsZWN0T3B0aW9uXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbdmFsaWRhdGVQbGFjZWhvbGRlciwgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcl0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgaW5wdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IFt0ZXh0VmFsdWUsIHNldFRleHRWYWx1ZV0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbc2VsZWN0ZWRDaGVja2JveCwgc2V0U2VsZWN0ZWRDaGVja2JveF0gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IHllYXJzID0gcmFuZ2UoMTk5MCwgZ2V0WWVhcihuZXcgRGF0ZSgpKSArIDE2LCAxKTtcbiAgY29uc3QgbW9udGhzID0gW1xuICAgIFwiSmFudWFyeVwiLFxuICAgIFwiRmVicnVhcnlcIixcbiAgICBcIk1hcmNoXCIsXG4gICAgXCJBcHJpbFwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5lXCIsXG4gICAgXCJKdWx5XCIsXG4gICAgXCJBdWd1c3RcIixcbiAgICBcIlNlcHRlbWJlclwiLFxuICAgIFwiT2N0b2JlclwiLFxuICAgIFwiTm92ZW1iZXJcIixcbiAgICBcIkRlY2VtYmVyXCJcbiAgXTtcbiAgY29uc3QgdmFsaWRhdGVFeHByZXNzaW9uID0gKHJlZ2V4VmFsaWRhdGlvbikgPT4ge1xuICAgIGlmICh0ZXh0VmFsdWUgJiYgcmVnZXhWYWxpZGF0aW9uKSB7XG4gICAgICBsZXQgcmVnZXhPYmplY3QgPSByZWdleFZhbGlkYXRpb247XG4gICAgICBpZiAocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy50eXBlID09PSBcInJlZ2V4XCIpIHtcbiAgICAgICAgcmVnZXhPYmplY3QgPSBSZWdleFBhcnNlcihyZWdleFZhbGlkYXRpb24pO1xuICAgICAgfVxuICAgICAgLy8gbmV3IFJlZ0V4cChyZWdleFZhbGlkYXRpb24pO1xuICAgICAgbGV0IGlzVmFsaWRhdGUgPSByZWdleE9iamVjdC50ZXN0KHRleHRWYWx1ZSk7XG4gICAgICBpZiAoIWlzVmFsaWRhdGUpIHtcbiAgICAgICAgcHJvcHM/LnNldFZhbGlkYXRlQWxlcnQodHJ1ZSk7XG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRCbHVyID0gKCkgPT4ge1xuICAgIHByb3BzLnNldERyYWdnaW5nRW5hYmxlZCh0cnVlKTtcbiAgICBjb25zdCB2YWxpZGF0ZVR5cGUgPSBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LnR5cGU7XG4gICAgbGV0IHJlZ2V4VmFsaWRhdGlvbjtcbiAgICBpZiAodmFsaWRhdGVUeXBlICYmIHZhbGlkYXRlVHlwZSAhPT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHN3aXRjaCAodmFsaWRhdGVUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgICAgIHJlZ2V4VmFsaWRhdGlvbiA9IGVtYWlsUmVnZXg7XG4gICAgICAgICAgdmFsaWRhdGVFeHByZXNzaW9uKHJlZ2V4VmFsaWRhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICByZWdleFZhbGlkYXRpb24gPSAvXlswLTlcXHNdKiQvO1xuICAgICAgICAgIHZhbGlkYXRlRXhwcmVzc2lvbihyZWdleFZhbGlkYXRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlZ2V4VmFsaWRhdGlvbiA9IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8ucGF0dGVybiB8fCBcIlwiO1xuICAgICAgICAgIHZhbGlkYXRlRXhwcmVzc2lvbihyZWdleFZhbGlkYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVUZXh0VmFsaWQgPSAoZSkgPT4ge1xuICAgIGNvbnN0IHRleHRJbnB1dCA9IGUudGFyZ2V0LnZhbHVlO1xuICAgIHNldFRleHRWYWx1ZSh0ZXh0SW5wdXQpO1xuICB9O1xuICBmdW5jdGlvbiBjaGVja1JlZ3VsYXJFeHByZXNzKHZhbGlkYXRlVHlwZSkge1xuICAgIHN3aXRjaCAodmFsaWRhdGVUeXBlKSB7XG4gICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcihcImRlbW9AZ21haWwuY29tXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcihcIjEyMzQ1XCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgIHNldFZhbGlkYXRlUGxhY2Vob2xkZXIoXCJwbGVhc2UgZW50ZXIgdGV4dFwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzZXRWYWxpZGF0ZVBsYWNlaG9sZGVyKFwicGxlYXNlIGVudGVyIHZhbHVlXCIpO1xuICAgIH1cbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGUgJiYgdHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHByb3BzLmlzTmVlZFNpZ24pIHtcbiAgICAgIGNvbnN0IGlzRGVmYXVsdFZhbHVlID0gcHJvcHMucG9zLm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChpc0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICBzZXRTZWxlY3RlZENoZWNrYm94KGlzRGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BzLnBvcz8ub3B0aW9ucz8uaGludCkge1xuICAgICAgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcihwcm9wcy5wb3M/Lm9wdGlvbnMuaGludCk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LnR5cGUpIHtcbiAgICAgIGNoZWNrUmVndWxhckV4cHJlc3MocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy50eXBlKTtcbiAgICB9XG4gICAgc2V0VGV4dFZhbHVlKFxuICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy5yZXNwb25zZVxuICAgICAgICA/IHByb3BzLnBvcz8ub3B0aW9ucz8ucmVzcG9uc2VcbiAgICAgICAgOiBwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZVxuICAgICAgICAgID8gcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVcbiAgICAgICAgICA6IFwiXCJcbiAgICApO1xuICAgIHNldFNlbGVjdE9wdGlvbihcbiAgICAgIHByb3BzLnBvcz8ub3B0aW9ucz8ucmVzcG9uc2VcbiAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LnJlc3BvbnNlXG4gICAgICAgIDogcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVcbiAgICAgICAgICA/IHByb3BzLnBvcz8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlXG4gICAgICAgICAgOiBcIlwiXG4gICAgKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgIFtcIm5hbWVcIiwgXCJlbWFpbFwiLCBcImpvYiB0aXRsZVwiLCBcImNvbXBhbnlcIl0uaW5jbHVkZXMocHJvcHMucG9zPy50eXBlKSAmJlxuICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxuICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzPy5zaWduZXJPYmpJZFxuICAgICkge1xuICAgICAgY29uc3QgZGVmYXVsdERhdGEgPSBwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChkZWZhdWx0RGF0YSkge1xuICAgICAgICBzZXRUZXh0VmFsdWUoZGVmYXVsdERhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZV0pO1xuXG4gIGNvbnN0IEV4YW1wbGVDdXN0b21JbnB1dCA9IGZvcndhcmRSZWYoKHsgdmFsdWUsIG9uQ2xpY2sgfSwgcmVmKSA9PiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtgJHtzZWxlY3RXaWRnZXRDbHN9IHRleHQtWzEycHhdIG92ZXJmbG93LWhpZGRlbmB9XG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgcmVmPXtyZWZ9XG4gICAgPlxuICAgICAge3ZhbHVlfVxuICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtY2FsZW5kYXIgIG1sLVs1cHhdXCI+PC9pPlxuICAgIDwvZGl2PlxuICApKTtcbiAgRXhhbXBsZUN1c3RvbUlucHV0LmRpc3BsYXlOYW1lID0gXCJFeGFtcGxlQ3VzdG9tSW5wdXRcIjtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgIFtcIm5hbWVcIiwgXCJlbWFpbFwiLCBcImpvYiB0aXRsZVwiLCBcImNvbXBhbnlcIl0uaW5jbHVkZXModHlwZSkgJiZcbiAgICAgIHByb3BzLmlzTmVlZFNpZ24gJiZcbiAgICAgIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZFxuICAgICkge1xuICAgICAgY29uc3QgaXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHNlbmRlclVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgRXh0YW5kX0NsYXNzYCk7XG4gICAgICBjb25zdCBqc29uU2VuZGVyID0gSlNPTi5wYXJzZShzZW5kZXJVc2VyKTtcbiAgICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICAgIGpzb25TZW5kZXIgJiYganNvblNlbmRlclswXSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgIHByb3BzLmRhdGEuSWQsXG4gICAgICAgIGlzRGVmYXVsdFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbdHlwZV0pO1xuICAvL2Z1bmN0aW9uIGZvciBzaG93IGNoZWNrZWQgY2hlY2tib3hcbiAgY29uc3Qgc2VsZWN0Q2hlY2tib3ggPSAoaW5kKSA9PiB7XG4gICAgY29uc3QgcmVzID0gcHJvcHMucG9zLm9wdGlvbnM/LnJlc3BvbnNlO1xuICAgIGNvbnN0IGRlZmF1bHRDaGVjayA9IHByb3BzLnBvcy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XG4gICAgaWYgKHJlcyAmJiByZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlzU2VsZWN0SW5kZXggPSByZXMuaW5kZXhPZihpbmQpO1xuICAgICAgaWYgKGlzU2VsZWN0SW5kZXggPiAtMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIH1cbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRDaGVjaykge1xuICAgICAgY29uc3QgaXNTZWxlY3RJbmRleCA9IGRlZmF1bHRDaGVjay5pbmRleE9mKGluZCk7XG4gICAgICBpZiAoaXNTZWxlY3RJbmRleCA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVJhZGlvQ2hlY2sgPSAoZGF0YSkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHREYXRhID0gcHJvcHMucG9zLm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICBpZiAodGV4dFZhbHVlID09PSBkYXRhKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHREYXRhID09PSBkYXRhKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvL2Z1bmN0aW9uIGZvciBzZXQgY2hlY2tlZCBhbmQgdW5jaGVja2VkIHZhbHVlIG9mIGNoZWNrYm94XG4gIGNvbnN0IGhhbmRsZUNoZWNrYm94VmFsdWUgPSAoaXNDaGVja2VkLCBpbmQpID0+IHtcbiAgICBsZXQgdXBkYXRlU2VsZWN0ZWRDaGVja2JveCA9IFtdLFxuICAgICAgY2hlY2tlZExpc3Q7XG4gICAgbGV0IGlzRGVmYXVsdFZhbHVlLCBpc0RlZmF1bHRFbXB0eTtcbiAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICB1cGRhdGVTZWxlY3RlZENoZWNrYm94ID0gc2VsZWN0ZWRDaGVja2JveCA/IHNlbGVjdGVkQ2hlY2tib3ggOiBbXTtcblxuICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICB1cGRhdGVTZWxlY3RlZENoZWNrYm94LnB1c2goaW5kKTtcbiAgICAgICAgc2V0U2VsZWN0ZWRDaGVja2JveCh1cGRhdGVTZWxlY3RlZENoZWNrYm94KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrZWRMaXN0ID0gc2VsZWN0ZWRDaGVja2JveC5maWx0ZXIoKGRhdGEpID0+IGRhdGEgIT09IGluZCk7XG4gICAgICAgIHNldFNlbGVjdGVkQ2hlY2tib3goY2hlY2tlZExpc3QpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmlzTmVlZFNpZ24pIHtcbiAgICAgICAgaXNEZWZhdWx0VmFsdWUgPSBwcm9wcy5wb3Mub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGVmYXVsdFZhbHVlICYmIGlzRGVmYXVsdFZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNEZWZhdWx0RW1wdHkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgb25DaGFuZ2VJbnB1dChcbiAgICAgICAgY2hlY2tlZExpc3QgPyBjaGVja2VkTGlzdCA6IHVwZGF0ZVNlbGVjdGVkQ2hlY2tib3gsXG4gICAgICAgIHByb3BzLnBvcy5rZXksXG4gICAgICAgIHByb3BzLnh5UG9zdGlvbixcbiAgICAgICAgcHJvcHMuaW5kZXgsXG4gICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcbiAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhLklkLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgaXNEZWZhdWx0RW1wdHlcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIC8vZnVuY3Rpb24gdG8gaGFuZGxlIHNlbGVjdCByYWRpbyB3aWRnZXQgYW5kIHNldCB2YWx1ZSBzZWxldGNlZCBieSB1c2VyXG4gIGNvbnN0IGhhbmRsZUNoZWNrUmFkaW8gPSAoaXNDaGVja2VkLCBkYXRhKSA9PiB7XG4gICAgbGV0IGlzRGVmYXVsdFZhbHVlLFxuICAgICAgaXNEZWZhdWx0RW1wdHksXG4gICAgICBpc1JhZGlvID0gdHJ1ZTtcbiAgICBpZiAocHJvcHMuaXNOZWVkU2lnbikge1xuICAgICAgaXNEZWZhdWx0VmFsdWUgPSBwcm9wcy5wb3Mub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNEZWZhdWx0VmFsdWUpIHtcbiAgICAgIGlzRGVmYXVsdEVtcHR5ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgc2V0VGV4dFZhbHVlKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUZXh0VmFsdWUoXCJcIik7XG4gICAgfVxuICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICBkYXRhLFxuICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgIHByb3BzLnh5UG9zdGlvbixcbiAgICAgIHByb3BzLmluZGV4LFxuICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhLklkLFxuICAgICAgZmFsc2UsXG4gICAgICBudWxsLFxuICAgICAgaXNEZWZhdWx0RW1wdHksXG4gICAgICBpc1JhZGlvXG4gICAgKTtcbiAgfTtcbiAgLy9mdW5jdGlvbiB0byBzZXQgb25jaGFuZ2UgZGF0ZVxuICBjb25zdCBoYW5kbGVPbkRhdGVDaGFuZ2UgPSAoZGF0ZSkgPT4ge1xuICAgIHByb3BzLnNldFN0YXJ0RGF0ZShkYXRlKTtcbiAgICBjb25zdCBpc0RhdGVDaGFuZ2UgPSB0cnVlO1xuICAgIGNvbnN0IGRhdGVPYmogPSB7XG4gICAgICBkYXRlOiBkYXRlLFxuICAgICAgZm9ybWF0OiBwcm9wcy5zZWxlY3REYXRlLmZvcm1hdFxuICAgIH07XG4gICAgcHJvcHMuaGFuZGxlU2F2ZURhdGUoZGF0ZU9iaiwgaXNEYXRlQ2hhbmdlKTtcbiAgfTtcbiAgLy9oYW5kbGUgaGVpZ2h0IG9uIGVudGVyIHByZXNzIGluIHRleHQgYXJlYVxuICBjb25zdCBoYW5kbGVFbnRlclByZXNzID0gKGUpID0+IHtcbiAgICBjb25zdCBoZWlnaHQgPSAxODtcbiAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikge1xuICAgICAgLy9mdW5jdGlvbiB0byBzYXZlIGhlaWdodCBvZiB0ZXh0IGFyZWFcbiAgICAgIG9uQ2hhbmdlSGVpZ2h0T2ZUZXh0QXJlYShcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBwcm9wcy5wb3MudHlwZSxcbiAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcInNpZ25hdHVyZVwiOlxuICAgICAgcmV0dXJuIHByb3BzLnBvcy5TaWduVXJsID8gKFxuICAgICAgICA8aW1nXG4gICAgICAgICAgYWx0PVwic2lnbmF0dXJlXCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgc3JjPXtwcm9wcy5wb3MuU2lnblVybH1cbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIFwiXG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIHtwcm9wcz8uaGFuZGxlVXNlck5hbWUgJiZcbiAgICAgICAgICAgIHByb3BzPy5oYW5kbGVVc2VyTmFtZShcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LklkLFxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uUm9sZSxcbiAgICAgICAgICAgICAgd2lkZ2V0VHlwZVRyYXNsYXRpb25cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwic3RhbXBcIjpcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcbiAgICAgICAgPGltZ1xuICAgICAgICAgIGFsdD1cInN0YW1wXCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgc3JjPXtwcm9wcy5wb3MuU2lnblVybH1cbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gdy1mdWxsIGgtZnVsbCB0ZXh0LWJsYWNrIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxuICAgICAgICAgICAgcHJvcHM/LmhhbmRsZVVzZXJOYW1lKFxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uSWQsXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5Sb2xlLFxuICAgICAgICAgICAgICB3aWRnZXRUeXBlVHJhc2xhdGlvblxuICAgICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBzdHlsZT17eyB6SW5kZXg6IHByb3BzLmlzU2lnbllvdXJzZWxmICYmIFwiOTlcIiB9fT5cbiAgICAgICAgICB7cHJvcHMucG9zLm9wdGlvbnM/LnZhbHVlcz8ubWFwKChkYXRhLCBpbmQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxkaXYga2V5PXtpbmR9IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtY2VudGVyIGdhcC0wLjVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgICAgICAgIGluZCA9PT0gMCA/IFwibXQtMFwiIDogXCJtdC1bNXB4XVwiXG4gICAgICAgICAgICAgICAgICB9IGZsZXgganVzdGlmeS1jZW50ZXIgb3AtY2hlY2tib3ggb3AtY2hlY2tib3gteHMgcm91bmRlZC1bMC4zNTByZW1dYH1cbiAgICAgICAgICAgICAgICAgIG9uQmx1cj17aGFuZGxlSW5wdXRCbHVyfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e1xuICAgICAgICAgICAgICAgICAgICBwcm9wcy5pc05lZWRTaWduICYmXG4gICAgICAgICAgICAgICAgICAgIChwcm9wcy5wb3Mub3B0aW9ucz8uaXNSZWFkT25seSB8fFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmRhdGE/LnNpZ25lck9iaklkICE9PSBwcm9wcy5zaWduZXJPYmpJZClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RDaGVja2JveChpbmQpfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wcy5pc1BsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhSZXF1aXJlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnBvcy5vcHRpb25zPy52YWxpZGF0aW9uPy5tYXhSZXF1aXJlZENvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4Q291bnRJbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZXF1aXJlZCAmJiBwYXJzZUludChtYXhSZXF1aXJlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhDb3VudEludCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hlY2tib3ggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENoZWNrYm94Py5sZW5ndGggPD0gbWF4Q291bnRJbnQgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoZWNrYm94VmFsdWUoZS50YXJnZXQuY2hlY2tlZCwgaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tib3hWYWx1ZShlLnRhcmdldC5jaGVja2VkLCBpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDaGVja2JveFZhbHVlKGUudGFyZ2V0LmNoZWNrZWQsIGluZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7IXByb3BzLnBvcy5vcHRpb25zPy5pc0hpZGVMYWJlbCAmJiAoXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwidGV4dC14cyBtYi0wIHRleHQtY2VudGVyXCI+e2RhdGF9PC9sYWJlbD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIHRleHRJbnB1dFdpZGdldDpcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxuICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXt2YWxpZGF0ZVBsYWNlaG9sZGVyIHx8IFwicGxlYXNlIGVudGVyIHZhbHVlXCJ9XG4gICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cbiAgICAgICAgICBvbkJsdXI9e2hhbmRsZUlucHV0Qmx1cn1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgIHNldFRleHRWYWx1ZShlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZVxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSArIFwicHhcIlxuICAgICAgICAgICAgICA6IFwiMTJweFwiLFxuICAgICAgICAgICAgY29sb3I6IHByb3BzLnBvcy5vcHRpb25zPy5mb250Q29sb3IgfHwgXCJibGFja1wiXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjb2xzPVwiNTBcIlxuICAgICAgICAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplXG4gICAgICAgICAgICAgID8gcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplICsgXCJweFwiXG4gICAgICAgICAgICAgIDogXCIxMnB4XCIsXG4gICAgICAgICAgICBjb2xvcjogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCIsXG4gICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj57d2lkZ2V0VHlwZVRyYXNsYXRpb259PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSBcImRyb3Bkb3duXCI6XG4gICAgICByZXR1cm4gcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkID8gKFxuICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgY2xhc3NOYW1lPXtgJHtzZWxlY3RXaWRnZXRDbHN9IHRleHQtWzEycHhdIGJnLWluaGVyaXRgfVxuICAgICAgICAgIGlkPVwibXlEcm9wZG93blwiXG4gICAgICAgICAgdmFsdWU9e3NlbGVjdE9wdGlvbn1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgIHNldFNlbGVjdE9wdGlvbihlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgey8qIERlZmF1bHQvVGl0bGUgb3B0aW9uICovfVxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZCBoaWRkZW4+XG4gICAgICAgICAgICB7cHJvcHM/LnBvcz8ub3B0aW9ucz8ubmFtZX1cbiAgICAgICAgICA8L29wdGlvbj5cblxuICAgICAgICAgIHtwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbHVlcz8ubWFwKChkYXRhLCBpbmQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtpbmR9IHZhbHVlPXtkYXRhfT5cbiAgICAgICAgICAgICAgICB7ZGF0YX1cbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pfVxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTJweF0gb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAge3Byb3BzLnBvcz8ub3B0aW9ucz8ubmFtZVxuICAgICAgICAgICAgPyBwcm9wcy5wb3Mub3B0aW9ucy5uYW1lXG4gICAgICAgICAgICA6IHdpZGdldFR5cGVUcmFzbGF0aW9ufVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSBcImluaXRpYWxzXCI6XG4gICAgICByZXR1cm4gcHJvcHMucG9zLlNpZ25VcmwgPyAoXG4gICAgICAgIDxpbWdcbiAgICAgICAgICBhbHQ9XCJpbml0aWFsc1wiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgIHNyYz17cHJvcHMucG9zLlNpZ25Vcmx9XG4gICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiXG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIHtwcm9wcz8uaGFuZGxlVXNlck5hbWUgJiZcbiAgICAgICAgICAgIHByb3BzPy5oYW5kbGVVc2VyTmFtZShcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LklkLFxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uUm9sZSxcbiAgICAgICAgICAgICAgd2lkZ2V0VHlwZVRyYXNsYXRpb25cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwibmFtZVwiOlxuICAgICAgcmV0dXJuIHByb3BzLmlzU2lnbllvdXJzZWxmIHx8XG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkgPyAoXG4gICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e1wibmFtZVwifVxuICAgICAgICAgIHJvd3M9ezF9XG4gICAgICAgICAgb25LZXlEb3duPXtoYW5kbGVFbnRlclByZXNzfVxuICAgICAgICAgIHZhbHVlPXt0ZXh0VmFsdWV9XG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0RlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGhhbmRsZVRleHRWYWxpZChlKTtcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXG4gICAgICAgICAgICAgIGlzRGVmYXVsdFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZVxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSArIFwicHhcIlxuICAgICAgICAgICAgICA6IFwiMTJweFwiLFxuICAgICAgICAgICAgY29sb3I6IHByb3BzLnBvcy5vcHRpb25zPy5mb250Q29sb3IgfHwgXCJibGFja1wiXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjb2xzPVwiNTBcIlxuICAgICAgICAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplXG4gICAgICAgICAgICAgID8gcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplICsgXCJweFwiXG4gICAgICAgICAgICAgIDogXCIxMnB4XCIsXG4gICAgICAgICAgICBjb2xvcjogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCIsXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj57d2lkZ2V0VHlwZVRyYXNsYXRpb259PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSBcImNvbXBhbnlcIjpcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxuICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgdGV4dFwiXG4gICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgIGhhbmRsZVRleHRWYWxpZChlKTtcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH19XG4gICAgICAgICAgY2xhc3NOYW1lPXt0ZXh0V2lkZ2V0Q2xzfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplXG4gICAgICAgICAgICAgID8gcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplICsgXCJweFwiXG4gICAgICAgICAgICAgIDogXCIxMnB4XCIsXG4gICAgICAgICAgICBjb2xvcjogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCJcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNvbHM9XCI1MFwiXG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGZvbnRTaXplOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemVcbiAgICAgICAgICAgICAgPyBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemUgKyBcInB4XCJcbiAgICAgICAgICAgICAgOiBcIjEycHhcIixcbiAgICAgICAgICAgIGNvbG9yOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIixcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPnt3aWRnZXRUeXBlVHJhc2xhdGlvbn08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwiam9iIHRpdGxlXCI6XG4gICAgICByZXR1cm4gcHJvcHMuaXNTaWduWW91cnNlbGYgfHxcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSA/IChcbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgcmVmPXtpbnB1dFJlZn1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17XCJqb2IgdGl0bGVcIn1cbiAgICAgICAgICByb3dzPXsxfVxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlRW50ZXJQcmVzc31cbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxuICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgaGFuZGxlVGV4dFZhbGlkKGUpO1xuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcbiAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgIHByb3BzLnBvcy5rZXksXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcbiAgICAgICAgICAgICAgcHJvcHMuaW5kZXgsXG4gICAgICAgICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcbiAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfX1cbiAgICAgICAgICBjbGFzc05hbWU9e3RleHRXaWRnZXRDbHN9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGZvbnRTaXplOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemVcbiAgICAgICAgICAgICAgPyBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemUgKyBcInB4XCJcbiAgICAgICAgICAgICAgOiBcIjEycHhcIixcbiAgICAgICAgICAgIGNvbG9yOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIlxuICAgICAgICAgIH19XG4gICAgICAgICAgY29scz1cIjUwXCJcbiAgICAgICAgLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZVxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSArIFwicHhcIlxuICAgICAgICAgICAgICA6IFwiMTJweFwiLFxuICAgICAgICAgICAgY29sb3I6IHByb3BzLnBvcy5vcHRpb25zPy5mb250Q29sb3IgfHwgXCJibGFja1wiLFxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+e3dpZGdldFR5cGVUcmFzbGF0aW9ufTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gcHJvcHMuaXNTaWduWW91cnNlbGYgfHxcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSA/IChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8RGF0ZVBpY2tlclxuICAgICAgICAgICAgcmVuZGVyQ3VzdG9tSGVhZGVyPXsoeyBkYXRlLCBjaGFuZ2VZZWFyLCBjaGFuZ2VNb250aCB9KSA9PiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LXN0YXJ0IG1sLTIgXCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctdHJhbnNwYXJlbnQgb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXttb250aHNbZ2V0TW9udGgoZGF0ZSldfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh7IHRhcmdldDogeyB2YWx1ZSB9IH0pID0+XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZU1vbnRoKG1vbnRocy5pbmRleE9mKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7bW9udGhzLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtvcHRpb259IHZhbHVlPXtvcHRpb259PlxuICAgICAgICAgICAgICAgICAgICAgIHtvcHRpb259XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctdHJhbnNwYXJlbnQgb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtnZXRZZWFyKGRhdGUpfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh7IHRhcmdldDogeyB2YWx1ZSB9IH0pID0+IGNoYW5nZVllYXIodmFsdWUpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt5ZWFycy5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17b3B0aW9ufSB2YWx1ZT17b3B0aW9ufT5cbiAgICAgICAgICAgICAgICAgICAgICB7b3B0aW9ufVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgIHByb3BzLmlzUGxhY2Vob2xkZXIgfHxcbiAgICAgICAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiZcbiAgICAgICAgICAgICAgICBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCAhPT0gcHJvcHMuc2lnbmVyT2JqSWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvbkJsdXI9e2hhbmRsZUlucHV0Qmx1cn1cbiAgICAgICAgICAgIGNsb3NlT25TY3JvbGw9e3RydWV9XG4gICAgICAgICAgICBjbGFzc05hbWU9e2Ake3NlbGVjdFdpZGdldENsc30gb3V0bGluZS1bIzAwN2JmZl1gfVxuICAgICAgICAgICAgc2VsZWN0ZWQ9e1xuICAgICAgICAgICAgICBwcm9wcz8uc3RhcnREYXRlXG4gICAgICAgICAgICAgICAgPyBwcm9wcz8uc3RhcnREYXRlXG4gICAgICAgICAgICAgICAgOiBwcm9wcy5wb3Mub3B0aW9ucz8ucmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKHByb3BzLnBvcy5vcHRpb25zLnJlc3BvbnNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25DaGFuZ2U9eyhkYXRlKSA9PiBoYW5kbGVPbkRhdGVDaGFuZ2UoZGF0ZSl9XG4gICAgICAgICAgICBwb3BwZXJQbGFjZW1lbnQ9XCJ0b3AtZW5kXCJcbiAgICAgICAgICAgIGN1c3RvbUlucHV0PXs8RXhhbXBsZUN1c3RvbUlucHV0IC8+fVxuICAgICAgICAgICAgZGF0ZUZvcm1hdD17XG4gICAgICAgICAgICAgIHByb3BzLnNlbGVjdERhdGVcbiAgICAgICAgICAgICAgICA/IHByb3BzLnNlbGVjdERhdGU/LmZvcm1hdFxuICAgICAgICAgICAgICAgIDogcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcbiAgICAgICAgICAgICAgICAgID8gcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcbiAgICAgICAgICAgICAgICAgIDogXCJNTS9kZC95eXl5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTJweF0gdGV4dC1ibGFjayBpdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICB7cHJvcHMuc2VsZWN0RGF0ZVxuICAgICAgICAgICAgICA/IHByb3BzLnNlbGVjdERhdGU/LmZvcm1hdFxuICAgICAgICAgICAgICA6IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XG4gICAgICAgICAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LmZvcm1hdFxuICAgICAgICAgICAgICAgIDogXCJNTS9kZC95eXl5XCJ9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgICByZXR1cm4gcHJvcHMucG9zLlNpZ25VcmwgPyAoXG4gICAgICAgIDxpbWdcbiAgICAgICAgICBhbHQ9XCJpbWFnZVwiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgIHNyYz17cHJvcHMucG9zLlNpZ25Vcmx9XG4gICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiXG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIHtwcm9wcz8uaGFuZGxlVXNlck5hbWUgJiZcbiAgICAgICAgICAgIHByb3BzPy5oYW5kbGVVc2VyTmFtZShcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LklkLFxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uUm9sZSxcbiAgICAgICAgICAgICAgd2lkZ2V0VHlwZVRyYXNsYXRpb25cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxuICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcImVudGVyIGVtYWlsXCJ9XG4gICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cbiAgICAgICAgICBvbkJsdXI9e2hhbmRsZUlucHV0Qmx1cn1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgIGhhbmRsZVRleHRWYWxpZChlKTtcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH19XG4gICAgICAgICAgY2xhc3NOYW1lPXt0ZXh0V2lkZ2V0Q2xzfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplXG4gICAgICAgICAgICAgID8gcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplICsgXCJweFwiXG4gICAgICAgICAgICAgIDogXCIxMnB4XCIsXG4gICAgICAgICAgICBjb2xvcjogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCIsXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCJcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNvbHM9XCI1MFwiXG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGZvbnRTaXplOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemVcbiAgICAgICAgICAgICAgPyBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemUgKyBcInB4XCJcbiAgICAgICAgICAgICAgOiBcIjEycHhcIixcbiAgICAgICAgICAgIGNvbG9yOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIixcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWwsIHNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPnt3aWRnZXRUeXBlVHJhc2xhdGlvbn08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIHJhZGlvQnV0dG9uV2lkZ2V0OlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICB7cHJvcHMucG9zLm9wdGlvbnM/LnZhbHVlcy5tYXAoKGRhdGEsIGluZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZH0gY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXIgZ2FwLTAuNVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcbiAgICAgICAgICAgICAgICAgICAgaW5kID09PSAwID8gXCJtdC0wXCIgOiBcIm10LVs1cHhdXCJcbiAgICAgICAgICAgICAgICAgIH0gJHtcInctWzE1cHhdIGgtWzE1cHhdXCJ9IGZsZXgganVzdGlmeS1jZW50ZXIgb3AtcmFkaW9gfVxuICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxuICAgICAgICAgICAgICAgICAgICAocHJvcHMucG9zLm9wdGlvbnM/LmlzUmVhZE9ubHkgfHxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCAhPT0gcHJvcHMuc2lnbmVyT2JqSWQpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXtoYW5kbGVSYWRpb0NoZWNrKGRhdGEpfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvcHMuaXNQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoZWNrUmFkaW8oZS50YXJnZXQuY2hlY2tlZCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7IXByb3BzLnBvcy5vcHRpb25zPy5pc0hpZGVMYWJlbCAmJiAoXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwidGV4dC14cyBtYi0wXCI+e2RhdGF9PC9sYWJlbD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIHRleHRXaWRnZXQ6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHRleHRcIlxuICAgICAgICAgIHJvd3M9ezF9XG4gICAgICAgICAgb25LZXlEb3duPXtoYW5kbGVFbnRlclByZXNzfVxuICAgICAgICAgIHZhbHVlPXt0ZXh0VmFsdWV9XG4gICAgICAgICAgb25CbHVyPXtoYW5kbGVJbnB1dEJsdXJ9XG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICBzZXRUZXh0VmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcbiAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgIHByb3BzLnBvcy5rZXksXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcbiAgICAgICAgICAgICAgcHJvcHMuaW5kZXgsXG4gICAgICAgICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcbiAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfX1cbiAgICAgICAgICBjbGFzc05hbWU9e3RleHRXaWRnZXRDbHN9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWwsIHNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgIGZvbnRTaXplOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemVcbiAgICAgICAgICAgICAgPyBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemUgKyBcInB4XCJcbiAgICAgICAgICAgICAgOiBcIjEycHhcIixcbiAgICAgICAgICAgIGNvbG9yOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIlxuICAgICAgICAgIH19XG4gICAgICAgICAgY29scz1cIjUwXCJcbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lXCI+XG4gICAgICAgICAgPGltZ1xuICAgICAgICAgICAgYWx0PVwiaW1hZ2VcIlxuICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgc3JjPXtwcm9wcy5wb3MuU2lnblVybH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGxcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSB3LWZ1bGwgaC1mdWxsIHRleHQtYmxhY2sgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICB7cHJvcHMucG9zLmlzU3RhbXAgPyA8ZGl2PnN0YW1wPC9kaXY+IDogPGRpdj5zaWduYXR1cmU8L2Rpdj59XG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxuICAgICAgICAgICAgcHJvcHM/LmhhbmRsZVVzZXJOYW1lKHByb3BzPy5kYXRhPy5JZCwgcHJvcHM/LmRhdGE/LlJvbGUpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXJUeXBlO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuXG5mdW5jdGlvbiBQcmV2TmV4dCh7IHBhZ2VOdW1iZXIsIGFsbFBhZ2VzLCBjaGFuZ2VQYWdlIH0pIHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xuICAvL2ZvciBnbyB0byBwcmV2aW91cyBwYWdlXG4gIGZ1bmN0aW9uIHByZXZpb3VzUGFnZSgpIHtcbiAgICBjaGFuZ2VQYWdlKC0xKTtcbiAgfVxuICAvL2ZvciBnbyB0byBuZXh0IHBhZ2VcbiAgZnVuY3Rpb24gbmV4dFBhZ2UoKSB7XG4gICAgY2hhbmdlUGFnZSgxKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLW5ldXRyYWwgb3AtYnRuLXhzIG1kOm9wLWJ0bi1zbSBmb250LXNlbWlib2xkIHRleHQteHNcIlxuICAgICAgICBkaXNhYmxlZD17cGFnZU51bWJlciA8PSAxfVxuICAgICAgICBvbkNsaWNrPXtwcmV2aW91c1BhZ2V9XG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJsb2NrXCI+XG4gICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYmFja3dhcmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LWJhc2UtY29udGVudCBmb250LW1lZGl1bSBteC0yIDJ4bDp0ZXh0LVszMHB4XVwiPlxuICAgICAgICB7cGFnZU51bWJlciB8fCAoYWxsUGFnZXMgPyAxIDogXCItLVwiKX0ge3QoXCJvZlwiKX0ge2FsbFBhZ2VzIHx8IFwiLS1cIn1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1uZXV0cmFsIG9wLWJ0bi14cyBtZDpvcC1idG4tc20gZm9udC1zZW1pYm9sZCB0ZXh0LXhzXCJcbiAgICAgICAgZGlzYWJsZWQ9e3BhZ2VOdW1iZXIgPj0gYWxsUGFnZXN9XG4gICAgICAgIG9uQ2xpY2s9e25leHRQYWdlfVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJibG9ja1wiPlxuICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWZvcndhcmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBQcmV2TmV4dDtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcbmltcG9ydCB7IERvY3VtZW50LCBQYWdlIH0gZnJvbSBcInJlYWN0LXBkZlwiO1xuaW1wb3J0IHsgdXNlU2VsZWN0b3IgfSBmcm9tIFwicmVhY3QtcmVkdXhcIjtcblxuZnVuY3Rpb24gUmVuZGVyQWxsUGRmUGFnZSh7XG4gIHNpZ25QZGZVcmwsXG4gIGFsbFBhZ2VzLFxuICBzZXRBbGxQYWdlcyxcbiAgc2V0UGFnZU51bWJlcixcbiAgc2V0U2lnbkJ0blBvc2l0aW9uLFxuICBwYWdlTnVtYmVyLFxuICBzaWduZXJQb3MsXG4gIHNpZ25lck9iamVjdElkLFxuICBjb250YWluZXJXSFxufSkge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG4gIGNvbnN0IFtzaWduUGFnZU51bWJlciwgc2V0U2lnblBhZ2VOdW1iZXJdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbYm9va21hcmtDb2xvciwgc2V0Qm9va21hcmtDb2xvcl0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgLy9zZXQgYWxsIG51bWJlciBvZiBwYWdlcyBhZnRlciBsb2FkIHBkZlxuICBmdW5jdGlvbiBvbkRvY3VtZW50TG9hZCh7IG51bVBhZ2VzIH0pIHtcbiAgICBzZXRBbGxQYWdlcyhudW1QYWdlcyk7XG4gICAgLy9jaGVjayBpZiBzaWduZXJQb3MgYXJyYXkgZXhpc3QgdGhlbiBzYXZlIHBhZ2UgbnVtYmVyIGV4aXN0IGluIHNpZ25lclBvcyBhcnJheSB0byBzaG93IGJvb2ttYXJrIGljb25cbiAgICBpZiAoc2lnbmVyUG9zKSB7XG4gICAgICBjb25zdCBjaGVja1VzZXIgPSBzaWduZXJQb3MuZmlsdGVyKFxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcbiAgICAgICk7XG4gICAgICBzZXRCb29rbWFya0NvbG9yKGNoZWNrVXNlclswXT8uYmxvY2tDb2xvcik7XG4gICAgICBsZXQgcGFnZU51bWJlckFyciA9IFtdO1xuICAgICAgaWYgKGNoZWNrVXNlcj8ubGVuZ3RoID4gMCkge1xuICAgICAgICBjaGVja1VzZXJbMF0/LnBsYWNlSG9sZGVyPy5tYXAoKGRhdGEpID0+IHtcbiAgICAgICAgICBwYWdlTnVtYmVyQXJyLnB1c2goZGF0YT8ucGFnZU51bWJlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldFNpZ25QYWdlTnVtYmVyKHBhZ2VOdW1iZXJBcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBwYWdlQ29udGFpbmVyID0gdXNlUmVmKCk7XG4gIGNvbnN0IGlzSGVhZGVyID0gdXNlU2VsZWN0b3IoKHN0YXRlKSA9PiBzdGF0ZS5zaG93SGVhZGVyKTtcbiAgY29uc3QgW3BhZ2VXaWR0aCwgc2V0UGFnZVdpZHRoXSA9IHVzZVN0YXRlKFwiXCIpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlU2l6ZSA9ICgpID0+IHtcbiAgICAgIGlmIChwYWdlQ29udGFpbmVyLmN1cnJlbnQpIHtcbiAgICAgICAgc2V0UGFnZVdpZHRoKHBhZ2VDb250YWluZXIuY3VycmVudC5vZmZzZXRXaWR0aCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIHdhaXQgZm9yIHRoZSB0cmFuc2l0aW9uIHRvIGNvbXBsZXRlXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KHVwZGF0ZVNpemUsIDEwMCk7IC8vIG1hdGNoIHRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uXG5cbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfSwgW2lzSGVhZGVyLCBwYWdlQ29udGFpbmVyLCBjb250YWluZXJXSF0pO1xuICAvLydmdW5jdGlvbiBgYWRkU2lnbmF0dXJlQm9va21hcmtgIGlzIHVzZWQgdG8gZGlzcGxheSB0aGUgcGFnZSB3aGVyZSB0aGUgdXNlcidzIHNpZ25hdHVyZSBpcyBsb2NhdGVkLlxuICBjb25zdCBhZGRTaWduYXR1cmVCb29rbWFyayA9IChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGlzcGFnZU51bWJlciA9IHNpZ25QYWdlTnVtYmVyLmluY2x1ZGVzKGluZGV4ICsgMSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGlzcGFnZU51bWJlciAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgei0yMCB0b3AtWzFweF0gLXJpZ2h0LVsxM3B4XSAtdHJhbnNsYXRlLXgtMS8yIC10cmFuc2xhdGUteS0xLzJcIj5cbiAgICAgICAgICA8aVxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IGJvb2ttYXJrQ29sb3IgfHwgXCJyZWRcIiB9fVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtc29saWQgZmEtYm9va21hcmtcIlxuICAgICAgICAgID48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKVxuICAgICk7XG4gIH07XG4gIHJldHVybiAoXG4gICAgPGRpdiByZWY9e3BhZ2VDb250YWluZXJ9IGNsYXNzTmFtZT1cImhpZGRlbiB3LVsyMCVdIGJnLWJhc2UtMTAwIG1kOmJsb2NrXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LTIgcHItMiBwdC0yIHBiLTEgdGV4dC1bMTVweF0gdGV4dC1iYXNlLWNvbnRlbnQgZm9udC1zZW1pYm9sZCBib3JkZXItYi1bMXB4XSBib3JkZXItYmFzZS0zMDBcIj5cbiAgICAgICAge3QoXCJwYWdlc1wiKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9e2BmbGV4IGgtWzkwJV0gZmxleC1jb2wgaXRlbXMtY2VudGVyIG0tMiAgXG4gICAgICAgICBhdXRvU2lnblNjcm9sbCBoaWRlLXNjcm9sbGJhciBtYXgtaC1bMTAwdmhdIGB9XG4gICAgICA+XG4gICAgICAgIDxEb2N1bWVudFxuICAgICAgICAgIGxvYWRpbmc9e3QoXCJsb2FkaW5nLWRvY1wiKX1cbiAgICAgICAgICBvbkxvYWRTdWNjZXNzPXtvbkRvY3VtZW50TG9hZH1cbiAgICAgICAgICBmaWxlPXtzaWduUGRmVXJsfVxuICAgICAgICA+XG4gICAgICAgICAge0FycmF5LmZyb20obmV3IEFycmF5KGFsbFBhZ2VzKSwgKGVsLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIgLSAxID09PSBpbmRleCA/IFwiYm9yZGVyLVtyZWRdXCIgOiBcImJvcmRlci1bIzg3ODc4N11cIlxuICAgICAgICAgICAgICB9IGJvcmRlci0yICAgbS1bMTBweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgcmVsYXRpdmVgfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0UGFnZU51bWJlcihpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIGlmIChzZXRTaWduQnRuUG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgIHNldFNpZ25CdG5Qb3NpdGlvbihbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7c2lnbmVyUG9zICYmIGFkZFNpZ25hdHVyZUJvb2ttYXJrKGluZGV4KX1cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHotWzFdIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgICAgIDxQYWdlXG4gICAgICAgICAgICAgICAgICBrZXk9e2BwYWdlXyR7aW5kZXggKyAxfWB9XG4gICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtpbmRleCArIDF9XG4gICAgICAgICAgICAgICAgICB3aWR0aD17cGFnZVdpZHRoIC0gNjB9XG4gICAgICAgICAgICAgICAgICBzY2FsZT17MX1cbiAgICAgICAgICAgICAgICAgIHJlbmRlckFubm90YXRpb25MYXllcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICByZW5kZXJUZXh0TGF5ZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvRG9jdW1lbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyQWxsUGRmUGFnZTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSU0MgZnJvbSBcInJlYWN0LXNjcm9sbGJhcnMtY3VzdG9tXCI7XG5pbXBvcnQgeyBEb2N1bWVudCwgUGFnZSB9IGZyb20gXCJyZWFjdC1wZGZcIjtcbmltcG9ydCB7XG4gIGRlZmF1bHRXaWR0aEhlaWdodCxcbiAgZ2V0Q29udGFpbmVyU2NhbGUsXG4gIGhhbmRsZUltYWdlUmVzaXplLFxuICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZVxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwiLi9QbGFjZWhvbGRlclwiO1xuaW1wb3J0IEFsZXJ0IGZyb20gXCIuLi8uLi9wcmltaXRpdmVzL0FsZXJ0XCI7XG5cbmZ1bmN0aW9uIFJlbmRlclBkZih7XG4gIHBhZ2VOdW1iZXIsXG4gIGRyb3AsXG4gIHNpZ25lclBvcyxcbiAgc3VjY2Vzc0VtYWlsLFxuICBoYW5kbGVUYWJEcmFnLFxuICBoYW5kbGVTdG9wLFxuICBpc0RyYWdnaW5nLFxuICBzZXRJc1NpZ25QYWQsXG4gIHNldElzU3RhbXAsXG4gIGhhbmRsZURlbGV0ZVNpZ24sXG4gIHNldFNpZ25LZXksXG4gIHBkZkRldGFpbHMsXG4gIHh5UG9zdGlvbixcbiAgcGRmVXJsLFxuICBwYWdlRGV0YWlscyxcbiAgcGRmUmVxdWVzdCxcbiAgc2lnbmVyT2JqZWN0SWQsXG4gIHNpZ25lZFNpZ25lcnMsXG4gIHBkZkxvYWQsXG4gIHNldFBkZkxvYWQsXG4gIHBsYWNlaG9sZGVyLFxuICBzZXRTaWduZXJQb3MsXG4gIHNldFh5UG9zdGlvbixcbiAgaW5kZXgsXG4gIGNvbnRhaW5lcldILFxuICBzZXRJc1Jlc2l6ZSxcbiAgaGFuZGxlTGlua1VzZXIsXG4gIHNldFVuaXF1ZUlkLFxuICBzaWduZXJzZGF0YSxcbiAgc2V0SXNQYWdlQ29weSxcbiAgc2V0U2lnbmVyT2JqSWQsXG4gIHNldFNob3dEcm9wZG93bixcbiAgc2V0SXNJbml0aWFsLFxuICBzZXRJc1ZhbGlkYXRlLFxuICBzZXRXaWRnZXRUeXBlLFxuICBzZXRWYWxpZGF0ZUFsZXJ0LFxuICBzZXRJc1JhZGlvLFxuICBzZXRDdXJyV2lkZ2V0c0RldGFpbHMsXG4gIHNldFNlbGVjdFdpZGdldElkLFxuICBzZWxlY3RXaWRnZXRJZCxcbiAgdW5TaWduZWRXaWRnZXRJZCxcbiAgc2V0SXNDaGVja2JveCxcbiAgaGFuZGxlTmFtZU1vZGFsLFxuICBoYW5kbGVUZXh0U2V0dGluZ01vZGFsLFxuICBzZXRUZW1wU2lnbmVySWQsXG4gIHVuaXF1ZUlkLFxuICBwZGZPcmlnaW5hbFdILFxuICBzY2FsZSxcbiAgc2V0SXNTZWxlY3RJZCxcbiAgaXNwdWJsaWNUZW1wbGF0ZSxcbiAgaGFuZGxlVXNlckRldGFpbHNcbn0pIHtcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcbiAgLy9jaGVjayBpc0d1ZXN0U2lnbmVyIGlzIHByZXNlbnQgaW4gbG9jYWwgaWYgeWVzIHRoYW4gaGFuZGxlIGxvZ2luIGZsb3cgaGVhZGVyIGluIG1vYmlsZSB2aWV3XG4gIGNvbnN0IGlzR3Vlc3RTaWduZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImlzR3Vlc3RTaWduZXJcIik7XG5cbiAgLy8gaGFuZGxlIHNpZ25hdHVyZSBibG9jayB3aWR0aCBhbmQgaGVpZ2h0IGFjY29yZGluZyB0byBzY3JlZW5cbiAgY29uc3QgcG9zV2lkdGggPSAocG9zLCBzaWduWW91cnNlbGYpID0+IHtcbiAgICBjb25zdCBjb250YWluZXJTY2FsZSA9IGdldENvbnRhaW5lclNjYWxlKFxuICAgICAgcGRmT3JpZ2luYWxXSCxcbiAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICBjb250YWluZXJXSFxuICAgICk7XG4gICAgY29uc3QgZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoSGVpZ2h0KHBvcy50eXBlKS53aWR0aDtcbiAgICBjb25zdCBwb3NXaWR0aCA9IHBvcy5XaWR0aCA/IHBvcy5XaWR0aCA6IGRlZmF1bHRXaWR0aDtcbiAgICBpZiAoc2lnbllvdXJzZWxmKSB7XG4gICAgICByZXR1cm4gcG9zV2lkdGggKiBzY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xuICAgICAgICBpZiAocG9zLklzUmVzaXplKSB7XG4gICAgICAgICAgaWYgKHNjYWxlID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGUgKiBzY2FsZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogY29udGFpbmVyU2NhbGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzY2FsZSA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBwb3NXaWR0aCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogc2NhbGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwb3NXaWR0aCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogc2NhbGUgKiBjb250YWluZXJTY2FsZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHBvc0hlaWdodCA9IChwb3MsIHNpZ25Zb3Vyc2VsZikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lclNjYWxlID0gZ2V0Q29udGFpbmVyU2NhbGUoXG4gICAgICBwZGZPcmlnaW5hbFdILFxuICAgICAgcGFnZU51bWJlcixcbiAgICAgIGNvbnRhaW5lcldIXG4gICAgKTtcbiAgICBjb25zdCBwb3NIZWlnaHQgPSBwb3MuSGVpZ2h0IHx8IGRlZmF1bHRXaWR0aEhlaWdodChwb3MudHlwZSkuaGVpZ2h0O1xuICAgIGlmIChzaWduWW91cnNlbGYpIHtcbiAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBzY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xuICAgICAgICBpZiAocG9zLklzUmVzaXplKSB7XG4gICAgICAgICAgaWYgKHNjYWxlID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogc2NhbGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBjb250YWluZXJTY2FsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNjYWxlID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogc2NhbGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBzY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvL2Z1bmN0aW9uIGZvciByZW5kZXIgcGxhY2Vob2xkZXIgYmxvY2sgb3ZlciBwZGYgZG9jdW1lbnRcbiAgY29uc3QgY2hlY2tTaWduZWRTaWduZXJzID0gKGRhdGEpID0+IHtcbiAgICBsZXQgY2hlY2tTaWduID0gW107XG4gICAgLy9jb25kaXRpb24gdG8gaGFuZGxlIHF1aWNrIHNlbmQgZmxvdyBhbmQgdXNpbmcgbm9ybWFsIHJlcXVlc3Qgc2lnbiBmbG93XG4gICAgY2hlY2tTaWduID0gc2lnbmVkU2lnbmVyc1xuICAgICAgPyBzaWduZWRTaWduZXJzPy5maWx0ZXIoXG4gICAgICAgICAgKHNpZ24pID0+XG4gICAgICAgICAgICBzaWduPy5JZCA9PT0gZGF0YT8uSWQgfHwgc2lnbj8ub2JqZWN0SWQgPT09IGRhdGE/LnNpZ25lck9iaklkXG4gICAgICAgIClcbiAgICAgIDogW107XG4gICAgY29uc3QgaGFuZGxlQWxsVXNlck5hbWUgPSAoSWQsIFJvbGUsIHR5cGUpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtYmxhY2sgdGV4dC1bOHB4XSBmb250LWJvbGRcIj5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGRmRGV0YWlsc1swXS5TaWduZXJzPy5maW5kKFxuICAgICAgICAgICAgICAgIChzaWduZXIpID0+IHNpZ25lci5vYmplY3RJZCA9PT0gZGF0YS5zaWduZXJPYmpJZFxuICAgICAgICAgICAgICApPy5OYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge3R5cGUgJiYgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSBmb250LWJvbGRcIj57dHlwZX08L2Rpdj59XG4gICAgICAgICAge1JvbGUgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAge2AoJHtSb2xlfSlgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICk7XG4gICAgfTtcbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2tTaWduLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgZGF0YS5wbGFjZUhvbGRlci5tYXAoKHBsYWNlRGF0YSwga2V5KSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17a2V5fT5cbiAgICAgICAgICAgIHtwbGFjZURhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlciAmJlxuICAgICAgICAgICAgICBwbGFjZURhdGEucG9zLm1hcCgocG9zKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIHBvcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e3Bvcy5rZXl9PlxuICAgICAgICAgICAgICAgICAgICAgIDxQbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zPXtwb3N9XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduS2V5PXtzZXRTaWduS2V5fVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkPXtzZXRJc1NpZ25QYWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemU9e2hhbmRsZUltYWdlUmVzaXplfVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e3BhZ2VOdW1iZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICB4eVBvc3Rpb249e3NpZ25lclBvc31cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17c2V0U2lnbmVyUG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT17ZGF0YX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUmVzaXplPXtzZXRJc1Jlc2l6ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduZXJPYmpJZD17c2lnbmVyT2JqZWN0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1Nob3dEcm9wZG93bj17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmVlZFNpZ249e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NXaWR0aD17cG9zV2lkdGh9XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVzZXJOYW1lPXtoYW5kbGVBbGxVc2VyTmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRHJhZ2dpbmc9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc31cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbD17c2V0SXNJbml0aWFsfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsaWRhdGVBbGVydD17c2V0VmFsaWRhdGVBbGVydH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVuU2lnbmVkV2lkZ2V0SWQ9e3VuU2lnbmVkV2lkZ2V0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZD17c2V0U2VsZWN0V2lkZ2V0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RXaWRnZXRJZD17c2VsZWN0V2lkZ2V0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e3NldEN1cnJXaWRnZXRzRGV0YWlsc31cbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkPXt1bmlxdWVJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0g9e3BkZk9yaWdpbmFsV0h9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNwdWJsaWNUZW1wbGF0ZT17aXNwdWJsaWNUZW1wbGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVzZXJEZXRhaWxzPXtoYW5kbGVVc2VyRGV0YWlsc31cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH07XG4gIC8vZnVuY3Rpb24gZm9yIHJlbmRlciBwbGFjZWhvbGRlciBibG9jayBvdmVyIHBkZiBkb2N1bWVudFxuXG4gIGNvbnN0IGhhbmRsZVVzZXJOYW1lID0gKElkLCBSb2xlLCB0eXBlKSA9PiB7XG4gICAgaWYgKElkKSB7XG4gICAgICBjb25zdCBjaGVja1NpZ24gPSBzaWduZXJzZGF0YS5maW5kKChzaWduKSA9PiBzaWduLklkID09PSBJZCk7XG4gICAgICBpZiAoY2hlY2tTaWduPy5OYW1lKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ibGFjayB0ZXh0LVs4cHhdIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgIHtjaGVja1NpZ24/Lk5hbWV9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHt0eXBlICYmIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gZm9udC1ib2xkXCI+e3R5cGV9PC9kaXY+fVxuICAgICAgICAgICAge1JvbGUgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtYmxhY2sgdGV4dC1bOHB4XSBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgIHtgKCR7Um9sZX0pYH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvPlxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAge3R5cGUgJiYgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSBmb250LWJvbGRcIj57dHlwZX08L2Rpdj59XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtYmxhY2sgdGV4dC1bOHB4XSBmb250LW1lZGl1bVwiPntSb2xlfTwvZGl2PlxuICAgICAgICAgIDwvPlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgIHt0eXBlICYmIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gZm9udC1ib2xkXCI+e3R5cGV9PC9kaXY+fVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ibGFjayB0ZXh0LVs4cHhdIGZvbnQtbWVkaXVtXCI+e1JvbGV9PC9kaXY+XG4gICAgICAgIDwvPlxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHtzdWNjZXNzRW1haWwgJiYgPEFsZXJ0IHR5cGU9e1wic3VjY2Vzc1wifT5FbWFpbCBzZW50IHN1Y2Nlc3NmdWxseSE8L0FsZXJ0Pn1cbiAgICAgIHtpc01vYmlsZSA/IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhdGEtdHV0PVwicmVhY3RvdXJGb3J0aFwiXG4gICAgICAgICAgY2xhc3NOYW1lPXtgJHtcbiAgICAgICAgICAgIGlzR3Vlc3RTaWduZXIgPyBcIjMwcHhcIiA6IFwiXCJcbiAgICAgICAgICB9IGJvcmRlci1bMC4xcHhdIGJvcmRlci1bI2ViZThlOF1gfVxuICAgICAgICAgIHJlZj17ZHJvcH1cbiAgICAgICAgICBpZD1cImNvbnRhaW5lclwiXG4gICAgICAgID5cbiAgICAgICAgICB7Y29udGFpbmVyV0g/LndpZHRoICYmXG4gICAgICAgICAgICBwZGZPcmlnaW5hbFdILmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIChwZGZSZXF1ZXN0XG4gICAgICAgICAgICAgID8gc2lnbmVyUG9zLm1hcCgoZGF0YSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtrZXl9PlxuICAgICAgICAgICAgICAgICAgICAgIHtjaGVja1NpZ25lZFNpZ25lcnMoZGF0YSl9XG4gICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogcGxhY2Vob2xkZXIgLy8gcGxhY2Vob2xkZXIgbW9iaWxlXG4gICAgICAgICAgICAgICAgPyBzaWduZXJQb3MubWFwKChkYXRhLCBpbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmR9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2RhdGEucGxhY2VIb2xkZXIubWFwKChwbGFjZURhdGEsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17aW5kZXh9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BsYWNlRGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlRGF0YS5wb3MubWFwKChwb3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17cG9zLmtleX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcz17cG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUGFnZUNvcHk9e3NldElzUGFnZUNvcHl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbktleT17c2V0U2lnbktleX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWxldGVTaWduPXtoYW5kbGVEZWxldGVTaWdufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGFiRHJhZz17aGFuZGxlVGFiRHJhZ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdG9wPXtoYW5kbGVTdG9wfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUltYWdlUmVzaXplXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtwYWdlTnVtYmVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17c2lnbmVyUG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17c2V0U2lnbmVyUG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25lck9iaklkPXtzZXRTaWduZXJPYmpJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtkYXRhfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUmVzaXplPXtzZXRJc1Jlc2l6ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93RHJvcGRvd249e3NldFNob3dEcm9wZG93bn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Nob3dCb3JkZXI9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFjZWhvbGRlcj17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVbmlxdWVJZD17c2V0VW5pcXVlSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTGlua1VzZXI9e2hhbmRsZUxpbmtVc2VyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVzZXJOYW1lPXtoYW5kbGVVc2VyTmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zV2lkdGg9e3Bvc1dpZHRofVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc0hlaWdodD17cG9zSGVpZ2h0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRHJhZ2dpbmc9e2lzRHJhZ2dpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNWYWxpZGF0ZT17c2V0SXNWYWxpZGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWRnZXRUeXBlPXtzZXRXaWRnZXRUeXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUmFkaW89e3NldElzUmFkaW99XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNDaGVja2JveD17c2V0SXNDaGVja2JveH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RXaWRnZXRJZD17c2VsZWN0V2lkZ2V0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmFtZU1vZGFsPXtoYW5kbGVOYW1lTW9kYWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVtcFNpZ25lcklkPXtzZXRUZW1wU2lnbmVySWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQ9e3VuaXF1ZUlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWw9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0g9e3BkZk9yaWdpbmFsV0h9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NlbGVjdElkPXtzZXRJc1NlbGVjdElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiB4eVBvc3Rpb24ubWFwKChkYXRhLCBpbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmR9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2RhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBvcy5tYXAoKHBvcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M9e3Bvc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1BhZ2VDb3B5PXtzZXRJc1BhZ2VDb3B5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVsZXRlU2lnbj17aGFuZGxlRGVsZXRlU2lnbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRhYkRyYWc9e2hhbmRsZVRhYkRyYWd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RvcD17aGFuZGxlU3RvcH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZT17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uPXt4eVBvc3Rpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtzZXRYeVBvc3Rpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU2lnblBhZD17c2V0SXNTaWduUGFkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NXaWR0aD17cG9zV2lkdGh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zSGVpZ2h0PXtwb3NIZWlnaHR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc1swXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RyYWdnaW5nPXtpc0RyYWdnaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbD17c2V0SXNJbml0aWFsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZGdldFR5cGU9e3NldFdpZGdldFR5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQ9e3NldFNlbGVjdFdpZGdldElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFdpZGdldElkPXtzZWxlY3RXaWRnZXRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17aGFuZGxlVXNlck5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNDaGVja2JveD17c2V0SXNDaGVja2JveH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtzZXRWYWxpZGF0ZUFsZXJ0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17c2V0Q3VycldpZGdldHNEZXRhaWxzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWw9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSD17cGRmT3JpZ2luYWxXSH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9KSl9XG5cbiAgICAgICAgICB7LyogdGhpcyBjb21wb25lbnQgZm9yIHJlbmRlciBwZGYgZG9jdW1lbnQgaXMgaW4gbWlkZGxlIG9mIHRoZSBjb21wb25lbnQgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgPERvY3VtZW50XG4gICAgICAgICAgICAgIG9uTG9hZEVycm9yPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0UGRmTG9hZChmYWxzZSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGxvYWRpbmc9e1wiTG9hZGluZyBEb2N1bWVudC4uXCJ9XG4gICAgICAgICAgICAgIG9uTG9hZFN1Y2Nlc3M9e3BhZ2VEZXRhaWxzfVxuICAgICAgICAgICAgICAvLyByZWY9e3BkZlJlZn0nXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0U2VsZWN0V2lkZ2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgZmlsZT17XG4gICAgICAgICAgICAgICAgcGRmVXJsXG4gICAgICAgICAgICAgICAgICA/IHBkZlVybFxuICAgICAgICAgICAgICAgICAgOiBwZGZEZXRhaWxzWzBdICYmIHBkZkRldGFpbHNbMF0uU2lnbmVkVXJsXG4gICAgICAgICAgICAgICAgICAgID8gcGRmRGV0YWlsc1swXS5TaWduZWRVcmxcbiAgICAgICAgICAgICAgICAgICAgOiBwZGZEZXRhaWxzWzBdLlVSTFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxQYWdlXG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxuICAgICAgICAgICAgICAgIHdpZHRoPXtjb250YWluZXJXSC53aWR0aH1cbiAgICAgICAgICAgICAgICByZW5kZXJBbm5vdGF0aW9uTGF5ZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIHJlbmRlclRleHRMYXllcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgb25HZXRBbm5vdGF0aW9uc0Vycm9yPXsoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYW5ub3RhdGlvbiBlcnJvclwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvRG9jdW1lbnQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPFJTQ1xuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICAgICAgYm94U2hhZG93OiBcInJnYmEoMTcsIDEyLCA0NiwgMC4xNSkgMHB4IDQ4cHggMTAwcHggMHB4XCIsXG4gICAgICAgICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCArIFwicHhcIixcbiAgICAgICAgICAgIHpJbmRleDogMFxuICAgICAgICAgIH19XG4gICAgICAgICAgbm9TY3JvbGxZPXtmYWxzZX1cbiAgICAgICAgICBub1Njcm9sbFg9e3NjYWxlID09PSAxID8gdHJ1ZSA6IGZhbHNlfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgd2lkdGg6IGNvbnRhaW5lcldIPy53aWR0aCAmJiBjb250YWluZXJXSD8ud2lkdGggKiBzY2FsZVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHJlZj17ZHJvcH1cbiAgICAgICAgICAgIGlkPVwiY29udGFpbmVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7cGRmTG9hZCAmJlxuICAgICAgICAgICAgICBjb250YWluZXJXSD8ud2lkdGggJiZcbiAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIChwZGZSZXF1ZXN0IC8vcGRmIHJlcXVlc3Qgc2lnbiBmbG93XG4gICAgICAgICAgICAgICAgPyBzaWduZXJQb3M/Lm1hcCgoZGF0YSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17a2V5fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjaGVja1NpZ25lZFNpZ25lcnMoZGF0YSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBwbGFjZWhvbGRlciAvL3BsYWNlaG9sZGVyIGFuZCB0ZW1wbGF0ZSBmbG93XG4gICAgICAgICAgICAgICAgICA/IHNpZ25lclBvcy5tYXAoKGRhdGEsIGluZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmR9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7ZGF0YS5wbGFjZUhvbGRlci5tYXAoKHBsYWNlRGF0YSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17aW5kZXh9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGxhY2VEYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZURhdGEucG9zLm1hcCgocG9zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtwb3Mua2V5fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcz17cG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNQYWdlQ29weT17c2V0SXNQYWdlQ29weX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWxldGVTaWduPXtoYW5kbGVEZWxldGVTaWdufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRhYkRyYWc9e2hhbmRsZVRhYkRyYWd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdG9wPXtoYW5kbGVTdG9wfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemU9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVJbWFnZVJlc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e3BhZ2VOdW1iZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eVBvc3Rpb249e3NpZ25lclBvc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17c2V0U2lnbmVyUG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmVyT2JqSWQ9e3NldFNpZ25lck9iaklkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT17ZGF0YX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUmVzaXplPXtzZXRJc1Jlc2l6ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNob3dEcm9wZG93bj17c2V0U2hvd0Ryb3Bkb3dufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93Qm9yZGVyPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFjZWhvbGRlcj17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVuaXF1ZUlkPXtzZXRVbmlxdWVJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUxpbmtVc2VyPXtoYW5kbGVMaW5rVXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVzZXJOYW1lPXtoYW5kbGVVc2VyTmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc1dpZHRoPXtwb3NXaWR0aH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc0hlaWdodD17cG9zSGVpZ2h0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEcmFnZ2luZz17aXNEcmFnZ2luZ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVmFsaWRhdGU9e3NldElzVmFsaWRhdGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWRnZXRUeXBlPXtzZXRXaWRnZXRUeXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNSYWRpbz17c2V0SXNSYWRpb31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQ2hlY2tib3g9e3NldElzQ2hlY2tib3h9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFdpZGdldElkPXtzZWxlY3RXaWRnZXRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5hbWVNb2RhbD17aGFuZGxlTmFtZU1vZGFsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVtcFNpZ25lcklkPXtzZXRUZW1wU2lnbmVySWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZD17dW5pcXVlSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0U2V0dGluZ01vZGFsPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9e3NjYWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSD17cGRmT3JpZ2luYWxXSH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NlbGVjdElkPXtzZXRJc1NlbGVjdElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIDogeHlQb3N0aW9uLm1hcCgoZGF0YSwgaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbnlvdXJzZWxmIGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17aW5kfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2RhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucG9zLm1hcCgocG9zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtwb3Mua2V5fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcz17cG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNQYWdlQ29weT17c2V0SXNQYWdlQ29weX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWxldGVTaWduPXtoYW5kbGVEZWxldGVTaWdufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRhYkRyYWc9e2hhbmRsZVRhYkRyYWd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdG9wPXsoZXZlbnQsIGRyYWdFbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdG9wKGV2ZW50LCBkcmFnRWxlbWVudCwgcG9zLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZT17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eVBvc3Rpb249e3h5UG9zdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17c2V0WHlQb3N0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkPXtzZXRJc1NpZ25QYWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Nob3dCb3JkZXI9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc1dpZHRoPXtwb3NXaWR0aH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc0hlaWdodD17cG9zSGVpZ2h0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc1swXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRHJhZ2dpbmc9e2lzRHJhZ2dpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luaXRpYWw9e3NldElzSW5pdGlhbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZGdldFR5cGU9e3NldFdpZGdldFR5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZD17c2V0U2VsZWN0V2lkZ2V0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RXaWRnZXRJZD17c2VsZWN0V2lkZ2V0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17aGFuZGxlVXNlck5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0NoZWNrYm94PXtzZXRJc0NoZWNrYm94fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsaWRhdGVBbGVydD17c2V0VmFsaWRhdGVBbGVydH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0g9e3BkZk9yaWdpbmFsV0h9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KSl9XG5cbiAgICAgICAgICAgIHsvKiB0aGlzIGNvbXBvbmVudCBmb3IgcmVuZGVyIHBkZiBkb2N1bWVudCBpcyBpbiBtaWRkbGUgb2YgdGhlIGNvbXBvbmVudCAqL31cbiAgICAgICAgICAgIDxEb2N1bWVudFxuICAgICAgICAgICAgICBvbkxvYWRFcnJvcj17KCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldFBkZkxvYWQoZmFsc2UpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBsb2FkaW5nPXtcIkxvYWRpbmcgRG9jdW1lbnQuLlwifVxuICAgICAgICAgICAgICBvbkxvYWRTdWNjZXNzPXtwYWdlRGV0YWlsc31cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzZXRTZWxlY3RXaWRnZXRJZCkge1xuICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvLyByZWY9e3BkZlJlZn1cbiAgICAgICAgICAgICAgZmlsZT17XG4gICAgICAgICAgICAgICAgcGRmVXJsXG4gICAgICAgICAgICAgICAgICA/IHBkZlVybFxuICAgICAgICAgICAgICAgICAgOiBwZGZEZXRhaWxzWzBdICYmIHBkZkRldGFpbHNbMF0uU2lnbmVkVXJsXG4gICAgICAgICAgICAgICAgICAgID8gcGRmRGV0YWlsc1swXS5TaWduZWRVcmxcbiAgICAgICAgICAgICAgICAgICAgOiBwZGZEZXRhaWxzWzBdLlVSTFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxQYWdlXG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICB3aWR0aD17Y29udGFpbmVyV0gud2lkdGh9XG4gICAgICAgICAgICAgICAgc2NhbGU9e3NjYWxlIHx8IDF9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcIi16LVsxXVwifSAvLyB3aGVuIHVzZXIgem9vbS1pbiBpbiB0YWJsZXQgd2lkZ2V0cyBtb3ZlIGJhY2t3YXJkIHRoYXQncyB3aHkgcGFzcyAtei1bMV1cbiAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxuICAgICAgICAgICAgICAgIHJlbmRlckFubm90YXRpb25MYXllcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgcmVuZGVyVGV4dExheWVyPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBvbkdldEFubm90YXRpb25zRXJyb3I9eyhlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJhbm5vdGF0aW9uIGVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9Eb2N1bWVudD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9SU0M+XG4gICAgICApfVxuICAgIDwvPlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJQZGY7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5pbXBvcnQgU2lnbmF0dXJlQ2FudmFzIGZyb20gXCJyZWFjdC1zaWduYXR1cmUtY2FudmFzXCI7XG5mdW5jdGlvbiBTaWduUGFkKHtcbiAgaXNTaWduUGFkLFxuICBpc1N0YW1wLFxuICBzZXRJc0ltYWdlU2VsZWN0LFxuICBvblNhdmVTaWduLFxuICBzZXRJc1NpZ25QYWQsXG4gIHNldEltYWdlLFxuICBpc0ltYWdlU2VsZWN0LFxuICBpbWFnZVJlZixcbiAgb25JbWFnZUNoYW5nZSxcbiAgb25TYXZlSW1hZ2UsXG4gIGltYWdlLFxuICBkZWZhdWx0U2lnbixcbiAgc2V0U2lnbmF0dXJlLFxuICBteUluaXRpYWwsXG4gIGlzSW5pdGlhbCxcbiAgc2V0SXNJbml0aWFsLFxuICBzZXRJc1N0YW1wLFxuICB3aWRnZXRUeXBlLFxuICBjdXJyV2lkZ2V0c0RldGFpbHMsXG4gIHNldEN1cnJXaWRnZXRzRGV0YWlsc1xufSkge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG4gIGNvbnN0IFtwZW5Db2xvciwgc2V0UGVuQ29sb3JdID0gdXNlU3RhdGUoXCJibHVlXCIpO1xuICBjb25zdCBhbGxDb2xvciA9IFtcImJsdWVcIiwgXCJyZWRcIiwgXCJibGFja1wiXTtcbiAgY29uc3QgY2FudmFzUmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBbaXNEZWZhdWx0U2lnbiwgc2V0SXNEZWZhdWx0U2lnbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc1RhYiwgc2V0SXNUYWJdID0gdXNlU3RhdGUoXCJkcmF3XCIpO1xuICBjb25zdCBbaXNTaWduSW1nLCBzZXRJc1NpZ25JbWddID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtzaWduVmFsdWUsIHNldFNpZ25WYWx1ZV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3RleHRXaWR0aCwgc2V0VGV4dFdpZHRoXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbdGV4dEhlaWdodCwgc2V0VGV4dEhlaWdodF0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW3NpZ25hdHVyZVR5cGUsIHNldFNpZ25hdHVyZVR5cGVdID0gdXNlU3RhdGUoXCJkcmF3XCIpO1xuICBjb25zdCBmb250T3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiBcIkZhc3RoYW5kXCIgfSxcbiAgICB7IHZhbHVlOiBcIkRhbmNpbmcgU2NyaXB0XCIgfSxcbiAgICB7IHZhbHVlOiBcIkNlZGFydmlsbGUgQ3Vyc2l2ZVwiIH0sXG4gICAgeyB2YWx1ZTogXCJEZWxpY2lvdXMgSGFuZHJhd25cIiB9XG4gICAgLy8gQWRkIG1vcmUgZm9udCBvcHRpb25zIGFzIG5lZWRlZFxuICBdO1xuICBjb25zdCBbZm9udFNlbGVjdCwgc2V0Rm9udFNlbGVjdF0gPSB1c2VTdGF0ZShmb250T3B0aW9uc1swXS52YWx1ZSk7XG5cbiAgY29uc3Qgc2VuZGVyVXNlciA9XG4gICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxuICAgICkgJiZcbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXG4gICAgKTtcbiAgY29uc3QganNvblNlbmRlciA9IEpTT04ucGFyc2Uoc2VuZGVyVXNlcik7XG4gIGNvbnN0IGN1cnJlbnRVc2VyTmFtZSA9IGpzb25TZW5kZXIgJiYganNvblNlbmRlci5uYW1lO1xuXG4gIC8vZnVuY3Rpb24gZm9yIGNsZWFyIHNpZ25hdHVyZSBpbWFnZVxuICBjb25zdCBoYW5kbGVDbGVhciA9ICgpID0+IHtcbiAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHMoe30pO1xuICAgIGlmIChpc1RhYiA9PT0gXCJkcmF3XCIpIHtcbiAgICAgIGlmIChjYW52YXNSZWYuY3VycmVudCkge1xuICAgICAgICBjYW52YXNSZWYuY3VycmVudC5jbGVhcigpO1xuICAgICAgfSBlbHNlIGlmIChpc1N0YW1wKSB7XG4gICAgICAgIHNldEltYWdlKFwiXCIpO1xuICAgICAgfVxuICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xuICAgIH0gZWxzZSBpZiAoaXNUYWIgPT09IFwidXBsb2FkSW1hZ2VcIikge1xuICAgICAgc2V0SW1hZ2UoXCJcIik7XG4gICAgfVxuICAgIC8vIHNldElzSW5pdGlhbChmYWxzZSk7XG4gIH07XG4gIC8vZnVuY3Rpb24gZm9yIHNldCBzaWduYXR1cmUgdXJsXG4gIGNvbnN0IGhhbmRsZVNpZ25hdHVyZUNoYW5nZSA9IChkYXRhKSA9PiB7XG4gICAgc2V0U2lnbmF0dXJlKGRhdGEpO1xuICAgIHNldElzU2lnbkltZyhkYXRhKTtcbiAgfTtcbiAgLy9zYXZlIGJ1dHRvbiBjb21wb25lbnRcbiAgY29uc3QgU2F2ZUJ0biA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgeyhpc1RhYiA9PT0gXCJkcmF3XCIgfHwgaXNUYWIgPT09IFwidXBsb2FkSW1hZ2VcIikgJiYgKFxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdCBtci0xIG10LVsycHhdXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUNsZWFyKCl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3QoXCJjbGVhclwiKX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgKX1cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscyh7fSk7XG4gICAgICAgICAgICBpZiAoIWltYWdlKSB7XG4gICAgICAgICAgICAgIGlmIChpc1RhYiA9PT0gXCJteXNpZ25hdHVyZVwiKSB7XG4gICAgICAgICAgICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpc0luaXRpYWwpIHtcbiAgICAgICAgICAgICAgICAgIG9uU2F2ZVNpZ24oc2lnbmF0dXJlVHlwZSwgXCJpbml0aWFsc1wiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb25TYXZlU2lnbihudWxsLCBcImRlZmF1bHRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpc1RhYiA9PT0gXCJ0eXBlXCIpIHtcbiAgICAgICAgICAgICAgICAgIHNldElzU2lnbkltZyhcIlwiKTtcbiAgICAgICAgICAgICAgICAgIG9uU2F2ZVNpZ24oXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAhaXNJbml0aWFsICYmIHRleHRXaWR0aCA+IDE1MCA/IDE1MCA6IHRleHRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgIWlzSW5pdGlhbCAmJiB0ZXh0SGVpZ2h0ID4gMzUgPyAzNSA6IHRleHRIZWlnaHRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNldElzU2lnbkltZyhcIlwiKTtcbiAgICAgICAgICAgICAgICAgIGNhbnZhc1JlZi5jdXJyZW50LmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICBvblNhdmVTaWduKHNpZ25hdHVyZVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNldFBlbkNvbG9yKFwiYmx1ZVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNldElzU2lnbkltZyhcIlwiKTtcbiAgICAgICAgICAgICAgb25TYXZlSW1hZ2Uoc2lnbmF0dXJlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRJc1NpZ25QYWQoZmFsc2UpO1xuICAgICAgICAgICAgc2V0SXNJbml0aWFsKGZhbHNlKTtcbiAgICAgICAgICAgIHNldElzSW1hZ2VTZWxlY3QoZmFsc2UpO1xuICAgICAgICAgICAgc2V0SXNEZWZhdWx0U2lnbihmYWxzZSk7XG4gICAgICAgICAgICBzZXRJbWFnZSgpO1xuICAgICAgICAgICAgc2V0SXNUYWIoXCJkcmF3XCIpO1xuICAgICAgICAgICAgc2V0U2lnblZhbHVlKFwiXCIpO1xuICAgICAgICAgICAgc2V0SXNTdGFtcChmYWxzZSk7XG4gICAgICAgICAgfX1cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgaXNTaWduSW1nIHx8IGltYWdlIHx8IGlzRGVmYXVsdFNpZ24gfHwgdGV4dFdpZHRoXG4gICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICA6IFwicG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgfSBvcC1idG4gb3AtYnRuLXByaW1hcnkgc2hhZG93LWxnYH1cbiAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAoaXNUYWIgPT09IFwiZHJhd1wiICYmIGlzU2lnbkltZykgfHxcbiAgICAgICAgICAgIChpc1RhYiA9PT0gXCJpbWFnZVwiICYmIGltYWdlKSB8fFxuICAgICAgICAgICAgKGlzVGFiID09PSBcIm15c2lnbmF0dXJlXCIgJiYgaXNEZWZhdWx0U2lnbikgfHxcbiAgICAgICAgICAgIChpc1RhYiA9PT0gXCJ0eXBlXCIgJiYgdGV4dFdpZHRoKVxuICAgICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICAgIDogaW1hZ2VcbiAgICAgICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICAgICAgOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICA+XG4gICAgICAgICAge3QoXCJzYXZlXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH07XG4gIC8vdXNlRWZmZWN0IGZvciBzZXQgYWxyZWFkeSBkcmF3IG9yIHNhdmUgc2lnbmF0dXJlIHVybC90ZXh0IHVybCBvZiBzaWduYXR1cmUgdGV4dCB0eXBlIGFuZCBkcmF3IHR5cGUgZm9yIGluaXRpYWwgdHlwZSBhbmQgc2lnbmF0dXJlIHR5cGUgd2lkZ2V0c1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjdXJyV2lkZ2V0c0RldGFpbHMgJiYgY2FudmFzUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGlzV2lkZ2V0VHlwZSA9IGN1cnJXaWRnZXRzRGV0YWlscz8udHlwZTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZVR5cGUgPSBjdXJyV2lkZ2V0c0RldGFpbHM/LnNpZ25hdHVyZVR5cGU7XG4gICAgICBjb25zdCB1cmwgPSBjdXJyV2lkZ2V0c0RldGFpbHM/LlNpZ25Vcmw7XG4gICAgICAvL2NoZWNraW5nIHdpZGdldCB0eXBlIGFuZCBkcmF3IHR5cGUgc2lnbmF0dXJlIHVybFxuICAgICAgaWYgKGlzSW5pdGlhbCkge1xuICAgICAgICBpZiAoaXNXaWRnZXRUeXBlID09PSBcImluaXRpYWxzXCIgJiYgc2lnbmF0dXJlVHlwZSA9PT0gXCJkcmF3XCIgJiYgdXJsKSB7XG4gICAgICAgICAgY2FudmFzUmVmLmN1cnJlbnQuZnJvbURhdGFVUkwodXJsKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNXaWRnZXRUeXBlID09PSBcInNpZ25hdHVyZVwiICYmXG4gICAgICAgIHNpZ25hdHVyZVR5cGUgPT09IFwiZHJhd1wiICYmXG4gICAgICAgIHVybFxuICAgICAgKSB7XG4gICAgICAgIGNhbnZhc1JlZi5jdXJyZW50LmZyb21EYXRhVVJMKHVybCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHJpbW1lZE5hbWUgPSBjdXJyZW50VXNlck5hbWUgJiYgY3VycmVudFVzZXJOYW1lLnRyaW0oKTtcbiAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHRyaW1tZWROYW1lPy5jaGFyQXQoMCk7XG4gICAgY29uc3QgdXNlck5hbWUgPSBpc0luaXRpYWwgPyBmaXJzdENoYXJhY3RlciA6IGN1cnJlbnRVc2VyTmFtZTtcbiAgICBzZXRTaWduVmFsdWUodXNlck5hbWUpO1xuICAgIHNldEZvbnRTZWxlY3QoXCJGYXN0aGFuZFwiKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2lzU2lnblBhZF0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGxvYWRGb250ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZG9jdW1lbnQuZm9udHMubG9hZChgMjBweCAke2ZvbnRTZWxlY3R9YCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdEZvbnRTVHlsZSA9IGZvbnRPcHRpb25zLmZpbmQoXG4gICAgICAgICAgKGZvbnQpID0+IGZvbnQudmFsdWUgPT09IGZvbnRTZWxlY3RcbiAgICAgICAgKTtcbiAgICAgICAgc2V0Rm9udFNlbGVjdChzZWxlY3RGb250U1R5bGU/LnZhbHVlIHx8IGZvbnRPcHRpb25zWzBdLnZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBsb2FkaW5nIGZvbnQ6XCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbG9hZEZvbnQoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtmb250U2VsZWN0XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBMb2FkIHRoZSBkZWZhdWx0IHNpZ25hdHVyZSBhZnRlciB0aGUgY29tcG9uZW50IG1vdW50c1xuICAgIGlmIChjYW52YXNSZWYuY3VycmVudCkge1xuICAgICAgY2FudmFzUmVmLmN1cnJlbnQuZnJvbURhdGFVUkwoaXNTaWduSW1nKTtcbiAgICB9XG4gICAgaWYgKGlzVGFiID09PSBcInR5cGVcIikge1xuICAgICAgY29uc3QgdHJpbW1lZE5hbWUgPSBzaWduVmFsdWUgPyBzaWduVmFsdWUudHJpbSgpIDogY3VycmVudFVzZXJOYW1lLnRyaW0oKTtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gdHJpbW1lZE5hbWUuY2hhckF0KDApO1xuICAgICAgY29uc3QgdXNlck5hbWUgPSBpc0luaXRpYWwgPyBmaXJzdENoYXJhY3RlciA6IHNpZ25WYWx1ZTtcbiAgICAgIHNldFNpZ25WYWx1ZSh1c2VyTmFtZSk7XG4gICAgICBjb252ZXJ0VG9JbWcoZm9udFNlbGVjdCwgdXNlck5hbWUpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtpc1RhYl0pO1xuICAvL2Z1bmN0aW9uIGZvciBjb252ZXJ0IGlucHV0IHRleHQgdmFsdWUgaW4gaW1hZ2VcbiAgY29uc3QgY29udmVydFRvSW1nID0gYXN5bmMgKGZvbnRTdHlsZSwgdGV4dCwgY29sb3IpID0+IHtcbiAgICAvL2dldCB0ZXh0IGNvbnRlbnQgdG8gY29udmVydCBpbiBpbWFnZVxuICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGV4dDtcbiAgICBjb25zdCBmb250ZmFtaWx5ID0gZm9udFN0eWxlXG4gICAgICA/IGZvbnRTdHlsZVxuICAgICAgOiBmb250U2VsZWN0XG4gICAgICAgID8gZm9udFNlbGVjdFxuICAgICAgICA6IFwiRmFzdGhhbmRcIjtcbiAgICBjb25zdCBmb250U2l6ZVZhbHVlID0gXCI0MHB4XCI7XG4gICAgLy9jcmVhdGluZyBzcGFuIGZvciBnZXR0aW5nIHRleHQgY29udGVudCB3aWR0aFxuICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBzcGFuLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XG4gICAgc3Bhbi5zdHlsZS5mb250ID0gYCR7Zm9udFNpemVWYWx1ZX0gJHtmb250ZmFtaWx5fWA7IC8vIGhlcmUgcHV0IHlvdXIgdGV4dCBzaXplIGFuZCBmb250IGZhbWlseVxuICAgIHNwYW4uc3R5bGUuY29sb3IgPSBjb2xvciA/IGNvbG9yIDogcGVuQ29sb3I7XG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJoaWRkZW5cIjtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pOyAvLyBSZXBsYWNlICdjb250YWluZXInIHdpdGggdGhlIElEIG9mIHRoZSBjb250YWluZXIgZWxlbWVudFxuXG4gICAgLy9jcmVhdGUgY2FudmFzIHRvIHJlbmRlciB0ZXh0IGluIGNhbnZhcyBhbmQgY29udmVydCBpbiBpbWFnZVxuICAgIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIC8vIERyYXcgdGhlIHRleHQgY29udGVudCBvbiB0aGUgY2FudmFzXG4gICAgY29uc3QgY3R4ID0gY2FudmFzRWxlbWVudC5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgY29uc3QgYWRkRXh0cmFXaWR0aCA9IGlzSW5pdGlhbCA/IDEwIDogNTA7XG4gICAgY29uc3Qgd2lkdGggPSBzcGFuLm9mZnNldFdpZHRoICsgYWRkRXh0cmFXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBzcGFuLm9mZnNldEhlaWdodDtcbiAgICBzZXRUZXh0V2lkdGgod2lkdGgpO1xuICAgIHNldFRleHRIZWlnaHQoaGVpZ2h0KTtcbiAgICBjb25zdCBmb250ID0gc3Bhbi5zdHlsZVtcImZvbnRcIl07XG4gICAgLy8gU2V0IHRoZSBjYW52YXMgZGltZW5zaW9ucyB0byBtYXRjaCB0aGUgc3BhblxuICAgIGNhbnZhc0VsZW1lbnQud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XG4gICAgY2FudmFzRWxlbWVudC5oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xuXG4gICAgLy8gWW91IGNhbiBjdXN0b21pemUgdGV4dCBzdHlsZXMgaWYgbmVlZGVkXG4gICAgY3R4LmZvbnQgPSBmb250O1xuICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvciA/IGNvbG9yIDogcGVuQ29sb3I7IC8vIFNldCB0aGUgdGV4dCBjb2xvclxuICAgIGN0eC50ZXh0QWxpZ24gPSBcImNlbnRlclwiO1xuICAgIGN0eC50ZXh0QmFzZWxpbmUgPSBcIm1pZGRsZVwiO1xuICAgIGN0eC5zY2FsZShwaXhlbFJhdGlvLCBwaXhlbFJhdGlvKTtcbiAgICAvLyBEcmF3IHRoZSBjb250ZW50IG9mIHRoZSBzcGFuIG9udG8gdGhlIGNhbnZhc1xuICAgIGN0eC5maWxsVGV4dChzcGFuLnRleHRDb250ZW50LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOyAvLyBBZGp1c3QgdGhlIHgseS1jb29yZGluYXRlIGFzIG5lZWRlZFxuICAgIC8vcmVtb3ZlIHNwYW4gdGFnXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICAvLyBDb252ZXJ0IHRoZSBjYW52YXMgdG8gaW1hZ2UgZGF0YVxuICAgIGNvbnN0IGRhdGFVcmwgPSBjYW52YXNFbGVtZW50LnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKTtcbiAgICBzZXRTaWduYXR1cmUoZGF0YVVybCk7XG4gIH07XG5cbiAgY29uc3QgUGVuQ29sb3JDb21wb25lbnQgPSAocHJvcHMpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgIHthbGxDb2xvci5tYXAoKGRhdGEsIGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIG1hcmdpbjogXCI1cHhcIixcbiAgICAgICAgICAgICAgICBjb2xvcjogZGF0YSxcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206XG4gICAgICAgICAgICAgICAgICBrZXkgPT09IDAgJiYgcGVuQ29sb3IgPT09IFwiYmx1ZVwiXG4gICAgICAgICAgICAgICAgICAgID8gXCIycHggc29saWQgYmx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIDoga2V5ID09PSAxICYmIHBlbkNvbG9yID09PSBcInJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcIjJweCBzb2xpZCByZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIDoga2V5ID09PSAyICYmIHBlbkNvbG9yID09PSBcImJsYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCIycHggc29saWQgYmxhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIjJweCBzb2xpZCB3aGl0ZVwiXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICBwcm9wcz8uY29udmVydFRvSW1nICYmXG4gICAgICAgICAgICAgICAgICBwcm9wcz8uY29udmVydFRvSW1nKGZvbnRTZWxlY3QsIHNpZ25WYWx1ZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgc2V0UGVuQ29sb3IoXCJibHVlXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICBzZXRQZW5Db2xvcihcInJlZFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgc2V0UGVuQ29sb3IoXCJibGFja1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGtleT17a2V5fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1wZW4tbmliXCJcbiAgICAgICAgICAgICAgd2lkdGg9ezIwfVxuICAgICAgICAgICAgICBoZWlnaHQ9ezIwfVxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICApO1xuICAgICAgICB9KX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH07XG4gIHJldHVybiAoXG4gICAgPGRpdj5cbiAgICAgIHtpc1NpZ25QYWQgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm9wLW1vZGFsIG9wLW1vZGFsLW9wZW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm9wLW1vZGFsLWJveCBweC1bMTNweF0gcHQtMiBwYi0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIHRleHQtYmFzZS1jb250ZW50IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzEuMnJlbV1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIG10LVszcHhdXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGdhcC1bNXB4XSBtZDpnYXAtWzhweF0gdGV4dC1bMTFweF0gbWQ6dGV4dC1iYXNlXCI+XG4gICAgICAgICAgICAgICAgICAgIHtpc1N0YW1wID8gKFxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYmFzZS1jb250ZW50IGZvbnQtYm9sZCB0ZXh0LWxnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7d2lkZ2V0VHlwZSA9PT0gXCJpbWFnZVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyV2lkZ2V0c0RldGFpbHM/LnR5cGUgPT09IFwiaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHQoXCJ1cGxvYWQtaW1hZ2VcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0KFwidXBsb2FkLXN0YW1wLWltYWdlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW1hZ2VTZWxlY3QoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNUYWIoXCJkcmF3XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NpZ25JbWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlKGlzU2lnbkltZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWIgPT09IFwiZHJhd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwibm8tdW5kZXJsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG9wLWxpbmsgdW5kZXJsaW5lLW9mZnNldC04IG1sLVsycHhdYH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiZHJhd1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwidXBsb2FkSW1hZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmVUeXBlKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFiID09PSBcInVwbG9hZEltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIm9wLWxpbmstcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJuby11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayB1bmRlcmxpbmUtb2Zmc2V0LTggbWwtWzJweF1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJ1cGxvYWQtaW1hZ2VcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW1hZ2VTZWxlY3QoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNUYWIoXCJ0eXBlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlVHlwZShcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEltYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWIgPT09IFwidHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwibm8tdW5kZXJsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG9wLWxpbmsgdW5kZXJsaW5lLW9mZnNldC04IG1sLVsycHhdYH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwidHlwZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7IWlzSW5pdGlhbCAmJiBkZWZhdWx0U2lnbiA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1RhYihcIm15c2lnbmF0dXJlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmVUeXBlKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFiID09PSBcIm15c2lnbmF0dXJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwib3AtbGluay1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwibm8tdW5kZXJsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayB1bmRlcmxpbmUtb2Zmc2V0LTggbWwtWzJweF1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwibXktc2lnbmF0dXJlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0luaXRpYWwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbXlJbml0aWFsICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24odHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1RhYihcIm15c2lnbmF0dXJlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZVR5cGUoXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhYiA9PT0gXCJteXNpZ25hdHVyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwib3AtbGluay1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJuby11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG9wLWxpbmsgdW5kZXJsaW5lLW9mZnNldC04IG1sLVsycHhdYH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJteS1pbml0aWFsc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtWzEuNXJlbV0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIHNldFBlbkNvbG9yKFwiYmx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgIHNldElzU2lnblBhZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICBzZXRJc0luaXRpYWwoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIHNldEltYWdlKCk7XG4gICAgICAgICAgICAgICAgICBzZXRJc1RhYihcImRyYXdcIik7XG4gICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmVUeXBlKFwiZHJhd1wiKTtcbiAgICAgICAgICAgICAgICAgIHNldFNpZ25WYWx1ZShcIlwiKTtcbiAgICAgICAgICAgICAgICAgIHNldElzU3RhbXAoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAmdGltZXM7XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtWzIwcHhdIGgtZnVsbFwiPlxuICAgICAgICAgICAgICB7aXNEZWZhdWx0U2lnbiA/IChcbiAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcIjEuM3B4IHNvbGlkICMwMDdiZmZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCIycHhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogNixcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0luaXRpYWwgPyBcImludGlhbFNpZ25hdHVyZUNhbnZhc1wiIDogXCJzaWduYXR1cmVDYW52YXNcIlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInN0YW1wIGltZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb250YWluIGJnLXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYz17aXNJbml0aWFsID8gbXlJbml0aWFsIDogZGVmYXVsdFNpZ259XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8U2F2ZUJ0biAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICkgOiBpc0ltYWdlU2VsZWN0IHx8IGlzU3RhbXAgPyAoXG4gICAgICAgICAgICAgICAgIWltYWdlID8gKFxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcIjEuM3B4IHNvbGlkICMwMDdiZmZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCIycHhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogNixcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0luaXRpYWwgPyBcImludGlhbFNpZ25hdHVyZUNhbnZhc1wiIDogXCJzaWduYXR1cmVDYW52YXNcIlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBpbWFnZVJlZi5jdXJyZW50LmNsaWNrKCl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkltYWdlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmlsZXR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0PVwiaW1hZ2UvcG5nLGltYWdlL2pwZWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXtpbWFnZVJlZn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtY2xvdWQtdXBsb2FkLWFsdCB1cGxvYWRJbWdMb2dvXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTBweF1cIj57dChcInVwbG9hZFwiKX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcIjEuM3B4IHNvbGlkICMwMDdiZmZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206IDYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImludGlhbFNpZ25hdHVyZUNhbnZhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInNpZ25hdHVyZUNhbnZhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJwcmludCBpbWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9e2ltYWdlUmVmfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9e2ltYWdlLnNyY31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCIgb2JqZWN0LWNvbnRhaW4gaC1mdWxsIHctZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNhdmVCdG4gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICkgOiBpc1RhYiA9PT0gXCJ0eXBlXCIgPyAoXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1yLVs1cHhdIHRleHQtWzEycHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAge2lzSW5pdGlhbCA/IHQoXCJpbml0aWFsLXRlYlwiKSA6IHQoXCJzaWduYXR1cmUtdGFiXCIpfTpcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGg9e2lzSW5pdGlhbCA/IDMgOiAzMH1cbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyBmb250RmFtaWx5OiBmb250U2VsZWN0LCBjb2xvcjogcGVuQ29sb3IgfX1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWwtMSBvcC1pbnB1dCBvcC1pbnB1dC1ib3JkZXJlZCBvcC1pbnB1dC1zbSBmb2N1czpvdXRsaW5lLW5vbmUgaG92ZXI6Ym9yZGVyLWJhc2UtY29udGVudCB3LWZ1bGwgdGV4dC1bMjBweF1cIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiWW91ciBzaWduYXR1cmVcIlxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzaWduVmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduVmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvSW1nKGZvbnRTZWxlY3QsIGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1bMXB4XSBib3JkZXItWyNkNmQzZDNdIG10LVsxMHB4XSBtbC1bNXB4XVwiPlxuICAgICAgICAgICAgICAgICAgICB7Zm9udE9wdGlvbnMubWFwKChmb250LCBpbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2luZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IGZvbnQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNlbGVjdCA9PT0gZm9udC52YWx1ZSAmJiBcInJnYigyMDYgMjI1IDI0NylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9udFNlbGVjdChmb250LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9JbWcoZm9udC52YWx1ZSwgc2lnblZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjVweCAxMHB4IDVweCAxMHB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogXCIyMHB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogcGVuQ29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3NpZ25WYWx1ZSA/IHNpZ25WYWx1ZSA6IFwiWW91ciBzaWduYXR1cmVcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIG10LVsxMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICA8UGVuQ29sb3JDb21wb25lbnQgY29udmVydFRvSW1nPXtjb252ZXJ0VG9JbWd9IC8+XG4gICAgICAgICAgICAgICAgICAgIDxTYXZlQnRuIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxTaWduYXR1cmVDYW52YXNcbiAgICAgICAgICAgICAgICAgICAgICByZWY9e2NhbnZhc1JlZn1cbiAgICAgICAgICAgICAgICAgICAgICBwZW5Db2xvcj17cGVuQ29sb3J9XG4gICAgICAgICAgICAgICAgICAgICAgY2FudmFzUHJvcHM9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogaXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJpbnRpYWxTaWduYXR1cmVDYW52YXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwic2lnbmF0dXJlQ2FudmFzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwiMS42cHggc29saWQgIzAwN2JmZlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMnB4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cInJnYigyNTUsIDI1NSwgMjU1KVwiXG4gICAgICAgICAgICAgICAgICAgICAgb25FbmQ9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduYXR1cmVDaGFuZ2UoY2FudmFzUmVmLmN1cnJlbnQ/LnRvRGF0YVVSTCgpKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBkb3RTaXplPXsxfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIG10LVsxMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICA8UGVuQ29sb3JDb21wb25lbnQgLz5cbiAgICAgICAgICAgICAgICAgICAgPFNhdmVCdG4gLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lnblBhZDtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGRhcmtlbkNvbG9yLCBnZXRGaXJzdExldHRlciB9IGZyb20gXCIuLi8uLi9jb25zdGFudC9VdGlsc1wiO1xuXG5mdW5jdGlvbiBTaWduZXJMaXN0Q29tcG9uZW50KHByb3BzKSB7XG4gIGNvbnN0IGNoZWNrU2lnbmVyQmFja0NvbG9yID0gKG9iaikgPT4ge1xuICAgIGlmIChvYmopIHtcbiAgICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICAgIGlmIChvYmo/LklkKSB7XG4gICAgICAgIGRhdGEgPSBwcm9wcy5zaWduZXJQb3MuZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSBvYmouSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IHByb3BzLnNpZ25lclBvcy5maWx0ZXIoXG4gICAgICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IG9iai5vYmplY3RJZFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwICYmIGRhdGFbMF0uYmxvY2tDb2xvcjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGNoZWNrVXNlck5hbWVDb2xvciA9IChvYmopID0+IHtcbiAgICBjb25zdCBnZXRCYWNrQ29sb3IgPSBjaGVja1NpZ25lckJhY2tDb2xvcihvYmopO1xuICAgIGlmIChnZXRCYWNrQ29sb3IpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gZGFya2VuQ29sb3IoZ2V0QmFja0NvbG9yLCAwLjQpO1xuICAgICAgcmV0dXJuIGNvbG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCIjYWJkMWQwXCI7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC14bCBteC0xIGZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIHB5LVsxMHB4XSBtdC0xXCJcbiAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IGNoZWNrU2lnbmVyQmFja0NvbG9yKHByb3BzLm9iaikgfX1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IGNoZWNrVXNlck5hbWVDb2xvcihwcm9wcy5vYmopIH19XG4gICAgICAgIGNsYXNzTmFtZT1cImZsZXggdy1bMzBweF0gaC1bMzBweF0gcm91bmRlZC1mdWxsIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBteC0xXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTJweF0gdGV4dC1jZW50ZXIgZm9udC1ib2xkIHRleHQtYmxhY2sgdXBwZXJjYXNlXCI+XG4gICAgICAgICAge2dldEZpcnN0TGV0dGVyKFxuICAgICAgICAgICAgcHJvcHMub2JqPy5OYW1lIHx8IHByb3BzLm9iaj8uZW1haWwgfHwgcHJvcHMub2JqPy5Sb2xlXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTJweF0gZm9udC1ib2xkIHRleHQtWyM0MjQyNDJdIHctWzEwMHB4XSB3aGl0ZXNwYWNlLW5vd3JhcCBvdmVyZmxvdy1oaWRkZW4gdGV4dC1lbGxpcHNpc1wiPlxuICAgICAgICAgIHtwcm9wcy5vYmo/Lk5hbWUgfHwgcHJvcHM/Lm9iaj8uUm9sZX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxMHB4XSBmb250LW1lZGl1bSB0ZXh0LVsjNDI0MjQyXSB3LVsxMDBweF0gd2hpdGVzcGFjZS1ub3dyYXAgb3ZlcmZsb3ctaGlkZGVuIHRleHQtZWxsaXBzaXNcIj5cbiAgICAgICAgICB7cHJvcHMub2JqPy5FbWFpbCB8fCBwcm9wcy5vYmo/LmVtYWlsfVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lnbmVyTGlzdENvbXBvbmVudDtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBMb2FkZXIgZnJvbSBcIi4uLy4uL3ByaW1pdGl2ZXMvTG9hZGVyXCI7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5cbmZ1bmN0aW9uIFZlcmlmeUVtYWlsKHByb3BzKSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgcmV0dXJuIChcbiAgICA8ZGlhbG9nIGNsYXNzTmFtZT1cIm9wLW1vZGFsIG9wLW1vZGFsLW9wZW4gYWJzb2x1dGUgei1bMTk5OV1cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWQ6dy1bNDAlXSB3LVs4MCVdIG9wLW1vZGFsLWJveCBwLTAgb3ZlcmZsb3cteS1hdXRvIGhpZGUtc2Nyb2xsYmFyIHRleHQtc21cIj5cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZvbnQtYm9sZCB0ZXh0LWxnIHB0LVsxNXB4XSBweC1bMjBweF0gdGV4dC1iYXNlLWNvbnRlbnRcIj5cbiAgICAgICAgICB7dChcIm90cC12ZXJpZmljYXRpb25cIil9XG4gICAgICAgIDwvaDM+XG4gICAgICAgIHtwcm9wcy5pc1ZlcmlmeU1vZGFsID8gKFxuICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICBvblN1Ym1pdD17KGUpID0+IHtcbiAgICAgICAgICAgICAgcHJvcHMuc2V0SXNWZXJpZnlNb2RhbChmYWxzZSk7XG4gICAgICAgICAgICAgIHByb3BzLmhhbmRsZVZlcmlmeUVtYWlsKGUpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTYgcHktMyB0ZXh0LWJhc2UtY29udGVudFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwibWItMlwiPnt0KFwiZW50ZXItb3RwXCIpfTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG9uSW52YWxpZD17KGUpID0+XG4gICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eSh0KFwiaW5wdXQtcmVxdWlyZWRcIikpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgdHlwZT1cInRlbFwiXG4gICAgICAgICAgICAgICAgcGF0dGVybj1cIlswLTldezR9XCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgb3AtaW5wdXQgb3AtaW5wdXQtYm9yZGVyZWQgb3AtaW5wdXQtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QoXCJvdHAtcGxhY2Vob2xkZXJcIil9XG4gICAgICAgICAgICAgICAgdmFsdWU9e3Byb3BzLm90cH1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHByb3BzLnNldE90cChlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtNiBteS0zXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgIHt0KFwidmVyaWZ5XCIpfVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tc2Vjb25kYXJ5IG1sLTJcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBwcm9wcy5oYW5kbGVSZXNlbmQoZSl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7dChcInJlc2VuZFwiKX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICkgOiBwcm9wcy5vdHBMb2FkZXIgPyAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLVsxNTBweF0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxMb2FkZXIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTYgcHktMyB0ZXh0LWJhc2UtY29udGVudFwiPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibWItMiB0ZXh0LXNtXCI+e3QoXCJ2ZXJpZnktZW1haWxcIil9PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC0wIG10LTNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcHJvcHMuaGFuZGxlVmVyaWZ5QnRuKCk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt0KFwic2VuZC1vdHBcIil9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2RpYWxvZz5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVyaWZ5RW1haWw7XG4iLCJpbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XHJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCB7IHJnYiB9IGZyb20gXCJwZGYtbGliXCI7XHJcbmltcG9ydCBQYXJzZSBmcm9tIFwicGFyc2VcIjtcclxuaW1wb3J0IHsgYXBwSW5mbyB9IGZyb20gXCIuL2FwcGluZm9cIjtcclxuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSBcImZpbGUtc2F2ZXJcIjtcclxuaW1wb3J0IHByaW50TW9kdWxlIGZyb20gXCJwcmludC1qc1wiO1xyXG5pbXBvcnQgeyB2YWxpZHBsYW4gfSBmcm9tIFwiLi4vanNvbi9wbGFuc0FyclwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZvbnRzaXplQXJyID0gWzIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4XTtcclxuZXhwb3J0IGNvbnN0IGZvbnRDb2xvckFyciA9IFtcInJlZFwiLCBcImJsYWNrXCIsIFwiYmx1ZVwiLCBcInllbGxvd1wiXTtcclxuZXhwb3J0IGNvbnN0IGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPCA3Njc7XHJcbmV4cG9ydCBjb25zdCBpc1RhYkFuZE1vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTAyMztcclxuZXhwb3J0IGNvbnN0IHRleHRJbnB1dFdpZGdldCA9IFwidGV4dCBpbnB1dFwiO1xyXG5leHBvcnQgY29uc3QgdGV4dFdpZGdldCA9IFwidGV4dFwiO1xyXG5leHBvcnQgY29uc3QgcmFkaW9CdXR0b25XaWRnZXQgPSBcInJhZGlvIGJ1dHRvblwiO1xyXG5leHBvcnQgY29uc3Qgb3BlbkluTmV3VGFiID0gKHVybCwgdGFyZ2V0KSA9PiB7XHJcbiAgaWYgKHRhcmdldCkge1xyXG4gICAgd2luZG93Lm9wZW4odXJsLCB0YXJnZXQsIFwibm9vcGVuZXIsbm9yZWZlcnJlclwiKTtcclxuICB9IGVsc2Uge1xyXG4gICAgd2luZG93Lm9wZW4odXJsLCBcIl9ibGFua1wiLCBcIm5vb3BlbmVyLG5vcmVmZXJyZXJcIik7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoU3Vic2NyaXB0aW9uKFxyXG4gIGV4dFVzZXJJZCxcclxuICBjb250YWN0T2JqSWQsXHJcbiAgaXNHdWVzdFNpZ24gPSBmYWxzZVxyXG4pIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgRXh0YW5kX0NsYXNzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJFeHRhbmRfQ2xhc3NcIik7XHJcbiAgICBjb25zdCBleHRDbGFzcyA9IEV4dGFuZF9DbGFzcyAmJiBKU09OLnBhcnNlKEV4dGFuZF9DbGFzcyk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcImV4dENsYXNzIFwiLCBleHRDbGFzcyk7XHJcbiAgICBsZXQgZXh0VXNlcjtcclxuICAgIGlmIChleHRDbGFzcyAmJiBleHRDbGFzcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGV4dFVzZXIgPSBleHRDbGFzc1swXS5vYmplY3RJZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGV4dFVzZXIgPSBleHRVc2VySWQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBiYXNlVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpO1xyXG4gICAgY29uc3QgdXJsID0gYCR7YmFzZVVSTH1mdW5jdGlvbnMvZ2V0c3Vic2NyaXB0aW9uc2A7XHJcbiAgICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICB9O1xyXG4gICAgY29uc3QgcGFyYW1zID0gaXNHdWVzdFNpZ25cclxuICAgICAgPyB7IGNvbnRhY3RJZDogY29udGFjdE9iaklkIH1cclxuICAgICAgOiB7IGV4dFVzZXJJZDogZXh0VXNlciB9O1xyXG4gICAgY29uc3QgdGVuYXRSZXMgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgcGFyYW1zLCB7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcbiAgICBsZXQgcGxhbiwgc3RhdHVzLCBiaWxsaW5nRGF0ZTtcclxuICAgIGlmIChpc0d1ZXN0U2lnbikge1xyXG4gICAgICBwbGFuID0gdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LnBsYW47XHJcbiAgICAgIHN0YXR1cyA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5pc1N1YnNjcmliZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwbGFuID0gdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LlBsYW5Db2RlO1xyXG4gICAgICBiaWxsaW5nRGF0ZSA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5OZXh0X2JpbGxpbmdfZGF0ZT8uaXNvO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgcGxhbiwgYmlsbGluZ0RhdGUsIHN0YXR1cyB9O1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gZmV0Y2ggc3Vic2NyaXB0aW9uXCIsIGVycik7XHJcbiAgICByZXR1cm4geyBwbGFuOiBcIlwiLCBiaWxsaW5nRGF0ZTogXCJcIiB9O1xyXG4gIH1cclxufVxyXG4vL2Z1bmN0aW9uIHRvIGdldCBzdWJjcmlwaXRpb24gZGV0YWlscyBmcm9tIHN1YnNjcmlwdGlvbiBjbGFzc1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tJc1N1YnNjcmliZWQoKSB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBpZiAocmVzLnBsYW4gPT09IFwiZnJlZXBsYW5cIikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKHJlcy5iaWxsaW5nRGF0ZSkge1xyXG4gICAgICBpZiAobmV3IERhdGUocmVzLmJpbGxpbmdEYXRlKSA+IG5ldyBEYXRlKCkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGZldGNoIHN1YnNjcmlwdGlvblwiLCBlcnIpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG5cclxuLy9mdW5jdGlvbiB0byBnZXQgc3ViY3JpcGl0aW9uIGRldGFpbHMgZnJvbSBzdWJzY3JpcHRpb24gY2xhc3NcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrSXNTdWJzY3JpYmVkVGVhbSgpIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hTdWJzY3JpcHRpb24oKTtcclxuICAgIGlmIChyZXMucGxhbiA9PT0gXCJmcmVlcGxhblwiKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAocmVzLmJpbGxpbmdEYXRlKSB7XHJcbiAgICAgIGNvbnN0IHBsYW4gPSB2YWxpZHBsYW5bcmVzLnBsYW5dIHx8IGZhbHNlO1xyXG4gICAgICBpZiAocGxhbiAmJiBuZXcgRGF0ZShyZXMuYmlsbGluZ0RhdGUpID4gbmV3IERhdGUoKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gZmV0Y2ggc3Vic2NyaXB0aW9uXCIsIGVycik7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY29sb3IgPSBbXHJcbiAgXCIjOTNhM2RiXCIsXHJcbiAgXCIjZTZjM2RiXCIsXHJcbiAgXCIjYzBlM2JjXCIsXHJcbiAgXCIjYmNlM2RiXCIsXHJcbiAgXCIjYjhjY2RiXCIsXHJcbiAgXCIjY2ViOGRiXCIsXHJcbiAgXCIjZmZjY2ZmXCIsXHJcbiAgXCIjOTlmZmNjXCIsXHJcbiAgXCIjY2M5OWZmXCIsXHJcbiAgXCIjZmZjYzk5XCIsXHJcbiAgXCIjNjZjY2ZmXCIsXHJcbiAgXCIjZmZmZmNjXCJcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBuYW1lQ29sb3IgPSBbXHJcbiAgXCIjMzA0ZmJmXCIsXHJcbiAgXCIjN2Q1MjcwXCIsXHJcbiAgXCIjNWY4MjViXCIsXHJcbiAgXCIjNTc4MDc3XCIsXHJcbiAgXCIjNTc2ZTgwXCIsXHJcbiAgXCIjNmQ1MjdkXCIsXHJcbiAgXCIjY2MwMGNjXCIsXHJcbiAgXCIjMDA2NjY2XCIsXHJcbiAgXCIjY2MwMGZmXCIsXHJcbiAgXCIjZmY5OTAwXCIsXHJcbiAgXCIjMzM2Njk5XCIsXHJcbiAgXCIjY2M5OTAwXCJcclxuXTtcclxuZXhwb3J0IGNvbnN0IHRvRGF0YVVybCA9IChmaWxlKSA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICByZWFkZXIub25sb2FkZW5kID0gKGUpID0+IHtcclxuICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xyXG4gICAgfTtcclxuICB9KTtcclxufTtcclxuXHJcbi8vZnVuY3Rpb24gZm9yIGdldHRpbmcgZG9jdW1lbnQgZGV0YWlscyBmb3IgZ2V0RHJpdmUgY2xvdWQgZnVuY3Rpb25cclxuZXhwb3J0IGNvbnN0IGdldERyaXZlID0gYXN5bmMgKGRvY3VtZW50SWQsIHNraXAgPSAwLCBsaW1pdCA9IDEwMCkgPT4ge1xyXG4gIGNvbnN0IGRhdGEgPSB7XHJcbiAgICBkb2NJZDogZG9jdW1lbnRJZCAmJiBkb2N1bWVudElkLFxyXG4gICAgbGltaXQ6IGxpbWl0LFxyXG4gICAgc2tpcDogc2tpcFxyXG4gIH07XHJcbiAgY29uc3QgZHJpdmVEZWF0aWxzID0gYXdhaXQgYXhpb3NcclxuICAgIC5wb3N0KGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZ2V0RHJpdmVgLCBkYXRhLCB7XHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgIHNlc3Npb250b2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgLnRoZW4oKExpc3RkYXRhKSA9PiB7XHJcbiAgICAgIGNvbnN0IGpzb24gPSBMaXN0ZGF0YS5kYXRhO1xyXG5cclxuICAgICAgaWYgKGpzb24gJiYganNvbi5yZXN1bHQuZXJyb3IpIHtcclxuICAgICAgICByZXR1cm4ganNvbjtcclxuICAgICAgfSBlbHNlIGlmIChqc29uICYmIGpzb24ucmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGpzb24ucmVzdWx0O1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGdldERyaXZlIGNsb3VkIGZ1bmN0aW9uXCIsIGVycik7XHJcbiAgICAgIHJldHVybiBcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIjtcclxuICAgIH0pO1xyXG5cclxuICByZXR1cm4gZHJpdmVEZWF0aWxzO1xyXG59O1xyXG5cclxuLy8gYHBkZk5ld1dpZHRoRnVuYCBmdW5jdGlvbiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBwZGYgd2lkdGggdG8gcmVuZGVyIGluIG1pZGRsZSBjb250YWluZXJcclxuZXhwb3J0IGNvbnN0IHBkZk5ld1dpZHRoRnVuID0gKGRpdlJlZikgPT4ge1xyXG4gIGNvbnN0IHBkZldpZHRoID0gZGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XHJcbiAgcmV0dXJuIHBkZldpZHRoO1xyXG59O1xyXG5cclxuLy9gY29udHJhY3RVc2Vyc2AgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgY29udHJhY3RfVXNlciBkZXRhaWxzXHJcbmV4cG9ydCBjb25zdCBjb250cmFjdFVzZXJzID0gYXN5bmMgKCkgPT4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCB1c2VyRGV0YWlscyA9IGF3YWl0IFBhcnNlLkNsb3VkLnJ1bihcImdldFVzZXJEZXRhaWxzXCIpO1xyXG4gICAgbGV0IGRhdGEgPSBbXTtcclxuICAgIGlmICh1c2VyRGV0YWlscykge1xyXG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh1c2VyRGV0YWlscykpO1xyXG4gICAgICBkYXRhLnB1c2goanNvbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGdldFVzZXJEZXRhaWxzIGNsb3VkIGZ1bmN0aW9uXCIsIGVycik7XHJcbiAgICByZXR1cm4gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCI7XHJcbiAgfVxyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgcmVzaXplIGltYWdlIGFuZCB1cGRhdGUgd2lkdGggYW5kIGhlaWdodCBmb3IgbXVsaXRpc2lnbmVyc1xyXG5leHBvcnQgY29uc3QgaGFuZGxlSW1hZ2VSZXNpemUgPSAoXHJcbiAgcmVmLFxyXG4gIGtleSxcclxuICBzaWduZXJQb3MsXHJcbiAgc2V0U2lnbmVyUG9zLFxyXG4gIHBhZ2VOdW1iZXIsXHJcbiAgY29udGFpbmVyU2NhbGUsXHJcbiAgc2NhbGUsXHJcbiAgc2lnbmVySWQsXHJcbiAgc2hvd1Jlc2l6ZVxyXG4pID0+IHtcclxuICBjb25zdCBmaWx0ZXJTaWduZXJQb3MgPSBzaWduZXJQb3MuZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSBzaWduZXJJZCk7XHJcbiAgaWYgKGZpbHRlclNpZ25lclBvcy5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCBnZXRQbGFjZUhvbGRlciA9IGZpbHRlclNpZ25lclBvc1swXS5wbGFjZUhvbGRlcjtcclxuICAgIGNvbnN0IGdldFBhZ2VOdW1lciA9IGdldFBsYWNlSG9sZGVyLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlclxyXG4gICAgKTtcclxuICAgIGlmIChnZXRQYWdlTnVtZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBnZXRYWWRhdGEgPSBnZXRQYWdlTnVtZXJbMF0ucG9zO1xyXG4gICAgICBjb25zdCBnZXRQb3NEYXRhID0gZ2V0WFlkYXRhO1xyXG4gICAgICBjb25zdCBhZGRTaWduUG9zID0gZ2V0UG9zRGF0YS5tYXAoKHVybCkgPT4ge1xyXG4gICAgICAgIGlmICh1cmwua2V5ID09PSBrZXkpIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnVybCxcclxuICAgICAgICAgICAgV2lkdGg6IHJlZi5vZmZzZXRXaWR0aCAvIChjb250YWluZXJTY2FsZSAqIHNjYWxlKSxcclxuICAgICAgICAgICAgSGVpZ2h0OiByZWYub2Zmc2V0SGVpZ2h0IC8gKGNvbnRhaW5lclNjYWxlICogc2NhbGUpLFxyXG4gICAgICAgICAgICBJc1Jlc2l6ZTogc2hvd1Jlc2l6ZSA/IHRydWUgOiBmYWxzZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVybDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBuZXdVcGRhdGVTaWduUG9zID0gZ2V0UGxhY2VIb2xkZXIubWFwKChvYmopID0+IHtcclxuICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIpIHtcclxuICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiBhZGRTaWduUG9zIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnbmVyID0gc2lnbmVyUG9zLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKG9iai5JZCA9PT0gc2lnbmVySWQpIHtcclxuICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcGxhY2VIb2xkZXI6IG5ld1VwZGF0ZVNpZ25Qb3MgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzZXRTaWduZXJQb3MobmV3VXBkYXRlU2lnbmVyKTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcbmV4cG9ydCBjb25zdCB3aWRnZXRzID0gW1xyXG4gIHtcclxuICAgIHR5cGU6IFwic2lnbmF0dXJlXCIsXHJcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXBlbi1uaWJcIixcclxuICAgIGljb25TaXplOiBcIjIwcHhcIlxyXG4gIH0sXHJcbiAge1xyXG4gICAgdHlwZTogXCJzdGFtcFwiLFxyXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1zdGFtcFwiLFxyXG4gICAgaWNvblNpemU6IFwiMTlweFwiXHJcbiAgfSxcclxuICB7XHJcbiAgICB0eXBlOiBcImluaXRpYWxzXCIsXHJcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXNpZ25hdHVyZVwiLFxyXG4gICAgaWNvblNpemU6IFwiMTVweFwiXHJcbiAgfSxcclxuICB7XHJcbiAgICB0eXBlOiBcIm5hbWVcIixcclxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtdXNlclwiLFxyXG4gICAgaWNvblNpemU6IFwiMjFweFwiXHJcbiAgfSxcclxuICB7XHJcbiAgICB0eXBlOiBcImpvYiB0aXRsZVwiLFxyXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1hZGRyZXNzLWNhcmRcIixcclxuICAgIGljb25TaXplOiBcIjE3cHhcIlxyXG4gIH0sXHJcbiAge1xyXG4gICAgdHlwZTogXCJjb21wYW55XCIsXHJcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWJ1aWxkaW5nXCIsXHJcbiAgICBpY29uU2l6ZTogXCIyNXB4XCJcclxuICB9LFxyXG4gIHtcclxuICAgIHR5cGU6IFwiZGF0ZVwiLFxyXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1jYWxlbmRhci1kYXlzXCIsXHJcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcclxuICB9LFxyXG4gIHtcclxuICAgIHR5cGU6IHRleHRXaWRnZXQsXHJcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXRleHQtd2lkdGhcIixcclxuICAgIGljb25TaXplOiBcIjIwcHhcIlxyXG4gIH0sXHJcbiAge1xyXG4gICAgdHlwZTogdGV4dElucHV0V2lkZ2V0LFxyXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1mb250XCIsXHJcbiAgICBpY29uU2l6ZTogXCIyMXB4XCJcclxuICB9LFxyXG4gIHtcclxuICAgIHR5cGU6IFwiY2hlY2tib3hcIixcclxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtc3F1YXJlLWNoZWNrXCIsXHJcbiAgICBpY29uU2l6ZTogXCIyMnB4XCJcclxuICB9LFxyXG4gIHtcclxuICAgIHR5cGU6IFwiZHJvcGRvd25cIixcclxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtY2lyY2xlLWNoZXZyb24tZG93blwiLFxyXG4gICAgaWNvblNpemU6IFwiMTlweFwiXHJcbiAgfSxcclxuICB7XHJcbiAgICB0eXBlOiByYWRpb0J1dHRvbldpZGdldCxcclxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtY2lyY2xlLWRvdFwiLFxyXG4gICAgaWNvblNpemU6IFwiMjBweFwiXHJcbiAgfSxcclxuICB7XHJcbiAgICB0eXBlOiBcImltYWdlXCIsXHJcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWltYWdlXCIsXHJcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcclxuICB9LFxyXG4gIHtcclxuICAgIHR5cGU6IFwiZW1haWxcIixcclxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtZW52ZWxvcGVcIixcclxuICAgIGljb25TaXplOiBcIjIwcHhcIlxyXG4gIH1cclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREYXRlID0gKCkgPT4ge1xyXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0VGltZSgpO1xyXG4gIGNvbnN0IG5ld0RhdGUgPSBtb21lbnQobWlsbGlzZWNvbmRzKS5mb3JtYXQoXCJNTS9ERC9ZWVlZXCIpO1xyXG4gIHJldHVybiBuZXdEYXRlO1xyXG59O1xyXG5leHBvcnQgY29uc3QgYWRkV2lkZ2V0T3B0aW9ucyA9ICh0eXBlKSA9PiB7XHJcbiAgY29uc3QgZGVmYXVsdE9wdCA9IHtcclxuICAgIG5hbWU6IHR5cGUsXHJcbiAgICBzdGF0dXM6IFwicmVxdWlyZWRcIlxyXG4gIH07XHJcbiAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICBjYXNlIFwic2lnbmF0dXJlXCI6XHJcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xyXG4gICAgY2FzZSBcInN0YW1wXCI6XHJcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xyXG4gICAgY2FzZSBcImNoZWNrYm94XCI6XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uZGVmYXVsdE9wdCxcclxuICAgICAgICBvcHRpb25zOiB7IGlzUmVhZE9ubHk6IGZhbHNlLCBpc0hpZGVMYWJlbDogZmFsc2UgfVxyXG4gICAgICB9O1xyXG4gICAgY2FzZSB0ZXh0SW5wdXRXaWRnZXQ6XHJcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQgfTtcclxuICAgIGNhc2UgXCJpbml0aWFsc1wiOlxyXG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcclxuICAgIGNhc2UgXCJuYW1lXCI6XHJcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQgfTtcclxuICAgIGNhc2UgXCJjb21wYW55XCI6XHJcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQgfTtcclxuICAgIGNhc2UgXCJqb2IgdGl0bGVcIjpcclxuICAgICAgcmV0dXJuIHsgLi4uZGVmYXVsdE9wdCB9O1xyXG4gICAgY2FzZSBcImRhdGVcIjpcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5kZWZhdWx0T3B0LFxyXG4gICAgICAgIHJlc3BvbnNlOiBnZXREYXRlKCksXHJcbiAgICAgICAgdmFsaWRhdGlvbjogeyBmb3JtYXQ6IFwiTU0vZGQveXl5eVwiLCB0eXBlOiBcImRhdGUtZm9ybWF0XCIgfVxyXG4gICAgICB9O1xyXG4gICAgY2FzZSBcImltYWdlXCI6XHJcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xyXG4gICAgY2FzZSBcImVtYWlsXCI6XHJcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQsIHZhbGlkYXRpb246IHsgdHlwZTogXCJlbWFpbFwiLCBwYXR0ZXJuOiBcIlwiIH0gfTtcclxuICAgIGNhc2UgXCJkcm9wZG93blwiOlxyXG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcclxuICAgIGNhc2UgcmFkaW9CdXR0b25XaWRnZXQ6XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uZGVmYXVsdE9wdCxcclxuICAgICAgICB2YWx1ZXM6IFtdLFxyXG4gICAgICAgIGlzUmVhZE9ubHk6IGZhbHNlLFxyXG4gICAgICAgIGlzSGlkZUxhYmVsOiBmYWxzZVxyXG4gICAgICB9O1xyXG4gICAgY2FzZSB0ZXh0V2lkZ2V0OlxyXG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiB7fTtcclxuICB9XHJcbn07XHJcbmV4cG9ydCBjb25zdCBnZXRXaWRnZXRUeXBlID0gKGl0ZW0sIHdpZGdldE5hbWUpID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJvcC1idG4gdy1maXQgbWQ6dy1bMTAwJV0gb3AtYnRuLXByaW1hcnkgb3AtYnRuLW91dGxpbmUgb3AtYnRuLXNtIGZvY3VzOm91dGxpbmUtbm9uZSBvdXRsaW5lIG91dGxpbmUtWzEuNXB4XSBtbC1bNnB4XSBtZDptbC0wIHAtMCBvdmVyZmxvdy1oaWRkZW5cIj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIGZsZXggbWQ6anVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LXN0YXJ0IGl0ZW1zLWNlbnRlciB0ZXh0LVsxM3B4XSBtbC0xXCI+XHJcbiAgICAgICAgICB7IWlzTW9iaWxlICYmIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWdyaXAtdmVydGljYWwgbWwtWzNweF1cIj48L2k+fVxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWQ6aW5saW5lLWJsb2NrIHRleHQtY2VudGVyIHRleHQtWzE1cHhdIG1sLVs1cHhdIGZvbnQtc2VtaWJvbGQgcHItMSBtZDpwci0wXCI+XHJcbiAgICAgICAgICAgIHt3aWRnZXROYW1lfVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMjBweF0gb3AtYnRuIG9wLWJ0bi1wcmltYXJ5IHJvdW5kZWQtbm9uZSB3LVs0MHB4XSBoLWZ1bGwgZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxpIGNsYXNzTmFtZT17aXRlbS5pY29ufT48L2k+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0V2lkdGhIZWlnaHQgPSAodHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAodHlwZSkge1xyXG4gICAgY2FzZSBcInNpZ25hdHVyZVwiOlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDYwIH07XHJcbiAgICBjYXNlIFwic3RhbXBcIjpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiA2MCB9O1xyXG4gICAgY2FzZSBcImNoZWNrYm94XCI6XHJcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNSwgaGVpZ2h0OiAxNSB9O1xyXG4gICAgY2FzZSB0ZXh0SW5wdXRXaWRnZXQ6XHJcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogMjUgfTtcclxuICAgIGNhc2UgXCJkcm9wZG93blwiOlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTIwLCBoZWlnaHQ6IDIyIH07XHJcbiAgICBjYXNlIFwiaW5pdGlhbHNcIjpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDUwLCBoZWlnaHQ6IDUwIH07XHJcbiAgICBjYXNlIFwibmFtZVwiOlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDI1IH07XHJcbiAgICBjYXNlIFwiY29tcGFueVwiOlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDI1IH07XHJcbiAgICBjYXNlIFwiam9iIHRpdGxlXCI6XHJcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogMjUgfTtcclxuICAgIGNhc2UgXCJkYXRlXCI6XHJcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMjAgfTtcclxuICAgIGNhc2UgXCJpbWFnZVwiOlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogNzAsIGhlaWdodDogNzAgfTtcclxuICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDIwIH07XHJcbiAgICBjYXNlIHJhZGlvQnV0dG9uV2lkZ2V0OlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogNSwgaGVpZ2h0OiAxMCB9O1xyXG4gICAgY2FzZSB0ZXh0V2lkZ2V0OlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDI1IH07XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDYwIH07XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJvcmRlckV4dHJhV2lkdGggPSAoKSA9PiB7XHJcbiAgcmV0dXJuIDIwO1xyXG59O1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhc2U2NEZyb21VcmwodXJsKSB7XHJcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoKHVybCk7XHJcbiAgY29uc3QgYmxvYiA9IGF3YWl0IGRhdGEuYmxvYigpO1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xyXG4gICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgY29uc3QgcGRmQmFzZSA9IHRoaXMucmVzdWx0O1xyXG4gICAgICBjb25zdCBzdWZmaXhiYXNlNjQgPSBwZGZCYXNlLnNwbGl0KFwiLFwiKS5wb3AoKTtcclxuICAgICAgcmVzb2x2ZShzdWZmaXhiYXNlNjQpO1xyXG4gICAgfTtcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhc2U2NEZyb21JTUcodXJsKSB7XHJcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoKHVybCk7XHJcbiAgY29uc3QgYmxvYiA9IGF3YWl0IGRhdGEuYmxvYigpO1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xyXG4gICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgY29uc3QgcGRmQmFzZSA9IHRoaXMucmVzdWx0O1xyXG5cclxuICAgICAgcmVzb2x2ZShwZGZCYXNlKTtcclxuICAgIH07XHJcbiAgfSk7XHJcbn1cclxuLy9mdW5jdGlvbiBmb3IgY29udmVydCBzaWduYXR1cmUgcG5nIGJhc2U2NCB1cmwgdG8ganBlZyBiYXNlNjRcclxuZXhwb3J0IGNvbnN0IGNvbnZlcnRQTkd0b0pQRUcgPSAoYmFzZTY0RGF0YSkgPT4ge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWcuc3JjID0gYmFzZTY0RGF0YTtcclxuXHJcbiAgICBpbWcub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xyXG5cclxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgY3R4LmZpbGxTdHlsZSA9IFwiI2ZmZmZmZlwiOyAvLyB3aGl0ZSBjb2xvclxyXG4gICAgICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xyXG4gICAgICAvLyBDb252ZXJ0IHRvIEpQRUcgYnkgdXNpbmcgdGhlIGNhbnZhcy50b0RhdGFVUkwoKSBtZXRob2RcclxuICAgICAgY29uc3QganBlZ0Jhc2U2NERhdGEgPSBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvanBlZ1wiKTtcclxuXHJcbiAgICAgIHJlc29sdmUoanBlZ0Jhc2U2NERhdGEpO1xyXG4gICAgfTtcclxuXHJcbiAgICBpbWcub25lcnJvciA9IChlcnJvcikgPT4ge1xyXG4gICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgfTtcclxuICB9KTtcclxufTtcclxuXHJcbi8vZnVuY3Rpb24gZm9yIHJlc2l6ZSBpbWFnZSBhbmQgdXBkYXRlIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHNpZ24teW91cnNlbGZcclxuZXhwb3J0IGNvbnN0IGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplID0gKFxyXG4gIHJlZixcclxuICBrZXksXHJcbiAgeHlQb3N0aW9uLFxyXG4gIHNldFh5UG9zdGlvbixcclxuICBpbmRleCxcclxuICBjb250YWluZXJTY2FsZSxcclxuICBzY2FsZVxyXG4pID0+IHtcclxuICBjb25zdCBnZXRYWWRhdGEgPSB4eVBvc3Rpb25baW5kZXhdLnBvcztcclxuICBjb25zdCBnZXRQb3NEYXRhID0gZ2V0WFlkYXRhO1xyXG4gIGNvbnN0IGFkZFNpZ24gPSBnZXRQb3NEYXRhLm1hcCgodXJsKSA9PiB7XHJcbiAgICBpZiAodXJsLmtleSA9PT0ga2V5KSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4udXJsLFxyXG4gICAgICAgIFdpZHRoOiByZWYub2Zmc2V0V2lkdGggLyAoc2NhbGUgKiBjb250YWluZXJTY2FsZSksXHJcbiAgICAgICAgSGVpZ2h0OiByZWYub2Zmc2V0SGVpZ2h0IC8gKHNjYWxlICogY29udGFpbmVyU2NhbGUpLFxyXG4gICAgICAgIElzUmVzaXplOiB0cnVlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXJsO1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBuZXdVcGRhdGVVcmwgPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xyXG4gICAgaWYgKGluZCA9PT0gaW5kZXgpIHtcclxuICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IGFkZFNpZ24gfTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfSk7XHJcbiAgc2V0WHlQb3N0aW9uKG5ld1VwZGF0ZVVybCk7XHJcbn07XHJcblxyXG4vL2Z1bmN0aW9uIGZvciBjYWxsIGNsb3VkIGZ1bmN0aW9uIHNpZ25QZGYgYW5kIGdlbmVyYXRlIGRpZ2l0YWwgc2lnbmF0dXJlXHJcbmV4cG9ydCBjb25zdCBzaWduUGRmRnVuID0gYXN5bmMgKFxyXG4gIGJhc2U2NFVybCxcclxuICBkb2N1bWVudElkLFxyXG4gIHNpZ25lck9iamVjdElkLFxyXG4gIG9iamVjdElkLFxyXG4gIGlzU3Vic2NyaWJlZCxcclxuICBhY3RpdmVNYWlsQWRhcHRlcixcclxuICB3aWRnZXRzXHJcbikgPT4ge1xyXG4gIGxldCBpc0N1c3RvbUNvbXBsZXRpb25NYWlsID0gZmFsc2U7XHJcbiAgdHJ5IHtcclxuICAgIC8vZ2V0IHRlbmFudCBkZXRhaWxzXHJcbiAgICBjb25zdCB0ZW5hbnREZXRhaWxzID0gYXdhaXQgZ2V0VGVuYW50RGV0YWlscyhvYmplY3RJZCk7XHJcbiAgICBpZiAodGVuYW50RGV0YWlscyAmJiB0ZW5hbnREZXRhaWxzID09PSBcInVzZXIgZG9lcyBub3QgZXhpc3QhXCIpIHtcclxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IFwiVXNlciBkb2VzIG5vdCBleGlzdC5cIiB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRlbmFudERldGFpbHM/LkNvbXBsZXRpb25Cb2R5ICYmXHJcbiAgICAgICAgdGVuYW50RGV0YWlscz8uQ29tcGxldGlvblN1YmplY3QgJiZcclxuICAgICAgICBpc1N1YnNjcmliZWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgaXNDdXN0b21Db21wbGV0aW9uTWFpbCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBiZWxvdyBmb3IgbG9vcCBpcyB1c2VkIHRvIGdldCBmaXJzdCBzaWduYXR1cmUgb2YgdXNlciB0byBzZW5kIGlmIHRvIHNpZ25wZGZcclxuICAgIC8vIGZvciBhZGRpbmcgaXQgaW4gY29tcGxldGlvbiBjZXJ0aWZpY2F0ZVxyXG4gICAgbGV0IGdldFNpZ25hdHVyZTtcclxuICAgIGZvciAobGV0IGl0ZW0gb2Ygd2lkZ2V0cykge1xyXG4gICAgICBpZiAoIWdldFNpZ25hdHVyZSkge1xyXG4gICAgICAgIGNvbnN0IHR5cGVFeGlzdCA9IGl0ZW0ucG9zLnNvbWUoKGRhdGEpID0+IGRhdGE/LnR5cGUpO1xyXG4gICAgICAgIGlmICh0eXBlRXhpc3QpIHtcclxuICAgICAgICAgIGdldFNpZ25hdHVyZSA9IGl0ZW0ucG9zLmZpbmQoKGRhdGEpID0+IGRhdGE/LnR5cGUgPT09IFwic2lnbmF0dXJlXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBnZXRTaWduYXR1cmUgPSBpdGVtLnBvcy5maW5kKChkYXRhKSA9PiAhZGF0YS5pc1N0YW1wKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgYmFzZTY0U2lnbiA9IGdldFNpZ25hdHVyZS5TaWduVXJsO1xyXG4gICAgLy9jaGVjayBodHRwcyB0eXBlIHNpZ25hdHVyZSAoZGVmYXVsdCBzaWduYXR1cmUgZXhpc3QpIHRoZW4gY29udmVydCBpbiBiYXNlNjRcclxuICAgIGNvbnN0IGlzVXJsID0gYmFzZTY0U2lnbi5pbmNsdWRlcyhcImh0dHBzXCIpO1xyXG4gICAgaWYgKGlzVXJsKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYmFzZTY0U2lnbiA9IGF3YWl0IGZldGNoSW1hZ2VCYXNlNjQoYmFzZTY0U2lnbik7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGUpO1xyXG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBcInNvbWV0aGluZyB3ZW50IHdyb25nLlwiIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vY2hhbmdlIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgdG8gMTAwLzQwIGluIHBuZyBiYXNlNjRcclxuICAgIGNvbnN0IGdldE5ld3NlNjQgPSBhd2FpdCBjaGFuZ2VJbWFnZVdIKGJhc2U2NFNpZ24pO1xyXG4gICAgLy9yZW1vdmUgc3VmZmlpeCBvZiBiYXNlNjRcclxuICAgIGNvbnN0IHN1ZmZpeGJhc2U2NCA9IGdldE5ld3NlNjQgJiYgZ2V0TmV3c2U2NC5zcGxpdChcIixcIikucG9wKCk7XHJcblxyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICBtYWlsUHJvdmlkZXI6IGFjdGl2ZU1haWxBZGFwdGVyLFxyXG4gICAgICBwZGZGaWxlOiBiYXNlNjRVcmwsXHJcbiAgICAgIGRvY0lkOiBkb2N1bWVudElkLFxyXG4gICAgICB1c2VySWQ6IHNpZ25lck9iamVjdElkLFxyXG4gICAgICBpc0N1c3RvbUNvbXBsZXRpb25NYWlsOiBpc0N1c3RvbUNvbXBsZXRpb25NYWlsLFxyXG4gICAgICBzaWduYXR1cmU6IHN1ZmZpeGJhc2U2NFxyXG4gICAgfTtcclxuICAgIGNvbnN0IHJlc1NpZ25QZGYgPSBhd2FpdCBQYXJzZS5DbG91ZC5ydW4oXCJzaWduUGRmXCIsIHBhcmFtcyk7XHJcbiAgICBpZiAocmVzU2lnblBkZikge1xyXG4gICAgICBjb25zdCBzaWduZWRQZGYgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc1NpZ25QZGYpKTtcclxuICAgICAgcmV0dXJuIHNpZ25lZFBkZjtcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIkVyciBpbiBzaWduUGRmIGNsb3VkIGZ1bmN0aW9uIFwiLCBlLm1lc3NhZ2UpO1xyXG4gICAgaWYgKGUgJiYgZT8ubWVzc2FnZT8uaW5jbHVkZXMoXCJpcyBlbmNyeXB0ZWQuXCIpKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXHJcbiAgICAgICAgbWVzc2FnZTogXCJDdXJyZW50bHkgZW5jcnlwdGVkIHBkZiBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZC5cIlxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgZS5tZXNzYWdlID09PSBcIlBLQ1MjMTIgTUFDIGNvdWxkIG5vdCBiZSB2ZXJpZmllZC4gSW52YWxpZCBwYXNzd29yZD9cIlxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBcIlBGWCBmaWxlIHBhc3N3b3JkIGlzIGludmFsaWQuXCIgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBcInNvbWV0aGluZyB3ZW50IHdyb25nLlwiIH07XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHJhbmRvbUlkID0gKCkgPT4ge1xyXG4gIGNvbnN0IHJhbmRvbUJ5dGVzID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDE2QXJyYXkoMSkpO1xyXG4gIGNvbnN0IHJhbmRvbVZhbHVlID0gcmFuZG9tQnl0ZXNbMF07XHJcbiAgY29uc3QgcmFuZG9tRGlnaXQgPSAxMDAwICsgKHJhbmRvbVZhbHVlICUgOTAwMCk7XHJcbiAgcmV0dXJuIHJhbmRvbURpZ2l0O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGNyZWF0ZURvY3VtZW50ID0gYXN5bmMgKHRlbXBsYXRlLCBwbGFjZWhvbGRlcnMsIHNpZ25lckRhdGEpID0+IHtcclxuICBpZiAodGVtcGxhdGUgJiYgdGVtcGxhdGUubGVuZ3RoID4gMCkge1xyXG4gICAgY29uc3QgRG9jID0gdGVtcGxhdGVbMF07XHJcblxyXG4gICAgbGV0IHBsYWNlaG9sZGVyc0FyciA9IFtdO1xyXG4gICAgaWYgKHBsYWNlaG9sZGVycz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBwbGFjZWhvbGRlcnNBcnIgPSBwbGFjZWhvbGRlcnM7XHJcbiAgICB9XHJcbiAgICBsZXQgc2lnbmVycyA9IFtdO1xyXG4gICAgaWYgKHNpZ25lckRhdGE/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgc2lnbmVyRGF0YS5mb3JFYWNoKCh4KSA9PiB7XHJcbiAgICAgICAgaWYgKHgub2JqZWN0SWQpIHtcclxuICAgICAgICAgIGNvbnN0IG9iaiA9IHtcclxuICAgICAgICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcclxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImNvbnRyYWN0c19Db250YWN0Ym9va1wiLFxyXG4gICAgICAgICAgICBvYmplY3RJZDogeC5vYmplY3RJZFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHNpZ25lcnMucHVzaChvYmopO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBOYW1lOiBEb2MuTmFtZSxcclxuICAgICAgVVJMOiBEb2MuVVJMLFxyXG4gICAgICBTaWduZWRVcmw6IERvYy5TaWduZWRVcmwsXHJcbiAgICAgIFNlbnRUb090aGVyczogRG9jLlNlbnRUb090aGVycyxcclxuICAgICAgRGVzY3JpcHRpb246IERvYy5EZXNjcmlwdGlvbixcclxuICAgICAgTm90ZTogRG9jLk5vdGUsXHJcbiAgICAgIFBsYWNlaG9sZGVyczogcGxhY2Vob2xkZXJzQXJyLFxyXG4gICAgICBFeHRVc2VyUHRyOiB7XHJcbiAgICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcclxuICAgICAgICBjbGFzc05hbWU6IFwiY29udHJhY3RzX1VzZXJzXCIsXHJcbiAgICAgICAgb2JqZWN0SWQ6IERvYy5FeHRVc2VyUHRyLm9iamVjdElkXHJcbiAgICAgIH0sXHJcbiAgICAgIENyZWF0ZWRCeToge1xyXG4gICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXHJcbiAgICAgICAgY2xhc3NOYW1lOiBcIl9Vc2VyXCIsXHJcbiAgICAgICAgb2JqZWN0SWQ6IERvYy5DcmVhdGVkQnkub2JqZWN0SWRcclxuICAgICAgfSxcclxuICAgICAgU2lnbmVyczogc2lnbmVycyxcclxuICAgICAgU2VuZGluT3JkZXI6IERvYz8uU2VuZGluT3JkZXIgfHwgZmFsc2UsXHJcbiAgICAgIEF1dG9tYXRpY1JlbWluZGVyczogRG9jPy5BdXRvbWF0aWNSZW1pbmRlcnMgfHwgZmFsc2UsXHJcbiAgICAgIFJlbWluZE9uY2VJbkV2ZXJ5OiBwYXJzZUludChEb2M/LlJlbWluZE9uY2VJbkV2ZXJ5IHx8IDUpXHJcbiAgICB9O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfWNsYXNzZXMvY29udHJhY3RzX0RvY3VtZW50YCxcclxuICAgICAgICBkYXRhLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXHJcbiAgICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwic3VjY2Vzc1wiLCBpZDogcmVzLmRhdGEub2JqZWN0SWQgfTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiYXhvaXMgZXJyIFwiLCBlcnIpO1xyXG4gICAgICByZXR1cm4geyBzdGF0dXM6IFwiZXJyb3JcIiwgaWQ6IFwiU29tZXRoaW5nIFdlbnQgV3JvbmchXCIgfTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RMZXR0ZXIgPSAobmFtZSkgPT4ge1xyXG4gIGNvbnN0IGZpcnN0TGV0dGVyID0gbmFtZT8uY2hhckF0KDApO1xyXG4gIHJldHVybiBmaXJzdExldHRlcjtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkYXJrZW5Db2xvciA9IChjb2xvciwgZmFjdG9yKSA9PiB7XHJcbiAgLy8gUmVtb3ZlICcjJyBmcm9tIHRoZSBjb2xvciBjb2RlIGFuZCBwYXJzZSBpdCB0byBnZXQgUkdCIHZhbHVlc1xyXG4gIGNvbnN0IGhleCA9IGNvbG9yLnJlcGxhY2UoXCIjXCIsIFwiXCIpO1xyXG4gIGNvbnN0IHIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDAsIDIpLCAxNik7XHJcbiAgY29uc3QgZyA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMiwgNCksIDE2KTtcclxuICBjb25zdCBiID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xyXG5cclxuICAvLyBEYXJrZW4gdGhlIGNvbG9yIGJ5IHJlZHVjaW5nIGVhY2ggUkdCIGNvbXBvbmVudFxyXG4gIGNvbnN0IGRhcmtlclIgPSBNYXRoLmZsb29yKHIgKiAoMSAtIGZhY3RvcikpO1xyXG4gIGNvbnN0IGRhcmtlckcgPSBNYXRoLmZsb29yKGcgKiAoMSAtIGZhY3RvcikpO1xyXG4gIGNvbnN0IGRhcmtlckIgPSBNYXRoLmZsb29yKGIgKiAoMSAtIGZhY3RvcikpO1xyXG5cclxuICAvLyBDb252ZXJ0IHRoZSBkYXJrZW5lZCBSR0IgY29tcG9uZW50cyBiYWNrIHRvIGhleFxyXG4gIHJldHVybiBgIyR7KChkYXJrZXJSIDw8IDE2KSB8IChkYXJrZXJHIDw8IDgpIHwgZGFya2VyQilcclxuICAgIC50b1N0cmluZygxNilcclxuICAgIC5wYWRTdGFydCg2LCBcIjBcIil9YDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBhZGRaSW5kZXggPSAoc2lnbmVyUG9zLCBrZXksIHNldFpJbmRleCkgPT4ge1xyXG4gIHJldHVybiBzaWduZXJQb3MubWFwKChpdGVtKSA9PiB7XHJcbiAgICBpZiAoaXRlbS5wbGFjZUhvbGRlciAmJiBpdGVtLnBsYWNlSG9sZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXN0ZWQgYXJyYXksIHJlY3Vyc2l2ZWx5IGFkZCB0aGUgZmllbGQgdG8gdGhlIGxhc3Qgb2JqZWN0XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICBwbGFjZUhvbGRlcjogYWRkWkluZGV4KGl0ZW0ucGxhY2VIb2xkZXIsIGtleSwgc2V0WkluZGV4KVxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLnBvcyAmJiBpdGVtLnBvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG5lc3RlZCBhcnJheSwgYWRkIHRoZSBuZXcgZmllbGRcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgIHBvczogYWRkWkluZGV4KGl0ZW0ucG9zLCBrZXksIHNldFpJbmRleClcclxuICAgICAgICAvLyBBZGp1c3QgdGhpcyBsaW5lIHRvIGFkZCB0aGUgZGVzaXJlZCBmaWVsZFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGl0ZW0ua2V5ID09PSBrZXkpIHtcclxuICAgICAgICBzZXRaSW5kZXgoaXRlbS56SW5kZXgpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgekluZGV4OiBpdGVtLnpJbmRleCA/IGl0ZW0uekluZGV4ICsgMSA6IDFcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5pdGVtXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3Igc2F2ZSB3aWRnZXRzIHZhbHVlIG9uIG9uY2hhbmdlIGZ1bmN0aW9uXHJcbmV4cG9ydCBjb25zdCBvbkNoYW5nZUlucHV0ID0gKFxyXG4gIHZhbHVlLFxyXG4gIHNpZ25LZXksXHJcbiAgeHlQb3N0aW9uLFxyXG4gIGluZGV4LFxyXG4gIHNldFh5UG9zdGlvbixcclxuICB1c2VySWQsXHJcbiAgaW5pdGlhbCxcclxuICBkYXRlRm9ybWF0LFxyXG4gIGlzRGVmYXVsdEVtcHR5LFxyXG4gIGlzUmFkaW9cclxuKSA9PiB7XHJcbiAgY29uc3QgaXNTaWduZXJzID0geHlQb3N0aW9uLnNvbWUoKGRhdGEpID0+IGRhdGEuc2lnbmVyUHRyKTtcclxuICBsZXQgZmlsdGVyU2lnbmVyUG9zO1xyXG4gIGlmIChpc1NpZ25lcnMpIHtcclxuICAgIGlmICh1c2VySWQpIHtcclxuICAgICAgZmlsdGVyU2lnbmVyUG9zID0geHlQb3N0aW9uLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5JZCA9PT0gdXNlcklkKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGdldFBsYWNlSG9sZGVyID0gZmlsdGVyU2lnbmVyUG9zWzBdPy5wbGFjZUhvbGRlcjtcclxuICAgIGlmIChpbml0aWFsKSB7XHJcbiAgICAgIGNvbnN0IHh5RGF0YSA9IGFkZEluaXRpYWxEYXRhKHh5UG9zdGlvbiwgc2V0WHlQb3N0aW9uLCB2YWx1ZSwgdXNlcklkKTtcclxuICAgICAgc2V0WHlQb3N0aW9uKHh5RGF0YSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBnZXRQYWdlTnVtZXIgPSBnZXRQbGFjZUhvbGRlci5maWx0ZXIoXHJcbiAgICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gaW5kZXhcclxuICAgICAgKTtcclxuICAgICAgaWYgKGdldFBhZ2VOdW1lci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgZ2V0WFlkYXRhID0gZ2V0UGFnZU51bWVyWzBdLnBvcztcclxuICAgICAgICBjb25zdCBnZXRQb3NEYXRhID0gZ2V0WFlkYXRhO1xyXG4gICAgICAgIGNvbnN0IGFkZFNpZ25Qb3MgPSBnZXRQb3NEYXRhLm1hcCgocG9zaXRpb24pID0+IHtcclxuICAgICAgICAgIGlmIChwb3NpdGlvbi5rZXkgPT09IHNpZ25LZXkpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZS1mb3JtYXRcIixcclxuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IGRhdGVGb3JtYXQgLy8gVGhpcyBpbmRpY2F0ZXMgdGhlIHJlcXVpcmVkIGRhdGUgZm9ybWF0IGV4cGxpY2l0bHkuXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRGVmYXVsdEVtcHR5KSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogdmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogaXNSYWRpbyA/IFwiXCIgOiBbXVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogdmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbmV3VXBkYXRlU2lnblBvcyA9IGdldFBsYWNlSG9sZGVyLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiBhZGRTaWduUG9zIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBuZXdVcGRhdGVTaWduZXIgPSB4eVBvc3Rpb24ubWFwKChvYmopID0+IHtcclxuICAgICAgICAgIGlmIChvYmouSWQgPT09IHVzZXJJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBuZXdVcGRhdGVTaWduUG9zIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzZXRYeVBvc3Rpb24obmV3VXBkYXRlU2lnbmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSBnZXRYWWRhdGEubWFwKChwb3NpdGlvbkRhdGEpID0+IHtcclxuICAgICAgaWYgKHBvc2l0aW9uRGF0YS5rZXkgPT09IHNpZ25LZXkpIHtcclxuICAgICAgICBpZiAoZGF0ZUZvcm1hdCkge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4ucG9zaXRpb25EYXRhLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgLi4ucG9zaXRpb25EYXRhLm9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHZhbHVlLFxyXG4gICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZS1mb3JtYXRcIixcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogZGF0ZUZvcm1hdCAvLyBUaGlzIGluZGljYXRlcyB0aGUgcmVxdWlyZWQgZGF0ZSBmb3JtYXQgZXhwbGljaXRseS5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uRGF0YSxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIC4uLnBvc2l0aW9uRGF0YS5vcHRpb25zLFxyXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcG9zaXRpb25EYXRhO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlUGxhY2Vob2xkZXIgPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xyXG4gICAgICBpZiAoaW5kID09PSBpbmRleCkge1xyXG4gICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiB1cGRhdGVQb3NpdGlvbiB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9KTtcclxuICAgIHNldFh5UG9zdGlvbih1cGRhdGVQbGFjZWhvbGRlcik7XHJcbiAgfVxyXG59O1xyXG5cclxuLy9mdW5jdGlvbiB0byBpbmNyZWFzZSBoZWlnaHQgb2YgdGV4dCBhcmVhIG9uIHByZXNzIGVudGVyXHJcbmV4cG9ydCBjb25zdCBvbkNoYW5nZUhlaWdodE9mVGV4dEFyZWEgPSAoXHJcbiAgaGVpZ2h0LFxyXG4gIHdpZGdldFR5cGUsXHJcbiAgc2lnbktleSxcclxuICB4eVBvc3Rpb24sXHJcbiAgaW5kZXgsXHJcbiAgc2V0WHlQb3N0aW9uLFxyXG4gIHVzZXJJZFxyXG4pID0+IHtcclxuICBjb25zdCBpc1NpZ25lcnMgPSB4eVBvc3Rpb24uc29tZSgoZGF0YSkgPT4gZGF0YS5zaWduZXJQdHIpO1xyXG4gIGxldCBmaWx0ZXJTaWduZXJQb3M7XHJcbiAgaWYgKGlzU2lnbmVycykge1xyXG4gICAgaWYgKHVzZXJJZCkge1xyXG4gICAgICBmaWx0ZXJTaWduZXJQb3MgPSB4eVBvc3Rpb24uZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSB1c2VySWQpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZ2V0UGxhY2VIb2xkZXIgPSBmaWx0ZXJTaWduZXJQb3NbMF0/LnBsYWNlSG9sZGVyO1xyXG5cclxuICAgIGNvbnN0IGdldFBhZ2VOdW1lciA9IGdldFBsYWNlSG9sZGVyLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gaW5kZXhcclxuICAgICk7XHJcbiAgICBpZiAoZ2V0UGFnZU51bWVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZ2V0WFlkYXRhID0gZ2V0UGFnZU51bWVyWzBdLnBvcztcclxuICAgICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcclxuICAgICAgY29uc3QgYWRkU2lnblBvcyA9IGdldFBvc0RhdGEubWFwKChwb3NpdGlvbikgPT4ge1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi5rZXkgPT09IHNpZ25LZXkpIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgICBIZWlnaHQ6IHBvc2l0aW9uLkhlaWdodFxyXG4gICAgICAgICAgICAgID8gcG9zaXRpb24uSGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgICAgICAgICAgOiBkZWZhdWx0V2lkdGhIZWlnaHQod2lkZ2V0VHlwZSkuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBuZXdVcGRhdGVTaWduUG9zID0gZ2V0UGxhY2VIb2xkZXIubWFwKChvYmopID0+IHtcclxuICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogYWRkU2lnblBvcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25lciA9IHh5UG9zdGlvbi5tYXAoKG9iaikgPT4ge1xyXG4gICAgICAgIGlmIChvYmouSWQgPT09IHVzZXJJZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwbGFjZUhvbGRlcjogbmV3VXBkYXRlU2lnblBvcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHNldFh5UG9zdGlvbihuZXdVcGRhdGVTaWduZXIpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSBnZXRYWWRhdGEubWFwKChwb3NpdGlvbikgPT4ge1xyXG4gICAgICBpZiAocG9zaXRpb24ua2V5ID09PSBzaWduS2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgSGVpZ2h0OiBwb3NpdGlvbi5IZWlnaHRcclxuICAgICAgICAgICAgPyBwb3NpdGlvbi5IZWlnaHQgKyBoZWlnaHRcclxuICAgICAgICAgICAgOiBkZWZhdWx0V2lkdGhIZWlnaHQod2lkZ2V0VHlwZSkuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVQbGFjZWhvbGRlciA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XHJcbiAgICAgIGlmIChpbmQgPT09IGluZGV4KSB7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IHVwZGF0ZVBvc2l0aW9uIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG9iajtcclxuICAgIH0pO1xyXG4gICAgc2V0WHlQb3N0aW9uKHVwZGF0ZVBsYWNlaG9sZGVyKTtcclxuICB9XHJcbn07XHJcbi8vY2FsY3VsYXRlIHdpZHRoIGFuZCBoZWlnaHRcclxuZXhwb3J0IGNvbnN0IGNhbGN1bGF0ZUluaXRpYWxXaWR0aEhlaWdodCA9ICh3aWRnZXREYXRhKSA9PiB7XHJcbiAgY29uc3QgaW50aWFsVGV4dCA9IHdpZGdldERhdGE7XHJcbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gIHNwYW4udGV4dENvbnRlbnQgPSBpbnRpYWxUZXh0O1xyXG4gIHNwYW4uc3R5bGUuZm9udCA9IGAxNHB4YDsgLy8gaGVyZSBwdXQgeW91ciB0ZXh0IHNpemUgYW5kIGZvbnQgZmFtaWx5XHJcbiAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJoaWRkZW5cIjtcclxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xyXG4gIGNvbnN0IHdpZHRoID0gc3Bhbi5vZmZzZXRXaWR0aDtcclxuICBjb25zdCBoZWlnaHQgPSBzcGFuLm9mZnNldEhlaWdodDtcclxuXHJcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcclxuICByZXR1cm4ge1xyXG4gICAgZ2V0V2lkdGg6IHdpZHRoLFxyXG4gICAgZ2V0SGVpZ2h0OiBoZWlnaHRcclxuICB9O1xyXG59O1xyXG5leHBvcnQgY29uc3QgYWRkSW5pdGlhbERhdGEgPSAoc2lnbmVyUG9zLCBzZXRYeVBvc3Rpb24sIHZhbHVlLCB1c2VySWQpID0+IHtcclxuICBmdW5jdGlvbiB3aWRnZXREYXRhVmFsdWUodHlwZSkge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgXCJuYW1lXCI6XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlPy5OYW1lO1xyXG4gICAgICBjYXNlIFwiY29tcGFueVwiOlxyXG4gICAgICAgIHJldHVybiB2YWx1ZT8uQ29tcGFueTtcclxuICAgICAgY2FzZSBcImpvYiB0aXRsZVwiOlxyXG4gICAgICAgIHJldHVybiB2YWx1ZT8uSm9iVGl0bGU7XHJcbiAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgIHJldHVybiB2YWx1ZT8uRW1haWw7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBzaWduZXJQb3MubWFwKChpdGVtKSA9PiB7XHJcbiAgICBpZiAoaXRlbS5wbGFjZUhvbGRlciAmJiBpdGVtLnBsYWNlSG9sZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXN0ZWQgYXJyYXksIHJlY3Vyc2l2ZWx5IGFkZCB0aGUgZmllbGQgdG8gdGhlIGxhc3Qgb2JqZWN0XHJcbiAgICAgIGlmIChpdGVtLklkID09PSB1c2VySWQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgIHBsYWNlSG9sZGVyOiBhZGRJbml0aWFsRGF0YShcclxuICAgICAgICAgICAgaXRlbS5wbGFjZUhvbGRlcixcclxuICAgICAgICAgICAgc2V0WHlQb3N0aW9uLFxyXG4gICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgdXNlcklkXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uaXRlbVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoaXRlbS5wb3MgJiYgaXRlbS5wb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyBuZXN0ZWQgYXJyYXksIGFkZCB0aGUgbmV3IGZpZWxkXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICBwb3M6IGFkZEluaXRpYWxEYXRhKGl0ZW0ucG9zLCBzZXRYeVBvc3Rpb24sIHZhbHVlLCB1c2VySWQpXHJcbiAgICAgICAgLy8gQWRqdXN0IHRoaXMgbGluZSB0byBhZGQgdGhlIGRlc2lyZWQgZmllbGRcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHdpZGdldERhdGEgPSB3aWRnZXREYXRhVmFsdWUoaXRlbS50eXBlKTtcclxuICAgICAgaWYgKFtcIm5hbWVcIiwgXCJjb21wYW55XCIsIFwiam9iIHRpdGxlXCIsIFwiZW1haWxcIl0uaW5jbHVkZXMoaXRlbS50eXBlKSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAuLi5pdGVtLm9wdGlvbnMsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogd2lkZ2V0RGF0YVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gV2lkdGg6XHJcbiAgICAgICAgICAvLyAgIGNhbGN1bGF0ZUluaXRpYWxXaWR0aEhlaWdodChpdGVtLnR5cGUsIHdpZGdldERhdGEpLmdldFdpZHRoIHx8XHJcbiAgICAgICAgICAvLyAgIGl0ZW0/LldpZHRoLFxyXG4gICAgICAgICAgLy8gSGVpZ2h0OlxyXG4gICAgICAgICAgLy8gICBjYWxjdWxhdGVJbml0aWFsV2lkdGhIZWlnaHQoaXRlbS50eXBlLCB3aWRnZXREYXRhKS5nZXRIZWlnaHQgfHxcclxuICAgICAgICAgIC8vICAgaXRlbT8uSGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uaXRlbVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxufTtcclxuXHJcbi8vZnVuY3Rpb24gZm9yIGVtYmVkIGRvY3VtZW50IGlkXHJcbmV4cG9ydCBjb25zdCBlbWJlZERvY0lkID0gYXN5bmMgKHBkZkRvYywgZG9jdW1lbnRJZCwgYWxsUGFnZXMpID0+IHtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFBhZ2VzOyBpKyspIHtcclxuICAgIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFwiSGVsdmV0aWNhXCIpO1xyXG4gICAgY29uc3QgZm9udFNpemUgPSAxMDtcclxuICAgIGNvbnN0IHRleHRDb250ZW50ID0gZG9jdW1lbnRJZCAmJiBgT3BlblNpZ27ihKIgRG9jdW1lbnRJZDogJHtkb2N1bWVudElkfSBgO1xyXG4gICAgY29uc3QgcGFnZXMgPSBwZGZEb2MuZ2V0UGFnZXMoKTtcclxuICAgIGNvbnN0IHBhZ2UgPSBwYWdlc1tpXTtcclxuICAgIHBhZ2UuZHJhd1RleHQodGV4dENvbnRlbnQsIHtcclxuICAgICAgeDogMTAsXHJcbiAgICAgIHk6IHBhZ2UuZ2V0SGVpZ2h0KCkgLSAxMCxcclxuICAgICAgc2l6ZTogZm9udFNpemUsXHJcbiAgICAgIGZvbnQsXHJcbiAgICAgIGNvbG9yOiByZ2IoMC41LCAwLjUsIDAuNSlcclxuICAgIH0pO1xyXG4gIH1cclxufTtcclxuXHJcbi8vZnVuY3Rpb24gZm9yIHNhdmUgYnV0dG9uIHRvIHNhdmUgc2lnbmF0dXJlIG9yIGltYWdlIHVybFxyXG5leHBvcnQgZnVuY3Rpb24gb25TYXZlU2lnbihcclxuICB0eXBlLFxyXG4gIHh5UG9zdGlvbixcclxuICBpbmRleCxcclxuICBzaWduS2V5LFxyXG4gIHNpZ25hdHVyZUltZyxcclxuICBpbWdXSCxcclxuICBpc0RlZmF1bHRTaWduLFxyXG4gIGlzVHlwZVRleHRcclxuKSB7XHJcbiAgbGV0IGdldElNR1dIO1xyXG4gIGxldCBnZXRYWWRhdGEgPSB4eVBvc3Rpb25baW5kZXhdLnBvcztcclxuICBjb25zdCB1cGRhdGVYWURhdGEgPSBnZXRYWWRhdGEubWFwKChwb3NpdGlvbikgPT4ge1xyXG4gICAgaWYgKHBvc2l0aW9uLmtleSA9PT0gc2lnbktleSkge1xyXG4gICAgICBpZiAoaXNEZWZhdWx0U2lnbiA9PT0gXCJpbml0aWFsc1wiKSB7XHJcbiAgICAgICAgbGV0IGltZ1dIID0geyB3aWR0aDogcG9zaXRpb24uV2lkdGgsIGhlaWdodDogcG9zaXRpb24uSGVpZ2h0IH07XHJcbiAgICAgICAgZ2V0SU1HV0ggPSBjYWxjdWxhdGVJbWdBc3BlY3RSYXRpbyhpbWdXSCwgcG9zaXRpb24pO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzRGVmYXVsdFNpZ24gPT09IFwiZGVmYXVsdFwiKSB7XHJcbiAgICAgICAgZ2V0SU1HV0ggPSBjYWxjdWxhdGVJbWdBc3BlY3RSYXRpbyhpbWdXSCwgcG9zaXRpb24pO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzVHlwZVRleHQpIHtcclxuICAgICAgICBnZXRJTUdXSCA9IHsgbmV3V2lkdGg6IGltZ1dILndpZHRoLCBuZXdIZWlnaHQ6IGltZ1dILmhlaWdodCB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGRlZmF1bHRXaWR0aEhlaWdodChwb3NpdGlvbj8udHlwZSkud2lkdGg7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdEhlaWdodCA9IGRlZmF1bHRXaWR0aEhlaWdodChwb3NpdGlvbj8udHlwZSkuaGVpZ2h0O1xyXG5cclxuICAgICAgICBnZXRJTUdXSCA9IGNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvKFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB3aWR0aDogZGVmYXVsdFdpZHRoID8gZGVmYXVsdFdpZHRoIDogMTUwLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGRlZmF1bHRIZWlnaHQgPyBkZWZhdWx0SGVpZ2h0IDogNjBcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwb3NpdGlvblxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBvc1dpZHRoID0gZ2V0SU1HV0ggPyBnZXRJTUdXSC5uZXdXaWR0aCA6IDE1MDtcclxuICAgICAgY29uc3QgcG9zSGVpZ2h0ID0gZ2V0SU1HV0ggPyBnZXRJTUdXSC5uZXdIZWlnaHQgOiA2MDtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4ucG9zaXRpb24sXHJcbiAgICAgICAgV2lkdGg6IHBvc1dpZHRoLFxyXG4gICAgICAgIEhlaWdodDogcG9zSGVpZ2h0LFxyXG4gICAgICAgIFNpZ25Vcmw6IHNpZ25hdHVyZUltZyxcclxuICAgICAgICBzaWduYXR1cmVUeXBlOiB0eXBlICYmIHR5cGUsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcclxuICAgICAgICAgIHJlc3BvbnNlOiBzaWduYXR1cmVJbWdcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHVwZGF0ZVhZcG9zaXRpb24gPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xyXG4gICAgaWYgKGluZCA9PT0gaW5kZXgpIHtcclxuICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IHVwZGF0ZVhZRGF0YSB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9KTtcclxuICByZXR1cm4gdXBkYXRlWFlwb3NpdGlvbjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvID0gKGltZ1dILCBwb3MpID0+IHtcclxuICBsZXQgbmV3V2lkdGgsIG5ld0hlaWdodDtcclxuXHJcbiAgY29uc3QgcGxhY2Vob2xkZXJIZWlnaHQgPSBwb3MgJiYgcG9zLkhlaWdodCA/IHBvcy5IZWlnaHQgOiA2MDtcclxuICBjb25zdCBhc3BlY3RSYXRpbyA9IGltZ1dILndpZHRoIC8gaW1nV0guaGVpZ2h0O1xyXG4gIG5ld1dpZHRoID0gYXNwZWN0UmF0aW8gKiBwbGFjZWhvbGRlckhlaWdodDtcclxuICBuZXdIZWlnaHQgPSBwbGFjZWhvbGRlckhlaWdodDtcclxuXHJcbiAgcmV0dXJuIHsgbmV3SGVpZ2h0LCBuZXdXaWR0aCB9O1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgdXBsb2FkIHN0YW1wIG9yIGltYWdlXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNhdmVJbWFnZSh4eVBvc3Rpb24sIGluZGV4LCBzaWduS2V5LCBpbWdXSCwgaW1hZ2UpIHtcclxuICBsZXQgZ2V0SU1HV0g7XHJcblxyXG4gIC8vZ2V0IGN1cnJlbnQgcGFnZSBwb3NpdGlvblxyXG4gIGNvbnN0IGdldFhZRGF0YSA9IHh5UG9zdGlvbltpbmRleF0ucG9zO1xyXG4gIGNvbnN0IHVwZGF0ZVhZRGF0YSA9IGdldFhZRGF0YS5tYXAoKHBvc2l0aW9uKSA9PiB7XHJcbiAgICBpZiAocG9zaXRpb24ua2V5ID09PSBzaWduS2V5KSB7XHJcbiAgICAgIGdldElNR1dIID0gY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8oaW1nV0gsIHBvc2l0aW9uKTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4ucG9zaXRpb24sXHJcbiAgICAgICAgV2lkdGg6IGdldElNR1dILm5ld1dpZHRoLFxyXG4gICAgICAgIEhlaWdodDogZ2V0SU1HV0gubmV3SGVpZ2h0LFxyXG4gICAgICAgIFNpZ25Vcmw6IGltYWdlLnNyYyxcclxuICAgICAgICBJbWFnZVR5cGU6IGltYWdlLmltZ1R5cGUsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcclxuICAgICAgICAgIHJlc3BvbnNlOiBpbWFnZS5zcmNcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHVwZGF0ZVhZcG9zaXRpb24gPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xyXG4gICAgaWYgKGluZCA9PT0gaW5kZXgpIHtcclxuICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IHVwZGF0ZVhZRGF0YSB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9KTtcclxuICByZXR1cm4gdXBkYXRlWFlwb3NpdGlvbjtcclxufVxyXG5cclxuLy9mdW5jdGlvbiBmb3Igc2VsZWN0IGltYWdlIGFuZCB1cGxvYWQgaW1hZ2VcclxuZXhwb3J0IGNvbnN0IG9uSW1hZ2VTZWxlY3QgPSAoZXZlbnQsIHNldEltZ1dILCBzZXRJbWFnZSkgPT4ge1xyXG4gIGNvbnN0IGltYWdlVHlwZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXS50eXBlO1xyXG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZXZlbnQudGFyZ2V0LmZpbGVzWzBdKTtcclxuICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKGUpIHtcclxuICAgIGxldCB3aWR0aCwgaGVpZ2h0O1xyXG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICBpbWFnZS5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHdpZHRoID0gaW1hZ2Uud2lkdGg7XHJcbiAgICAgIGhlaWdodCA9IGltYWdlLmhlaWdodDtcclxuICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPSA0NjAgLyAxODQ7XHJcbiAgICAgIGNvbnN0IGltZ1IgPSB3aWR0aCAvIGhlaWdodDtcclxuXHJcbiAgICAgIGlmIChpbWdSID4gYXNwZWN0UmF0aW8pIHtcclxuICAgICAgICB3aWR0aCA9IDQ2MDtcclxuICAgICAgICBoZWlnaHQgPSA0NjAgLyBpbWdSO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHdpZHRoID0gMTg0ICogaW1nUjtcclxuICAgICAgICBoZWlnaHQgPSAxODQ7XHJcbiAgICAgIH1cclxuICAgICAgc2V0SW1nV0goeyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBpbWFnZS5zcmMgPSByZWFkZXIucmVzdWx0O1xyXG5cclxuICAgIHNldEltYWdlKHsgc3JjOiBpbWFnZS5zcmMsIGltZ1R5cGU6IGltYWdlVHlwZSB9KTtcclxuICB9O1xyXG59O1xyXG4vL2NvbnZlcnQgaHR0cHMgdXJsIHRvIGJhc2U2NFxyXG5leHBvcnQgY29uc3QgZmV0Y2hJbWFnZUJhc2U2NCA9IGFzeW5jIChpbWFnZVVybCkgPT4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGltYWdlVXJsKTtcclxuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XHJcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYmFzZTY0ZGF0YSA9IHJlYWRlci5yZXN1bHQ7XHJcbiAgICAgICAgcmVzb2x2ZShiYXNlNjRkYXRhKTtcclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcclxuICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGNvbnZlcnRpbmcgVVJMIHRvIGJhc2U2NDpcIiwgZXJyb3IpO1xyXG4gIH1cclxufTtcclxuLy9mdW5jdGlvbiBmb3Igc2VsZWN0IGltYWdlIGFuZCB1cGxvYWQgaW1hZ2VcclxuZXhwb3J0IGNvbnN0IGNoYW5nZUltYWdlV0ggPSBhc3luYyAoYmFzZTY0SW1hZ2UpID0+IHtcclxuICBjb25zdCBuZXdXaWR0aCA9IDEwMDtcclxuICBjb25zdCBuZXdIZWlnaHQgPSA0MDtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWcuc3JjID0gYmFzZTY0SW1hZ2U7XHJcbiAgICBpbWcub25sb2FkID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICBjYW52YXMud2lkdGggPSBuZXdXaWR0aDtcclxuICAgICAgY2FudmFzLmhlaWdodCA9IG5ld0hlaWdodDtcclxuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xyXG4gICAgICBjb25zdCByZXNpemVkQmFzZTY0ID0gY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiLCAxLjApO1xyXG4gICAgICByZXNvbHZlKHJlc2l6ZWRCYXNlNjQpO1xyXG4gICAgfTtcclxuICAgIGltZy5vbmVycm9yID0gKGVycm9yKSA9PiB7XHJcbiAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICB9O1xyXG4gIH0pO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiB0byBjYWxjdWxhdGUgZm9udCBzaXplIG9mIHRleHQgYXJlYSB3aWRnZXRzXHJcbmNvbnN0IGNhbGN1bGF0ZUZvbnRTaXplID0gKHBvc2l0aW9uLCBjb250YWluZXJTY2FsZSwgc2lnbnlvdXJzZWxmKSA9PiB7XHJcbiAgY29uc3QgZm9udCA9IHBvc2l0aW9uPy5vcHRpb25zPy5mb250U2l6ZSB8fCAxMjtcclxuICBpZiAoIXNpZ255b3Vyc2VsZiAmJiBwb3NpdGlvbj8uaXNNb2JpbGUgJiYgcG9zaXRpb24/LnNjYWxlKSB7XHJcbiAgICByZXR1cm4gZm9udCAvIHBvc2l0aW9uPy5zY2FsZSAvIGNvbnRhaW5lclNjYWxlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZm9udCAvIGNvbnRhaW5lclNjYWxlO1xyXG4gIH1cclxufTtcclxuLy9mdW5jdGlvbiBmb3IgZW1iZWQgbXVsdGlwbGUgc2lnbmF0dXJlIHVzaW5nIHBkZi1saWJcclxuZXhwb3J0IGNvbnN0IG11bHRpU2lnbkVtYmVkID0gYXN5bmMgKFxyXG4gIHdpZGdldHMsXHJcbiAgcGRmRG9jLFxyXG4gIHNpZ255b3Vyc2VsZixcclxuICBzY2FsZSxcclxuICBwZGZPcmlnaW5hbFdILFxyXG4gIGNvbnRhaW5lcldIXHJcbikgPT4ge1xyXG4gIGZvciAobGV0IGl0ZW0gb2Ygd2lkZ2V0cykge1xyXG4gICAgY29uc3QgY29udGFpbmVyU2NhbGUgPSBnZXRDb250YWluZXJTY2FsZShcclxuICAgICAgcGRmT3JpZ2luYWxXSCxcclxuICAgICAgaXRlbT8ucGFnZU51bWJlcixcclxuICAgICAgY29udGFpbmVyV0hcclxuICAgICk7XHJcbiAgICBjb25zdCB0eXBlRXhpc3QgPSBpdGVtLnBvcy5zb21lKChkYXRhKSA9PiBkYXRhPy50eXBlKTtcclxuICAgIGxldCB1cGRhdGVJdGVtO1xyXG5cclxuICAgIGlmICh0eXBlRXhpc3QpIHtcclxuICAgICAgaWYgKHNpZ255b3Vyc2VsZikge1xyXG4gICAgICAgIHVwZGF0ZUl0ZW0gPSBpdGVtLnBvcztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1cGRhdGVJdGVtID0gaXRlbS5wb3MuZmlsdGVyKFxyXG4gICAgICAgICAgKGRhdGEpID0+IGRhdGE/Lm9wdGlvbnM/LnN0YXR1cyA9PT0gXCJyZXF1aXJlZFwiXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdXBkYXRlSXRlbSA9IGl0ZW0ucG9zO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGFnZU5vID0gaXRlbS5wYWdlTnVtYmVyO1xyXG4gICAgY29uc3Qgd2lkZ2V0c1Bvc2l0aW9uQXJyID0gdXBkYXRlSXRlbTtcclxuICAgIGNvbnN0IHBhZ2VzID0gcGRmRG9jLmdldFBhZ2VzKCk7XHJcbiAgICBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKTtcclxuICAgIGNvbnN0IHBhZ2UgPSBwYWdlc1twYWdlTm8gLSAxXTtcclxuICAgIGNvbnN0IGltYWdlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICB3aWRnZXRzUG9zaXRpb25BcnIubWFwKGFzeW5jICh1cmwpID0+IHtcclxuICAgICAgICBsZXQgc2lnblVybCA9IHVybC5TaWduVXJsICYmIHVybC5TaWduVXJsO1xyXG4gICAgICAgIGlmIChzaWduVXJsKSB7XHJcbiAgICAgICAgICBpZiAodXJsLkltYWdlVHlwZSA9PT0gXCJpbWFnZS9wbmdcIikge1xyXG4gICAgICAgICAgICAvL2Z1bmN0aW9uIGZvciBjb252ZXJ0IHNpZ25hdHVyZSBwbmcgYmFzZTY0IHVybCB0byBqcGVnIGJhc2U2NFxyXG4gICAgICAgICAgICBjb25zdCBuZXdVcmwgPSBhd2FpdCBjb252ZXJ0UE5HdG9KUEVHKHNpZ25VcmwpO1xyXG4gICAgICAgICAgICBzaWduVXJsID0gbmV3VXJsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goc2lnblVybCk7XHJcbiAgICAgICAgICByZXR1cm4gcmVzLmFycmF5QnVmZmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB3aWRnZXRzUG9zaXRpb25BcnIuZm9yRWFjaChhc3luYyAocG9zaXRpb24sIGlkKSA9PiB7XHJcbiAgICAgIGxldCBpbWc7XHJcbiAgICAgIGlmIChbXCJzaWduYXR1cmVcIiwgXCJzdGFtcFwiLCBcImluaXRpYWxzXCIsIFwiaW1hZ2VcIl0uaW5jbHVkZXMocG9zaXRpb24udHlwZSkpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAocG9zaXRpb24uSW1hZ2VUeXBlICYmIHBvc2l0aW9uLkltYWdlVHlwZSA9PT0gXCJpbWFnZS9wbmdcIikgfHxcclxuICAgICAgICAgIHBvc2l0aW9uLkltYWdlVHlwZSA9PT0gXCJpbWFnZS9qcGVnXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGltZyA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZyhpbWFnZXNbaWRdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaW1nID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKGltYWdlc1tpZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICghcG9zaXRpb24udHlwZSkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIChwb3NpdGlvbi5JbWFnZVR5cGUgJiYgcG9zaXRpb24uSW1hZ2VUeXBlID09PSBcImltYWdlL3BuZ1wiKSB8fFxyXG4gICAgICAgICAgcG9zaXRpb24uSW1hZ2VUeXBlID09PSBcImltYWdlL2pwZWdcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgaW1nID0gYXdhaXQgcGRmRG9jLmVtYmVkSnBnKGltYWdlc1tpZF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpbWcgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoaW1hZ2VzW2lkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCB3aWRnZXRXaWR0aCwgd2lkZ2V0SGVpZ2h0O1xyXG4gICAgICB3aWRnZXRXaWR0aCA9IHBsYWNlaG9sZGVyV2lkdGgocG9zaXRpb24pO1xyXG4gICAgICB3aWRnZXRIZWlnaHQgPSBwbGFjZWhvbGRlckhlaWdodChwb3NpdGlvbik7XHJcbiAgICAgIGNvbnN0IHhQb3MgPSAocG9zaXRpb24pID0+IHtcclxuICAgICAgICBjb25zdCByZXNpemVQb3MgPSBwb3NpdGlvbi54UG9zaXRpb247XHJcbiAgICAgICAgLy9maXJzdCB0d28gY29uZGl0aW9uIGhhbmRsZSB0byBvbGQgZGF0YSBhbHJlYWR5IHNhdmVkIGZyb20gbW9iaWxlIHZpZXcgd2hpY2ggc2NhbGUgcG9pbnQgZGlmZnJlbnRcclxuICAgICAgICBpZiAoaXNNb2JpbGUgJiYgcG9zaXRpb24uaXNNb2JpbGUpIHtcclxuICAgICAgICAgIC8vaWYgcG9zLmlzTW9iaWxlIGZhbHNlIC0tIHBsYWNlaG9sZGVyIHNhdmVkIGZyb20gZGVza3RvcCB2aWV3IHRoZW4gaGFuZGxlIHBvc2l0aW9uIGluIG1vYmlsZSB2aWV3IGRpdmlkZWQgYnkgc2NhbGVcclxuICAgICAgICAgIGNvbnN0IHggPSByZXNpemVQb3MgKiAocG9zaXRpb24uc2NhbGUgLyBzY2FsZSk7XHJcbiAgICAgICAgICByZXR1cm4geCAqIHNjYWxlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24uaXNNb2JpbGUgJiYgcG9zaXRpb24uc2NhbGUpIHtcclxuICAgICAgICAgIGNvbnN0IHggPSByZXNpemVQb3MgKiBwb3NpdGlvbi5zY2FsZTtcclxuICAgICAgICAgIHJldHVybiB4O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzaXplUG9zO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgY29uc3QgeVBvcyA9IChwb3NpdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc2l6ZVBvcyA9IHBvc2l0aW9uLnlQb3NpdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmlzTW9iaWxlICYmIHBvc2l0aW9uLnNjYWxlKSB7XHJcbiAgICAgICAgICBpZiAocG9zaXRpb24uSXNSZXNpemUpIHtcclxuICAgICAgICAgICAgY29uc3QgeSA9IHJlc2l6ZVBvcyAqIHBvc2l0aW9uLnNjYWxlO1xyXG4gICAgICAgICAgICByZXR1cm4geTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSByZXNpemVQb3MgKiBwb3NpdGlvbi5zY2FsZTtcclxuICAgICAgICAgICAgcmV0dXJuIHk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiByZXNpemVQb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCB3aWRnZXRUeXBlRXhpc3QgPSBbXHJcbiAgICAgICAgdGV4dFdpZGdldCxcclxuICAgICAgICB0ZXh0SW5wdXRXaWRnZXQsXHJcbiAgICAgICAgXCJuYW1lXCIsXHJcbiAgICAgICAgXCJjb21wYW55XCIsXHJcbiAgICAgICAgXCJqb2IgdGl0bGVcIixcclxuICAgICAgICBcImRhdGVcIixcclxuICAgICAgICBcImVtYWlsXCJcclxuICAgICAgXS5pbmNsdWRlcyhwb3NpdGlvbi50eXBlKTtcclxuICAgICAgaWYgKHBvc2l0aW9uLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICAgIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFwiSGVsdmV0aWNhXCIpO1xyXG4gICAgICAgIGxldCBjaGVja2JveE9wdGlvbkdhcEZyb21Ub3AsIGlzQ2hlY2s7XHJcbiAgICAgICAgbGV0IHkgPSB5UG9zKHBvc2l0aW9uKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zRm9udFNpemUgPSAxMztcclxuICAgICAgICBjb25zdCBjaGVja2JveFNpemUgPSAxODtcclxuICAgICAgICBjb25zdCBjaGVja2JveFRleHRHYXBGcm9tTGVmdCA9IDIyO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8udmFsdWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHBvc2l0aW9uPy5vcHRpb25zPy52YWx1ZXMuZm9yRWFjaCgoaXRlbSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94UmFuZG9tSWQgPSBcImNoZWNrYm94XCIgKyByYW5kb21JZCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHBvc2l0aW9uPy5vcHRpb25zPy5yZXNwb25zZSAmJlxyXG4gICAgICAgICAgICAgIHBvc2l0aW9uPy5vcHRpb25zPy5yZXNwb25zZT8ubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBpc0NoZWNrID0gcG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlPy5pbmNsdWRlcyhpbmQpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpIHtcclxuICAgICAgICAgICAgICBpc0NoZWNrID0gcG9zaXRpb24/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZT8uaW5jbHVkZXMoaW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgY2hlY2tib3ggPSBmb3JtLmNyZWF0ZUNoZWNrQm94KGNoZWNrYm94UmFuZG9tSWQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZCA+IDApIHtcclxuICAgICAgICAgICAgICB5ID0geSArIGNoZWNrYm94T3B0aW9uR2FwRnJvbVRvcDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjaGVja2JveE9wdGlvbkdhcEZyb21Ub3AgPSAyNjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFwb3NpdGlvbj8ub3B0aW9ucz8uaXNIaWRlTGFiZWwpIHtcclxuICAgICAgICAgICAgICAvLyBiZWxvdyBsaW5lIG9mIGNvZGUgaXMgdXNlZCB0byBlbWJlZCBsYWJlbCB3aXRoIHJhZGlvIGJ1dHRvbiBpbiBwZGZcclxuICAgICAgICAgICAgICBjb25zdCBvcHRpb25zUG9zaXRpb24gPSBjb21wZW5zYXRlUm90YXRpb24oXHJcbiAgICAgICAgICAgICAgICBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGUsXHJcbiAgICAgICAgICAgICAgICB4UG9zKHBvc2l0aW9uKSArIGNoZWNrYm94VGV4dEdhcEZyb21MZWZ0LFxyXG4gICAgICAgICAgICAgICAgeSxcclxuICAgICAgICAgICAgICAgIDEsXHJcbiAgICAgICAgICAgICAgICBwYWdlLmdldFNpemUoKSxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnNGb250U2l6ZSxcclxuICAgICAgICAgICAgICAgIHJnYigwLCAwLCAwKSxcclxuICAgICAgICAgICAgICAgIGZvbnQsXHJcbiAgICAgICAgICAgICAgICBwYWdlXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBwYWdlLmRyYXdUZXh0KGl0ZW0sIG9wdGlvbnNQb3NpdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGNoZWNrYm94T2JqID0ge1xyXG4gICAgICAgICAgICAgIHg6IHhQb3MocG9zaXRpb24pLFxyXG4gICAgICAgICAgICAgIHk6IHksXHJcbiAgICAgICAgICAgICAgd2lkdGg6IGNoZWNrYm94U2l6ZSxcclxuICAgICAgICAgICAgICBoZWlnaHQ6IGNoZWNrYm94U2l6ZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjaGVja2JveE9iaiA9IGdldEltYWdlUG9zaXRpb24ocGFnZSwgY2hlY2tib3hPYmosIDEpO1xyXG4gICAgICAgICAgICBjaGVja2JveC5hZGRUb1BhZ2UocGFnZSwgY2hlY2tib3hPYmopO1xyXG5cclxuICAgICAgICAgICAgLy9hcHBsaWVkIHdoaWNoIGNoZWNrYm94IHNob3VsZCBiZSBjaGVja2VkXHJcbiAgICAgICAgICAgIGlmIChpc0NoZWNrKSB7XHJcbiAgICAgICAgICAgICAgY2hlY2tib3guY2hlY2soKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjaGVja2JveC51bmNoZWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2hlY2tib3guZW5hYmxlUmVhZE9ubHkoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh3aWRnZXRUeXBlRXhpc3QpIHtcclxuICAgICAgICBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChcIkhlbHZldGljYVwiKTtcclxuICAgICAgICBjb25zdCBmb250U2l6ZSA9IGNhbGN1bGF0ZUZvbnRTaXplKFxyXG4gICAgICAgICAgcG9zaXRpb24sXHJcbiAgICAgICAgICBjb250YWluZXJTY2FsZSxcclxuICAgICAgICAgIHNpZ255b3Vyc2VsZlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcGFyc2VJbnQoZm9udFNpemUpO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvciA9IHBvc2l0aW9uPy5vcHRpb25zPy5mb250Q29sb3I7XHJcbiAgICAgICAgbGV0IHVwZGF0ZUNvbG9ySW5SZ2I7XHJcbiAgICAgICAgaWYgKGNvbG9yID09PSBcInJlZFwiKSB7XHJcbiAgICAgICAgICB1cGRhdGVDb2xvckluUmdiID0gcmdiKDEsIDAsIDApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29sb3IgPT09IFwiYmxhY2tcIikge1xyXG4gICAgICAgICAgdXBkYXRlQ29sb3JJblJnYiA9IHJnYigwLCAwLCAwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbG9yID09PSBcImJsdWVcIikge1xyXG4gICAgICAgICAgdXBkYXRlQ29sb3JJblJnYiA9IHJnYigwLCAwLCAxKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbG9yID09PSBcInllbGxvd1wiKSB7XHJcbiAgICAgICAgICB1cGRhdGVDb2xvckluUmdiID0gcmdiKDAuOSwgMSwgMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHVwZGF0ZUNvbG9ySW5SZ2IgPSByZ2IoMCwgMCwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0ZXh0Q29udGVudDtcclxuICAgICAgICBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlKSB7XHJcbiAgICAgICAgICB0ZXh0Q29udGVudCA9IHBvc2l0aW9uLm9wdGlvbnM/LnJlc3BvbnNlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgdGV4dENvbnRlbnQgPSBwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmaXhlZFdpZHRoID0gd2lkZ2V0V2lkdGg7IC8vIFNldCB5b3VyIGZpeGVkIHdpZHRoXHJcbiAgICAgICAgY29uc3QgaXNOZXdPbkVudGVyTGluZUV4aXN0ID0gdGV4dENvbnRlbnQuaW5jbHVkZXMoXCJcXG5cIik7XHJcblxyXG4gICAgICAgIC8vIEZ1bmN0aW9uIHRvIGJyZWFrIHRleHQgaW50byBsaW5lcyBiYXNlZCBvbiB0aGUgZml4ZWQgd2lkdGhcclxuICAgICAgICBjb25zdCBOZXdicmVha1RleHRJbnRvTGluZXMgPSAodGV4dENvbnRlbnQsIHdpZHRoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IFtdO1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRMaW5lID0gXCJcIjtcclxuXHJcbiAgICAgICAgICBmb3IgKGNvbnN0IHdvcmQgb2YgdGV4dENvbnRlbnQuc3BsaXQoXCIgXCIpKSB7XHJcbiAgICAgICAgICAgIC8vZ2V0IHRleHQgbGluZSB3aWR0aFxyXG4gICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKFxyXG4gICAgICAgICAgICAgIGAke2N1cnJlbnRMaW5lfSAke3dvcmR9YCxcclxuICAgICAgICAgICAgICBmb250U2l6ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvL2NoZWNrIHRleHQgY29udGVudCBsaW5lIHdpZHRoIGlzIGxlc3Mgb3IgZXF1YWwgdG8gY29udGFpbmVyIHdpZHRoXHJcbiAgICAgICAgICAgIGlmIChsaW5lV2lkdGggPD0gd2lkdGgpIHtcclxuICAgICAgICAgICAgICBjdXJyZW50TGluZSArPSBgICR7d29yZH1gO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUudHJpbSgpKTtcclxuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IGAke3dvcmR9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZS50cmltKCkpO1xyXG4gICAgICAgICAgcmV0dXJuIGxpbmVzO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIEZ1bmN0aW9uIHRvIGJyZWFrIHRleHQgaW50byBsaW5lcyBiYXNlZCBvbiB3aGVuIHVzZXIgZ28gbmV4dCBsaW5lIG9uIHByZXNzIGVudGVyIGJ1dHRvblxyXG4gICAgICAgIGNvbnN0IGJyZWFrVGV4dEludG9MaW5lcyA9ICh0ZXh0Q29udGVudCwgd2lkdGgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGxpbmVzID0gW107XHJcblxyXG4gICAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIHRleHRDb250ZW50LnNwbGl0KFwiXFxuXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoYCR7d29yZH1gLCBmb250U2l6ZSk7XHJcbiAgICAgICAgICAgIC8vY2hlY2tpbmcgc3RyaW5nIGxlbmd0aCB0byBjb250YWluZXIgd2lkdGhcclxuICAgICAgICAgICAgLy9pZiBzdHJpbmcgbGVuZ3RoIGlzIGxlc3MgdGhlbiBjb250YWluZXIgd2lkdGggaXQgbWVhbnMgdXNlciBwcmVzcyBlbnRlciBidXR0b25cclxuICAgICAgICAgICAgaWYgKGxpbmVXaWR0aCA8PSB3aWR0aCkge1xyXG4gICAgICAgICAgICAgIGxpbmVzLnB1c2god29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9lbHNlIGFkanVzdCB0ZXh0IGNvbnRlbnQgYWNjb3JkaW5nIHRvIHdpZHRoIGFuZCBzZW5kIGl0IGluIG5ldyBsaW5lXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5ld0xpbmUgPSBOZXdicmVha1RleHRJbnRvTGluZXMod29yZCwgd2lkdGgpO1xyXG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goLi4ubmV3TGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gbGluZXM7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy9jaGVjayBpZiB0ZXh0IGNvbnRlbnQgaGF2ZSBgXFxuYCBzdHJpbmcgaXQgbWVhbnMgdXNlciBwcmVzcyBlbnRlciB0byBnbyBuZXh0IGxpbmUgYW5kIGhhbmRsZSBjb25kaXRpb25cclxuICAgICAgICAvL2Vsc2UgYXV0byBhZGp1c3QgdGV4dCBjb250ZW50IGFjY29yZGluZyB0byBjb250YWluZXIgd2lkdGhcclxuICAgICAgICBjb25zdCBsaW5lcyA9IGlzTmV3T25FbnRlckxpbmVFeGlzdFxyXG4gICAgICAgICAgPyBicmVha1RleHRJbnRvTGluZXModGV4dENvbnRlbnQsIGZpeGVkV2lkdGgpXHJcbiAgICAgICAgICA6IE5ld2JyZWFrVGV4dEludG9MaW5lcyh0ZXh0Q29udGVudCwgZml4ZWRXaWR0aCk7XHJcbiAgICAgICAgLy8gU2V0IGluaXRpYWwgeS1jb29yZGluYXRlIGZvciB0aGUgZmlyc3QgbGluZVxyXG4gICAgICAgIGxldCB4ID0geFBvcyhwb3NpdGlvbik7XHJcbiAgICAgICAgbGV0IHkgPSB5UG9zKHBvc2l0aW9uKTtcclxuICAgICAgICAvLyBFbWJlZCBlYWNoIGxpbmUgb24gdGhlIHBhZ2VcclxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgICAgIGNvbnN0IHRleHRQb3NpdGlvbiA9IGNvbXBlbnNhdGVSb3RhdGlvbihcclxuICAgICAgICAgICAgcGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlLFxyXG4gICAgICAgICAgICB4LFxyXG4gICAgICAgICAgICB5LFxyXG4gICAgICAgICAgICAxLFxyXG4gICAgICAgICAgICBwYWdlLmdldFNpemUoKSxcclxuICAgICAgICAgICAgZm9udFNpemUsXHJcbiAgICAgICAgICAgIHVwZGF0ZUNvbG9ySW5SZ2IsXHJcbiAgICAgICAgICAgIGZvbnQsXHJcbiAgICAgICAgICAgIHBhZ2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBwYWdlLmRyYXdUZXh0KGxpbmUsIHRleHRQb3NpdGlvbik7XHJcbiAgICAgICAgICB5ICs9IDE4OyAvLyBBZGp1c3QgdGhlIGxpbmUgaGVpZ2h0IGFzIG5lZWRlZFxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbi50eXBlID09PSBcImRyb3Bkb3duXCIpIHtcclxuICAgICAgICBjb25zdCBkcm9wZG93blJhbmRvbUlkID0gXCJkcm9wZG93blwiICsgcmFuZG9tSWQoKTtcclxuICAgICAgICBjb25zdCBkcm9wZG93biA9IGZvcm0uY3JlYXRlRHJvcGRvd24oZHJvcGRvd25SYW5kb21JZCk7XHJcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9ucyhwb3NpdGlvbj8ub3B0aW9ucz8udmFsdWVzKTtcclxuICAgICAgICBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBkcm9wZG93bi5zZWxlY3QocG9zaXRpb24ub3B0aW9ucz8ucmVzcG9uc2UpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgZHJvcGRvd24uc2VsZWN0KHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkcm9wZG93bk9iaiA9IHtcclxuICAgICAgICAgIHg6IHhQb3MocG9zaXRpb24pLFxyXG4gICAgICAgICAgeTogeVBvcyhwb3NpdGlvbiksXHJcbiAgICAgICAgICB3aWR0aDogd2lkZ2V0V2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IHdpZGdldEhlaWdodFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duT3B0aW9uID0gZ2V0SW1hZ2VQb3NpdGlvbihwYWdlLCBkcm9wZG93bk9iaiwgMSk7XHJcbiAgICAgICAgLy8gcGFnZS5kcmF3SW1hZ2UoaW1nLCBpbWFnZU9wdGlvbnMpO1xyXG4gICAgICAgIGRyb3Bkb3duLmFkZFRvUGFnZShwYWdlLCBkcm9wZG93bk9wdGlvbik7XHJcbiAgICAgICAgZHJvcGRvd24uZW5hYmxlUmVhZE9ubHkoKTtcclxuICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbi50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCkge1xyXG4gICAgICAgIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFwiSGVsdmV0aWNhXCIpO1xyXG4gICAgICAgIGNvbnN0IHJhZGlvUmFuZG9tSWQgPSBcInJhZGlvXCIgKyByYW5kb21JZCgpO1xyXG4gICAgICAgIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmNyZWF0ZVJhZGlvR3JvdXAocmFkaW9SYW5kb21JZCk7XHJcbiAgICAgICAgbGV0IHJhZGlvT3B0aW9uR2FwRnJvbVRvcDtcclxuICAgICAgICBjb25zdCBvcHRpb25zRm9udFNpemUgPSAxNjtcclxuICAgICAgICBjb25zdCByYWRpb1RleHRHYXBGcm9tTGVmdCA9IDIwO1xyXG4gICAgICAgIGNvbnN0IHJhZGlvU2l6ZSA9IDE4O1xyXG4gICAgICAgIGxldCB5ID0geVBvcyhwb3NpdGlvbik7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy52YWx1ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcG9zaXRpb24/Lm9wdGlvbnM/LnZhbHVlcy5mb3JFYWNoKChpdGVtLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGluZCA+IDApIHtcclxuICAgICAgICAgICAgICB5ID0geSArIHJhZGlvT3B0aW9uR2FwRnJvbVRvcDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByYWRpb09wdGlvbkdhcEZyb21Ub3AgPSAyNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXBvc2l0aW9uPy5vcHRpb25zPy5pc0hpZGVMYWJlbCkge1xyXG4gICAgICAgICAgICAgIC8vIGJlbG93IGxpbmUgb2YgY29kZSBpcyB1c2VkIHRvIGVtYmVkIGxhYmVsIHdpdGggcmFkaW8gYnV0dG9uIGluIHBkZlxyXG5cclxuICAgICAgICAgICAgICBjb25zdCBvcHRpb25zUG9zaXRpb24gPSBjb21wZW5zYXRlUm90YXRpb24oXHJcbiAgICAgICAgICAgICAgICBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGUsXHJcbiAgICAgICAgICAgICAgICB4UG9zKHBvc2l0aW9uKSArIHJhZGlvVGV4dEdhcEZyb21MZWZ0LFxyXG4gICAgICAgICAgICAgICAgeSxcclxuICAgICAgICAgICAgICAgIDEsXHJcbiAgICAgICAgICAgICAgICBwYWdlLmdldFNpemUoKSxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnNGb250U2l6ZSxcclxuICAgICAgICAgICAgICAgIHJnYigwLCAwLCAwKSxcclxuICAgICAgICAgICAgICAgIGZvbnQsXHJcbiAgICAgICAgICAgICAgICBwYWdlXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgcGFnZS5kcmF3VGV4dChpdGVtLCBvcHRpb25zUG9zaXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCByYWRpb09iaiA9IHtcclxuICAgICAgICAgICAgICB4OiB4UG9zKHBvc2l0aW9uKSxcclxuICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgIHdpZHRoOiByYWRpb1NpemUsXHJcbiAgICAgICAgICAgICAgaGVpZ2h0OiByYWRpb1NpemVcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJhZGlvT2JqID0gZ2V0SW1hZ2VQb3NpdGlvbihwYWdlLCByYWRpb09iaiwgMSk7XHJcbiAgICAgICAgICAgIHJhZGlvR3JvdXAuYWRkT3B0aW9uVG9QYWdlKGl0ZW0sIHBhZ2UsIHJhZGlvT2JqKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlKSB7XHJcbiAgICAgICAgICByYWRpb0dyb3VwLnNlbGVjdChwb3NpdGlvbi5vcHRpb25zPy5yZXNwb25zZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgICByYWRpb0dyb3VwLnNlbGVjdChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmFkaW9Hcm91cC5lbmFibGVSZWFkT25seSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHtcclxuICAgICAgICAgIHg6IHhQb3MocG9zaXRpb24pLFxyXG4gICAgICAgICAgeTogeVBvcyhwb3NpdGlvbiksXHJcbiAgICAgICAgICB3aWR0aDogd2lkZ2V0V2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IHdpZGdldEhlaWdodFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGltYWdlT3B0aW9ucyA9IGdldEltYWdlUG9zaXRpb24ocGFnZSwgc2lnbmF0dXJlLCAxKTtcclxuICAgICAgICBwYWdlLmRyYXdJbWFnZShpbWcsIGltYWdlT3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBjb25zdCBwZGZCeXRlcyA9IGF3YWl0IHBkZkRvYy5zYXZlQXNCYXNlNjQoeyB1c2VPYmplY3RTdHJlYW1zOiBmYWxzZSB9KTtcclxuICAvL2NvbnNvbGUubG9nKFwicGRmXCIsIHBkZkJ5dGVzKTtcclxuICByZXR1cm4gcGRmQnl0ZXM7XHJcbn07XHJcblxyXG4vLyBmdW5jdGlvbiBmb3IgdmFsaWRhdGluZyBVUkxzXHJcbmV4cG9ydCBmdW5jdGlvbiB1cmxWYWxpZGF0b3IodXJsKSB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IG5ld1VybCA9IG5ldyBVUkwodXJsKTtcclxuICAgIHJldHVybiBuZXdVcmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIiB8fCBuZXdVcmwucHJvdG9jb2wgPT09IFwiaHR0cHM6XCI7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbi8vY2FsY3VsYXRlIHBsYWNlaG9sZGVyIHdpZHRoIHRvIGVtYmVkIGluIHBkZlxyXG5leHBvcnQgY29uc3QgcGxhY2Vob2xkZXJXaWR0aCA9IChwb3MpID0+IHtcclxuICBjb25zdCBkZWZhdWx0V2lkdGggPSBkZWZhdWx0V2lkdGhIZWlnaHQocG9zLnR5cGUpLndpZHRoO1xyXG4gIGNvbnN0IHBvc1dpZHRoID0gcG9zLldpZHRoIHx8IGRlZmF1bHRXaWR0aDtcclxuXHJcbiAgLy9jb25kaXRpb24gdG8gaGFuZGxlIG9sZCBkYXRhIHNhdmVkIGZyb20gbW9iaWxlIHZpZXcgdG8gZ2V0IHdpZHRoaFxyXG4gIGlmIChwb3MuaXNNb2JpbGUgJiYgcG9zLnNjYWxlKSB7XHJcbiAgICBpZiAocG9zLklzUmVzaXplKSB7XHJcbiAgICAgIHJldHVybiBwb3NXaWR0aDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBwb3NXaWR0aCAqIHBvcy5zY2FsZTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHBvc1dpZHRoO1xyXG4gIH1cclxufTtcclxuXHJcbi8vY2FsY3VsYXRlIHBsYWNlaG9sZGVyIGhlaWdodCB0byBlbWJlZCBpbiBwZGZcclxuZXhwb3J0IGNvbnN0IHBsYWNlaG9sZGVySGVpZ2h0ID0gKHBvcykgPT4ge1xyXG4gIGNvbnN0IHBvc0hlaWdodCA9IHBvcy5IZWlnaHQ7XHJcbiAgY29uc3QgZGVmYXVsdEhlaWdodCA9IGRlZmF1bHRXaWR0aEhlaWdodChwb3MudHlwZSkuaGVpZ2h0O1xyXG4gIGNvbnN0IHBvc1VwZGF0ZUhlaWdodCA9IHBvc0hlaWdodCB8fCBkZWZhdWx0SGVpZ2h0O1xyXG5cclxuICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgb2xkIGRhdGEgc2F2ZWQgZnJvbSBtb2JpbGUgdmlldyB0byBnZXQgaGVpZ2h0XHJcbiAgaWYgKHBvcy5pc01vYmlsZSAmJiBwb3Muc2NhbGUpIHtcclxuICAgIGlmIChwb3MuSXNSZXNpemUpIHtcclxuICAgICAgcmV0dXJuIHBvc1VwZGF0ZUhlaWdodDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBwb3NVcGRhdGVIZWlnaHQgKiBwb3Muc2NhbGU7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBwb3NVcGRhdGVIZWlnaHQ7XHJcbiAgfVxyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgZ2V0dGluZyBjb250cmFjdHNfY29udGFjdGJvb2sgZGV0YWlsc1xyXG5leHBvcnQgY29uc3QgY29udGFjdEJvb2sgPSBhc3luYyAob2JqZWN0SWQpID0+IHtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBheGlvc1xyXG4gICAgLmdldChcclxuICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgXCJiYXNlVXJsXCJcclxuICAgICAgKX1jbGFzc2VzL2NvbnRyYWN0c19Db250YWN0Ym9vaz93aGVyZT17XCJvYmplY3RJZFwiOlwiJHtvYmplY3RJZH1cIn1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKVxyXG4gICAgLnRoZW4oKExpc3RkYXRhKSA9PiB7XHJcbiAgICAgIGNvbnN0IGpzb24gPSBMaXN0ZGF0YS5kYXRhO1xyXG4gICAgICBjb25zdCByZXMgPSBqc29uLnJlc3VsdHM7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9KVxyXG5cclxuICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGNvbnRyYWN0c19Db250YWN0Ym9vayBjbGFzcyBcIiwgZXJyKTtcclxuICAgICAgcmV0dXJuIFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiO1xyXG4gICAgfSk7XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbi8vZnVuY3Rpb24gZm9yIGdldHRpbmcgZG9jdW1lbnQgZGV0YWlscyBmcm9tIGNvbnRyYWN0X0RvY3VtZW50cyBjbGFzc1xyXG5leHBvcnQgY29uc3QgY29udHJhY3REb2N1bWVudCA9IGFzeW5jIChkb2N1bWVudElkKSA9PiB7XHJcbiAgY29uc3QgZGF0YSA9IHtcclxuICAgIGRvY0lkOiBkb2N1bWVudElkXHJcbiAgfTtcclxuICBjb25zdCBkb2N1bWVudERlYXRpbHMgPSBhd2FpdCBheGlvc1xyXG4gICAgLnBvc3QoYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfWZ1bmN0aW9ucy9nZXREb2N1bWVudGAsIGRhdGEsIHtcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXHJcbiAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAudGhlbigoTGlzdGRhdGEpID0+IHtcclxuICAgICAgY29uc3QganNvbiA9IExpc3RkYXRhLmRhdGE7XHJcbiAgICAgIGxldCBkYXRhID0gW107XHJcbiAgICAgIGlmIChqc29uICYmIGpzb24ucmVzdWx0LmVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgIH0gZWxzZSBpZiAoanNvbiAmJiBqc29uLnJlc3VsdCkge1xyXG4gICAgICAgIGRhdGEucHVzaChqc29uLnJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coXCJFcnIgaW4gZ2V0RG9jdW1lbnQgY2xvdWQgZnVuY3Rpb24gXCIsIGVycik7XHJcbiAgICAgIHJldHVybiBcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIjtcclxuICAgIH0pO1xyXG5cclxuICByZXR1cm4gZG9jdW1lbnREZWF0aWxzO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgYWRkIGRlZmF1bHQgc2lnbmF0dXJlIG9yIGltYWdlIGZvciBhbGwgcmVxdWVzdGVkIGxvY2F0aW9uXHJcbmV4cG9ydCBjb25zdCBhZGREZWZhdWx0U2lnbmF0dXJlSW1nID0gKHh5UG9zdGlvbiwgZGVmYXVsdFNpZ25JbWcpID0+IHtcclxuICBsZXQgaW1nV0ggPSB7IHdpZHRoOiBcIlwiLCBoZWlnaHQ6IFwiXCIgfTtcclxuICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICBpbWcuc3JjID0gZGVmYXVsdFNpZ25JbWc7XHJcbiAgaWYgKGltZy5jb21wbGV0ZSkge1xyXG4gICAgaW1nV0ggPSB7XHJcbiAgICAgIHdpZHRoOiBpbWcud2lkdGgsXHJcbiAgICAgIGhlaWdodDogaW1nLmhlaWdodFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGxldCB4eURlZmF1bHRQb3MgPSBbXTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHh5UG9zdGlvbi5sZW5ndGg7IGkrKykge1xyXG4gICAgbGV0IGdldElNR1dIO1xyXG4gICAgY29uc3QgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2ldLnBvcztcclxuICAgIGNvbnN0IGdldFBhZ2VObyA9IHh5UG9zdGlvbltpXS5wYWdlTnVtYmVyO1xyXG4gICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcclxuXHJcbiAgICBjb25zdCBhZGRTaWduID0gZ2V0UG9zRGF0YS5tYXAoKHBvc2l0aW9uKSA9PiB7XHJcbiAgICAgIGdldElNR1dIID0gY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8oaW1nV0gsIHBvc2l0aW9uKTtcclxuICAgICAgaWYgKHBvc2l0aW9uLnR5cGUpIHtcclxuICAgICAgICBpZiAocG9zaXRpb24/LnR5cGUgPT09IFwic2lnbmF0dXJlXCIpIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgICBTaWduVXJsOiBkZWZhdWx0U2lnbkltZyxcclxuICAgICAgICAgICAgV2lkdGg6IGdldElNR1dILm5ld1dpZHRoLFxyXG4gICAgICAgICAgICBIZWlnaHQ6IGdldElNR1dILm5ld0hlaWdodCxcclxuICAgICAgICAgICAgSW1hZ2VUeXBlOiBcImRlZmF1bHRcIixcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IGRlZmF1bHRTaWduSW1nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICYmICFwb3NpdGlvbi5pc1N0YW1wKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgU2lnblVybDogZGVmYXVsdFNpZ25JbWcsXHJcbiAgICAgICAgICBXaWR0aDogZ2V0SU1HV0gubmV3V2lkdGgsXHJcbiAgICAgICAgICBIZWlnaHQ6IGdldElNR1dILm5ld0hlaWdodCxcclxuICAgICAgICAgIEltYWdlVHlwZTogXCJkZWZhdWx0XCIsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlOiBkZWZhdWx0U2lnbkltZ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgbmV3WHlwb3MgPSB7XHJcbiAgICAgIHBhZ2VOdW1iZXI6IGdldFBhZ2VObyxcclxuICAgICAgcG9zOiBhZGRTaWduXHJcbiAgICB9O1xyXG4gICAgeHlEZWZhdWx0UG9zLnB1c2gobmV3WHlwb3MpO1xyXG4gIH1cclxuICByZXR1cm4geHlEZWZhdWx0UG9zO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgY3JlYXRlIGxpc3Qgb2YgeWVhciBmb3IgZGF0ZSB3aWRnZXRcclxuZXhwb3J0IGNvbnN0IHJhbmdlID0gKHN0YXJ0LCBlbmQsIHN0ZXApID0+IHtcclxuICBjb25zdCByYW5nZSA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkgKz0gc3RlcCkge1xyXG4gICAgcmFuZ2UucHVzaChpKTtcclxuICB9XHJcbiAgcmV0dXJuIHJhbmdlO1xyXG59O1xyXG4vL2Z1bmN0aW9uIGZvciBnZXQgbW9udGhcclxuZXhwb3J0IGNvbnN0IGdldE1vbnRoID0gKGRhdGUpID0+IHtcclxuICBjb25zdCBuZXdNb250aCA9IG5ldyBEYXRlKGRhdGUpLmdldE1vbnRoKCk7XHJcbiAgcmV0dXJuIG5ld01vbnRoO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgZ2V0IHllYXJcclxuZXhwb3J0IGNvbnN0IGdldFllYXIgPSAoZGF0ZSkgPT4ge1xyXG4gIGNvbnN0IG5ld1llYXIgPSBuZXcgRGF0ZShkYXRlKS5nZXRGdWxsWWVhcigpO1xyXG4gIHJldHVybiBuZXdZZWFyO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiB0byBjcmVhdGUvY29weSB3aWRnZXQgbmV4dCB0byBhbHJlYWR5IGRyb3BwZWQgd2lkZ2V0XHJcbmV4cG9ydCBjb25zdCBoYW5kbGVDb3B5TmV4dFRvV2lkZ2V0ID0gKFxyXG4gIHBvc2l0aW9uLFxyXG4gIHdpZGdldFR5cGUsXHJcbiAgeHlQb3N0aW9uLFxyXG4gIGluZGV4LFxyXG4gIHNldFh5UG9zdGlvbixcclxuICB1c2VySWRcclxuKSA9PiB7XHJcbiAgY29uc3QgaXNTaWduZXJzID0geHlQb3N0aW9uLnNvbWUoKGRhdGEpID0+IGRhdGEuc2lnbmVyUHRyKTtcclxuICBsZXQgZmlsdGVyU2lnbmVyUG9zO1xyXG4gIC8vZ2V0IHBvc2l0aW9uIG9mIHByZXZpb3VzIHdpZGdldCBhbmQgY3JlYXRlIG5ldyB3aWRnZXQgbmV4dCB0byB0aGF0IHdpZGdldCBvbiBzYW1lIGRhdGEgZXhjZXB0XHJcbiAgLy8geFBvc2l0aW9uIGFuZCBrZXlcclxuICBsZXQgbmV3cG9zID0gcG9zaXRpb247XHJcbiAgY29uc3QgY2FsY3VsYXRlWFBvc2l0aW9uID1cclxuICAgIHBhcnNlSW50KHBvc2l0aW9uLnhQb3NpdGlvbikgK1xyXG4gICAgZGVmYXVsdFdpZHRoSGVpZ2h0KHdpZGdldFR5cGUpLndpZHRoICtcclxuICAgIHJlc2l6ZUJvcmRlckV4dHJhV2lkdGgoKTtcclxuICBjb25zdCBuZXdJZCA9IHJhbmRvbUlkKCk7XHJcbiAgbmV3cG9zID0geyAuLi5uZXdwb3MsIHhQb3NpdGlvbjogY2FsY3VsYXRlWFBvc2l0aW9uLCBrZXk6IG5ld0lkIH07XHJcbiAgLy9pZiBjb25kaXRpb24gdG8gY3JlYXRlIHdpZGdldCBpbiByZXF1ZXN0LXNpZ24gZmxvd1xyXG4gIGlmIChpc1NpZ25lcnMpIHtcclxuICAgIGlmICh1c2VySWQpIHtcclxuICAgICAgZmlsdGVyU2lnbmVyUG9zID0geHlQb3N0aW9uLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5JZCA9PT0gdXNlcklkKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGdldFBsYWNlSG9sZGVyID0gZmlsdGVyU2lnbmVyUG9zWzBdPy5wbGFjZUhvbGRlcjtcclxuICAgIGNvbnN0IGdldFBhZ2VOdW1lciA9IGdldFBsYWNlSG9sZGVyLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gaW5kZXhcclxuICAgICk7XHJcbiAgICBjb25zdCBnZXRYWWRhdGEgPSBnZXRQYWdlTnVtZXJbMF0ucG9zO1xyXG4gICAgZ2V0WFlkYXRhLnB1c2gobmV3cG9zKTtcclxuICAgIGlmIChnZXRQYWdlTnVtZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBuZXdVcGRhdGVTaWduUG9zID0gZ2V0UGxhY2VIb2xkZXIubWFwKChvYmopID0+IHtcclxuICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogZ2V0WFlkYXRhIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnbmVyID0geHlQb3N0aW9uLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKG9iai5JZCA9PT0gdXNlcklkKSB7XHJcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBuZXdVcGRhdGVTaWduUG9zIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgc2V0WHlQb3N0aW9uKG5ld1VwZGF0ZVNpZ25lcik7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIGVsc2UgY29uZGl0aW9uIHRvIGNyZWF0ZSB3aWRnZXQgaW4gc2lnbi15b3Vyc2VsZiBmbG93XHJcbiAgICBsZXQgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XHJcbiAgICBnZXRYWWRhdGEucHVzaChuZXdwb3MpO1xyXG4gICAgY29uc3QgdXBkYXRlUGxhY2Vob2xkZXIgPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xyXG4gICAgICBpZiAoaW5kID09PSBpbmRleCkge1xyXG4gICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiBnZXRYWWRhdGEgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfSk7XHJcblxyXG4gICAgc2V0WHlQb3N0aW9uKHVwZGF0ZVBsYWNlaG9sZGVyKTtcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RmlsZU5hbWUgPSAoZmlsZVVybCkgPT4ge1xyXG4gIGlmIChmaWxlVXJsKSB7XHJcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGZpbGVVcmwpO1xyXG4gICAgY29uc3QgZmlsZW5hbWUgPSB1cmwucGF0aG5hbWUuc3Vic3RyaW5nKHVybC5wYXRobmFtZS5pbmRleE9mKFwiX1wiKSArIDEpO1xyXG4gICAgcmV0dXJuIGZpbGVuYW1lIHx8IFwiXCI7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxufTtcclxuXHJcbi8vZmV0Y2ggdGVuYW50IGFwcCBsb2dvIGZyb20gYHBhcnRuZXJzX1RlbmFudGAgY2xhc3MgYnkgZG9tYWluIG5hbWVcclxuZXhwb3J0IGNvbnN0IGdldEFwcExvZ28gPSBhc3luYyAoKSA9PiB7XHJcbiAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ob3N0ID09PSBcImFwcC5vcGVuc2lnbmxhYnMuY29tXCIpIHtcclxuICAgIHJldHVybiB7IGxvZ286IGFwcEluZm8uYXBwbG9nbywgdXNlcjogXCJleGlzdFwiIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGRvbWFpbiA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdGVuYW50ID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwiZ2V0bG9nb2J5ZG9tYWluXCIsIHtcclxuICAgICAgICBkb21haW46IGRvbWFpblxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHRlbmFudCkge1xyXG4gICAgICAgIHJldHVybiB7IGxvZ286IHRlbmFudD8ubG9nbywgdXNlcjogdGVuYW50Py51c2VyIH07XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImVyciBpbiBnZXRsb2dvIFwiLCBlcnIpO1xyXG4gICAgICByZXR1cm4geyBsb2dvOiBhcHBJbmZvLmFwcGxvZ28sIHVzZXI6IFwiZXhpc3RcIiB9O1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRUZW5hbnREZXRhaWxzID0gYXN5bmMgKG9iamVjdElkKSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHRlbmFudENyZWRpdHNRdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShcInBhcnRuZXJzX1RlbmFudFwiKTtcclxuICAgIHRlbmFudENyZWRpdHNRdWVyeS5lcXVhbFRvKFwiVXNlcklkXCIsIHtcclxuICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcclxuICAgICAgY2xhc3NOYW1lOiBcIl9Vc2VyXCIsXHJcbiAgICAgIG9iamVjdElkOiBvYmplY3RJZFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0ZW5hbnRDcmVkaXRzUXVlcnkuZmlyc3QoKTtcclxuICAgIGlmIChyZXMpIHtcclxuICAgICAgY29uc3QgdXBkYXRlUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpKTtcclxuICAgICAgcmV0dXJuIHVwZGF0ZVJlcztcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICByZXR1cm4gXCJ1c2VyIGRvZXMgbm90IGV4aXN0IVwiO1xyXG4gIH1cclxufTtcclxuXHJcbi8vZnVuY3Rpb24gdG8gY29udmVydCB2YXJpYWJsZSBzdHJpbmcgbmFtZSB0byB2YXJpYWJsZSB2YWx1ZSBvZiBlbWFpbCBib2R5IGFuZCBzdWJqZWN0XHJcbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlTWFpbFZhcmlibGVzKHN1YmplY3QsIGJvZHksIHZhcmlhYmxlcykge1xyXG4gIGxldCByZXBsYWNlZFN1YmplY3QgPSBzdWJqZWN0O1xyXG4gIGxldCByZXBsYWNlZEJvZHkgPSBib2R5O1xyXG5cclxuICBmb3IgKGNvbnN0IHZhcmlhYmxlIGluIHZhcmlhYmxlcykge1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGB7eyR7dmFyaWFibGV9fX1gLCBcImdcIik7XHJcbiAgICBpZiAoc3ViamVjdCkge1xyXG4gICAgICByZXBsYWNlZFN1YmplY3QgPSByZXBsYWNlZFN1YmplY3QucmVwbGFjZShyZWdleCwgdmFyaWFibGVzW3ZhcmlhYmxlXSk7XHJcbiAgICB9XHJcbiAgICBpZiAoYm9keSkge1xyXG4gICAgICByZXBsYWNlZEJvZHkgPSByZXBsYWNlZEJvZHkucmVwbGFjZShyZWdleCwgdmFyaWFibGVzW3ZhcmlhYmxlXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICBzdWJqZWN0OiByZXBsYWNlZFN1YmplY3QsXHJcbiAgICBib2R5OiByZXBsYWNlZEJvZHlcclxuICB9O1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb3B5dG9EYXRhID0gKHRleHQpID0+IHtcclxuICAvLyBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTtcclxuICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCkge1xyXG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIEZhbGxiYWNrIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgbmF2aWdhdG9yLmNsaXBib2FyZFxyXG4gICAgY29uc3QgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XHJcbiAgICB0ZXh0QXJlYS52YWx1ZSA9IHRleHQ7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRBcmVhKTtcclxuICAgIHRleHRBcmVhLnNlbGVjdCgpO1xyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXh0QXJlYSk7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGNvbnZlcnRQZGZBcnJheUJ1ZmZlciA9IGFzeW5jICh1cmwpID0+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsIChzdGF0dXMgMjAwKVxyXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICByZXR1cm4gXCJFcnJvclwiO1xyXG4gICAgfVxyXG4gICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gQXJyYXlCdWZmZXJcclxuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuICAgIHJldHVybiBhcnJheUJ1ZmZlcjtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIGRhdGE6XCIsIGVycm9yKTtcclxuICAgIHJldHVybiBcIkVycm9yXCI7XHJcbiAgfVxyXG59O1xyXG4vL2BoYW5kbGVTZW5kT1RQYCBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgb3RwIG9uIHVzZXIncyBlbWFpbCB1c2luZyBgU2VuZE9UUE1haWxWMWAgY2xvdWQgZnVuY3Rpb25cclxuZXhwb3J0IGNvbnN0IGhhbmRsZVNlbmRPVFAgPSBhc3luYyAoZW1haWwpID0+IHtcclxuICB0cnkge1xyXG4gICAgbGV0IHVybCA9IGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvU2VuZE9UUE1haWxWMWA7XHJcbiAgICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKVxyXG4gICAgfTtcclxuICAgIGNvbnN0IGJvZHkgPSB7IGVtYWlsOiBlbWFpbCB9O1xyXG4gICAgYXdhaXQgYXhpb3MucG9zdCh1cmwsIGJvZHksIHsgaGVhZGVyczogaGVhZGVycyB9KTtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgYWxlcnQoZXJyb3IubWVzc2FnZSk7XHJcbiAgfVxyXG59O1xyXG5leHBvcnQgY29uc3QgZmV0Y2hVcmwgPSBhc3luYyAodXJsLCBwZGZOYW1lKSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgYWxlcnQoXCJzb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIik7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBva1wiKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XHJcbiAgICBzYXZlQXMoYmxvYiwgYCR7c2FuaXRpemVGaWxlTmFtZShwZGZOYW1lKX1fc2lnbmVkX2J5X09wZW5TaWdu4oSiLnBkZmApO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcclxuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkb3dubG9hZGluZyB0aGUgZmlsZTpcIiwgZXJyb3IpO1xyXG4gIH1cclxufTtcclxuLy9oYW5kbGUgZG93bmxvYWQgc2lnbmVkIHBkZlxyXG5leHBvcnQgY29uc3QgaGFuZGxlRG93bmxvYWRQZGYgPSBhc3luYyAoXHJcbiAgcGRmRGV0YWlscyxcclxuICBwZGZVcmwsXHJcbiAgc2V0SXNEb3dubG9hZGluZ1xyXG4pID0+IHtcclxuICBjb25zdCBwZGZOYW1lID0gcGRmRGV0YWlsc1swXSAmJiBwZGZEZXRhaWxzWzBdLk5hbWU7XHJcbiAgc2V0SXNEb3dubG9hZGluZyhcInBkZlwiKTtcclxuICB0cnkge1xyXG4gICAgLy8gY29uc3QgdXJsID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwiZ2V0c2lnbmVkdXJsXCIsIHsgdXJsOiBwZGZVcmwgfSk7XHJcbiAgICBjb25zdCBheGlvc1JlcyA9IGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX0vZnVuY3Rpb25zL2dldHNpZ25lZHVybGAsXHJcbiAgICAgIHsgdXJsOiBwZGZVcmwgfSxcclxuICAgICAge1xyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgIFwiY29udGVudC10eXBlXCI6IFwiQXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBjb25zdCB1cmwgPSBheGlvc1Jlcy5kYXRhLnJlc3VsdDtcclxuICAgIGF3YWl0IGZldGNoVXJsKHVybCwgcGRmTmFtZSk7XHJcbiAgICBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY29uc29sZS5sb2coXCJlcnIgaW4gZ2V0c2lnbmVkdXJsXCIsIGVycik7XHJcbiAgICBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpO1xyXG4gICAgYWxlcnQoXCJzb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIik7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNhbml0aXplRmlsZU5hbWUgPSAocGRmTmFtZSkgPT4ge1xyXG4gIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggdW5kZXJzY29yZVxyXG4gIHJldHVybiBwZGZOYW1lLnJlcGxhY2UoLyAvZywgXCJfXCIpO1xyXG59O1xyXG4vL2Z1bmN0aW9uIGZvciBwcmludCBkaWdpdGFsIHNpZ24gcGRmXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVUb1ByaW50ID0gYXN5bmMgKGV2ZW50LCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpID0+IHtcclxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIHNldElzRG93bmxvYWRpbmcoXCJwZGZcIik7XHJcbiAgdHJ5IHtcclxuICAgIC8vIGNvbnN0IHVybCA9IGF3YWl0IFBhcnNlLkNsb3VkLnJ1bihcImdldHNpZ25lZHVybFwiLCB7IHVybDogcGRmVXJsIH0pO1xyXG4gICAgLy9gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpYCBpcyBhbHNvIHVzZSBpbiBwdWJsaWMtcHJvZmlsZSBmbG93IGZvciBwdWJsaWMtc2lnblxyXG4gICAgLy9pZiB3ZSBnaXZlIHRoaXMgYGFwcEluZm8uYmFzZVVybGAgYXMgYSBiYXNlIHVybCB0aGVuIGluIHB1YmxpYy1wcm9maWxlIGl0IHdpbGwgY3JlYXRlIGJhc2UgdXJsIG9mIGl0J3Mgd2luZG93LmxvY2F0aW9uLm9yaWdpbiBleC0gb3BlbnNpZ24ubWUgd2hpY2ggaXMgbm90IGJhc2UgdXJsXHJcbiAgICBjb25zdCBheGlvc1JlcyA9IGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX0vZnVuY3Rpb25zL2dldHNpZ25lZHVybGAsXHJcbiAgICAgIHsgdXJsOiBwZGZVcmwgfSxcclxuICAgICAge1xyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgIFwiY29udGVudC10eXBlXCI6IFwiQXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBjb25zdCB1cmwgPSBheGlvc1Jlcy5kYXRhLnJlc3VsdDtcclxuICAgIGNvbnN0IHBkZiA9IGF3YWl0IGdldEJhc2U2NEZyb21VcmwodXJsKTtcclxuICAgIGNvbnN0IGlzQW5kcm9pZERldmljZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSk7XHJcbiAgICBjb25zdCBpc0FwcGxlRGV2aWNlID1cclxuICAgICAgKC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgfHxcclxuICAgICAgICAobmF2aWdhdG9yLnBsYXRmb3JtID09PSBcIk1hY0ludGVsXCIgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMSkpICYmXHJcbiAgICAgICF3aW5kb3cuTVNTdHJlYW07XHJcbiAgICBpZiAoaXNBbmRyb2lkRGV2aWNlIHx8IGlzQXBwbGVEZXZpY2UpIHtcclxuICAgICAgY29uc3QgYnl0ZUFycmF5ID0gVWludDhBcnJheS5mcm9tKFxyXG4gICAgICAgIGF0b2IocGRmKVxyXG4gICAgICAgICAgLnNwbGl0KFwiXCIpXHJcbiAgICAgICAgICAubWFwKChjaGFyKSA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnl0ZUFycmF5XSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiIH0pO1xyXG4gICAgICBjb25zdCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgd2luZG93Lm9wZW4oYmxvYlVybCwgXCJfYmxhbmtcIik7XHJcbiAgICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcmludE1vZHVsZSh7IHByaW50YWJsZTogcGRmLCB0eXBlOiBcInBkZlwiLCBiYXNlNjQ6IHRydWUgfSk7XHJcbiAgICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpO1xyXG4gICAgY29uc29sZS5sb2coXCJlcnIgaW4gZ2V0c2lnbmVkdXJsXCIsIGVycik7XHJcbiAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcclxuICB9XHJcbn07XHJcblxyXG4vL2hhbmRsZSBkb3dubG9hZCBzaWduZWQgcGRmXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlID0gYXN5bmMgKFxyXG4gIHBkZkRldGFpbHMsXHJcbiAgc2V0SXNEb3dubG9hZGluZ1xyXG4pID0+IHtcclxuICBpZiAocGRmRGV0YWlscz8ubGVuZ3RoID4gMCAmJiBwZGZEZXRhaWxzWzBdPy5DZXJ0aWZpY2F0ZVVybCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgZmV0Y2gocGRmRGV0YWlsc1swXSAmJiBwZGZEZXRhaWxzWzBdPy5DZXJ0aWZpY2F0ZVVybCk7XHJcbiAgICAgIGNvbnN0IGNlcnRpZmljYXRlVXJsID0gcGRmRGV0YWlsc1swXSAmJiBwZGZEZXRhaWxzWzBdPy5DZXJ0aWZpY2F0ZVVybDtcclxuICAgICAgc2F2ZUFzKGNlcnRpZmljYXRlVXJsLCBgQ2VydGlmaWNhdGVfc2lnbmVkX2J5X09wZW5TaWdu4oSiLnBkZmApO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGRvd25sb2FkIGluIGNlcnRpZmljYXRlXCIsIGVycik7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHNldElzRG93bmxvYWRpbmcoXCJjZXJ0aWZpY2F0ZVwiKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgZG9jSWQ6IHBkZkRldGFpbHNbMF0/Lm9iamVjdElkXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGRvY0RldGFpbHMgPSBhd2FpdCBheGlvcy5wb3N0KFxyXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZ2V0RG9jdW1lbnRgLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZG9jRGV0YWlscy5kYXRhICYmIGRvY0RldGFpbHMuZGF0YS5yZXN1bHQpIHtcclxuICAgICAgICBjb25zdCBkb2MgPSBkb2NEZXRhaWxzLmRhdGEucmVzdWx0O1xyXG4gICAgICAgIGlmIChkb2M/LkNlcnRpZmljYXRlVXJsKSB7XHJcbiAgICAgICAgICBhd2FpdCBmZXRjaChkb2M/LkNlcnRpZmljYXRlVXJsKTtcclxuICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlVXJsID0gZG9jPy5DZXJ0aWZpY2F0ZVVybDtcclxuICAgICAgICAgIHNhdmVBcyhjZXJ0aWZpY2F0ZVVybCwgYENlcnRpZmljYXRlX3NpZ25lZF9ieV9PcGVuU2lnbuKEoi5wZGZgKTtcclxuICAgICAgICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNldElzRG93bmxvYWRpbmcoXCJjZXJ0aWZpY2F0ZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImVyciBpbiBkb3dubG9hZCBpbiBjZXJ0aWZpY2F0ZVwiLCBlcnIpO1xyXG4gICAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQ29udGFjdCh2YWx1ZSkge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IFBhcnNlLlVzZXIuY3VycmVudCgpO1xyXG4gICAgY29uc3QgY29udGFjdGJvb2sgPSBuZXcgUGFyc2UuUXVlcnkoXCJjb250cmFjdHNfQ29udGFjdGJvb2tcIik7XHJcbiAgICBjb250YWN0Ym9vay5lcXVhbFRvKFxyXG4gICAgICBcIkNyZWF0ZWRCeVwiLFxyXG4gICAgICBQYXJzZS5Vc2VyLmNyZWF0ZVdpdGhvdXREYXRhKGN1cnJlbnRVc2VyLmlkKVxyXG4gICAgKTtcclxuICAgIGNvbnRhY3Rib29rLm5vdEVxdWFsVG8oXCJJc0RlbGV0ZWRcIiwgdHJ1ZSk7XHJcbiAgICBjb250YWN0Ym9vay5tYXRjaGVzKFwiRW1haWxcIiwgbmV3IFJlZ0V4cCh2YWx1ZSwgXCJpXCIpKTtcclxuXHJcbiAgICBjb25zdCBjb250YWN0UmVzID0gYXdhaXQgY29udGFjdGJvb2suZmluZCgpO1xyXG4gICAgaWYgKGNvbnRhY3RSZXMpIHtcclxuICAgICAgY29uc3QgcmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb250YWN0UmVzKSk7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBzdWdnZXN0aW9uczpcIiwgZXJyb3IpO1xyXG4gIH1cclxufVxyXG4vLyBgY29tcGVuc2F0ZVJvdGF0aW9uYCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB4IGFuZCB5IHBvc2l0aW9uIG9mIHdpZGdldCBvbiBwb3J0YWl0LCBsYW5kc2NhcGUgcGRmIGZvciBwZGYtbGliXHJcbmZ1bmN0aW9uIGNvbXBlbnNhdGVSb3RhdGlvbihcclxuICBwYWdlUm90YXRpb24sXHJcbiAgeCxcclxuICB5LFxyXG4gIHNjYWxlLFxyXG4gIGRpbWVuc2lvbnMsXHJcbiAgZm9udFNpemUsXHJcbiAgdXBkYXRlQ29sb3JJblJnYixcclxuICBmb250LFxyXG4gIHBhZ2VcclxuKSB7XHJcbiAgbGV0IHJvdGF0aW9uUmFkcyA9IChwYWdlUm90YXRpb24gKiBNYXRoLlBJKSAvIDE4MDtcclxuXHJcbiAgLy9UaGVzZSBjb29yZHMgYXJlIG5vdyBmcm9tIGJvdHRvbS9sZWZ0XHJcbiAgbGV0IGNvb3Jkc0Zyb21Cb3R0b21MZWZ0ID0geyB4OiB4IC8gc2NhbGUgfTtcclxuICBpZiAocGFnZVJvdGF0aW9uID09PSA5MCB8fCBwYWdlUm90YXRpb24gPT09IDI3MCkge1xyXG4gICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSA9IGRpbWVuc2lvbnMud2lkdGggLSAoeSArIGZvbnRTaXplKSAvIHNjYWxlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb29yZHNGcm9tQm90dG9tTGVmdC55ID0gZGltZW5zaW9ucy5oZWlnaHQgLSAoeSArIGZvbnRTaXplKSAvIHNjYWxlO1xyXG4gIH1cclxuXHJcbiAgbGV0IGRyYXdYID0gbnVsbDtcclxuICBsZXQgZHJhd1kgPSBudWxsO1xyXG4gIGlmIChwYWdlUm90YXRpb24gPT09IDkwKSB7XHJcbiAgICBkcmF3WCA9XHJcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpIC1cclxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguc2luKHJvdGF0aW9uUmFkcykgK1xyXG4gICAgICBkaW1lbnNpb25zLndpZHRoO1xyXG4gICAgZHJhd1kgPVxyXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC54ICogTWF0aC5zaW4ocm90YXRpb25SYWRzKSArXHJcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpO1xyXG4gIH0gZWxzZSBpZiAocGFnZVJvdGF0aW9uID09PSAxODApIHtcclxuICAgIGRyYXdYID1cclxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueCAqIE1hdGguY29zKHJvdGF0aW9uUmFkcykgLVxyXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC55ICogTWF0aC5zaW4ocm90YXRpb25SYWRzKSArXHJcbiAgICAgIGRpbWVuc2lvbnMud2lkdGg7XHJcbiAgICBkcmF3WSA9XHJcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpICtcclxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguY29zKHJvdGF0aW9uUmFkcykgK1xyXG4gICAgICBkaW1lbnNpb25zLmhlaWdodDtcclxuICB9IGVsc2UgaWYgKHBhZ2VSb3RhdGlvbiA9PT0gMjcwKSB7XHJcbiAgICBkcmF3WCA9XHJcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpIC1cclxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguc2luKHJvdGF0aW9uUmFkcyk7XHJcbiAgICBkcmF3WSA9XHJcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpICtcclxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguY29zKHJvdGF0aW9uUmFkcykgK1xyXG4gICAgICBkaW1lbnNpb25zLmhlaWdodDtcclxuICB9IGVsc2Uge1xyXG4gICAgLy9ubyByb3RhdGlvblxyXG4gICAgZHJhd1ggPSBjb29yZHNGcm9tQm90dG9tTGVmdC54O1xyXG4gICAgZHJhd1kgPSBjb29yZHNGcm9tQm90dG9tTGVmdC55O1xyXG4gIH1cclxuICBpZiAoZm9udCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgeDogZHJhd1gsXHJcbiAgICAgIHk6IGRyYXdZLFxyXG4gICAgICBmb250LFxyXG4gICAgICBjb2xvcjogdXBkYXRlQ29sb3JJblJnYixcclxuICAgICAgc2l6ZTogZm9udFNpemUsXHJcbiAgICAgIHJvdGF0ZTogcGFnZS5nZXRSb3RhdGlvbigpXHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4geyB4OiBkcmF3WCwgeTogZHJhd1kgfTtcclxuICB9XHJcbn1cclxuXHJcbi8vIGBnZXRJbWFnZVBvc2l0aW9uYCBpcyB1c2VkIHRvIGNhbHVsY2F0ZSBwb3NpdGlvbiBvZiBpbWFnZSB0eXBlIHdpZGdldCBsaWtlIHgsIHksIHdpZHRoLCBoZWlnaHQgZm9yIHBkZi1saWJcclxuZnVuY3Rpb24gZ2V0SW1hZ2VQb3NpdGlvbihwYWdlLCBpbWFnZSwgc2l6ZVJhdGlvKSB7XHJcbiAgbGV0IHBhZ2VXaWR0aDtcclxuICAvLyBwYWdlSGVpZ2h0O1xyXG4gIGlmIChbOTAsIDI3MF0uaW5jbHVkZXMocGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlKSkge1xyXG4gICAgcGFnZVdpZHRoID0gcGFnZS5nZXRIZWlnaHQoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgcGFnZVdpZHRoID0gcGFnZS5nZXRXaWR0aCgpO1xyXG4gIH1cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICBpZiAoIWltYWdlPy5oYXNPd25Qcm9wZXJ0eShcInZwV2lkdGhcIikpIHtcclxuICAgIGltYWdlW1widnBXaWR0aFwiXSA9IHBhZ2VXaWR0aDtcclxuICB9XHJcblxyXG4gIGNvbnN0IHBhZ2VSYXRpbyA9IHBhZ2VXaWR0aCAvIChpbWFnZS52cFdpZHRoICogc2l6ZVJhdGlvKTtcclxuICBjb25zdCBpbWFnZVdpZHRoID0gaW1hZ2Uud2lkdGggKiBzaXplUmF0aW8gKiBwYWdlUmF0aW87XHJcbiAgY29uc3QgaW1hZ2VIZWlnaHQgPSBpbWFnZS5oZWlnaHQgKiBzaXplUmF0aW8gKiBwYWdlUmF0aW87XHJcbiAgY29uc3QgaW1hZ2VYID0gaW1hZ2UueCAqIHNpemVSYXRpbyAqIHBhZ2VSYXRpbztcclxuICBjb25zdCBpbWFnZVlGcm9tVG9wID0gaW1hZ2UueSAqIHNpemVSYXRpbyAqIHBhZ2VSYXRpbztcclxuXHJcbiAgY29uc3QgY29ycmVjdGlvbiA9IGNvbXBlbnNhdGVSb3RhdGlvbihcclxuICAgIHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZSxcclxuICAgIGltYWdlWCxcclxuICAgIGltYWdlWUZyb21Ub3AsXHJcbiAgICAxLFxyXG4gICAgcGFnZS5nZXRTaXplKCksXHJcbiAgICBpbWFnZUhlaWdodFxyXG4gICk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB3aWR0aDogaW1hZ2VXaWR0aCxcclxuICAgIGhlaWdodDogaW1hZ2VIZWlnaHQsXHJcbiAgICB4OiBjb3JyZWN0aW9uLngsXHJcbiAgICB5OiBjb3JyZWN0aW9uLnksXHJcbiAgICByb3RhdGU6IHBhZ2UuZ2V0Um90YXRpb24oKVxyXG4gIH07XHJcbn1cclxuLy9mdW5jdGlvbiB0byB1c2UgY2FsY3VsYXRlIHBkZiByZW5kZXJpbmcgc2NhbGUgaW4gdGhlIGNvbnRhaW5lclxyXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyU2NhbGUgPSAocGRmT3JpZ2luYWxXSCwgcGFnZU51bWJlciwgY29udGFpbmVyV0gpID0+IHtcclxuICBjb25zdCBnZXRQZGZQYWdlV2lkdGggPSBwZGZPcmlnaW5hbFdILmZpbmQoXHJcbiAgICAoZGF0YSkgPT4gZGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyXHJcbiAgKTtcclxuICBjb25zdCBjb250YWluZXJTY2FsZSA9IGNvbnRhaW5lcldIPy53aWR0aCAvIGdldFBkZlBhZ2VXaWR0aD8ud2lkdGggfHwgMTtcclxuICByZXR1cm4gY29udGFpbmVyU2NhbGU7XHJcbn07XHJcblxyXG4vL2Z1bmN0aW9uIHRvIGdldCBjdXJyZW50IGxhZ3VhZ2UgYW5kIHNldCBpdCBpbiBsb2NhbFxyXG5leHBvcnQgY29uc3Qgc2F2ZUxhbmd1YWdlSW5Mb2NhbCA9IChpMThuKSA9PiB7XHJcbiAgY29uc3QgZGV0ZWN0ZWRMYW5ndWFnZSA9IGkxOG4ubGFuZ3VhZ2UgfHwgXCJlblwiO1xyXG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaTE4bmV4dExuZ1wiLCBkZXRlY3RlZExhbmd1YWdlKTtcclxufTtcclxuIiwiaW1wb3J0IGxvZ28gZnJvbSBcIi4uL2Fzc2V0cy9pbWFnZXMvbG9nby5wbmdcIjtcclxuZXhwb3J0IGNvbnN0IGFwcEluZm8gPSB7XHJcbiAgYXBwbG9nbzogbG9nbyxcclxuICBhcHBJZDogcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0FQUElEID8gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0FQUElEIDogXCJvcGVuc2lnblwiLFxyXG4gIGJhc2VVcmw6IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9TRVJWRVJVUkxcclxuICAgID8gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NFUlZFUlVSTFxyXG4gICAgOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvYXBpL2FwcFwiLFxyXG4gIGRlZmF1bHRSb2xlOiBcImNvbnRyYWN0c19Vc2VyXCIsXHJcbiAgZmJBcHBJZDogcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0ZCQVBQSURcclxuICAgID8gYCR7cHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0ZCQVBQSUR9YFxyXG4gICAgOiBcIlwiLFxyXG4gIGZldl9JY29uOlxyXG4gICAgXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdDQVlBQUFCWEF2bUhBQUFBQVhOU1IwSUFyczRjNlFBQUFMbEpSRUZVYUVQdG1OME53akFNQnBOeFlES1lpTTFZcDkwZzkzQ0tTdEgxTmJJZGZ6OTIxRGtlcjJQYytKczFjREY3TVhBeEFTTUdZa0FpZ0JJNnZoOVp3b1hQNTN1Wm9BWWN2aHdkQTNtQVZiSTJhU2IrOXpGS1U0SVVSQjZqL0hvUFVJRWEyRzNpR0lBaFFRRGxBVUlvRTJkaWFiSWtsSVNTME5vRlBlYm83N1JGNk9lbkVGM1FudE9tMTI4aGUwR0tyd0h5QUNGb3oyTWdCcVNHa3BBRWNIczQ3b0h0TjVBRmFrQUNxTU5qUUVNb0U4U0FCRkNIbjRIRTJ6R0hTTGVFQUFBQUFFbEZUa1N1UW1DQ1wiLFxyXG4gIGdvb2dsZUNsaWV0SWQ6IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9HT09HTEVDTElFTlRJRFxyXG4gICAgPyBgJHtwcm9jZXNzLmVudi5SRUFDVF9BUFBfR09PR0xFQ0xJRU5USUR9YFxyXG4gICAgOiBcIlwiLFxyXG4gIG1ldGFEZXNjcmlwdGlvbjpcclxuICAgIFwiVGhlIGZhc3Rlc3Qgd2F5IHRvIHNpZ24gUERGcyAmIHJlcXVlc3Qgc2lnbmF0dXJlcyBmcm9tIG90aGVycy5cIixcclxuICBzZXR0aW5nczogW1xyXG4gICAge1xyXG4gICAgICByb2xlOiBcImNvbnRyYWN0c19BZG1pblwiLFxyXG4gICAgICBtZW51SWQ6IFwiVlBoOTFoMFpIa1wiLFxyXG4gICAgICBwYWdlVHlwZTogXCJkYXNoYm9hcmRcIixcclxuICAgICAgcGFnZUlkOiBcIjM1S0JvU2dvQUtcIixcclxuICAgICAgZXh0ZW5kZWRfY2xhc3M6IFwiY29udHJhY3RzX1VzZXJzXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHJvbGU6IFwiY29udHJhY3RzX09yZ0FkbWluXCIsXHJcbiAgICAgIG1lbnVJZDogXCJWUGg5MWgwWkhrXCIsXHJcbiAgICAgIHBhZ2VUeXBlOiBcImRhc2hib2FyZFwiLFxyXG4gICAgICBwYWdlSWQ6IFwiMzVLQm9TZ29BS1wiLFxyXG4gICAgICBleHRlbmRlZF9jbGFzczogXCJjb250cmFjdHNfVXNlcnNcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcm9sZTogXCJjb250cmFjdHNfRWRpdG9yXCIsXHJcbiAgICAgIG1lbnVJZDogXCJIOXZSZkVZS2hUXCIsXHJcbiAgICAgIHBhZ2VUeXBlOiBcImRhc2hib2FyZFwiLFxyXG4gICAgICBwYWdlSWQ6IFwiMzVLQm9TZ29BS1wiLFxyXG4gICAgICBleHRlbmRlZF9jbGFzczogXCJjb250cmFjdHNfVXNlcnNcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcm9sZTogXCJjb250cmFjdHNfVXNlclwiLFxyXG4gICAgICBtZW51SWQ6IFwiSDl2UmZFWUtoVFwiLFxyXG4gICAgICBwYWdlVHlwZTogXCJkYXNoYm9hcmRcIixcclxuICAgICAgcGFnZUlkOiBcIjM1S0JvU2dvQUtcIixcclxuICAgICAgZXh0ZW5kZWRfY2xhc3M6IFwiY29udHJhY3RzX1VzZXJzXCJcclxuICAgIH1cclxuICBdXHJcbn07XHJcbiIsImV4cG9ydCBjb25zdCBjb250YWN0Q2xzID0gXCJjb250cmFjdHNfQ29udGFjdGJvb2tcIjtcclxuZXhwb3J0IGNvbnN0IHRlbXBsYXRlQ2xzID0gXCJjb250cmFjdHNfVGVtcGxhdGVcIjtcclxuZXhwb3J0IGNvbnN0IGRvY3VtZW50Q2xzID0gXCJjb250cmFjdHNfRG9jdW1lbnRcIjtcclxuZXhwb3J0IGNvbnN0IHRoZW1lQ29sb3IgPSBcIiM0N2EzYWRcIjtcclxuZXhwb3J0IGNvbnN0IGljb25Db2xvciA9IFwiIzY4Njk2OFwiO1xyXG5leHBvcnQgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcclxuZXhwb3J0IGNvbnN0IGlzRW5hYmxlU3Vic2NyaXB0aW9uID1cclxuICBwcm9jZXNzLmVudi5SRUFDVF9BUFBfRU5BQkxFX1NVQlNDUklQVElPTiAmJlxyXG4gIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9FTkFCTEVfU1VCU0NSSVBUSU9OPy50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIlxyXG4gICAgPyB0cnVlXHJcbiAgICA6IGZhbHNlO1xyXG5leHBvcnQgY29uc3QgaXNTdGFnaW5nID1cclxuICB3aW5kb3cubG9jYXRpb24ub3JpZ2luID09PSBcImh0dHBzOi8vc3RhZ2luZy1hcHAub3BlbnNpZ25sYWJzLmNvbVwiO1xyXG4iLCJpbXBvcnQgeyBpc1N0YWdpbmcgfSBmcm9tIFwiLi4vY29uc3RhbnQvY29uc3RcIjtcclxuXHJcbmNvbnN0IHBsYW5zID0gW1xyXG4gIHtcclxuICAgIHBsYW5OYW1lOiBcIk9QRU5TSUdO4oSiIEZSRUVcIixcclxuICAgIGltZzogXCJmcmVlLnBuZ1wiLFxyXG4gICAgY3VycmVuY3k6IFwiXCIsXHJcbiAgICBtb250aGx5UHJpY2U6IFwiRnJlZVwiLFxyXG4gICAgeWVhcmx5UHJpY2U6IFwiRnJlZVwiLFxyXG4gICAgc3VidGl0bGU6IFwiRnJlZSBVbmxpbWl0ZWQgRS1zaWduYXR1cmVzLCBGb3JldmVyLlwiLFxyXG4gICAgYnRuOiB7IHRleHQ6IFwiU3Vic2NyaWJlXCIsIGNvbG9yOiBcIm9wLWJ0bi1wcmltYXJ5XCIgfSxcclxuICAgIHVybDogXCJcIixcclxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcclxuICAgIGJlbmVmaXRzOiBbXHJcbiAgICAgIFwiVW5saW1pdGVkIGVudmVsb3Blc1wiLFxyXG4gICAgICBcIlNpZ24gZG9jdW1lbnRzIHlvdXJzZWxmXCIsXHJcbiAgICAgIFwiUmVxdWVzdCBzaWduYXR1cmVzIGZyb20gb3RoZXJzXCIsXHJcbiAgICAgIFwiMTQgZmllbGQgdHlwZXNcIixcclxuICAgICAgXCJBdXRvbWF0aWMgZS1zaWduYXR1cmVzXCIsXHJcbiAgICAgIFwiQ29tcGxldGlvbiBjZXJ0aWZpY2F0ZXNcIixcclxuICAgICAgXCJTZW5kIGluIG9yZGVyXCIsXHJcbiAgICAgIFwiRG9jdW1lbnQgdGVtcGxhdGVzXCIsXHJcbiAgICAgIFwiSW1wb3J0IGZyb20gRHJvcGJveFwiLFxyXG4gICAgICBcIkNvbnRhY3QgYm9va1wiLFxyXG4gICAgICBcIkRvY3VtZW50IGV4cGlyeSBzdXBwb3J0XCIsXHJcbiAgICAgIFwiRGVjbGluZSBkb2N1bWVudCBzdXBwb3J0XCIsXHJcbiAgICAgIFwiRW1haWwgbm90aWZpY2F0aW9uc1wiLFxyXG4gICAgICBcIlJlY2lwaWVudCBhdXRoZW50aWNhdGlvbiB1c2luZyBPVFBcIixcclxuICAgICAgXCJCdWxrIHNlbmQgKHVwdG8gNSBkb2NzKVwiLFxyXG4gICAgICBcIlB1YmxpYyBwcm9maWxlc1wiLFxyXG4gICAgICBcIkFuZCBtdWNoIG1vcmVcIlxyXG4gICAgXSxcclxuICAgIHllYXJseUJlbmVmaXRzOiBbXHJcbiAgICAgIFwiVW5saW1pdGVkIGVudmVsb3Blc1wiLFxyXG4gICAgICBcIlNpZ24gZG9jdW1lbnRzIHlvdXJzZWxmXCIsXHJcbiAgICAgIFwiUmVxdWVzdCBzaWduYXR1cmVzIGZyb20gb3RoZXJzXCIsXHJcbiAgICAgIFwiMTQgZmllbGQgdHlwZXNcIixcclxuICAgICAgXCJBdXRvbWF0aWMgZS1zaWduYXR1cmVzXCIsXHJcbiAgICAgIFwiQ29tcGxldGlvbiBjZXJ0aWZpY2F0ZXNcIixcclxuICAgICAgXCJTZW5kIGluIG9yZGVyXCIsXHJcbiAgICAgIFwiRG9jdW1lbnQgdGVtcGxhdGVzXCIsXHJcbiAgICAgIFwiSW1wb3J0IGZyb20gRHJvcGJveFwiLFxyXG4gICAgICBcIkNvbnRhY3QgYm9va1wiLFxyXG4gICAgICBcIkRvY3VtZW50IGV4cGlyeSBzdXBwb3J0XCIsXHJcbiAgICAgIFwiRGVjbGluZSBkb2N1bWVudCBzdXBwb3J0XCIsXHJcbiAgICAgIFwiRW1haWwgbm90aWZpY2F0aW9uc1wiLFxyXG4gICAgICBcIlJlY2lwaWVudCBhdXRoZW50aWNhdGlvbiB1c2luZyBPVFBcIixcclxuICAgICAgXCJCdWxrIHNlbmQgKHVwdG8gNSBkb2NzKVwiLFxyXG4gICAgICBcIlB1YmxpYyBwcm9maWxlc1wiLFxyXG4gICAgICBcIkFuZCBtdWNoIG1vcmVcIlxyXG4gICAgXVxyXG4gIH0sXHJcbiAge1xyXG4gICAgcGxhbk5hbWU6IFwiT1BFTlNJR07ihKIgUFJPRkVTU0lPTkFMXCIsXHJcbiAgICBpbWc6IFwicHJvZmVzc2lvbmFsLnBuZ1wiLFxyXG4gICAgY3VycmVuY3k6IFwiJFwiLFxyXG4gICAgbW9udGhseVByaWNlOiBcIjI5Ljk5XCIsXHJcbiAgICB5ZWFybHlQcmljZTogYDkuOTk8c3VwIHN0eWxlPVwiZm9udC1zaXplOiAxN3B4O1wiPi9tb250aDwvc3VwPmAsXHJcbiAgICBzdWJ0aXRsZTogXCJFeGNsdXNpdmUgQWNjZXNzIHRvIGFkdmFuY2VkIGZlYXR1cmVzLlwiLFxyXG4gICAgYnRuOiB7IHRleHQ6IFwiU3Vic2NyaWJlXCIsIGNvbG9yOiBcIm9wLWJ0bi1wcmltYXJ5XCIgfSxcclxuICAgIHVybDogaXNTdGFnaW5nXHJcbiAgICAgID8gXCJodHRwczovL2JpbGxpbmcuem9oby5pbi9zdWJzY3JpYmUvOTYyN2Y2MmEwOWRmMWM4Y2U1MDBmMmY0ZGM4MzI4ZGQ4NGVjZGEyMGVlYWUxMzg3OGNlNTgxZDYwMjQwZjIwNi9wcm8td2Vla2x5XCJcclxuICAgICAgOiBcImh0dHBzOi8vYmlsbGluZy5vcGVuc2lnbmxhYnMuY29tL3N1YnNjcmliZS9lZjc5ODQ4NmU2YTBhMTFlYTY1ZjJiYWU4ZjJhZjkwMWQxYTA5ZGZhODA4NTU4NWNkZDRlYzRkN2YzMjEzN2YzL3Byb2Zlc3Npb25hbC1tb250aGx5XCIsXHJcbiAgICB5ZWFybHlVcmw6IGlzU3RhZ2luZ1xyXG4gICAgICA/IFwiaHR0cHM6Ly9iaWxsaW5nLnpvaG8uaW4vc3Vic2NyaWJlLzk2MjdmNjJhMDlkZjFjOGNlNTAwZjJmNGRjODMyOGRkYzE4NDQxMTEyOTIyNGYxZjI5ZWQ4NGY2Y2VmM2I4NjIvcHJvLXllYXJseVwiXHJcbiAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDFkOGFkMTEzNTE5MGRmZjk1MTMzMDM2MGU0NzU4NWE3MS9wcm9mZXNzaW9uYWwteWVhcmx5XCIsXHJcbiAgICB0YXJnZXQ6IFwiX3NlbGZcIixcclxuICAgIGJlbmVmaXRzOiBbXHJcbiAgICAgIFwiRXZlcnl0aGluZyBpbiBPcGVuU2lnbuKEoiBmcmVlXCIsXHJcbiAgICAgIFwiRmllbGQgdmFsaWRhdGlvbnNcIixcclxuICAgICAgXCJSZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGlvbnNcIixcclxuICAgICAgXCJPcmdhbml6ZSBkb2NzIGluIE9wZW5TaWdu4oSiIERyaXZlXCIsXHJcbiAgICAgIFwiV2ViaG9va3NcIixcclxuICAgICAgXCJaYXBpZXIgaW50ZWdyYXRpb25cIixcclxuICAgICAgXCJBUEkgQWNjZXNzXCIsXHJcbiAgICAgIFwiMTAwIEFQSSBzaWduYXR1cmVzIGluY2x1ZGVkXCIsXHJcbiAgICAgIFwiQ3VzdG9tIGVtYWlsIHRlbXBsYXRlc1wiLFxyXG4gICAgICBcIkF1dG8gcmVtaW5kZXJzXCIsXHJcbiAgICAgIFwiQnVsayBzZW5kICh1cHRvIDIwIGRvY3MpXCIsXHJcbiAgICAgIFwiUHJlbWl1bSBQdWJsaWMgcHJvZmlsZSB1c2VybmFtZXNcIixcclxuICAgICAgXCJFbWJlZGRpbmcgKGNvbWluZyBzb29uKVwiXHJcbiAgICBdLFxyXG4gICAgeWVhcmx5QmVuZWZpdHM6IFtcclxuICAgICAgXCJFdmVyeXRoaW5nIGluIE9wZW5TaWdu4oSiIGZyZWVcIixcclxuICAgICAgXCJGaWVsZCB2YWxpZGF0aW9uc1wiLFxyXG4gICAgICBcIlJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0aW9uc1wiLFxyXG4gICAgICBcIk9yZ2FuaXplIGRvY3MgaW4gT3BlblNpZ27ihKIgRHJpdmVcIixcclxuICAgICAgXCJXZWJob29rc1wiLFxyXG4gICAgICBcIlphcGllciBpbnRlZ3JhdGlvblwiLFxyXG4gICAgICBcIkFQSSBBY2Nlc3NcIixcclxuICAgICAgXCIyNDAgQVBJIHNpZ25hdHVyZXMgaW5jbHVkZWRcIixcclxuICAgICAgXCJDdXN0b20gZW1haWwgdGVtcGxhdGVzXCIsXHJcbiAgICAgIFwiQXV0byByZW1pbmRlcnNcIixcclxuICAgICAgXCJCdWxrIHNlbmQgKHVwdG8gMjAgZG9jcylcIixcclxuICAgICAgXCJQcmVtaXVtIFB1YmxpYyBwcm9maWxlIHVzZXJuYW1lc1wiLFxyXG4gICAgICBcIkVtYmVkZGluZyAoY29taW5nIHNvb24pXCJcclxuICAgIF1cclxuICB9LFxyXG4gIHtcclxuICAgIHBsYW5OYW1lOiBcIk9QRU5TSUdO4oSiIFRFQU1TXCIsXHJcbiAgICBpbWc6IFwidGVhbXMucG5nXCIsXHJcbiAgICBjdXJyZW5jeTogXCIkXCIsXHJcbiAgICBtb250aGx5UHJpY2U6IGAzOS45OTxzdXAgc3R5bGU9XCJmb250LXNpemU6IDE3cHg7XCI+L3VzZXI8L3N1cD5gLFxyXG4gICAgeWVhcmx5UHJpY2U6IGAxOS45OTxzdXAgc3R5bGU9XCJmb250LXNpemU6IDE3cHg7XCI+L3VzZXIvbW9udGg8L3N1cD5gLFxyXG4gICAgc3VidGl0bGU6IFwiRXhjbHVzaXZlIEFjY2VzcyB0byBhZHZhbmNlZCBmZWF0dXJlcy5cIixcclxuICAgIGJ0bjogeyB0ZXh0OiBcIlN1YnNjcmliZVwiLCBjb2xvcjogXCJvcC1idG4tYWNjZW50XCIgfSxcclxuICAgIHVybDogaXNTdGFnaW5nXHJcbiAgICAgID8gXCJodHRwczovL2JpbGxpbmcuem9oby5pbi9zdWJzY3JpYmUvZWQ4MDk3MjczYTgyYjZiZjM5ODkyYzExYTNiYjNjMzgxZWIyNzA1NzM2MDE0Y2ZiZGJkZTFjY2YxYzdhMTg5ZC90ZWFtLXdlZWtseVwiXHJcbiAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDEyMzdkMDcwMmJmYWE5NTk0MDYzMDY2MzVkODBmMTM4Yy90ZWFtcy1tb250aGx5XCIsXHJcbiAgICB5ZWFybHlVcmw6IGlzU3RhZ2luZ1xyXG4gICAgICA/IFwiaHR0cHM6Ly9iaWxsaW5nLnpvaG8uaW4vc3Vic2NyaWJlL2VkODA5NzI3M2E4MmI2YmYzOTg5MmMxMWEzYmIzYzM4MWViMjcwNTczNjAxNGNmYmRiZGUxY2NmMWM3YTE4OWQvdGVhbS13ZWVrbHlcIlxyXG4gICAgICA6IFwiaHR0cHM6Ly9iaWxsaW5nLm9wZW5zaWdubGFicy5jb20vc3Vic2NyaWJlL2VmNzk4NDg2ZTZhMGExMWVhNjVmMmJhZThmMmFmOTAxMWE4NjQ5OTRiYmVlZWM3MWZjZjEwNjE4ODYzMDE5OWQvdGVhbXMteWVhcmx5XCIsXHJcbiAgICB0YXJnZXQ6IFwiX3NlbGZcIixcclxuICAgIGJlbmVmaXRzOiBbXHJcbiAgICAgIFwiRXZlcnl0aGluZyBpbiBPcGVuU2lnbuKEoiBwcm9mZXNzaW9uYWxcIixcclxuICAgICAgXCIxMDAgQVBJIHNpZ25hdHVyZXMgaW5jbHVkZWRcIixcclxuICAgICAgXCJUZWFtcyBhbmQgT3JnYW5pemF0aW9uc1wiLFxyXG4gICAgICBcIlNoYXJlIFRlbXBsYXRlcyB3aXRoIHRlYW1zXCIsXHJcbiAgICAgIFwiU2hhcmUgVGVtcGxhdGVzIHdpdGggaW5kaXZpZHVhbHNcIixcclxuICAgICAgXCJEb2N1bWVudElkIHJlbW92YWwgZnJvbSBzaWduZWQgZG9jc1wiLFxyXG4gICAgICBcIkJ1bGsgc2VuZCAodXB0byA1MCBkb2NzKVwiLFxyXG4gICAgICBcIlJlcXVlc3QgUGF5bWVudHMgKGNvbWluZyBzb29uKVwiLFxyXG4gICAgICBcIk1vYmlsZSBhcHAgKGNvbWluZyBzb29uKVwiXHJcbiAgICBdLFxyXG4gICAgeWVhcmx5QmVuZWZpdHM6IFtcclxuICAgICAgXCJFdmVyeXRoaW5nIGluIE9wZW5TaWdu4oSiIHByb2Zlc3Npb25hbFwiLFxyXG4gICAgICBcIjUwMCBBUEkgc2lnbmF0dXJlcyBpbmNsdWRlZFwiLFxyXG4gICAgICBcIlRlYW1zIGFuZCBPcmdhbml6YXRpb25zXCIsXHJcbiAgICAgIFwiU2hhcmUgVGVtcGxhdGVzIHdpdGggdGVhbXNcIixcclxuICAgICAgXCJTaGFyZSBUZW1wbGF0ZXMgd2l0aCBpbmRpdmlkdWFsc1wiLFxyXG4gICAgICBcIkRvY3VtZW50SWQgcmVtb3ZhbCBmcm9tIHNpZ25lZCBkb2NzXCIsXHJcbiAgICAgIFwiQnVsayBzZW5kICh1cHRvIDUwIGRvY3MpXCIsXHJcbiAgICAgIFwiUmVxdWVzdCBQYXltZW50cyAoY29taW5nIHNvb24pXCIsXHJcbiAgICAgIFwiTW9iaWxlIGFwcCAoY29taW5nIHNvb24pXCJcclxuICAgIF1cclxuICB9LFxyXG4gIHtcclxuICAgIHBsYW5OYW1lOiBcIk9QRU5TSUdO4oSiIEVOVEVSUFJJU0VcIixcclxuICAgIGltZzogXCJlbnRlcnByaXNlLnBuZ1wiLFxyXG4gICAgY3VycmVuY3k6IFwiXCIsXHJcbiAgICBtb250aGx5UHJpY2U6IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMjJweDtcIj5SZXF1ZXN0IFByaWNlPC9wPmAsXHJcbiAgICB5ZWFybHlQcmljZTogYDxwIHN0eWxlPVwiZm9udC1zaXplOiAyMnB4O1wiPlJlcXVlc3QgUHJpY2U8L3A+YCxcclxuICAgIHN1YnRpdGxlOiBcIlNjYWxhYmxlIEZlYXR1cmVzIHdpdGggcHJpb3JpdHkgc3VwcG9ydC5cIixcclxuICAgIGJ0bjogeyB0ZXh0OiBcIkNvbnRhY3QgdXNcIiwgY29sb3I6IFwib3AtYnRuLXByaW1hcnlcIiB9LFxyXG4gICAgdXJsOiBcImh0dHBzOi8vd3d3Lm9wZW5zaWdubGFicy5jb20vY29udGFjdC11c1wiLFxyXG4gICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxyXG4gICAgYmVuZWZpdHM6IFtcclxuICAgICAgXCJBbGwgZmVhdHVyZXNcIixcclxuICAgICAgXCJDdXN0b20gZG9tYWluXCIsXHJcbiAgICAgIFwiQ3VzdG9tIGJyYW5kaW5nXCIsXHJcbiAgICAgIFwiVXB0aW1lIFNMQVwiLFxyXG4gICAgICBcIlNTTyBzdXBwb3J0XCIsXHJcbiAgICAgIFwiUHJpb3JpdHkgc3VwcG9ydFwiXHJcbiAgICBdLFxyXG4gICAgeWVhcmx5QmVuZWZpdHM6IFtcclxuICAgICAgXCJBbGwgZmVhdHVyZXNcIixcclxuICAgICAgXCJDdXN0b20gZG9tYWluXCIsXHJcbiAgICAgIFwiQ3VzdG9tIGJyYW5kaW5nXCIsXHJcbiAgICAgIFwiVXB0aW1lIFNMQVwiLFxyXG4gICAgICBcIlNTTyBzdXBwb3J0XCIsXHJcbiAgICAgIFwiUHJpb3JpdHkgc3VwcG9ydFwiXHJcbiAgICBdXHJcbiAgfVxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IHZhbGlkcGxhbiA9IHtcclxuICBcInRlYW0td2Vla2x5XCI6IHRydWUsXHJcbiAgXCJ0ZWFtLXllYXJseVwiOiB0cnVlLFxyXG4gIFwidGVhbXMtbW9udGhseVwiOiB0cnVlLFxyXG4gIFwidGVhbXMteWVhcmx5XCI6IHRydWUsXHJcbiAgXCJlbnRlcnByaXNlLW1vbnRobHlcIjogdHJ1ZSxcclxuICBcImVudGVycHJpc2UteWVhcmx5XCI6IHRydWVcclxufTtcclxuZXhwb3J0IGRlZmF1bHQgcGxhbnM7XHJcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgaXNFbmFibGVTdWJzY3JpcHRpb24sIGlzU3RhZ2luZywgdGhlbWVDb2xvciB9IGZyb20gXCIuLi9jb25zdGFudC9jb25zdFwiO1xyXG5pbXBvcnQgeyBQREZEb2N1bWVudCB9IGZyb20gXCJwZGYtbGliXCI7XHJcbmltcG9ydCBcIi4uL3N0eWxlcy9zaWduYXR1cmUuY3NzXCI7XHJcbmltcG9ydCBQYXJzZSBmcm9tIFwicGFyc2VcIjtcclxuaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xyXG5pbXBvcnQgeyBEbmRQcm92aWRlciB9IGZyb20gXCJyZWFjdC1kbmRcIjtcclxuaW1wb3J0IHsgSFRNTDVCYWNrZW5kIH0gZnJvbSBcInJlYWN0LWRuZC1odG1sNS1iYWNrZW5kXCI7XHJcbmltcG9ydCBTaWduUGFkIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9TaWduUGFkXCI7XHJcbmltcG9ydCBSZW5kZXJBbGxQZGZQYWdlIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9SZW5kZXJBbGxQZGZQYWdlXCI7XHJcbmltcG9ydCBUb3VyIGZyb20gXCJyZWFjdG91clwiO1xyXG5pbXBvcnQgQ29uZmV0dGkgZnJvbSBcInJlYWN0LWNvbmZldHRpXCI7XHJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5pbXBvcnQge1xyXG4gIGNvbnRyYWN0RG9jdW1lbnQsXHJcbiAgbXVsdGlTaWduRW1iZWQsXHJcbiAgZW1iZWREb2NJZCxcclxuICBwZGZOZXdXaWR0aEZ1bixcclxuICBzaWduUGRmRnVuLFxyXG4gIG9uSW1hZ2VTZWxlY3QsXHJcbiAgb25TYXZlU2lnbixcclxuICBvblNhdmVJbWFnZSxcclxuICBhZGREZWZhdWx0U2lnbmF0dXJlSW1nLFxyXG4gIHJhZGlvQnV0dG9uV2lkZ2V0LFxyXG4gIHJlcGxhY2VNYWlsVmFyaWJsZXMsXHJcbiAgZmV0Y2hTdWJzY3JpcHRpb24sXHJcbiAgY29udmVydFBkZkFycmF5QnVmZmVyLFxyXG4gIGNvbnRyYWN0VXNlcnMsXHJcbiAgaGFuZGxlU2VuZE9UUCxcclxuICBjb250YWN0Qm9vayxcclxuICBoYW5kbGVEb3dubG9hZFBkZixcclxuICBoYW5kbGVUb1ByaW50LFxyXG4gIGhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGVcclxufSBmcm9tIFwiLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuaW1wb3J0IExvYWRlcldpdGhNc2cgZnJvbSBcIi4uL3ByaW1pdGl2ZXMvTG9hZGVyV2l0aE1zZ1wiO1xyXG5pbXBvcnQgSGFuZGxlRXJyb3IgZnJvbSBcIi4uL3ByaW1pdGl2ZXMvSGFuZGxlRXJyb3JcIjtcclxuaW1wb3J0IEhlYWRlciBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvUGRmSGVhZGVyXCI7XHJcbmltcG9ydCBSZW5kZXJQZGYgZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1JlbmRlclBkZlwiO1xyXG5pbXBvcnQgUGRmRGVjbGluZU1vZGFsIGZyb20gXCIuLi9wcmltaXRpdmVzL1BkZkRlY2xpbmVNb2RhbFwiO1xyXG5pbXBvcnQgVGl0bGUgZnJvbSBcIi4uL2NvbXBvbmVudHMvVGl0bGVcIjtcclxuaW1wb3J0IERlZmF1bHRTaWduYXR1cmUgZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL0RlZmF1bHRTaWduYXR1cmVcIjtcclxuaW1wb3J0IE1vZGFsVWkgZnJvbSBcIi4uL3ByaW1pdGl2ZXMvTW9kYWxVaVwiO1xyXG5pbXBvcnQgVG91ckNvbnRlbnRXaXRoQnRuIGZyb20gXCIuLi9wcmltaXRpdmVzL1RvdXJDb250ZW50V2l0aEJ0blwiO1xyXG5pbXBvcnQgTG9hZGVyIGZyb20gXCIuLi9wcmltaXRpdmVzL0xvYWRlclwiO1xyXG5pbXBvcnQgeyB1c2VTZWxlY3RvciB9IGZyb20gXCJyZWFjdC1yZWR1eFwiO1xyXG5pbXBvcnQgU2lnbmVyTGlzdENvbXBvbmVudCBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvU2lnbmVyTGlzdENvbXBvbmVudFwiO1xyXG5pbXBvcnQgVmVyaWZ5RW1haWwgZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1ZlcmlmeUVtYWlsXCI7XHJcbmltcG9ydCBQZGZab29tIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9QZGZab29tXCI7XHJcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcclxuXHJcbmZ1bmN0aW9uIFBkZlJlcXVlc3RGaWxlcyhwcm9wcykge1xyXG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcclxuICBjb25zdCBbcGRmRGV0YWlscywgc2V0UGRmRGV0YWlsc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgY29uc3QgW3NpZ25lZFNpZ25lcnMsIHNldFNpZ25lZFNpZ25lcnNdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IFt1bnNpZ25lZFNpZ25lcnMsIHNldFVuU2lnbmVkU2lnbmVyc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgY29uc3QgW2lzU2lnblBhZCwgc2V0SXNTaWduUGFkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbcGRmVXJsLCBzZXRQZGZVcmxdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbYWxsUGFnZXMsIHNldEFsbFBhZ2VzXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gIGNvbnN0IG51bVBhZ2VzID0gMTtcclxuICBjb25zdCBbcGFnZU51bWJlciwgc2V0UGFnZU51bWJlcl0gPSB1c2VTdGF0ZSgxKTtcclxuICBjb25zdCBbaW1hZ2UsIHNldEltYWdlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gIGNvbnN0IFtpc0ltYWdlU2VsZWN0LCBzZXRJc0ltYWdlU2VsZWN0XSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc2lnbmF0dXJlLCBzZXRTaWduYXR1cmVdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbaXNTdGFtcCwgc2V0SXNTdGFtcF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3NpZ25LZXksIHNldFNpZ25LZXldID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbaW1nV0gsIHNldEltZ1dIXSA9IHVzZVN0YXRlKHt9KTtcclxuICBjb25zdCBpbWFnZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICBjb25zdCBbaGFuZGxlRXJyb3IsIHNldEhhbmRsZUVycm9yXSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW3NlbGVjdFdpZGdldElkLCBzZXRTZWxlY3RXaWRnZXRJZF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbb3RwTG9hZGVyLCBzZXRPdHBMb2FkZXJdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc0NlbGVicmF0aW9uLCBzZXRJc0NlbGVicmF0aW9uXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbcmVxdWVzdFNpZ25Ub3VyLCBzZXRSZXF1ZXN0U2lnblRvdXJdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFt0b3VyU3RhdHVzLCBzZXRUb3VyU3RhdHVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoe1xyXG4gICAgaXNMb2FkOiB0cnVlLFxyXG4gICAgbWVzc2FnZTogdChcImxvYWRpbmctbXNzZ1wiKVxyXG4gIH0pO1xyXG4gIGNvbnN0IFtkZWZhdWx0U2lnbkltZywgc2V0RGVmYXVsdFNpZ25JbWddID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbaXNEb2NJZCwgc2V0SXNEb2NJZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3BkZk5ld1dpZHRoLCBzZXRQZGZOZXdXaWR0aF0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtwZGZPcmlnaW5hbFdILCBzZXRQZGZPcmlnaW5hbFdIXSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCBbc2lnbmVyUG9zLCBzZXRTaWduZXJQb3NdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IFtzaWduZXJPYmplY3RJZCwgc2V0U2lnbmVyT2JqZWN0SWRdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbaXNVaUxvYWRpbmcsIHNldElzVWlMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNEZWNsaW5lLCBzZXRJc0RlY2xpbmVdID0gdXNlU3RhdGUoeyBpc0RlY2xpbmVkOiBmYWxzZSB9KTtcclxuICBjb25zdCBbY3VycmVudFNpZ25lciwgc2V0Q3VycmVudFNpZ25lcl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzQWxlcnQsIHNldElzQWxlcnRdID0gdXNlU3RhdGUoeyBpc1Nob3c6IGZhbHNlLCBhbGVydE1lc3NhZ2U6IFwiXCIgfSk7XHJcbiAgY29uc3QgW3VuU2lnbmVkV2lkZ2V0SWQsIHNldFVuU2lnbmVkV2lkZ2V0SWRdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2V4cGlyZWREYXRlLCBzZXRFeHBpcmVkRGF0ZV0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbaXNSZXNpemUsIHNldElzUmVzaXplXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc2lnbmVyVXNlcklkLCBzZXRTaWduZXJVc2VySWRdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbaXNEb250U2hvdywgc2V0SXNEb250U2hvd10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzRG93bmxvYWRpbmcsIHNldElzRG93bmxvYWRpbmddID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2RlZmF1bHRTaWduQWxlcnQsIHNldERlZmF1bHRTaWduQWxlcnRdID0gdXNlU3RhdGUoe1xyXG4gICAgaXNTaG93OiBmYWxzZSxcclxuICAgIGFsZXJ0TWVzc2FnZTogXCJcIlxyXG4gIH0pO1xyXG4gIGNvbnN0IFtpc1N1YnNjcmliZWQsIHNldElzU3Vic2NyaWJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzQ29tcGxldGVkLCBzZXRJc0NvbXBsZXRlZF0gPSB1c2VTdGF0ZSh7XHJcbiAgICBpc0NlcnRpZmljYXRlOiBmYWxzZSxcclxuICAgIGlzTW9kYWw6IGZhbHNlXHJcbiAgfSk7XHJcbiAgY29uc3QgW215SW5pdGlhbCwgc2V0TXlJbml0aWFsXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtpc0luaXRpYWwsIHNldElzSW5pdGlhbF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3BkZkxvYWQsIHNldFBkZkxvYWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc1NpZ25lZCwgc2V0SXNTaWduZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc0V4cGlyZWQsIHNldElzRXhwaXJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2FscmVhZHlTaWduLCBzZXRBbHJlYWR5U2lnbl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2NvbnRhaW5lcldILCBzZXRDb250YWluZXJXSF0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgY29uc3QgW3ZhbGlkYXRlQWxlcnQsIHNldFZhbGlkYXRlQWxlcnRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFt3aWRnZXRzVG91ciwgc2V0V2lkZ2V0c1RvdXJdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFttaW5SZXF1aXJlZENvdW50LCBzZXRtaW5SZXF1aXJlZENvdW50XSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW3NlbmRJbk9yZGVyLCBzZXRTZW5kSW5PcmRlcl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2N1cnJXaWRnZXRzRGV0YWlscywgc2V0Q3VycldpZGdldHNEZXRhaWxzXSA9IHVzZVN0YXRlKHt9KTtcclxuICBjb25zdCBbaXNTdWJzY3JpcHRpb25FeHBpcmVkLCBzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtleHRVc2VySWQsIHNldEV4dFVzZXJJZF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbaXNFbWFpbFZlcmlmaWVkLCBzZXRJc0VtYWlsVmVyaWZpZWRdID0gdXNlU3RhdGUodHJ1ZSk7XHJcbiAgY29uc3QgW2lzVmVyaWZ5TW9kYWwsIHNldElzVmVyaWZ5TW9kYWxdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtvdHAsIHNldE90cF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbY29udHJhY3ROYW1lLCBzZXRDb250cmFjdE5hbWVdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW3pvb21QZXJjZW50LCBzZXRab29tUGVyY2VudF0gPSB1c2VTdGF0ZSgwKTtcclxuICBjb25zdCBbdG90YWxab29tUGVyY2VudCwgc2V0VG90YWxab29tUGVyY2VudF0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtzY2FsZSwgc2V0U2NhbGVdID0gdXNlU3RhdGUoMSk7XHJcbiAgY29uc3QgW3VuaXF1ZUlkLCBzZXRVbmlxdWVJZF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbaXNQdWJsaWNUZW1wbGF0ZSwgc2V0SXNQdWJsaWNUZW1wbGF0ZV0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2NvbnRhY3QsIHNldENvbnRhY3RdID0gdXNlU3RhdGUoeyBuYW1lOiBcIlwiLCBwaG9uZTogXCJcIiwgZW1haWw6IFwiXCIgfSk7XHJcbiAgY29uc3QgW2lzT3RwLCBzZXRJc090cF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtyZXMsIHNldFJlc10gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgY29uc3QgW2RvY3VtZW50SWQsIHNldERvY3VtZW50SWRdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2lzUHVibGljQ29udGFjdCwgc2V0SXNQdWJsaWNDb250YWN0XSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBpc0hlYWRlciA9IHVzZVNlbGVjdG9yKChzdGF0ZSkgPT4gc3RhdGUuc2hvd0hlYWRlcik7XHJcbiAgY29uc3QgZGl2UmVmID0gdXNlUmVmKG51bGwpO1xyXG5cclxuICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNzY3O1xyXG5cclxuICBsZXQgaXNHdWVzdFNpZ25GbG93ID0gZmFsc2U7XHJcbiAgbGV0IHNlbmRtYWlsO1xyXG4gIGxldCBnZXREb2NJZCA9IFwiXCI7XHJcbiAgY29uc3Qgcm91dGUgPSAhcHJvcHMudGVtcGxhdGVJZCAmJiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgY29uc3QgZ2V0UXVlcnkgPVxyXG4gICAgIXByb3BzLnRlbXBsYXRlSWQgJiZcclxuICAgIHdpbmRvdy5sb2NhdGlvbj8uc2VhcmNoICYmXHJcbiAgICB3aW5kb3cubG9jYXRpb24/LnNlYXJjaD8uc3BsaXQoXCI/XCIpO1xyXG5cclxuICBpZiAoZ2V0UXVlcnkpIHtcclxuICAgIHNlbmRtYWlsID0gZ2V0UXVlcnlbMV0uc3BsaXQoXCI9XCIpWzFdO1xyXG4gIH1cclxuICBjb25zdCBjaGVja1NwbGl0ID0gcm91dGUgJiYgcm91dGU/LnNwbGl0KFwiL1wiKTtcclxuXHJcbiAgaWYgKGNoZWNrU3BsaXQgJiYgY2hlY2tTcGxpdC5sZW5ndGggPiA0KSB7XHJcbiAgICBpc0d1ZXN0U2lnbkZsb3cgPSB0cnVlO1xyXG4gICAgZ2V0RG9jSWQgPSBjaGVja1NwbGl0WzNdO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBnZXREb2NJZCA9IGNoZWNrU3BsaXRbMl07XHJcbiAgfVxyXG4gIGxldCBnZXREb2N1bWVudElkID0gZ2V0RG9jSWQgfHwgZG9jdW1lbnRJZDtcclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKGdldERvY3VtZW50SWQpIHtcclxuICAgICAgc2V0RG9jdW1lbnRJZChnZXREb2N1bWVudElkKTtcclxuICAgICAgZ2V0RG9jdW1lbnREZXRhaWxzKGdldERvY3VtZW50SWQpO1xyXG4gICAgfSBlbHNlIGlmIChwcm9wcy50ZW1wbGF0ZUlkKSB7XHJcbiAgICAgIGdldFRlbXBsYXRlRGV0YWlscygpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtwcm9wcy50ZW1wbGF0ZUlkLCBnZXREb2N1bWVudElkXSk7XHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHVwZGF0ZVNpemUgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChkaXZSZWYuY3VycmVudCkge1xyXG4gICAgICAgIGNvbnN0IHBkZldpZHRoID0gcGRmTmV3V2lkdGhGdW4oZGl2UmVmKTtcclxuICAgICAgICBzZXRQZGZOZXdXaWR0aChwZGZXaWR0aCk7XHJcbiAgICAgICAgc2V0Q29udGFpbmVyV0goe1xyXG4gICAgICAgICAgd2lkdGg6IGRpdlJlZi5jdXJyZW50Lm9mZnNldFdpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBkaXZSZWYuY3VycmVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBVc2Ugc2V0VGltZW91dCB0byB3YWl0IGZvciB0aGUgdHJhbnNpdGlvbiB0byBjb21wbGV0ZVxyXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KHVwZGF0ZVNpemUsIDEwMCk7IC8vIG1hdGNoIHRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uXHJcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbZGl2UmVmLmN1cnJlbnQsIGlzSGVhZGVyXSk7XHJcbiAgLy9mdW5jdGlvbiB0byB1c2UgcmVzZW5kIG90cCBmb3IgZW1haWwgdmVyaWZpY2F0aW9uXHJcbiAgY29uc3QgaGFuZGxlUmVzZW5kID0gYXN5bmMgKGUpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHNldE90cExvYWRlcih0cnVlKTtcclxuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShsb2NhbHVzZXIpO1xyXG4gICAgYXdhaXQgaGFuZGxlU2VuZE9UUChjdXJyZW50VXNlcj8uZW1haWwpO1xyXG4gICAgc2V0T3RwTG9hZGVyKGZhbHNlKTtcclxuICAgIGFsZXJ0KHQoXCJvdHAtc2VudC1hbGVydFwiKSk7XHJcbiAgfTtcclxuICAvL2BoYW5kbGVWZXJpZnlFbWFpbGAgZnVuY3Rpb24gaXMgdXNlZCB0byB2ZXJpZnkgZW1haWwgd2l0aCBvdHBcclxuICBjb25zdCBoYW5kbGVWZXJpZnlFbWFpbCA9IGFzeW5jIChlKSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzZXRPdHBMb2FkZXIodHJ1ZSk7XHJcbiAgICBjb25zdCBsb2NhbHVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcclxuICAgICk7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2UobG9jYWx1c2VyKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc0VtYWlsID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwidmVyaWZ5ZW1haWxcIiwge1xyXG4gICAgICAgIG90cDogb3RwLFxyXG4gICAgICAgIGVtYWlsOiBjdXJyZW50VXNlcj8uZW1haWxcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChyZXNFbWFpbD8ubWVzc2FnZSA9PT0gXCJFbWFpbCBpcyB2ZXJpZmllZC5cIikge1xyXG4gICAgICAgIHNldElzRW1haWxWZXJpZmllZCh0cnVlKTtcclxuICAgICAgICBhbGVydCh0KFwiRW1haWwtdmVyaWZpZWQtYWxlcnQtMVwiKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzRW1haWw/Lm1lc3NhZ2UgPT09IFwiRW1haWwgaXMgYWxyZWFkeSB2ZXJpZmllZC5cIikge1xyXG4gICAgICAgIHNldElzRW1haWxWZXJpZmllZCh0cnVlKTtcclxuICAgICAgICBhbGVydCh0KFwiRW1haWwtdmVyaWZpZWQtYWxlcnQtMlwiKSk7XHJcbiAgICAgIH1cclxuICAgICAgc2V0T3RwKFwiXCIpO1xyXG4gICAgICBzZXRJc1ZlcmlmeU1vZGFsKGZhbHNlKTtcclxuICAgICAgLy9oYW5kbGVSZWNpcGllbnRTaWduKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBhbGVydChlcnJvci5tZXNzYWdlKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHNldE90cExvYWRlcihmYWxzZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuICAvL2BoYW5kbGVWZXJpZnlCdG5gIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBvdHAgb24gdXNlciBtYWlsXHJcbiAgY29uc3QgaGFuZGxlVmVyaWZ5QnRuID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgc2V0SXNWZXJpZnlNb2RhbCh0cnVlKTtcclxuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShsb2NhbHVzZXIpO1xyXG4gICAgYXdhaXQgaGFuZGxlU2VuZE9UUChjdXJyZW50VXNlcj8uZW1haWwpO1xyXG4gIH07XHJcbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tJc1N1YnNjcmliZWQoZXh0VXNlcklkLCBjb250YWN0SWQpIHtcclxuICAgIGNvbnN0IGlzR3Vlc3RTaWduID0gaXNHdWVzdFNpZ25GbG93IHx8IGZhbHNlO1xyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hTdWJzY3JpcHRpb24oZXh0VXNlcklkLCBjb250YWN0SWQsIGlzR3Vlc3RTaWduKTtcclxuICAgIGNvbnN0IHBsYW4gPSByZXMucGxhbjtcclxuICAgIGNvbnN0IGJpbGxpbmdEYXRlID0gcmVzPy5iaWxsaW5nRGF0ZTtcclxuICAgIGNvbnN0IHN0YXR1cyA9IHJlcz8uc3RhdHVzO1xyXG4gICAgaWYgKHBsYW4gPT09IFwiZnJlZXBsYW5cIikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAoYmlsbGluZ0RhdGUpIHtcclxuICAgICAgaWYgKG5ldyBEYXRlKGJpbGxpbmdEYXRlKSA+IG5ldyBEYXRlKCkpIHtcclxuICAgICAgICBzZXRJc1N1YnNjcmliZWQodHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGlzR3Vlc3RTaWduKSB7XHJcbiAgICAgICAgICBzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWQodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIvc3Vic2NyaXB0aW9uXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGlzR3Vlc3RTaWduKSB7XHJcbiAgICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgICBzZXRJc1N1YnNjcmliZWQodHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0SXNTdWJzY3JpcHRpb25FeHBpcmVkKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaXNHdWVzdFNpZ24pIHtcclxuICAgICAgICBzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWQodHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi9zdWJzY3JpcHRpb25cIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvL2Z1bmN0aW9uIGZvciBnZXQgZG9jdW1lbnQgZGV0YWlscyBmb3IgcGVydGljdWxhciBzaWduZXIgd2l0aCBzaWduZXInb2JqZWN0IGlkXHJcbiAgY29uc3QgZ2V0VGVtcGxhdGVEZXRhaWxzID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFyYW1zID0geyB0ZW1wbGF0ZUlkOiBwcm9wcy50ZW1wbGF0ZUlkLCBpc3B1YmxpYzogdHJ1ZSB9O1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZURlYXRpbHMgPSBhd2FpdCBheGlvcy5wb3N0KFxyXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZ2V0VGVtcGxhdGVgLFxyXG4gICAgICAgIHBhcmFtcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgICBzZXNzaW9udG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGRvY3VtZW50RGF0YSA9XHJcbiAgICAgICAgdGVtcGxhdGVEZWF0aWxzLmRhdGEgJiYgdGVtcGxhdGVEZWF0aWxzLmRhdGEucmVzdWx0XHJcbiAgICAgICAgICA/IFt0ZW1wbGF0ZURlYXRpbHMuZGF0YS5yZXN1bHRdXHJcbiAgICAgICAgICA6IFtdO1xyXG5cclxuICAgICAgaWYgKGRvY3VtZW50RGF0YSAmJiBkb2N1bWVudERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHNldElzUHVibGljVGVtcGxhdGUodHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgZ2V0UHVibGljUm9sZSA9IGRvY3VtZW50RGF0YVswXT8uUHVibGljUm9sZVswXTtcclxuICAgICAgICBjb25zdCBnZXRVbmlxdWVJZERldGFpbHMgPSBkb2N1bWVudERhdGFbMF0/LlBsYWNlaG9sZGVycy5maW5kKFxyXG4gICAgICAgICAgKHgpID0+IHguUm9sZSA9PT0gZ2V0UHVibGljUm9sZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGdldFVuaXF1ZUlkRGV0YWlscykge1xyXG4gICAgICAgICAgc2V0VW5pcXVlSWQoZ2V0VW5pcXVlSWREZXRhaWxzLklkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0U2lnbmVyUG9zKGRvY3VtZW50RGF0YVswXT8uUGxhY2Vob2xkZXJzKTtcclxuICAgICAgICBsZXQgcGxhY2Vob2xkZXJzT3JTaWduZXJzID0gW107XHJcbiAgICAgICAgLy8gY29uc3QgcGxhY2Vob2xkZXIgPSBkb2N1bWVudERhdGFbMF0/LlBsYWNlaG9sZGVycztcclxuICAgICAgICBmb3IgKGNvbnN0IHBsYWNlaG9sZGVyIG9mIGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMpIHtcclxuICAgICAgICAgIC8vYGVtYWlsRXhpc3RgIHZhcmlhYmxlIHRvIGhhbmRsZSBjb25kaXRpb24gZm9yIHF1aWNrIHNlbmQgZmxvdyBhbmQgc2hvdyB1bnNpZ25lZCBzaWduZXJzIGxpc3RcclxuICAgICAgICAgIGNvbnN0IHNpZ25lcklkRXhpc3QgPSBwbGFjZWhvbGRlcj8uc2lnbmVyT2JqSWQ7XHJcbiAgICAgICAgICBpZiAoc2lnbmVySWRFeGlzdCkge1xyXG4gICAgICAgICAgICBjb25zdCBnZXRTaWduZXJEYXRhID0gZG9jdW1lbnREYXRhWzBdLlNpZ25lcnMuZmluZChcclxuICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5vYmplY3RJZCA9PT0gcGxhY2Vob2xkZXI/LnNpZ25lck9iaklkXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyc09yU2lnbmVycy5wdXNoKGdldFNpZ25lckRhdGEpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXJzT3JTaWduZXJzLnB1c2gocGxhY2Vob2xkZXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnMocGxhY2Vob2xkZXJzT3JTaWduZXJzKTtcclxuICAgICAgICBzZXRQZGZEZXRhaWxzKGRvY3VtZW50RGF0YSk7XHJcbiAgICAgICAgc2V0SXNMb2FkaW5nKHtcclxuICAgICAgICAgIGlzTG9hZDogZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICBkb2N1bWVudERhdGEgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiIHx8XHJcbiAgICAgICAgKGRvY3VtZW50RGF0YS5yZXN1bHQgJiYgZG9jdW1lbnREYXRhLnJlc3VsdC5lcnJvcilcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gZ2V0IHRlbXBsYXRlIGRldGFpbHMgXCIpO1xyXG4gICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgICBzZXRJc0xvYWRpbmcoe1xyXG4gICAgICAgICAgaXNMb2FkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJuby1kYXRhXCIpKTtcclxuICAgICAgICBzZXRJc0xvYWRpbmcoe1xyXG4gICAgICAgICAgaXNMb2FkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gZ2V0IHRlbXBsYXRlIGRldGFpbHMgXCIsIGVycik7XHJcbiAgICAgIGlmIChlcnI/LnJlc3BvbnNlPy5kYXRhPy5jb2RlID09PSAxMDEpIHtcclxuICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwiZXJyb3ItdGVtcGxhdGVcIikpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiBmb3IgZ2V0IGRvY3VtZW50IGRldGFpbHMgZm9yIHBlcnRpY3VsYXIgc2lnbmVyIHdpdGggc2lnbmVyJ29iamVjdCBpZFxyXG4gIGNvbnN0IGdldERvY3VtZW50RGV0YWlscyA9IGFzeW5jIChkb2NJZCwgaXNOZXh0VXNlcikgPT4ge1xyXG4gICAgY29uc3Qgc2VuZGVyVXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGpzb25TZW5kZXIgPSBKU09OLnBhcnNlKHNlbmRlclVzZXIpO1xyXG4gICAgbGV0IGN1cnJVc2VySWQ7XHJcbiAgICAvL2dldHRpbmcgZG9jdW1lbnQgZGV0YWlsc1xyXG4gICAgY29uc3QgZG9jdW1lbnREYXRhID0gYXdhaXQgY29udHJhY3REb2N1bWVudChkb2N1bWVudElkIHx8IGRvY0lkKTtcclxuICAgIGlmIChkb2N1bWVudERhdGEgJiYgZG9jdW1lbnREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgc2V0RXh0VXNlcklkKGRvY3VtZW50RGF0YVswXT8uRXh0VXNlclB0cj8ub2JqZWN0SWQpO1xyXG4gICAgICBjb25zdCBpc0NvbXBsZXRlZCA9XHJcbiAgICAgICAgZG9jdW1lbnREYXRhWzBdLklzQ29tcGxldGVkICYmIGRvY3VtZW50RGF0YVswXS5Jc0NvbXBsZXRlZDtcclxuICAgICAgY29uc3QgZXhwaXJlRGF0ZSA9IGRvY3VtZW50RGF0YVswXS5FeHBpcnlEYXRlLmlzbztcclxuICAgICAgY29uc3QgZGVjbGluZWQgPSBkb2N1bWVudERhdGFbMF0uSXNEZWNsaW5lZCAmJiBkb2N1bWVudERhdGFbMF0uSXNEZWNsaW5lZDtcclxuICAgICAgY29uc3QgZXhwaXJlVXBkYXRlRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZURhdGUpLmdldFRpbWUoKTtcclxuICAgICAgY29uc3QgY3VyckRhdGUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgY29uc3QgZ2V0U2lnbmVycyA9IGRvY3VtZW50RGF0YVswXS5TaWduZXJzO1xyXG4gICAgICBjb25zdCBnZXRDdXJyZW50U2lnbmVyID1cclxuICAgICAgICBnZXRTaWduZXJzICYmXHJcbiAgICAgICAgZ2V0U2lnbmVycy5maWx0ZXIoXHJcbiAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5Vc2VySWQub2JqZWN0SWQgPT09IGpzb25TZW5kZXI/Lm9iamVjdElkXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgIGN1cnJVc2VySWQgPSBnZXRDdXJyZW50U2lnbmVyWzBdID8gZ2V0Q3VycmVudFNpZ25lclswXS5vYmplY3RJZCA6IFwiXCI7XHJcbiAgICAgIGlmIChpc0VuYWJsZVN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgIGF3YWl0IGNoZWNrSXNTdWJzY3JpYmVkKFxyXG4gICAgICAgICAgZG9jdW1lbnREYXRhWzBdPy5FeHRVc2VyUHRyPy5vYmplY3RJZCxcclxuICAgICAgICAgIGN1cnJVc2VySWRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjdXJyVXNlcklkKSB7XHJcbiAgICAgICAgc2V0U2lnbmVyT2JqZWN0SWQoY3VyclVzZXJJZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRvY3VtZW50RGF0YVswXS5TaWduZWRVcmwpIHtcclxuICAgICAgICBzZXRQZGZVcmwoZG9jdW1lbnREYXRhWzBdLlNpZ25lZFVybCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0UGRmVXJsKGRvY3VtZW50RGF0YVswXS5VUkwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xyXG4gICAgICAgIHNldElzU2lnbmVkKHRydWUpO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICBpc0NlcnRpZmljYXRlOiB0cnVlLFxyXG4gICAgICAgICAgaXNNb2RhbDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2V0QWxyZWFkeVNpZ24odHJ1ZSk7XHJcbiAgICAgICAgc2V0SXNDb21wbGV0ZWQoZGF0YSk7XHJcbiAgICAgICAgc2V0SXNDZWxlYnJhdGlvbih0cnVlKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHNldElzQ2VsZWJyYXRpb24oZmFsc2UpO1xyXG4gICAgICAgIH0sIDUwMDApO1xyXG4gICAgICB9IGVsc2UgaWYgKGRlY2xpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudERlY2xpbmUgPSB7XHJcbiAgICAgICAgICBjdXJybnQ6IFwiYW5vdGhlclwiLFxyXG4gICAgICAgICAgaXNEZWNsaW5lZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2V0SXNEZWNsaW5lKGN1cnJlbnREZWNsaW5lKTtcclxuICAgICAgfSBlbHNlIGlmIChjdXJyRGF0ZSA+IGV4cGlyZVVwZGF0ZURhdGUpIHtcclxuICAgICAgICBjb25zdCBleHBpcmVEYXRlRm9ybWF0ID0gbW9tZW50KG5ldyBEYXRlKGV4cGlyZURhdGUpKS5mb3JtYXQoXHJcbiAgICAgICAgICBcIk1NTSBERCwgWVlZWVwiXHJcbiAgICAgICAgKTtcclxuICAgICAgICBzZXRJc0V4cGlyZWQodHJ1ZSk7XHJcbiAgICAgICAgc2V0RXhwaXJlZERhdGUoZXhwaXJlRGF0ZUZvcm1hdCk7XHJcbiAgICAgIH0gLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgc2lnbmVyIGlzIG5vdCBhIGxhc3Qgc2lnbmVyIGFuZCBoYW5kbGUgdGhlIGNvbXBsZXRlIG1lc3NhZ2UuXHJcbiAgICAgIGVsc2UgaWYgKGlzTmV4dFVzZXIpIHtcclxuICAgICAgICBzZXRJc0NlbGVicmF0aW9uKHRydWUpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgc2V0SXNDZWxlYnJhdGlvbihmYWxzZSk7XHJcbiAgICAgICAgfSwgNTAwMCk7XHJcbiAgICAgICAgc2V0SXNDb21wbGV0ZWQoe1xyXG4gICAgICAgICAgaXNNb2RhbDogdHJ1ZSxcclxuICAgICAgICAgIG1lc3NhZ2U6IHQoXCJkb2N1bWVudC1zaWduZWQtYWxlcnQtMVwiKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChjdXJyVXNlcklkKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGVja0N1cnJlbnRVc2VyID0gZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycy5maW5kKFxyXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YT8uc2lnbmVyT2JqSWQgPT09IGN1cnJVc2VySWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoY2hlY2tDdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICBzZXRDdXJyZW50U2lnbmVyKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhdWRpdHRyYWlsRGF0YSA9XHJcbiAgICAgICAgZG9jdW1lbnREYXRhWzBdLkF1ZGl0VHJhaWwgJiZcclxuICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgZG9jdW1lbnREYXRhWzBdLkF1ZGl0VHJhaWwuZmlsdGVyKChkYXRhKSA9PiBkYXRhLkFjdGl2aXR5ID09PSBcIlNpZ25lZFwiKTtcclxuXHJcbiAgICAgIGNvbnN0IGNoZWNrQWxyZWFkeVNpZ24gPVxyXG4gICAgICAgIGRvY3VtZW50RGF0YVswXS5BdWRpdFRyYWlsICYmXHJcbiAgICAgICAgZG9jdW1lbnREYXRhWzBdLkF1ZGl0VHJhaWwubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgIGRvY3VtZW50RGF0YVswXS5BdWRpdFRyYWlsLmZpbHRlcihcclxuICAgICAgICAgIChkYXRhKSA9PlxyXG4gICAgICAgICAgICBkYXRhLlVzZXJQdHIub2JqZWN0SWQgPT09IGN1cnJVc2VySWQgJiYgZGF0YS5BY3Rpdml0eSA9PT0gXCJTaWduZWRcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjaGVja0FscmVhZHlTaWduICYmXHJcbiAgICAgICAgY2hlY2tBbHJlYWR5U2lnblswXSAmJlxyXG4gICAgICAgIGNoZWNrQWxyZWFkeVNpZ24ubGVuZ3RoID4gMFxyXG4gICAgICApIHtcclxuICAgICAgICBzZXRBbHJlYWR5U2lnbih0cnVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBvYmogPSBkb2N1bWVudERhdGE/LlswXTtcclxuICAgICAgICBzZXRTZW5kSW5PcmRlcihvYmo/LlNlbmRpbk9yZGVyIHx8IGZhbHNlKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBvYmogJiZcclxuICAgICAgICAgIG9iai5TaWduZXJzICYmXHJcbiAgICAgICAgICBvYmouU2lnbmVycy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICBvYmouUGxhY2Vob2xkZXJzICYmXHJcbiAgICAgICAgICBvYmouUGxhY2Vob2xkZXJzLmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgZXZlbnQ6IFwidmlld2VkXCIsXHJcbiAgICAgICAgICAgIGNvbnRhY3RJZDogY3VyclVzZXJJZCxcclxuICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgIG9iamVjdElkOiBkb2N1bWVudERhdGE/LlswXS5vYmplY3RJZCxcclxuICAgICAgICAgICAgICBmaWxlOiBkb2N1bWVudERhdGE/LlswXT8uU2lnbmVkVXJsIHx8IGRvY3VtZW50RGF0YT8uWzBdPy5VUkwsXHJcbiAgICAgICAgICAgICAgbmFtZTogZG9jdW1lbnREYXRhPy5bMF0uTmFtZSxcclxuICAgICAgICAgICAgICBub3RlOiBkb2N1bWVudERhdGE/LlswXS5Ob3RlIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRvY3VtZW50RGF0YT8uWzBdLkRlc2NyaXB0aW9uIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgc2lnbmVyczogZG9jdW1lbnREYXRhPy5bMF0uU2lnbmVycz8ubWFwKCh4KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogeD8uTmFtZSxcclxuICAgICAgICAgICAgICAgIGVtYWlsOiB4Py5FbWFpbCxcclxuICAgICAgICAgICAgICAgIHBob25lOiB4Py5QaG9uZVxyXG4gICAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgICB2aWV3ZWRCeToganNvblNlbmRlci5lbWFpbCxcclxuICAgICAgICAgICAgICB2aWV3ZWRBdDogbmV3IERhdGUoKSxcclxuICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGRvY3VtZW50RGF0YT8uWzBdLmNyZWF0ZWRBdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgICAgICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfWZ1bmN0aW9ucy9jYWxsd2ViaG9va2AsXHJcbiAgICAgICAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXHJcbiAgICAgICAgICAgICAgICAgIHNlc3Npb250b2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVyciBcIiwgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzaWduZXJzID0gW107XHJcbiAgICAgIGxldCB1blNpZ25lZFNpZ25lciA9IFtdO1xyXG5cclxuICAgICAgY29uc3QgcGxhY2Vob2xkZXJzT3JTaWduZXJzID0gW107XHJcbiAgICAgIGZvciAoY29uc3QgcGxhY2Vob2xkZXIgb2YgZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycykge1xyXG4gICAgICAgIC8vYGVtYWlsRXhpc3RgIHZhcmlhYmxlIHRvIGhhbmRsZSBjb25kaXRpb24gZm9yIHF1aWNrIHNlbmQgZmxvdyBhbmQgc2hvdyB1bnNpZ25lZCBzaWduZXJzIGxpc3RcclxuICAgICAgICBjb25zdCBzaWduZXJJZEV4aXN0ID0gcGxhY2Vob2xkZXI/LnNpZ25lck9iaklkO1xyXG4gICAgICAgIGlmIChzaWduZXJJZEV4aXN0KSB7XHJcbiAgICAgICAgICBjb25zdCBnZXRTaWduZXJEYXRhID0gZG9jdW1lbnREYXRhWzBdLlNpZ25lcnMuZmluZChcclxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEub2JqZWN0SWQgPT09IHBsYWNlaG9sZGVyPy5zaWduZXJPYmpJZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHBsYWNlaG9sZGVyc09yU2lnbmVycy5wdXNoKGdldFNpZ25lckRhdGEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwbGFjZWhvbGRlcnNPclNpZ25lcnMucHVzaChwbGFjZWhvbGRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIGFscmVhZHkgc2lnbmVkIGRvY3VtZW50IGJ5IHNvbWVvbmVcclxuICAgICAgaWYgKGF1ZGl0dHJhaWxEYXRhICYmIGF1ZGl0dHJhaWxEYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBzZXRJc0RvY0lkKHRydWUpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGxhY2Vob2xkZXJzT3JTaWduZXJzKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGVja0VtYWlsID0gaXRlbT8uZW1haWw7XHJcbiAgICAgICAgICAvL2lmIGVtYWlsIGV4aXN0IHRoZW4gY29tcGFyZSB1c2VyIHNpZ25lZCBieSB1c2luZyBlbWFpbCBlbHNlIHNpZ25lcnMgb2JqZWN0SWRcclxuICAgICAgICAgIGNvbnN0IGVtYWlsT3JJZCA9IGNoZWNrRW1haWwgPyBpdGVtLmVtYWlsIDogaXRlbS5vYmplY3RJZDtcclxuICAgICAgICAgIC8vYGlzU2lnbmVkU2lnbmF0dXJlYCB2YXJpYWJsZSB0byBoYW5kbGUgYnJlYWsgbG9vcCB3aGVuZXZlciBpdCBnZXQgdHJ1ZVxyXG4gICAgICAgICAgbGV0IGlzU2lnbmVkU2lnbmF0dXJlID0gZmFsc2U7XHJcbiAgICAgICAgICAvL2NoZWNraW5nIHRoZSBzaWduZXIgd2hvIHNpZ25lZCB0aGUgZG9jdW1lbnQgYnkgdXNpbmcgYXVkaXQgdHJhaWwgZGV0YWlscy5cclxuICAgICAgICAgIC8vYW5kIHNhdmUgc2lnbmVkU2lnbmVycyBhbmQgdW5zaWduZWRTaWduZXJzIGRldGFpbHNcclxuICAgICAgICAgIGZvciAoY29uc3QgZG9jIG9mIGF1ZGl0dHJhaWxEYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpZ25lZEV4aXN0ID0gY2hlY2tFbWFpbFxyXG4gICAgICAgICAgICAgID8gZG9jPy5Vc2VyUHRyLkVtYWlsXHJcbiAgICAgICAgICAgICAgOiBkb2M/LlVzZXJQdHIub2JqZWN0SWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoZW1haWxPcklkID09PSBzaWduZWRFeGlzdCkge1xyXG4gICAgICAgICAgICAgIHNpZ25lcnMucHVzaCh7IC4uLml0ZW0gfSk7XHJcbiAgICAgICAgICAgICAgaXNTaWduZWRTaWduYXR1cmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIWlzU2lnbmVkU2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICAgIHVuU2lnbmVkU2lnbmVyLnB1c2goeyAuLi5pdGVtIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRTaWduZWRTaWduZXJzKHNpZ25lcnMpO1xyXG4gICAgICAgIHNldFVuU2lnbmVkU2lnbmVycyh1blNpZ25lZFNpZ25lcik7XHJcbiAgICAgICAgc2V0U2lnbmVyUG9zKGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vZWxzZSBjb25kaXRpb24gaXMgc2hvdyB0aGVyZSBhcmUgbm8gZGV0YWlscyBpbiBhdWRpdCB0cmFpbCB0aGVuIGRpcmVjdCBwdXNoIGFsbCBzaWduZXJzIGRldGFpbHNcclxuICAgICAgICAvL2luIHVuc2lnbmVkc2lnbmVycyBhcnJheVxyXG4gICAgICAgIHNldFVuU2lnbmVkU2lnbmVycyhwbGFjZWhvbGRlcnNPclNpZ25lcnMpO1xyXG4gICAgICAgIHNldFNpZ25lclBvcyhkb2N1bWVudERhdGFbMF0uUGxhY2Vob2xkZXJzKTtcclxuICAgICAgfVxyXG4gICAgICBzZXRQZGZEZXRhaWxzKGRvY3VtZW50RGF0YSk7XHJcbiAgICAgIC8vY2hlY2tpbmcgaWYgY29uZGl0aW9uIGN1cnJlbnQgdXNlciBhbHJlYWR5IHNpZ24gb3Igb3duZXIgZG9lcyBub3QgZXhpc3QgYXMgYSBzaWduZXIgb3IgZG9jdW1lbnQgaGFzIGJlZW4gZGVjbGluZWQgYnkgc29tZW9uZSBvciBkb2N1bWVudCBoYXMgYmVlbiBleHBpcmVkXHJcbiAgICAgIC8vdGhlbiBzdG9wIHRvIGRpc3BsYXkgdG91ciBtZXNzYWdlXHJcbiAgICAgIGlmIChcclxuICAgICAgICAoY2hlY2tBbHJlYWR5U2lnbiAmJlxyXG4gICAgICAgICAgY2hlY2tBbHJlYWR5U2lnblswXSAmJlxyXG4gICAgICAgICAgY2hlY2tBbHJlYWR5U2lnbi5sZW5ndGggPiAwKSB8fFxyXG4gICAgICAgICFjdXJyVXNlcklkIHx8XHJcbiAgICAgICAgZGVjbGluZWQgfHxcclxuICAgICAgICBjdXJyRGF0ZSA+IGV4cGlyZVVwZGF0ZURhdGVcclxuICAgICAgKSB7XHJcbiAgICAgICAgc2V0UmVxdWVzdFNpZ25Ub3VyKHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vZWxzZSBjb25kaXRpb24gdG8gY2hlY2sgY3VycmVudCB1c2VyIGV4aXN0IGluIGNvbnRyYWN0c19Vc2VycyBjbGFzcyBhbmQgY2hlY2sgdG91ciBtZXNzYWdlIHN0YXR1c1xyXG4gICAgICAgIC8vaWYgbm90IHRoZW4gY2hlY2sgdXNlciBleGlzdCBpbiBjb250cmFjdHNfQ29udGFjdGJvb2sgY2xhc3MgYW5kIGNoZWNrIHRvdXIgbWVzc2FnZSBzdGF0dVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvbnRyYWN0VXNlcnMoKTtcclxuICAgICAgICBpZiAocmVzID09PSBcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIikge1xyXG4gICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzWzBdICYmIHJlcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBzZXRDb250cmFjdE5hbWUoXCJfVXNlcnNcIik7XHJcbiAgICAgICAgICBjdXJyVXNlcklkID0gcmVzWzBdLm9iamVjdElkO1xyXG4gICAgICAgICAgc2V0U2lnbmVyVXNlcklkKGN1cnJVc2VySWQpO1xyXG4gICAgICAgICAgY29uc3QgdG91ckRhdGEgPSByZXNbMF0uVG91clN0YXR1cyAmJiByZXNbMF0uVG91clN0YXR1cztcclxuICAgICAgICAgIGlmICh0b3VyRGF0YSAmJiB0b3VyRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrVG91clJlcXVlc3QgPSB0b3VyRGF0YS5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGE/LnJlcXVlc3RTaWduXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHNldFRvdXJTdGF0dXModG91ckRhdGEpO1xyXG4gICAgICAgICAgICBzZXRSZXF1ZXN0U2lnblRvdXIoY2hlY2tUb3VyUmVxdWVzdFswXT8ucmVxdWVzdFNpZ24gfHwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzPy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvbnRhY3RCb29rKGN1cnJVc2VySWQpO1xyXG4gICAgICAgICAgaWYgKHJlcyA9PT0gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpIHtcclxuICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChyZXNbMF0gJiYgcmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBzZXRDb250cmFjdE5hbWUoXCJfQ29udGFjdGJvb2tcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gcmVzWzBdLm9iamVjdElkO1xyXG4gICAgICAgICAgICBzZXRTaWduZXJVc2VySWQob2JqZWN0SWQpO1xyXG4gICAgICAgICAgICBjb25zdCB0b3VyRGF0YSA9IHJlc1swXS5Ub3VyU3RhdHVzICYmIHJlc1swXS5Ub3VyU3RhdHVzO1xyXG4gICAgICAgICAgICBpZiAodG91ckRhdGEgJiYgdG91ckRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNoZWNrVG91clJlcXVlc3QgPSB0b3VyRGF0YS5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YT8ucmVxdWVzdFNpZ25cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIHNldFRvdXJTdGF0dXModG91ckRhdGEpO1xyXG4gICAgICAgICAgICAgIHNldFJlcXVlc3RTaWduVG91cihjaGVja1RvdXJSZXF1ZXN0WzBdPy5yZXF1ZXN0U2lnbiB8fCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwidXNlci1ub3QtZXhpc3RcIikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzZXRJc1VpTG9hZGluZyhmYWxzZSk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBkb2N1bWVudERhdGEgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiIHx8XHJcbiAgICAgIChkb2N1bWVudERhdGEucmVzdWx0ICYmIGRvY3VtZW50RGF0YS5yZXN1bHQuZXJyb3IpXHJcbiAgICApIHtcclxuICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICBzZXRJc0xvYWRpbmcoe1xyXG4gICAgICAgIGlzTG9hZDogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluICBnZXREb2N1bWVudCBjbG91ZCBmdW5jdGlvbiBcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZXRIYW5kbGVFcnJvcih0KFwibm8tZGF0YVwiKSk7XHJcbiAgICAgIHNldElzVWlMb2FkaW5nKHtcclxuICAgICAgICBpc0xvYWQ6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgYXhpb3NcclxuICAgICAgLmdldChcclxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgIFwiYmFzZVVybFwiXHJcbiAgICAgICAgKX1jbGFzc2VzL2NvbnRyYWN0c19TaWduYXR1cmU/d2hlcmU9e1wiVXNlcklkXCI6IHtcIl9fdHlwZVwiOiBcIlBvaW50ZXJcIixcImNsYXNzTmFtZVwiOiBcIl9Vc2VyXCIsIFwib2JqZWN0SWRcIjpcIiR7XHJcbiAgICAgICAgICBqc29uU2VuZGVyPy5vYmplY3RJZFxyXG4gICAgICAgIH1cIn19YCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgICBcIlgtUGFyc2UtU2Vzc2lvbi1Ub2tlblwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICAgIC50aGVuKChMaXN0ZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGpzb24gPSBMaXN0ZGF0YS5kYXRhO1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IGpzb24ucmVzdWx0cztcclxuXHJcbiAgICAgICAgaWYgKHJlc1swXSAmJiByZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgc2V0RGVmYXVsdFNpZ25JbWcocmVzWzBdLkltYWdlVVJMKTtcclxuICAgICAgICAgIHNldE15SW5pdGlhbChyZXNbMF0/LkluaXRpYWxzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGxvYWRPYmogPSB7XHJcbiAgICAgICAgICBpc0xvYWQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBzZXRJc0xvYWRpbmcobG9hZE9iaik7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJFcnIgaW4gY29udHJhY3RzX1NpZ25hdHVyZSBjbGFzc1wiLCBlcnIpO1xyXG4gICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgICBzZXRJc0xvYWRpbmcoe1xyXG4gICAgICAgICAgaXNMb2FkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIGVtYmVkIHNpZ25hdHVyZSBvciBpbWFnZSB1cmwgaW4gcGRmXHJcbiAgYXN5bmMgZnVuY3Rpb24gZW1iZWRXaWRnZXRzRGF0YSgpIHtcclxuICAgIC8vZm9yIGVtYWlsVmVyaWZpZWQgZGF0YSBjaGVja2luZyBmaXJzdCBpbiBsb2NhbHN0b3JhZ2VcclxuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGxldCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2UobG9jYWx1c2VyKTtcclxuICAgIC8vaWYgZW1haWxWZXJpZmllZCBkYXRhIGlzIG5vdCBwcmVzZW50IGluIGxvY2FsIHVzZXIgZGV0YWlscyB0aGVuIGZldGNoIGFnYWluIGluIF9Vc2VyIGNsYXNzXHJcbiAgICBpZiAoIWN1cnJlbnRVc2VyPy5lbWFpbFZlcmlmaWVkKSB7XHJcbiAgICAgIGNvbnN0IHVzZXJRdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShQYXJzZS5Vc2VyKTtcclxuICAgICAgY29uc3QgZ2V0VXNlciA9IGF3YWl0IHVzZXJRdWVyeS5nZXQoY3VycmVudFVzZXI/Lm9iamVjdElkLCB7XHJcbiAgICAgICAgc2Vzc2lvblRva2VuOiBjdXJyZW50VXNlcj8uc2Vzc2lvblRva2VuXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoZ2V0VXNlcikge1xyXG4gICAgICAgIGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnZXRVc2VyKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBpc0VtYWlsVmVyaWZpZWQgPSBjdXJyZW50VXNlcj8uZW1haWxWZXJpZmllZDtcclxuICAgIC8vY2hlY2sgaWYgaXNFbWFpbFZlcmlmaWVkIHRoZW4gZ28gb24gbmV4dCBzdGVwXHJcbiAgICBpZiAoaXNFbWFpbFZlcmlmaWVkKSB7XHJcbiAgICAgIHNldElzRW1haWxWZXJpZmllZChpc0VtYWlsVmVyaWZpZWQpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrVXNlciA9IHNpZ25lclBvcy5maWx0ZXIoXHJcbiAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjaGVja1VzZXIgJiYgY2hlY2tVc2VyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBjaGVja2JveEV4aXN0LFxyXG4gICAgICAgICAgICByZXF1aXJlZFJhZGlvLFxyXG4gICAgICAgICAgICBzaG93QWxlcnQgPSBmYWxzZSxcclxuICAgICAgICAgICAgd2lkZ2V0S2V5LFxyXG4gICAgICAgICAgICByYWRpb0V4aXN0LFxyXG4gICAgICAgICAgICByZXF1aXJlZENoZWNrYm94LFxyXG4gICAgICAgICAgICBUb3VyUGFnZU51bWJlcjsgLy8gYHBhZ2VOdW1iZXJgIGlzIHVzZWQgdG8gY2hlY2sgb24gd2hpY2ggcGFnZSB1c2VyIGRpZCBub3QgZmlsbCB3aWRnZXQncyBkYXRhIHRoZW4gY2hhbmdlIGN1cnJlbnQgcGFnZU51bWJlciBhbmQgc2hvdyB0b3VyIG1lc3NhZ2Ugb24gdGhhdCBwYWdlXHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgLy9nZXQgY3VycmVudCBwYWdlXHJcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlUGFnZSA9IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXT8ucGFnZU51bWJlcjtcclxuICAgICAgICAgICAgICAvL2NoZWNraW5nIGNoZWNib3ggdHlwZSB3aWRnZXRcclxuICAgICAgICAgICAgICBjaGVja2JveEV4aXN0ID1cclxuICAgICAgICAgICAgICAgIGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3Nbal0udHlwZSA9PT0gXCJjaGVja2JveFwiO1xyXG4gICAgICAgICAgICAgIC8vY2hlY2tpbmcgcmFkaW8gYnV0dG9uIHR5cGUgd2lkZ2V0XHJcbiAgICAgICAgICAgICAgcmFkaW9FeGlzdCA9XHJcbiAgICAgICAgICAgICAgICBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zW2pdLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0O1xyXG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIGNoZWNrYm94IHdpZGdldCBleGlzdCBvciBub3RcclxuICAgICAgICAgICAgICBpZiAoY2hlY2tib3hFeGlzdCkge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgYWxsIHJlcXVpcmVkIHR5cGUgY2hlY2tib3hcclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3ggPSBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICFwb3NpdGlvbi5vcHRpb25zPy5pc1JlYWRPbmx5ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udHlwZSA9PT0gXCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgLy9pZiByZXF1aXJlZCB0eXBlIGNoZWNrYm94IGRhdGEgZXhpdCB0aGVuIGNoZWNrIHVzZXIgY2hlY2tlZCBhbGwgY2hlY2tib3ggb3Igc29tZSBjaGVja2JveCByZW1haW4gdG8gY2hlY2tcclxuICAgICAgICAgICAgICAgIC8vYWxzbyB2YWxpZGF0ZSB0byBtaW5pbXVtIGFuZCBtYXhpbXVtIHJlcXVpcmVkIGNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRDaGVja2JveCAmJiByZXF1aXJlZENoZWNrYm94Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlZENoZWNrYm94Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgbWluaW11bSByZXF1aXJlZCBjb3VudCBpZiAgZXhpdFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbkNvdW50ID1cclxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3hbaV0ub3B0aW9ucz8udmFsaWRhdGlvbj8ubWluUmVxdWlyZWRDb3VudDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZU1pbiA9IG1pbkNvdW50ICYmIHBhcnNlSW50KG1pbkNvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAvL2dldCBtYXhpbXVtIHJlcXVpcmVkIGNvdW50IGlmICBleGl0XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4Q291bnQgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveFtpXS5vcHRpb25zPy52YWxpZGF0aW9uPy5tYXhSZXF1aXJlZENvdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlTWF4ID0gbWF4Q291bnQgJiYgcGFyc2VJbnQobWF4Q291bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vaW4gYHJlc3BvbnNlYCB2YXJpYWJsZSBpcyB1c2VkIHRvIGdldCBob3cgbWFueSBjaGVja2JveCBjaGVja2VkIGJ5IHVzZXJcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZENoZWNrYm94W2ldLm9wdGlvbnM/LnJlc3BvbnNlPy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9pbiBgZGVmYXVsdFZhbHVlYCB2YXJpYWJsZSBpcyB1c2VkIHRvIGdldCBob3cgbWFueSBjaGVja2JveCBjaGVja2VkIGJ5IGRlZmF1bHRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveFtpXS5vcHRpb25zPy5kZWZhdWx0VmFsdWU/Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbmRpdGlvbiB0byBjaGVjayAgcGFyc2VNaW4gIGFuZCBwYXJzZU1heCBncmVhdGVyIHRoYW4gMCAgdGhlbiBjb25zaWRlciBpdCBhcyBhIHJlcXVpcmVkIGNoZWNrIGJveFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTWluID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFyc2VNYXggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAhcmVzcG9uc2UgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFkZWZhdWx0VmFsdWUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFzaG93QWxlcnRcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHNob3dBbGVydCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRLZXkgPSByZXF1aXJlZENoZWNrYm94W2ldLmtleTtcclxuICAgICAgICAgICAgICAgICAgICAgIFRvdXJQYWdlTnVtYmVyID0gdXBkYXRlUGFnZTtcclxuICAgICAgICAgICAgICAgICAgICAgIHNldG1pblJlcXVpcmVkQ291bnQocGFyc2VNaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIHRvIHZhbGlkYXRlIG1pbmltdW0gcmVxdWlyZWQgY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTWluID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgKHBhcnNlTWluID4gcmVzcG9uc2UgfHwgIXJlc3BvbnNlKVxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93QWxlcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FsZXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0S2V5ID0gcmVxdWlyZWRDaGVja2JveFtpXS5rZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRvdXJQYWdlTnVtYmVyID0gdXBkYXRlUGFnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0bWluUmVxdWlyZWRDb3VudChwYXJzZU1pbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIHJhZGlvIHdpZGdldCBleGlzdCBvciBub3RcclxuICAgICAgICAgICAgICBlbHNlIGlmIChyYWRpb0V4aXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBhbGwgcmVxdWlyZWQgdHlwZSByYWRpbyBidXR0b25cclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkUmFkaW8gPSBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICFwb3NpdGlvbi5vcHRpb25zPy5pc1JlYWRPbmx5ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAvL2lmIHJlcXVpcmVkIHR5cGUgcmFkaW8gZGF0YSBleGl0IHRoZW4gY2hlY2sgdXNlciBjaGVja2VkIGFsbCByYWRpbyBidXR0b24gb3Igc29tZSByYWRpbyByZW1haW4gdG8gY2hlY2tcclxuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFJhZGlvICYmIHJlcXVpcmVkUmFkaW8/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrU2lnbmVkO1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVpcmVkUmFkaW8/Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTaWduZWQgPSByZXF1aXJlZFJhZGlvW2ldPy5vcHRpb25zPy5yZXNwb25zZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrU2lnbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tEZWZhdWx0U2lnbmVkID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRSYWRpb1tpXT8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0RlZmF1bHRTaWduZWQgJiYgIXNob3dBbGVydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRLZXkgPSByZXF1aXJlZFJhZGlvW2ldLmtleTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVG91clBhZ2VOdW1iZXIgPSB1cGRhdGVQYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRtaW5SZXF1aXJlZENvdW50KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIHRvIGNoZWNrIGFsbCB0eXBlIHdpZGdldCBkYXRhIGZpbGwgb3Igbm90IGV4Y2VwdCBjaGVja2JveCBhbmQgcmFkaW8gYnV0dG9uXHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBhbGwgcmVxdWlyZWQgdHlwZSB3aWRnZXRzIGV4Y2VwdCBjaGVja2JveCBhbmQgcmFkaW9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkV2lkZ2V0cyA9IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3MuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAocG9zaXRpb24pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24ub3B0aW9ucz8uc3RhdHVzID09PSBcInJlcXVpcmVkXCIgJiZcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi50eXBlICE9PSByYWRpb0J1dHRvbldpZGdldCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnR5cGUgIT09IFwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFdpZGdldHMgJiYgcmVxdWlyZWRXaWRnZXRzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjaGVja1NpZ25lZDtcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlZFdpZGdldHM/Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTaWduZWQgPSByZXF1aXJlZFdpZGdldHNbaV0/Lm9wdGlvbnM/LnJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tTaWduZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrU2lnblVybCA9IHJlcXVpcmVkV2lkZ2V0c1tpXT8ucG9zPy5TaWduVXJsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1NpZ25VcmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrRGVmYXVsdFNpZ25lZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRXaWRnZXRzW2ldPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tEZWZhdWx0U2lnbmVkICYmICFzaG93QWxlcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldEtleSA9IHJlcXVpcmVkV2lkZ2V0c1tpXS5rZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVG91clBhZ2VOdW1iZXIgPSB1cGRhdGVQYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldG1pblJlcXVpcmVkQ291bnQobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy93aGVuIHNob3dBbGVydCBpcyB0cnVlIHRoZW4gYnJlYWsgdGhlIGxvb3AgYW5kIHNob3cgYWxlcnQgdG8gZmlsbCByZXF1aXJlZCBkYXRhIGluIHdpZGdldHNcclxuICAgICAgICAgICAgaWYgKHNob3dBbGVydCkge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoY2hlY2tib3hFeGlzdCAmJiByZXF1aXJlZENoZWNrYm94ICYmIHNob3dBbGVydCkge1xyXG4gICAgICAgICAgICBzZXRVblNpZ25lZFdpZGdldElkKHdpZGdldEtleSk7XHJcbiAgICAgICAgICAgIHNldFBhZ2VOdW1iZXIoVG91clBhZ2VOdW1iZXIpO1xyXG4gICAgICAgICAgICBzZXRXaWRnZXRzVG91cih0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAocmFkaW9FeGlzdCAmJiBzaG93QWxlcnQpIHtcclxuICAgICAgICAgICAgc2V0VW5TaWduZWRXaWRnZXRJZCh3aWRnZXRLZXkpO1xyXG4gICAgICAgICAgICBzZXRQYWdlTnVtYmVyKFRvdXJQYWdlTnVtYmVyKTtcclxuICAgICAgICAgICAgc2V0V2lkZ2V0c1RvdXIodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHNob3dBbGVydCkge1xyXG4gICAgICAgICAgICBzZXRVblNpZ25lZFdpZGdldElkKHdpZGdldEtleSk7XHJcbiAgICAgICAgICAgIHNldFBhZ2VOdW1iZXIoVG91clBhZ2VOdW1iZXIpO1xyXG4gICAgICAgICAgICBzZXRXaWRnZXRzVG91cih0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldElzVWlMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICAvLyBgd2lkZ2V0c2AgaXMgVXNlZCB0byByZXR1cm4gd2lkZ2V0cyBkZXRhaWxzIHdpdGggcGFnZSBudW1iZXIgb2YgY3VycmVudCB1c2VyXHJcbiAgICAgICAgICAgIGNvbnN0IHdpZGdldHMgPSBjaGVja1VzZXI/LlswXT8ucGxhY2VIb2xkZXI7XHJcbiAgICAgICAgICAgIGxldCBwZGZBcnJCdWZmZXI7XHJcbiAgICAgICAgICAgIC8vYGNvbnRyYWN0RG9jdW1lbnRgIGZ1bmN0aW9uIHVzZWQgdG8gZ2V0IHVwZGF0ZWQgU2lnbmVkVXJsXHJcbiAgICAgICAgICAgIC8vcmVzb2x2ZWQgaXNzdWUgb2Ygc2lnbiBkb2N1bWVudCBieSBtdWx0aXBsZSBzaWduZXJzIHNpbXVsdGFuZW91c2x5XHJcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RGF0YSA9IGF3YWl0IGNvbnRyYWN0RG9jdW1lbnQoZG9jdW1lbnRJZCk7XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudERhdGEgJiYgZG9jdW1lbnREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICBjb25zdCB1cmwgPSBkb2N1bWVudERhdGFbMF0/LlNpZ25lZFVybCB8fCBkb2N1bWVudERhdGFbMF0/LlVSTDtcclxuICAgICAgICAgICAgICAvL2NvbnZlcnQgZG9jdW1lbnQgdXJsIGluIGFycmF5IGJ1ZmZlciBmb3JtYXQgdG8gdXNlIGVtYmVkIHdpZGdldHMgaW4gcGRmIHVzaW5nIHBkZi1saWJcclxuICAgICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGNvbnZlcnRQZGZBcnJheUJ1ZmZlcih1cmwpO1xyXG4gICAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlciA9PT0gXCJFcnJvclwiKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwiaW52YWxpZC1kb2N1bWVudFwiKSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBkZkFyckJ1ZmZlciA9IGFycmF5QnVmZmVyO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICBkb2N1bWVudERhdGEgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiIHx8XHJcbiAgICAgICAgICAgICAgKGRvY3VtZW50RGF0YS5yZXN1bHQgJiYgZG9jdW1lbnREYXRhLnJlc3VsdC5lcnJvcilcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJkb2N1bWVudC1ub3QtZm91bmRcIikpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBMb2FkIGEgUERGRG9jdW1lbnQgZnJvbSB0aGUgZXhpc3RpbmcgUERGIGJ5dGVzXHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUGRmQnl0ZXMgPSBwZGZBcnJCdWZmZXI7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChleGlzdGluZ1BkZkJ5dGVzKTtcclxuICAgICAgICAgICAgICBjb25zdCBpc1NpZ25Zb3VyU2VsZkZsb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBjb25zdCBleHRVc2VyUHRyID0gcGRmRGV0YWlsc1swXS5FeHRVc2VyUHRyO1xyXG4gICAgICAgICAgICAgIGNvbnN0IEhlYWRlckRvY0lkID0gZXh0VXNlclB0cj8uSGVhZGVyRG9jSWQ7XHJcbiAgICAgICAgICAgICAgLy9lbWJlZCBkb2N1bWVudCdzIG9iamVjdCBpZCB0byBhbGwgcGFnZXMgaW4gcGRmIGRvY3VtZW50XHJcbiAgICAgICAgICAgICAgaWYgKCFIZWFkZXJEb2NJZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc0RvY0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGVtYmVkRG9jSWQocGRmRG9jLCBkb2N1bWVudElkLCBhbGxQYWdlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vZW1iZWQgbXVsdGkgc2lnbmF0dXJlIGluIHBkZlxyXG4gICAgICAgICAgICAgIGNvbnN0IHBkZkJ5dGVzID0gYXdhaXQgbXVsdGlTaWduRW1iZWQoXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRzLFxyXG4gICAgICAgICAgICAgICAgcGRmRG9jLFxyXG4gICAgICAgICAgICAgICAgaXNTaWduWW91clNlbGZGbG93LFxyXG4gICAgICAgICAgICAgICAgc2NhbGUsXHJcbiAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdILFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyV0hcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGRmdGVcIiwgcGRmQnl0ZXMpO1xyXG4gICAgICAgICAgICAgIC8vZ2V0IEV4aXN0VXNlclB0ciBvYmplY3QgaWQgb2YgdXNlciBjbGFzcyB0byBnZXQgdGVuYW50RGV0YWlsc1xyXG4gICAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gcGRmRGV0YWlscz8uWzBdPy5FeHRVc2VyUHRyPy5Vc2VySWQ/Lm9iamVjdElkO1xyXG4gICAgICAgICAgICAgIC8vZ2V0IEV4aXN0VXNlclB0ciBlbWFpbCB0byBnZXQgdXNlckRldGFpbHNcclxuICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjb250cmFjdFVzZXJzKCk7XHJcbiAgICAgICAgICAgICAgbGV0IGFjdGl2ZU1haWxBZGFwdGVyID0gXCJcIjtcclxuICAgICAgICAgICAgICBpZiAocmVzID09PSBcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIikge1xyXG4gICAgICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nKHsgaXNMb2FkOiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXMgfHwgcmVzPy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZU1haWxBZGFwdGVyID0gXCJcIjtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc1swXSAmJiByZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmVNYWlsQWRhcHRlciA9IHJlc1swXT8uYWN0aXZlX21haWxfYWRhcHRlcjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy9mdW5jdGlvbiBmb3IgY2FsbCB0byBlbWJlZCBzaWduYXR1cmUgaW4gcGRmIGFuZCBnZXQgZGlnaXRhbCBzaWduYXR1cmUgcGRmXHJcbiAgICAgICAgICAgICAgY29uc3QgcmVzU2lnbiA9IGF3YWl0IHNpZ25QZGZGdW4oXHJcbiAgICAgICAgICAgICAgICBwZGZCeXRlcyxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50SWQsXHJcbiAgICAgICAgICAgICAgICBzaWduZXJPYmplY3RJZCxcclxuICAgICAgICAgICAgICAgIG9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgaXNTdWJzY3JpYmVkLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlTWFpbEFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRzXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBpZiAocmVzU2lnbiAmJiByZXNTaWduLnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgICAgIHNldFBkZlVybChyZXMuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBzZXRJc1NpZ25lZCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHNldFNpZ25lZFNpZ25lcnMoW10pO1xyXG4gICAgICAgICAgICAgICAgc2V0VW5TaWduZWRTaWduZXJzKFtdKTtcclxuICAgICAgICAgICAgICAgIGdldERvY3VtZW50RGV0YWlscyh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGRmRGV0YWlscz8uWzBdLlNpZ25lcnMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgICAoeCkgPT4geC5FbWFpbCA9PT0gY3VycmVudFVzZXI/LmVtYWlsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBpbmRleCArIDE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VybWFpbCA9IHtcclxuICAgICAgICAgICAgICAgICAgRW1haWw6IHBkZkRldGFpbHM/LlswXT8uUGxhY2Vob2xkZXJzW25ld0luZGV4XT8uZW1haWwgfHwgXCJcIlxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSB1c2VybWFpbD8uRW1haWxcclxuICAgICAgICAgICAgICAgICAgPyB1c2VybWFpbFxyXG4gICAgICAgICAgICAgICAgICA6IHBkZkRldGFpbHM/LlswXT8uU2lnbmVyc1tuZXdJbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VuZG1haWwgIT09IFwiZmFsc2VcIiAmJiBzZW5kSW5PcmRlcikge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHBkZkRldGFpbHM/LlswXT8uUmVxdWVzdEJvZHk7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RTdWJqZWN0ID0gcGRmRGV0YWlscz8uWzBdPy5SZXF1ZXN0U3ViamVjdDtcclxuICAgICAgICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBpcmVEYXRlID0gcGRmRGV0YWlscz8uWzBdLkV4cGlyeURhdGUuaXNvO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShleHBpcmVEYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEV4cGlyZURhdGUgPSBuZXdEYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhcclxuICAgICAgICAgICAgICAgICAgICAgIFwiZW4tVVNcIixcclxuICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF5OiBcIm51bWVyaWNcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbmRlckVtYWlsID0gcGRmRGV0YWlscz8uWzBdLkV4dFVzZXJQdHIuRW1haWw7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbmRlclBob25lID0gcGRmRGV0YWlscz8uWzBdPy5FeHRVc2VyUHRyPy5QaG9uZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZW5kZXJOYW1lID0gYCR7cGRmRGV0YWlscz8uWzBdLkV4dFVzZXJQdHIuTmFtZX1gO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nUG5nID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJodHRwczovL3Fpa2lubm92YXRpb24uYW1zMy5kaWdpdGFsb2NlYW5zcGFjZXMuY29tL2xvZ28ucG5nXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFzZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICApfWZ1bmN0aW9ucy9zZW5kbWFpbHYzYDtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Ub2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gdXNlcj8ub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0VXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vZW5jb2RlIHRoaXMgdXJsIHZhbHVlIGAke3BkZkRldGFpbHM/LlswXS5vYmplY3RJZH0vJHt1c2VyLkVtYWlsfS8ke29iamVjdElkfWAgdG8gYmFzZTY0IHVzaW5nIGBidG9hYCBmdW5jdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGVuY29kZUJhc2U2NDtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVCYXNlNjQgPSBidG9hKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BkZkRldGFpbHM/LlswXS5vYmplY3RJZH0vJHt1c2VyLkVtYWlsfS8ke29iamVjdElkfWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUJhc2U2NCA9IGJ0b2EoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGRmRGV0YWlscz8uWzBdLm9iamVjdElkfS8ke3VzZXIuRW1haWx9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9zdFB1YmxpY1VybCA9IGlzU3RhZ2luZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiaHR0cHM6Ly9zdGFnaW5nLWFwcC5vcGVuc2lnbmxhYnMuY29tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImh0dHBzOi8vYXBwLm9wZW5zaWdubGFicy5jb21cIjtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWduUGRmID0gcHJvcHM/LnRlbXBsYXRlSWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtob3N0UHVibGljVXJsfS9sb2dpbi8ke2VuY29kZUJhc2U2NH1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYCR7aG9zdFVybH0vbG9naW4vJHtlbmNvZGVCYXNlNjR9YDtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5TaWduVXJsID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJodHRwczovL3d3dy5vcGVuc2lnbmxhYnMuY29tL2NvbnRhY3QtdXNcIjtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yZ05hbWUgPSBwZGZEZXRhaWxzWzBdPy5FeHRVc2VyUHRyLkNvbXBhbnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwZGZEZXRhaWxzWzBdLkV4dFVzZXJQdHIuQ29tcGFueVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGVtZUJHY29sb3IgPSB0aGVtZUNvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VWYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdEJvZHkgJiYgcmVxdWVzdFN1YmplY3QgJiYgaXNTdWJzY3JpYmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VkUmVxdWVzdEJvZHkgPSByZXF1ZXN0Qm9keS5yZXBsYWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC9cIi9nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGh0bWxSZXFCb2R5ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9J0NvbnRlbnQtVHlwZScgY29udGVudD0ndGV4dC9odG1sOyBjaGFyc2V0PVVURi04JyAvPjwvaGVhZD48Ym9keT5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRSZXF1ZXN0Qm9keSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L2JvZHk+IDwvaHRtbD5cIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudF90aXRsZTogcGRmRGV0YWlscz8uWzBdLk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyX25hbWU6IHNlbmRlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyX21haWw6IHNlbmRlckVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlcl9waG9uZTogc2VuZGVyUGhvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJfbmFtZTogdXNlci5OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyX2VtYWlsOiB1c2VyLkVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyX3Bob25lOiB1c2VyLlBob25lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyeV9kYXRlOiBsb2NhbEV4cGlyZURhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueV9uYW1lOiBvcmdOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25pbmdfdXJsOiBgPGEgaHJlZj0ke3NpZ25QZGZ9PlNpZ24gaGVyZTwvYT5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VWYXIgPSByZXBsYWNlTWFpbFZhcmlibGVzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdWJqZWN0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxSZXFCb2R5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1haWxQcm92aWRlcjogYWN0aXZlTWFpbEFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dFVzZXJJZDogZXh0VXNlcklkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNpcGllbnQ6IHVzZXIuRW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3Q6IHJlcXVlc3RTdWJqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZXBsYWNlVmFyPy5zdWJqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBgJHtwZGZEZXRhaWxzPy5bMF0uRXh0VXNlclB0ci5OYW1lfSBoYXMgcmVxdWVzdGVkIHlvdSB0byBzaWduIFwiJHtwZGZEZXRhaWxzPy5bMF0uTmFtZX1cImAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb206IHNlbmRlckVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sOiByZXF1ZXN0Qm9keVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVwbGFjZVZhcj8uYm9keVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCI8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSdDb250ZW50LVR5cGUnIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcgLz4gPC9oZWFkPiAgIDxib2R5PiA8ZGl2IHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OyBwYWRkaW5nOiAyMHB4Jz0+IDxkaXYgICBzdHlsZT0nIGJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4xKSAwcHggNHB4IDEycHg7YmFja2dyb3VuZDogd2hpdGU7cGFkZGluZy1ib3R0b206IDIwcHg7Jz4gPGRpdiBzdHlsZT0ncGFkZGluZzoxMHB4IDEwcHggMCAxMHB4Jz48aW1nIHNyYz1cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdQbmcgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgaGVpZ2h0PSc1MCcgc3R5bGU9J3BhZGRpbmc6IDIwcHgsd2lkdGg6MTcwcHgsaGVpZ2h0OjQwcHgnIC8+PC9kaXY+ICA8ZGl2ICBzdHlsZT0nIHBhZGRpbmc6IDJweDtmb250LWZhbWlseTogc3lzdGVtLXVpO2JhY2tncm91bmQtY29sb3I6XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVCR2NvbG9yICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiOyc+PHAgc3R5bGU9J2ZvbnQtc2l6ZTogMjBweDtmb250LXdlaWdodDogNDAwO2NvbG9yOiB3aGl0ZTtwYWRkaW5nLWxlZnQ6IDIwcHg7JyA+IERpZ2l0YWwgU2lnbmF0dXJlIFJlcXVlc3Q8L3A+PC9kaXY+PGRpdj48cCBzdHlsZT0ncGFkZGluZzogMjBweDtmb250LWZhbWlseTogc3lzdGVtLXVpO2ZvbnQtc2l6ZTogMTRweDsgICBtYXJnaW4tYm90dG9tOiAxMHB4Oyc+IFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM/LlswXS5FeHRVc2VyUHRyLk5hbWUgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgaGFzIHJlcXVlc3RlZCB5b3UgdG8gcmV2aWV3IGFuZCBzaWduIDxzdHJvbmc+IFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM/LlswXS5OYW1lICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPC9zdHJvbmc+LjwvcD48ZGl2IHN0eWxlPSdwYWRkaW5nOiA1cHggMHB4IDVweCAyNXB4O2Rpc3BsYXk6IGZsZXg7ZmxleC1kaXJlY3Rpb246IHJvdztqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsnPjx0YWJsZT4gPHRyPiA8dGQgc3R5bGU9J2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6MTVweCc+U2VuZGVyPC90ZD4gPHRkPiA8L3RkPiA8dGQgIHN0eWxlPSdjb2xvcjojNjI2MzYzO2ZvbnQtd2VpZ2h0OmJvbGQnPlwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlckVtYWlsICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPC90ZD48L3RyPjx0cj48dGQgc3R5bGU9J2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6MTVweCc+T3JnYW5pemF0aW9uPC90ZD4gPHRkPiA8L3RkPjx0ZCBzdHlsZT0nY29sb3I6IzYyNjM2Mztmb250LXdlaWdodDpib2xkJz4gXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnTmFtZSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvdGQ+PC90cj4gPHRyPiA8dGQgc3R5bGU9J2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6MTVweCc+RXhwaXJlcyBvbjwvdGQ+PHRkPiA8L3RkPiA8dGQgc3R5bGU9J2NvbG9yOiM2MjYzNjM7Zm9udC13ZWlnaHQ6Ym9sZCc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFeHBpcmVEYXRlICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPC90ZD48L3RyPjx0cj4gPHRkPjwvdGQ+IDx0ZD4gPC90ZD48L3RyPjwvdGFibGU+IDwvZGl2PiA8ZGl2IHN0eWxlPSdtYXJnaW4tbGVmdDo3MHB4Jz48YSBocmVmPVwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25QZGYgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+IDxidXR0b24gc3R5bGU9J3BhZGRpbmc6IDEycHggMTJweCAxMnB4IDEycHg7YmFja2dyb3VuZC1jb2xvcjogI2Q0NmIwZjtjb2xvcjogd2hpdGU7ICBib3JkZXI6IDBweDtib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMDUpIDBweCA2cHggMjRweCAwcHgscmdiYSgwLCAwLCAwLCAwLjA4KSAwcHggMHB4IDBweCAxcHg7Zm9udC13ZWlnaHQ6Ym9sZDttYXJnaW4tdG9wOjMwcHgnPlNpZ24gaGVyZTwvYnV0dG9uPjwvYT4gPC9kaXY+IDxkaXYgc3R5bGU9J2Rpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogY2VudGVyO21hcmdpbi10b3A6IDEwcHg7Jz4gPC9kaXY+PC9kaXY+PC9kaXY+PGRpdj48cD4gVGhpcyBpcyBhbiBhdXRvbWF0ZWQgZW1haWwgZnJvbSBPcGVuU2lnbuKEoi4gRm9yIGFueSBxdWVyaWVzIHJlZ2FyZGluZyB0aGlzIGVtYWlsLCBwbGVhc2UgY29udGFjdCB0aGUgc2VuZGVyIFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlckVtYWlsICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIGRpcmVjdGx5LklmIHlvdSB0aGluayB0aGlzIGVtYWlsIGlzIGluYXBwcm9wcmlhdGUgb3Igc3BhbSwgeW91IG1heSBmaWxlIGEgY29tcGxhaW50IHdpdGggT3BlblNpZ27ihKIgICA8YSBocmVmPSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuU2lnblVybCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB0YXJnZXQ9X2JsYW5rPmhlcmU8L2E+LjwvcD4gPC9kaXY+PC9kaXY+PC9ib2R5PiA8L2h0bWw+XCJcclxuICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBheGlvcy5wb3N0KHVybCwgcGFyYW1zLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcclxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0SXNVaUxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7IGlzU2hvdzogdHJ1ZSwgYWxlcnRNZXNzYWdlOiByZXNTaWduLm1lc3NhZ2UgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICBzZXRJc1VpTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIubWVzc2FnZS5pbmNsdWRlcyhcImlzIGVuY3J5cHRlZC5cIikpIHtcclxuICAgICAgICAgICAgICAgIHNldElzQWxlcnQoe1xyXG4gICAgICAgICAgICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGFsZXJ0TWVzc2FnZTogdChcImVuY3J5cHRlZC1wZGYtbm90LXN1cHBvcnRcIilcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVyciBpbiByZXF1ZXN0IHNpZ25pbmdcIiwgZXJyKTtcclxuICAgICAgICAgICAgICAgIHNldElzQWxlcnQoe1xyXG4gICAgICAgICAgICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGFsZXJ0TWVzc2FnZTogdChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIilcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2V0SXNTaWduUGFkKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2V0SXNBbGVydCh7XHJcbiAgICAgICAgICAgIGlzU2hvdzogdHJ1ZSxcclxuICAgICAgICAgICAgYWxlcnRNZXNzYWdlOiB0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVyciBpbiBlbWJlZHNpZ25cIiwgZXJyKTtcclxuICAgICAgICBzZXRJc1VpTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgc2V0SXNBbGVydCh7XHJcbiAgICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgICBhbGVydE1lc3NhZ2U6IHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vZWxzZSB2ZXJpZnkgdXNlcnMgZW1haWxcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB1c2VyUXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoUGFyc2UuVXNlcik7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHVzZXJRdWVyeS5nZXQoY3VycmVudFVzZXI/Lm9iamVjdElkLCB7XHJcbiAgICAgICAgICBzZXNzaW9uVG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgaXNFbWFpbFZlcmlmaWVkID0gdXNlcj8uZ2V0KFwiZW1haWxWZXJpZmllZFwiKTtcclxuICAgICAgICAgIHNldElzRW1haWxWZXJpZmllZChpc0VtYWlsVmVyaWZpZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gc2F2ZSB1c2VyJ3MgZW1haWxWZXJpZmllZCBpbiB1c2VyIGNsYXNzXCIpO1xyXG4gICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9mdW5jdGlvbiBmb3IgdXBkYXRlIFRvdXJTdGF0dXNcclxuICBjb25zdCBjbG9zZVRvdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBzZXRXaWRnZXRzVG91cihmYWxzZSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdG91ckNvbmZpZyA9IFtcclxuICAgIHtcclxuICAgICAgc2VsZWN0b3I6ICdbZGF0YS10dXQ9XCJJc1NpZ25lZFwiXScsXHJcbiAgICAgIGNvbnRlbnQ6IG1pblJlcXVpcmVkQ291bnRcclxuICAgICAgICA/IGBQbGVhc2UgY29uZmlybSB0aGF0IHlvdSBoYXZlIHNlbGVjdGVkIGF0IGxlYXN0ICR7bWluUmVxdWlyZWRDb3VudH0gY2hlY2tib3hlcy5gXHJcbiAgICAgICAgOiBcIkVuc3VyZSB0aGlzIGZpZWxkIGlzIGFjY3VyYXRlbHkgZmlsbGVkIGFuZCBtZWV0cyBhbGwgcmVxdWlyZW1lbnRzLlwiLFxyXG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgIH1cclxuICBdO1xyXG4gIC8vZnVuY3Rpb24gZm9yIGdldCBwZGYgcGFnZSBkZXRhaWxzXHJcbiAgY29uc3QgcGFnZURldGFpbHMgPSBhc3luYyAocGRmKSA9PiB7XHJcbiAgICBsZXQgcGRmV0hPYmogPSBbXTtcclxuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBwZGYubnVtUGFnZXM7IC8vIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG90YWxQYWdlczsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBnZXRQYWdlID0gYXdhaXQgcGRmLmdldFBhZ2UoaW5kZXggKyAxKTtcclxuICAgICAgY29uc3Qgc2NhbGUgPSAxO1xyXG4gICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldFBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZSB9KTtcclxuICAgICAgcGRmV0hPYmoucHVzaCh7IHBhZ2VOdW1iZXI6IGluZGV4ICsgMSwgd2lkdGgsIGhlaWdodCB9KTtcclxuICAgIH1cclxuICAgIHNldFBkZk9yaWdpbmFsV0gocGRmV0hPYmopO1xyXG4gICAgc2V0UGRmTG9hZCh0cnVlKTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIGNoYW5nZSBwYWdlXHJcbiAgZnVuY3Rpb24gY2hhbmdlUGFnZShvZmZzZXQpIHtcclxuICAgIHNldFBhZ2VOdW1iZXIoKHByZXZQYWdlTnVtYmVyKSA9PiBwcmV2UGFnZU51bWJlciArIG9mZnNldCk7XHJcbiAgfVxyXG5cclxuICAvL2Z1bmN0aW9uIGZvciBpbWFnZSB1cGxvYWQgb3IgdXBkYXRlXHJcbiAgY29uc3Qgb25JbWFnZUNoYW5nZSA9IChldmVudCkgPT4ge1xyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5maWxlcyAmJiBldmVudC50YXJnZXQuZmlsZXNbMF0pIHtcclxuICAgICAgb25JbWFnZVNlbGVjdChldmVudCwgc2V0SW1nV0gsIHNldEltYWdlKTtcclxuICAgIH1cclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIHVwbG9hZCBzdGFtcCBpbWFnZVxyXG4gIGNvbnN0IHNhdmVJbWFnZSA9ICgpID0+IHtcclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXHJcbiAgICBjb25zdCBjdXJyZW50U2lnbmVyID0gc2lnbmVyUG9zLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkXHJcbiAgICApO1xyXG4gICAgLy9nZXQgY3VycmVudCBwYWdlbnVtYmVyIHBsYWNlaG9sZGVyIGluZGV4XHJcbiAgICBjb25zdCBnZXRJbmRleCA9IGN1cnJlbnRTaWduZXJbMF0ucGxhY2VIb2xkZXIuZmluZEluZGV4KChvYmplY3QpID0+IHtcclxuICAgICAgcmV0dXJuIG9iamVjdC5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyO1xyXG4gICAgfSk7XHJcbiAgICAvL2dldCBjdXJyZW50IHNpZ25lciBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXHJcbiAgICBjb25zdCBwbGFjZWhvbGRlclBvc2l0aW9uID0gY3VycmVudFNpZ25lclswXS5wbGFjZUhvbGRlcjtcclxuICAgIC8vZnVuY3Rpb24gb2Ygc2F2ZSBpbWFnZSBhbmQgZ2V0IHVwZGF0ZWQgcG9zaXRpb24gd2l0aCBpbWFnZSB1cmxcclxuICAgIGNvbnN0IGdldFVwZGF0ZVBvc2l0aW9uID0gb25TYXZlSW1hZ2UoXHJcbiAgICAgIHBsYWNlaG9sZGVyUG9zaXRpb24sXHJcbiAgICAgIGdldEluZGV4LFxyXG4gICAgICBzaWduS2V5LFxyXG4gICAgICBpbWdXSCxcclxuICAgICAgaW1hZ2VcclxuICAgICk7XHJcblxyXG4gICAgLy9yZXBsYWNlIHVwZGF0ZWQgcGxhY2Vob2xkZXIgcG9zaXRpb24gd2l0aCBvbGQgZGF0YVxyXG4gICAgcGxhY2Vob2xkZXJQb3NpdGlvbi5zcGxpY2UoXHJcbiAgICAgIDAsXHJcbiAgICAgIHBsYWNlaG9sZGVyUG9zaXRpb24ubGVuZ3RoLFxyXG4gICAgICAuLi5nZXRVcGRhdGVQb3NpdGlvblxyXG4gICAgKTtcclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhIGluZGV4IG51bWJlciBpbiBhcnJheVxyXG4gICAgY29uc3QgaW5kZXhvZlNpZ25lciA9IHNpZ25lclBvcy5maW5kSW5kZXgoKG9iamVjdCkgPT4ge1xyXG4gICAgICByZXR1cm4gb2JqZWN0LnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZDtcclxuICAgIH0pO1xyXG4gICAgLy91cGRhdGUgY3VycmVudCBzaWduZXJzIGRhdGEgd2l0aCBuZXcgcGxhY2Vob2xkZXIgcG9zaXRpb24gYXJyYXkgZGF0YVxyXG4gICAgc2V0U2lnbmVyUG9zKChwcmV2U3RhdGUpID0+IHtcclxuICAgICAgY29uc3QgbmV3U3RhdGUgPSBbLi4ucHJldlN0YXRlXTsgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgc3RhdGVcclxuICAgICAgbmV3U3RhdGUuc3BsaWNlKGluZGV4b2ZTaWduZXIsIDEsIC4uLmN1cnJlbnRTaWduZXIpOyAvLyBNb2RpZnkgdGhlIGNvcHlcclxuICAgICAgcmV0dXJuIG5ld1N0YXRlOyAvLyBVcGRhdGUgdGhlIHN0YXRlIHdpdGggdGhlIG1vZGlmaWVkIGNvcHlcclxuICAgIH0pO1xyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiBmb3Igc2F2ZSBidXR0b24gdG8gc2F2ZSBzaWduYXR1cmUgb3IgaW1hZ2UgdXJsXHJcbiAgY29uc3Qgc2F2ZVNpZ24gPSAodHlwZSwgaXNEZWZhdWx0U2lnbiwgd2lkdGgsIGhlaWdodCkgPT4ge1xyXG4gICAgY29uc3QgaXNUeXBlVGV4dCA9IHdpZHRoICYmIGhlaWdodCA/IHRydWUgOiBmYWxzZTtcclxuICAgIGNvbnN0IHNpZ25hdHVyZUltZyA9IGlzRGVmYXVsdFNpZ25cclxuICAgICAgPyBpc0RlZmF1bHRTaWduID09PSBcImluaXRpYWxzXCJcclxuICAgICAgICA/IG15SW5pdGlhbFxyXG4gICAgICAgIDogZGVmYXVsdFNpZ25JbWdcclxuICAgICAgOiBzaWduYXR1cmU7XHJcbiAgICBsZXQgaW1nV0ggPSB7IHdpZHRoOiB3aWR0aCA/IHdpZHRoIDogXCJcIiwgaGVpZ2h0OiBoZWlnaHQgPyBoZWlnaHQgOiBcIlwiIH07XHJcbiAgICBzZXRJc1NpZ25QYWQoZmFsc2UpO1xyXG4gICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XHJcbiAgICBzZXRJbWFnZSgpO1xyXG5cclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXHJcbiAgICBjb25zdCBjdXJyZW50U2lnbmVyID0gc2lnbmVyUG9zLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkXHJcbiAgICApO1xyXG4gICAgLy9nZXQgY3VycmVudCBwYWdlbnVtYmVyIHBsYWNlaG9sZGVyIGluZGV4XHJcbiAgICBjb25zdCBnZXRJbmRleCA9IGN1cnJlbnRTaWduZXJbMF0ucGxhY2VIb2xkZXIuZmluZEluZGV4KChvYmplY3QpID0+IHtcclxuICAgICAgcmV0dXJuIG9iamVjdC5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9zZXQgZGVmYXVsdCBzaWduYXR1cmUgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodFxyXG4gICAgaWYgKGlzRGVmYXVsdFNpZ24pIHtcclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltZy5zcmMgPSBkZWZhdWx0U2lnbkltZztcclxuICAgICAgaWYgKGltZy5jb21wbGV0ZSkge1xyXG4gICAgICAgIGltZ1dIID0ge1xyXG4gICAgICAgICAgd2lkdGg6IGltZy53aWR0aCxcclxuICAgICAgICAgIGhlaWdodDogaW1nLmhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVyIHBsYWNlaG9sZGVyIHBvc2l0aW9uIGRhdGFcclxuICAgIGNvbnN0IHBsYWNlaG9sZGVyUG9zaXRpb24gPSBjdXJyZW50U2lnbmVyWzBdLnBsYWNlSG9sZGVyO1xyXG4gICAgLy9mdW5jdGlvbiBvZiBzYXZlIHNpZ25hdHVyZSBpbWFnZSBhbmQgZ2V0IHVwZGF0ZWQgcG9zaXRpb24gd2l0aCBzaWduYXR1cmUgaW1hZ2UgdXJsXHJcbiAgICBjb25zdCBnZXRVcGRhdGVQb3NpdGlvbiA9IG9uU2F2ZVNpZ24oXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIHBsYWNlaG9sZGVyUG9zaXRpb24sXHJcbiAgICAgIGdldEluZGV4LFxyXG4gICAgICBzaWduS2V5LFxyXG4gICAgICBzaWduYXR1cmVJbWcsXHJcbiAgICAgIGltZ1dILFxyXG4gICAgICBpc0RlZmF1bHRTaWduLFxyXG4gICAgICBpc1R5cGVUZXh0XHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZVNpZ25lckRhdGEgPSBjdXJyZW50U2lnbmVyLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgIGlmIChvYmouc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwbGFjZUhvbGRlcjogZ2V0VXBkYXRlUG9zaXRpb24gfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaW5kZXggPSBzaWduZXJQb3MuZmluZEluZGV4KFxyXG4gICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcclxuICAgICk7XHJcbiAgICBzZXRTaWduZXJQb3MoKHByZXZTdGF0ZSkgPT4ge1xyXG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IFsuLi5wcmV2U3RhdGVdO1xyXG4gICAgICBuZXdTdGF0ZS5zcGxpY2UoaW5kZXgsIDEsIC4uLnVwZGF0ZVNpZ25lckRhdGEpO1xyXG4gICAgICByZXR1cm4gbmV3U3RhdGU7XHJcbiAgICB9KTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIHNldCBkZWNsaW5lIHRydWUgb24gcHJlc3MgZGVjbGluZSBidXR0b25cclxuICBjb25zdCBkZWNsaW5lRG9jID0gYXN5bmMgKHJlYXNvbikgPT4ge1xyXG4gICAgY29uc3Qgc2VuZGVyVXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGpzb25TZW5kZXIgPSBKU09OLnBhcnNlKHNlbmRlclVzZXIpO1xyXG4gICAgc2V0SXNEZWNsaW5lKHsgaXNEZWNsaW5lZDogZmFsc2UgfSk7XHJcbiAgICBjb25zdCBkYXRhID0geyBJc0RlY2xpbmVkOiB0cnVlLCBEZWNsaW5lUmVhc29uOiByZWFzb24gfTtcclxuICAgIHNldElzVWlMb2FkaW5nKHRydWUpO1xyXG5cclxuICAgIGF3YWl0IGF4aW9zXHJcbiAgICAgIC5wdXQoXHJcbiAgICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgICBcImJhc2VVcmxcIlxyXG4gICAgICAgICl9Y2xhc3Nlcy9jb250cmFjdHNfRG9jdW1lbnQvJHtkb2N1bWVudElkfWAsXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgICBcIlgtUGFyc2UtU2Vzc2lvbi1Ub2tlblwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICAgIC50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcclxuICAgICAgICBjb25zdCByZXMgPSByZXN1bHQuZGF0YTtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50RGVjbGluZSA9IHtcclxuICAgICAgICAgICAgY3Vycm50OiBcIllvdURlY2xpbmVkXCIsXHJcbiAgICAgICAgICAgIGlzRGVjbGluZWQ6IHRydWVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBzZXRJc0RlY2xpbmUoY3VycmVudERlY2xpbmUpO1xyXG4gICAgICAgICAgc2V0SXNVaUxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICBldmVudDogXCJkZWNsaW5lZFwiLFxyXG4gICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgb2JqZWN0SWQ6IHBkZkRldGFpbHM/LlswXS5vYmplY3RJZCxcclxuICAgICAgICAgICAgICBmaWxlOiBwZGZEZXRhaWxzPy5bMF0/LlNpZ25lZFVybCB8fCBwZGZEZXRhaWxzPy5bMF0/LlVSTCxcclxuICAgICAgICAgICAgICBuYW1lOiBwZGZEZXRhaWxzPy5bMF0uTmFtZSxcclxuICAgICAgICAgICAgICBub3RlOiBwZGZEZXRhaWxzPy5bMF0uTm90ZSB8fCBcIlwiLFxyXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBwZGZEZXRhaWxzPy5bMF0uRGVzY3JpcHRpb24gfHwgXCJcIixcclxuICAgICAgICAgICAgICBzaWduZXJzOiBwZGZEZXRhaWxzPy5bMF0uU2lnbmVycz8ubWFwKCh4KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogeD8uTmFtZSxcclxuICAgICAgICAgICAgICAgIGVtYWlsOiB4Py5FbWFpbCxcclxuICAgICAgICAgICAgICAgIHBob25lOiB4Py5QaG9uZVxyXG4gICAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgICBkZWNsaW5lZEJ5OiBqc29uU2VuZGVyLmVtYWlsLFxyXG4gICAgICAgICAgICAgIGRlY2xpbmVkQXQ6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBwZGZEZXRhaWxzPy5bMF0uY3JlYXRlZEF0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgYXhpb3MucG9zdChcclxuICAgICAgICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2NhbGx3ZWJob29rYCxcclxuICAgICAgICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbnRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyIFwiLCBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIHVwZGF0aW5nIGZpZWxkIGlzIGRlY2xpbmUgXCIsIGVycik7XHJcbiAgICAgIH0pO1xyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiB0byBhZGQgZGVmYXVsdCBzaWduYXR1cmUgZm9yIGFsbCByZXF1ZXN0ZWQgcGxhY2Vob2xkZXIgb2Ygc2lnblxyXG4gIGNvbnN0IGFkZERlZmF1bHRTaWduYXR1cmUgPSAoKSA9PiB7XHJcbiAgICAvL2dldCBjdXJyZW50IHNpZ25lcnMgcGxhY2Vob2xkZXIgcG9zaXRpb24gZGF0YVxyXG4gICAgY29uc3QgY3VycmVudFNpZ25lclBvc2l0aW9uID0gc2lnbmVyUG9zLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkXHJcbiAgICApO1xyXG4gICAgLy9mdW5jdGlvbiBmb3Igc2F2ZSBkZWZhdWx0IHNpZ25hdHVyZSB1cmwgZm9yIGFsbCBwbGFjZWhvbGRlciBwb3NpdGlvblxyXG4gICAgY29uc3QgdXBkYXRlUGxhY2UgPSBhZGREZWZhdWx0U2lnbmF0dXJlSW1nKFxyXG4gICAgICBjdXJyZW50U2lnbmVyUG9zaXRpb25bMF0ucGxhY2VIb2xkZXIsXHJcbiAgICAgIGRlZmF1bHRTaWduSW1nXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZXNpZ25lclBvcyA9IHNpZ25lclBvcy5tYXAoKHgpID0+XHJcbiAgICAgIHguc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkID8geyAuLi54LCBwbGFjZUhvbGRlcjogdXBkYXRlUGxhY2UgfSA6IHhcclxuICAgICk7XHJcbiAgICBzZXRTaWduZXJQb3ModXBkYXRlc2lnbmVyUG9zKTtcclxuICAgIHNldERlZmF1bHRTaWduQWxlcnQoe1xyXG4gICAgICBpc1Nob3c6IGZhbHNlLFxyXG4gICAgICBhbGVydE1lc3NhZ2U6IFwiXCJcclxuICAgIH0pO1xyXG4gIH07XHJcbiAgY29uc3QgaGFuZGxlRG9udFNob3cgPSAoaXNDaGVja2VkKSA9PiB7XHJcbiAgICBzZXRJc0RvbnRTaG93KGlzQ2hlY2tlZCk7XHJcbiAgfTtcclxuICAvLyBjb25zb2xlLmxvZyhcInNpZ25lcnBvc1wiLCBzaWduZXJQb3MpO1xyXG4gIC8vZnVuY3Rpb24gdG8gY2xvc2UgdG91ciBhbmQgc2F2ZSB0b3VyIHN0YXR1c1xyXG4gIGNvbnN0IGNsb3NlUmVxdWVzdFNpZ25Ub3VyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgc2V0UmVxdWVzdFNpZ25Ub3VyKHRydWUpO1xyXG4gICAgaWYgKGlzRG9udFNob3cpIHtcclxuICAgICAgbGV0IHVwZGF0ZWRUb3VyU3RhdHVzID0gW107XHJcbiAgICAgIGlmICh0b3VyU3RhdHVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1cGRhdGVkVG91clN0YXR1cyA9IFsuLi50b3VyU3RhdHVzXTtcclxuICAgICAgICBjb25zdCByZXF1ZXN0U2lnbkluZGV4ID0gdG91clN0YXR1cy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAob2JqKSA9PiBvYmpbXCJyZXF1ZXN0U2lnblwiXSA9PT0gZmFsc2UgfHwgb2JqW1wicmVxdWVzdFNpZ25cIl0gPT09IHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChyZXF1ZXN0U2lnbkluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgdXBkYXRlZFRvdXJTdGF0dXNbcmVxdWVzdFNpZ25JbmRleF0gPSB7IHJlcXVlc3RTaWduOiB0cnVlIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHVwZGF0ZWRUb3VyU3RhdHVzLnB1c2goeyByZXF1ZXN0U2lnbjogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXBkYXRlZFRvdXJTdGF0dXMgPSBbeyByZXF1ZXN0U2lnbjogdHJ1ZSB9XTtcclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IGF4aW9zLnB1dChcclxuICAgICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICAgICAgICBcImJhc2VVcmxcIlxyXG4gICAgICAgICAgKX1jbGFzc2VzL2NvbnRyYWN0cyR7Y29udHJhY3ROYW1lfS8ke3NpZ25lclVzZXJJZH1gLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBUb3VyU3RhdHVzOiB1cGRhdGVkVG91clN0YXR1c1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXHJcbiAgICAgICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidXBkYXRlIHRvdXIgbWVzc2FnZXMgZXJyb3JcIiwgZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IHJlcXVlc3RTaWduVG91ckZ1bmN0aW9uID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdG91ckNvbmZpZyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIHNlbGVjdG9yOiAnW2RhdGEtdHV0PVwicmVhY3RvdXJGaXJzdFwiXScsXHJcbiAgICAgICAgY29udGVudDogKCkgPT4gKFxyXG4gICAgICAgICAgPFRvdXJDb250ZW50V2l0aEJ0blxyXG4gICAgICAgICAgICBtZXNzYWdlPXt0KFwidG91ci1tc3NnLnBkZi1yZXF1ZXN0LWZpbGUtMVwiKX1cclxuICAgICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKSxcclxuICAgICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgICBzdHlsZTogeyBmb250U2l6ZTogXCIxM3B4XCIgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS10dXQ9XCJwZGZBcmVhXCJdJyxcclxuICAgICAgICBjb250ZW50OiAoKSA9PiAoXHJcbiAgICAgICAgICA8VG91ckNvbnRlbnRXaXRoQnRuXHJcbiAgICAgICAgICAgIG1lc3NhZ2U9e3QoXCJ0b3VyLW1zc2cucGRmLXJlcXVlc3QtZmlsZS0yXCIpfVxyXG4gICAgICAgICAgICBpc0NoZWNrZWQ9e2hhbmRsZURvbnRTaG93fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApLFxyXG4gICAgICAgIHBvc2l0aW9uOiBcInRvcFwiLFxyXG4gICAgICAgIHN0eWxlOiB7IGZvbnRTaXplOiBcIjEzcHhcIiB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cInJlYWN0b3VyRmlmdGhcIl0nLFxyXG4gICAgICAgIGNvbnRlbnQ6ICgpID0+IChcclxuICAgICAgICAgIDxUb3VyQ29udGVudFdpdGhCdG5cclxuICAgICAgICAgICAgbWVzc2FnZT17dChcInRvdXItbXNzZy5wZGYtcmVxdWVzdC1maWxlLTNcIil9XHJcbiAgICAgICAgICAgIGlzQ2hlY2tlZD17aGFuZGxlRG9udFNob3d9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICksXHJcbiAgICAgICAgcG9zaXRpb246IFwidG9wXCIsXHJcbiAgICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIGNvbnN0IHNpZ25lZEJ5U3RlcCA9IHtcclxuICAgICAgc2VsZWN0b3I6ICdbZGF0YS10dXQ9XCJyZWFjdG91clNlY29uZFwiXScsXHJcbiAgICAgIGNvbnRlbnQ6ICgpID0+IChcclxuICAgICAgICA8VG91ckNvbnRlbnRXaXRoQnRuXHJcbiAgICAgICAgICBtZXNzYWdlPXt0KFwidG91ci1tc3NnLnBkZi1yZXF1ZXN0LWZpbGUtNFwiKX1cclxuICAgICAgICAgIGlzQ2hlY2tlZD17aGFuZGxlRG9udFNob3d9XHJcbiAgICAgICAgLz5cclxuICAgICAgKSxcclxuICAgICAgcG9zaXRpb246IFwidG9wXCIsXHJcbiAgICAgIHN0eWxlOiB7IGZvbnRTaXplOiBcIjEzcHhcIiB9XHJcbiAgICB9O1xyXG4gICAgLy9jaGVja2luZyBpZiBzaWduZWQgYnkgdXNlciBjb21wb25lbnQgZXhpc3QgdGhlbiBhZGQgc2lnbmVkIHN0ZXBcclxuICAgIGNvbnN0IHNpZ25lZEJ5ID1cclxuICAgICAgc2lnbmVkU2lnbmVycy5sZW5ndGggPiAwXHJcbiAgICAgICAgPyBbLi4udG91ckNvbmZpZy5zbGljZSgwLCAwKSwgc2lnbmVkQnlTdGVwLCAuLi50b3VyQ29uZmlnLnNsaWNlKDApXVxyXG4gICAgICAgIDogdG91ckNvbmZpZztcclxuXHJcbiAgICAvL2NoZWNraW5nIGlmIGRlZmF1bHQgc2lnbmF0dXJlIGNvbXBvbmVudCBleGlzdCB0aGVuIGFkZCBkZWZhdWx0U2lnbiBzdGVwXHJcbiAgICBjb25zdCBkZWZhdWx0U2lnblN0ZXAgPSB7XHJcbiAgICAgIHNlbGVjdG9yOiAnW2RhdGEtdHV0PVwicmVhY3RvdXJUaGlyZFwiXScsXHJcbiAgICAgIGNvbnRlbnQ6ICgpID0+IChcclxuICAgICAgICA8VG91ckNvbnRlbnRXaXRoQnRuXHJcbiAgICAgICAgICBtZXNzYWdlPXt0KFwidG91ci1tc3NnLnBkZi1yZXF1ZXN0LWZpbGUtNVwiKX1cclxuICAgICAgICAgIGlzQ2hlY2tlZD17aGFuZGxlRG9udFNob3d9XHJcbiAgICAgICAgLz5cclxuICAgICAgKSxcclxuICAgICAgcG9zaXRpb246IFwidG9wXCIsXHJcbiAgICAgIHN0eWxlOiB7IGZvbnRTaXplOiBcIjEzcHhcIiB9XHJcbiAgICB9O1xyXG4gICAgLy9pbmRleCBpcyBoYW5kbGUgaXMgc2lnbmVkIGJ5IGV4aXN0IHRoZW4gMiBlbHNlIDEgdG8gYWRkIHRvdXIgc3RlcFxyXG4gICAgY29uc3QgaW5kZXggPSBzaWduZWRTaWduZXJzLmxlbmd0aCA+IDAgPyAyIDogMTtcclxuICAgIGNvbnN0IGRlZmF1bHRTaWduVG91ciA9IGRlZmF1bHRTaWduSW1nXHJcbiAgICAgID8gWy4uLnNpZ25lZEJ5LnNsaWNlKDAsIGluZGV4KSwgZGVmYXVsdFNpZ25TdGVwLCAuLi5zaWduZWRCeS5zbGljZShpbmRleCldXHJcbiAgICAgIDogc2lnbmVkQnk7XHJcblxyXG4gICAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICAgIHRvdXJDb25maWcuc2hpZnQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8VG91clxyXG4gICAgICAgIG9uUmVxdWVzdENsb3NlPXtjbG9zZVJlcXVlc3RTaWduVG91cn1cclxuICAgICAgICBzdGVwcz17aXNNb2JpbGUgPyB0b3VyQ29uZmlnIDogZGVmYXVsdFNpZ25Ub3VyfVxyXG4gICAgICAgIGlzT3Blbj17dHJ1ZX1cclxuICAgICAgICBjbG9zZVdpdGhNYXNrPXtmYWxzZX1cclxuICAgICAgICByb3VuZGVkPXs1fVxyXG4gICAgICAvPlxyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVVc2VyRGV0YWlscyA9ICgpID0+IHtcclxuICAgIHNldElzUHVibGljQ29udGFjdCh0cnVlKTtcclxuICB9O1xyXG5cclxuICAvL2BoYW5kbGVQdWJsaWNVc2VyYCBmdW5jdGlvbiB0byB1c2UgY3JlYXRlIHVzZXIgZnJvbSBwdWJsaWMgcm9sZSBhbmQgY3JlYXRlIGRvY3VtZW50IGZyb20gcHVibGljIHRlbXBsYXRlXHJcbiAgY29uc3QgaGFuZGxlUHVibGljVXNlciA9IGFzeW5jIChlKSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzZXRMb2FkaW5nKHRydWUpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgIC4uLmNvbnRhY3QsXHJcbiAgICAgICAgdGVtcGxhdGVpZDogcGRmRGV0YWlsc1swXT8ub2JqZWN0SWQsXHJcbiAgICAgICAgcm9sZTogcGRmRGV0YWlsc1swXT8uUHVibGljUm9sZVswXVxyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCB1c2VyUmVzID0gYXdhaXQgYXhpb3MucG9zdChcclxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgIFwiYmFzZVVybFwiXHJcbiAgICAgICAgKX0vZnVuY3Rpb25zL3B1YmxpY3VzZXJsaW5rY29udGFjdHRvZG9jYCxcclxuICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICh1c2VyUmVzPy5kYXRhPy5yZXN1bHQpIHtcclxuICAgICAgICBzZXRSZXModXNlclJlcy5kYXRhLnJlc3VsdCk7XHJcbiAgICAgICAgYXdhaXQgU2VuZE90cCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gcHVibGljLXNpZ24gdG8gY3JlYXRlIHVzZXIgZGV0YWlsc1wiKTtcclxuICAgICAgICBhbGVydCh0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJlXCIsIGUpO1xyXG4gICAgICAvLyAgIHNldElzTG9hZGVyKGZhbHNlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IChlKSA9PiB7XHJcbiAgICBzZXRDb250YWN0KChwcmV2KSA9PiAoeyAuLi5wcmV2LCBbZS50YXJnZXQubmFtZV06IGUudGFyZ2V0LnZhbHVlIH0pKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBTZW5kT3RwID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFyYW1zID0geyBlbWFpbDogY29udGFjdC5lbWFpbCwgZG9jSWQ6IHJlcy5kb2NJZCB9O1xyXG5cclxuICAgICAgY29uc3QgT3RwID0gYXdhaXQgYXhpb3MucG9zdChcclxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9L2Z1bmN0aW9ucy9TZW5kT1RQTWFpbFYxYCxcclxuICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChPdHApIHtcclxuICAgICAgICBzZXRJc090cCh0cnVlKTtcclxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiB2ZXJpZnkgb3RwIGluIHB1YmxpYy1zaWduXCIsIGVycm9yKTtcclxuICAgICAgYWxlcnQodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vdmVyaWZ5IE9UUCBzZW5kIG9uIHZpYSBlbWFpbFxyXG4gIGNvbnN0IFZlcmlmeU9UUCA9IGFzeW5jIChlKSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzZXRMb2FkaW5nKHRydWUpO1xyXG4gICAgY29uc3Qgc2VydmVyVXJsID1cclxuICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKTtcclxuICAgIGNvbnN0IHBhcnNlSWQgPVxyXG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIikgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpO1xyXG4gICAgaWYgKG90cCkge1xyXG4gICAgICAvLyBzZXRMb2FkaW5nKHRydWUpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCB1cmwgPSBgJHtzZXJ2ZXJVcmx9L2Z1bmN0aW9ucy9BdXRoTG9naW5Bc01haWwvYDtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogcGFyc2VJZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbGV0IGJvZHkgPSB7XHJcbiAgICAgICAgICBlbWFpbDogY29udGFjdC5lbWFpbCxcclxuICAgICAgICAgIG90cDogb3RwXHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgdXNlciA9IGF3YWl0IGF4aW9zLnBvc3QodXJsLCBib2R5LCB7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcbiAgICAgICAgaWYgKHVzZXIuZGF0YS5yZXN1bHQgPT09IFwiSW52YWxpZCBPdHBcIikge1xyXG4gICAgICAgICAgYWxlcnQodChcImludmFsaWQtb3RwXCIpKTtcclxuICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodXNlci5kYXRhLnJlc3VsdCA9PT0gXCJ1c2VyIG5vdCBmb3VuZCFcIikge1xyXG4gICAgICAgICAgYWxlcnQodChcInVzZXItbm90LWZvdW5kXCIpKTtcclxuICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgX3VzZXIgPSB1c2VyLmRhdGEucmVzdWx0O1xyXG4gICAgICAgICAgY29uc3QgcGFyc2VJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKTtcclxuICAgICAgICAgIGF3YWl0IFBhcnNlLlVzZXIuYmVjb21lKF91c2VyLnNlc3Npb25Ub2tlbik7XHJcbiAgICAgICAgICBjb25zdCBjb250cmFjdFVzZXJEZXRhaWxzID0gYXdhaXQgY29udHJhY3RVc2VycygpO1xyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJVc2VySW5mb3JtYXRpb25cIiwgSlNPTi5zdHJpbmdpZnkoX3VzZXIpKTtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICBgUGFyc2UvJHtwYXJzZUlkfS9jdXJyZW50VXNlcmAsXHJcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KF91c2VyKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChjb250cmFjdFVzZXJEZXRhaWxzICYmIGNvbnRyYWN0VXNlckRldGFpbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgICAgICBcIkV4dGFuZF9DbGFzc1wiLFxyXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbnRyYWN0VXNlckRldGFpbHMpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ1c2VybmFtZVwiLCBfdXNlci5uYW1lKTtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYWNjZXNzdG9rZW5cIiwgX3VzZXIuc2Vzc2lvblRva2VuKTtcclxuICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgLy8gbmF2aWdhdGUoYC9sb2FkL3JlY2lwaWVudFNpZ25QZGYvJHtyZXM/LmRvY0lkfS8ke3Jlcz8uY29udGFjdElkfWApO1xyXG4gICAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJteV9tb2RhbFwiKS5jbG9zZSgpO1xyXG4gICAgICAgICAgc2V0SXNQdWJsaWNDb250YWN0KGZhbHNlKTtcclxuICAgICAgICAgIHNldElzUHVibGljVGVtcGxhdGUoZmFsc2UpO1xyXG4gICAgICAgICAgc2V0SXNMb2FkaW5nKHtcclxuICAgICAgICAgICAgaXNMb2FkOiBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBzZXREb2N1bWVudElkKHJlcz8uZG9jSWQpO1xyXG4gICAgICAgICAgZ2V0RG9jdW1lbnREZXRhaWxzKHJlcz8uZG9jSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVyciBcIiwgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhbGVydCh0KFwiZW50ZXItb3RwLWFsZXJ0XCIpKTtcclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IGhhbmRsZUNsb3NlT3RwID0gKCkgPT4ge1xyXG4gICAgc2V0SXNQdWJsaWNDb250YWN0KGZhbHNlKTtcclxuICAgIHNldExvYWRpbmcoZmFsc2UpO1xyXG4gICAgc2V0SXNPdHAoZmFsc2UpO1xyXG4gICAgc2V0T3RwKCk7XHJcbiAgICBzZXRDb250YWN0KHtcclxuICAgICAgbmFtZTogXCJcIixcclxuICAgICAgZW1haWw6IFwiXCIsXHJcbiAgICAgIHBob25lOiBcIlwiXHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPERuZFByb3ZpZGVyIGJhY2tlbmQ9e0hUTUw1QmFja2VuZH0+XHJcbiAgICAgIDxUaXRsZSB0aXRsZT17cHJvcHMudGVtcGxhdGVJZCA/IFwiUHVibGljIFNpZ25cIiA6IFwiUmVxdWVzdCBTaWduXCJ9IC8+XHJcbiAgICAgIHtpc1N1YnNjcmlwdGlvbkV4cGlyZWQgPyAoXHJcbiAgICAgICAgPE1vZGFsVWlcclxuICAgICAgICAgIHRpdGxlPXt0KFwic3Vic2NyaXB0aW9uLWV4cGlyZWRcIil9XHJcbiAgICAgICAgICBpc09wZW49e2lzU3Vic2NyaXB0aW9uRXhwaXJlZH1cclxuICAgICAgICAgIHNob3dDbG9zZT17ZmFsc2V9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBweS00IG1kOnB5LTUgZ2FwLTVcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSBtZDp0ZXh0LWxnIGZvbnQtbm9ybWFsXCI+XHJcbiAgICAgICAgICAgICAge3QoXCJvd25lci1zdWJzY3JpcHRpb24tZXhwaXJlZFwiKX1cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9Nb2RhbFVpPlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDw+XHJcbiAgICAgICAgICB7aXNMb2FkaW5nLmlzTG9hZCA/IChcclxuICAgICAgICAgICAgPExvYWRlcldpdGhNc2cgaXNMb2FkaW5nPXtpc0xvYWRpbmd9IC8+XHJcbiAgICAgICAgICApIDogaGFuZGxlRXJyb3IgPyAoXHJcbiAgICAgICAgICAgIDxIYW5kbGVFcnJvciBoYW5kbGVFcnJvcj17aGFuZGxlRXJyb3J9IC8+XHJcbiAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIHtpc1VpTG9hZGluZyAmJiAoXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGgtWzEwMHZoXSB3LWZ1bGwgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgei1bOTk5XSBiZy1bI2U2ZjJmMl0gYmctb3BhY2l0eS04MFwiPlxyXG4gICAgICAgICAgICAgICAgICA8TG9hZGVyIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzEzcHhdIHRleHQtYmFzZS1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3QoXCJsb2FkaW5nLW1zc2dcIil9XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAge2lzQ2VsZWJyYXRpb24gJiYgKFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSB6LVsxMDAwXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8Q29uZmV0dGlcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aD17d2luZG93LmlubmVyV2lkdGh9XHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXt3aW5kb3cuaW5uZXJIZWlnaHR9XHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6XHJcbiAgICAgICAgICAgICAgICAgICAgaXNFeHBpcmVkIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKGlzRGVjbGluZS5pc0RlY2xpbmVkICYmIGlzRGVjbGluZS5jdXJybnQgPT09IFwiYW5vdGhlclwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgPyBcIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOiBcImF1dG9cIlxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIG9wLWNhcmQgb3ZlcmZsb3ctaGlkZGVuIGZsZXggZmxleC1jb2wgbWQ6ZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGJnLWJhc2UtMzAwXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7IXJlcXVlc3RTaWduVG91ciAmJlxyXG4gICAgICAgICAgICAgICAgICBzaWduZXJPYmplY3RJZCAmJlxyXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0U2lnblRvdXJGdW5jdGlvbigpfVxyXG4gICAgICAgICAgICAgICAgPE1vZGFsVWlcclxuICAgICAgICAgICAgICAgICAgaXNPcGVuPXtpc0FsZXJ0LmlzU2hvd31cclxuICAgICAgICAgICAgICAgICAgdGl0bGU9e3QoXCJhbGVydC1tZXNzYWdlXCIpfVxyXG4gICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICBzZXRJc0FsZXJ0KHsgaXNTaG93OiBmYWxzZSwgYWxlcnRNZXNzYWdlOiBcIlwiIH0pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLWZ1bGwgcC1bMjBweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8cD57aXNBbGVydC5hbGVydE1lc3NhZ2V9PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQWxlcnQoeyBpc1Nob3c6IGZhbHNlLCBhbGVydE1lc3NhZ2U6IFwiXCIgfSlcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG10LTMgcHgtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3QoXCJva1wiKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L01vZGFsVWk+XHJcblxyXG4gICAgICAgICAgICAgICAgPFRvdXJcclxuICAgICAgICAgICAgICAgICAgc2hvd051bWJlcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAgIHNob3dOYXZpZ2F0aW9uPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgc2hvd05hdmlnYXRpb25OdW1iZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICBvblJlcXVlc3RDbG9zZT17Y2xvc2VUb3VyfVxyXG4gICAgICAgICAgICAgICAgICBzdGVwcz17dG91ckNvbmZpZ31cclxuICAgICAgICAgICAgICAgICAgaXNPcGVuPXt3aWRnZXRzVG91cn1cclxuICAgICAgICAgICAgICAgICAgcm91bmRlZD17NX1cclxuICAgICAgICAgICAgICAgICAgY2xvc2VXaXRoTWFzaz17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICAgIHsvKiB0aGlzIG1vZGFsIGlzIHVzZWQgdG8gc2hvdyBkZWNsaW5lIGFsZXJ0ICovfVxyXG4gICAgICAgICAgICAgICAgPFBkZkRlY2xpbmVNb2RhbFxyXG4gICAgICAgICAgICAgICAgICBzaG93PXtpc0RlY2xpbmUuaXNEZWNsaW5lZH1cclxuICAgICAgICAgICAgICAgICAgaGVhZE1zZz17dChcImRvY3VtZW50LWRlY2xpbmVcIil9XHJcbiAgICAgICAgICAgICAgICAgIGJvZHlNc3NnPXtcclxuICAgICAgICAgICAgICAgICAgICBpc0RlY2xpbmUuY3Vycm50ID09PSBcIlN1cmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPyB0KFwiZGVjbGluZS1hbGVydC0yXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICA6IGlzRGVjbGluZS5jdXJybnQgPT09IFwiWW91RGVjbGluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHQoXCJkZWNsaW5lLWFsZXJ0LTFcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0RlY2xpbmUuY3Vycm50ID09PSBcImFub3RoZXJcIiAmJiB0KFwiZGVjbGluZS1hbGVydC0zXCIpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZm9vdGVyTWVzc2FnZT17aXNEZWNsaW5lLmN1cnJudCA9PT0gXCJTdXJlXCJ9XHJcbiAgICAgICAgICAgICAgICAgIGRlY2xpbmVEb2M9e2RlY2xpbmVEb2N9XHJcbiAgICAgICAgICAgICAgICAgIHNldElzRGVjbGluZT17c2V0SXNEZWNsaW5lfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIHsvKiB0aGlzIG1vZGFsIGlzIHVzZWQgZm9yIHNob3cgZXhwaXJlZCBhbGVydCAqL31cclxuICAgICAgICAgICAgICAgIDxQZGZEZWNsaW5lTW9kYWxcclxuICAgICAgICAgICAgICAgICAgc2hvdz17aXNFeHBpcmVkfVxyXG4gICAgICAgICAgICAgICAgICBoZWFkTXNnPVwiRG9jdW1lbnQgZXhwaXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgIGJvZHlNc3NnPXtgVGhpcyBkb2N1bWVudCBleHBpcmVkIG9uICR7ZXhwaXJlZERhdGV9IGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlIHRvIHNpZ24uYH1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICB7IWlzRW1haWxWZXJpZmllZCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgIDxWZXJpZnlFbWFpbFxyXG4gICAgICAgICAgICAgICAgICAgIGlzVmVyaWZ5TW9kYWw9e2lzVmVyaWZ5TW9kYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNWZXJpZnlNb2RhbD17c2V0SXNWZXJpZnlNb2RhbH1cclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVWZXJpZnlFbWFpbD17aGFuZGxlVmVyaWZ5RW1haWx9XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0T3RwPXtzZXRPdHB9XHJcbiAgICAgICAgICAgICAgICAgICAgb3RwPXtvdHB9XHJcbiAgICAgICAgICAgICAgICAgICAgb3RwTG9hZGVyPXtvdHBMb2FkZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVmVyaWZ5QnRuPXtoYW5kbGVWZXJpZnlCdG59XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlUmVzZW5kPXtoYW5kbGVSZXNlbmR9XHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICApfVxyXG5cclxuICAgICAgICAgICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICAgICAgICAgIGlzT3Blbj17aXNQdWJsaWNDb250YWN0fVxyXG4gICAgICAgICAgICAgICAgICB0aXRsZT17aXNPdHAgPyBcIlZlcmlmeSBlbWFpbFwiIDogXCJDb250YWN0IERldGFpbHNcIn1cclxuICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZU90cCgpO1xyXG4gICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtZnVsbCBwLVsyMHB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtpc090cCA/IChcclxuICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtWZXJpZnlPVFB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57dChcImdldC1vdHAtYWxlcnRcIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJvcC1pbnB1dCBvcC1pbnB1dC1ib3JkZXJlZCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm90cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIFZlcmlmaWNhdGlvbiBDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnZhbGlkPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eSh0KFwiaW5wdXQtcmVxdWlyZWRcIikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e290cH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRPdHAoZS50YXJnZXQudmFsdWUpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17bG9hZGluZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbW9kYWwtYWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2VPdHAoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gXCJMb2FkaW5nLi4uXCIgOiBcIlZlcmlmeVwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBvblN1Ym1pdD17aGFuZGxlUHVibGljVXNlcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJvcC1pbnB1dCBvcC1pbnB1dC1ib3JkZXJlZCAgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00IG9wYWNpdHktNzBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggOGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZaTTEyLjczNSAxNGMuNjE4IDAgMS4wOTMtLjU2MS44NzItMS4xMzlhNi4wMDIgNi4wMDIgMCAwIDAtMTEuMjE1IDBjLS4yMi41NzguMjU0IDEuMTM5Ljg3MiAxLjEzOWg5LjQ3WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwibmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb250YWN0Lm5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJuYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnZhbGlkPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eSh0KFwiaW5wdXQtcmVxdWlyZWRcIikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00IG9wYWNpdHktNzBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIuNSAzQTEuNSAxLjUgMCAwIDAgMSA0LjV2Ljc5M2MuMDI2LjAwOS4wNTEuMDIuMDc2LjAzMkw3LjY3NCA4LjUxYy4yMDYuMS40NDYuMS42NTIgMGw2LjU5OC0zLjE4NUEuNzU1Ljc1NSAwIDAgMSAxNSA1LjI5M1Y0LjVBMS41IDEuNSAwIDAgMCAxMy41IDNoLTExWlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUgNi45NTQgOC45NzggOS44NmEyLjI1IDIuMjUgMCAwIDEtMS45NTYgMEwxIDYuOTU0VjExLjVBMS41IDEuNSAwIDAgMCAyLjUgMTNoMTFhMS41IDEuNSAwIDAgMCAxLjUtMS41VjYuOTU0WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZW1haWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29udGFjdC5lbWFpbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVtYWlsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnZhbGlkPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eSh0KFwiaW5wdXQtcmVxdWlyZWRcIikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJvcC1pbnB1dCBvcC1pbnB1dC1ib3JkZXJlZCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy00IGgtNCBvcGFjaXR5LTcwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDhhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2Wk0xMi43MzUgMTRjLjYxOCAwIDEuMDkzLS41NjEuODcyLTEuMTM5YTYuMDAyIDYuMDAyIDAgMCAwLTExLjIxNSAwYy0uMjIuNTc4LjI1NCAxLjEzOS44NzIgMS4xMzloOS40N1pcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbnRhY3QucGhvbmV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicGhvbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJncm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJwaG9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvcC1tb2RhbC1hY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZU90cCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9zZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bG9hZGluZyA/IFwiTG9hZGluZy4uLlwiIDogXCJTdWJtaXRcIn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvTW9kYWxVaT5cclxuICAgICAgICAgICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICAgICAgICAgIGlzT3Blbj17ZGVmYXVsdFNpZ25BbGVydC5pc1Nob3d9XHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPXt0KFwiYXV0by1zaWduLWFsbFwiKX1cclxuICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydCh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIHAtWzIwcHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+e2RlZmF1bHRTaWduQWxlcnQuYWxlcnRNZXNzYWdlfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzFweF0gdy1mdWxsIG15LVsxNXB4XSBiZy1bIzlmOWY5Zl1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB7ZGVmYXVsdFNpZ25JbWcgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gYWRkRGVmYXVsdFNpZ25hdHVyZSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInllc1wiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvdzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0TWVzc2FnZTogXCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJjbG9zZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQWxlcnQoeyBpc1Nob3c6IGZhbHNlLCBhbGVydE1lc3NhZ2U6IFwiXCIgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJva1wiKX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9Nb2RhbFVpPlxyXG4gICAgICAgICAgICAgICAgey8qIHRoaXMgY29tcG9uZW50IHVzZWQgdG8gcmVuZGVyIGFsbCBwZGYgcGFnZXMgaW4gbGVmdCBzaWRlICovfVxyXG4gICAgICAgICAgICAgICAgPFJlbmRlckFsbFBkZlBhZ2VcclxuICAgICAgICAgICAgICAgICAgc2lnbmVyUG9zPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgIHNpZ25lck9iamVjdElkPXtzaWduZXJPYmplY3RJZH1cclxuICAgICAgICAgICAgICAgICAgc2lnblBkZlVybD17XHJcbiAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlsc1swXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIChwZGZEZXRhaWxzWzBdPy5TaWduZWRVcmwgfHwgcGRmRGV0YWlsc1swXT8uVVJMKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGFsbFBhZ2VzPXthbGxQYWdlc31cclxuICAgICAgICAgICAgICAgICAgc2V0QWxsUGFnZXM9e3NldEFsbFBhZ2VzfVxyXG4gICAgICAgICAgICAgICAgICBzZXRQYWdlTnVtYmVyPXtzZXRQYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICBjb250YWluZXJXSD17Y29udGFpbmVyV0h9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgey8qIHBkZiByZW5kZXIgdmlldyAqL31cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiIHctZnVsbCBtZDp3LVs1NyVdIGZsZXggbXItNFwiPlxyXG4gICAgICAgICAgICAgICAgICA8UGRmWm9vbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldFNjYWxlPXtzZXRTY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgICAgIHNldFpvb21QZXJjZW50PXtzZXRab29tUGVyY2VudH1cclxuICAgICAgICAgICAgICAgICAgICB6b29tUGVyY2VudD17em9vbVBlcmNlbnR9XHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiIHctZnVsbCBtZDp3LVs5NSVdIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHsvKiB0aGlzIG1vZGFsIGlzIHVzZWQgc2hvdyB0aGlzIGRvY3VtZW50IGlzIGFscmVhZHkgc2lnbiAqL31cclxuICAgICAgICAgICAgICAgICAgICA8TW9kYWxVaVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNPcGVuPXtpc0NvbXBsZXRlZC5pc01vZGFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e3QoXCJkb2N1bWVudC1zaWduZWRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0NvbXBsZXRlZCgocHJldikgPT4gKHsgLi4ucHJldiwgaXNNb2RhbDogZmFsc2UgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZVdpZHRoPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgIWlzQ29tcGxldGVkPy5tZXNzYWdlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibWQ6bWluLXctWzQ0MHB4XSBtZDptYXgtdy1bNDAwcHhdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtZnVsbCBwLVsyMHB4XSB0ZXh0LWJhc2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aXNDb21wbGV0ZWQ/Lm1lc3NhZ2UgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e2lzQ29tcGxldGVkPy5tZXNzYWdlfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LVsxNXB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3QoXCJkb2N1bWVudC1zaWduZWQtYWxlcnQtNFwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHshaXNDb21wbGV0ZWQ/Lm1lc3NhZ2UgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBtdC00IGdhcC0xIHB4LVsxNXB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUb1ByaW50KGUsIHBkZlVybCwgc2V0SXNEb3dubG9hZGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9udC1bNTAwXSB0ZXh0LVsxM3B4XSBtci1bNXB4XSBvcC1idG4gb3AtYnRuLW5ldXRyYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXByaW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInByaW50XCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0Rvd25sb2FkaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvbnQtWzUwMF0gdGV4dC1bMTNweF0gbXItWzVweF0gb3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWF3YXJkIG14LVszcHhdIGxnOm14LTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiY2VydGlmaWNhdGVcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9udC1bNTAwXSB0ZXh0LVsxM3B4XSBtci1bNXB4XSBvcC1idG4gb3AtYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkUGRmKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZlVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRG93bmxvYWRpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1kb3dubG9hZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJkb3dubG9hZFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L01vZGFsVWk+XHJcbiAgICAgICAgICAgICAgICAgICAge2lzRG93bmxvYWRpbmcgPT09IFwicGRmXCIgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCB6LVsxMDAwXSBpbnNldC0wIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGJnLWJsYWNrIGJnLW9wYWNpdHktMzBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPExvYWRlciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICA8TW9kYWxVaVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNPcGVuPXtpc0Rvd25sb2FkaW5nID09PSBcImNlcnRpZmljYXRlXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gdChcImdlbmVyYXRpbmctY2VydGlmaWNhdGVcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHQoXCJwZGYtZG93bmxvYWRcIilcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlPXsoKSA9PiBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0zIG1kOnAtNSB0ZXh0LVsxM3B4XSBtZDp0ZXh0LWJhc2UgdGV4dC1jZW50ZXIgdGV4dC1iYXNlLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2lzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIn17XCIgXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt0KFwiZ2VuZXJhdGUtY2VydGlmaWNhdGUtYWxlcnRcIil9PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Nb2RhbFVpPlxyXG4gICAgICAgICAgICAgICAgICAgIHsvKiB0aGlzIGNvbXBvbmVudCBpcyB1c2VkIGZvciBzaWduYXR1cmUgcGFkIG1vZGFsICovfVxyXG4gICAgICAgICAgICAgICAgICAgIDxTaWduUGFkXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25QYWQ9e2lzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlzU3RhbXA9e2lzU3RhbXB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0PXtzZXRJc0ltYWdlU2VsZWN0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkPXtzZXRJc1NpZ25QYWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZT17c2V0SW1hZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0ltYWdlU2VsZWN0PXtpc0ltYWdlU2VsZWN0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1hZ2VSZWY9e2ltYWdlUmVmfVxyXG4gICAgICAgICAgICAgICAgICAgICAgb25JbWFnZUNoYW5nZT17b25JbWFnZUNoYW5nZX1cclxuICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZT17c2V0U2lnbmF0dXJlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1hZ2U9e2ltYWdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgb25TYXZlSW1hZ2U9e3NhdmVJbWFnZX1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uU2F2ZVNpZ249e3NhdmVTaWdufVxyXG4gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFNpZ249e2RlZmF1bHRTaWduSW1nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgbXlJbml0aWFsPXtteUluaXRpYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0luaXRpYWw9e2lzSW5pdGlhbH1cclxuICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbD17c2V0SXNJbml0aWFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cclxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJXaWRnZXRzRGV0YWlscz17Y3VycldpZGdldHNEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzPXtzZXRDdXJyV2lkZ2V0c0RldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICB7LyogcGRmIGhlYWRlciB3aGljaCBjb250YWluIGZ1bmlzaCBiYWNrIGJ1dHRvbiAqL31cclxuICAgICAgICAgICAgICAgICAgICA8SGVhZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc1BkZlJlcXVlc3RGaWxlcz17aXNQdWJsaWNUZW1wbGF0ZSA/IGZhbHNlIDogdHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhbGxQYWdlcz17YWxsUGFnZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VQYWdlPXtjaGFuZ2VQYWdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgIHNpZ25lclBvcz17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNTaWduZWQ9e2lzU2lnbmVkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV0ZWQ9e2lzQ29tcGxldGVkLmlzQ2VydGlmaWNhdGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBlbWJlZFdpZGdldHNEYXRhPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdWJsaWNUZW1wbGF0ZSA/IGhhbmRsZVVzZXJEZXRhaWxzIDogZW1iZWRXaWRnZXRzRGF0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNTaG93SGVhZGVyPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWNsaW5lPXtzZXRJc0RlY2xpbmV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBkZWNsaW5lPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNpZ25lcj17Y3VycmVudFNpZ25lcn1cclxuICAgICAgICAgICAgICAgICAgICAgIHBkZlVybD17cGRmVXJsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeVNpZ249e2FscmVhZHlTaWdufVxyXG4gICAgICAgICAgICAgICAgICAgICAgdG90YWxab29tUGVyY2VudD17dG90YWxab29tUGVyY2VudH1cclxuICAgICAgICAgICAgICAgICAgICAgIHNldFRvdGFsWm9vbVBlcmNlbnQ9e3NldFRvdGFsWm9vbVBlcmNlbnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRTY2FsZT17c2V0U2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0Wm9vbVBlcmNlbnQ9e3NldFpvb21QZXJjZW50fVxyXG4gICAgICAgICAgICAgICAgICAgICAgem9vbVBlcmNlbnQ9e3pvb21QZXJjZW50fVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNQdWJsaWNUZW1wbGF0ZT17aXNQdWJsaWNUZW1wbGF0ZX1cclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHJlZj17ZGl2UmVmfSBkYXRhLXR1dD1cInBkZkFyZWFcIiBjbGFzc05hbWU9XCJoLVs5NSVdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7Y29udGFpbmVyV0ggJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVuZGVyUGRmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZk5ld1dpZHRoPXtwZGZOZXdXaWR0aH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZXJQb3M9e3NpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzRW1haWw9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZlVybD17cGRmVXJsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG51bVBhZ2VzPXtudW1QYWdlc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlRGV0YWlscz17cGFnZURldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmUmVxdWVzdD17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZXJPYmplY3RJZD17c2lnbmVyT2JqZWN0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkU2lnbmVycz17c2lnbmVkU2lnbmVyc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQZGZMb2FkPXtzZXRQZGZMb2FkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkxvYWQ9e3BkZkxvYWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmVyUG9zPXtzZXRTaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbD17c2V0SXNJbml0aWFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3NldFZhbGlkYXRlQWxlcnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5TaWduZWRXaWRnZXRJZD17dW5TaWduZWRXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZD17c2V0U2VsZWN0V2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17c2V0Q3VycldpZGdldHNEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpdlJlZj17ZGl2UmVmfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUmVzaXplPXtzZXRJc1Jlc2l6ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Jlc2l6ZT17aXNSZXNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG90YWxab29tUGVyY2VudD17c2V0VG90YWxab29tUGVyY2VudH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTY2FsZT17c2V0U2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9e3NjYWxlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkPXt1bmlxdWVJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc3B1YmxpY1RlbXBsYXRlPXtpc1B1YmxpY1RlbXBsYXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVzZXJEZXRhaWxzPXtoYW5kbGVVc2VyRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgbWQ6dy1bMjMlXSBiZy1iYXNlLTEwMCBvdmVyZmxvdy15LWF1dG8gaGlkZS1zY3JvbGxiYXIgaGlkZGVuIG1kOmlubGluZS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YG1heC1oLXNjcmVlbmB9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzaWduZWRTaWduZXJzLmxlbmd0aCA+IDAgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwicmVhY3RvdXJTZWNvbmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14LTIgcHItMiBwdC0yIHBiLTEgdGV4dC1bMTVweF0gdGV4dC1iYXNlLWNvbnRlbnQgZm9udC1zZW1pYm9sZCBib3JkZXItYi1bMXB4XSBib3JkZXItYmFzZS0zMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3QoXCJzaWduZWQtYnlcIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC1bMnB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtzaWduZWRTaWduZXJzLm1hcCgob2JqLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTaWduZXJMaXN0Q29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmQ9e2luZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaj17b2JqfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNZW51PXtpc0hlYWRlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lclBvcz17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB7dW5zaWduZWRTaWduZXJzLmxlbmd0aCA+IDAgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwicmVhY3RvdXJGaXJzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXgtMiBwci0yIHB0LTIgcGItMSB0ZXh0LVsxNXB4XSB0ZXh0LWJhc2UtY29udGVudCBmb250LXNlbWlib2xkIGJvcmRlci1iLVsxcHhdIGJvcmRlci1iYXNlLTMwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57dChcInlldC10by1zaWduXCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtWzVweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dW5zaWduZWRTaWduZXJzLm1hcCgob2JqLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTaWduZXJMaXN0Q29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmQ9e2luZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaj17b2JqfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNZW51PXtpc0hlYWRlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lclBvcz17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIHtkZWZhdWx0U2lnbkltZyAmJiAhYWxyZWFkeVNpZ24gJiYgY3VycmVudFNpZ25lciAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8RGVmYXVsdFNpZ25hdHVyZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2lnbkltZz17ZGVmYXVsdFNpZ25JbWd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldERlZmF1bHRTaWduSW1nPXtzZXREZWZhdWx0U2lnbkltZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlck9iamVjdElkPXtzaWduZXJPYmplY3RJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nPXtzZXRJc0xvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXREZWZhdWx0U2lnbkFsZXJ0PXtzZXREZWZhdWx0U2lnbkFsZXJ0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICl9XHJcbiAgICAgICAgICA8TW9kYWxVaVxyXG4gICAgICAgICAgICBpc09wZW49e3ZhbGlkYXRlQWxlcnR9XHJcbiAgICAgICAgICAgIHRpdGxlPXt0KFwidmFsaWRhdGlvbi1hbGVydFwiKX1cclxuICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHtcclxuICAgICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0KGZhbHNlKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLVsxMDAlXSBwLVsyMHB4XVwiPlxyXG4gICAgICAgICAgICAgIDxwPnt0KFwidmFsaWRhdGlvbi1hbGVydC0xXCIpfTwvcD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzFweF0gYmctWyM5ZjlmOWZdIHctZnVsbCBteS1bMTVweF1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWYWxpZGF0ZUFsZXJ0KGZhbHNlKX1cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3QoXCJjbG9zZVwiKX1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L01vZGFsVWk+XHJcbiAgICAgICAgPC8+XHJcbiAgICAgICl9XHJcbiAgICA8L0RuZFByb3ZpZGVyPlxyXG4gICk7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUGRmUmVxdWVzdEZpbGVzO1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcblxyXG5jb25zdCBBbGVydCA9ICh7IGNoaWxkcmVuLCB0eXBlIH0pID0+IHtcclxuICBjb25zdCB0ZXh0Y29sb3IgPSB0eXBlID8gdGhlbWUodHlwZSkgOiB0aGVtZSgpO1xyXG4gIGZ1bmN0aW9uIHRoZW1lKGNvbG9yKSB7XHJcbiAgICBzd2l0Y2ggKGNvbG9yKSB7XHJcbiAgICAgIGNhc2UgXCJzdWNjZXNzXCI6XHJcbiAgICAgICAgcmV0dXJuIFwib3AtYWxlcnQtc3VjY2Vzc1wiO1xyXG4gICAgICBjYXNlIFwiaW5mb1wiOlxyXG4gICAgICAgIHJldHVybiBcIm9wLWFsZXJ0LWluZm9cIjtcclxuICAgICAgY2FzZSBcImRhbmdlclwiOlxyXG4gICAgICAgIHJldHVybiBcIm9wLWFsZXJ0LWVycm9yXCI7XHJcbiAgICAgIGNhc2UgXCJ3YXJuaW5nXCI6XHJcbiAgICAgICAgcmV0dXJuIFwib3AtYWxlcnQtd2FybmluZ1wiO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gKFxyXG4gICAgY2hpbGRyZW4gJiYgKFxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInotWzEwMDBdIGZpeGVkIHRvcC0yMCBsZWZ0LTEvMiB0cmFuc2Zvcm0gLXRyYW5zbGF0ZS14LTEvMiB0ZXh0LXNtXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BvcC1hbGVydCAke3RleHRjb2xvcn1gfT5cclxuICAgICAgICAgIDxzcGFuPntjaGlsZHJlbn08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBbGVydDtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5cclxuZnVuY3Rpb24gSGFuZGxlRXJyb3IoeyBoYW5kbGVFcnJvciB9KSB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgaC1bMTAwdmhdXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzIwcHhdIHRleHQtW2dyYXldXCI+e2hhbmRsZUVycm9yfTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhhbmRsZUVycm9yO1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcblxyXG5jb25zdCBMb2FkZXIgPSAoKSA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbG9hZGluZyBvcC1sb2FkaW5nLWluZmluaXR5IHctWzRyZW1dIHRleHQtbmV1dHJhbFwiPjwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb2FkZXI7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IExvYWRlciBmcm9tIFwiLi9Mb2FkZXJcIjtcclxuXHJcbmZ1bmN0aW9uIExvYWRlcldpdGhNc2coeyBpc0xvYWRpbmcgfSkge1xyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGgtWzEwMHZoXVwiPlxyXG4gICAgICA8TG9hZGVyIC8+XHJcbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzEzcHhdIHRleHQtYmFzZS1jb3RlbnRcIj57aXNMb2FkaW5nLm1lc3NhZ2V9PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTG9hZGVyV2l0aE1zZztcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5cclxuY29uc3QgTW9kYWxVaSA9ICh7XHJcbiAgY2hpbGRyZW4sXHJcbiAgdGl0bGUsXHJcbiAgaXNPcGVuLFxyXG4gIGhhbmRsZUNsb3NlLFxyXG4gIHNob3dIZWFkZXIgPSB0cnVlLFxyXG4gIHNob3dDbG9zZSA9IHRydWUsXHJcbiAgcmVkdWNlV2lkdGhcclxufSkgPT4ge1xyXG4gIGNvbnN0IHdpZHRoID0gcmVkdWNlV2lkdGg7XHJcbiAgcmV0dXJuIChcclxuICAgIDw+XHJcbiAgICAgIHtpc09wZW4gJiYgKFxyXG4gICAgICAgIDxkaWFsb2cgY2xhc3NOYW1lPVwib3AtbW9kYWwgb3AtbW9kYWwtb3BlblwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICAgIHdpZHRoIHx8IFwibWQ6bWluLXctWzUwMHB4XVwiXHJcbiAgICAgICAgICAgIH0gb3AtbW9kYWwtYm94IHAtMCBtYXgtaC05MCBvdmVyZmxvdy15LWF1dG8gaGlkZS1zY3JvbGxiYXIgdGV4dC1zbWB9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHtzaG93SGVhZGVyICYmIChcclxuICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtYmFzZS1jb250ZW50IGZvbnQtYm9sZCB0ZXh0LWxnIHB0LVsxNXB4XSBweC1bMjBweF1cIj5cclxuICAgICAgICAgICAgICAgICAge3RpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgIHtzaG93Q2xvc2UgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zbSBvcC1idG4tY2lyY2xlIG9wLWJ0bi1naG9zdCB0ZXh0LWJhc2UtY29udGVudCBhYnNvbHV0ZSByaWdodC0yIHRvcC0yXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVDbG9zZSAmJiBoYW5kbGVDbG9zZSgpfVxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAg4pyVXHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgPGRpdj57Y2hpbGRyZW59PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2RpYWxvZz5cclxuICAgICAgKX1cclxuICAgIDwvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNb2RhbFVpO1xyXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBcIi4uL3N0eWxlcy9zaWduYXR1cmUuY3NzXCI7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5cbmZ1bmN0aW9uIEN1c3RvbU1vZGFsKHtcbiAgc2hvdyxcbiAgaGVhZE1zZyxcbiAgYm9keU1zc2csXG4gIGZvb3Rlck1lc3NhZ2UsXG4gIGRlY2xpbmVEb2MsXG4gIHNldElzRGVjbGluZVxufSkge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG4gIGNvbnN0IFtyZWFzb24sIHNldFJlYXNvbl0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgcmV0dXJuIChcbiAgICBzaG93ICYmIChcbiAgICAgIDxkaWFsb2cgY2xhc3NOYW1lPVwib3AtbW9kYWwgb3AtbW9kYWwtb3BlbiBhYnNvbHV0ZSB6LVs0NDhdXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1bOTUlXSBtZDp3LVs2MCVdIGxnOnctWzQwJV0gb3AtbW9kYWwtYm94IHAtMCBvdmVyZmxvdy15LWF1dG8gaGlkZS1zY3JvbGxiYXIgdGV4dC1zbVwiPlxuICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UtY29udGVudCBmb250LWJvbGQgdGV4dC1sZyBwdC1bMTVweF0gcHgtWzIwcHhdXCI+XG4gICAgICAgICAgICB7aGVhZE1zZyAmJiBoZWFkTXNnfVxuICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLVsxMHB4XSBweC1bMjBweF1cIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtWzE1cHhdXCI+e2JvZHlNc3NnICYmIGJvZHlNc3NnfTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7Zm9vdGVyTWVzc2FnZSAmJiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LTNcIj5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgIHJvd3M9ezN9XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlJlYXNvbiAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTQgb3AtdGV4dGFyZWEgb3AtdGV4dGFyZWEtYm9yZGVyZWQgZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdy1mdWxsIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9e3JlYXNvbn1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0UmVhc29uKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIHsvKiA8ZGl2IGNsYXNzTmFtZT1cImgtWzFweF0gYmctWyM5ZjlmOWZdIHctZnVsbFwiPjwvZGl2PiAqL31cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtLVsxNXB4XVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBtci0yIHB4LTZcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFJlYXNvbihcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgZGVjbGluZURvYyhyZWFzb24pO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7dChcInllc1wiKX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UmVhc29uKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICBzZXRJc0RlY2xpbmUoeyBpc0RlY2xpbmVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3QoXCJjbG9zZVwiKX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGlhbG9nPlxuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ3VzdG9tTW9kYWw7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRvdXJDb250ZW50V2l0aEJ0bih7IG1lc3NhZ2UsIGlzQ2hlY2tlZCB9KSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW2lzQ2hlY2ssIHNldElzQ2hlY2tdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIGNvbnN0IGhhbmRsZUNoZWNrID0gKCkgPT4ge1xuICAgIHNldElzQ2hlY2soIWlzQ2hlY2spO1xuICAgIGlmIChpc0NoZWNrZWQpIHtcbiAgICAgIGlzQ2hlY2tlZCghaXNDaGVjayk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gKFxuICAgIDxkaXY+XG4gICAgICA8cD57bWVzc2FnZX08L3A+XG4gICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbWItMFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWNoZWNrYm94IG9wLWNoZWNrYm94LXhzIG1yLTFcIlxuICAgICAgICAgIGNoZWNrZWQ9e2lzQ2hlY2t9XG4gICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoZWNrfVxuICAgICAgICAvPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCIjNzg3ODc4IHRleHQtWzEycHhdXCI+e3QoXCJ0b3VyLWNvbnRlbnRcIil9PC9zcGFuPlxuICAgICAgPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNsaWNlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuXHJcbmNvbnN0IHNob3dUZW5hbnRTbGljZSA9IGNyZWF0ZVNsaWNlKHtcclxuICBuYW1lOiBcInNob3dUZW5hbnRcIixcclxuICBpbml0aWFsU3RhdGU6IFwiXCIsXHJcbiAgcmVkdWNlcnM6IHtcclxuICAgIHNob3dUZW5hbnQ6IChzdGF0ZSwgYWN0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcclxuICAgIH0sXHJcbiAgfSxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgeyBzaG93VGVuYW50IH0gPSBzaG93VGVuYW50U2xpY2UuYWN0aW9ucztcclxuZXhwb3J0IGRlZmF1bHQgc2hvd1RlbmFudFNsaWNlLnJlZHVjZXI7IiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UgfSBmcm9tIFwiQHJlZHV4anMvdG9vbGtpdFwiO1xyXG5cclxuY29uc3QgdG91clN0ZXBTbGljZSA9IGNyZWF0ZVNsaWNlKHtcclxuICBuYW1lOiBcInRvdXJTdGVwXCIsXHJcbiAgaW5pdGlhbFN0YXRlOiBbXSxcclxuICByZWR1Y2Vyczoge1xyXG4gICAgc2F2ZVRvdXJTdGVwczogKHN0YXRlLCBhY3Rpb24pID0+IHtcclxuICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xyXG4gICAgfSxcclxuICAgIHJlbW92ZVRvdXJTdGVwczogKCkgPT4ge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCB7IHNhdmVUb3VyU3RlcHMsIHJlbW92ZVRvdXJTdGVwcyB9ID0gdG91clN0ZXBTbGljZS5hY3Rpb25zO1xyXG5leHBvcnQgZGVmYXVsdCB0b3VyU3RlcFNsaWNlLnJlZHVjZXI7XHJcbiIsImltcG9ydCB7IGNyZWF0ZVNsaWNlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuaW1wb3J0IHsgYXBwSW5mbyB9IGZyb20gXCIuLi8uLi9jb25zdGFudC9hcHBpbmZvXCI7XHJcblxyXG5jb25zdCBpbmZvU2xpY2UgPSBjcmVhdGVTbGljZSh7XHJcbiAgbmFtZTogXCJpbmZvXCIsXHJcbiAgaW5pdGlhbFN0YXRlOiB7fSxcclxuICByZWR1Y2Vyczoge1xyXG4gICAgZmV0Y2hBcHBJbmZvOiAoKSA9PiB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYmFzZVVybFwiLCBgJHthcHBJbmZvLmJhc2VVcmx9L2ApO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInBhcnNlQXBwSWRcIiwgYXBwSW5mby5hcHBJZCk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYXBwTG9nb1wiLCBhcHBJbmZvLmFwcGxvZ28pO1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcInVzZXJTZXR0aW5nc1wiKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ1c2VyU2V0dGluZ3NcIiwgSlNPTi5zdHJpbmdpZnkoYXBwSW5mby5zZXR0aW5ncykpO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImZldl9JY29uXCIsIGFwcEluZm8uZmV2X0ljb24pO1xyXG4gICAgICByZXR1cm4gYXBwSW5mbztcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG5leHBvcnQgY29uc3QgeyBmZXRjaEFwcEluZm8gfSA9IGluZm9TbGljZS5hY3Rpb25zO1xyXG5leHBvcnQgZGVmYXVsdCBpbmZvU2xpY2UucmVkdWNlcjtcclxuIiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UgfSBmcm9tIFwiQHJlZHV4anMvdG9vbGtpdFwiO1xuXG5jb25zdCBzaG93SGVhZGVyU2xpY2UgPSBjcmVhdGVTbGljZSh7XG4gIG5hbWU6IFwic2hvd1RlbmFudFwiLFxuICBpbml0aWFsU3RhdGU6IFwiXCIsXG4gIHJlZHVjZXJzOiB7XG4gICAgc2hvd0hlYWRlcjogKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgY29uc3QgeyBzaG93SGVhZGVyIH0gPSBzaG93SGVhZGVyU2xpY2UuYWN0aW9ucztcbmV4cG9ydCBkZWZhdWx0IHNob3dIZWFkZXJTbGljZS5yZWR1Y2VyO1xuIiwiLy8gaW1wb3J0IHsgY3JlYXRlU3RvcmUsIGFwcGx5TWlkZGxld2FyZSB9IGZyb20gXCJyZWR1eFwiO1xuLy8gaW1wb3J0IHRodW5rIGZyb20gXCJyZWR1eC10aHVua1wiO1xuLy8gaW1wb3J0IHJlZHVjZXJzIGZyb20gXCIuL3JlZHVjZXJzXCI7XG5cbi8vIGV4cG9ydCBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlKHJlZHVjZXJzLCBhcHBseU1pZGRsZXdhcmUodGh1bmspKTtcbmltcG9ydCB7IGNvbmZpZ3VyZVN0b3JlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcbmltcG9ydCBpbmZvUmVkdWNlciBmcm9tIFwiLi9yZWR1Y2Vycy9pbmZvUmVkdWNlclwiO1xuaW1wb3J0IFNob3dUZW5hbnQgZnJvbSBcIi4vcmVkdWNlcnMvU2hvd1RlbmFudFwiO1xuaW1wb3J0IFRvdXJTdGVwc1JlZHVjZXIgZnJvbSBcIi4vcmVkdWNlcnMvVG91clN0ZXBzUmVkdWNlclwiO1xuaW1wb3J0IHNob3dIZWFkZXIgZnJvbSBcIi4vcmVkdWNlcnMvc2hvd0hlYWRlclwiO1xuZXhwb3J0IGNvbnN0IHN0b3JlID0gY29uZmlndXJlU3RvcmUoe1xuICByZWR1Y2VyOiB7XG4gICAgYXBwSW5mbzogaW5mb1JlZHVjZXIsXG4gICAgVG91clN0ZXBzOiBUb3VyU3RlcHNSZWR1Y2VyLFxuICAgIFNob3dUZW5hbnQsXG4gICAgc2hvd0hlYWRlclxuICB9XG59KTtcbiIsImZ1bmN0aW9uIHIoZSl7dmFyIG8sdCxmPVwiXCI7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGV8fFwibnVtYmVyXCI9PXR5cGVvZiBlKWYrPWU7ZWxzZSBpZihcIm9iamVjdFwiPT10eXBlb2YgZSlpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbj1lLmxlbmd0aDtmb3Iobz0wO288bjtvKyspZVtvXSYmKHQ9cihlW29dKSkmJihmJiYoZis9XCIgXCIpLGYrPXQpfWVsc2UgZm9yKHQgaW4gZSllW3RdJiYoZiYmKGYrPVwiIFwiKSxmKz10KTtyZXR1cm4gZn1mdW5jdGlvbiBlKCl7Zm9yKHZhciBlLG8sdD0wLGY9XCJcIixuPWFyZ3VtZW50cy5sZW5ndGg7dDxuO3QrKykoZT1hcmd1bWVudHNbdF0pJiYobz1yKGUpKSYmKGYmJihmKz1cIiBcIiksZis9byk7cmV0dXJuIGZ9bW9kdWxlLmV4cG9ydHM9ZSxtb2R1bGUuZXhwb3J0cy5jbHN4PWU7IiwidmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIHRvQ2xhc3NOYW1lID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpXG4gICAgICAgIHN0ciArPSB2YWw7XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIHRtcCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgdmFyIGwgPSB2YWwubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCBsKSB7XG4gICAgICAgICAgICAgICAgdG1wID0gdG9DbGFzc05hbWUodmFsW2krK10pO1xuICAgICAgICAgICAgICAgIGlmICh0bXApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gdG1wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBndWFyZC1mb3ItaW5cbiAgICAgICAgICAgIGZvciAodG1wIGluIHZhbCkge1xuICAgICAgICAgICAgICAgIGlmICh0bXAgJiYgdmFsW3RtcF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gdG1wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBjbmIoKSB7XG4gICAgdmFyIGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbjtcbiAgICB2YXIgdG1wO1xuICAgIHZhciBzdHIgPSAnJztcbiAgICB3aGlsZSAoaSA8IGwpIHtcbiAgICAgICAgbiA9IGFyZ3VtZW50c1tpKytdO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgdG1wID0gdG9DbGFzc05hbWUobik7XG4gICAgICAgICAgICBpZiAodG1wKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cikge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHIgKz0gdG1wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG4iLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vZW5jLWJhc2U2NFwiKSwgcmVxdWlyZShcIi4vbWQ1XCIpLCByZXF1aXJlKFwiLi9ldnBrZGZcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2VuYy1iYXNlNjRcIiwgXCIuL21kNVwiLCBcIi4vZXZwa2RmXCIsIFwiLi9jaXBoZXItY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIEJsb2NrQ2lwaGVyID0gQ19saWIuQmxvY2tDaXBoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBMb29rdXAgdGFibGVzXG5cdCAgICB2YXIgU0JPWCA9IFtdO1xuXHQgICAgdmFyIElOVl9TQk9YID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8wID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8xID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8yID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8zID0gW107XG5cdCAgICB2YXIgSU5WX1NVQl9NSVhfMCA9IFtdO1xuXHQgICAgdmFyIElOVl9TVUJfTUlYXzEgPSBbXTtcblx0ICAgIHZhciBJTlZfU1VCX01JWF8yID0gW107XG5cdCAgICB2YXIgSU5WX1NVQl9NSVhfMyA9IFtdO1xuXG5cdCAgICAvLyBDb21wdXRlIGxvb2t1cCB0YWJsZXNcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gQ29tcHV0ZSBkb3VibGUgdGFibGVcblx0ICAgICAgICB2YXIgZCA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0ICAgICAgICAgICAgaWYgKGkgPCAxMjgpIHtcblx0ICAgICAgICAgICAgICAgIGRbaV0gPSBpIDw8IDE7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBkW2ldID0gKGkgPDwgMSkgXiAweDExYjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIFdhbGsgR0YoMl44KVxuXHQgICAgICAgIHZhciB4ID0gMDtcblx0ICAgICAgICB2YXIgeGkgPSAwO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBzYm94XG5cdCAgICAgICAgICAgIHZhciBzeCA9IHhpIF4gKHhpIDw8IDEpIF4gKHhpIDw8IDIpIF4gKHhpIDw8IDMpIF4gKHhpIDw8IDQpO1xuXHQgICAgICAgICAgICBzeCA9IChzeCA+Pj4gOCkgXiAoc3ggJiAweGZmKSBeIDB4NjM7XG5cdCAgICAgICAgICAgIFNCT1hbeF0gPSBzeDtcblx0ICAgICAgICAgICAgSU5WX1NCT1hbc3hdID0geDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIG11bHRpcGxpY2F0aW9uXG5cdCAgICAgICAgICAgIHZhciB4MiA9IGRbeF07XG5cdCAgICAgICAgICAgIHZhciB4NCA9IGRbeDJdO1xuXHQgICAgICAgICAgICB2YXIgeDggPSBkW3g0XTtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIHN1YiBieXRlcywgbWl4IGNvbHVtbnMgdGFibGVzXG5cdCAgICAgICAgICAgIHZhciB0ID0gKGRbc3hdICogMHgxMDEpIF4gKHN4ICogMHgxMDEwMTAwKTtcblx0ICAgICAgICAgICAgU1VCX01JWF8wW3hdID0gKHQgPDwgMjQpIHwgKHQgPj4+IDgpO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzFbeF0gPSAodCA8PCAxNikgfCAodCA+Pj4gMTYpO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzJbeF0gPSAodCA8PCA4KSAgfCAodCA+Pj4gMjQpO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzNbeF0gPSB0O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgaW52IHN1YiBieXRlcywgaW52IG1peCBjb2x1bW5zIHRhYmxlc1xuXHQgICAgICAgICAgICB2YXIgdCA9ICh4OCAqIDB4MTAxMDEwMSkgXiAoeDQgKiAweDEwMDAxKSBeICh4MiAqIDB4MTAxKSBeICh4ICogMHgxMDEwMTAwKTtcblx0ICAgICAgICAgICAgSU5WX1NVQl9NSVhfMFtzeF0gPSAodCA8PCAyNCkgfCAodCA+Pj4gOCk7XG5cdCAgICAgICAgICAgIElOVl9TVUJfTUlYXzFbc3hdID0gKHQgPDwgMTYpIHwgKHQgPj4+IDE2KTtcblx0ICAgICAgICAgICAgSU5WX1NVQl9NSVhfMltzeF0gPSAodCA8PCA4KSAgfCAodCA+Pj4gMjQpO1xuXHQgICAgICAgICAgICBJTlZfU1VCX01JWF8zW3N4XSA9IHQ7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBuZXh0IGNvdW50ZXJcblx0ICAgICAgICAgICAgaWYgKCF4KSB7XG5cdCAgICAgICAgICAgICAgICB4ID0geGkgPSAxO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgeCA9IHgyIF4gZFtkW2RbeDggXiB4Ml1dXTtcblx0ICAgICAgICAgICAgICAgIHhpIF49IGRbZFt4aV1dO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSgpKTtcblxuXHQgICAgLy8gUHJlY29tcHV0ZWQgUmNvbiBsb29rdXBcblx0ICAgIHZhciBSQ09OID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzZdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFFUyBibG9jayBjaXBoZXIgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgQUVTID0gQ19hbGdvLkFFUyA9IEJsb2NrQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIHQ7XG5cblx0ICAgICAgICAgICAgLy8gU2tpcCByZXNldCBvZiBuUm91bmRzIGhhcyBiZWVuIHNldCBiZWZvcmUgYW5kIGtleSBkaWQgbm90IGNoYW5nZVxuXHQgICAgICAgICAgICBpZiAodGhpcy5fblJvdW5kcyAmJiB0aGlzLl9rZXlQcmlvclJlc2V0ID09PSB0aGlzLl9rZXkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5fa2V5UHJpb3JSZXNldCA9IHRoaXMuX2tleTtcblx0ICAgICAgICAgICAgdmFyIGtleVdvcmRzID0ga2V5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIga2V5U2l6ZSA9IGtleS5zaWdCeXRlcyAvIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBudW1iZXIgb2Ygcm91bmRzXG5cdCAgICAgICAgICAgIHZhciBuUm91bmRzID0gdGhpcy5fblJvdW5kcyA9IGtleVNpemUgKyA2O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgbnVtYmVyIG9mIGtleSBzY2hlZHVsZSByb3dzXG5cdCAgICAgICAgICAgIHZhciBrc1Jvd3MgPSAoblJvdW5kcyArIDEpICogNDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIGtleSBzY2hlZHVsZVxuXHQgICAgICAgICAgICB2YXIga2V5U2NoZWR1bGUgPSB0aGlzLl9rZXlTY2hlZHVsZSA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBrc1JvdyA9IDA7IGtzUm93IDwga3NSb3dzOyBrc1JvdysrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoa3NSb3cgPCBrZXlTaXplKSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5U2NoZWR1bGVba3NSb3ddID0ga2V5V29yZHNba3NSb3ddO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ID0ga2V5U2NoZWR1bGVba3NSb3cgLSAxXTtcblxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghKGtzUm93ICUga2V5U2l6ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUm90IHdvcmRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICh0IDw8IDgpIHwgKHQgPj4+IDI0KTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWIgd29yZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKFNCT1hbdCA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyh0ID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsodCA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbdCAmIDB4ZmZdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1peCBSY29uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHQgXj0gUkNPTlsoa3NSb3cgLyBrZXlTaXplKSB8IDBdIDw8IDI0O1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5U2l6ZSA+IDYgJiYga3NSb3cgJSBrZXlTaXplID09IDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ViIHdvcmRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdCA9IChTQk9YW3QgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsodCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHQgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3QgJiAweGZmXTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICBrZXlTY2hlZHVsZVtrc1Jvd10gPSBrZXlTY2hlZHVsZVtrc1JvdyAtIGtleVNpemVdIF4gdDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgaW52IGtleSBzY2hlZHVsZVxuXHQgICAgICAgICAgICB2YXIgaW52S2V5U2NoZWR1bGUgPSB0aGlzLl9pbnZLZXlTY2hlZHVsZSA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpbnZLc1JvdyA9IDA7IGludktzUm93IDwga3NSb3dzOyBpbnZLc1JvdysrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIga3NSb3cgPSBrc1Jvd3MgLSBpbnZLc1JvdztcblxuXHQgICAgICAgICAgICAgICAgaWYgKGludktzUm93ICUgNCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ga2V5U2NoZWR1bGVba3NSb3ddO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGtleVNjaGVkdWxlW2tzUm93IC0gNF07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGlmIChpbnZLc1JvdyA8IDQgfHwga3NSb3cgPD0gNCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGludktleVNjaGVkdWxlW2ludktzUm93XSA9IHQ7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGludktleVNjaGVkdWxlW2ludktzUm93XSA9IElOVl9TVUJfTUlYXzBbU0JPWFt0ID4+PiAyNF1dIF4gSU5WX1NVQl9NSVhfMVtTQk9YWyh0ID4+PiAxNikgJiAweGZmXV0gXlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVl9TVUJfTUlYXzJbU0JPWFsodCA+Pj4gOCkgJiAweGZmXV0gXiBJTlZfU1VCX01JWF8zW1NCT1hbdCAmIDB4ZmZdXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBlbmNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZG9DcnlwdEJsb2NrKE0sIG9mZnNldCwgdGhpcy5fa2V5U2NoZWR1bGUsIFNVQl9NSVhfMCwgU1VCX01JWF8xLCBTVUJfTUlYXzIsIFNVQl9NSVhfMywgU0JPWCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGRlY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTd2FwIDJuZCBhbmQgNHRoIHJvd3Ncblx0ICAgICAgICAgICAgdmFyIHQgPSBNW29mZnNldCArIDFdO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDFdID0gTVtvZmZzZXQgKyAzXTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAzXSA9IHQ7XG5cblx0ICAgICAgICAgICAgdGhpcy5fZG9DcnlwdEJsb2NrKE0sIG9mZnNldCwgdGhpcy5faW52S2V5U2NoZWR1bGUsIElOVl9TVUJfTUlYXzAsIElOVl9TVUJfTUlYXzEsIElOVl9TVUJfTUlYXzIsIElOVl9TVUJfTUlYXzMsIElOVl9TQk9YKTtcblxuXHQgICAgICAgICAgICAvLyBJbnYgc3dhcCAybmQgYW5kIDR0aCByb3dzXG5cdCAgICAgICAgICAgIHZhciB0ID0gTVtvZmZzZXQgKyAxXTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAxXSA9IE1bb2Zmc2V0ICsgM107XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgM10gPSB0O1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9DcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0LCBrZXlTY2hlZHVsZSwgU1VCX01JWF8wLCBTVUJfTUlYXzEsIFNVQl9NSVhfMiwgU1VCX01JWF8zLCBTQk9YKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBuUm91bmRzID0gdGhpcy5fblJvdW5kcztcblxuXHQgICAgICAgICAgICAvLyBHZXQgaW5wdXQsIGFkZCByb3VuZCBrZXlcblx0ICAgICAgICAgICAgdmFyIHMwID0gTVtvZmZzZXRdICAgICBeIGtleVNjaGVkdWxlWzBdO1xuXHQgICAgICAgICAgICB2YXIgczEgPSBNW29mZnNldCArIDFdIF4ga2V5U2NoZWR1bGVbMV07XG5cdCAgICAgICAgICAgIHZhciBzMiA9IE1bb2Zmc2V0ICsgMl0gXiBrZXlTY2hlZHVsZVsyXTtcblx0ICAgICAgICAgICAgdmFyIHMzID0gTVtvZmZzZXQgKyAzXSBeIGtleVNjaGVkdWxlWzNdO1xuXG5cdCAgICAgICAgICAgIC8vIEtleSBzY2hlZHVsZSByb3cgY291bnRlclxuXHQgICAgICAgICAgICB2YXIga3NSb3cgPSA0O1xuXG5cdCAgICAgICAgICAgIC8vIFJvdW5kc1xuXHQgICAgICAgICAgICBmb3IgKHZhciByb3VuZCA9IDE7IHJvdW5kIDwgblJvdW5kczsgcm91bmQrKykge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hpZnQgcm93cywgc3ViIGJ5dGVzLCBtaXggY29sdW1ucywgYWRkIHJvdW5kIGtleVxuXHQgICAgICAgICAgICAgICAgdmFyIHQwID0gU1VCX01JWF8wW3MwID4+PiAyNF0gXiBTVUJfTUlYXzFbKHMxID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhfMlsoczIgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYXzNbczMgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICAgICAgdmFyIHQxID0gU1VCX01JWF8wW3MxID4+PiAyNF0gXiBTVUJfTUlYXzFbKHMyID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhfMlsoczMgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYXzNbczAgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICAgICAgdmFyIHQyID0gU1VCX01JWF8wW3MyID4+PiAyNF0gXiBTVUJfTUlYXzFbKHMzID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhfMlsoczAgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYXzNbczEgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICAgICAgdmFyIHQzID0gU1VCX01JWF8wW3MzID4+PiAyNF0gXiBTVUJfTUlYXzFbKHMwID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhfMlsoczEgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYXzNbczIgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBVcGRhdGUgc3RhdGVcblx0ICAgICAgICAgICAgICAgIHMwID0gdDA7XG5cdCAgICAgICAgICAgICAgICBzMSA9IHQxO1xuXHQgICAgICAgICAgICAgICAgczIgPSB0Mjtcblx0ICAgICAgICAgICAgICAgIHMzID0gdDM7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBTaGlmdCByb3dzLCBzdWIgYnl0ZXMsIGFkZCByb3VuZCBrZXlcblx0ICAgICAgICAgICAgdmFyIHQwID0gKChTQk9YW3MwID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMxID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczIgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MzICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgIHZhciB0MSA9ICgoU0JPWFtzMSA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMiA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMzID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMCAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICB2YXIgdDIgPSAoKFNCT1hbczIgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczMgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMCA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczEgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgdmFyIHQzID0gKChTQk9YW3MzID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMwID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczEgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MyICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cblx0ICAgICAgICAgICAgLy8gU2V0IG91dHB1dFxuXHQgICAgICAgICAgICBNW29mZnNldF0gICAgID0gdDA7XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMV0gPSB0MTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAyXSA9IHQyO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDNdID0gdDM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGtleVNpemU6IDI1Ni8zMlxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb25zIHRvIHRoZSBjaXBoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0ID0gQ3J5cHRvSlMuQUVTLmVuY3J5cHQobWVzc2FnZSwga2V5LCBjZmcpO1xuXHQgICAgICogICAgIHZhciBwbGFpbnRleHQgID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpO1xuXHQgICAgICovXG5cdCAgICBDLkFFUyA9IEJsb2NrQ2lwaGVyLl9jcmVhdGVIZWxwZXIoQUVTKTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5BRVM7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vZXZwa2RmXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2V2cGtkZlwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0LyoqXG5cdCAqIENpcGhlciBjb3JlIGNvbXBvbmVudHMuXG5cdCAqL1xuXHRDcnlwdG9KUy5saWIuQ2lwaGVyIHx8IChmdW5jdGlvbiAodW5kZWZpbmVkKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQnVmZmVyZWRCbG9ja0FsZ29yaXRobSA9IENfbGliLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG07XG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYztcblx0ICAgIHZhciBVdGY4ID0gQ19lbmMuVXRmODtcblx0ICAgIHZhciBCYXNlNjQgPSBDX2VuYy5CYXNlNjQ7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXHQgICAgdmFyIEV2cEtERiA9IENfYWxnby5FdnBLREY7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBjaXBoZXIgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGtleVNpemUgVGhpcyBjaXBoZXIncyBrZXkgc2l6ZS4gRGVmYXVsdDogNCAoMTI4IGJpdHMpXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gaXZTaXplIFRoaXMgY2lwaGVyJ3MgSVYgc2l6ZS4gRGVmYXVsdDogNCAoMTI4IGJpdHMpXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX0VOQ19YRk9STV9NT0RFIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGVuY3J5cHRpb24gbW9kZS5cblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfREVDX1hGT1JNX01PREUgQSBjb25zdGFudCByZXByZXNlbnRpbmcgZGVjcnlwdGlvbiBtb2RlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ2lwaGVyID0gQ19saWIuQ2lwaGVyID0gQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBpdiBUaGUgSVYgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKCksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHRoaXMgY2lwaGVyIGluIGVuY3J5cHRpb24gbW9kZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyfSBBIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZUVuY3J5cHRvcihrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZUVuY3J5cHRvcjogZnVuY3Rpb24gKGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9FTkNfWEZPUk1fTU9ERSwga2V5LCBjZmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHRoaXMgY2lwaGVyIGluIGRlY3J5cHRpb24gbW9kZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyfSBBIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZURlY3J5cHRvcihrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZURlY3J5cHRvcjogZnVuY3Rpb24gKGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9ERUNfWEZPUk1fTU9ERSwga2V5LCBjZmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgY2lwaGVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHhmb3JtTW9kZSBFaXRoZXIgdGhlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiB0cmFuc29ybWF0aW9uIG1vZGUgY29uc3RhbnQuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGUoQ3J5cHRvSlMuYWxnby5BRVMuX0VOQ19YRk9STV9NT0RFLCBrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uICh4Zm9ybU1vZGUsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIFN0b3JlIHRyYW5zZm9ybSBtb2RlIGFuZCBrZXlcblx0ICAgICAgICAgICAgdGhpcy5feGZvcm1Nb2RlID0geGZvcm1Nb2RlO1xuXHQgICAgICAgICAgICB0aGlzLl9rZXkgPSBrZXk7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgY2lwaGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBjaXBoZXIucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBSZXNldCBkYXRhIGJ1ZmZlclxuXHQgICAgICAgICAgICBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1jaXBoZXIgbG9naWNcblx0ICAgICAgICAgICAgdGhpcy5fZG9SZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBBZGRzIGRhdGEgdG8gYmUgZW5jcnlwdGVkIG9yIGRlY3J5cHRlZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YVVwZGF0ZSBUaGUgZGF0YSB0byBlbmNyeXB0IG9yIGRlY3J5cHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkYXRhIGFmdGVyIHByb2Nlc3NpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIucHJvY2VzcygnZGF0YScpO1xuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLnByb2Nlc3Mod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBBcHBlbmRcblx0ICAgICAgICAgICAgdGhpcy5fYXBwZW5kKGRhdGFVcGRhdGUpO1xuXG5cdCAgICAgICAgICAgIC8vIFByb2Nlc3MgYXZhaWxhYmxlIGJsb2Nrc1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2VzcygpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBGaW5hbGl6ZXMgdGhlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiBwcm9jZXNzLlxuXHQgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGFVcGRhdGUgVGhlIGZpbmFsIGRhdGEgdG8gZW5jcnlwdCBvciBkZWNyeXB0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGF0YSBhZnRlciBmaW5hbCBwcm9jZXNzaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLmZpbmFsaXplKCk7XG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUoJ2RhdGEnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5maW5hbGl6ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbiAoZGF0YVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBGaW5hbCBkYXRhIHVwZGF0ZVxuXHQgICAgICAgICAgICBpZiAoZGF0YVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kKGRhdGFVcGRhdGUpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1jaXBoZXIgbG9naWNcblx0ICAgICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkRGF0YSA9IHRoaXMuX2RvRmluYWxpemUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gZmluYWxQcm9jZXNzZWREYXRhO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBrZXlTaXplOiAxMjgvMzIsXG5cblx0ICAgICAgICBpdlNpemU6IDEyOC8zMixcblxuXHQgICAgICAgIF9FTkNfWEZPUk1fTU9ERTogMSxcblxuXHQgICAgICAgIF9ERUNfWEZPUk1fTU9ERTogMixcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgc2hvcnRjdXQgZnVuY3Rpb25zIHRvIGEgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciB0byBjcmVhdGUgYSBoZWxwZXIgZm9yLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBlbmNyeXB0IGFuZCBkZWNyeXB0IHNob3J0Y3V0IGZ1bmN0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIEFFUyA9IENyeXB0b0pTLmxpYi5DaXBoZXIuX2NyZWF0ZUhlbHBlcihDcnlwdG9KUy5hbGdvLkFFUyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhlbHBlcjogKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgZnVuY3Rpb24gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXNzd29yZEJhc2VkQ2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2VyaWFsaXphYmxlQ2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjaXBoZXIpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICAgICAgZW5jcnlwdDogZnVuY3Rpb24gKG1lc3NhZ2UsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RDaXBoZXJTdHJhdGVneShrZXkpLmVuY3J5cHQoY2lwaGVyLCBtZXNzYWdlLCBrZXksIGNmZyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXJ0ZXh0LCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KS5kZWNyeXB0KGNpcGhlciwgY2lwaGVydGV4dCwga2V5LCBjZmcpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfSgpKVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBzdHJlYW0gY2lwaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgdGhpcyBjaXBoZXIgb3BlcmF0ZXMgb24uIERlZmF1bHQ6IDEgKDMyIGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBTdHJlYW1DaXBoZXIgPSBDX2xpYi5TdHJlYW1DaXBoZXIgPSBDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBQcm9jZXNzIHBhcnRpYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHZhciBmaW5hbFByb2Nlc3NlZEJsb2NrcyA9IHRoaXMuX3Byb2Nlc3MoISEnZmx1c2gnKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gZmluYWxQcm9jZXNzZWRCbG9ja3M7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGJsb2NrU2l6ZTogMVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogTW9kZSBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX21vZGUgPSBDLm1vZGUgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBiYXNlIGJsb2NrIGNpcGhlciBtb2RlIHRlbXBsYXRlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQmxvY2tDaXBoZXJNb2RlID0gQ19saWIuQmxvY2tDaXBoZXJNb2RlID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgdGhpcyBtb2RlIGZvciBlbmNyeXB0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBBIGJsb2NrIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBpdiBUaGUgSVYgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBtb2RlID0gQ3J5cHRvSlMubW9kZS5DQkMuY3JlYXRlRW5jcnlwdG9yKGNpcGhlciwgaXYud29yZHMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZUVuY3J5cHRvcjogZnVuY3Rpb24gKGNpcGhlciwgaXYpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuRW5jcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyB0aGlzIG1vZGUgZm9yIGRlY3J5cHRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGl2IFRoZSBJViB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG1vZGUgPSBDcnlwdG9KUy5tb2RlLkNCQy5jcmVhdGVEZWNyeXB0b3IoY2lwaGVyLCBpdi53b3Jkcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY3JlYXRlRGVjcnlwdG9yOiBmdW5jdGlvbiAoY2lwaGVyLCBpdikge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5EZWNyeXB0b3IuY3JlYXRlKGNpcGhlciwgaXYpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgbW9kZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgQSBibG9jayBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgbW9kZSA9IENyeXB0b0pTLm1vZGUuQ0JDLkVuY3J5cHRvci5jcmVhdGUoY2lwaGVyLCBpdi53b3Jkcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNpcGhlciwgaXYpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY2lwaGVyID0gY2lwaGVyO1xuXHQgICAgICAgICAgICB0aGlzLl9pdiA9IGl2O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIENpcGhlciBCbG9jayBDaGFpbmluZyBtb2RlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ0JDID0gQ19tb2RlLkNCQyA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWJzdHJhY3QgYmFzZSBDQkMgbW9kZS5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICB2YXIgQ0JDID0gQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpO1xuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ0JDIGVuY3J5cHRvci5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBDQkMuRW5jcnlwdG9yID0gQ0JDLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBQcm9jZXNzZXMgdGhlIGRhdGEgYmxvY2sgYXQgb2Zmc2V0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyBUaGUgZGF0YSB3b3JkcyB0byBvcGVyYXRlIG9uLlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgd2hlcmUgdGhlIGJsb2NrIHN0YXJ0cy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIG1vZGUucHJvY2Vzc0Jsb2NrKGRhdGEud29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXI7XG5cdCAgICAgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gWE9SIGFuZCBlbmNyeXB0XG5cdCAgICAgICAgICAgICAgICB4b3JCbG9jay5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSk7XG5cdCAgICAgICAgICAgICAgICBjaXBoZXIuZW5jcnlwdEJsb2NrKHdvcmRzLCBvZmZzZXQpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGJsb2NrIHRvIHVzZSB3aXRoIG5leHQgYmxvY2tcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ0JDIGRlY3J5cHRvci5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBDQkMuRGVjcnlwdG9yID0gQ0JDLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBQcm9jZXNzZXMgdGhlIGRhdGEgYmxvY2sgYXQgb2Zmc2V0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyBUaGUgZGF0YSB3b3JkcyB0byBvcGVyYXRlIG9uLlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgd2hlcmUgdGhlIGJsb2NrIHN0YXJ0cy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIG1vZGUucHJvY2Vzc0Jsb2NrKGRhdGEud29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXI7XG5cdCAgICAgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayB0byB1c2Ugd2l0aCBuZXh0IGJsb2NrXG5cdCAgICAgICAgICAgICAgICB2YXIgdGhpc0Jsb2NrID0gd29yZHMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBibG9ja1NpemUpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBEZWNyeXB0IGFuZCBYT1Jcblx0ICAgICAgICAgICAgICAgIGNpcGhlci5kZWNyeXB0QmxvY2sod29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAgICB4b3JCbG9jay5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgYmVjb21lcyB0aGUgcHJldmlvdXMgYmxvY2tcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZCbG9jayA9IHRoaXNCbG9jaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgZnVuY3Rpb24geG9yQmxvY2sod29yZHMsIG9mZnNldCwgYmxvY2tTaXplKSB7XG5cdCAgICAgICAgICAgIHZhciBibG9jaztcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgaXYgPSB0aGlzLl9pdjtcblxuXHQgICAgICAgICAgICAvLyBDaG9vc2UgbWl4aW5nIGJsb2NrXG5cdCAgICAgICAgICAgIGlmIChpdikge1xuXHQgICAgICAgICAgICAgICAgYmxvY2sgPSBpdjtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIElWIGZvciBzdWJzZXF1ZW50IGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faXYgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBibG9jayA9IHRoaXMuX3ByZXZCbG9jaztcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFhPUiBibG9ja3Ncblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbb2Zmc2V0ICsgaV0gXj0gYmxvY2tbaV07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gQ0JDO1xuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBQYWRkaW5nIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfcGFkID0gQy5wYWQgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBQS0NTICM1LzcgcGFkZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFBrY3M3ID0gQ19wYWQuUGtjczcgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUGFkcyBkYXRhIHVzaW5nIHRoZSBhbGdvcml0aG0gZGVmaW5lZCBpbiBQS0NTICM1LzcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gZGF0YSBUaGUgZGF0YSB0byBwYWQuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbXVsdGlwbGUgdGhhdCB0aGUgZGF0YSBzaG91bGQgYmUgcGFkZGVkIHRvLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBDcnlwdG9KUy5wYWQuUGtjczcucGFkKHdvcmRBcnJheSwgNCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFkOiBmdW5jdGlvbiAoZGF0YSwgYmxvY2tTaXplKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgcGFkZGluZyBieXRlc1xuXHQgICAgICAgICAgICB2YXIgblBhZGRpbmdCeXRlcyA9IGJsb2NrU2l6ZUJ5dGVzIC0gZGF0YS5zaWdCeXRlcyAlIGJsb2NrU2l6ZUJ5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENyZWF0ZSBwYWRkaW5nIHdvcmRcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmdXb3JkID0gKG5QYWRkaW5nQnl0ZXMgPDwgMjQpIHwgKG5QYWRkaW5nQnl0ZXMgPDwgMTYpIHwgKG5QYWRkaW5nQnl0ZXMgPDwgOCkgfCBuUGFkZGluZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENyZWF0ZSBwYWRkaW5nXG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nV29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuUGFkZGluZ0J5dGVzOyBpICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmdXb3Jkcy5wdXNoKHBhZGRpbmdXb3JkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB2YXIgcGFkZGluZyA9IFdvcmRBcnJheS5jcmVhdGUocGFkZGluZ1dvcmRzLCBuUGFkZGluZ0J5dGVzKTtcblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhLmNvbmNhdChwYWRkaW5nKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVW5wYWRzIGRhdGEgdGhhdCBoYWQgYmVlbiBwYWRkZWQgdXNpbmcgdGhlIGFsZ29yaXRobSBkZWZpbmVkIGluIFBLQ1MgIzUvNy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBkYXRhIFRoZSBkYXRhIHRvIHVucGFkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBDcnlwdG9KUy5wYWQuUGtjczcudW5wYWQod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAgICAgLy8gR2V0IG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGZyb20gbGFzdCBieXRlXG5cdCAgICAgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gZGF0YS53b3Jkc1soZGF0YS5zaWdCeXRlcyAtIDEpID4+PiAyXSAmIDB4ZmY7XG5cblx0ICAgICAgICAgICAgLy8gUmVtb3ZlIHBhZGRpbmdcblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyAtPSBuUGFkZGluZ0J5dGVzO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBibG9jayBjaXBoZXIgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyB0aGlzIGNpcGhlciBvcGVyYXRlcyBvbi4gRGVmYXVsdDogNCAoMTI4IGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBCbG9ja0NpcGhlciA9IENfbGliLkJsb2NrQ2lwaGVyID0gQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtNb2RlfSBtb2RlIFRoZSBibG9jayBtb2RlIHRvIHVzZS4gRGVmYXVsdDogQ0JDXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtQYWRkaW5nfSBwYWRkaW5nIFRoZSBwYWRkaW5nIHN0cmF0ZWd5IHRvIHVzZS4gRGVmYXVsdDogUGtjczdcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IENpcGhlci5jZmcuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgbW9kZTogQ0JDLFxuXHQgICAgICAgICAgICBwYWRkaW5nOiBQa2NzN1xuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIG1vZGVDcmVhdG9yO1xuXG5cdCAgICAgICAgICAgIC8vIFJlc2V0IGNpcGhlclxuXHQgICAgICAgICAgICBDaXBoZXIucmVzZXQuY2FsbCh0aGlzKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGNmZyA9IHRoaXMuY2ZnO1xuXHQgICAgICAgICAgICB2YXIgaXYgPSBjZmcuaXY7XG5cdCAgICAgICAgICAgIHZhciBtb2RlID0gY2ZnLm1vZGU7XG5cblx0ICAgICAgICAgICAgLy8gUmVzZXQgYmxvY2sgbW9kZVxuXHQgICAgICAgICAgICBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0VOQ19YRk9STV9NT0RFKSB7XG5cdCAgICAgICAgICAgICAgICBtb2RlQ3JlYXRvciA9IG1vZGUuY3JlYXRlRW5jcnlwdG9yO1xuXHQgICAgICAgICAgICB9IGVsc2UgLyogaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9ERUNfWEZPUk1fTU9ERSkgKi8ge1xuXHQgICAgICAgICAgICAgICAgbW9kZUNyZWF0b3IgPSBtb2RlLmNyZWF0ZURlY3J5cHRvcjtcblx0ICAgICAgICAgICAgICAgIC8vIEtlZXAgYXQgbGVhc3Qgb25lIGJsb2NrIGluIHRoZSBidWZmZXIgZm9yIHVucGFkZGluZ1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbWluQnVmZmVyU2l6ZSA9IDE7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAodGhpcy5fbW9kZSAmJiB0aGlzLl9tb2RlLl9fY3JlYXRvciA9PSBtb2RlQ3JlYXRvcikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbW9kZS5pbml0KHRoaXMsIGl2ICYmIGl2LndvcmRzKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21vZGUgPSBtb2RlQ3JlYXRvci5jYWxsKG1vZGUsIHRoaXMsIGl2ICYmIGl2LndvcmRzKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21vZGUuX19jcmVhdG9yID0gbW9kZUNyZWF0b3I7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICB0aGlzLl9tb2RlLnByb2Nlc3NCbG9jayh3b3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkQmxvY2tzO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nID0gdGhpcy5jZmcucGFkZGluZztcblxuXHQgICAgICAgICAgICAvLyBGaW5hbGl6ZVxuXHQgICAgICAgICAgICBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0VOQ19YRk9STV9NT0RFKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBQYWQgZGF0YVxuXHQgICAgICAgICAgICAgICAgcGFkZGluZy5wYWQodGhpcy5fZGF0YSwgdGhpcy5ibG9ja1NpemUpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgZmluYWxQcm9jZXNzZWRCbG9ja3MgPSB0aGlzLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0RFQ19YRk9STV9NT0RFKSAqLyB7XG5cdCAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgZmluYWxQcm9jZXNzZWRCbG9ja3MgPSB0aGlzLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFVucGFkIGRhdGFcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmcudW5wYWQoZmluYWxQcm9jZXNzZWRCbG9ja3MpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkQmxvY2tzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDEyOC8zMlxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQSBjb2xsZWN0aW9uIG9mIGNpcGhlciBwYXJhbWV0ZXJzLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBjaXBoZXJ0ZXh0IFRoZSByYXcgY2lwaGVydGV4dC5cblx0ICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBrZXkgVGhlIGtleSB0byB0aGlzIGNpcGhlcnRleHQuXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gaXYgVGhlIElWIHVzZWQgaW4gdGhlIGNpcGhlcmluZyBvcGVyYXRpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gc2FsdCBUaGUgc2FsdCB1c2VkIHdpdGggYSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi5cblx0ICAgICAqIEBwcm9wZXJ0eSB7Q2lwaGVyfSBhbGdvcml0aG0gVGhlIGNpcGhlciBhbGdvcml0aG0uXG5cdCAgICAgKiBAcHJvcGVydHkge01vZGV9IG1vZGUgVGhlIGJsb2NrIG1vZGUgdXNlZCBpbiB0aGUgY2lwaGVyaW5nIG9wZXJhdGlvbi5cblx0ICAgICAqIEBwcm9wZXJ0eSB7UGFkZGluZ30gcGFkZGluZyBUaGUgcGFkZGluZyBzY2hlbWUgdXNlZCBpbiB0aGUgY2lwaGVyaW5nIG9wZXJhdGlvbi5cblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIGJsb2NrIHNpemUgb2YgdGhlIGNpcGhlci5cblx0ICAgICAqIEBwcm9wZXJ0eSB7Rm9ybWF0fSBmb3JtYXR0ZXIgVGhlIGRlZmF1bHQgZm9ybWF0dGluZyBzdHJhdGVneSB0byBjb252ZXJ0IHRoaXMgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYSBzdHJpbmcuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDaXBoZXJQYXJhbXMgPSBDX2xpYi5DaXBoZXJQYXJhbXMgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNpcGhlclBhcmFtcyBBbiBvYmplY3Qgd2l0aCBhbnkgb2YgdGhlIHBvc3NpYmxlIGNpcGhlciBwYXJhbWV0ZXJzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVyUGFyYW1zID0gQ3J5cHRvSlMubGliLkNpcGhlclBhcmFtcy5jcmVhdGUoe1xuXHQgICAgICAgICAqICAgICAgICAgY2lwaGVydGV4dDogY2lwaGVydGV4dFdvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIGtleToga2V5V29yZEFycmF5LFxuXHQgICAgICAgICAqICAgICAgICAgaXY6IGl2V29yZEFycmF5LFxuXHQgICAgICAgICAqICAgICAgICAgc2FsdDogc2FsdFdvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIGFsZ29yaXRobTogQ3J5cHRvSlMuYWxnby5BRVMsXG5cdCAgICAgICAgICogICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcblx0ICAgICAgICAgKiAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5QS0NTNyxcblx0ICAgICAgICAgKiAgICAgICAgIGJsb2NrU2l6ZTogNCxcblx0ICAgICAgICAgKiAgICAgICAgIGZvcm1hdHRlcjogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0xcblx0ICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNpcGhlclBhcmFtcykge1xuXHQgICAgICAgICAgICB0aGlzLm1peEluKGNpcGhlclBhcmFtcyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHRoaXMgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0Zvcm1hdH0gZm9ybWF0dGVyIChPcHRpb25hbCkgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gdXNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3RyaW5naWZpZWQgY2lwaGVyIHBhcmFtcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEB0aHJvd3MgRXJyb3IgSWYgbmVpdGhlciB0aGUgZm9ybWF0dGVyIG5vciB0aGUgZGVmYXVsdCBmb3JtYXR0ZXIgaXMgc2V0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zICsgJyc7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSBjaXBoZXJQYXJhbXMudG9TdHJpbmcoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IGNpcGhlclBhcmFtcy50b1N0cmluZyhDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIChmb3JtYXR0ZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIChmb3JtYXR0ZXIgfHwgdGhpcy5mb3JtYXR0ZXIpLnN0cmluZ2lmeSh0aGlzKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBGb3JtYXQgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19mb3JtYXQgPSBDLmZvcm1hdCA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIE9wZW5TU0wgZm9ybWF0dGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIE9wZW5TU0xGb3JtYXR0ZXIgPSBDX2Zvcm1hdC5PcGVuU1NMID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYW4gT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfSBjaXBoZXJQYXJhbXMgVGhlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG9wZW5TU0xTdHJpbmcgPSBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTC5zdHJpbmdpZnkoY2lwaGVyUGFyYW1zKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIChjaXBoZXJQYXJhbXMpIHtcblx0ICAgICAgICAgICAgdmFyIHdvcmRBcnJheTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBjaXBoZXJQYXJhbXMuY2lwaGVydGV4dDtcblx0ICAgICAgICAgICAgdmFyIHNhbHQgPSBjaXBoZXJQYXJhbXMuc2FsdDtcblxuXHQgICAgICAgICAgICAvLyBGb3JtYXRcblx0ICAgICAgICAgICAgaWYgKHNhbHQpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRBcnJheSA9IFdvcmRBcnJheS5jcmVhdGUoWzB4NTM2MTZjNzQsIDB4NjU2NDVmNWZdKS5jb25jYXQoc2FsdCkuY29uY2F0KGNpcGhlcnRleHQpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgd29yZEFycmF5ID0gY2lwaGVydGV4dDtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB3b3JkQXJyYXkudG9TdHJpbmcoQmFzZTY0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYW4gT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZyB0byBhIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG9wZW5TU0xTdHIgVGhlIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMLnBhcnNlKG9wZW5TU0xTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAob3BlblNTTFN0cikge1xuXHQgICAgICAgICAgICB2YXIgc2FsdDtcblxuXHQgICAgICAgICAgICAvLyBQYXJzZSBiYXNlNjRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBCYXNlNjQucGFyc2Uob3BlblNTTFN0cik7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHRXb3JkcyA9IGNpcGhlcnRleHQud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gVGVzdCBmb3Igc2FsdFxuXHQgICAgICAgICAgICBpZiAoY2lwaGVydGV4dFdvcmRzWzBdID09IDB4NTM2MTZjNzQgJiYgY2lwaGVydGV4dFdvcmRzWzFdID09IDB4NjU2NDVmNWYpIHtcblx0ICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgc2FsdFxuXHQgICAgICAgICAgICAgICAgc2FsdCA9IFdvcmRBcnJheS5jcmVhdGUoY2lwaGVydGV4dFdvcmRzLnNsaWNlKDIsIDQpKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHNhbHQgZnJvbSBjaXBoZXJ0ZXh0XG5cdCAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0V29yZHMuc3BsaWNlKDAsIDQpO1xuXHQgICAgICAgICAgICAgICAgY2lwaGVydGV4dC5zaWdCeXRlcyAtPSAxNjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsgY2lwaGVydGV4dDogY2lwaGVydGV4dCwgc2FsdDogc2FsdCB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEEgY2lwaGVyIHdyYXBwZXIgdGhhdCByZXR1cm5zIGNpcGhlcnRleHQgYXMgYSBzZXJpYWxpemFibGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgKi9cblx0ICAgIHZhciBTZXJpYWxpemFibGVDaXBoZXIgPSBDX2xpYi5TZXJpYWxpemFibGVDaXBoZXIgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtGb3JtYXR0ZXJ9IGZvcm1hdCBUaGUgZm9ybWF0dGluZyBzdHJhdGVneSB0byBjb252ZXJ0IGNpcGhlciBwYXJhbSBvYmplY3RzIHRvIGFuZCBmcm9tIGEgc3RyaW5nLiBEZWZhdWx0OiBPcGVuU1NMXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIGZvcm1hdDogT3BlblNTTEZvcm1hdHRlclxuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRW5jcnlwdHMgYSBtZXNzYWdlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGVuY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IEEgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCBrZXkpO1xuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5LCB7IGl2OiBpdiB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsIGtleSwgeyBpdjogaXYsIGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZW5jcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgbWVzc2FnZSwga2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgdmFyIGVuY3J5cHRvciA9IGNpcGhlci5jcmVhdGVFbmNyeXB0b3Ioa2V5LCBjZmcpO1xuXHQgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IGVuY3J5cHRvci5maW5hbGl6ZShtZXNzYWdlKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgY2lwaGVyQ2ZnID0gZW5jcnlwdG9yLmNmZztcblxuXHQgICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBzZXJpYWxpemFibGUgY2lwaGVyIHBhcmFtc1xuXHQgICAgICAgICAgICByZXR1cm4gQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7XG5cdCAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0OiBjaXBoZXJ0ZXh0LFxuXHQgICAgICAgICAgICAgICAga2V5OiBrZXksXG5cdCAgICAgICAgICAgICAgICBpdjogY2lwaGVyQ2ZnLml2LFxuXHQgICAgICAgICAgICAgICAgYWxnb3JpdGhtOiBjaXBoZXIsXG5cdCAgICAgICAgICAgICAgICBtb2RlOiBjaXBoZXJDZmcubW9kZSxcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmc6IGNpcGhlckNmZy5wYWRkaW5nLFxuXHQgICAgICAgICAgICAgICAgYmxvY2tTaXplOiBjaXBoZXIuYmxvY2tTaXplLFxuXHQgICAgICAgICAgICAgICAgZm9ybWF0dGVyOiBjZmcuZm9ybWF0XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBEZWNyeXB0cyBzZXJpYWxpemVkIGNpcGhlcnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc3xzdHJpbmd9IGNpcGhlcnRleHQgVGhlIGNpcGhlcnRleHQgdG8gZGVjcnlwdC5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHBsYWludGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgZm9ybWF0dGVkQ2lwaGVydGV4dCwga2V5LCB7IGl2OiBpdiwgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgY2lwaGVydGV4dFBhcmFtcywga2V5LCB7IGl2OiBpdiwgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBkZWNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBjaXBoZXJ0ZXh0LCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gQ2lwaGVyUGFyYW1zXG5cdCAgICAgICAgICAgIGNpcGhlcnRleHQgPSB0aGlzLl9wYXJzZShjaXBoZXJ0ZXh0LCBjZmcuZm9ybWF0KTtcblxuXHQgICAgICAgICAgICAvLyBEZWNyeXB0XG5cdCAgICAgICAgICAgIHZhciBwbGFpbnRleHQgPSBjaXBoZXIuY3JlYXRlRGVjcnlwdG9yKGtleSwgY2ZnKS5maW5hbGl6ZShjaXBoZXJ0ZXh0LmNpcGhlcnRleHQpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBwbGFpbnRleHQ7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHNlcmlhbGl6ZWQgY2lwaGVydGV4dCB0byBDaXBoZXJQYXJhbXMsXG5cdCAgICAgICAgICogZWxzZSBhc3N1bWVkIENpcGhlclBhcmFtcyBhbHJlYWR5IGFuZCByZXR1cm5zIGNpcGhlcnRleHQgdW5jaGFuZ2VkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN8c3RyaW5nfSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7Rm9ybWF0dGVyfSBmb3JtYXQgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gdXNlIHRvIHBhcnNlIHNlcmlhbGl6ZWQgY2lwaGVydGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gVGhlIHVuc2VyaWFsaXplZCBjaXBoZXJ0ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuX3BhcnNlKGNpcGhlcnRleHRTdHJpbmdPclBhcmFtcywgZm9ybWF0KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfcGFyc2U6IGZ1bmN0aW9uIChjaXBoZXJ0ZXh0LCBmb3JtYXQpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBjaXBoZXJ0ZXh0ID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0LnBhcnNlKGNpcGhlcnRleHQsIHRoaXMpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGNpcGhlcnRleHQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBLZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2tkZiA9IEMua2RmID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogT3BlblNTTCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi5cblx0ICAgICAqL1xuXHQgICAgdmFyIE9wZW5TU0xLZGYgPSBDX2tkZi5PcGVuU1NMID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIERlcml2ZXMgYSBrZXkgYW5kIElWIGZyb20gYSBwYXNzd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gZGVyaXZlIGZyb20uXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGtleVNpemUgVGhlIHNpemUgaW4gd29yZHMgb2YgdGhlIGtleSB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gaXZTaXplIFRoZSBzaXplIGluIHdvcmRzIG9mIHRoZSBJViB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgKE9wdGlvbmFsKSBBIDY0LWJpdCBzYWx0IHRvIHVzZS4gSWYgb21pdHRlZCwgYSBzYWx0IHdpbGwgYmUgZ2VuZXJhdGVkIHJhbmRvbWx5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0IHdpdGggdGhlIGtleSwgSVYsIGFuZCBzYWx0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IENyeXB0b0pTLmtkZi5PcGVuU1NMLmV4ZWN1dGUoJ1Bhc3N3b3JkJywgMjU2LzMyLCAxMjgvMzIpO1xuXHQgICAgICAgICAqICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IENyeXB0b0pTLmtkZi5PcGVuU1NMLmV4ZWN1dGUoJ1Bhc3N3b3JkJywgMjU2LzMyLCAxMjgvMzIsICdzYWx0c2FsdCcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIChwYXNzd29yZCwga2V5U2l6ZSwgaXZTaXplLCBzYWx0LCBoYXNoZXIpIHtcblx0ICAgICAgICAgICAgLy8gR2VuZXJhdGUgcmFuZG9tIHNhbHRcblx0ICAgICAgICAgICAgaWYgKCFzYWx0KSB7XG5cdCAgICAgICAgICAgICAgICBzYWx0ID0gV29yZEFycmF5LnJhbmRvbSg2NC84KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIERlcml2ZSBrZXkgYW5kIElWXG5cdCAgICAgICAgICAgIGlmICghaGFzaGVyKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIga2V5ID0gRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IGtleVNpemUgKyBpdlNpemUgfSkuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB2YXIga2V5ID0gRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IGtleVNpemUgKyBpdlNpemUsIGhhc2hlcjogaGFzaGVyIH0pLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICAgICAgICB9XG5cblxuXHQgICAgICAgICAgICAvLyBTZXBhcmF0ZSBrZXkgYW5kIElWXG5cdCAgICAgICAgICAgIHZhciBpdiA9IFdvcmRBcnJheS5jcmVhdGUoa2V5LndvcmRzLnNsaWNlKGtleVNpemUpLCBpdlNpemUgKiA0KTtcblx0ICAgICAgICAgICAga2V5LnNpZ0J5dGVzID0ga2V5U2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIHBhcmFtc1xuXHQgICAgICAgICAgICByZXR1cm4gQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7IGtleToga2V5LCBpdjogaXYsIHNhbHQ6IHNhbHQgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBIHNlcmlhbGl6YWJsZSBjaXBoZXIgd3JhcHBlciB0aGF0IGRlcml2ZXMgdGhlIGtleSBmcm9tIGEgcGFzc3dvcmQsXG5cdCAgICAgKiBhbmQgcmV0dXJucyBjaXBoZXJ0ZXh0IGFzIGEgc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICovXG5cdCAgICB2YXIgUGFzc3dvcmRCYXNlZENpcGhlciA9IENfbGliLlBhc3N3b3JkQmFzZWRDaXBoZXIgPSBTZXJpYWxpemFibGVDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge0tERn0ga2RmIFRoZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB0byB1c2UgdG8gZ2VuZXJhdGUgYSBrZXkgYW5kIElWIGZyb20gYSBwYXNzd29yZC4gRGVmYXVsdDogT3BlblNTTFxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogU2VyaWFsaXphYmxlQ2lwaGVyLmNmZy5leHRlbmQoe1xuXHQgICAgICAgICAgICBrZGY6IE9wZW5TU0xLZGZcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEVuY3J5cHRzIGEgbWVzc2FnZSB1c2luZyBhIHBhc3N3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGVuY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsICdwYXNzd29yZCcpO1xuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsICdwYXNzd29yZCcsIHsgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBtZXNzYWdlLCBwYXNzd29yZCwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBvdGhlciBwYXJhbXNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBjZmcua2RmLmV4ZWN1dGUocGFzc3dvcmQsIGNpcGhlci5rZXlTaXplLCBjaXBoZXIuaXZTaXplLCBjZmcuc2FsdCwgY2ZnLmhhc2hlcik7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIElWIHRvIGNvbmZpZ1xuXHQgICAgICAgICAgICBjZmcuaXYgPSBkZXJpdmVkUGFyYW1zLml2O1xuXG5cdCAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBTZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdC5jYWxsKHRoaXMsIGNpcGhlciwgbWVzc2FnZSwgZGVyaXZlZFBhcmFtcy5rZXksIGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gTWl4IGluIGRlcml2ZWQgcGFyYW1zXG5cdCAgICAgICAgICAgIGNpcGhlcnRleHQubWl4SW4oZGVyaXZlZFBhcmFtcyk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNpcGhlcnRleHQ7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIERlY3J5cHRzIHNlcmlhbGl6ZWQgY2lwaGVydGV4dCB1c2luZyBhIHBhc3N3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN8c3RyaW5nfSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0IHRvIGRlY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcGxhaW50ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlBhc3N3b3JkQmFzZWRDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgZm9ybWF0dGVkQ2lwaGVydGV4dCwgJ3Bhc3N3b3JkJywgeyBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlBhc3N3b3JkQmFzZWRDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgY2lwaGVydGV4dFBhcmFtcywgJ3Bhc3N3b3JkJywgeyBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXIsIGNpcGhlcnRleHQsIHBhc3N3b3JkLCBjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIENpcGhlclBhcmFtc1xuXHQgICAgICAgICAgICBjaXBoZXJ0ZXh0ID0gdGhpcy5fcGFyc2UoY2lwaGVydGV4dCwgY2ZnLmZvcm1hdCk7XG5cblx0ICAgICAgICAgICAgLy8gRGVyaXZlIGtleSBhbmQgb3RoZXIgcGFyYW1zXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkUGFyYW1zID0gY2ZnLmtkZi5leGVjdXRlKHBhc3N3b3JkLCBjaXBoZXIua2V5U2l6ZSwgY2lwaGVyLml2U2l6ZSwgY2lwaGVydGV4dC5zYWx0LCBjZmcuaGFzaGVyKTtcblxuXHQgICAgICAgICAgICAvLyBBZGQgSVYgdG8gY29uZmlnXG5cdCAgICAgICAgICAgIGNmZy5pdiA9IGRlcml2ZWRQYXJhbXMuaXY7XG5cblx0ICAgICAgICAgICAgLy8gRGVjcnlwdFxuXHQgICAgICAgICAgICB2YXIgcGxhaW50ZXh0ID0gU2VyaWFsaXphYmxlQ2lwaGVyLmRlY3J5cHQuY2FsbCh0aGlzLCBjaXBoZXIsIGNpcGhlcnRleHQsIGRlcml2ZWRQYXJhbXMua2V5LCBjZmcpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBwbGFpbnRleHQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdH0oKSk7XG5cblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRyb290LkNyeXB0b0pTID0gZmFjdG9yeSgpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcblxuXHQvKmdsb2JhbHMgd2luZG93LCBnbG9iYWwsIHJlcXVpcmUqL1xuXG5cdC8qKlxuXHQgKiBDcnlwdG9KUyBjb3JlIGNvbXBvbmVudHMuXG5cdCAqL1xuXHR2YXIgQ3J5cHRvSlMgPSBDcnlwdG9KUyB8fCAoZnVuY3Rpb24gKE1hdGgsIHVuZGVmaW5lZCkge1xuXG5cdCAgICB2YXIgY3J5cHRvO1xuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gd2luZG93IChCcm93c2VyKVxuXHQgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSB3aW5kb3cuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGluIHdlYiB3b3JrZXIgKEJyb3dzZXIpXG5cdCAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gc2VsZi5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gZnJvbSB3b3JrZXJcblx0ICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcy5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSBnbG9iYWxUaGlzLmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIChleHBlcmltZW50YWwgSUUgMTEpIGNyeXB0byBmcm9tIHdpbmRvdyAoQnJvd3Nlcilcblx0ICAgIGlmICghY3J5cHRvICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5tc0NyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IHdpbmRvdy5tc0NyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBmcm9tIGdsb2JhbCAoTm9kZUpTKVxuXHQgICAgaWYgKCFjcnlwdG8gJiYgdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsLmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IGdsb2JhbC5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gaW1wb3J0IHZpYSByZXF1aXJlIChOb2RlSlMpXG5cdCAgICBpZiAoIWNyeXB0byAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGVycikge31cblx0ICAgIH1cblxuXHQgICAgLypcblx0ICAgICAqIENyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuXHQgICAgICpcblx0ICAgICAqIEFzIE1hdGgucmFuZG9tKCkgaXMgY3J5cHRvZ3JhcGhpY2FsbHkgbm90IHNhZmUgdG8gdXNlXG5cdCAgICAgKi9cblx0ICAgIHZhciBjcnlwdG9TZWN1cmVSYW5kb21JbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKGNyeXB0bykge1xuXHQgICAgICAgICAgICAvLyBVc2UgZ2V0UmFuZG9tVmFsdWVzIG1ldGhvZCAoQnJvd3Nlcilcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MzJBcnJheSgxKSlbMF07XG5cdCAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBVc2UgcmFuZG9tQnl0ZXMgbWV0aG9kIChOb2RlSlMpXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvLnJhbmRvbUJ5dGVzID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMoNCkucmVhZEludDMyTEUoKTtcblx0ICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF0aXZlIGNyeXB0byBtb2R1bGUgY291bGQgbm90IGJlIHVzZWQgdG8gZ2V0IHNlY3VyZSByYW5kb20gbnVtYmVyLicpO1xuXHQgICAgfTtcblxuXHQgICAgLypcblx0ICAgICAqIExvY2FsIHBvbHlmaWxsIG9mIE9iamVjdC5jcmVhdGVcblxuXHQgICAgICovXG5cdCAgICB2YXIgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGZ1bmN0aW9uIEYoKSB7fVxuXG5cdCAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHtcblx0ICAgICAgICAgICAgdmFyIHN1YnR5cGU7XG5cblx0ICAgICAgICAgICAgRi5wcm90b3R5cGUgPSBvYmo7XG5cblx0ICAgICAgICAgICAgc3VidHlwZSA9IG5ldyBGKCk7XG5cblx0ICAgICAgICAgICAgRi5wcm90b3R5cGUgPSBudWxsO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBzdWJ0eXBlO1xuXHQgICAgICAgIH07XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIENyeXB0b0pTIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEMgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBMaWJyYXJ5IG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfbGliID0gQy5saWIgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBCYXNlIG9iamVjdCBmb3IgcHJvdG90eXBhbCBpbmhlcml0YW5jZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlID0gKGZ1bmN0aW9uICgpIHtcblxuXG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG92ZXJyaWRlcyBQcm9wZXJ0aWVzIHRvIGNvcHkgaW50byB0aGUgbmV3IG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIE15VHlwZSA9IENyeXB0b0pTLmxpYi5CYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgZmllbGQ6ICd2YWx1ZScsXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgfVxuXHQgICAgICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBleHRlbmQ6IGZ1bmN0aW9uIChvdmVycmlkZXMpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNwYXduXG5cdCAgICAgICAgICAgICAgICB2YXIgc3VidHlwZSA9IGNyZWF0ZSh0aGlzKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gQXVnbWVudFxuXHQgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlcykge1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUubWl4SW4ob3ZlcnJpZGVzKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGRlZmF1bHQgaW5pdGlhbGl6ZXJcblx0ICAgICAgICAgICAgICAgIGlmICghc3VidHlwZS5oYXNPd25Qcm9wZXJ0eSgnaW5pdCcpIHx8IHRoaXMuaW5pdCA9PT0gc3VidHlwZS5pbml0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3VidHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLiRzdXBlci5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZXIncyBwcm90b3R5cGUgaXMgdGhlIHN1YnR5cGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICBzdWJ0eXBlLmluaXQucHJvdG90eXBlID0gc3VidHlwZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVmZXJlbmNlIHN1cGVydHlwZVxuXHQgICAgICAgICAgICAgICAgc3VidHlwZS4kc3VwZXIgPSB0aGlzO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gc3VidHlwZTtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogRXh0ZW5kcyB0aGlzIG9iamVjdCBhbmQgcnVucyB0aGUgaW5pdCBtZXRob2QuXG5cdCAgICAgICAgICAgICAqIEFyZ3VtZW50cyB0byBjcmVhdGUoKSB3aWxsIGJlIHBhc3NlZCB0byBpbml0KCkuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBpbnN0YW5jZSA9IE15VHlwZS5jcmVhdGUoKTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5leHRlbmQoKTtcblx0ICAgICAgICAgICAgICAgIGluc3RhbmNlLmluaXQuYXBwbHkoaW5zdGFuY2UsIGFyZ3VtZW50cyk7XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIG9iamVjdC5cblx0ICAgICAgICAgICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIHNvbWUgbG9naWMgd2hlbiB5b3VyIG9iamVjdHMgYXJlIGNyZWF0ZWQuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgTXlUeXBlID0gQ3J5cHRvSlMubGliLkJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgICogICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgICAgIC8vIC4uLlxuXHQgICAgICAgICAgICAgKiAgICAgICAgIH1cblx0ICAgICAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBpbnRvIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0byBtaXggaW4uXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICBNeVR5cGUubWl4SW4oe1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIGZpZWxkOiAndmFsdWUnXG5cdCAgICAgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIG1peEluOiBmdW5jdGlvbiAocHJvcGVydGllcykge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIElFIHdvbid0IGNvcHkgdG9TdHJpbmcgdXNpbmcgdGhlIGxvb3AgYWJvdmVcblx0ICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KCd0b1N0cmluZycpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmluZyA9IHByb3BlcnRpZXMudG9TdHJpbmc7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjbG9uZS5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBjbG9uZSA9IGluc3RhbmNlLmNsb25lKCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdC5wcm90b3R5cGUuZXh0ZW5kKHRoaXMpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgIH0oKSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQW4gYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7QXJyYXl9IHdvcmRzIFRoZSBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gc2lnQnl0ZXMgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgKi9cblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXkgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyAoT3B0aW9uYWwpIEFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc2lnQnl0ZXMgKE9wdGlvbmFsKSBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIHRoZSB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKCk7XG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbMHgwMDAxMDIwMywgMHgwNDA1MDYwN10pO1xuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAwMTAyMDMsIDB4MDQwNTA2MDddLCA2KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAod29yZHMsIHNpZ0J5dGVzKSB7XG5cdCAgICAgICAgICAgIHdvcmRzID0gdGhpcy53b3JkcyA9IHdvcmRzIHx8IFtdO1xuXG5cdCAgICAgICAgICAgIGlmIChzaWdCeXRlcyAhPSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSBzaWdCeXRlcztcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSB3b3Jkcy5sZW5ndGggKiA0O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHRoaXMgd29yZCBhcnJheSB0byBhIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7RW5jb2Rlcn0gZW5jb2RlciAoT3B0aW9uYWwpIFRoZSBlbmNvZGluZyBzdHJhdGVneSB0byB1c2UuIERlZmF1bHQ6IENyeXB0b0pTLmVuYy5IZXhcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0cmluZ2lmaWVkIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkgKyAnJztcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheS50b1N0cmluZygpO1xuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5LnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gKGVuY29kZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIChlbmNvZGVyIHx8IEhleCkuc3RyaW5naWZ5KHRoaXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25jYXRlbmF0ZXMgYSB3b3JkIGFycmF5IHRvIHRoaXMgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkgdG8gYXBwZW5kLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHdvcmRBcnJheTEuY29uY2F0KHdvcmRBcnJheTIpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNvbmNhdDogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHRoaXNXb3JkcyA9IHRoaXMud29yZHM7XG5cdCAgICAgICAgICAgIHZhciB0aGF0V29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciB0aGlzU2lnQnl0ZXMgPSB0aGlzLnNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB2YXIgdGhhdFNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzXG5cdCAgICAgICAgICAgIHRoaXMuY2xhbXAoKTtcblxuXHQgICAgICAgICAgICAvLyBDb25jYXRcblx0ICAgICAgICAgICAgaWYgKHRoaXNTaWdCeXRlcyAlIDQpIHtcblx0ICAgICAgICAgICAgICAgIC8vIENvcHkgb25lIGJ5dGUgYXQgYSB0aW1lXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoYXRTaWdCeXRlczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHRoYXRCeXRlID0gKHRoYXRXb3Jkc1tpID4+PiAyXSA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpc1dvcmRzWyh0aGlzU2lnQnl0ZXMgKyBpKSA+Pj4gMl0gfD0gdGhhdEJ5dGUgPDwgKDI0IC0gKCh0aGlzU2lnQnl0ZXMgKyBpKSAlIDQpICogOCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyBDb3B5IG9uZSB3b3JkIGF0IGEgdGltZVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGF0U2lnQnl0ZXM7IGogKz0gNCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNXb3Jkc1sodGhpc1NpZ0J5dGVzICsgaikgPj4+IDJdID0gdGhhdFdvcmRzW2ogPj4+IDJdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgKz0gdGhhdFNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENoYWluYWJsZVxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVtb3ZlcyBpbnNpZ25pZmljYW50IGJpdHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHdvcmRBcnJheS5jbGFtcCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsYW1wOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB0aGlzLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB0aGlzLnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENsYW1wXG5cdCAgICAgICAgICAgIHdvcmRzW3NpZ0J5dGVzID4+PiAyXSAmPSAweGZmZmZmZmZmIDw8ICgzMiAtIChzaWdCeXRlcyAlIDQpICogOCk7XG5cdCAgICAgICAgICAgIHdvcmRzLmxlbmd0aCA9IE1hdGguY2VpbChzaWdCeXRlcyAvIDQpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBjbG9uZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNsb25lID0gd29yZEFycmF5LmNsb25lKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gQmFzZS5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS53b3JkcyA9IHRoaXMud29yZHMuc2xpY2UoMCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgd29yZCBhcnJheSBmaWxsZWQgd2l0aCByYW5kb20gYnl0ZXMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbkJ5dGVzIFRoZSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHRvIGdlbmVyYXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcmFuZG9tIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSgxNik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmFuZG9tOiBmdW5jdGlvbiAobkJ5dGVzKSB7XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdO1xuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbkJ5dGVzOyBpICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzLnB1c2goY3J5cHRvU2VjdXJlUmFuZG9tSW50KCkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgbkJ5dGVzKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBFbmNvZGVyIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfZW5jID0gQy5lbmMgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBIZXggZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBIZXggPSBDX2VuYy5IZXggPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoZXggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaGV4U3RyaW5nID0gQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IHdvcmRBcnJheS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIGhleENoYXJzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnQnl0ZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGJpdGUgPSAod29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgaGV4Q2hhcnMucHVzaCgoYml0ZSA+Pj4gNCkudG9TdHJpbmcoMTYpKTtcblx0ICAgICAgICAgICAgICAgIGhleENoYXJzLnB1c2goKGJpdGUgJiAweDBmKS50b1N0cmluZygxNikpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGhleENoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIGhleCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGhleFN0ciBUaGUgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGhleFN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChoZXhTdHIpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGhleFN0ckxlbmd0aCA9IGhleFN0ci5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZXhTdHJMZW5ndGg7IGkgKz0gMikge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gM10gfD0gcGFyc2VJbnQoaGV4U3RyLnN1YnN0cihpLCAyKSwgMTYpIDw8ICgyNCAtIChpICUgOCkgKiA0KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIGhleFN0ckxlbmd0aCAvIDIpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogTGF0aW4xIGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgTGF0aW4xID0gQ19lbmMuTGF0aW4xID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIExhdGluMSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgTGF0aW4xIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGxhdGluMVN0cmluZyA9IENyeXB0b0pTLmVuYy5MYXRpbjEuc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciBsYXRpbjFDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBiaXRlID0gKHdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIGxhdGluMUNoYXJzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShiaXRlKSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbGF0aW4xQ2hhcnMuam9pbignJyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgTGF0aW4xIHN0cmluZyB0byBhIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF0aW4xU3RyIFRoZSBMYXRpbjEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5MYXRpbjEucGFyc2UobGF0aW4xU3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGxhdGluMVN0cikge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgbGF0aW4xU3RyTGVuZ3RoID0gbGF0aW4xU3RyLmxlbmd0aDtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGluMVN0ckxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tpID4+PiAyXSB8PSAobGF0aW4xU3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKSA8PCAoMjQgLSAoaSAlIDQpICogOCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBsYXRpbjFTdHJMZW5ndGgpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogVVRGLTggZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBVdGY4ID0gQ19lbmMuVXRmOCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBVVEYtOCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgdXRmOFN0cmluZyA9IENyeXB0b0pTLmVuYy5VdGY4LnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoTGF0aW4xLnN0cmluZ2lmeSh3b3JkQXJyYXkpKSk7XG5cdCAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWFsZm9ybWVkIFVURi04IGRhdGEnKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIFVURi04IHN0cmluZyB0byBhIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXRmOFN0ciBUaGUgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHV0ZjhTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodXRmOFN0cikge1xuXHQgICAgICAgICAgICByZXR1cm4gTGF0aW4xLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh1dGY4U3RyKSkpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYnVmZmVyZWQgYmxvY2sgYWxnb3JpdGhtIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIFRoZSBwcm9wZXJ0eSBibG9ja1NpemUgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhIGNvbmNyZXRlIHN1YnR5cGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IF9taW5CdWZmZXJTaXplIFRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgc2hvdWxkIGJlIGtlcHQgdW5wcm9jZXNzZWQgaW4gdGhlIGJ1ZmZlci4gRGVmYXVsdDogMFxuXHQgICAgICovXG5cdCAgICB2YXIgQnVmZmVyZWRCbG9ja0FsZ29yaXRobSA9IENfbGliLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgYmxvY2sgYWxnb3JpdGhtJ3MgZGF0YSBidWZmZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0ucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB0aGlzLl9kYXRhID0gbmV3IFdvcmRBcnJheS5pbml0KCk7XG5cdCAgICAgICAgICAgIHRoaXMuX25EYXRhQnl0ZXMgPSAwO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBBZGRzIG5ldyBkYXRhIHRvIHRoaXMgYmxvY2sgYWxnb3JpdGhtJ3MgYnVmZmVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGFwcGVuZC4gU3RyaW5ncyBhcmUgY29udmVydGVkIHRvIGEgV29yZEFycmF5IHVzaW5nIFVURi04LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9hcHBlbmQoJ2RhdGEnKTtcblx0ICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2FwcGVuZDogZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gV29yZEFycmF5LCBlbHNlIGFzc3VtZSBXb3JkQXJyYXkgYWxyZWFkeVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgIGRhdGEgPSBVdGY4LnBhcnNlKGRhdGEpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2RhdGEuY29uY2F0KGRhdGEpO1xuXHQgICAgICAgICAgICB0aGlzLl9uRGF0YUJ5dGVzICs9IGRhdGEuc2lnQnl0ZXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFByb2Nlc3NlcyBhdmFpbGFibGUgZGF0YSBibG9ja3MuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIF9kb1Byb2Nlc3NCbG9jayhvZmZzZXQpLCB3aGljaCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgY29uY3JldGUgc3VidHlwZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZG9GbHVzaCBXaGV0aGVyIGFsbCBibG9ja3MgYW5kIHBhcnRpYWwgYmxvY2tzIHNob3VsZCBiZSBwcm9jZXNzZWQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBwcm9jZXNzZWQgZGF0YS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHByb2Nlc3NlZERhdGEgPSBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9wcm9jZXNzKCk7XG5cdCAgICAgICAgICogICAgIHZhciBwcm9jZXNzZWREYXRhID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fcHJvY2VzcyghISdmbHVzaCcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9wcm9jZXNzOiBmdW5jdGlvbiAoZG9GbHVzaCkge1xuXHQgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkV29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBkYXRhU2lnQnl0ZXMgPSBkYXRhLnNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gdGhpcy5ibG9ja1NpemU7XG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgYmxvY2tzIHJlYWR5XG5cdCAgICAgICAgICAgIHZhciBuQmxvY2tzUmVhZHkgPSBkYXRhU2lnQnl0ZXMgLyBibG9ja1NpemVCeXRlcztcblx0ICAgICAgICAgICAgaWYgKGRvRmx1c2gpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFJvdW5kIHVwIHRvIGluY2x1ZGUgcGFydGlhbCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGguY2VpbChuQmxvY2tzUmVhZHkpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gUm91bmQgZG93biB0byBpbmNsdWRlIG9ubHkgZnVsbCBibG9ja3MsXG5cdCAgICAgICAgICAgICAgICAvLyBsZXNzIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgbXVzdCByZW1haW4gaW4gdGhlIGJ1ZmZlclxuXHQgICAgICAgICAgICAgICAgbkJsb2Nrc1JlYWR5ID0gTWF0aC5tYXgoKG5CbG9ja3NSZWFkeSB8IDApIC0gdGhpcy5fbWluQnVmZmVyU2l6ZSwgMCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDb3VudCB3b3JkcyByZWFkeVxuXHQgICAgICAgICAgICB2YXIgbldvcmRzUmVhZHkgPSBuQmxvY2tzUmVhZHkgKiBibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgYnl0ZXMgcmVhZHlcblx0ICAgICAgICAgICAgdmFyIG5CeXRlc1JlYWR5ID0gTWF0aC5taW4obldvcmRzUmVhZHkgKiA0LCBkYXRhU2lnQnl0ZXMpO1xuXG5cdCAgICAgICAgICAgIC8vIFByb2Nlc3MgYmxvY2tzXG5cdCAgICAgICAgICAgIGlmIChuV29yZHNSZWFkeSkge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbldvcmRzUmVhZHk7IG9mZnNldCArPSBibG9ja1NpemUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWFsZ29yaXRobSBsb2dpY1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvUHJvY2Vzc0Jsb2NrKGRhdGFXb3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHByb2Nlc3NlZCB3b3Jkc1xuXHQgICAgICAgICAgICAgICAgcHJvY2Vzc2VkV29yZHMgPSBkYXRhV29yZHMuc3BsaWNlKDAsIG5Xb3Jkc1JlYWR5KTtcblx0ICAgICAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgLT0gbkJ5dGVzUmVhZHk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gcHJvY2Vzc2VkIHdvcmRzXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQocHJvY2Vzc2VkV29yZHMsIG5CeXRlc1JlYWR5KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjbG9uZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNsb25lID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5jbG9uZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUuX2RhdGEgPSB0aGlzLl9kYXRhLmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfbWluQnVmZmVyU2l6ZTogMFxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgaGFzaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgdGhpcyBoYXNoZXIgb3BlcmF0ZXMgb24uIERlZmF1bHQ6IDE2ICg1MTIgYml0cylcblx0ICAgICAqL1xuXHQgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlciA9IEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCgpLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGhhc2hlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBoYXNoIGNvbXB1dGF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaGFzaGVyID0gQ3J5cHRvSlMuYWxnby5TSEEyNTYuY3JlYXRlKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZXNldHMgdGhpcyBoYXNoZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFJlc2V0IGRhdGEgYnVmZmVyXG5cdCAgICAgICAgICAgIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0ucmVzZXQuY2FsbCh0aGlzKTtcblxuXHQgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWhhc2hlciBsb2dpY1xuXHQgICAgICAgICAgICB0aGlzLl9kb1Jlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFVwZGF0ZXMgdGhpcyBoYXNoZXIgd2l0aCBhIG1lc3NhZ2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7SGFzaGVyfSBUaGlzIGhhc2hlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICBoYXNoZXIudXBkYXRlKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBBcHBlbmRcblx0ICAgICAgICAgICAgdGhpcy5fYXBwZW5kKG1lc3NhZ2VVcGRhdGUpO1xuXG5cdCAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaGFzaFxuXHQgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ2hhaW5hYmxlXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBGaW5hbGl6ZXMgdGhlIGhhc2ggY29tcHV0YXRpb24uXG5cdCAgICAgICAgICogTm90ZSB0aGF0IHRoZSBmaW5hbGl6ZSBvcGVyYXRpb24gaXMgZWZmZWN0aXZlbHkgYSBkZXN0cnVjdGl2ZSwgcmVhZC1vbmNlIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSAoT3B0aW9uYWwpIEEgZmluYWwgbWVzc2FnZSB1cGRhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBGaW5hbCBtZXNzYWdlIHVwZGF0ZVxuXHQgICAgICAgICAgICBpZiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kKG1lc3NhZ2VVcGRhdGUpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1oYXNoZXIgbG9naWNcblx0ICAgICAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9kb0ZpbmFsaXplKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGhhc2g7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGJsb2NrU2l6ZTogNTEyLzMyLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHNob3J0Y3V0IGZ1bmN0aW9uIHRvIGEgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2hlciB0byBjcmVhdGUgYSBoZWxwZXIgZm9yLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBzaG9ydGN1dCBmdW5jdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIFNIQTI1NiA9IENyeXB0b0pTLmxpYi5IYXNoZXIuX2NyZWF0ZUhlbHBlcihDcnlwdG9KUy5hbGdvLlNIQTI1Nik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhlbHBlcjogZnVuY3Rpb24gKGhhc2hlcikge1xuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UsIGNmZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBoYXNoZXIuaW5pdChjZmcpLmZpbmFsaXplKG1lc3NhZ2UpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgc2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaGVyIHRvIHVzZSBpbiB0aGlzIEhNQUMgaGVscGVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBzaG9ydGN1dCBmdW5jdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIEhtYWNTSEEyNTYgPSBDcnlwdG9KUy5saWIuSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKENyeXB0b0pTLmFsZ28uU0hBMjU2KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfY3JlYXRlSG1hY0hlbHBlcjogZnVuY3Rpb24gKGhhc2hlcikge1xuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UsIGtleSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDX2FsZ28uSE1BQy5pbml0KGhhc2hlciwga2V5KS5maW5hbGl6ZShtZXNzYWdlKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBbGdvcml0aG0gbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvID0ge307XG5cblx0ICAgIHJldHVybiBDO1xuXHR9KE1hdGgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUztcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEJhc2U2NCBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEJhc2U2NCA9IENfZW5jLkJhc2U2NCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBCYXNlNjQgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEJhc2U2NCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBiYXNlNjRTdHJpbmcgPSBDcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cblx0ICAgICAgICAgICAgLy8gQ2xhbXAgZXhjZXNzIGJpdHNcblx0ICAgICAgICAgICAgd29yZEFycmF5LmNsYW1wKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgYmFzZTY0Q2hhcnMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSArPSAzKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYnl0ZTEgPSAod29yZHNbaSA+Pj4gMl0gICAgICAgPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgICAgICAgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJ5dGUyID0gKHdvcmRzWyhpICsgMSkgPj4+IDJdID4+PiAoMjQgLSAoKGkgKyAxKSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIHZhciBieXRlMyA9ICh3b3Jkc1soaSArIDIpID4+PiAyXSA+Pj4gKDI0IC0gKChpICsgMikgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cblx0ICAgICAgICAgICAgICAgIHZhciB0cmlwbGV0ID0gKGJ5dGUxIDw8IDE2KSB8IChieXRlMiA8PCA4KSB8IGJ5dGUzO1xuXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgKGogPCA0KSAmJiAoaSArIGogKiAwLjc1IDwgc2lnQnl0ZXMpOyBqKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBiYXNlNjRDaGFycy5wdXNoKG1hcC5jaGFyQXQoKHRyaXBsZXQgPj4+ICg2ICogKDMgLSBqKSkpICYgMHgzZikpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmdcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmdDaGFyID0gbWFwLmNoYXJBdCg2NCk7XG5cdCAgICAgICAgICAgIGlmIChwYWRkaW5nQ2hhcikge1xuXHQgICAgICAgICAgICAgICAgd2hpbGUgKGJhc2U2NENoYXJzLmxlbmd0aCAlIDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBiYXNlNjRDaGFycy5wdXNoKHBhZGRpbmdDaGFyKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBiYXNlNjRDaGFycy5qb2luKCcnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBCYXNlNjQgc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjRTdHIgVGhlIEJhc2U2NCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShiYXNlNjRTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoYmFzZTY0U3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgYmFzZTY0U3RyTGVuZ3RoID0gYmFzZTY0U3RyLmxlbmd0aDtcblx0ICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcblx0ICAgICAgICAgICAgdmFyIHJldmVyc2VNYXAgPSB0aGlzLl9yZXZlcnNlTWFwO1xuXG5cdCAgICAgICAgICAgIGlmICghcmV2ZXJzZU1hcCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldmVyc2VNYXAgPSB0aGlzLl9yZXZlcnNlTWFwID0gW107XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXAubGVuZ3RoOyBqKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZU1hcFttYXAuY2hhckNvZGVBdChqKV0gPSBqO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIElnbm9yZSBwYWRkaW5nXG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nQ2hhciA9IG1hcC5jaGFyQXQoNjQpO1xuXHQgICAgICAgICAgICBpZiAocGFkZGluZ0NoYXIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBwYWRkaW5nSW5kZXggPSBiYXNlNjRTdHIuaW5kZXhPZihwYWRkaW5nQ2hhcik7XG5cdCAgICAgICAgICAgICAgICBpZiAocGFkZGluZ0luZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJhc2U2NFN0ckxlbmd0aCA9IHBhZGRpbmdJbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgcmV0dXJuIHBhcnNlTG9vcChiYXNlNjRTdHIsIGJhc2U2NFN0ckxlbmd0aCwgcmV2ZXJzZU1hcCk7XG5cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX21hcDogJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89J1xuXHQgICAgfTtcblxuXHQgICAgZnVuY3Rpb24gcGFyc2VMb29wKGJhc2U2NFN0ciwgYmFzZTY0U3RyTGVuZ3RoLCByZXZlcnNlTWFwKSB7XG5cdCAgICAgIHZhciB3b3JkcyA9IFtdO1xuXHQgICAgICB2YXIgbkJ5dGVzID0gMDtcblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXNlNjRTdHJMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgaWYgKGkgJSA0KSB7XG5cdCAgICAgICAgICAgICAgdmFyIGJpdHMxID0gcmV2ZXJzZU1hcFtiYXNlNjRTdHIuY2hhckNvZGVBdChpIC0gMSldIDw8ICgoaSAlIDQpICogMik7XG5cdCAgICAgICAgICAgICAgdmFyIGJpdHMyID0gcmV2ZXJzZU1hcFtiYXNlNjRTdHIuY2hhckNvZGVBdChpKV0gPj4+ICg2IC0gKGkgJSA0KSAqIDIpO1xuXHQgICAgICAgICAgICAgIHZhciBiaXRzQ29tYmluZWQgPSBiaXRzMSB8IGJpdHMyO1xuXHQgICAgICAgICAgICAgIHdvcmRzW25CeXRlcyA+Pj4gMl0gfD0gYml0c0NvbWJpbmVkIDw8ICgyNCAtIChuQnl0ZXMgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICAgIG5CeXRlcysrO1xuXHQgICAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBXb3JkQXJyYXkuY3JlYXRlKHdvcmRzLCBuQnl0ZXMpO1xuXHQgICAgfVxuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLmVuYy5CYXNlNjQ7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdHJldHVybiBDcnlwdG9KUy5lbmMuVXRmODtcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9zaGExXCIpLCByZXF1aXJlKFwiLi9obWFjXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL3NoYTFcIiwgXCIuL2htYWNcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXHQgICAgdmFyIE1ENSA9IENfYWxnby5NRDU7XG5cblx0ICAgIC8qKlxuXHQgICAgICogVGhpcyBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBpcyBtZWFudCB0byBjb25mb3JtIHdpdGggRVZQX0J5dGVzVG9LZXkuXG5cdCAgICAgKiB3d3cub3BlbnNzbC5vcmcvZG9jcy9jcnlwdG8vRVZQX0J5dGVzVG9LZXkuaHRtbFxuXHQgICAgICovXG5cdCAgICB2YXIgRXZwS0RGID0gQ19hbGdvLkV2cEtERiA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0ga2V5U2l6ZSBUaGUga2V5IHNpemUgaW4gd29yZHMgdG8gZ2VuZXJhdGUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZS4gRGVmYXVsdDogTUQ1XG5cdCAgICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGl0ZXJhdGlvbnMgVGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm0uIERlZmF1bHQ6IDFcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAgICAga2V5U2l6ZTogMTI4LzMyLFxuXHQgICAgICAgICAgICBoYXNoZXI6IE1ENSxcblx0ICAgICAgICAgICAgaXRlcmF0aW9uczogMVxuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgZGVyaXZhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uRXZwS0RGLmNyZWF0ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5FdnBLREYuY3JlYXRlKHsga2V5U2l6ZTogOCB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykge1xuXHQgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBEZXJpdmVzIGEga2V5IGZyb20gYSBwYXNzd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCBBIHNhbHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkZXJpdmVkIGtleS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGtleSA9IGtkZi5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb21wdXRlOiBmdW5jdGlvbiAocGFzc3dvcmQsIHNhbHQpIHtcblx0ICAgICAgICAgICAgdmFyIGJsb2NrO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBjZmcgPSB0aGlzLmNmZztcblxuXHQgICAgICAgICAgICAvLyBJbml0IGhhc2hlclxuXHQgICAgICAgICAgICB2YXIgaGFzaGVyID0gY2ZnLmhhc2hlci5jcmVhdGUoKTtcblxuXHQgICAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB2YXIgZGVyaXZlZEtleSA9IFdvcmRBcnJheS5jcmVhdGUoKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRLZXlXb3JkcyA9IGRlcml2ZWRLZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBrZXlTaXplID0gY2ZnLmtleVNpemU7XG5cdCAgICAgICAgICAgIHZhciBpdGVyYXRpb25zID0gY2ZnLml0ZXJhdGlvbnM7XG5cblx0ICAgICAgICAgICAgLy8gR2VuZXJhdGUga2V5XG5cdCAgICAgICAgICAgIHdoaWxlIChkZXJpdmVkS2V5V29yZHMubGVuZ3RoIDwga2V5U2l6ZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFzaGVyLnVwZGF0ZShibG9jayk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBibG9jayA9IGhhc2hlci51cGRhdGUocGFzc3dvcmQpLmZpbmFsaXplKHNhbHQpO1xuXHQgICAgICAgICAgICAgICAgaGFzaGVyLnJlc2V0KCk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGlvbnNcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBoYXNoZXIuZmluYWxpemUoYmxvY2spO1xuXHQgICAgICAgICAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBkZXJpdmVkS2V5LmNvbmNhdChibG9jayk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZGVyaXZlZEtleS5zaWdCeXRlcyA9IGtleVNpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIHJldHVybiBkZXJpdmVkS2V5O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIERlcml2ZXMgYSBrZXkgZnJvbSBhIHBhc3N3b3JkLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IEEgc2FsdC5cblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBjb21wdXRhdGlvbi5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkZXJpdmVkIGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLkV2cEtERihwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLkV2cEtERihwYXNzd29yZCwgc2FsdCwgeyBrZXlTaXplOiA4IH0pO1xuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQsIHsga2V5U2l6ZTogOCwgaXRlcmF0aW9uczogMTAwMCB9KTtcblx0ICAgICAqL1xuXHQgICAgQy5FdnBLREYgPSBmdW5jdGlvbiAocGFzc3dvcmQsIHNhbHQsIGNmZykge1xuXHQgICAgICAgIHJldHVybiBFdnBLREYuY3JlYXRlKGNmZykuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICB9O1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLkV2cEtERjtcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlO1xuXHQgICAgdmFyIENfZW5jID0gQy5lbmM7XG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0Zjg7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEhNQUMgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgSE1BQyA9IENfYWxnby5ITUFDID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBITUFDLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaCBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaG1hY0hhc2hlciA9IENyeXB0b0pTLmFsZ28uSE1BQy5jcmVhdGUoQ3J5cHRvSlMuYWxnby5TSEEyNTYsIGtleSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGhhc2hlciwga2V5KSB7XG5cdCAgICAgICAgICAgIC8vIEluaXQgaGFzaGVyXG5cdCAgICAgICAgICAgIGhhc2hlciA9IHRoaXMuX2hhc2hlciA9IG5ldyBoYXNoZXIuaW5pdCgpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIFdvcmRBcnJheSwgZWxzZSBhc3N1bWUgV29yZEFycmF5IGFscmVhZHlcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgIGtleSA9IFV0ZjgucGFyc2Uoa2V5KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgaGFzaGVyQmxvY2tTaXplID0gaGFzaGVyLmJsb2NrU2l6ZTtcblx0ICAgICAgICAgICAgdmFyIGhhc2hlckJsb2NrU2l6ZUJ5dGVzID0gaGFzaGVyQmxvY2tTaXplICogNDtcblxuXHQgICAgICAgICAgICAvLyBBbGxvdyBhcmJpdHJhcnkgbGVuZ3RoIGtleXNcblx0ICAgICAgICAgICAgaWYgKGtleS5zaWdCeXRlcyA+IGhhc2hlckJsb2NrU2l6ZUJ5dGVzKSB7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSBoYXNoZXIuZmluYWxpemUoa2V5KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzXG5cdCAgICAgICAgICAgIGtleS5jbGFtcCgpO1xuXG5cdCAgICAgICAgICAgIC8vIENsb25lIGtleSBmb3IgaW5uZXIgYW5kIG91dGVyIHBhZHNcblx0ICAgICAgICAgICAgdmFyIG9LZXkgPSB0aGlzLl9vS2V5ID0ga2V5LmNsb25lKCk7XG5cdCAgICAgICAgICAgIHZhciBpS2V5ID0gdGhpcy5faUtleSA9IGtleS5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgb0tleVdvcmRzID0gb0tleS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIGlLZXlXb3JkcyA9IGlLZXkud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gWE9SIGtleXMgd2l0aCBwYWQgY29uc3RhbnRzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFzaGVyQmxvY2tTaXplOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIG9LZXlXb3Jkc1tpXSBePSAweDVjNWM1YzVjO1xuXHQgICAgICAgICAgICAgICAgaUtleVdvcmRzW2ldIF49IDB4MzYzNjM2MzY7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgb0tleS5zaWdCeXRlcyA9IGlLZXkuc2lnQnl0ZXMgPSBoYXNoZXJCbG9ja1NpemVCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZXNldHMgdGhpcyBITUFDIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBobWFjSGFzaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGhhc2hlciA9IHRoaXMuX2hhc2hlcjtcblxuXHQgICAgICAgICAgICAvLyBSZXNldFxuXHQgICAgICAgICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgICAgaGFzaGVyLnVwZGF0ZSh0aGlzLl9pS2V5KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVXBkYXRlcyB0aGlzIEhNQUMgd2l0aCBhIG1lc3NhZ2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7SE1BQ30gVGhpcyBITUFDIGluc3RhbmNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBobWFjSGFzaGVyLnVwZGF0ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICBobWFjSGFzaGVyLnVwZGF0ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaGVyLnVwZGF0ZShtZXNzYWdlVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBDaGFpbmFibGVcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEZpbmFsaXplcyB0aGUgSE1BQyBjb21wdXRhdGlvbi5cblx0ICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIGZpbmFsaXplIG9wZXJhdGlvbiBpcyBlZmZlY3RpdmVseSBhIGRlc3RydWN0aXZlLCByZWFkLW9uY2Ugb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIChPcHRpb25hbCkgQSBmaW5hbCBtZXNzYWdlIHVwZGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBobWFjID0gaG1hY0hhc2hlci5maW5hbGl6ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgaG1hYyA9IGhtYWNIYXNoZXIuZmluYWxpemUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBoYXNoZXIgPSB0aGlzLl9oYXNoZXI7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBITUFDXG5cdCAgICAgICAgICAgIHZhciBpbm5lckhhc2ggPSBoYXNoZXIuZmluYWxpemUobWVzc2FnZVVwZGF0ZSk7XG5cdCAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAgICB2YXIgaG1hYyA9IGhhc2hlci5maW5hbGl6ZSh0aGlzLl9vS2V5LmNsb25lKCkuY29uY2F0KGlubmVySGFzaCkpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBobWFjO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9KCkpO1xuXG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoTWF0aCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIENvbnN0YW50cyB0YWJsZVxuXHQgICAgdmFyIFQgPSBbXTtcblxuXHQgICAgLy8gQ29tcHV0ZSBjb25zdGFudHNcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XG5cdCAgICAgICAgICAgIFRbaV0gPSAoTWF0aC5hYnMoTWF0aC5zaW4oaSArIDEpKSAqIDB4MTAwMDAwMDAwKSB8IDA7XG5cdCAgICAgICAgfVxuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBNRDUgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBNRDUgPSBDX2FsZ28uTUQ1ID0gSGFzaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChbXG5cdCAgICAgICAgICAgICAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LFxuXHQgICAgICAgICAgICAgICAgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NlxuXHQgICAgICAgICAgICBdKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0X2kgPSBvZmZzZXQgKyBpO1xuXHQgICAgICAgICAgICAgICAgdmFyIE1fb2Zmc2V0X2kgPSBNW29mZnNldF9pXTtcblxuXHQgICAgICAgICAgICAgICAgTVtvZmZzZXRfaV0gPSAoXG5cdCAgICAgICAgICAgICAgICAgICAgKCgoTV9vZmZzZXRfaSA8PCA4KSAgfCAoTV9vZmZzZXRfaSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAoKChNX29mZnNldF9pIDw8IDI0KSB8IChNX29mZnNldF9pID4+PiA4KSkgICYgMHhmZjAwZmYwMClcblx0ICAgICAgICAgICAgICAgICk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIEggPSB0aGlzLl9oYXNoLndvcmRzO1xuXG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8wICA9IE1bb2Zmc2V0ICsgMF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xICA9IE1bb2Zmc2V0ICsgMV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8yICA9IE1bb2Zmc2V0ICsgMl07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8zICA9IE1bb2Zmc2V0ICsgM107XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF80ICA9IE1bb2Zmc2V0ICsgNF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF81ICA9IE1bb2Zmc2V0ICsgNV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF82ICA9IE1bb2Zmc2V0ICsgNl07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF83ICA9IE1bb2Zmc2V0ICsgN107XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF84ICA9IE1bb2Zmc2V0ICsgOF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF85ICA9IE1bb2Zmc2V0ICsgOV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xMCA9IE1bb2Zmc2V0ICsgMTBdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTEgPSBNW29mZnNldCArIDExXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzEyID0gTVtvZmZzZXQgKyAxMl07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xMyA9IE1bb2Zmc2V0ICsgMTNdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTQgPSBNW29mZnNldCArIDE0XTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzE1ID0gTVtvZmZzZXQgKyAxNV07XG5cblx0ICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXNcblx0ICAgICAgICAgICAgdmFyIGEgPSBIWzBdO1xuXHQgICAgICAgICAgICB2YXIgYiA9IEhbMV07XG5cdCAgICAgICAgICAgIHZhciBjID0gSFsyXTtcblx0ICAgICAgICAgICAgdmFyIGQgPSBIWzNdO1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGF0aW9uXG5cdCAgICAgICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBNX29mZnNldF8wLCAgNywgIFRbMF0pO1xuXHQgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfMSwgIDEyLCBUWzFdKTtcblx0ICAgICAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzIsICAxNywgVFsyXSk7XG5cdCAgICAgICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBNX29mZnNldF8zLCAgMjIsIFRbM10pO1xuXHQgICAgICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgTV9vZmZzZXRfNCwgIDcsICBUWzRdKTtcblx0ICAgICAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzUsICAxMiwgVFs1XSk7XG5cdCAgICAgICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF82LCAgMTcsIFRbNl0pO1xuXHQgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfNywgIDIyLCBUWzddKTtcblx0ICAgICAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzgsICA3LCAgVFs4XSk7XG5cdCAgICAgICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCBNX29mZnNldF85LCAgMTIsIFRbOV0pO1xuXHQgICAgICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTAsIDE3LCBUWzEwXSk7XG5cdCAgICAgICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBNX29mZnNldF8xMSwgMjIsIFRbMTFdKTtcblx0ICAgICAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEyLCA3LCAgVFsxMl0pO1xuXHQgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTMsIDEyLCBUWzEzXSk7XG5cdCAgICAgICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF8xNCwgMTcsIFRbMTRdKTtcblx0ICAgICAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzE1LCAyMiwgVFsxNV0pO1xuXG5cdCAgICAgICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBNX29mZnNldF8xLCAgNSwgIFRbMTZdKTtcblx0ICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzYsICA5LCAgVFsxN10pO1xuXHQgICAgICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgTV9vZmZzZXRfMTEsIDE0LCBUWzE4XSk7XG5cdCAgICAgICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBNX29mZnNldF8wLCAgMjAsIFRbMTldKTtcblx0ICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzUsICA1LCAgVFsyMF0pO1xuXHQgICAgICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgTV9vZmZzZXRfMTAsIDksICBUWzIxXSk7XG5cdCAgICAgICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBNX29mZnNldF8xNSwgMTQsIFRbMjJdKTtcblx0ICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzQsICAyMCwgVFsyM10pO1xuXHQgICAgICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgTV9vZmZzZXRfOSwgIDUsICBUWzI0XSk7XG5cdCAgICAgICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF8xNCwgOSwgIFRbMjVdKTtcblx0ICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzMsICAxNCwgVFsyNl0pO1xuXHQgICAgICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgTV9vZmZzZXRfOCwgIDIwLCBUWzI3XSk7XG5cdCAgICAgICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBNX29mZnNldF8xMywgNSwgIFRbMjhdKTtcblx0ICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzIsICA5LCAgVFsyOV0pO1xuXHQgICAgICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgTV9vZmZzZXRfNywgIDE0LCBUWzMwXSk7XG5cdCAgICAgICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBNX29mZnNldF8xMiwgMjAsIFRbMzFdKTtcblxuXHQgICAgICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfNSwgIDQsICBUWzMyXSk7XG5cdCAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF84LCAgMTEsIFRbMzNdKTtcblx0ICAgICAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzExLCAxNiwgVFszNF0pO1xuXHQgICAgICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTQsIDIzLCBUWzM1XSk7XG5cdCAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF8xLCAgNCwgIFRbMzZdKTtcblx0ICAgICAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzQsICAxMSwgVFszN10pO1xuXHQgICAgICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgTV9vZmZzZXRfNywgIDE2LCBUWzM4XSk7XG5cdCAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF8xMCwgMjMsIFRbMzldKTtcblx0ICAgICAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEzLCA0LCAgVFs0MF0pO1xuXHQgICAgICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgTV9vZmZzZXRfMCwgIDExLCBUWzQxXSk7XG5cdCAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF8zLCAgMTYsIFRbNDJdKTtcblx0ICAgICAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzYsICAyMywgVFs0M10pO1xuXHQgICAgICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfOSwgIDQsICBUWzQ0XSk7XG5cdCAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF8xMiwgMTEsIFRbNDVdKTtcblx0ICAgICAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzE1LCAxNiwgVFs0Nl0pO1xuXHQgICAgICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgTV9vZmZzZXRfMiwgIDIzLCBUWzQ3XSk7XG5cblx0ICAgICAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzAsICA2LCAgVFs0OF0pO1xuXHQgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfNywgIDEwLCBUWzQ5XSk7XG5cdCAgICAgICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBNX29mZnNldF8xNCwgMTUsIFRbNTBdKTtcblx0ICAgICAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzUsICAyMSwgVFs1MV0pO1xuXHQgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfMTIsIDYsICBUWzUyXSk7XG5cdCAgICAgICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCBNX29mZnNldF8zLCAgMTAsIFRbNTNdKTtcblx0ICAgICAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzEwLCAxNSwgVFs1NF0pO1xuXHQgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfMSwgIDIxLCBUWzU1XSk7XG5cdCAgICAgICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBNX29mZnNldF84LCAgNiwgIFRbNTZdKTtcblx0ICAgICAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzE1LCAxMCwgVFs1N10pO1xuXHQgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfNiwgIDE1LCBUWzU4XSk7XG5cdCAgICAgICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBNX29mZnNldF8xMywgMjEsIFRbNTldKTtcblx0ICAgICAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzQsICA2LCAgVFs2MF0pO1xuXHQgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTEsIDEwLCBUWzYxXSk7XG5cdCAgICAgICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBNX29mZnNldF8yLCAgMTUsIFRbNjJdKTtcblx0ICAgICAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzksICAyMSwgVFs2M10pO1xuXG5cdCAgICAgICAgICAgIC8vIEludGVybWVkaWF0ZSBoYXNoIHZhbHVlXG5cdCAgICAgICAgICAgIEhbMF0gPSAoSFswXSArIGEpIHwgMDtcblx0ICAgICAgICAgICAgSFsxXSA9IChIWzFdICsgYikgfCAwO1xuXHQgICAgICAgICAgICBIWzJdID0gKEhbMl0gKyBjKSB8IDA7XG5cdCAgICAgICAgICAgIEhbM10gPSAoSFszXSArIGQpIHwgMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4O1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpO1xuXG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsSCA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWxMID0gbkJpdHNUb3RhbDtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNV0gPSAoXG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsSCA8PCA4KSAgfCAobkJpdHNUb3RhbEggPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsSCA8PCAyNCkgfCAobkJpdHNUb3RhbEggPj4+IDgpKSAgJiAweGZmMDBmZjAwKVxuXHQgICAgICAgICAgICApO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IChcblx0ICAgICAgICAgICAgICAgICgoKG5CaXRzVG90YWxMIDw8IDgpICB8IChuQml0c1RvdGFsTCA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICgoKG5CaXRzVG90YWxMIDw8IDI0KSB8IChuQml0c1RvdGFsTCA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICk7XG5cblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IChkYXRhV29yZHMubGVuZ3RoICsgMSkgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoO1xuXHQgICAgICAgICAgICB2YXIgSCA9IGhhc2gud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gU3dhcCBlbmRpYW5cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgICAgICB2YXIgSF9pID0gSFtpXTtcblxuXHQgICAgICAgICAgICAgICAgSFtpXSA9ICgoKEhfaSA8PCA4KSAgfCAoSF9pID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgICAgICAgICgoKEhfaSA8PCAyNCkgfCAoSF9pID4+PiA4KSkgICYgMHhmZjAwZmYwMCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaFxuXHQgICAgICAgICAgICByZXR1cm4gaGFzaDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArICgoYiAmIGMpIHwgKH5iICYgZCkpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gR0coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArICgoYiAmIGQpIHwgKGMgJiB+ZCkpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gSEgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArIChiIF4gYyBeIGQpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArIChjIF4gKGIgfCB+ZCkpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLk1ENSgnbWVzc2FnZScpO1xuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuTUQ1KHdvcmRBcnJheSk7XG5cdCAgICAgKi9cblx0ICAgIEMuTUQ1ID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoTUQ1KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNNRDUobWVzc2FnZSwga2V5KTtcblx0ICAgICAqL1xuXHQgICAgQy5IbWFjTUQ1ID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKE1ENSk7XG5cdH0oTWF0aCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLk1ENTtcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBSZXVzYWJsZSBvYmplY3Rcblx0ICAgIHZhciBXID0gW107XG5cblx0ICAgIC8qKlxuXHQgICAgICogU0hBLTEgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBTSEExID0gQ19hbGdvLlNIQTEgPSBIYXNoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB0aGlzLl9oYXNoID0gbmV3IFdvcmRBcnJheS5pbml0KFtcblx0ICAgICAgICAgICAgICAgIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksXG5cdCAgICAgICAgICAgICAgICAweDk4YmFkY2ZlLCAweDEwMzI1NDc2LFxuXHQgICAgICAgICAgICAgICAgMHhjM2QyZTFmMFxuXHQgICAgICAgICAgICBdKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBIID0gdGhpcy5faGFzaC53b3JkcztcblxuXHQgICAgICAgICAgICAvLyBXb3JraW5nIHZhcmlhYmxlc1xuXHQgICAgICAgICAgICB2YXIgYSA9IEhbMF07XG5cdCAgICAgICAgICAgIHZhciBiID0gSFsxXTtcblx0ICAgICAgICAgICAgdmFyIGMgPSBIWzJdO1xuXHQgICAgICAgICAgICB2YXIgZCA9IEhbM107XG5cdCAgICAgICAgICAgIHZhciBlID0gSFs0XTtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRhdGlvblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDgwOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIGlmIChpIDwgMTYpIHtcblx0ICAgICAgICAgICAgICAgICAgICBXW2ldID0gTVtvZmZzZXQgKyBpXSB8IDA7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBuID0gV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XTtcblx0ICAgICAgICAgICAgICAgICAgICBXW2ldID0gKG4gPDwgMSkgfCAobiA+Pj4gMzEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB2YXIgdCA9ICgoYSA8PCA1KSB8IChhID4+PiAyNykpICsgZSArIFdbaV07XG5cdCAgICAgICAgICAgICAgICBpZiAoaSA8IDIwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoKGIgJiBjKSB8ICh+YiAmIGQpKSArIDB4NWE4Mjc5OTk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCA0MCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKGIgXiBjIF4gZCkgKyAweDZlZDllYmExO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgNjApIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ICs9ICgoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCkpIC0gMHg3MGU0NDMyNDtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoaSA8IDgwKSAqLyB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoYiBeIGMgXiBkKSAtIDB4MzU5ZDNlMmE7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGUgPSBkO1xuXHQgICAgICAgICAgICAgICAgZCA9IGM7XG5cdCAgICAgICAgICAgICAgICBjID0gKGIgPDwgMzApIHwgKGIgPj4+IDIpO1xuXHQgICAgICAgICAgICAgICAgYiA9IGE7XG5cdCAgICAgICAgICAgICAgICBhID0gdDtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEludGVybWVkaWF0ZSBoYXNoIHZhbHVlXG5cdCAgICAgICAgICAgIEhbMF0gPSAoSFswXSArIGEpIHwgMDtcblx0ICAgICAgICAgICAgSFsxXSA9IChIWzFdICsgYikgfCAwO1xuXHQgICAgICAgICAgICBIWzJdID0gKEhbMl0gKyBjKSB8IDA7XG5cdCAgICAgICAgICAgIEhbM10gPSAoSFszXSArIGQpIHwgMDtcblx0ICAgICAgICAgICAgSFs0XSA9IChIWzRdICsgZSkgfCAwO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3JkcztcblxuXHQgICAgICAgICAgICB2YXIgbkJpdHNUb3RhbCA9IHRoaXMuX25EYXRhQnl0ZXMgKiA4O1xuXHQgICAgICAgICAgICB2YXIgbkJpdHNMZWZ0ID0gZGF0YS5zaWdCeXRlcyAqIDg7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmdcblx0ICAgICAgICAgICAgZGF0YVdvcmRzW25CaXRzTGVmdCA+Pj4gNV0gfD0gMHg4MCA8PCAoMjQgLSBuQml0c0xlZnQgJSAzMik7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTRdID0gTWF0aC5mbG9vcihuQml0c1RvdGFsIC8gMHgxMDAwMDAwMDApO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE1XSA9IG5CaXRzVG90YWw7XG5cdCAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBkYXRhV29yZHMubGVuZ3RoICogNDtcblxuXHQgICAgICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2hcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhc2g7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS5faGFzaCA9IHRoaXMuX2hhc2guY2xvbmUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEExKCdtZXNzYWdlJyk7XG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEExKHdvcmRBcnJheSk7XG5cdCAgICAgKi9cblx0ICAgIEMuU0hBMSA9IEhhc2hlci5fY3JlYXRlSGVscGVyKFNIQTEpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTEobWVzc2FnZSwga2V5KTtcblx0ICAgICAqL1xuXHQgICAgQy5IbWFjU0hBMSA9IEhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihTSEExKTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5TSEExO1xuXG59KSk7IiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGA6cm9vdCB7XG4gIC0tYmxhY2stYTE6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gIC0tYmxhY2stYTI6IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgLS1ibGFjay1hMzogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgLS1ibGFjay1hNDogcmdiYSgwLCAwLCAwLCAwLjIpO1xuICAtLWJsYWNrLWE1OiByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gIC0tYmxhY2stYTY6IHJnYmEoMCwgMCwgMCwgMC40KTtcbiAgLS1ibGFjay1hNzogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICAtLWJsYWNrLWE4OiByZ2JhKDAsIDAsIDAsIDAuNik7XG4gIC0tYmxhY2stYTk6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiAgLS1ibGFjay1hMTA6IHJnYmEoMCwgMCwgMCwgMC44KTtcbiAgLS1ibGFjay1hMTE6IHJnYmEoMCwgMCwgMCwgMC45KTtcbiAgLS1ibGFjay1hMTI6IHJnYmEoMCwgMCwgMCwgMC45NSk7XG59XG5cbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yKGRpc3BsYXktcDMgMSAxIDEpKSB7XG4gIEBtZWRpYSAoY29sb3ItZ2FtdXQ6IHAzKSB7XG4gICAgOnJvb3Qge1xuICAgICAgLS1ibGFjay1hMTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMDUpO1xuICAgICAgLS1ibGFjay1hMjogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMSk7XG4gICAgICAtLWJsYWNrLWEzOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4xNSk7XG4gICAgICAtLWJsYWNrLWE0OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4yKTtcbiAgICAgIC0tYmxhY2stYTU6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjMpO1xuICAgICAgLS1ibGFjay1hNjogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNCk7XG4gICAgICAtLWJsYWNrLWE3OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC41KTtcbiAgICAgIC0tYmxhY2stYTg6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjYpO1xuICAgICAgLS1ibGFjay1hOTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNyk7XG4gICAgICAtLWJsYWNrLWExMDogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOCk7XG4gICAgICAtLWJsYWNrLWExMTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOSk7XG4gICAgICAtLWJsYWNrLWExMjogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOTUpO1xuICAgIH1cbiAgfVxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvYmxhY2stYWxwaGEuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0UsK0JBQStCO0VBQy9CLDhCQUE4QjtFQUM5QiwrQkFBK0I7RUFDL0IsOEJBQThCO0VBQzlCLDhCQUE4QjtFQUM5Qiw4QkFBOEI7RUFDOUIsOEJBQThCO0VBQzlCLDhCQUE4QjtFQUM5Qiw4QkFBOEI7RUFDOUIsK0JBQStCO0VBQy9CLCtCQUErQjtFQUMvQixnQ0FBZ0M7QUFDbEM7O0FBRUE7RUFDRTtJQUNFO01BQ0UsMENBQTBDO01BQzFDLHlDQUF5QztNQUN6QywwQ0FBMEM7TUFDMUMseUNBQXlDO01BQ3pDLHlDQUF5QztNQUN6Qyx5Q0FBeUM7TUFDekMseUNBQXlDO01BQ3pDLHlDQUF5QztNQUN6Qyx5Q0FBeUM7TUFDekMsMENBQTBDO01BQzFDLDBDQUEwQztNQUMxQywyQ0FBMkM7SUFDN0M7RUFDRjtBQUNGXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290IHtcXG4gIC0tYmxhY2stYTE6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxuICAtLWJsYWNrLWEyOiByZ2JhKDAsIDAsIDAsIDAuMSk7XFxuICAtLWJsYWNrLWEzOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xcbiAgLS1ibGFjay1hNDogcmdiYSgwLCAwLCAwLCAwLjIpO1xcbiAgLS1ibGFjay1hNTogcmdiYSgwLCAwLCAwLCAwLjMpO1xcbiAgLS1ibGFjay1hNjogcmdiYSgwLCAwLCAwLCAwLjQpO1xcbiAgLS1ibGFjay1hNzogcmdiYSgwLCAwLCAwLCAwLjUpO1xcbiAgLS1ibGFjay1hODogcmdiYSgwLCAwLCAwLCAwLjYpO1xcbiAgLS1ibGFjay1hOTogcmdiYSgwLCAwLCAwLCAwLjcpO1xcbiAgLS1ibGFjay1hMTA6IHJnYmEoMCwgMCwgMCwgMC44KTtcXG4gIC0tYmxhY2stYTExOiByZ2JhKDAsIDAsIDAsIDAuOSk7XFxuICAtLWJsYWNrLWExMjogcmdiYSgwLCAwLCAwLCAwLjk1KTtcXG59XFxuXFxuQHN1cHBvcnRzIChjb2xvcjogY29sb3IoZGlzcGxheS1wMyAxIDEgMSkpIHtcXG4gIEBtZWRpYSAoY29sb3ItZ2FtdXQ6IHAzKSB7XFxuICAgIDpyb290IHtcXG4gICAgICAtLWJsYWNrLWExOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4wNSk7XFxuICAgICAgLS1ibGFjay1hMjogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMSk7XFxuICAgICAgLS1ibGFjay1hMzogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMTUpO1xcbiAgICAgIC0tYmxhY2stYTQ6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjIpO1xcbiAgICAgIC0tYmxhY2stYTU6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjMpO1xcbiAgICAgIC0tYmxhY2stYTY6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjQpO1xcbiAgICAgIC0tYmxhY2stYTc6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjUpO1xcbiAgICAgIC0tYmxhY2stYTg6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjYpO1xcbiAgICAgIC0tYmxhY2stYTk6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjcpO1xcbiAgICAgIC0tYmxhY2stYTEwOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC44KTtcXG4gICAgICAtLWJsYWNrLWExMTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOSk7XFxuICAgICAgLS1ibGFjay1hMTI6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjk1KTtcXG4gICAgfVxcbiAgfVxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xuICAtLW1hdXZlLTE6ICNmZGZjZmQ7XG4gIC0tbWF1dmUtMjogI2ZhZjlmYjtcbiAgLS1tYXV2ZS0zOiAjZjJlZmYzO1xuICAtLW1hdXZlLTQ6ICNlYWU3ZWM7XG4gIC0tbWF1dmUtNTogI2UzZGZlNjtcbiAgLS1tYXV2ZS02OiAjZGJkOGUwO1xuICAtLW1hdXZlLTc6ICNkMGNkZDc7XG4gIC0tbWF1dmUtODogI2JjYmFjNztcbiAgLS1tYXV2ZS05OiAjOGU4Yzk5O1xuICAtLW1hdXZlLTEwOiAjODQ4MjhlO1xuICAtLW1hdXZlLTExOiAjNjU2MzZkO1xuICAtLW1hdXZlLTEyOiAjMjExZjI2O1xufVxuXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xuICAgIDpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XG4gICAgICAtLW1hdXZlLTE6IGNvbG9yKGRpc3BsYXktcDMgMC45OTEgMC45ODggMC45OTIpO1xuICAgICAgLS1tYXV2ZS0yOiBjb2xvcihkaXNwbGF5LXAzIDAuOTggMC45NzYgMC45ODQpO1xuICAgICAgLS1tYXV2ZS0zOiBjb2xvcihkaXNwbGF5LXAzIDAuOTQ2IDAuOTM4IDAuOTUyKTtcbiAgICAgIC0tbWF1dmUtNDogY29sb3IoZGlzcGxheS1wMyAwLjkxNSAwLjkwNiAwLjkyNSk7XG4gICAgICAtLW1hdXZlLTU6IGNvbG9yKGRpc3BsYXktcDMgMC44ODYgMC44NzYgMC45MDEpO1xuICAgICAgLS1tYXV2ZS02OiBjb2xvcihkaXNwbGF5LXAzIDAuODU2IDAuODQ2IDAuODc1KTtcbiAgICAgIC0tbWF1dmUtNzogY29sb3IoZGlzcGxheS1wMyAwLjgxNCAwLjgwNCAwLjg0KTtcbiAgICAgIC0tbWF1dmUtODogY29sb3IoZGlzcGxheS1wMyAwLjczNSAwLjcyOCAwLjc3Nyk7XG4gICAgICAtLW1hdXZlLTk6IGNvbG9yKGRpc3BsYXktcDMgMC41NTUgMC41NDkgMC41OTYpO1xuICAgICAgLS1tYXV2ZS0xMDogY29sb3IoZGlzcGxheS1wMyAwLjUxNCAwLjUwOCAwLjU1Mik7XG4gICAgICAtLW1hdXZlLTExOiBjb2xvcihkaXNwbGF5LXAzIDAuMzk1IDAuMzg4IDAuNDI0KTtcbiAgICAgIC0tbWF1dmUtMTI6IGNvbG9yKGRpc3BsYXktcDMgMC4xMjggMC4xMjIgMC4xNDcpO1xuICAgIH1cbiAgfVxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvbWF1dmUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0Usa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRTtJQUNFO01BQ0UsOENBQThDO01BQzlDLDZDQUE2QztNQUM3Qyw4Q0FBOEM7TUFDOUMsOENBQThDO01BQzlDLDhDQUE4QztNQUM5Qyw4Q0FBOEM7TUFDOUMsNkNBQTZDO01BQzdDLDhDQUE4QztNQUM5Qyw4Q0FBOEM7TUFDOUMsK0NBQStDO01BQy9DLCtDQUErQztNQUMvQywrQ0FBK0M7SUFDakQ7RUFDRjtBQUNGXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XFxuICAtLW1hdXZlLTE6ICNmZGZjZmQ7XFxuICAtLW1hdXZlLTI6ICNmYWY5ZmI7XFxuICAtLW1hdXZlLTM6ICNmMmVmZjM7XFxuICAtLW1hdXZlLTQ6ICNlYWU3ZWM7XFxuICAtLW1hdXZlLTU6ICNlM2RmZTY7XFxuICAtLW1hdXZlLTY6ICNkYmQ4ZTA7XFxuICAtLW1hdXZlLTc6ICNkMGNkZDc7XFxuICAtLW1hdXZlLTg6ICNiY2JhYzc7XFxuICAtLW1hdXZlLTk6ICM4ZThjOTk7XFxuICAtLW1hdXZlLTEwOiAjODQ4MjhlO1xcbiAgLS1tYXV2ZS0xMTogIzY1NjM2ZDtcXG4gIC0tbWF1dmUtMTI6ICMyMTFmMjY7XFxufVxcblxcbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yKGRpc3BsYXktcDMgMSAxIDEpKSB7XFxuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xcbiAgICA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xcbiAgICAgIC0tbWF1dmUtMTogY29sb3IoZGlzcGxheS1wMyAwLjk5MSAwLjk4OCAwLjk5Mik7XFxuICAgICAgLS1tYXV2ZS0yOiBjb2xvcihkaXNwbGF5LXAzIDAuOTggMC45NzYgMC45ODQpO1xcbiAgICAgIC0tbWF1dmUtMzogY29sb3IoZGlzcGxheS1wMyAwLjk0NiAwLjkzOCAwLjk1Mik7XFxuICAgICAgLS1tYXV2ZS00OiBjb2xvcihkaXNwbGF5LXAzIDAuOTE1IDAuOTA2IDAuOTI1KTtcXG4gICAgICAtLW1hdXZlLTU6IGNvbG9yKGRpc3BsYXktcDMgMC44ODYgMC44NzYgMC45MDEpO1xcbiAgICAgIC0tbWF1dmUtNjogY29sb3IoZGlzcGxheS1wMyAwLjg1NiAwLjg0NiAwLjg3NSk7XFxuICAgICAgLS1tYXV2ZS03OiBjb2xvcihkaXNwbGF5LXAzIDAuODE0IDAuODA0IDAuODQpO1xcbiAgICAgIC0tbWF1dmUtODogY29sb3IoZGlzcGxheS1wMyAwLjczNSAwLjcyOCAwLjc3Nyk7XFxuICAgICAgLS1tYXV2ZS05OiBjb2xvcihkaXNwbGF5LXAzIDAuNTU1IDAuNTQ5IDAuNTk2KTtcXG4gICAgICAtLW1hdXZlLTEwOiBjb2xvcihkaXNwbGF5LXAzIDAuNTE0IDAuNTA4IDAuNTUyKTtcXG4gICAgICAtLW1hdXZlLTExOiBjb2xvcihkaXNwbGF5LXAzIDAuMzk1IDAuMzg4IDAuNDI0KTtcXG4gICAgICAtLW1hdXZlLTEyOiBjb2xvcihkaXNwbGF5LXAzIDAuMTI4IDAuMTIyIDAuMTQ3KTtcXG4gICAgfVxcbiAgfVxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xuICAtLXZpb2xldC0xOiAjZmRmY2ZlO1xuICAtLXZpb2xldC0yOiAjZmFmOGZmO1xuICAtLXZpb2xldC0zOiAjZjRmMGZlO1xuICAtLXZpb2xldC00OiAjZWJlNGZmO1xuICAtLXZpb2xldC01OiAjZTFkOWZmO1xuICAtLXZpb2xldC02OiAjZDRjYWZlO1xuICAtLXZpb2xldC03OiAjYzJiNWY1O1xuICAtLXZpb2xldC04OiAjYWE5OWVjO1xuICAtLXZpb2xldC05OiAjNmU1NmNmO1xuICAtLXZpb2xldC0xMDogIzY1NGRjNDtcbiAgLS12aW9sZXQtMTE6ICM2NTUwYjk7XG4gIC0tdmlvbGV0LTEyOiAjMmYyNjVmO1xufVxuXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xuICAgIDpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XG4gICAgICAtLXZpb2xldC0xOiBjb2xvcihkaXNwbGF5LXAzIDAuOTkxIDAuOTg4IDAuOTk1KTtcbiAgICAgIC0tdmlvbGV0LTI6IGNvbG9yKGRpc3BsYXktcDMgMC45NzggMC45NzQgMC45OTgpO1xuICAgICAgLS12aW9sZXQtMzogY29sb3IoZGlzcGxheS1wMyAwLjk1MyAwLjk0MyAwLjk5Myk7XG4gICAgICAtLXZpb2xldC00OiBjb2xvcihkaXNwbGF5LXAzIDAuOTE2IDAuODk3IDEpO1xuICAgICAgLS12aW9sZXQtNTogY29sb3IoZGlzcGxheS1wMyAwLjg3NiAwLjg1MSAxKTtcbiAgICAgIC0tdmlvbGV0LTY6IGNvbG9yKGRpc3BsYXktcDMgMC44MjUgMC43OTMgMC45ODEpO1xuICAgICAgLS12aW9sZXQtNzogY29sb3IoZGlzcGxheS1wMyAwLjc1MiAwLjcxMiAwLjk0Myk7XG4gICAgICAtLXZpb2xldC04OiBjb2xvcihkaXNwbGF5LXAzIDAuNjU0IDAuNjAyIDAuOTAyKTtcbiAgICAgIC0tdmlvbGV0LTk6IGNvbG9yKGRpc3BsYXktcDMgMC40MTcgMC4zNDEgMC43ODQpO1xuICAgICAgLS12aW9sZXQtMTA6IGNvbG9yKGRpc3BsYXktcDMgMC4zODEgMC4zMDYgMC43NDEpO1xuICAgICAgLS12aW9sZXQtMTE6IGNvbG9yKGRpc3BsYXktcDMgMC4zODMgMC4zMTcgMC43MDIpO1xuICAgICAgLS12aW9sZXQtMTI6IGNvbG9yKGRpc3BsYXktcDMgMC4xNzkgMC4xNSAwLjM1OSk7XG4gICAgfVxuICB9XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy92aW9sZXQuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0UsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsb0JBQW9CO0VBQ3BCLG9CQUFvQjtFQUNwQixvQkFBb0I7QUFDdEI7O0FBRUE7RUFDRTtJQUNFO01BQ0UsK0NBQStDO01BQy9DLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsMkNBQTJDO01BQzNDLDJDQUEyQztNQUMzQywrQ0FBK0M7TUFDL0MsK0NBQStDO01BQy9DLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsZ0RBQWdEO01BQ2hELGdEQUFnRDtNQUNoRCwrQ0FBK0M7SUFDakQ7RUFDRjtBQUNGXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XFxuICAtLXZpb2xldC0xOiAjZmRmY2ZlO1xcbiAgLS12aW9sZXQtMjogI2ZhZjhmZjtcXG4gIC0tdmlvbGV0LTM6ICNmNGYwZmU7XFxuICAtLXZpb2xldC00OiAjZWJlNGZmO1xcbiAgLS12aW9sZXQtNTogI2UxZDlmZjtcXG4gIC0tdmlvbGV0LTY6ICNkNGNhZmU7XFxuICAtLXZpb2xldC03OiAjYzJiNWY1O1xcbiAgLS12aW9sZXQtODogI2FhOTllYztcXG4gIC0tdmlvbGV0LTk6ICM2ZTU2Y2Y7XFxuICAtLXZpb2xldC0xMDogIzY1NGRjNDtcXG4gIC0tdmlvbGV0LTExOiAjNjU1MGI5O1xcbiAgLS12aW9sZXQtMTI6ICMyZjI2NWY7XFxufVxcblxcbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yKGRpc3BsYXktcDMgMSAxIDEpKSB7XFxuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xcbiAgICA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xcbiAgICAgIC0tdmlvbGV0LTE6IGNvbG9yKGRpc3BsYXktcDMgMC45OTEgMC45ODggMC45OTUpO1xcbiAgICAgIC0tdmlvbGV0LTI6IGNvbG9yKGRpc3BsYXktcDMgMC45NzggMC45NzQgMC45OTgpO1xcbiAgICAgIC0tdmlvbGV0LTM6IGNvbG9yKGRpc3BsYXktcDMgMC45NTMgMC45NDMgMC45OTMpO1xcbiAgICAgIC0tdmlvbGV0LTQ6IGNvbG9yKGRpc3BsYXktcDMgMC45MTYgMC44OTcgMSk7XFxuICAgICAgLS12aW9sZXQtNTogY29sb3IoZGlzcGxheS1wMyAwLjg3NiAwLjg1MSAxKTtcXG4gICAgICAtLXZpb2xldC02OiBjb2xvcihkaXNwbGF5LXAzIDAuODI1IDAuNzkzIDAuOTgxKTtcXG4gICAgICAtLXZpb2xldC03OiBjb2xvcihkaXNwbGF5LXAzIDAuNzUyIDAuNzEyIDAuOTQzKTtcXG4gICAgICAtLXZpb2xldC04OiBjb2xvcihkaXNwbGF5LXAzIDAuNjU0IDAuNjAyIDAuOTAyKTtcXG4gICAgICAtLXZpb2xldC05OiBjb2xvcihkaXNwbGF5LXAzIDAuNDE3IDAuMzQxIDAuNzg0KTtcXG4gICAgICAtLXZpb2xldC0xMDogY29sb3IoZGlzcGxheS1wMyAwLjM4MSAwLjMwNiAwLjc0MSk7XFxuICAgICAgLS12aW9sZXQtMTE6IGNvbG9yKGRpc3BsYXktcDMgMC4zODMgMC4zMTcgMC43MDIpO1xcbiAgICAgIC0tdmlvbGV0LTEyOiBjb2xvcihkaXNwbGF5LXAzIDAuMTc5IDAuMTUgMC4zNTkpO1xcbiAgICB9XFxuICB9XFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYEBjaGFyc2V0IFwiVVRGLThcIjtcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb246OmJlZm9yZSB7XG4gIGJvcmRlci1jb2xvcjogI2NjYztcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXdpZHRoOiAzcHggM3B4IDAgMDtcbiAgY29udGVudDogXCJcIjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGhlaWdodDogOXB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNnB4O1xuICB3aWR0aDogOXB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXItd3JhcHBlciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiAwO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlciB7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYSBOZXVlXCIsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMC44cmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjb2xvcjogIzAwMDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbGluZS1oZWlnaHQ6IGluaXRpYWw7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHkgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIHtcbiAgYm9yZGVyLWxlZnQ6IDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLFxuLnJlYWN0LWRhdGVwaWNrZXItLXRpbWUtb25seSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3gge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwLjNyZW07XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlciB7XG4gIHotaW5kZXg6IDE7XG4gIGxpbmUtaGVpZ2h0OiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyIC5yZWFjdC1kYXRlcGlja2VyX190cmlhbmdsZSB7XG4gIHN0cm9rZTogI2FlYWVhZTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlcltkYXRhLXBsYWNlbWVudF49Ym90dG9tXSAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xuICBmaWxsOiAjZjBmMGYwO1xuICBjb2xvcjogI2YwZjBmMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlcltkYXRhLXBsYWNlbWVudF49dG9wXSAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xuICBmaWxsOiAjZmZmO1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNhZWFlYWU7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuM3JlbTtcbiAgcGFkZGluZzogOHB4IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWUge1xuICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgcGFkZGluZy1yaWdodDogNXB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZS0tb25seSkge1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlcjpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0taGFzLXRpbWUtc2VsZWN0KSB7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwLjNyZW07XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2VsZWN0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLWNvbnRhaW5lci0tc2VsZWN0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tY29udGFpbmVyLS1zZWxlY3QsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi1jb250YWluZXItLXNjcm9sbCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXItLXNjcm9sbCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2Nyb2xsIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW46IDAgMTVweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgsXG4ucmVhY3QtZGF0ZXBpY2tlci10aW1lX19oZWFkZXIsXG4ucmVhY3QtZGF0ZXBpY2tlci15ZWFyLWhlYWRlciB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIGNvbG9yOiAjMDAwO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZm9udC1zaXplOiAwLjk0NHJlbTtcbn1cblxuaDIucmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aCB7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyIHtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMnB4O1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG4gIHotaW5kZXg6IDE7XG4gIGhlaWdodDogMzJweDtcbiAgd2lkdGg6IDMycHg7XG4gIHRleHQtaW5kZW50OiAtOTk5ZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tcHJldmlvdXMge1xuICBsZWZ0OiAycHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dCB7XG4gIHJpZ2h0OiAycHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10aW1lOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10b2RheS1idXR0b24pIHtcbiAgcmlnaHQ6IDg1cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogMDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMge1xuICB0b3A6IDRweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyB7XG4gIHRvcDogLTRweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uOmhvdmVyICo6OmJlZm9yZSB7XG4gIGJvcmRlci1jb2xvcjogI2E2YTZhNjtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAtMXB4O1xuICBmb250LXNpemU6IDIwcHg7XG4gIHdpZHRoOiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tbmV4dCB7XG4gIGxlZnQ6IC0ycHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1uZXh0OjpiZWZvcmUge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4gIGxlZnQ6IC03cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1wcmV2aW91cyB7XG4gIHJpZ2h0OiAtMnB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tcHJldmlvdXM6OmJlZm9yZSB7XG4gIHRyYW5zZm9ybTogcm90YXRlKDIyNWRlZyk7XG4gIHJpZ2h0OiAtN3B4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtY29udGFpbmVyIHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyIHtcbiAgbWFyZ2luOiAwLjRyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIG1heC13aWR0aDogMTgwcHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogNHJlbTtcbiAgbWFyZ2luOiAycHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19tb250aCB7XG4gIG1hcmdpbjogMC40cmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGggLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGggLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDRyZW07XG4gIG1hcmdpbjogMnB4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIge1xuICBjbGVhcjogYm90aDtcbiAgd2lkdGg6IDEwMCU7XG4gIGZsb2F0OiBsZWZ0O1xuICBtYXJnaW46IDVweCAwIDEwcHggMTVweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19jYXB0aW9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dCB7XG4gIHdpZHRoOiBhdXRvO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dFt0eXBlPXRpbWVdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dFt0eXBlPXRpbWVdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICBtYXJnaW46IDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0W3R5cGU9dGltZV0ge1xuICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9fZGVsaW1pdGVyIHtcbiAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIge1xuICBmbG9hdDogcmlnaHQ7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2FlYWVhZTtcbiAgd2lkdGg6IDg1cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXItLXdpdGgtdG9kYXktYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IC04N3B4O1xuICB0b3A6IDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB7XG4gIHdpZHRoOiA4NXB4O1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG4gIG1hcmdpbjogMCBhdXRvO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIG1hcmdpbjogMDtcbiAgaGVpZ2h0OiBjYWxjKDE5NXB4ICsgMS43cmVtIC8gMik7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgcGFkZGluZy1yaWdodDogMDtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbSB7XG4gIGhlaWdodDogMzBweDtcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbTpob3ZlciB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1zZWxlY3RlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWRpc2FibGVkIHtcbiAgY29sb3I6ICNjY2M7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tZGlzYWJsZWQ6aG92ZXIge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIge1xuICBjb2xvcjogI2NjYztcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMS43cmVtO1xuICBsaW5lLWhlaWdodDogMS43cmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1hcmdpbjogMC4xNjZyZW07XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWNsaWNrYWJsZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tY2xpY2thYmxlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZCk6aG92ZXIge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xuICBjb2xvcjogI2ZmZjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tc2VsZWN0ZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJhODdkMDtcbiAgY29sb3I6ICNmZmY7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lcyB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG1hcmdpbi1ib3R0b206IC04cHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLW5hbWUge1xuICBjb2xvcjogIzAwMDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMS43cmVtO1xuICBsaW5lLWhlaWdodDogMS43cmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1hcmdpbjogMC4xNjZyZW07XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19kYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dCxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0IHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0OmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQ6aG92ZXIge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS10b2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS10b2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXRvZGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tdG9kYXkge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNkY2M0YTtcbiAgY29sb3I6ICNmZmY7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzJiZTNmO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xIHtcbiAgY29sb3I6IG1hZ2VudGE7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZC1jdXN0b20tMixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIge1xuICBjb2xvcjogZ3JlZW47XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5cyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5cyxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXMge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNjgwMztcbiAgY29sb3I6ICNmZmY7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5cyAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5cyAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXMgLm92ZXJsYXkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMTAwJTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG4gIGNvbG9yOiAjZmZmO1xuICBwYWRkaW5nOiA0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDBzLCBvcGFjaXR5IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5czpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5czpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXM6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2Y1MzAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5IHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgb3BhY2l0eTogMTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xuICBjb2xvcjogI2ZmZjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkOmhvdmVyLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWtleWJvYXJkLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2JhZDlmMTtcbiAgY29sb3I6IHJnYigwLCAwLCAwKTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgzMywgMTA3LCAxNjUsIDAuNSk7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xuICBjb2xvcjogIzAwMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZCB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgY29sb3I6ICNjY2M7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiA3MCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xuICBjb2xvcjogI2ZmZjtcbiAgcGFkZGluZzogNHB4O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwcywgb3BhY2l0eSAwLjNzIGVhc2UtaW4tb3V0O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fY2FsZW5kYXItaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcGFkZGluZzogMC41cmVtO1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3ZpZXctY2FsZW5kYXItaWNvbiBpbnB1dCB7XG4gIHBhZGRpbmc6IDZweCAxMHB4IDVweCAyNXB4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXcsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3IHtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3OmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93IHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2IzYjNiMztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3cge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO1xuICByaWdodDogLTE2cHg7XG4gIHRvcDogMDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24sXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24sXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93biB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDUwJTtcbiAgbGVmdDogMjUlO1xuICB0b3A6IDMwcHg7XG4gIHotaW5kZXg6IDE7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd246aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd246aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bjpob3ZlciB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLS1zY3JvbGxhYmxlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLS1zY3JvbGxhYmxlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tLXNjcm9sbGFibGUge1xuICBoZWlnaHQ6IDE1MHB4O1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24sXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb24ge1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmZpcnN0LW9mLXR5cGUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmZpcnN0LW9mLXR5cGUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246Zmlyc3Qtb2YtdHlwZSB7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuM3JlbTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDAuM3JlbTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpsYXN0LW9mLXR5cGUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmxhc3Qtb2YtdHlwZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpsYXN0LW9mLXR5cGUge1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMC4zcmVtO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nIHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2IzYjNiMztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91cyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMge1xuICBib3JkZXItdG9wLWNvbG9yOiAjYjNiM2IzO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24tLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uLS1zZWxlY3RlZCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMTVweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IDA7XG4gIG91dGxpbmU6IDA7XG4gIHBhZGRpbmc6IDAgNnB4IDAgMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbjo6YWZ0ZXIge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XG4gIGNvbG9yOiAjZmZmO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGhlaWdodDogMTZweDtcbiAgd2lkdGg6IDE2cHg7XG4gIHBhZGRpbmc6IDJweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBjb250ZW50OiBcIsOXXCI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbi0tZGlzYWJsZWQge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbi0tZGlzYWJsZWQ6OmFmdGVyIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdG9kYXktYnV0dG9uIHtcbiAgYmFja2dyb3VuZDogI2YwZjBmMDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNhZWFlYWU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcGFkZGluZzogNXB4IDA7XG4gIGNsZWFyOiBsZWZ0O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB3aWR0aDogMTAwdnc7XG4gIGhlaWdodDogMTAwdmg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTtcbiAgbGVmdDogMDtcbiAgdG9wOiAwO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAgei1pbmRleDogMjE0NzQ4MzY0Nztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1uYW1lIHtcbiAgd2lkdGg6IDNyZW07XG4gIGxpbmUtaGVpZ2h0OiAzcmVtO1xufVxuQG1lZGlhIChtYXgtd2lkdGg6IDQwMHB4KSwgKG1heC1oZWlnaHQ6IDU1MHB4KSB7XG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxuICAucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXksXG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbmFtZSB7XG4gICAgd2lkdGg6IDJyZW07XG4gICAgbGluZS1oZWlnaHQ6IDJyZW07XG4gIH1cbn1cbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlciB7XG4gIGZvbnQtc2l6ZTogMS40NHJlbTtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2NoaWxkcmVuLWNvbnRhaW5lciB7XG4gIHdpZHRoOiAxMy44cmVtO1xuICBtYXJnaW46IDAuNHJlbTtcbiAgcGFkZGluZy1yaWdodDogMC4ycmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuMnJlbTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fYXJpYS1saXZlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICAtd2Via2l0LWNsaXAtcGF0aDogY2lyY2xlKDApO1xuICAgICAgICAgIGNsaXAtcGF0aDogY2lyY2xlKDApO1xuICBib3JkZXI6IDA7XG4gIGhlaWdodDogMXB4O1xuICBtYXJnaW46IC0xcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBhZGRpbmc6IDA7XG4gIHdpZHRoOiAxcHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19jYWxlbmRhci1pY29uIHtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvZGlzdC9yZWFjdC1kYXRlcGlja2VyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxnQkFBZ0I7QUFDaEI7OztFQUdFLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIseUJBQXlCO0VBQ3pCLFdBQVc7RUFDWCxjQUFjO0VBQ2QsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixRQUFRO0VBQ1IsVUFBVTtBQUNaO0FBQ0E7RUFDRSxxQkFBcUI7RUFDckIsVUFBVTtFQUNWLFNBQVM7QUFDWDs7QUFFQTtFQUNFLDJEQUEyRDtFQUMzRCxpQkFBaUI7RUFDakIsc0JBQXNCO0VBQ3RCLFdBQVc7RUFDWCx5QkFBeUI7RUFDekIscUJBQXFCO0VBQ3JCLHFCQUFxQjtFQUNyQixrQkFBa0I7RUFDbEIsb0JBQW9CO0FBQ3RCOztBQUVBO0VBQ0UsY0FBYztBQUNoQjtBQUNBOztFQUVFLGlDQUFpQztFQUNqQyxrQ0FBa0M7QUFDcEM7O0FBRUE7RUFDRSxVQUFVO0VBQ1YsY0FBYztBQUNoQjtBQUNBO0VBQ0UsZUFBZTtBQUNqQjtBQUNBO0VBQ0UsYUFBYTtFQUNiLGNBQWM7QUFDaEI7QUFDQTtFQUNFLFVBQVU7RUFDVixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIseUJBQXlCO0VBQ3pCLGdDQUFnQztFQUNoQyw4QkFBOEI7RUFDOUIsY0FBYztFQUNkLGtCQUFrQjtBQUNwQjtBQUNBO0VBQ0UsbUJBQW1CO0VBQ25CLGlCQUFpQjtFQUNqQixrQkFBa0I7QUFDcEI7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QUNuQjtBQUNBO0VBQ0U7OztJQUdFLFdBQVc7SUFDWCxpQkFBaUI7RUFDbkI7QUFDRjtBQUNBOztFQUVFLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGNBQWM7RUFDZCxjQUFjO0VBQ2QscUJBQXFCO0VBQ3JCLG9CQUFvQjtFQUNwQixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsNEJBQW9CO1VBQXBCLG9CQUFvQjtFQUNwQixTQUFTO0VBQ1QsV0FBVztFQUNYLFlBQVk7RUFDWixnQkFBZ0I7RUFDaEIsVUFBVTtFQUNWLFVBQVU7RUFDVixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxVQUFVO0VBQ1YsV0FBVztFQUNYLHdCQUF3QjtBQUMxQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdywgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbjo6YmVmb3JlIHtcXG4gIGJvcmRlci1jb2xvcjogI2NjYztcXG4gIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICBib3JkZXItd2lkdGg6IDNweCAzcHggMCAwO1xcbiAgY29udGVudDogXFxcIlxcXCI7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIGhlaWdodDogOXB4O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiA2cHg7XFxuICB3aWR0aDogOXB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlci13cmFwcGVyIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHBhZGRpbmc6IDA7XFxuICBib3JkZXI6IDA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyIHtcXG4gIGZvbnQtZmFtaWx5OiBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAwLjhyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgY29sb3I6ICMwMDA7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgbGluZS1oZWlnaHQ6IGluaXRpYWw7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHkgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIHtcXG4gIGJvcmRlci1sZWZ0OiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLFxcbi5yZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHkgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHtcXG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAuM3JlbTtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlciB7XFxuICB6LWluZGV4OiAxO1xcbiAgbGluZS1oZWlnaHQ6IDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlciAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xcbiAgc3Ryb2tlOiAjYWVhZWFlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXJbZGF0YS1wbGFjZW1lbnRePWJvdHRvbV0gLnJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlIHtcXG4gIGZpbGw6ICNmMGYwZjA7XFxuICBjb2xvcjogI2YwZjBmMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyW2RhdGEtcGxhY2VtZW50Xj10b3BdIC5yZWFjdC1kYXRlcGlja2VyX190cmlhbmdsZSB7XFxuICBmaWxsOiAjZmZmO1xcbiAgY29sb3I6ICNmZmY7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXIge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWVhZWFlO1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMC4zcmVtO1xcbiAgcGFkZGluZzogOHB4IDA7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWUge1xcbiAgcGFkZGluZy1ib3R0b206IDhweDtcXG4gIHBhZGRpbmctbGVmdDogNXB4O1xcbiAgcGFkZGluZy1yaWdodDogNXB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lLS1vbmx5KSB7XFxuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS1oYXMtdGltZS1zZWxlY3QpIHtcXG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2VsZWN0LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi1jb250YWluZXItLXNjcm9sbCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgbWFyZ2luOiAwIDE1cHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLFxcbi5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlcixcXG4ucmVhY3QtZGF0ZXBpY2tlci15ZWFyLWhlYWRlciB7XFxuICBtYXJnaW4tdG9wOiAwO1xcbiAgY29sb3I6ICMwMDA7XFxuICBmb250LXdlaWdodDogYm9sZDtcXG4gIGZvbnQtc2l6ZTogMC45NDRyZW07XFxufVxcblxcbmgyLnJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgge1xcbiAgcGFkZGluZzogMDtcXG4gIG1hcmdpbjogMDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyIHtcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uIHtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAycHg7XFxuICBwYWRkaW5nOiAwO1xcbiAgYm9yZGVyOiBub25lO1xcbiAgei1pbmRleDogMTtcXG4gIGhlaWdodDogMzJweDtcXG4gIHdpZHRoOiAzMnB4O1xcbiAgdGV4dC1pbmRlbnQ6IC05OTllbTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1wcmV2aW91cyB7XFxuICBsZWZ0OiAycHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0IHtcXG4gIHJpZ2h0OiAycHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0LS13aXRoLXRpbWU6bm90KC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0LS13aXRoLXRvZGF5LWJ1dHRvbikge1xcbiAgcmlnaHQ6IDg1cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycyB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB0b3A6IDA7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMge1xcbiAgdG9wOiA0cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyB7XFxuICB0b3A6IC00cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uOmhvdmVyICo6OmJlZm9yZSB7XFxuICBib3JkZXItY29sb3I6ICNhNmE2YTY7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24ge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgdG9wOiAtMXB4O1xcbiAgZm9udC1zaXplOiAyMHB4O1xcbiAgd2lkdGg6IDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLW5leHQge1xcbiAgbGVmdDogLTJweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tbmV4dDo6YmVmb3JlIHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcXG4gIGxlZnQ6IC03cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLXByZXZpb3VzIHtcXG4gIHJpZ2h0OiAtMnB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1wcmV2aW91czo6YmVmb3JlIHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDIyNWRlZyk7XFxuICByaWdodDogLTdweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWNvbnRhaW5lciB7XFxuICBmbG9hdDogbGVmdDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXIge1xcbiAgbWFyZ2luOiAwLjRyZW07XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXdyYXBwZXIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG4gIG1heC13aWR0aDogMTgwcHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgd2lkdGg6IDRyZW07XFxuICBtYXJnaW46IDJweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIHtcXG4gIG1hcmdpbjogMC40cmVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGggLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIC5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgd2lkdGg6IDRyZW07XFxuICBtYXJnaW46IDJweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIHtcXG4gIGNsZWFyOiBib3RoO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBmbG9hdDogbGVmdDtcXG4gIG1hcmdpbjogNXB4IDAgMTBweCAxNXB4O1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2NhcHRpb24ge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBtYXJnaW4tbGVmdDogMTBweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dCB7XFxuICB3aWR0aDogYXV0bztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dFt0eXBlPXRpbWVdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICBtYXJnaW46IDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXSB7XFxuICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19kZWxpbWl0ZXIge1xcbiAgbWFyZ2luLWxlZnQ6IDVweDtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIHtcXG4gIGZsb2F0OiByaWdodDtcXG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2FlYWVhZTtcXG4gIHdpZHRoOiA4NXB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXItLXdpdGgtdG9kYXktYnV0dG9uIHtcXG4gIGRpc3BsYXk6IGlubGluZTtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNhZWFlYWU7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICByaWdodDogLTg3cHg7XFxuICB0b3A6IDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3gge1xcbiAgd2lkdGg6IDg1cHg7XFxuICBvdmVyZmxvdy14OiBoaWRkZW47XFxuICBtYXJnaW46IDAgYXV0bztcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IHtcXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XFxuICBtYXJnaW46IDA7XFxuICBoZWlnaHQ6IGNhbGMoMTk1cHggKyAxLjdyZW0gLyAyKTtcXG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcXG4gIHBhZGRpbmctcmlnaHQ6IDA7XFxuICBwYWRkaW5nLWxlZnQ6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbSB7XFxuICBoZWlnaHQ6IDMwcHg7XFxuICBwYWRkaW5nOiA1cHggMTBweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtOmhvdmVyIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1zZWxlY3RlZCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xcbiAgY29sb3I6IHdoaXRlO1xcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1zZWxlY3RlZDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tZGlzYWJsZWQge1xcbiAgY29sb3I6ICNjY2M7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1kaXNhYmxlZDpob3ZlciB7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyIHtcXG4gIGNvbG9yOiAjY2NjO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgd2lkdGg6IDEuN3JlbTtcXG4gIGxpbmUtaGVpZ2h0OiAxLjdyZW07XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBtYXJnaW46IDAuMTY2cmVtO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWNsaWNrYWJsZSB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tY2xpY2thYmxlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWQpOmhvdmVyIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tc2VsZWN0ZWQge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWQge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJhODdkMDtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZXMge1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIG1hcmdpbi1ib3R0b206IC04cHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrIHtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLW5hbWUge1xcbiAgY29sb3I6ICMwMDA7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogMS43cmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuN3JlbTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIG1hcmdpbjogMC4xNjZyZW07XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0IHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0OmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQ6aG92ZXIge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tdG9kYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXRvZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXRvZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXRvZGF5IHtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNkY2M0YTtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMyYmUzZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xIHtcXG4gIGNvbG9yOiBtYWdlbnRhO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZC1jdXN0b20tMixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIge1xcbiAgY29sb3I6IGdyZWVuO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5cyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXMsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXMsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXMge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNjgwMztcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5cyAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXMgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXMgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXMgLm92ZXJsYXkge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm90dG9tOiAxMDAlO1xcbiAgbGVmdDogNTAlO1xcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcXG4gIGNvbG9yOiAjZmZmO1xcbiAgcGFkZGluZzogNHB4O1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcXG4gIG9wYWNpdHk6IDA7XFxuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDBzLCBvcGFjaXR5IDAuM3MgZWFzZS1pbi1vdXQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5czpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5czpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1ob2xpZGF5czpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2Y1MzAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXkge1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIG9wYWNpdHk6IDE7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tc2VsZWN0ZWQ6aG92ZXIsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZTpob3ZlciwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXNlbGVjdGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0ta2V5Ym9hcmQtc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNiYWQ5ZjE7XFxuICBjb2xvcjogcmdiKDAsIDAsIDApO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDMzLCAxMDcsIDE2NSwgMC41KTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLCAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxuICBjb2xvcjogIzAwMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIGNvbG9yOiAjY2NjO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQ6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDcwJTtcXG4gIGxlZnQ6IDUwJTtcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XFxuICBjb2xvcjogI2ZmZjtcXG4gIHBhZGRpbmc6IDRweDtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwcywgb3BhY2l0eSAwLjNzIGVhc2UtaW4tb3V0O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX19jYWxlbmRhci1pY29uIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHBhZGRpbmc6IDAuNXJlbTtcXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdmlldy1jYWxlbmRhci1pY29uIGlucHV0IHtcXG4gIHBhZGRpbmc6IDZweCAxMHB4IDVweCAyNXB4O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXcsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXcge1xcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3OmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3cge1xcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2IzYjNiMztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3LS1kb3duLWFycm93IHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7XFxuICByaWdodDogLTE2cHg7XFxuICB0b3A6IDA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93biB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgd2lkdGg6IDUwJTtcXG4gIGxlZnQ6IDI1JTtcXG4gIHRvcDogMzBweDtcXG4gIHotaW5kZXg6IDE7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bjpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd246aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd246aG92ZXIge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi0tc2Nyb2xsYWJsZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tLXNjcm9sbGFibGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tLXNjcm9sbGFibGUge1xcbiAgaGVpZ2h0OiAxNTBweDtcXG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24sXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uIHtcXG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbiAgd2lkdGg6IDEwMCU7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246Zmlyc3Qtb2YtdHlwZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmZpcnN0LW9mLXR5cGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmZpcnN0LW9mLXR5cGUge1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMC4zcmVtO1xcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDAuM3JlbTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmxhc3Qtb2YtdHlwZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmxhc3Qtb2YtdHlwZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246bGFzdC1vZi10eXBlIHtcXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwLjNyZW07XFxuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nIHtcXG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiM2IzYjM7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91cyB7XFxuICBib3JkZXItdG9wLWNvbG9yOiAjYjNiM2IzO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb24tLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24tLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbi0tc2VsZWN0ZWQge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgbGVmdDogMTVweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24ge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICBib3JkZXI6IDA7XFxuICBvdXRsaW5lOiAwO1xcbiAgcGFkZGluZzogMCA2cHggMCAwO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb246OmFmdGVyIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXG4gIGhlaWdodDogMTZweDtcXG4gIHdpZHRoOiAxNnB4O1xcbiAgcGFkZGluZzogMnB4O1xcbiAgZm9udC1zaXplOiAxMnB4O1xcbiAgbGluZS1oZWlnaHQ6IDE7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIGNvbnRlbnQ6IFxcXCLDl1xcXCI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uLS1kaXNhYmxlZCB7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uLS1kaXNhYmxlZDo6YWZ0ZXIge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RvZGF5LWJ1dHRvbiB7XFxuICBiYWNrZ3JvdW5kOiAjZjBmMGYwO1xcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNhZWFlYWU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBmb250LXdlaWdodDogYm9sZDtcXG4gIHBhZGRpbmc6IDVweCAwO1xcbiAgY2xlYXI6IGxlZnQ7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwge1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgd2lkdGg6IDEwMHZ3O1xcbiAgaGVpZ2h0OiAxMDB2aDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTtcXG4gIGxlZnQ6IDA7XFxuICB0b3A6IDA7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgei1pbmRleDogMjE0NzQ4MzY0NztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbmFtZSB7XFxuICB3aWR0aDogM3JlbTtcXG4gIGxpbmUtaGVpZ2h0OiAzcmVtO1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogNDAwcHgpLCAobWF4LWhlaWdodDogNTUwcHgpIHtcXG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxcbiAgLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxcbiAgLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1uYW1lIHtcXG4gICAgd2lkdGg6IDJyZW07XFxuICAgIGxpbmUtaGVpZ2h0OiAycmVtO1xcbiAgfVxcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLFxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyIHtcXG4gIGZvbnQtc2l6ZTogMS40NHJlbTtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2NoaWxkcmVuLWNvbnRhaW5lciB7XFxuICB3aWR0aDogMTMuOHJlbTtcXG4gIG1hcmdpbjogMC40cmVtO1xcbiAgcGFkZGluZy1yaWdodDogMC4ycmVtO1xcbiAgcGFkZGluZy1sZWZ0OiAwLjJyZW07XFxuICBoZWlnaHQ6IGF1dG87XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19hcmlhLWxpdmUge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgY2xpcC1wYXRoOiBjaXJjbGUoMCk7XFxuICBib3JkZXI6IDA7XFxuICBoZWlnaHQ6IDFweDtcXG4gIG1hcmdpbjogLTFweDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBwYWRkaW5nOiAwO1xcbiAgd2lkdGg6IDFweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19jYWxlbmRhci1pY29uIHtcXG4gIHdpZHRoOiAxZW07XFxuICBoZWlnaHQ6IDFlbTtcXG4gIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPSUyNzI0JTI3IGhlaWdodD0lMjcyNCUyNyBzdHJva2U9JTI3JTIzMDAwJTI3IHZpZXdCb3g9JTI3MCAwIDI0IDI0JTI3IHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3JTNFJTNDc3R5bGUlM0Uuc3Bpbm5lcl9WOG0xJTdCdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7YW5pbWF0aW9uOnNwaW5uZXJfektvYSAycyBsaW5lYXIgaW5maW5pdGUlN0Quc3Bpbm5lcl9WOG0xIGNpcmNsZSU3QnN0cm9rZS1saW5lY2FwOnJvdW5kO2FuaW1hdGlvbjpzcGlubmVyX1lwWlMgMS41cyBlYXNlLW91dCBpbmZpbml0ZSU3RCU0MGtleWZyYW1lcyBzcGlubmVyX3pLb2ElN0IxMDAlMjUlN0J0cmFuc2Zvcm06cm90YXRlJTI4MzYwZGVnJTI5JTdEJTdEJTQwa2V5ZnJhbWVzIHNwaW5uZXJfWXBaUyU3QjAlMjUlN0JzdHJva2UtZGFzaGFycmF5OjAgMTUwO3N0cm9rZS1kYXNob2Zmc2V0OjAlN0Q0Ny41JTI1JTdCc3Ryb2tlLWRhc2hhcnJheTo0MiAxNTA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTE2JTdEOTUlMjUlMkMxMDAlMjUlN0JzdHJva2UtZGFzaGFycmF5OjQyIDE1MDtzdHJva2UtZGFzaG9mZnNldDotNTklN0QlN0QlM0MlMkZzdHlsZSUzRSUzQ2cgY2xhc3M9JTI3c3Bpbm5lcl9WOG0xJTI3JTNFJTNDY2lyY2xlIGN4PSUyNzEyJTI3IGN5PSUyNzEyJTI3IHI9JTI3OS41JTI3IGZpbGw9JTI3bm9uZSUyNyBzdHJva2Utd2lkdGg9JTI3MyUyNyUzRSUzQyUyRmNpcmNsZSUzRSUzQyUyRmclM0UlM0MlMkZzdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHhtbG5zOnhsaW5rPSUyN2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmslMjcgc3R5bGU9JTI3c2hhcGUtcmVuZGVyaW5nOiBhdXRvOyUyNyB3aWR0aD0lMjcyMDBweCUyNyBoZWlnaHQ9JTI3MjAwcHglMjcgdmlld0JveD0lMjcwIDAgMTAwIDEwMCUyNyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSUyN3hNaWRZTWlkJTI3JTNFJTNDcGF0aCBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyMzBhMGEwYSUyNyBzdHJva2Utd2lkdGg9JTI3MTAlMjcgc3Ryb2tlLWRhc2hhcnJheT0lMjcyMDUuMjcxMTQyNTc4MTI1IDUxLjMxNzc4NTY0NDUzMTI1NiUyNyBkPSUyN00yNC4zIDMwQzExLjQgMzAgNSA0My4zIDUgNTBzNi40IDIwIDE5LjMgMjBjMTkuMyAwIDMyLjEtNDAgNTEuNC00MCBDODguNiAzMCA5NSA0My4zIDk1IDUwcy02LjQgMjAtMTkuMyAyMEM1Ni40IDcwIDQzLjYgMzAgMjQuMyAzMHolMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcgc3R5bGU9JTI3dHJhbnNmb3JtOnNjYWxlJTI4MC44JTI5O3RyYW5zZm9ybS1vcmlnaW46NTBweCA1MHB4JTI3JTNFJTNDYW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSUyN3N0cm9rZS1kYXNob2Zmc2V0JTI3IHJlcGVhdENvdW50PSUyN2luZGVmaW5pdGUlMjcgZHVyPSUyNzJzJTI3IGtleVRpbWVzPSUyNzA7MSUyNyB2YWx1ZXM9JTI3MDsyNTYuNTg4OTI4MjIyNjU2MjUlMjclM0UlM0MvYW5pbWF0ZSUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBU0VsRVFWUjRuR05nd0FNa0pTVWJwS1NrT3ZDcElhVDVQeFNUYm9nVVFqTVlNd3hlSUlYbVZGSXhBOFVHRER5UUdnMERuSURpNkpLVWxDeEhNcUNlWkFPZ2hqU0FNRDVGQUtmZWFVUmRVRnhDQUFBQUFFbEZUa1N1UW1DQ1wiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAvKlxuISB0YWlsd2luZGNzcyB2My40LjYgfCBNSVQgTGljZW5zZSB8IGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tXG4qLy8qXG4xLiBQcmV2ZW50IHBhZGRpbmcgYW5kIGJvcmRlciBmcm9tIGFmZmVjdGluZyBlbGVtZW50IHdpZHRoLiAoaHR0cHM6Ly9naXRodWIuY29tL21vemRldnMvY3NzcmVtZWR5L2lzc3Vlcy80KVxuMi4gQWxsb3cgYWRkaW5nIGEgYm9yZGVyIHRvIGFuIGVsZW1lbnQgYnkganVzdCBhZGRpbmcgYSBib3JkZXItd2lkdGguIChodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRjc3MvdGFpbHdpbmRjc3MvcHVsbC8xMTYpXG4qL1xuXG4qLFxuOjpiZWZvcmUsXG46OmFmdGVyIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogMSAqL1xuICBib3JkZXItd2lkdGg6IDA7IC8qIDIgKi9cbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDsgLyogMiAqL1xuICBib3JkZXItY29sb3I6ICNlNWU3ZWI7IC8qIDIgKi9cbn1cblxuOjpiZWZvcmUsXG46OmFmdGVyIHtcbiAgLS10dy1jb250ZW50OiAnJztcbn1cblxuLypcbjEuIFVzZSBhIGNvbnNpc3RlbnQgc2Vuc2libGUgbGluZS1oZWlnaHQgaW4gYWxsIGJyb3dzZXJzLlxuMi4gUHJldmVudCBhZGp1c3RtZW50cyBvZiBmb250IHNpemUgYWZ0ZXIgb3JpZW50YXRpb24gY2hhbmdlcyBpbiBpT1MuXG4zLiBVc2UgYSBtb3JlIHJlYWRhYmxlIHRhYiBzaXplLlxuNC4gVXNlIHRoZSB1c2VyJ3MgY29uZmlndXJlZCBcXGBzYW5zXFxgIGZvbnQtZmFtaWx5IGJ5IGRlZmF1bHQuXG41LiBVc2UgdGhlIHVzZXIncyBjb25maWd1cmVkIFxcYHNhbnNcXGAgZm9udC1mZWF0dXJlLXNldHRpbmdzIGJ5IGRlZmF1bHQuXG42LiBVc2UgdGhlIHVzZXIncyBjb25maWd1cmVkIFxcYHNhbnNcXGAgZm9udC12YXJpYXRpb24tc2V0dGluZ3MgYnkgZGVmYXVsdC5cbjcuIERpc2FibGUgdGFwIGhpZ2hsaWdodHMgb24gaU9TXG4qL1xuXG5odG1sLFxuOmhvc3Qge1xuICBsaW5lLWhlaWdodDogMS41OyAvKiAxICovXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLyogMiAqLyAvKiAzICovXG4gIHRhYi1zaXplOiA0OyAvKiAzICovXG4gIGZvbnQtZmFtaWx5OiB1aS1zYW5zLXNlcmlmLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWYsIFwiQXBwbGUgQ29sb3IgRW1vamlcIiwgXCJTZWdvZSBVSSBFbW9qaVwiLCBcIlNlZ29lIFVJIFN5bWJvbFwiLCBcIk5vdG8gQ29sb3IgRW1vamlcIjsgLyogNCAqL1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6IG5vcm1hbDsgLyogNSAqL1xuICBmb250LXZhcmlhdGlvbi1zZXR0aW5nczogbm9ybWFsOyAvKiA2ICovXG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7IC8qIDcgKi9cbn1cblxuLypcbjEuIFJlbW92ZSB0aGUgbWFyZ2luIGluIGFsbCBicm93c2Vycy5cbjIuIEluaGVyaXQgbGluZS1oZWlnaHQgZnJvbSBcXGBodG1sXFxgIHNvIHVzZXJzIGNhbiBzZXQgdGhlbSBhcyBhIGNsYXNzIGRpcmVjdGx5IG9uIHRoZSBcXGBodG1sXFxgIGVsZW1lbnQuXG4qL1xuXG5ib2R5IHtcbiAgbWFyZ2luOiAwOyAvKiAxICovXG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0OyAvKiAyICovXG59XG5cbi8qXG4xLiBBZGQgdGhlIGNvcnJlY3QgaGVpZ2h0IGluIEZpcmVmb3guXG4yLiBDb3JyZWN0IHRoZSBpbmhlcml0YW5jZSBvZiBib3JkZXIgY29sb3IgaW4gRmlyZWZveC4gKGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTE5MDY1NSlcbjMuIEVuc3VyZSBob3Jpem9udGFsIHJ1bGVzIGFyZSB2aXNpYmxlIGJ5IGRlZmF1bHQuXG4qL1xuXG5ociB7XG4gIGhlaWdodDogMDsgLyogMSAqL1xuICBjb2xvcjogaW5oZXJpdDsgLyogMiAqL1xuICBib3JkZXItdG9wLXdpZHRoOiAxcHg7IC8qIDMgKi9cbn1cblxuLypcbkFkZCB0aGUgY29ycmVjdCB0ZXh0IGRlY29yYXRpb24gaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuKi9cblxuYWJicjp3aGVyZShbdGl0bGVdKSB7XG4gIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xuICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbn1cblxuLypcblJlbW92ZSB0aGUgZGVmYXVsdCBmb250IHNpemUgYW5kIHdlaWdodCBmb3IgaGVhZGluZ3MuXG4qL1xuXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIGZvbnQtd2VpZ2h0OiBpbmhlcml0O1xufVxuXG4vKlxuUmVzZXQgbGlua3MgdG8gb3B0aW1pemUgZm9yIG9wdC1pbiBzdHlsaW5nIGluc3RlYWQgb2Ygb3B0LW91dC5cbiovXG5cbmEge1xuICBjb2xvcjogaW5oZXJpdDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0O1xufVxuXG4vKlxuQWRkIHRoZSBjb3JyZWN0IGZvbnQgd2VpZ2h0IGluIEVkZ2UgYW5kIFNhZmFyaS5cbiovXG5cbmIsXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogYm9sZGVyO1xufVxuXG4vKlxuMS4gVXNlIHRoZSB1c2VyJ3MgY29uZmlndXJlZCBcXGBtb25vXFxgIGZvbnQtZmFtaWx5IGJ5IGRlZmF1bHQuXG4yLiBVc2UgdGhlIHVzZXIncyBjb25maWd1cmVkIFxcYG1vbm9cXGAgZm9udC1mZWF0dXJlLXNldHRpbmdzIGJ5IGRlZmF1bHQuXG4zLiBVc2UgdGhlIHVzZXIncyBjb25maWd1cmVkIFxcYG1vbm9cXGAgZm9udC12YXJpYXRpb24tc2V0dGluZ3MgYnkgZGVmYXVsdC5cbjQuIENvcnJlY3QgdGhlIG9kZCBcXGBlbVxcYCBmb250IHNpemluZyBpbiBhbGwgYnJvd3NlcnMuXG4qL1xuXG5jb2RlLFxua2JkLFxuc2FtcCxcbnByZSB7XG4gIGZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgXCJMaWJlcmF0aW9uIE1vbm9cIiwgXCJDb3VyaWVyIE5ld1wiLCBtb25vc3BhY2U7IC8qIDEgKi9cbiAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiBub3JtYWw7IC8qIDIgKi9cbiAgZm9udC12YXJpYXRpb24tc2V0dGluZ3M6IG5vcm1hbDsgLyogMyAqL1xuICBmb250LXNpemU6IDFlbTsgLyogNCAqL1xufVxuXG4vKlxuQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4qL1xuXG5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogODAlO1xufVxuXG4vKlxuUHJldmVudCBcXGBzdWJcXGAgYW5kIFxcYHN1cFxcYCBlbGVtZW50cyBmcm9tIGFmZmVjdGluZyB0aGUgbGluZSBoZWlnaHQgaW4gYWxsIGJyb3dzZXJzLlxuKi9cblxuc3ViLFxuc3VwIHtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGxpbmUtaGVpZ2h0OiAwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuXG5zdXAge1xuICB0b3A6IC0wLjVlbTtcbn1cblxuLypcbjEuIFJlbW92ZSB0ZXh0IGluZGVudGF0aW9uIGZyb20gdGFibGUgY29udGVudHMgaW4gQ2hyb21lIGFuZCBTYWZhcmkuIChodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD05OTkwODgsIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDEyOTcpXG4yLiBDb3JyZWN0IHRhYmxlIGJvcmRlciBjb2xvciBpbmhlcml0YW5jZSBpbiBhbGwgQ2hyb21lIGFuZCBTYWZhcmkuIChodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD05MzU3MjksIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTUwMTYpXG4zLiBSZW1vdmUgZ2FwcyBiZXR3ZWVuIHRhYmxlIGJvcmRlcnMgYnkgZGVmYXVsdC5cbiovXG5cbnRhYmxlIHtcbiAgdGV4dC1pbmRlbnQ6IDA7IC8qIDEgKi9cbiAgYm9yZGVyLWNvbG9yOiBpbmhlcml0OyAvKiAyICovXG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IC8qIDMgKi9cbn1cblxuLypcbjEuIENoYW5nZSB0aGUgZm9udCBzdHlsZXMgaW4gYWxsIGJyb3dzZXJzLlxuMi4gUmVtb3ZlIHRoZSBtYXJnaW4gaW4gRmlyZWZveCBhbmQgU2FmYXJpLlxuMy4gUmVtb3ZlIGRlZmF1bHQgcGFkZGluZyBpbiBhbGwgYnJvd3NlcnMuXG4qL1xuXG5idXR0b24sXG5pbnB1dCxcbm9wdGdyb3VwLFxuc2VsZWN0LFxudGV4dGFyZWEge1xuICBmb250LWZhbWlseTogaW5oZXJpdDsgLyogMSAqL1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6IGluaGVyaXQ7IC8qIDEgKi9cbiAgZm9udC12YXJpYXRpb24tc2V0dGluZ3M6IGluaGVyaXQ7IC8qIDEgKi9cbiAgZm9udC1zaXplOiAxMDAlOyAvKiAxICovXG4gIGZvbnQtd2VpZ2h0OiBpbmhlcml0OyAvKiAxICovXG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0OyAvKiAxICovXG4gIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OyAvKiAxICovXG4gIGNvbG9yOiBpbmhlcml0OyAvKiAxICovXG4gIG1hcmdpbjogMDsgLyogMiAqL1xuICBwYWRkaW5nOiAwOyAvKiAzICovXG59XG5cbi8qXG5SZW1vdmUgdGhlIGluaGVyaXRhbmNlIG9mIHRleHQgdHJhbnNmb3JtIGluIEVkZ2UgYW5kIEZpcmVmb3guXG4qL1xuXG5idXR0b24sXG5zZWxlY3Qge1xuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbn1cblxuLypcbjEuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4yLiBSZW1vdmUgZGVmYXVsdCBidXR0b24gc3R5bGVzLlxuKi9cblxuYnV0dG9uLFxuaW5wdXQ6d2hlcmUoW3R5cGU9J2J1dHRvbiddKSxcbmlucHV0OndoZXJlKFt0eXBlPSdyZXNldCddKSxcbmlucHV0OndoZXJlKFt0eXBlPSdzdWJtaXQnXSkge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsgLyogMSAqL1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgLyogMiAqL1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyAvKiAyICovXG59XG5cbi8qXG5Vc2UgdGhlIG1vZGVybiBGaXJlZm94IGZvY3VzIHN0eWxlIGZvciBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzLlxuKi9cblxuOi1tb3otZm9jdXNyaW5nIHtcbiAgb3V0bGluZTogYXV0bztcbn1cblxuLypcblJlbW92ZSB0aGUgYWRkaXRpb25hbCBcXGA6aW52YWxpZFxcYCBzdHlsZXMgaW4gRmlyZWZveC4gKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iLzJmOWVhY2Q5ZDNkOTk1YzkzN2I0MjUxYTU1NTdkOTVkNDk0YzliZTEvbGF5b3V0L3N0eWxlL3Jlcy9mb3Jtcy5jc3MjTDcyOC1MNzM3KVxuKi9cblxuOi1tb3otdWktaW52YWxpZCB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbi8qXG5BZGQgdGhlIGNvcnJlY3QgdmVydGljYWwgYWxpZ25tZW50IGluIENocm9tZSBhbmQgRmlyZWZveC5cbiovXG5cbnByb2dyZXNzIHtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG4vKlxuQ29ycmVjdCB0aGUgY3Vyc29yIHN0eWxlIG9mIGluY3JlbWVudCBhbmQgZGVjcmVtZW50IGJ1dHRvbnMgaW4gU2FmYXJpLlxuKi9cblxuOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vKlxuMS4gQ29ycmVjdCB0aGUgb2RkIGFwcGVhcmFuY2UgaW4gQ2hyb21lIGFuZCBTYWZhcmkuXG4yLiBDb3JyZWN0IHRoZSBvdXRsaW5lIHN0eWxlIGluIFNhZmFyaS5cbiovXG5cblt0eXBlPSdzZWFyY2gnXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGZpZWxkOyAvKiAxICovXG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4OyAvKiAyICovXG59XG5cbi8qXG5SZW1vdmUgdGhlIGlubmVyIHBhZGRpbmcgaW4gQ2hyb21lIGFuZCBTYWZhcmkgb24gbWFjT1MuXG4qL1xuXG46Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG5cbi8qXG4xLiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuMi4gQ2hhbmdlIGZvbnQgcHJvcGVydGllcyB0byBcXGBpbmhlcml0XFxgIGluIFNhZmFyaS5cbiovXG5cbjo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsgLyogMSAqL1xuICBmb250OiBpbmhlcml0OyAvKiAyICovXG59XG5cbi8qXG5BZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBDaHJvbWUgYW5kIFNhZmFyaS5cbiovXG5cbnN1bW1hcnkge1xuICBkaXNwbGF5OiBsaXN0LWl0ZW07XG59XG5cbi8qXG5SZW1vdmVzIHRoZSBkZWZhdWx0IHNwYWNpbmcgYW5kIGJvcmRlciBmb3IgYXBwcm9wcmlhdGUgZWxlbWVudHMuXG4qL1xuXG5ibG9ja3F1b3RlLFxuZGwsXG5kZCxcbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNixcbmhyLFxuZmlndXJlLFxucCxcbnByZSB7XG4gIG1hcmdpbjogMDtcbn1cblxuZmllbGRzZXQge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbmxlZ2VuZCB7XG4gIHBhZGRpbmc6IDA7XG59XG5cbm9sLFxudWwsXG5tZW51IHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG4vKlxuUmVzZXQgZGVmYXVsdCBzdHlsaW5nIGZvciBkaWFsb2dzLlxuKi9cbmRpYWxvZyB7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi8qXG5QcmV2ZW50IHJlc2l6aW5nIHRleHRhcmVhcyBob3Jpem9udGFsbHkgYnkgZGVmYXVsdC5cbiovXG5cbnRleHRhcmVhIHtcbiAgcmVzaXplOiB2ZXJ0aWNhbDtcbn1cblxuLypcbjEuIFJlc2V0IHRoZSBkZWZhdWx0IHBsYWNlaG9sZGVyIG9wYWNpdHkgaW4gRmlyZWZveC4gKGh0dHBzOi8vZ2l0aHViLmNvbS90YWlsd2luZGxhYnMvdGFpbHdpbmRjc3MvaXNzdWVzLzMzMDApXG4yLiBTZXQgdGhlIGRlZmF1bHQgcGxhY2Vob2xkZXIgY29sb3IgdG8gdGhlIHVzZXIncyBjb25maWd1cmVkIGdyYXkgNDAwIGNvbG9yLlxuKi9cblxuaW5wdXQ6OnBsYWNlaG9sZGVyLFxudGV4dGFyZWE6OnBsYWNlaG9sZGVyIHtcbiAgb3BhY2l0eTogMTsgLyogMSAqL1xuICBjb2xvcjogIzljYTNhZjsgLyogMiAqL1xufVxuXG4vKlxuU2V0IHRoZSBkZWZhdWx0IGN1cnNvciBmb3IgYnV0dG9ucy5cbiovXG5cbmJ1dHRvbixcbltyb2xlPVwiYnV0dG9uXCJdIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4vKlxuTWFrZSBzdXJlIGRpc2FibGVkIGJ1dHRvbnMgZG9uJ3QgZ2V0IHRoZSBwb2ludGVyIGN1cnNvci5cbiovXG46ZGlzYWJsZWQge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi8qXG4xLiBNYWtlIHJlcGxhY2VkIGVsZW1lbnRzIFxcYGRpc3BsYXk6IGJsb2NrXFxgIGJ5IGRlZmF1bHQuIChodHRwczovL2dpdGh1Yi5jb20vbW96ZGV2cy9jc3NyZW1lZHkvaXNzdWVzLzE0KVxuMi4gQWRkIFxcYHZlcnRpY2FsLWFsaWduOiBtaWRkbGVcXGAgdG8gYWxpZ24gcmVwbGFjZWQgZWxlbWVudHMgbW9yZSBzZW5zaWJseSBieSBkZWZhdWx0LiAoaHR0cHM6Ly9naXRodWIuY29tL2plbnNpbW1vbnMvY3NzcmVtZWR5L2lzc3Vlcy8xNCNpc3N1ZWNvbW1lbnQtNjM0OTM0MjEwKVxuICAgVGhpcyBjYW4gdHJpZ2dlciBhIHBvb3JseSBjb25zaWRlcmVkIGxpbnQgZXJyb3IgaW4gc29tZSB0b29scyBidXQgaXMgaW5jbHVkZWQgYnkgZGVzaWduLlxuKi9cblxuaW1nLFxuc3ZnLFxudmlkZW8sXG5jYW52YXMsXG5hdWRpbyxcbmlmcmFtZSxcbmVtYmVkLFxub2JqZWN0IHtcbiAgZGlzcGxheTogYmxvY2s7IC8qIDEgKi9cbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgLyogMiAqL1xufVxuXG4vKlxuQ29uc3RyYWluIGltYWdlcyBhbmQgdmlkZW9zIHRvIHRoZSBwYXJlbnQgd2lkdGggYW5kIHByZXNlcnZlIHRoZWlyIGludHJpbnNpYyBhc3BlY3QgcmF0aW8uIChodHRwczovL2dpdGh1Yi5jb20vbW96ZGV2cy9jc3NyZW1lZHkvaXNzdWVzLzE0KVxuKi9cblxuaW1nLFxudmlkZW8ge1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLyogTWFrZSBlbGVtZW50cyB3aXRoIHRoZSBIVE1MIGhpZGRlbiBhdHRyaWJ1dGUgc3RheSBoaWRkZW4gYnkgZGVmYXVsdCAqL1xuW2hpZGRlbl0ge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG46cm9vdCxcbltkYXRhLXRoZW1lXSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSk7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xufVxuXG5Ac3VwcG9ydHMgbm90IChjb2xvcjogb2tsY2goMCUgMCAwKSkge1xuXG4gIDpyb290IHtcbiAgICBjb2xvci1zY2hlbWU6IGxpZ2h0O1xuICAgIC0tZmFsbGJhY2stcDogIzQ5MWVmZjtcbiAgICAtLWZhbGxiYWNrLXBjOiAjZDRkYmZmO1xuICAgIC0tZmFsbGJhY2stczogI2ZmNDFjNztcbiAgICAtLWZhbGxiYWNrLXNjOiAjZmZmOWZjO1xuICAgIC0tZmFsbGJhY2stYTogIzAwY2ZiZDtcbiAgICAtLWZhbGxiYWNrLWFjOiAjMDAxMDBkO1xuICAgIC0tZmFsbGJhY2stbjogIzJiMzQ0MDtcbiAgICAtLWZhbGxiYWNrLW5jOiAjZDdkZGU0O1xuICAgIC0tZmFsbGJhY2stYjE6ICNmZmZmZmY7XG4gICAgLS1mYWxsYmFjay1iMjogI2U1ZTZlNjtcbiAgICAtLWZhbGxiYWNrLWIzOiAjZTVlNmU2O1xuICAgIC0tZmFsbGJhY2stYmM6ICMxZjI5Mzc7XG4gICAgLS1mYWxsYmFjay1pbjogIzAwYjNmMDtcbiAgICAtLWZhbGxiYWNrLWluYzogIzAwMDAwMDtcbiAgICAtLWZhbGxiYWNrLXN1OiAjMDBjYTkyO1xuICAgIC0tZmFsbGJhY2stc3VjOiAjMDAwMDAwO1xuICAgIC0tZmFsbGJhY2std2E6ICNmZmMyMmQ7XG4gICAgLS1mYWxsYmFjay13YWM6ICMwMDAwMDA7XG4gICAgLS1mYWxsYmFjay1lcjogI2ZmNmY3MDtcbiAgICAtLWZhbGxiYWNrLWVyYzogIzAwMDAwMDtcbiAgfVxuXG4gIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHtcblxuICAgIDpyb290IHtcbiAgICAgIGNvbG9yLXNjaGVtZTogZGFyaztcbiAgICAgIC0tZmFsbGJhY2stcDogIzc1ODJmZjtcbiAgICAgIC0tZmFsbGJhY2stcGM6ICMwNTA2MTc7XG4gICAgICAtLWZhbGxiYWNrLXM6ICNmZjcxY2Y7XG4gICAgICAtLWZhbGxiYWNrLXNjOiAjMTkwMjExO1xuICAgICAgLS1mYWxsYmFjay1hOiAjMDBjN2I1O1xuICAgICAgLS1mYWxsYmFjay1hYzogIzAwMGUwYztcbiAgICAgIC0tZmFsbGJhY2stbjogIzJhMzIzYztcbiAgICAgIC0tZmFsbGJhY2stbmM6ICNhNmFkYmI7XG4gICAgICAtLWZhbGxiYWNrLWIxOiAjMWQyMzJhO1xuICAgICAgLS1mYWxsYmFjay1iMjogIzE5MWUyNDtcbiAgICAgIC0tZmFsbGJhY2stYjM6ICMxNTE5MWU7XG4gICAgICAtLWZhbGxiYWNrLWJjOiAjYTZhZGJiO1xuICAgICAgLS1mYWxsYmFjay1pbjogIzAwYjNmMDtcbiAgICAgIC0tZmFsbGJhY2staW5jOiAjMDAwMDAwO1xuICAgICAgLS1mYWxsYmFjay1zdTogIzAwY2E5MjtcbiAgICAgIC0tZmFsbGJhY2stc3VjOiAjMDAwMDAwO1xuICAgICAgLS1mYWxsYmFjay13YTogI2ZmYzIyZDtcbiAgICAgIC0tZmFsbGJhY2std2FjOiAjMDAwMDAwO1xuICAgICAgLS1mYWxsYmFjay1lcjogI2ZmNmY3MDtcbiAgICAgIC0tZmFsbGJhY2stZXJjOiAjMDAwMDAwO1xuICAgIH1cbiAgfVxufVxuXG5odG1sIHtcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuKiB7XG4gIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGNoLCBjdXJyZW50Q29sb3IgMzUlLCB0cmFuc3BhcmVudCkgdHJhbnNwYXJlbnQ7XG59XG5cbio6aG92ZXIge1xuICBzY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBva2xjaCwgY3VycmVudENvbG9yIDYwJSwgdHJhbnNwYXJlbnQpIHRyYW5zcGFyZW50O1xufVxuXG46cm9vdCB7XG4gIGNvbG9yLXNjaGVtZTogZGFyaztcbiAgLS1pbjogNzIuMDYlIDAuMTkxIDIzMS42O1xuICAtLXN1OiA2NC44JSAwLjE1MCAxNjA7XG4gIC0td2E6IDg0LjcxJSAwLjE5OSA4My44NztcbiAgLS1lcjogNzEuNzYlIDAuMjIxIDIyLjE4O1xuICAtLXBjOiAxMy4xMzglIDAuMDM5MiAyNzUuNzU7XG4gIC0tc2M6IDE0Ljk2JSAwLjA1MiAzNDIuNTU7XG4gIC0tYWM6IDE0LjkwMiUgMC4wMzM0IDE4My42MTtcbiAgLS1pbmM6IDAlIDAgMDtcbiAgLS1zdWM6IDAlIDAgMDtcbiAgLS13YWM6IDAlIDAgMDtcbiAgLS1lcmM6IDAlIDAgMDtcbiAgLS1yb3VuZGVkLWJveDogMXJlbTtcbiAgLS1yb3VuZGVkLWJ0bjogMC41cmVtO1xuICAtLXJvdW5kZWQtYmFkZ2U6IDEuOXJlbTtcbiAgLS1hbmltYXRpb24tYnRuOiAwLjI1cztcbiAgLS1hbmltYXRpb24taW5wdXQ6IC4ycztcbiAgLS1idG4tZm9jdXMtc2NhbGU6IDAuOTU7XG4gIC0tYm9yZGVyLWJ0bjogMXB4O1xuICAtLXRhYi1ib3JkZXI6IDFweDtcbiAgLS10YWItcmFkaXVzOiAwLjVyZW07XG4gIC0tcDogNjUuNjklIDAuMTk2IDI3NS43NTtcbiAgLS1zOiA3NC44JSAwLjI2IDM0Mi41NTtcbiAgLS1hOiA3NC41MSUgMC4xNjcgMTgzLjYxO1xuICAtLW46IDMxLjM4MTUlIDAuMDIxMTA4IDI1NC4xMzkxNzU7XG4gIC0tbmM6IDc0LjY0NzclIDAuMDIxNiAyNjQuNDM1OTY0O1xuICAtLWIxOiAyNS4zMjY3JSAwLjAxNTg5NiAyNTIuNDE3NTY4O1xuICAtLWIyOiAyMy4yNjA3JSAwLjAxMzgwNyAyNTMuMTAwNjc1O1xuICAtLWIzOiAyMS4xNDg0JSAwLjAxMTY1IDI1NC4wODc5Mzk7XG4gIC0tYmM6IDc0LjY0NzclIDAuMDIxNiAyNjQuNDM1OTY0O1xufVxuXG5bZGF0YS10aGVtZT1kYXJrXSB7XG4gIGNvbG9yLXNjaGVtZTogZGFyaztcbiAgLS1pbjogNzIuMDYlIDAuMTkxIDIzMS42O1xuICAtLXN1OiA2NC44JSAwLjE1MCAxNjA7XG4gIC0td2E6IDg0LjcxJSAwLjE5OSA4My44NztcbiAgLS1lcjogNzEuNzYlIDAuMjIxIDIyLjE4O1xuICAtLXBjOiAxMy4xMzglIDAuMDM5MiAyNzUuNzU7XG4gIC0tc2M6IDE0Ljk2JSAwLjA1MiAzNDIuNTU7XG4gIC0tYWM6IDE0LjkwMiUgMC4wMzM0IDE4My42MTtcbiAgLS1pbmM6IDAlIDAgMDtcbiAgLS1zdWM6IDAlIDAgMDtcbiAgLS13YWM6IDAlIDAgMDtcbiAgLS1lcmM6IDAlIDAgMDtcbiAgLS1yb3VuZGVkLWJveDogMXJlbTtcbiAgLS1yb3VuZGVkLWJ0bjogMC41cmVtO1xuICAtLXJvdW5kZWQtYmFkZ2U6IDEuOXJlbTtcbiAgLS1hbmltYXRpb24tYnRuOiAwLjI1cztcbiAgLS1hbmltYXRpb24taW5wdXQ6IC4ycztcbiAgLS1idG4tZm9jdXMtc2NhbGU6IDAuOTU7XG4gIC0tYm9yZGVyLWJ0bjogMXB4O1xuICAtLXRhYi1ib3JkZXI6IDFweDtcbiAgLS10YWItcmFkaXVzOiAwLjVyZW07XG4gIC0tcDogNjUuNjklIDAuMTk2IDI3NS43NTtcbiAgLS1zOiA3NC44JSAwLjI2IDM0Mi41NTtcbiAgLS1hOiA3NC41MSUgMC4xNjcgMTgzLjYxO1xuICAtLW46IDMxLjM4MTUlIDAuMDIxMTA4IDI1NC4xMzkxNzU7XG4gIC0tbmM6IDc0LjY0NzclIDAuMDIxNiAyNjQuNDM1OTY0O1xuICAtLWIxOiAyNS4zMjY3JSAwLjAxNTg5NiAyNTIuNDE3NTY4O1xuICAtLWIyOiAyMy4yNjA3JSAwLjAxMzgwNyAyNTMuMTAwNjc1O1xuICAtLWIzOiAyMS4xNDg0JSAwLjAxMTY1IDI1NC4wODc5Mzk7XG4gIC0tYmM6IDc0LjY0NzclIDAuMDIxNiAyNjQuNDM1OTY0O1xufVxuXG5bZGF0YS10aGVtZT1vcGVuc2lnbmNzc10ge1xuICAtLXA6IDI5LjQ2NTMlIDAuMTE0NTQ4IDI1OS4wNjAxMjk7XG4gIC0tcm91bmRlZC1ib3g6IDFyZW07XG4gIC0tcm91bmRlZC1iYWRnZTogMS45cmVtO1xuICAtLWFuaW1hdGlvbi1idG46IDAuMjVzO1xuICAtLWFuaW1hdGlvbi1pbnB1dDogLjJzO1xuICAtLWJ0bi1mb2N1cy1zY2FsZTogMC45NTtcbiAgLS1ib3JkZXItYnRuOiAxcHg7XG4gIC0tcGM6IDg0LjQ1MzElIDAuMDA0NzAyIDI1OC4zMjY3OTE7XG4gIC0tczogMzIuNzgzNyUgMC4wNDA4ODUgMjYxLjM0Njg3O1xuICAtLXNjOiA4NS44MzM5JSAwLjAyMzAwNiAyNjAuNzE5NDQyO1xuICAtLWE6IDU3LjQ0MzglIDAuMjMxNDkxIDIyLjE3OTkwOTtcbiAgLS1hYzogOTEuNDI0NyUgMC4wNDM5MzUgMjMuMTc5NTc5O1xuICAtLW46IDg0LjEzNzMlIDAuMDI0MTU3IDI1Ni4xMTQxO1xuICAtLW5jOiAxOC40MDgxJSAwLjAwMzc1OCAxNjQuNTk3NjU0O1xuICAtLWIxOiAxMDAlIDAgMDtcbiAgLS1iMjogOTAuMDYwMSUgMCAwO1xuICAtLWIzOiA4MC4xNTE3JSAwIDA7XG4gIC0tYmM6IDIwLjAxOTMlIDAgMDtcbiAgLS1pbjogNzMuNDU5MiUgMC4xNTg4NzQgMjM2LjM1NzUxNDtcbiAgLS1pbmM6IDk2Ljk4NzElIDAuMDAxMzI0IDEwNi40MjM4MjE7XG4gIC0tc3U6IDY0LjgxNTklIDAuMTQ3NDA1IDE1OS42NzI2NjY7XG4gIC0tc3VjOiA5Ni45ODcxJSAwLjAwMTMyNCAxMDYuNDIzODIxO1xuICAtLXdhOiA4My44Mzk4JSAwLjE3MjIwOSA4My41NzM5Njc7XG4gIC0td2FjOiA4OC4wMDA1JSAwLjAyNTA0IDI1MS45MTY5ODtcbiAgLS1lcjogODAuNDkwMiUgMC4xMTIwMTcgMTUuNzI3NTIyO1xuICAtLWVyYzogMTUuOTk3JSAwLjAyMzI4NCAxNC44OTg1MTc7XG4gIC0tcm91bmRlZC1idG46IDEuOXJlbTtcbiAgLS10YWItYm9yZGVyOiAycHg7XG4gIC0tdGFiLXJhZGl1czogMC43cmVtO1xufVxuXG4qLCA6OmJlZm9yZSwgOjphZnRlciB7XG4gIC0tdHctYm9yZGVyLXNwYWNpbmcteDogMDtcbiAgLS10dy1ib3JkZXItc3BhY2luZy15OiAwO1xuICAtLXR3LXRyYW5zbGF0ZS14OiAwO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAwO1xuICAtLXR3LXJvdGF0ZTogMDtcbiAgLS10dy1za2V3LXg6IDA7XG4gIC0tdHctc2tldy15OiAwO1xuICAtLXR3LXNjYWxlLXg6IDE7XG4gIC0tdHctc2NhbGUteTogMTtcbiAgLS10dy1wYW4teDogIDtcbiAgLS10dy1wYW4teTogIDtcbiAgLS10dy1waW5jaC16b29tOiAgO1xuICAtLXR3LXNjcm9sbC1zbmFwLXN0cmljdG5lc3M6IHByb3hpbWl0eTtcbiAgLS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uOiAgO1xuICAtLXR3LWdyYWRpZW50LXZpYS1wb3NpdGlvbjogIDtcbiAgLS10dy1ncmFkaWVudC10by1wb3NpdGlvbjogIDtcbiAgLS10dy1vcmRpbmFsOiAgO1xuICAtLXR3LXNsYXNoZWQtemVybzogIDtcbiAgLS10dy1udW1lcmljLWZpZ3VyZTogIDtcbiAgLS10dy1udW1lcmljLXNwYWNpbmc6ICA7XG4gIC0tdHctbnVtZXJpYy1mcmFjdGlvbjogIDtcbiAgLS10dy1yaW5nLWluc2V0OiAgO1xuICAtLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAwcHg7XG4gIC0tdHctcmluZy1vZmZzZXQtY29sb3I6ICNmZmY7XG4gIC0tdHctcmluZy1jb2xvcjogcmdiKDU5IDEzMCAyNDYgLyAwLjUpO1xuICAtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXJpbmctc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDtcbiAgLS10dy1ibHVyOiAgO1xuICAtLXR3LWJyaWdodG5lc3M6ICA7XG4gIC0tdHctY29udHJhc3Q6ICA7XG4gIC0tdHctZ3JheXNjYWxlOiAgO1xuICAtLXR3LWh1ZS1yb3RhdGU6ICA7XG4gIC0tdHctaW52ZXJ0OiAgO1xuICAtLXR3LXNhdHVyYXRlOiAgO1xuICAtLXR3LXNlcGlhOiAgO1xuICAtLXR3LWRyb3Atc2hhZG93OiAgO1xuICAtLXR3LWJhY2tkcm9wLWJsdXI6ICA7XG4gIC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzczogIDtcbiAgLS10dy1iYWNrZHJvcC1jb250cmFzdDogIDtcbiAgLS10dy1iYWNrZHJvcC1ncmF5c2NhbGU6ICA7XG4gIC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZTogIDtcbiAgLS10dy1iYWNrZHJvcC1pbnZlcnQ6ICA7XG4gIC0tdHctYmFja2Ryb3Atb3BhY2l0eTogIDtcbiAgLS10dy1iYWNrZHJvcC1zYXR1cmF0ZTogIDtcbiAgLS10dy1iYWNrZHJvcC1zZXBpYTogIDtcbiAgLS10dy1jb250YWluLXNpemU6ICA7XG4gIC0tdHctY29udGFpbi1sYXlvdXQ6ICA7XG4gIC0tdHctY29udGFpbi1wYWludDogIDtcbiAgLS10dy1jb250YWluLXN0eWxlOiAgO1xufVxuXG46OmJhY2tkcm9wIHtcbiAgLS10dy1ib3JkZXItc3BhY2luZy14OiAwO1xuICAtLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7XG4gIC0tdHctdHJhbnNsYXRlLXg6IDA7XG4gIC0tdHctdHJhbnNsYXRlLXk6IDA7XG4gIC0tdHctcm90YXRlOiAwO1xuICAtLXR3LXNrZXcteDogMDtcbiAgLS10dy1za2V3LXk6IDA7XG4gIC0tdHctc2NhbGUteDogMTtcbiAgLS10dy1zY2FsZS15OiAxO1xuICAtLXR3LXBhbi14OiAgO1xuICAtLXR3LXBhbi15OiAgO1xuICAtLXR3LXBpbmNoLXpvb206ICA7XG4gIC0tdHctc2Nyb2xsLXNuYXAtc3RyaWN0bmVzczogcHJveGltaXR5O1xuICAtLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246ICA7XG4gIC0tdHctZ3JhZGllbnQtdmlhLXBvc2l0aW9uOiAgO1xuICAtLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uOiAgO1xuICAtLXR3LW9yZGluYWw6ICA7XG4gIC0tdHctc2xhc2hlZC16ZXJvOiAgO1xuICAtLXR3LW51bWVyaWMtZmlndXJlOiAgO1xuICAtLXR3LW51bWVyaWMtc3BhY2luZzogIDtcbiAgLS10dy1udW1lcmljLWZyYWN0aW9uOiAgO1xuICAtLXR3LXJpbmctaW5zZXQ6ICA7XG4gIC0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDtcbiAgLS10dy1yaW5nLW9mZnNldC1jb2xvcjogI2ZmZjtcbiAgLS10dy1yaW5nLWNvbG9yOiByZ2IoNTkgMTMwIDI0NiAvIDAuNSk7XG4gIC0tdHctcmluZy1vZmZzZXQtc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctcmluZy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwO1xuICAtLXR3LWJsdXI6ICA7XG4gIC0tdHctYnJpZ2h0bmVzczogIDtcbiAgLS10dy1jb250cmFzdDogIDtcbiAgLS10dy1ncmF5c2NhbGU6ICA7XG4gIC0tdHctaHVlLXJvdGF0ZTogIDtcbiAgLS10dy1pbnZlcnQ6ICA7XG4gIC0tdHctc2F0dXJhdGU6ICA7XG4gIC0tdHctc2VwaWE6ICA7XG4gIC0tdHctZHJvcC1zaGFkb3c6ICA7XG4gIC0tdHctYmFja2Ryb3AtYmx1cjogIDtcbiAgLS10dy1iYWNrZHJvcC1icmlnaHRuZXNzOiAgO1xuICAtLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiAgO1xuICAtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZTogIDtcbiAgLS10dy1iYWNrZHJvcC1odWUtcm90YXRlOiAgO1xuICAtLXR3LWJhY2tkcm9wLWludmVydDogIDtcbiAgLS10dy1iYWNrZHJvcC1vcGFjaXR5OiAgO1xuICAtLXR3LWJhY2tkcm9wLXNhdHVyYXRlOiAgO1xuICAtLXR3LWJhY2tkcm9wLXNlcGlhOiAgO1xuICAtLXR3LWNvbnRhaW4tc2l6ZTogIDtcbiAgLS10dy1jb250YWluLWxheW91dDogIDtcbiAgLS10dy1jb250YWluLXBhaW50OiAgO1xuICAtLXR3LWNvbnRhaW4tc3R5bGU6ICA7XG59XHJcbi5jb250YWluZXIge1xuICB3aWR0aDogMTAwJTtcbn1cclxuQG1lZGlhIChtaW4td2lkdGg6IDY0MHB4KSB7XG5cbiAgLmNvbnRhaW5lciB7XG4gICAgbWF4LXdpZHRoOiA2NDBweDtcbiAgfVxufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDc2OHB4O1xuICB9XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDEwMjRweDtcbiAgfVxufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogMTI4MHB4KSB7XG5cbiAgLmNvbnRhaW5lciB7XG4gICAgbWF4LXdpZHRoOiAxMjgwcHg7XG4gIH1cbn1cclxuQG1lZGlhIChtaW4td2lkdGg6IDE1MzZweCkge1xuXG4gIC5jb250YWluZXIge1xuICAgIG1heC13aWR0aDogMTUzNnB4O1xuICB9XG59XHJcbi5vcC1hbGVydCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIHdpZHRoOiAxMDAlO1xuICBncmlkLWF1dG8tZmxvdzogcm93O1xuICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMXJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgcGFkZGluZzogMXJlbTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLWFsZXJ0LWJnOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvMSkpO1xuICAtLWFsZXJ0LWJnLW1peDogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYWxlcnQtYmcpO1xufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogNjQwcHgpIHtcblxuICAub3AtYWxlcnQge1xuICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIG1pbm1heChhdXRvLDFmcik7XG4gICAganVzdGlmeS1pdGVtczogc3RhcnQ7XG4gICAgdGV4dC1hbGlnbjogc3RhcnQ7XG4gIH1cbn1cclxuLm9wLWJhZGdlIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAyMDBtcztcbiAgaGVpZ2h0OiAxLjI1cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgd2lkdGg6IC13ZWJraXQtZml0LWNvbnRlbnQ7XG4gIHdpZHRoOiAtbW96LWZpdC1jb250ZW50O1xuICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gIHBhZGRpbmctbGVmdDogMC41NjNyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNTYzcmVtO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJhZGdlLCAxLjlyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuQG1lZGlhIChob3Zlcjpob3Zlcikge1xuXG4gIC5vcC1tZW51IGxpID4gKjpub3QodWwsIC5vcC1tZW51LXRpdGxlLCBkZXRhaWxzLCAub3AtYnRuKTphY3RpdmUsXG4ub3AtbWVudSBsaSA+ICo6bm90KHVsLCAub3AtbWVudS10aXRsZSwgZGV0YWlscywgLm9wLWJ0bikub3AtYWN0aXZlLFxuLm9wLW1lbnUgbGkgPiBkZXRhaWxzID4gc3VtbWFyeTphY3RpdmUge1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICAub3AtdGFiOmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgfVxuXG4gIC5vcC10YWJzLWJveGVkIDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmhvdmVyLCAub3AtdGFicy1ib3hlZCA6aXMoaW5wdXQ6Y2hlY2tlZCk6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgLm9wLXRhYmxlIHRyLm9wLWhvdmVyOmhvdmVyLFxuICAub3AtdGFibGUgdHIub3AtaG92ZXI6bnRoLWNoaWxkKGV2ZW4pOmhvdmVyIHtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIH1cbn1cclxuLm9wLWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBoZWlnaHQ6IDNyZW07XG4gIG1pbi1oZWlnaHQ6IDNyZW07XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItY29sb3I6IG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjIpKSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMWVtO1xuICBnYXA6IDAuNXJlbTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIGJvcmRlci13aWR0aDogdmFyKC0tYm9yZGVyLWJ0biwgMXB4KTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctc2hhZG93OiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjA1KTtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAxcHggMnB4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMikpIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG59XHJcbi5vcC1idG4tZGlzYWJsZWQsXG4gIC5vcC1idG5bZGlzYWJsZWRdLFxuICAub3AtYnRuOmRpc2FibGVkIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XHJcbi5vcC1idG4tc3F1YXJlIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICB3aWR0aDogM3JlbTtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLWNpcmNsZSB7XG4gIGhlaWdodDogM3JlbTtcbiAgd2lkdGg6IDNyZW07XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgcGFkZGluZzogMHB4O1xufVxyXG46d2hlcmUoLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0pKSxcbjp3aGVyZSgub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJyYWRpb1wiXSkpIHtcbiAgd2lkdGg6IGF1dG87XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xufVxyXG4ub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSk6YWZ0ZXIsXG4ub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJyYWRpb1wiXSk6YWZ0ZXIge1xuICAtLXR3LWNvbnRlbnQ6IGF0dHIoYXJpYS1sYWJlbCk7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xufVxyXG4ub3AtY2FyZCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xufVxyXG4ub3AtY2FyZDpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWNhcmQtYm9keSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nLWNhcmQsIDJyZW0pO1xuICBnYXA6IDAuNXJlbTtcbn1cclxuLm9wLWNhcmQtYm9keSA6d2hlcmUocCkge1xuICBmbGV4LWdyb3c6IDE7XG59XHJcbi5vcC1jYXJkLWFjdGlvbnMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICBnYXA6IDAuNXJlbTtcbn1cclxuLm9wLWNhcmQgZmlndXJlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGwge1xuICBkaXNwbGF5OiBncmlkO1xufVxyXG4ub3AtY2FyZC5vcC1pbWFnZS1mdWxsOmJlZm9yZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgY29udGVudDogXCJcIjtcbiAgei1pbmRleDogMTA7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuNzU7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGw6YmVmb3JlLFxuICAgIC5vcC1jYXJkLm9wLWltYWdlLWZ1bGwgPiAqIHtcbiAgZ3JpZC1jb2x1bW4tc3RhcnQ6IDE7XG4gIGdyaWQtcm93LXN0YXJ0OiAxO1xufVxyXG4ub3AtY2FyZC5vcC1pbWFnZS1mdWxsID4gZmlndXJlIGltZyB7XG4gIGhlaWdodDogMTAwJTtcbiAgb2JqZWN0LWZpdDogY292ZXI7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGwgPiAub3AtY2FyZC1ib2R5IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyMDtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1uYyxva2xjaCh2YXIoLS1uYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtY2hlY2tib3gge1xuICBmbGV4LXNocmluazogMDtcbiAgLS1jaGtiZzogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbiAgLS1jaGtmZzogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAxLjVyZW07XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWRpdmlkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBtYXJnaW4tdG9wOiAxcmVtO1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xuICBoZWlnaHQ6IDFyZW07XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XHJcbi5vcC1kaXZpZGVyOmJlZm9yZSxcbiAgLm9wLWRpdmlkZXI6YWZ0ZXIge1xuICBoZWlnaHQ6IDAuMTI1cmVtO1xuICB3aWR0aDogMTAwJTtcbiAgZmxleC1ncm93OiAxO1xuICAtLXR3LWNvbnRlbnQ6ICcnO1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMSkpO1xufVxyXG4ub3AtZHJvcGRvd24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cclxuLm9wLWRyb3Bkb3duID4gKjpub3Qoc3VtbWFyeSk6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1kcm9wZG93biAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cclxuLm9wLWRyb3Bkb3duOmlzKDpub3QoZGV0YWlscykpIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3A7XG4gIC0tdHctc2NhbGUteDogLjk1O1xuICAtLXR3LXNjYWxlLXk6IC45NTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xufVxyXG4ub3AtZHJvcGRvd24tZW5kIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgaW5zZXQtaW5saW5lLWVuZDogMHB4O1xufVxyXG4ub3AtZHJvcGRvd24tbGVmdCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogYXV0bztcbiAgaW5zZXQtaW5saW5lLWVuZDogMTAwJTtcbiAgdG9wOiAwcHg7XG4gIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0O1xufVxyXG4ub3AtZHJvcGRvd24tcmlnaHQgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICBib3R0b206IGF1dG87XG4gIGluc2V0LWlubGluZS1zdGFydDogMTAwJTtcbiAgdG9wOiAwcHg7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XG59XHJcbi5vcC1kcm9wZG93bi1ib3R0b20gLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICBib3R0b206IGF1dG87XG4gIHRvcDogMTAwJTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wO1xufVxyXG4ub3AtZHJvcGRvd24tdG9wIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgYm90dG9tOiAxMDAlO1xuICB0b3A6IGF1dG87XG4gIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbTtcbn1cclxuLm9wLWRyb3Bkb3duLWVuZC5vcC1kcm9wZG93bi1yaWdodCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogMHB4O1xuICB0b3A6IGF1dG87XG59XHJcbi5vcC1kcm9wZG93bi1lbmQub3AtZHJvcGRvd24tbGVmdCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogMHB4O1xuICB0b3A6IGF1dG87XG59XHJcbi5vcC1kcm9wZG93bi5vcC1kcm9wZG93bi1vcGVuIC5vcC1kcm9wZG93bi1jb250ZW50LFxuLm9wLWRyb3Bkb3duOm5vdCgub3AtZHJvcGRvd24taG92ZXIpOmZvY3VzIC5vcC1kcm9wZG93bi1jb250ZW50LFxuLm9wLWRyb3Bkb3duOmZvY3VzLXdpdGhpbiAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIG9wYWNpdHk6IDE7XG59XHJcbkBtZWRpYSAoaG92ZXI6IGhvdmVyKSB7XG5cbiAgLm9wLWRyb3Bkb3duLm9wLWRyb3Bkb3duLWhvdmVyOmhvdmVyIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICAub3AtYnRuOmhvdmVyIHtcbiAgICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMyxva2xjaCh2YXIoLS1iMykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoXG4gICAgICAgICAgICBpbiBva2xhYixcbiAgICAgICAgICAgIG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjIpKSAvIHZhcigtLXR3LWJnLW9wYWNpdHksIDEpKSA5MCUsXG4gICAgICAgICAgICBibGFja1xuICAgICAgICAgICk7XG4gICAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChcbiAgICAgICAgICAgIGluIG9rbGFiLFxuICAgICAgICAgICAgb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMikpIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHksIDEpKSA5MCUsXG4gICAgICAgICAgICBibGFja1xuICAgICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQHN1cHBvcnRzIG5vdCAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAgIC5vcC1idG46aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1mYWxsYmFjay1iMikpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idG4tY29sb3IsIHZhcigtLWZhbGxiYWNrLWIyKSk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi5vcC1nbGFzczpob3ZlciB7XG4gICAgLS1nbGFzcy1vcGFjaXR5OiAyNSU7XG4gICAgLS1nbGFzcy1ib3JkZXItb3BhY2l0eTogMTUlO1xuICB9XG5cbiAgLm9wLWJ0bi1naG9zdDpob3ZlciB7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAgIC5vcC1idG4tZ2hvc3Q6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZTpob3ZlciB7XG4gICAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnk6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnk6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICB9XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXNlY29uZGFyeTpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXNjLG9rbGNoKHZhcigtLXNjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc2Vjb25kYXJ5OmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSkgOTAlLCBibGFjayk7XG4gICAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1hY2NlbnQ6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1hYyxva2xjaCh2YXIoLS1hYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2Vzczpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1Yyxva2xjaCh2YXIoLS1zdWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zdWNjZXNzOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zdSxva2xjaCh2YXIoLS1zdSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4taW5mbzpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWluYyxva2xjaCh2YXIoLS1pbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1pbmZvOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4td2FybmluZzpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhYyxva2xjaCh2YXIoLS13YWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3I6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcmMsb2tsY2godmFyKC0tZXJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3I6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1kaXNhYmxlZDpob3ZlcixcbiAgICAub3AtYnRuW2Rpc2FibGVkXTpob3ZlcixcbiAgICAub3AtYnRuOmRpc2FibGVkOmhvdmVyIHtcbiAgICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDAuMjtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkKTpob3ZlciwgLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl06Y2hlY2tlZCk6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICB9XG4gIH1cblxuICAub3AtZHJvcGRvd24ub3AtZHJvcGRvd24taG92ZXI6aG92ZXIgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICAgIC0tdHctc2NhbGUteDogMTtcbiAgICAtLXR3LXNjYWxlLXk6IDE7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIH1cblxuICA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBva2xjaCgwJSAwIDApKSB7XG5cbiAgICA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjEpKTtcbiAgICB9XG4gIH1cblxuICAub3AtdGFiW2Rpc2FibGVkXSxcbiAgICAub3AtdGFiW2Rpc2FibGVkXTpob3ZlciB7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xuICB9XG59XHJcbi5vcC1kcm9wZG93bjppcyhkZXRhaWxzKSBzdW1tYXJ5Ojotd2Via2l0LWRldGFpbHMtbWFya2VyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cclxuLm9wLWZpbGUtaW5wdXQge1xuICBoZWlnaHQ6IDNyZW07XG4gIGZsZXgtc2hyaW5rOiAxO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IDFyZW07XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDA7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC1maWxlLWlucHV0Ojotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiAxcmVtO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmbGV4LXNocmluazogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxZW07XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stbmMsb2tsY2godmFyKC0tbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7XG4gIGJvcmRlci13aWR0aDogdmFyKC0tYm9yZGVyLWJ0biwgMXB4KTtcbiAgYW5pbWF0aW9uOiBidXR0b24tcG9wIHZhcigtLWFuaW1hdGlvbi1idG4sIDAuMjVzKSBlYXNlLW91dDtcbn1cclxuLm9wLWZpbGUtaW5wdXQ6OmZpbGUtc2VsZWN0b3ItYnV0dG9uIHtcbiAgbWFyZ2luLWlubGluZS1lbmQ6IDFyZW07XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDFlbTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stbmMsb2tsY2godmFyKC0tbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7XG4gIGJvcmRlci13aWR0aDogdmFyKC0tYm9yZGVyLWJ0biwgMXB4KTtcbiAgYW5pbWF0aW9uOiBidXR0b24tcG9wIHZhcigtLWFuaW1hdGlvbi1idG4sIDAuMjVzKSBlYXNlLW91dDtcbn1cclxuLm9wLWZvb3RlciB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIHdpZHRoOiAxMDAlO1xuICBncmlkLWF1dG8tZmxvdzogcm93O1xuICBwbGFjZS1pdGVtczogc3RhcnQ7XG4gIGNvbHVtbi1nYXA6IDFyZW07XG4gIHJvdy1nYXA6IDIuNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5vcC1mb290ZXIgPiAqIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgcGxhY2UtaXRlbXM6IHN0YXJ0O1xuICBnYXA6IDAuNXJlbTtcbn1cclxuLm9wLWZvb3Rlci1jZW50ZXIge1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XHJcbi5vcC1mb290ZXItY2VudGVyID4gKiB7XG4gIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiA0OHJlbSkge1xuXG4gIC5vcC1mb290ZXIge1xuICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gIH1cblxuICAub3AtZm9vdGVyLWNlbnRlciB7XG4gICAgZ3JpZC1hdXRvLWZsb3c6IHJvdyBkZW5zZTtcbiAgfVxufVxyXG4ub3AtaW5wdXQge1xuICBmbGV4LXNocmluazogMTtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gIGhlaWdodDogM3JlbTtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICBmb250LXNpemU6IDFyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICBsaW5lLWhlaWdodDogMS41cmVtO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC1pbnB1dFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuLm9wLWlucHV0LW1kW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xuICBtYXJnaW4tdG9wOiAtMXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogLTFyZW07XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiAtMXJlbTtcbn1cclxuLm9wLWlucHV0LXhzW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xuICBtYXJnaW4tdG9wOiAtMC4yNXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogLTAuMjVyZW07XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiAtMHB4O1xufVxyXG4ub3AtaW5wdXQtc21bdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XG4gIG1hcmdpbi10b3A6IDBweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICBtYXJnaW4taW5saW5lLWVuZDogLTBweDtcbn1cclxuLm9wLWpvaW4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xufVxyXG4ub3Atam9pbiA6d2hlcmUoLm9wLWpvaW4taXRlbSkge1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMDtcbn1cclxuLm9wLWpvaW4gLm9wLWpvaW4taXRlbTpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpLFxuICAub3Atam9pbiAqOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwO1xufVxyXG4ub3Atam9pbiAub3Atam9pbi1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCksXG4gIC5vcC1qb2luICo6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogMDtcbn1cclxuLm9wLWpvaW4gLm9wLWRyb3Bkb3duIC5vcC1qb2luLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSxcbiAgLm9wLWpvaW4gKjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIC5vcC1kcm9wZG93biAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4gOndoZXJlKC5vcC1qb2luLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSksXG4gIC5vcC1qb2luIDp3aGVyZSgqOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSkge1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4gLm9wLWpvaW4taXRlbTpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpLFxuICAub3Atam9pbiAqOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwO1xufVxyXG4ub3Atam9pbiA6d2hlcmUoLm9wLWpvaW4taXRlbTpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpKSxcbiAgLm9wLWpvaW4gOndoZXJlKCo6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSAub3Atam9pbi1pdGVtKSB7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbkBzdXBwb3J0cyBub3Qgc2VsZWN0b3IoOmhhcygqKSkge1xuXG4gIDp3aGVyZSgub3Atam9pbiAqKSB7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbiAgfVxufVxyXG5Ac3VwcG9ydHMgc2VsZWN0b3IoOmhhcygqKSkge1xuXG4gIDp3aGVyZSgub3Atam9pbiAqOmhhcygub3Atam9pbi1pdGVtKSkge1xuICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gIH1cbn1cclxuLm9wLWxpbmsge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiB1bmRlcmxpbmU7XG59XHJcbi5vcC1tZW51IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgcGFkZGluZzogMC41cmVtO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGkgdWwpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiAxcmVtO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogMC41cmVtO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGk6bm90KC5vcC1tZW51LXRpdGxlKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSwgLm9wLWJ0bikpLCAub3AtbWVudSA6d2hlcmUobGk6bm90KC5vcC1tZW51LXRpdGxlKSA+IGRldGFpbHMgPiBzdW1tYXJ5Om5vdCgub3AtbWVudS10aXRsZSkpIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjVyZW07XG4gIGdyaWQtYXV0by1jb2x1bW5zOiBtaW5tYXgoYXV0bywgLXdlYmtpdC1tYXgtY29udGVudCkgYXV0byAtd2Via2l0LW1heC1jb250ZW50O1xuICBncmlkLWF1dG8tY29sdW1uczogbWlubWF4KGF1dG8sIG1heC1jb250ZW50KSBhdXRvIG1heC1jb250ZW50O1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxyXG4ub3AtbWVudSBsaS5vcC1kaXNhYmxlZCB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4zKSk7XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaSA+IC5vcC1tZW51LWRyb3Bkb3duOm5vdCgub3AtbWVudS1kcm9wZG93bi1zaG93KSkge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG46d2hlcmUoLm9wLW1lbnUgbGkpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXNocmluazogMDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cclxuOndoZXJlKC5vcC1tZW51IGxpKSAub3AtYmFkZ2Uge1xuICBqdXN0aWZ5LXNlbGY6IGVuZDtcbn1cclxuLm9wLW1vZGFsIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgaW5zZXQ6IDBweDtcbiAgbWFyZ2luOiAwcHg7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGhlaWdodDogMTAwJTtcbiAgbWF4LWhlaWdodDogbm9uZTtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogbm9uZTtcbiAganVzdGlmeS1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiAwcHg7XG4gIG9wYWNpdHk6IDA7XG4gIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47XG4gIHotaW5kZXg6IDk5OTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiBpbmhlcml0O1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAyMDBtcztcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHksIHZpc2liaWxpdHk7XG4gIG92ZXJmbG93LXk6IGhpZGRlbjtcbn1cclxuOndoZXJlKC5vcC1tb2RhbCkge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxyXG4ub3AtbW9kYWwtYm94IHtcbiAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDVlbSk7XG4gIGdyaWQtY29sdW1uLXN0YXJ0OiAxO1xuICBncmlkLXJvdy1zdGFydDogMTtcbiAgd2lkdGg6IDkxLjY2NjY2NyU7XG4gIG1heC13aWR0aDogMzJyZW07XG4gIC0tdHctc2NhbGUteDogLjk7XG4gIC0tdHctc2NhbGUteTogLjk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgcGFkZGluZzogMS41cmVtO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAyMDBtcztcbiAgYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjI1KSAwcHggMjVweCA1MHB4IC0xMnB4O1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluO1xufVxyXG4ub3AtbW9kYWwtb3Blbixcbi5vcC1tb2RhbDp0YXJnZXQsXG4ub3AtbW9kYWwtdG9nZ2xlOmNoZWNrZWQgKyAub3AtbW9kYWwsXG4ub3AtbW9kYWxbb3Blbl0ge1xuICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgb3BhY2l0eTogMTtcbn1cclxuLm9wLW1vZGFsLWFjdGlvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1hcmdpbi10b3A6IDEuNXJlbTtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbn1cclxuOnJvb3Q6aGFzKDppcygub3AtbW9kYWwtb3BlbiwgLm9wLW1vZGFsOnRhcmdldCwgLm9wLW1vZGFsLXRvZ2dsZTpjaGVja2VkICsgLm9wLW1vZGFsLCAub3AtbW9kYWxbb3Blbl0pKSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZTtcbn1cclxuLm9wLW5hdmJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IHZhcigtLW5hdmJhci1wYWRkaW5nLCAwLjVyZW0pO1xuICBtaW4taGVpZ2h0OiA0cmVtO1xuICB3aWR0aDogMTAwJTtcbn1cclxuOndoZXJlKC5vcC1uYXZiYXIgPiAqOm5vdChzY3JpcHQsIHN0eWxlKSkge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cclxuLm9wLXJhZGlvIHtcbiAgZmxleC1zaHJpbms6IDA7XG4gIC0tY2hrYmc6IHZhcigtLWJjKTtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAxLjVyZW07XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1zZWxlY3Qge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgaGVpZ2h0OiAzcmVtO1xuICBtaW4taGVpZ2h0OiAzcmVtO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogMXJlbTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiAyLjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHRyYW5zcGFyZW50IDUwJSwgY3VycmVudENvbG9yIDUwJSksXG4gICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgY3VycmVudENvbG9yIDUwJSwgdHJhbnNwYXJlbnQgNTAlKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2FsYygxMDAlIC0gMjBweCkgY2FsYygxcHggKyA1MCUpLFxuICAgIGNhbGMoMTAwJSAtIDE2LjFweCkgY2FsYygxcHggKyA1MCUpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDRweCA0cHgsXG4gICAgNHB4IDRweDtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbn1cclxuLm9wLXNlbGVjdFttdWx0aXBsZV0ge1xuICBoZWlnaHQ6IGF1dG87XG59XHJcbi5vcC10YWJzIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xufVxyXG4ub3AtdGFicy1saWZ0ZWQ6aGFzKC5vcC10YWItY29udGVudFtjbGFzc149XCJvcC1yb3VuZGVkLVwiXSlcbiAgICAub3AtdGFiOmZpcnN0LWNoaWxkOm5vdCg6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkpLCAub3AtdGFicy1saWZ0ZWQ6aGFzKC5vcC10YWItY29udGVudFtjbGFzcyo9XCIgb3Atcm91bmRlZC1cIl0pXG4gICAgLm9wLXRhYjpmaXJzdC1jaGlsZDpub3QoOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pKSB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50O1xufVxyXG4ub3AtdGFiIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBncmlkLXJvdy1zdGFydDogMTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGhlaWdodDogMnJlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIC0tdGFiLXBhZGRpbmc6IDFyZW07XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjU7XG4gIC0tdGFiLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xuICAtLXRhYi1iZzogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgLS10YWItYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMyxva2xjaCh2YXIoLS1iMykvMSkpO1xuICBjb2xvcjogdmFyKC0tdGFiLWNvbG9yKTtcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS10YWItcGFkZGluZywgMXJlbSk7XG59XHJcbi5vcC10YWI6aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdKSB7XG4gIHdpZHRoOiBhdXRvO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMHB4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XG59XHJcbi5vcC10YWI6aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdKTphZnRlciB7XG4gIC0tdHctY29udGVudDogYXR0cihhcmlhLWxhYmVsKTtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG59XHJcbi5vcC10YWI6bm90KGlucHV0KTplbXB0eSB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgZ3JpZC1jb2x1bW4tc3RhcnQ6IHNwYW4gOTk5OTtcbn1cclxuOmNoZWNrZWQgKyAub3AtdGFiLWNvbnRlbnQ6bnRoLWNoaWxkKDIpLFxuICA6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkgKyAub3AtdGFiLWNvbnRlbnQ6bnRoLWNoaWxkKDIpIHtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMHB4O1xufVxyXG5pbnB1dC5vcC10YWI6Y2hlY2tlZCArIC5vcC10YWItY29udGVudCxcbjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSArIC5vcC10YWItY29udGVudCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxyXG4ub3AtdGFibGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKC5vcC10YWJsZS1waW4tcm93cyB0aGVhZCB0cikge1xuICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIHRvcDogMHB4O1xuICB6LWluZGV4OiAxO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKC5vcC10YWJsZS1waW4tcm93cyB0Zm9vdCB0cikge1xuICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIGJvdHRvbTogMHB4O1xuICB6LWluZGV4OiAxO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKC5vcC10YWJsZS1waW4tY29scyB0ciB0aCkge1xuICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIGxlZnQ6IDBweDtcbiAgcmlnaHQ6IDBweDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHRhcmVhIHtcbiAgbWluLWhlaWdodDogM3JlbTtcbiAgZmxleC1zaHJpbms6IDE7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgcGFkZGluZy10b3A6IDAuNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC10b2dnbGUge1xuICBmbGV4LXNocmluazogMDtcbiAgLS10Z2xiZzogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgLS1oYW5kbGVvZmZzZXQ6IDEuNXJlbTtcbiAgLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yOiBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgKiAtMSk7XG4gIC0tdG9nZ2xlaGFuZGxlYm9yZGVyOiAwIDA7XG4gIGhlaWdodDogMS41cmVtO1xuICB3aWR0aDogM3JlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1iYWRnZSwgMS45cmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogY3VycmVudENvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC41KSk7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQsXG4gICAgYm94LXNoYWRvdyB2YXIoLS1hbmltYXRpb24taW5wdXQsIDAuMnMpIGVhc2Utb3V0O1xuICBib3gtc2hhZG93OiB2YXIoLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yKSAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldCxcbiAgICAwIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgIHZhcigtLXRvZ2dsZWhhbmRsZWJvcmRlcik7XG59XHJcbi5vcC1hbGVydC1pbmZvIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMC4yKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW5jLG9rbGNoKHZhcigtLWluYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLWFsZXJ0LWJnOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpO1xuICAtLWFsZXJ0LWJnLW1peDogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbn1cclxuLm9wLWFsZXJ0LXN1Y2Nlc3Mge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8wLjIpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zdWMsb2tsY2godmFyKC0tc3VjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tYWxlcnQtYmc6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSk7XG4gIC0tYWxlcnQtYmctbWl4OiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xufVxyXG4ub3AtYWxlcnQtd2FybmluZyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzAuMikpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhYyxva2xjaCh2YXIoLS13YWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS1hbGVydC1iZzogdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKTtcbiAgLS1hbGVydC1iZy1taXg6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSk7XG59XHJcbi5vcC1hbGVydC1lcnJvciB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stZXIsb2tsY2godmFyKC0tZXIpLzAuMikpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyYyxva2xjaCh2YXIoLS1lcmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS1hbGVydC1iZzogdmFyKC0tZmFsbGJhY2stZXIsb2tsY2godmFyKC0tZXIpLzEpKTtcbiAgLS1hbGVydC1iZy1taXg6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSk7XG59XHJcbi5vcC1iYWRnZS1wcmltYXJ5IHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYmFkZ2Utb3V0bGluZS5vcC1iYWRnZS1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiBuby1wcmVmZXJlbmNlKSB7XG5cbiAgLm9wLWJ0biB7XG4gICAgYW5pbWF0aW9uOiBidXR0b24tcG9wIHZhcigtLWFuaW1hdGlvbi1idG4sIDAuMjVzKSBlYXNlLW91dDtcbiAgfVxufVxyXG4ub3AtYnRuOmFjdGl2ZTpob3ZlcixcbiAgLm9wLWJ0bjphY3RpdmU6Zm9jdXMge1xuICBhbmltYXRpb246IGJ1dHRvbi1wb3AgMHMgZWFzZS1vdXQ7XG4gIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tYnRuLWZvY3VzLXNjYWxlLCAwLjk3KSk7XG59XHJcbkBzdXBwb3J0cyBub3QgKGNvbG9yOiBva2xjaCgwJSAwIDApKSB7XG5cbiAgLm9wLWJ0biB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1mYWxsYmFjay1iMikpO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1mYWxsYmFjay1iMikpO1xuICB9XG5cbiAgLm9wLWJ0bi1wcmltYXJ5IHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCk7XG4gIH1cblxuICAub3AtYnRuLXNlY29uZGFyeSB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLXMpO1xuICB9XG5cbiAgLm9wLWJ0bi1hY2NlbnQge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1hKTtcbiAgfVxuXG4gIC5vcC1idG4tbmV1dHJhbCB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLW4pO1xuICB9XG5cbiAgLm9wLWJ0bi1pbmZvIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2staW4pO1xuICB9XG5cbiAgLm9wLWJ0bi1lcnJvciB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyKTtcbiAgfVxufVxyXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KFxuICAgICAgICAgIGluIG9rbGFiLFxuICAgICAgICAgIG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjMpKSAvIHZhcigtLXR3LWJnLW9wYWNpdHksIDEpKSA5MCUsXG4gICAgICAgICAgYmxhY2tcbiAgICAgICAgKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChcbiAgICAgICAgICBpbiBva2xhYixcbiAgICAgICAgICBva2xjaCh2YXIoLS1idG4tY29sb3IsIHZhcigtLWIzKSkgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSwgMSkpIDkwJSxcbiAgICAgICAgICBibGFja1xuICAgICAgICApO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1wcmltYXJ5Lm9wLWJ0bi1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zZWNvbmRhcnkub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSkgOTAlLCBibGFjayk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudC5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1hLG9rbGNoKHZhcigtLWEpLzEpKSA5MCUsIGJsYWNrKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2Vzcy5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSkgOTAlLCBibGFjayk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWluZm8ub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nLm9wLWJ0bi1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKSA5MCUsIGJsYWNrKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3Iub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpIDkwJSwgYmxhY2spO1xuICB9XG59XHJcbi5vcC1idG46Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1idG4tcHJpbWFyeSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcGMsb2tsY2godmFyKC0tcGMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSk7XG59XHJcbkBzdXBwb3J0cyAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAub3AtYnRuLXByaW1hcnkge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1wKTtcbiAgfVxuXG4gIC5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tcyk7XG4gIH1cblxuICAub3AtYnRuLWFjY2VudCB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWEpO1xuICB9XG5cbiAgLm9wLWJ0bi1uZXV0cmFsIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tbik7XG4gIH1cblxuICAub3AtYnRuLWluZm8ge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1pbik7XG4gIH1cblxuICAub3AtYnRuLWVycm9yIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZXIpO1xuICB9XG59XHJcbi5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zYyxva2xjaCh2YXIoLS1zYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKTtcbn1cclxuLm9wLWJ0bi1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWFjLG9rbGNoKHZhcigtLWFjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpO1xufVxyXG4ub3AtYnRuLW5ldXRyYWwge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvMSkpO1xufVxyXG4ub3AtYnRuLWluZm8ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWluYyxva2xjaCh2YXIoLS1pbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pLzEpKTtcbn1cclxuLm9wLWJ0bi1lcnJvciB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stZXJjLG9rbGNoKHZhcigtLWVyYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpO1xufVxyXG4ub3AtYnRuLm9wLWdsYXNzIHtcbiAgLS10dy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xuICBvdXRsaW5lLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XHJcbi5vcC1idG4ub3AtZ2xhc3Mub3AtYnRuLWFjdGl2ZSB7XG4gIC0tZ2xhc3Mtb3BhY2l0eTogMjUlO1xuICAtLWdsYXNzLWJvcmRlci1vcGFjaXR5OiAxNSU7XG59XHJcbi5vcC1idG4tZ2hvc3Qge1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIC0tdHctc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbiAgb3V0bGluZS1jb2xvcjogY3VycmVudENvbG9yO1xufVxyXG4ub3AtYnRuLWdob3N0Lm9wLWJ0bi1hY3RpdmUge1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1idG4tbGluay5vcC1idG4tYWN0aXZlIHtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiB1bmRlcmxpbmU7XG59XHJcbi5vcC1idG4tb3V0bGluZSB7XG4gIGJvcmRlci1jb2xvcjogY3VycmVudENvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLXR3LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXNoYWRvdyk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1wcmltYXJ5Lm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zZWNvbmRhcnkub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc2Msb2tsY2godmFyKC0tc2MpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudC5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1hYyxva2xjaCh2YXIoLS1hYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXN1Y2Nlc3Mge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2Vzcy5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zdWMsb2tsY2godmFyKC0tc3VjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4taW5mbyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1pbmZvLm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWluYyxva2xjaCh2YXIoLS1pbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXdhcm5pbmcub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2std2FjLG9rbGNoKHZhcigtLXdhYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWVycm9yIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWVycm9yLm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyYyxva2xjaCh2YXIoLS1lcmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi5vcC1idG4tZGlzYWJsZWQsXG4gIC5vcC1idG5bZGlzYWJsZWRdLFxuICAub3AtYnRuOmRpc2FibGVkIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuMjtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1idG46aXMoaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQpLFxuLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl06Y2hlY2tlZCkge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG46aXMoaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQpOmZvY3VzLXZpc2libGUsIC5vcC1idG46aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdOmNoZWNrZWQpOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKTtcbn1cclxuQGtleWZyYW1lcyBidXR0b24tcG9wIHtcblxuICAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1idG4tZm9jdXMtc2NhbGUsIDAuOTgpKTtcbiAgfVxuXG4gIDQwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTtcbiAgfVxuXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbn1cclxuLm9wLWNhcmQgOndoZXJlKGZpZ3VyZTpmaXJzdC1jaGlsZCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IHVuc2V0O1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IHVuc2V0O1xufVxyXG4ub3AtY2FyZCA6d2hlcmUoZmlndXJlOmxhc3QtY2hpbGQpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogdW5zZXQ7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiB1bnNldDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWNhcmQ6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1jYXJkLm9wLWJvcmRlcmVkIHtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4ub3AtY2FyZC5vcC1jb21wYWN0IC5vcC1jYXJkLWJvZHkge1xuICBwYWRkaW5nOiAxcmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbn1cclxuLm9wLWNhcmQtdGl0bGUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuNXJlbTtcbiAgZm9udC1zaXplOiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cclxuLm9wLWNhcmQub3AtaW1hZ2UtZnVsbCA6d2hlcmUoZmlndXJlKSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1jaGVja2JveDpmb2N1cyB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XHJcbi5vcC1jaGVja2JveDpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbn1cclxuLm9wLWNoZWNrYm94OmRpc2FibGVkIHtcbiAgYm9yZGVyLXdpZHRoOiAwcHg7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWNoZWNrYm94OmNoZWNrZWQsXG4gIC5vcC1jaGVja2JveFthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYW5pbWF0aW9uOiBjaGVja21hcmsgdmFyKC0tYW5pbWF0aW9uLWlucHV0LCAwLjJzKSBlYXNlLW91dDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2hrYmcpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLCB0cmFuc3BhcmVudCA2NSUsIHZhcigtLWNoa2JnKSA2NS45OSUpLFxuICAgICAgbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB0cmFuc3BhcmVudCA3NSUsIHZhcigtLWNoa2JnKSA3NS45OSUpLFxuICAgICAgbGluZWFyLWdyYWRpZW50KC00NWRlZywgdmFyKC0tY2hrYmcpIDQwJSwgdHJhbnNwYXJlbnQgNDAuOTklKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudChcbiAgICAgICAgNDVkZWcsXG4gICAgICAgIHZhcigtLWNoa2JnKSAzMCUsXG4gICAgICAgIHZhcigtLWNoa2ZnKSAzMC45OSUsXG4gICAgICAgIHZhcigtLWNoa2ZnKSA0MCUsXG4gICAgICAgIHRyYW5zcGFyZW50IDQwLjk5JVxuICAgICAgKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudCgtNDVkZWcsIHZhcigtLWNoa2ZnKSA1MCUsIHZhcigtLWNoa2JnKSA1MC45OSUpO1xufVxyXG4ub3AtY2hlY2tib3g6aW5kZXRlcm1pbmF0ZSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGFuaW1hdGlvbjogY2hlY2ttYXJrIHZhcigtLWFuaW1hdGlvbi1pbnB1dCwgMC4ycykgZWFzZS1vdXQ7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQgODAlLCB2YXIoLS1jaGtiZykgODAlKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudCgtOTBkZWcsIHRyYW5zcGFyZW50IDgwJSwgdmFyKC0tY2hrYmcpIDgwJSksXG4gICAgICBsaW5lYXItZ3JhZGllbnQoMGRlZywgdmFyKC0tY2hrYmcpIDQzJSwgdmFyKC0tY2hrZmcpIDQzJSwgdmFyKC0tY2hrZmcpIDU3JSwgdmFyKC0tY2hrYmcpIDU3JSk7XG59XHJcbkBrZXlmcmFtZXMgY2hlY2ttYXJrIHtcblxuICAwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbi15OiA1cHg7XG4gIH1cblxuICA1MCUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb24teTogLTJweDtcbiAgfVxuXG4gIDEwMCUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb24teTogMDtcbiAgfVxufVxyXG4ub3AtZGl2aWRlcjpub3QoOmVtcHR5KSB7XG4gIGdhcDogMXJlbTtcbn1cclxuLm9wLWRyb3Bkb3duLm9wLWRyb3Bkb3duLW9wZW4gLm9wLWRyb3Bkb3duLWNvbnRlbnQsXG4ub3AtZHJvcGRvd246Zm9jdXMgLm9wLWRyb3Bkb3duLWNvbnRlbnQsXG4ub3AtZHJvcGRvd246Zm9jdXMtd2l0aGluIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1ib3JkZXJlZCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQ6Zm9jdXMge1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1maWxlLWlucHV0LWRpc2FibGVkLFxuICAub3AtZmlsZS1pbnB1dFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQtZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtZmlsZS1pbnB1dFtkaXNhYmxlZF06OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5KSkpO1xuICAtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQtZGlzYWJsZWQ6Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uLCAub3AtZmlsZS1pbnB1dFtkaXNhYmxlZF06Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuMjtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1maWxlLWlucHV0LWRpc2FibGVkOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbiwgLm9wLWZpbGUtaW5wdXRbZGlzYWJsZWRdOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbiB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDA7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAwLjI7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtaW5wdXQgaW5wdXQge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XHJcbi5vcC1pbnB1dCBpbnB1dDpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWlucHV0W2xpc3RdOjotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3Ige1xuICBsaW5lLWhlaWdodDogMWVtO1xufVxyXG4ub3AtaW5wdXQtYm9yZGVyZWQge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLWlucHV0OmZvY3VzLFxuICAub3AtaW5wdXQ6Zm9jdXMtd2l0aGluIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLWlucHV0Omhhcyg+IGlucHV0W2Rpc2FibGVkXSksXG4gIC5vcC1pbnB1dC1kaXNhYmxlZCxcbiAgLm9wLWlucHV0OmRpc2FibGVkLFxuICAub3AtaW5wdXRbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC40KSk7XG59XHJcbi5vcC1pbnB1dDpoYXMoPiBpbnB1dFtkaXNhYmxlZF0pOjpwbGFjZWhvbGRlcixcbiAgLm9wLWlucHV0LWRpc2FibGVkOjpwbGFjZWhvbGRlcixcbiAgLm9wLWlucHV0OmRpc2FibGVkOjpwbGFjZWhvbGRlcixcbiAgLm9wLWlucHV0W2Rpc2FibGVkXTo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtaW5wdXQ6aGFzKD4gaW5wdXRbZGlzYWJsZWRdKSA+IGlucHV0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XHJcbi5vcC1pbnB1dDo6LXdlYmtpdC1kYXRlLWFuZC10aW1lLXZhbHVlIHtcbiAgdGV4dC1hbGlnbjogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4gPiA6d2hlcmUoKjpub3QoOmZpcnN0LWNoaWxkKSkge1xuICBtYXJnaW4tdG9wOiAwcHg7XG4gIG1hcmdpbi1ib3R0b206IDBweDtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogLTFweDtcbn1cclxuLm9wLWpvaW4gPiA6d2hlcmUoKjpub3QoOmZpcnN0LWNoaWxkKSk6aXMoLm9wLWJ0bikge1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiBjYWxjKHZhcigtLWJvcmRlci1idG4pICogLTEpO1xufVxyXG4ub3Atam9pbi1pdGVtOmZvY3VzIHtcbiAgaXNvbGF0aW9uOiBpc29sYXRlO1xufVxyXG4ub3AtbGluay1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuQHN1cHBvcnRzIChjb2xvcjpjb2xvci1taXgoaW4gb2tsYWIsYmxhY2ssYmxhY2spKSB7XG5cbiAgQG1lZGlhIChob3Zlcjpob3Zlcikge1xuXG4gICAgLm9wLWxpbmstcHJpbWFyeTpob3ZlciB7XG4gICAgICBjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDgwJSxibGFjayk7XG4gICAgfVxuXG4gICAgLm9wLWxpbmstc2Vjb25kYXJ5OmhvdmVyIHtcbiAgICAgIGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSkgODAlLGJsYWNrKTtcbiAgICB9XG5cbiAgICAub3AtbGluay1hY2NlbnQ6aG92ZXIge1xuICAgICAgY29sb3I6IGNvbG9yLW1peChpbiBva2xhYix2YXIoLS1mYWxsYmFjay1hLG9rbGNoKHZhcigtLWEpLzEpKSA4MCUsYmxhY2spO1xuICAgIH1cbiAgfVxufVxyXG4ub3AtbGluay1zZWNvbmRhcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtbGluay1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtbGluazpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWxpbms6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1sb2FkaW5nIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgYXNwZWN0LXJhdGlvOiAxIC8gMTtcbiAgd2lkdGg6IDEuNXJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogY3VycmVudENvbG9yO1xuICAtd2Via2l0LW1hc2stc2l6ZTogMTAwJTtcbiAgICAgICAgICBtYXNrLXNpemU6IDEwMCU7XG4gIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgICAgICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAtd2Via2l0LW1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICAgICAgICBtYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xuICAgICAgICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX199KTtcbn1cclxuLm9wLWxvYWRpbmctaW5maW5pdHkge1xuICAtd2Via2l0LW1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbiAgICAgICAgICBtYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19ffSk7XG59XHJcbjp3aGVyZSgub3AtbWVudSBsaTplbXB0eSkge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBvcGFjaXR5OiAwLjE7XG4gIG1hcmdpbjogMC41cmVtIDFyZW07XG4gIGhlaWdodDogMXB4O1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGkgdWwpOmJlZm9yZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAwLjc1cmVtO1xuICBpbnNldC1pbmxpbmUtc3RhcnQ6IDBweDtcbiAgdG9wOiAwLjc1cmVtO1xuICB3aWR0aDogMXB4O1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBvcGFjaXR5OiAwLjE7XG4gIGNvbnRlbnQ6IFwiXCI7XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaTpub3QoLm9wLW1lbnUtdGl0bGUpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlLCAub3AtYnRuKSksXG4ub3AtbWVudSA6d2hlcmUobGk6bm90KC5vcC1tZW51LXRpdGxlKSA+IGRldGFpbHMgPiBzdW1tYXJ5Om5vdCgub3AtbWVudS10aXRsZSkpIHtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgcGFkZGluZy10b3A6IDAuNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgdGV4dC1hbGlnbjogc3RhcnQ7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICB0ZXh0LXdyYXA6IGJhbGFuY2U7XG59XHJcbjp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUpKTpub3Qoc3VtbWFyeSwgLm9wLWFjdGl2ZSwgLm9wLWJ0bikub3AtZm9jdXMsIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUpKTpub3Qoc3VtbWFyeSwgLm9wLWFjdGl2ZSwgLm9wLWJ0bik6Zm9jdXMsIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUpKTppcyhzdW1tYXJ5KTpub3QoLm9wLWFjdGl2ZSwgLm9wLWJ0bik6Zm9jdXMtdmlzaWJsZSwgOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+IGRldGFpbHMgPiBzdW1tYXJ5Om5vdCgub3AtbWVudS10aXRsZSkpOm5vdChzdW1tYXJ5LCAub3AtYWN0aXZlLCAub3AtYnRuKS5vcC1mb2N1cywgOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+IGRldGFpbHMgPiBzdW1tYXJ5Om5vdCgub3AtbWVudS10aXRsZSkpOm5vdChzdW1tYXJ5LCAub3AtYWN0aXZlLCAub3AtYnRuKTpmb2N1cywgOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+IGRldGFpbHMgPiBzdW1tYXJ5Om5vdCgub3AtbWVudS10aXRsZSkpOmlzKHN1bW1hcnkpOm5vdCgub3AtYWN0aXZlLCAub3AtYnRuKTpmb2N1cy12aXNpYmxlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4xKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtbWVudSBsaSA+ICo6bm90KHVsLCAub3AtbWVudS10aXRsZSwgZGV0YWlscywgLm9wLWJ0bik6YWN0aXZlLFxuLm9wLW1lbnUgbGkgPiAqOm5vdCh1bCwgLm9wLW1lbnUtdGl0bGUsIGRldGFpbHMsIC5vcC1idG4pLm9wLWFjdGl2ZSxcbi5vcC1tZW51IGxpID4gZGV0YWlscyA+IHN1bW1hcnk6YWN0aXZlIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stbmMsb2tsY2godmFyKC0tbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpID4gZGV0YWlscyA+IHN1bW1hcnkpOjotd2Via2l0LWRldGFpbHMtbWFya2VyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpID4gZGV0YWlscyA+IHN1bW1hcnkpOmFmdGVyLFxuLm9wLW1lbnUgOndoZXJlKGxpID4gLm9wLW1lbnUtZHJvcGRvd24tdG9nZ2xlKTphZnRlciB7XG4gIGp1c3RpZnktc2VsZjogZW5kO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLXRvcDogLTAuNXJlbTtcbiAgaGVpZ2h0OiAwLjVyZW07XG4gIHdpZHRoOiAwLjVyZW07XG4gIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBtYXJnaW4tdG9wO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgY29udGVudDogXCJcIjtcbiAgdHJhbnNmb3JtLW9yaWdpbjogNzUlIDc1JTtcbiAgYm94LXNoYWRvdzogMnB4IDJweDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaSA+IGRldGFpbHNbb3Blbl0gPiBzdW1tYXJ5KTphZnRlcixcbi5vcC1tZW51IDp3aGVyZShsaSA+IC5vcC1tZW51LWRyb3Bkb3duLXRvZ2dsZS5vcC1tZW51LWRyb3Bkb3duLXNob3cpOmFmdGVyIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMjI1ZGVnKTtcbiAgbWFyZ2luLXRvcDogMDtcbn1cclxuLm9wLW1vY2t1cC1icm93c2VyIC5vcC1tb2NrdXAtYnJvd3Nlci10b29sYmFyIC5vcC1pbnB1dCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbiAgZGlzcGxheTogYmxvY2s7XG4gIGhlaWdodDogMS43NXJlbTtcbiAgd2lkdGg6IDI0cmVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgcGFkZGluZy1sZWZ0OiAycmVtO1xuICBkaXJlY3Rpb246IGx0cjtcbn1cclxuLm9wLW1vY2t1cC1icm93c2VyIC5vcC1tb2NrdXAtYnJvd3Nlci10b29sYmFyIC5vcC1pbnB1dDpiZWZvcmUge1xuICBjb250ZW50OiBcIlwiO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDAuNXJlbTtcbiAgdG9wOiA1MCU7XG4gIGFzcGVjdC1yYXRpbzogMSAvIDE7XG4gIGhlaWdodDogMC43NXJlbTtcbiAgLS10dy10cmFuc2xhdGUteTogLTUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgYm9yZGVyLXdpZHRoOiAycHg7XG4gIGJvcmRlci1jb2xvcjogY3VycmVudENvbG9yO1xuICBvcGFjaXR5OiAwLjY7XG59XHJcbi5vcC1tb2NrdXAtYnJvd3NlciAub3AtbW9ja3VwLWJyb3dzZXItdG9vbGJhciAub3AtaW5wdXQ6YWZ0ZXIge1xuICBjb250ZW50OiBcIlwiO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDEuMjVyZW07XG4gIHRvcDogNTAlO1xuICBoZWlnaHQ6IDAuNXJlbTtcbiAgLS10dy10cmFuc2xhdGUteTogMjUlO1xuICAtLXR3LXJvdGF0ZTogLTQ1ZGVnO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIG9wYWNpdHk6IDAuNjtcbn1cclxuLm9wLW1vZGFsOm5vdChkaWFsb2c6bm90KC5vcC1tb2RhbC1vcGVuKSksXG4gIC5vcC1tb2RhbDo6YmFja2Ryb3Age1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwNjtcbiAgYW5pbWF0aW9uOiBtb2RhbC1wb3AgMC4ycyBlYXNlLW91dDtcbn1cclxuLm9wLW1vZGFsLW9wZW4gLm9wLW1vZGFsLWJveCxcbi5vcC1tb2RhbC10b2dnbGU6Y2hlY2tlZCArIC5vcC1tb2RhbCAub3AtbW9kYWwtYm94LFxuLm9wLW1vZGFsOnRhcmdldCAub3AtbW9kYWwtYm94LFxuLm9wLW1vZGFsW29wZW5dIC5vcC1tb2RhbC1ib3gge1xuICAtLXR3LXRyYW5zbGF0ZS15OiAwcHg7XG4gIC0tdHctc2NhbGUteDogMTtcbiAgLS10dy1zY2FsZS15OiAxO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbn1cclxuLm9wLW1vZGFsLWFjdGlvbiA+IDpub3QoW2hpZGRlbl0pIH4gOm5vdChbaGlkZGVuXSkge1xuICAtLXR3LXNwYWNlLXgtcmV2ZXJzZTogMDtcbiAgbWFyZ2luLXJpZ2h0OiBjYWxjKDAuNXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO1xuICBtYXJnaW4tbGVmdDogY2FsYygwLjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKSk7XG59XHJcbkBrZXlmcmFtZXMgbW9kYWwtcG9wIHtcblxuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxufVxyXG5Aa2V5ZnJhbWVzIHByb2dyZXNzLWxvYWRpbmcge1xuXG4gIDUwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbi14OiAtMTE1JTtcbiAgfVxufVxyXG4ub3AtcmFkaW86Zm9jdXMge1xuICBib3gtc2hhZG93OiBub25lO1xufVxyXG4ub3AtcmFkaW86Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8xKSk7XG59XHJcbi5vcC1yYWRpbzpjaGVja2VkLFxuICAub3AtcmFkaW9bYXJpYS1jaGVja2VkPVwidHJ1ZVwiXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIGFuaW1hdGlvbjogcmFkaW9tYXJrIHZhcigtLWFuaW1hdGlvbi1pbnB1dCwgMC4ycykgZWFzZS1vdXQ7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDRweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0LFxuICAgICAgMCAwIDAgNHB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQ7XG59XHJcbi5vcC1yYWRpbzpkaXNhYmxlZCB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIG9wYWNpdHk6IDAuMjtcbn1cclxuQGtleWZyYW1lcyByYWRpb21hcmsge1xuXG4gIDAlIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAxMnB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQsXG4gICAgICAwIDAgMCAxMnB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQ7XG4gIH1cblxuICA1MCUge1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0LFxuICAgICAgMCAwIDAgM3B4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQ7XG4gIH1cblxuICAxMDAlIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCA0cHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldCxcbiAgICAgIDAgMCAwIDRweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0O1xuICB9XG59XHJcbkBrZXlmcmFtZXMgcmF0aW5nLXBvcCB7XG5cbiAgMCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMC4xMjVlbSk7XG4gIH1cblxuICA0MCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMC4xMjVlbSk7XG4gIH1cblxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG4gIH1cbn1cclxuLm9wLXNlbGVjdC1ib3JkZXJlZCB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3Atc2VsZWN0OmZvY3VzIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLXNlbGVjdC1kaXNhYmxlZCxcbiAgLm9wLXNlbGVjdDpkaXNhYmxlZCxcbiAgLm9wLXNlbGVjdFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjQpKTtcbn1cclxuLm9wLXNlbGVjdC1kaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC1zZWxlY3Q6ZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3Atc2VsZWN0W2Rpc2FibGVkXTo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eTogMC4yO1xufVxyXG4ub3Atc2VsZWN0LW11bHRpcGxlLFxuICAub3Atc2VsZWN0W211bHRpcGxlXSxcbiAgLm9wLXNlbGVjdFtzaXplXS5vcC1zZWxlY3Q6bm90KFtzaXplPVwiMVwiXSkge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC1zZWxlY3Qge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjYWxjKDAlICsgMTJweCkgY2FsYygxcHggKyA1MCUpLFxuICAgIGNhbGMoMCUgKyAxNnB4KSBjYWxjKDFweCArIDUwJSk7XG59XHJcbkBrZXlmcmFtZXMgc2tlbGV0b24ge1xuXG4gIGZyb20ge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDE1MCU7XG4gIH1cblxuICB0byB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwJTtcbiAgfVxufVxyXG4ub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmZvY3VzLXZpc2libGUge1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xufVxyXG4ub3AtdGFiOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSksIC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCkge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG59XHJcbi5vcC10YWI6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC10YWI6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtNXB4O1xufVxyXG4ub3AtdGFiLWRpc2FibGVkLFxuICAub3AtdGFiW2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtdGFicy1ib3JkZXJlZCA+IC5vcC10YWIge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMC4yO1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICBib3JkZXItYm90dG9tLXdpZHRoOiBjYWxjKHZhcigtLXRhYi1ib3JkZXIsIDFweCkgKyAxcHgpO1xufVxyXG4ub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiIHtcbiAgYm9yZGVyOiB2YXIoLS10YWItYm9yZGVyLCAxcHgpIHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItd2lkdGg6IDAgMCB2YXIoLS10YWItYm9yZGVyLCAxcHgpIDA7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IHZhcigtLXRhYi1yYWRpdXMsIDAuNXJlbSk7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiB2YXIoLS10YWItcmFkaXVzLCAwLjVyZW0pO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS10YWItYm9yZGVyLWNvbG9yKTtcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS10YWItcGFkZGluZywgMXJlbSk7XG4gIHBhZGRpbmctdG9wOiB2YXIoLS10YWItYm9yZGVyLCAxcHgpO1xufVxyXG4ub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSksIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10YWItYmcpO1xuICBib3JkZXItd2lkdGg6IHZhcigtLXRhYi1ib3JkZXIsIDFweCkgdmFyKC0tdGFiLWJvcmRlciwgMXB4KSAwIHZhcigtLXRhYi1ib3JkZXIsIDFweCk7XG4gIGJvcmRlci1pbmxpbmUtc3RhcnQtY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpO1xuICBib3JkZXItaW5saW5lLWVuZC1jb2xvcjogdmFyKC0tdGFiLWJvcmRlci1jb2xvcik7XG4gIGJvcmRlci10b3AtY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogY2FsYyh2YXIoLS10YWItcGFkZGluZywgMXJlbSkgLSB2YXIoLS10YWItYm9yZGVyLCAxcHgpKTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiBjYWxjKHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKSAtIHZhcigtLXRhYi1ib3JkZXIsIDFweCkpO1xuICBwYWRkaW5nLWJvdHRvbTogdmFyKC0tdGFiLWJvcmRlciwgMXB4KTtcbiAgcGFkZGluZy10b3A6IDA7XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpiZWZvcmUsIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6YmVmb3JlIHtcbiAgei1pbmRleDogMTtcbiAgY29udGVudDogXCJcIjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IGNhbGMoMTAwJSArIHZhcigtLXRhYi1yYWRpdXMsIDAuNXJlbSkgKiAyKTtcbiAgaGVpZ2h0OiB2YXIoLS10YWItcmFkaXVzLCAwLjVyZW0pO1xuICBib3R0b206IDA7XG4gIGJhY2tncm91bmQtc2l6ZTogdmFyKC0tdGFiLXJhZGl1cywgMC41cmVtKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIGxlZnQsXG4gICAgICAgIHRvcCByaWdodDtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgLS10YWItZ3JhZDogY2FsYyg2OSUgLSB2YXIoLS10YWItYm9yZGVyLCAxcHgpKTtcbiAgLS1yYWRpdXMtc3RhcnQ6IHJhZGlhbC1ncmFkaWVudChcbiAgICAgICAgY2lyY2xlIGF0IHRvcCBsZWZ0LFxuICAgICAgICB0cmFuc3BhcmVudCB2YXIoLS10YWItZ3JhZCksXG4gICAgICAgIHZhcigtLXRhYi1ib3JkZXItY29sb3IpIGNhbGModmFyKC0tdGFiLWdyYWQpICsgMC4yNXB4KSxcbiAgICAgICAgdmFyKC0tdGFiLWJvcmRlci1jb2xvcikgY2FsYyh2YXIoLS10YWItZ3JhZCkgKyB2YXIoLS10YWItYm9yZGVyLCAxcHgpKSxcbiAgICAgICAgdmFyKC0tdGFiLWJnKSBjYWxjKHZhcigtLXRhYi1ncmFkKSArIHZhcigtLXRhYi1ib3JkZXIsIDFweCkgKyAwLjI1cHgpXG4gICAgICApO1xuICAtLXJhZGl1cy1lbmQ6IHJhZGlhbC1ncmFkaWVudChcbiAgICAgICAgY2lyY2xlIGF0IHRvcCByaWdodCxcbiAgICAgICAgdHJhbnNwYXJlbnQgdmFyKC0tdGFiLWdyYWQpLFxuICAgICAgICB2YXIoLS10YWItYm9yZGVyLWNvbG9yKSBjYWxjKHZhcigtLXRhYi1ncmFkKSArIDAuMjVweCksXG4gICAgICAgIHZhcigtLXRhYi1ib3JkZXItY29sb3IpIGNhbGModmFyKC0tdGFiLWdyYWQpICsgdmFyKC0tdGFiLWJvcmRlciwgMXB4KSksXG4gICAgICAgIHZhcigtLXRhYi1iZykgY2FsYyh2YXIoLS10YWItZ3JhZCkgKyB2YXIoLS10YWItYm9yZGVyLCAxcHgpICsgMC4yNXB4KVxuICAgICAgKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLXN0YXJ0KSwgdmFyKC0tcmFkaXVzLWVuZCk7XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpmaXJzdC1jaGlsZDpiZWZvcmUsIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6Zmlyc3QtY2hpbGQ6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLWVuZCk7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCByaWdodDtcbn1cclxuW2Rpcj1cInJ0bFwiXSAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSk6Zmlyc3QtY2hpbGQ6YmVmb3JlLCBbZGlyPVwicnRsXCJdIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6Zmlyc3QtY2hpbGQ6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLXN0YXJ0KTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIGxlZnQ7XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpsYXN0LWNoaWxkOmJlZm9yZSwgLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpsYXN0LWNoaWxkOmJlZm9yZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLXJhZGl1cy1zdGFydCk7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0O1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpsYXN0LWNoaWxkOmJlZm9yZSwgW2Rpcj1cInJ0bFwiXSAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpOmxhc3QtY2hpbGQ6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLWVuZCk7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCByaWdodDtcbn1cclxuLm9wLXRhYnMtbGlmdGVkXG4gID4gOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSlcbiAgKyAub3AtdGFicy1saWZ0ZWRcbiAgOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSk6YmVmb3JlLCAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpICsgLm9wLXRhYnMtbGlmdGVkIC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLWVuZCk7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCByaWdodDtcbn1cclxuLm9wLXRhYnMtYm94ZWQge1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgcGFkZGluZzogMC4yNXJlbTtcbn1cclxuLm9wLXRhYnMtYm94ZWQgLm9wLXRhYiB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xufVxyXG4ub3AtdGFicy1ib3hlZCA6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKSwgLm9wLXRhYnMtYm94ZWQgOmlzKGlucHV0OmNoZWNrZWQpIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcGMsb2tsY2godmFyKC0tcGMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRhYmxlOndoZXJlKFtkaXI9XCJydGxcIl0sIFtkaXI9XCJydGxcIl0gKikge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSh0aCwgdGQpIHtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICBwYWRkaW5nLXRvcDogMC43NXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNzVyZW07XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XHJcbi5vcC10YWJsZSB0ci5vcC1hY3RpdmUsXG4gIC5vcC10YWJsZSB0ci5vcC1hY3RpdmU6bnRoLWNoaWxkKGV2ZW4pLFxuICAub3AtdGFibGUtemVicmEgdGJvZHkgdHI6bnRoLWNoaWxkKGV2ZW4pIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSh0aGVhZCB0ciwgdGJvZHkgdHI6bm90KDpsYXN0LWNoaWxkKSwgdGJvZHkgdHI6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCkge1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSh0aGVhZCwgdGZvb3QpIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xuICBsaW5lLWhlaWdodDogMXJlbTtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjYpKTtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSh0Zm9vdCkge1xuICBib3JkZXItdG9wLXdpZHRoOiAxcHg7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci10b3AtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHRhcmVhLWJvcmRlcmVkIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC10ZXh0YXJlYTpmb2N1cyB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC10ZXh0YXJlYS1kaXNhYmxlZCxcbiAgLm9wLXRleHRhcmVhOmRpc2FibGVkLFxuICAub3AtdGV4dGFyZWFbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC40KSk7XG59XHJcbi5vcC10ZXh0YXJlYS1kaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC10ZXh0YXJlYTpkaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC10ZXh0YXJlYVtkaXNhYmxlZF06OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5KSkpO1xuICAtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuQGtleWZyYW1lcyB0b2FzdC1wb3Age1xuXG4gIDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOSk7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxufVxyXG5bZGlyPVwicnRsXCJdIC5vcC10b2dnbGUge1xuICAtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3I6IGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAqIDEpO1xufVxyXG4ub3AtdG9nZ2xlOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC10b2dnbGU6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XHJcbi5vcC10b2dnbGU6Y2hlY2tlZCxcbiAgLm9wLXRvZ2dsZVthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yOiB2YXIoLS1oYW5kbGVvZmZzZXQpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXRvZ2dsZTpjaGVja2VkLCBbZGlyPVwicnRsXCJdIC5vcC10b2dnbGVbYXJpYS1jaGVja2VkPVwidHJ1ZVwiXSB7XG4gIC0taGFuZGxlb2Zmc2V0Y2FsY3VsYXRvcjogY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpICogLTEpO1xufVxyXG4ub3AtdG9nZ2xlOmluZGV0ZXJtaW5hdGUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIGJveC1zaGFkb3c6IGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAvIDIpIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgICAgY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpIC8gLTIpIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgICAgMCAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldDtcbn1cclxuW2Rpcj1cInJ0bFwiXSAub3AtdG9nZ2xlOmluZGV0ZXJtaW5hdGUge1xuICBib3gtc2hhZG93OiBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgLyAyKSAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldCxcbiAgICAgICAgY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpIC8gLTIpIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgICAgICAwIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0O1xufVxyXG4ub3AtdG9nZ2xlLXNlY29uZGFyeTpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSk7XG59XHJcbi5vcC10b2dnbGUtc2Vjb25kYXJ5OmNoZWNrZWQsXG4gICAgLm9wLXRvZ2dsZS1zZWNvbmRhcnlbYXJpYS1jaGVja2VkPVwidHJ1ZVwiXSB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMC4xO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zYyxva2xjaCh2YXIoLS1zYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdG9nZ2xlOmRpc2FibGVkIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBvcGFjaXR5OiAwLjM7XG4gIC0tdG9nZ2xlaGFuZGxlYm9yZGVyOiAwIDAgMCAzcHggdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKSBpbnNldCxcbiAgICAgIHZhcigtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3IpIDAgMCAzcHggdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKSBpbnNldDtcbn1cclxuLm5vLWFuaW1hdGlvbiB7XG4gIC0tYnRuLWZvY3VzLXNjYWxlOiAxO1xuICAtLWFuaW1hdGlvbi1idG46IDA7XG4gIC0tYW5pbWF0aW9uLWlucHV0OiAwO1xufVxyXG4ub3AtYnRuLXhzIHtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIG1pbi1oZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNXJlbTtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xufVxyXG4ub3AtYnRuLXNtIHtcbiAgaGVpZ2h0OiAycmVtO1xuICBtaW4taGVpZ2h0OiAycmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG59XHJcbi5vcC1idG4tc3F1YXJlOndoZXJlKC5vcC1idG4teHMpIHtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAxLjVyZW07XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm9wLWJ0bi1zbSkge1xuICBoZWlnaHQ6IDJyZW07XG4gIHdpZHRoOiAycmVtO1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tc3F1YXJlOndoZXJlKC5vcC1idG4tbWQpIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICB3aWR0aDogM3JlbTtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLXNxdWFyZTp3aGVyZSgub3AtYnRuLWxnKSB7XG4gIGhlaWdodDogNHJlbTtcbiAgd2lkdGg6IDRyZW07XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm9wLWJ0bi14cykge1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgd2lkdGg6IDEuNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tY2lyY2xlOndoZXJlKC5vcC1idG4tc20pIHtcbiAgaGVpZ2h0OiAycmVtO1xuICB3aWR0aDogMnJlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tY2lyY2xlOndoZXJlKC5vcC1idG4tbWQpIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICB3aWR0aDogM3JlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tY2lyY2xlOndoZXJlKC5vcC1idG4tbGcpIHtcbiAgaGVpZ2h0OiA0cmVtO1xuICB3aWR0aDogNHJlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBwYWRkaW5nOiAwcHg7XG59XHJcblt0eXBlPVwiY2hlY2tib3hcIl0ub3AtY2hlY2tib3gteHMge1xuICBoZWlnaHQ6IDFyZW07XG4gIHdpZHRoOiAxcmVtO1xufVxyXG5bdHlwZT1cImNoZWNrYm94XCJdLm9wLWNoZWNrYm94LXNtIHtcbiAgaGVpZ2h0OiAxLjI1cmVtO1xuICB3aWR0aDogMS4yNXJlbTtcbn1cclxuLm9wLWZpbGUtaW5wdXQtc20ge1xuICBoZWlnaHQ6IDJyZW07XG4gIHBhZGRpbmctaW5saW5lLWVuZDogMC43NXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1zbTo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24ge1xuICBtYXJnaW4tcmlnaHQ6IDAuNzVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG59XHJcbi5vcC1maWxlLWlucHV0LXNtOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbiB7XG4gIG1hcmdpbi1yaWdodDogMC43NXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbn1cclxuLm9wLWlucHV0LXhzIHtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHBhZGRpbmctbGVmdDogMC41cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVyZW07XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDFyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjYyNTtcbn1cclxuLm9wLWlucHV0LXNtIHtcbiAgaGVpZ2h0OiAycmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAycmVtO1xufVxyXG4ub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsIHtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCAub3Atam9pbi1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCksXG4gIC5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwgKjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCAub3Atam9pbi1pdGVtOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksXG4gIC5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwgKjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsIHtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbn1cclxuLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsIC5vcC1qb2luLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSxcbiAgLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsICo6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1qb2luLm9wLWpvaW4taG9yaXpvbnRhbCAub3Atam9pbi1pdGVtOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksXG4gIC5vcC1qb2luLm9wLWpvaW4taG9yaXpvbnRhbCAqOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG5bdHlwZT1cInJhZGlvXCJdLm9wLXJhZGlvLXhzIHtcbiAgaGVpZ2h0OiAxcmVtO1xuICB3aWR0aDogMXJlbTtcbn1cclxuLm9wLXNlbGVjdC1zbSB7XG4gIGhlaWdodDogMnJlbTtcbiAgbWluLWhlaWdodDogMnJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAycmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMnJlbTtcbn1cclxuW2Rpcj1cInJ0bFwiXSAub3Atc2VsZWN0LXNtIHtcbiAgcGFkZGluZy1sZWZ0OiAycmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjc1cmVtO1xufVxyXG4ub3AtdGFicy1tZCA6d2hlcmUoLm9wLXRhYikge1xuICBoZWlnaHQ6IDJyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgLS10YWItcGFkZGluZzogMXJlbTtcbn1cclxuLm9wLXRhYnMtbGcgOndoZXJlKC5vcC10YWIpIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICBmb250LXNpemU6IDEuMTI1cmVtO1xuICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIC0tdGFiLXBhZGRpbmc6IDEuMjVyZW07XG59XHJcbi5vcC10YWJzLXNtIDp3aGVyZSgub3AtdGFiKSB7XG4gIGhlaWdodDogMS41cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogLjc1cmVtO1xuICAtLXRhYi1wYWRkaW5nOiAwLjc1cmVtO1xufVxyXG4ub3AtdGFicy14cyA6d2hlcmUoLm9wLXRhYikge1xuICBoZWlnaHQ6IDEuMjVyZW07XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgbGluZS1oZWlnaHQ6IC43NXJlbTtcbiAgLS10YWItcGFkZGluZzogMC41cmVtO1xufVxyXG4ub3AtY2FyZC1jb21wYWN0IC5vcC1jYXJkLWJvZHkge1xuICBwYWRkaW5nOiAxcmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbn1cclxuLm9wLWNhcmQtY29tcGFjdCAub3AtY2FyZC10aXRsZSB7XG4gIG1hcmdpbi1ib3R0b206IDAuMjVyZW07XG59XHJcbi5vcC1jYXJkLW5vcm1hbCAub3AtY2FyZC1ib2R5IHtcbiAgcGFkZGluZzogdmFyKC0tcGFkZGluZy1jYXJkLCAycmVtKTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMS41cmVtO1xufVxyXG4ub3AtY2FyZC1ub3JtYWwgLm9wLWNhcmQtdGl0bGUge1xuICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtO1xufVxyXG4ub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsID4gOndoZXJlKCo6bm90KDpmaXJzdC1jaGlsZCkpIHtcbiAgbWFyZ2luLWxlZnQ6IDBweDtcbiAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIG1hcmdpbi10b3A6IC0xcHg7XG59XHJcbi5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwgPiA6d2hlcmUoKjpub3QoOmZpcnN0LWNoaWxkKSk6aXMoLm9wLWJ0bikge1xuICBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWJvcmRlci1idG4pICogLTEpO1xufVxyXG4ub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwgPiA6d2hlcmUoKjpub3QoOmZpcnN0LWNoaWxkKSkge1xuICBtYXJnaW4tdG9wOiAwcHg7XG4gIG1hcmdpbi1ib3R0b206IDBweDtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogLTFweDtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsID4gOndoZXJlKCo6bm90KDpmaXJzdC1jaGlsZCkpOmlzKC5vcC1idG4pIHtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogY2FsYyh2YXIoLS1ib3JkZXItYnRuKSAqIC0xKTtcbn1cclxuLm9wLW1lbnUtc20gOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUpKSwgLm9wLW1lbnUtc20gOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKSB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gIHBhZGRpbmctdG9wOiAwLjI1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC4yNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5vcC1tZW51LXNtIC5vcC1tZW51LXRpdGxlIHtcbiAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xufVxyXG4ub3AtbW9kYWwtdG9wIDp3aGVyZSgub3AtbW9kYWwtYm94KSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IG5vbmU7XG4gIC0tdHctdHJhbnNsYXRlLXk6IC0yLjVyZW07XG4gIC0tdHctc2NhbGUteDogMTtcbiAgLS10dy1zY2FsZS15OiAxO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7XG59XHJcbi5vcC1tb2RhbC1taWRkbGUgOndoZXJlKC5vcC1tb2RhbC1ib3gpIHtcbiAgd2lkdGg6IDkxLjY2NjY2NyU7XG4gIG1heC13aWR0aDogMzJyZW07XG4gIC0tdHctdHJhbnNsYXRlLXk6IDBweDtcbiAgLS10dy1zY2FsZS14OiAuOTtcbiAgLS10dy1zY2FsZS15OiAuOTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xufVxyXG4ub3AtbW9kYWwtYm90dG9tIDp3aGVyZSgub3AtbW9kYWwtYm94KSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IG5vbmU7XG4gIC0tdHctdHJhbnNsYXRlLXk6IDIuNXJlbTtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDBweDtcbn1cclxuLnNyLW9ubHkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IC0xcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGJvcmRlci13aWR0aDogMDtcbn1cclxuLnBvaW50ZXItZXZlbnRzLW5vbmUge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cclxuLnZpc2libGUge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxyXG4uZml4ZWQge1xuICBwb3NpdGlvbjogZml4ZWQ7XG59XHJcbi5hYnNvbHV0ZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cclxuLnJlbGF0aXZlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxyXG4uc3RpY2t5IHtcbiAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5O1xuICBwb3NpdGlvbjogc3RpY2t5O1xufVxyXG4uaW5zZXQtMCB7XG4gIGluc2V0OiAwcHg7XG59XHJcbi4tYm90dG9tLVxcXFxbMTFweFxcXFxdIHtcbiAgYm90dG9tOiAtMTFweDtcbn1cclxuLi1ib3R0b20tXFxcXFsxcHhcXFxcXSB7XG4gIGJvdHRvbTogLTFweDtcbn1cclxuLi1yaWdodC0xIHtcbiAgcmlnaHQ6IC0wLjI1cmVtO1xufVxyXG4uLXJpZ2h0LVxcXFxbMTJweFxcXFxdIHtcbiAgcmlnaHQ6IC0xMnB4O1xufVxyXG4uLXJpZ2h0LVxcXFxbMTNweFxcXFxdIHtcbiAgcmlnaHQ6IC0xM3B4O1xufVxyXG4uLXJpZ2h0LVxcXFxbMXB4XFxcXF0ge1xuICByaWdodDogLTFweDtcbn1cclxuLmJvdHRvbS0wIHtcbiAgYm90dG9tOiAwcHg7XG59XHJcbi5ib3R0b20tNCB7XG4gIGJvdHRvbTogMXJlbTtcbn1cclxuLmxlZnQtMCB7XG4gIGxlZnQ6IDBweDtcbn1cclxuLmxlZnQtMVxcXFwvMiB7XG4gIGxlZnQ6IDUwJTtcbn1cclxuLnJpZ2h0LTAge1xuICByaWdodDogMHB4O1xufVxyXG4ucmlnaHQtMSB7XG4gIHJpZ2h0OiAwLjI1cmVtO1xufVxyXG4ucmlnaHQtMiB7XG4gIHJpZ2h0OiAwLjVyZW07XG59XHJcbi5yaWdodC0zIHtcbiAgcmlnaHQ6IDAuNzVyZW07XG59XHJcbi5yaWdodC00IHtcbiAgcmlnaHQ6IDFyZW07XG59XHJcbi5yaWdodC01IHtcbiAgcmlnaHQ6IDEuMjVyZW07XG59XHJcbi5yaWdodC1cXFxcWzEwcHhcXFxcXSB7XG4gIHJpZ2h0OiAxMHB4O1xufVxyXG4udG9wLTAge1xuICB0b3A6IDBweDtcbn1cclxuLnRvcC0xIHtcbiAgdG9wOiAwLjI1cmVtO1xufVxyXG4udG9wLTIge1xuICB0b3A6IDAuNXJlbTtcbn1cclxuLnRvcC0yMCB7XG4gIHRvcDogNXJlbTtcbn1cclxuLnRvcC0zIHtcbiAgdG9wOiAwLjc1cmVtO1xufVxyXG4udG9wLVxcXFxbMXB4XFxcXF0ge1xuICB0b3A6IDFweDtcbn1cclxuLnRvcC1cXFxcWzJcXFxcLjU1cmVtXFxcXF0ge1xuICB0b3A6IDIuNTVyZW07XG59XHJcbi50b3AtXFxcXFs1MFxcXFwlXFxcXF0ge1xuICB0b3A6IDUwJTtcbn1cclxuLnRvcC1hdXRvIHtcbiAgdG9wOiBhdXRvO1xufVxyXG4uLXotXFxcXFsxXFxcXF0ge1xuICB6LWluZGV4OiAtMTtcbn1cclxuLnotMTAge1xuICB6LWluZGV4OiAxMDtcbn1cclxuLnotMjAge1xuICB6LWluZGV4OiAyMDtcbn1cclxuLnotMzAge1xuICB6LWluZGV4OiAzMDtcbn1cclxuLnotNDAge1xuICB6LWluZGV4OiA0MDtcbn1cclxuLnotNTAge1xuICB6LWluZGV4OiA1MDtcbn1cclxuLnotXFxcXFsxMDAwXFxcXF0ge1xuICB6LWluZGV4OiAxMDAwO1xufVxyXG4uei1cXFxcWzEwMFxcXFxdIHtcbiAgei1pbmRleDogMTAwO1xufVxyXG4uei1cXFxcWzEzMDBcXFxcXSB7XG4gIHotaW5kZXg6IDEzMDA7XG59XHJcbi56LVxcXFxbMTk5OVxcXFxdIHtcbiAgei1pbmRleDogMTk5OTtcbn1cclxuLnotXFxcXFsxXFxcXF0ge1xuICB6LWluZGV4OiAxO1xufVxyXG4uei1cXFxcWzIwMFxcXFxdIHtcbiAgei1pbmRleDogMjAwO1xufVxyXG4uei1cXFxcWzIwXFxcXF0ge1xuICB6LWluZGV4OiAyMDtcbn1cclxuLnotXFxcXFszMFxcXFxdIHtcbiAgei1pbmRleDogMzA7XG59XHJcbi56LVxcXFxbNDQ4XFxcXF0ge1xuICB6LWluZGV4OiA0NDg7XG59XHJcbi56LVxcXFxbNTAwXFxcXF0ge1xuICB6LWluZGV4OiA1MDA7XG59XHJcbi56LVxcXFxbNTAxXFxcXF0ge1xuICB6LWluZGV4OiA1MDE7XG59XHJcbi56LVxcXFxbNzBcXFxcXSB7XG4gIHotaW5kZXg6IDcwO1xufVxyXG4uei1cXFxcWzk5OVxcXFxdIHtcbiAgei1pbmRleDogOTk5O1xufVxyXG4uei1cXFxcWzk5XFxcXF0ge1xuICB6LWluZGV4OiA5OTtcbn1cclxuLm9yZGVyLWxhc3Qge1xuICBvcmRlcjogOTk5OTtcbn1cclxuLmNvbC1zcGFuLTEyIHtcbiAgZ3JpZC1jb2x1bW46IHNwYW4gMTIgLyBzcGFuIDEyO1xufVxyXG4ubS0xIHtcbiAgbWFyZ2luOiAwLjI1cmVtO1xufVxyXG4ubS0yIHtcbiAgbWFyZ2luOiAwLjVyZW07XG59XHJcbi5tLVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luOiAxMHB4O1xufVxyXG4ubS1cXFxcWzE1cHhcXFxcXSB7XG4gIG1hcmdpbjogMTVweDtcbn1cclxuLm0tXFxcXFsyMHB4XFxcXF0ge1xuICBtYXJnaW46IDIwcHg7XG59XHJcbi5tLVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW46IDJweDtcbn1cclxuLm0tXFxcXFs0cHhcXFxcXSB7XG4gIG1hcmdpbjogNHB4O1xufVxyXG4ubXgtMSB7XG4gIG1hcmdpbi1sZWZ0OiAwLjI1cmVtO1xuICBtYXJnaW4tcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5teC0yIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG59XHJcbi5teC0zIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNzVyZW07XG4gIG1hcmdpbi1yaWdodDogMC43NXJlbTtcbn1cclxuLm14LTQge1xuICBtYXJnaW4tbGVmdDogMXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAxcmVtO1xufVxyXG4ubXgtXFxcXFsxMDBweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDEwMHB4O1xuICBtYXJnaW4tcmlnaHQ6IDEwMHB4O1xufVxyXG4ubXgtXFxcXFsyNVxcXFwlXFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMjUlO1xuICBtYXJnaW4tcmlnaHQ6IDI1JTtcbn1cclxuLm14LVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMnB4O1xuICBtYXJnaW4tcmlnaHQ6IDJweDtcbn1cclxuLm14LVxcXFxbM3B4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogM3B4O1xuICBtYXJnaW4tcmlnaHQ6IDNweDtcbn1cclxuLm14LVxcXFxbNHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNHB4O1xuICBtYXJnaW4tcmlnaHQ6IDRweDtcbn1cclxuLm14LVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNXB4O1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cclxuLm14LWF1dG8ge1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxyXG4ubXktMFxcXFwuNSB7XG4gIG1hcmdpbi10b3A6IDAuMTI1cmVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjEyNXJlbTtcbn1cclxuLm15LTEge1xuICBtYXJnaW4tdG9wOiAwLjI1cmVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjI1cmVtO1xufVxyXG4ubXktMiB7XG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xufVxyXG4ubXktMyB7XG4gIG1hcmdpbi10b3A6IDAuNzVyZW07XG4gIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XG59XHJcbi5teS00IHtcbiAgbWFyZ2luLXRvcDogMXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbn1cclxuLm15LVxcXFxbMTVweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMTVweDtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cclxuLm15LVxcXFxbMXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxcHg7XG4gIG1hcmdpbi1ib3R0b206IDFweDtcbn1cclxuLm15LVxcXFxbMjBweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cclxuLm15LVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAycHg7XG4gIG1hcmdpbi1ib3R0b206IDJweDtcbn1cclxuLm15LVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cclxuLm1iLTAge1xuICBtYXJnaW4tYm90dG9tOiAwcHg7XG59XHJcbi5tYi0wXFxcXC41IHtcbiAgbWFyZ2luLWJvdHRvbTogMC4xMjVyZW07XG59XHJcbi5tYi0xIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTtcbn1cclxuLm1iLTExIHtcbiAgbWFyZ2luLWJvdHRvbTogMi43NXJlbTtcbn1cclxuLm1iLTIge1xuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG59XHJcbi5tYi0zIHtcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLm1iLTQge1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xufVxyXG4ubWItXFxcXFswXFxcXC4zNXJlbVxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4zNXJlbTtcbn1cclxuLm1iLVxcXFxbMFxcXFwuNXJlbVxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xufVxyXG4ubWItXFxcXFswXFxcXC43NXJlbVxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLm1iLVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cclxuLm1iLVxcXFxbMTVweFxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cclxuLm1iLVxcXFxbMTZweFxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMTZweDtcbn1cclxuLm1iLVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG59XHJcbi5tYi1cXFxcWzVweFxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxyXG4ubWwtMFxcXFwuNSB7XG4gIG1hcmdpbi1sZWZ0OiAwLjEyNXJlbTtcbn1cclxuLm1sLTEge1xuICBtYXJnaW4tbGVmdDogMC4yNXJlbTtcbn1cclxuLm1sLTFcXFxcLjUge1xuICBtYXJnaW4tbGVmdDogMC4zNzVyZW07XG59XHJcbi5tbC0yIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNXJlbTtcbn1cclxuLm1sLTMge1xuICBtYXJnaW4tbGVmdDogMC43NXJlbTtcbn1cclxuLm1sLTQge1xuICBtYXJnaW4tbGVmdDogMXJlbTtcbn1cclxuLm1sLVxcXFxbMFxcXFwuNXJlbVxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNXJlbTtcbn1cclxuLm1sLVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG59XHJcbi5tbC1cXFxcWzEzcHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAxM3B4O1xufVxyXG4ubWwtXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG59XHJcbi5tbC1cXFxcWzNweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDNweDtcbn1cclxuLm1sLVxcXFxbNHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNHB4O1xufVxyXG4ubWwtXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA1cHg7XG59XHJcbi5tbC1cXFxcWzZweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDZweDtcbn1cclxuLm1sLVxcXFxbN3B4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogN3B4O1xufVxyXG4ubWwtXFxcXFs4cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA4cHg7XG59XHJcbi5tci0xIHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjI1cmVtO1xufVxyXG4ubXItMVxcXFwuNSB7XG4gIG1hcmdpbi1yaWdodDogMC4zNzVyZW07XG59XHJcbi5tci0yIHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG59XHJcbi5tci00IHtcbiAgbWFyZ2luLXJpZ2h0OiAxcmVtO1xufVxyXG4ubXItXFxcXFsxMHB4XFxcXF0ge1xuICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XHJcbi5tci1cXFxcWzJweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiAycHg7XG59XHJcbi5tci1cXFxcWzNweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiAzcHg7XG59XHJcbi5tci1cXFxcWzRweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiA0cHg7XG59XHJcbi5tci1cXFxcWzVweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiA1cHg7XG59XHJcbi5tci1cXFxcWzhweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiA4cHg7XG59XHJcbi5tdC0wIHtcbiAgbWFyZ2luLXRvcDogMHB4O1xufVxyXG4ubXQtMFxcXFwuNSB7XG4gIG1hcmdpbi10b3A6IDAuMTI1cmVtO1xufVxyXG4ubXQtMSB7XG4gIG1hcmdpbi10b3A6IDAuMjVyZW07XG59XHJcbi5tdC0yIHtcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xufVxyXG4ubXQtMlxcXFwuNSB7XG4gIG1hcmdpbi10b3A6IDAuNjI1cmVtO1xufVxyXG4ubXQtMyB7XG4gIG1hcmdpbi10b3A6IDAuNzVyZW07XG59XHJcbi5tdC00IHtcbiAgbWFyZ2luLXRvcDogMXJlbTtcbn1cclxuLm10LTYge1xuICBtYXJnaW4tdG9wOiAxLjVyZW07XG59XHJcbi5tdC1cXFxcWzBcXFxcLjRyZW1cXFxcXSB7XG4gIG1hcmdpbi10b3A6IDAuNHJlbTtcbn1cclxuLm10LVxcXFxbMFxcXFwuNXJlbVxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xufVxyXG4ubXQtXFxcXFswXFxcXC43NTByZW1cXFxcXSB7XG4gIG1hcmdpbi10b3A6IDAuNzUwcmVtO1xufVxyXG4ubXQtXFxcXFsxMHB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxMHB4O1xufVxyXG4ubXQtXFxcXFsxNHB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxNHB4O1xufVxyXG4ubXQtXFxcXFsxNXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxyXG4ubXQtXFxcXFsxcmVtXFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxcmVtO1xufVxyXG4ubXQtXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDJweDtcbn1cclxuLm10LVxcXFxbM3B4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAzcHg7XG59XHJcbi5tdC1cXFxcWzUwcHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDUwcHg7XG59XHJcbi5tdC1cXFxcWzVweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufVxyXG4ubXQtXFxcXFs2cHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDZweDtcbn1cclxuLm10LVxcXFxbOHB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XHJcbi5ibG9jayB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxyXG4uaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxyXG4uaW5saW5lIHtcbiAgZGlzcGxheTogaW5saW5lO1xufVxyXG4uZmxleCB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XHJcbi5pbmxpbmUtZmxleCB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxyXG4udGFibGUge1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cclxuLmdyaWQge1xuICBkaXNwbGF5OiBncmlkO1xufVxyXG4uY29udGVudHMge1xuICBkaXNwbGF5OiBjb250ZW50cztcbn1cclxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XHJcbi5oLTIge1xuICBoZWlnaHQ6IDAuNXJlbTtcbn1cclxuLmgtNCB7XG4gIGhlaWdodDogMXJlbTtcbn1cclxuLmgtNSB7XG4gIGhlaWdodDogMS4yNXJlbTtcbn1cclxuLmgtXFxcXFswXFxcXC41cHhcXFxcXSB7XG4gIGhlaWdodDogMC41cHg7XG59XHJcbi5oLVxcXFxbMVxcXFwuNHJlbVxcXFxdIHtcbiAgaGVpZ2h0OiAxLjRyZW07XG59XHJcbi5oLVxcXFxbMVxcXFwuN3JlbVxcXFxdIHtcbiAgaGVpZ2h0OiAxLjdyZW07XG59XHJcbi5oLVxcXFxbMTAwXFxcXCVcXFxcXSB7XG4gIGhlaWdodDogMTAwJTtcbn1cclxuLmgtXFxcXFsxMDBweFxcXFxdIHtcbiAgaGVpZ2h0OiAxMDBweDtcbn1cclxuLmgtXFxcXFsxMDB2aFxcXFxdIHtcbiAgaGVpZ2h0OiAxMDB2aDtcbn1cclxuLmgtXFxcXFsxMTFweFxcXFxdIHtcbiAgaGVpZ2h0OiAxMTFweDtcbn1cclxuLmgtXFxcXFsxMjBweFxcXFxdIHtcbiAgaGVpZ2h0OiAxMjBweDtcbn1cclxuLmgtXFxcXFsxNDBweFxcXFxdIHtcbiAgaGVpZ2h0OiAxNDBweDtcbn1cclxuLmgtXFxcXFsxNHB4XFxcXF0ge1xuICBoZWlnaHQ6IDE0cHg7XG59XHJcbi5oLVxcXFxbMTUwcHhcXFxcXSB7XG4gIGhlaWdodDogMTUwcHg7XG59XHJcbi5oLVxcXFxbMTVweFxcXFxdIHtcbiAgaGVpZ2h0OiAxNXB4O1xufVxyXG4uaC1cXFxcWzE5cHhcXFxcXSB7XG4gIGhlaWdodDogMTlweDtcbn1cclxuLmgtXFxcXFsxcHhcXFxcXSB7XG4gIGhlaWdodDogMXB4O1xufVxyXG4uaC1cXFxcWzIwMHB4XFxcXF0ge1xuICBoZWlnaHQ6IDIwMHB4O1xufVxyXG4uaC1cXFxcWzIwcHhcXFxcXSB7XG4gIGhlaWdodDogMjBweDtcbn1cclxuLmgtXFxcXFsyNTBweFxcXFxdIHtcbiAgaGVpZ2h0OiAyNTBweDtcbn1cclxuLmgtXFxcXFsyNXB4XFxcXF0ge1xuICBoZWlnaHQ6IDI1cHg7XG59XHJcbi5oLVxcXFxbMjZweFxcXFxdIHtcbiAgaGVpZ2h0OiAyNnB4O1xufVxyXG4uaC1cXFxcWzMwMHB4XFxcXF0ge1xuICBoZWlnaHQ6IDMwMHB4O1xufVxyXG4uaC1cXFxcWzMwcHhcXFxcXSB7XG4gIGhlaWdodDogMzBweDtcbn1cclxuLmgtXFxcXFszMTdweFxcXFxdIHtcbiAgaGVpZ2h0OiAzMTdweDtcbn1cclxuLmgtXFxcXFszMnB4XFxcXF0ge1xuICBoZWlnaHQ6IDMycHg7XG59XHJcbi5oLVxcXFxbMzVweFxcXFxdIHtcbiAgaGVpZ2h0OiAzNXB4O1xufVxyXG4uaC1cXFxcWzM4cHhcXFxcXSB7XG4gIGhlaWdodDogMzhweDtcbn1cclxuLmgtXFxcXFs0MHB4XFxcXF0ge1xuICBoZWlnaHQ6IDQwcHg7XG59XHJcbi5oLVxcXFxbNTAwcHhcXFxcXSB7XG4gIGhlaWdodDogNTAwcHg7XG59XHJcbi5oLVxcXFxbNTB2aFxcXFxdIHtcbiAgaGVpZ2h0OiA1MHZoO1xufVxyXG4uaC1cXFxcWzYwcHhcXFxcXSB7XG4gIGhlaWdodDogNjBweDtcbn1cclxuLmgtXFxcXFs2NnB4XFxcXF0ge1xuICBoZWlnaHQ6IDY2cHg7XG59XHJcbi5oLVxcXFxbNzVweFxcXFxdIHtcbiAgaGVpZ2h0OiA3NXB4O1xufVxyXG4uaC1cXFxcWzkwXFxcXCVcXFxcXSB7XG4gIGhlaWdodDogOTAlO1xufVxyXG4uaC1cXFxcWzk1XFxcXCVcXFxcXSB7XG4gIGhlaWdodDogOTUlO1xufVxyXG4uaC1mdWxsIHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxyXG4uaC1zY3JlZW4ge1xuICBoZWlnaHQ6IDEwMHZoO1xufVxyXG4ubWF4LWgtOTYge1xuICBtYXgtaGVpZ2h0OiAyNHJlbTtcbn1cclxuLm1heC1oLVxcXFxbMTAwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDEwMHB4O1xufVxyXG4ubWF4LWgtXFxcXFsxMDB2aFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMTAwdmg7XG59XHJcbi5tYXgtaC1cXFxcWzE4MHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAxODBweDtcbn1cclxuLm1heC1oLVxcXFxbMjEwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDIxMHB4O1xufVxyXG4ubWF4LWgtXFxcXFsyNTBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMjUwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzMwMHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAzMDBweDtcbn1cclxuLm1heC1oLVxcXFxbMzEwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDMxMHB4O1xufVxyXG4ubWF4LWgtXFxcXFszNDBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMzQwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzM1cHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDM1cHg7XG59XHJcbi5tYXgtaC1cXFxcWzM4cHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDM4cHg7XG59XHJcbi5tYXgtaC1cXFxcWzYwMHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiA2MDBweDtcbn1cclxuLm1heC1oLWZ1bGwge1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxyXG4ubWF4LWgtc2NyZWVuIHtcbiAgbWF4LWhlaWdodDogMTAwdmg7XG59XHJcbi5taW4taC1tYXgge1xuICBtaW4taGVpZ2h0OiAtd2Via2l0LW1heC1jb250ZW50O1xuICBtaW4taGVpZ2h0OiBtYXgtY29udGVudDtcbn1cclxuLm1pbi1oLXNjcmVlbiB7XG4gIG1pbi1oZWlnaHQ6IDEwMHZoO1xufVxyXG4udy0wIHtcbiAgd2lkdGg6IDBweDtcbn1cclxuLnctNCB7XG4gIHdpZHRoOiAxcmVtO1xufVxyXG4udy01IHtcbiAgd2lkdGg6IDEuMjVyZW07XG59XHJcbi53LTUyIHtcbiAgd2lkdGg6IDEzcmVtO1xufVxyXG4udy05IHtcbiAgd2lkdGg6IDIuMjVyZW07XG59XHJcbi53LVxcXFxbMVxcXFwuNHJlbVxcXFxdIHtcbiAgd2lkdGg6IDEuNHJlbTtcbn1cclxuLnctXFxcXFsxXFxcXC43cmVtXFxcXF0ge1xuICB3aWR0aDogMS43cmVtO1xufVxyXG4udy1cXFxcWzEwMHB4XFxcXF0ge1xuICB3aWR0aDogMTAwcHg7XG59XHJcbi53LVxcXFxbMTBweFxcXFxdIHtcbiAgd2lkdGg6IDEwcHg7XG59XHJcbi53LVxcXFxbMTIwcHhcXFxcXSB7XG4gIHdpZHRoOiAxMjBweDtcbn1cclxuLnctXFxcXFsxNHB4XFxcXF0ge1xuICB3aWR0aDogMTRweDtcbn1cclxuLnctXFxcXFsxNTBweFxcXFxdIHtcbiAgd2lkdGg6IDE1MHB4O1xufVxyXG4udy1cXFxcWzE1cHhcXFxcXSB7XG4gIHdpZHRoOiAxNXB4O1xufVxyXG4udy1cXFxcWzE4XFxcXCVcXFxcXSB7XG4gIHdpZHRoOiAxOCU7XG59XHJcbi53LVxcXFxbMTgzcHhcXFxcXSB7XG4gIHdpZHRoOiAxODNweDtcbn1cclxuLnctXFxcXFsyMFxcXFwlXFxcXF0ge1xuICB3aWR0aDogMjAlO1xufVxyXG4udy1cXFxcWzIwMHB4XFxcXF0ge1xuICB3aWR0aDogMjAwcHg7XG59XHJcbi53LVxcXFxbMjIwcHhcXFxcXSB7XG4gIHdpZHRoOiAyMjBweDtcbn1cclxuLnctXFxcXFsyM1xcXFwlXFxcXF0ge1xuICB3aWR0aDogMjMlO1xufVxyXG4udy1cXFxcWzIzcHhcXFxcXSB7XG4gIHdpZHRoOiAyM3B4O1xufVxyXG4udy1cXFxcWzI1MHB4XFxcXF0ge1xuICB3aWR0aDogMjUwcHg7XG59XHJcbi53LVxcXFxbMjVweFxcXFxdIHtcbiAgd2lkdGg6IDI1cHg7XG59XHJcbi53LVxcXFxbMjZweFxcXFxdIHtcbiAgd2lkdGg6IDI2cHg7XG59XHJcbi53LVxcXFxbMzBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDMwJTtcbn1cclxuLnctXFxcXFszMHB4XFxcXF0ge1xuICB3aWR0aDogMzBweDtcbn1cclxuLnctXFxcXFszNXB4XFxcXF0ge1xuICB3aWR0aDogMzVweDtcbn1cclxuLnctXFxcXFs0MHB4XFxcXF0ge1xuICB3aWR0aDogNDBweDtcbn1cclxuLnctXFxcXFs0NTBweFxcXFxdIHtcbiAgd2lkdGg6IDQ1MHB4O1xufVxyXG4udy1cXFxcWzRyZW1cXFxcXSB7XG4gIHdpZHRoOiA0cmVtO1xufVxyXG4udy1cXFxcWzUwXFxcXCVcXFxcXSB7XG4gIHdpZHRoOiA1MCU7XG59XHJcbi53LVxcXFxbNTBweFxcXFxdIHtcbiAgd2lkdGg6IDUwcHg7XG59XHJcbi53LVxcXFxbNjBweFxcXFxdIHtcbiAgd2lkdGg6IDYwcHg7XG59XHJcbi53LVxcXFxbNjVweFxcXFxdIHtcbiAgd2lkdGg6IDY1cHg7XG59XHJcbi53LVxcXFxbNzBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDcwJTtcbn1cclxuLnctXFxcXFs3NXB4XFxcXF0ge1xuICB3aWR0aDogNzVweDtcbn1cclxuLnctXFxcXFs4MFxcXFwlXFxcXF0ge1xuICB3aWR0aDogODAlO1xufVxyXG4udy1cXFxcWzg3XFxcXCVcXFxcXSB7XG4gIHdpZHRoOiA4NyU7XG59XHJcbi53LVxcXFxbOTBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDkwJTtcbn1cclxuLnctXFxcXFs5MHB4XFxcXF0ge1xuICB3aWR0aDogOTBweDtcbn1cclxuLnctXFxcXFs5NVxcXFwlXFxcXF0ge1xuICB3aWR0aDogOTUlO1xufVxyXG4udy1hdXRvIHtcbiAgd2lkdGg6IGF1dG87XG59XHJcbi53LWZpdCB7XG4gIHdpZHRoOiAtd2Via2l0LWZpdC1jb250ZW50O1xuICB3aWR0aDogLW1vei1maXQtY29udGVudDtcbiAgd2lkdGg6IGZpdC1jb250ZW50O1xufVxyXG4udy1mdWxsIHtcbiAgd2lkdGg6IDEwMCU7XG59XHJcbi53LW1heCB7XG4gIHdpZHRoOiAtd2Via2l0LW1heC1jb250ZW50O1xuICB3aWR0aDogbWF4LWNvbnRlbnQ7XG59XHJcbi5taW4tdy01NiB7XG4gIG1pbi13aWR0aDogMTRyZW07XG59XHJcbi5taW4tdy1cXFxcWzMwMHB4XFxcXF0ge1xuICBtaW4td2lkdGg6IDMwMHB4O1xufVxyXG4ubWluLXctXFxcXFs0OHB4XFxcXF0ge1xuICBtaW4td2lkdGg6IDQ4cHg7XG59XHJcbi5taW4tdy1cXFxcWzkwXFxcXCVcXFxcXSB7XG4gIG1pbi13aWR0aDogOTAlO1xufVxyXG4ubWF4LXctNTYge1xuICBtYXgtd2lkdGg6IDE0cmVtO1xufVxyXG4ubWF4LXctXFxcXFsyMDBweFxcXFxdIHtcbiAgbWF4LXdpZHRoOiAyMDBweDtcbn1cclxuLm1heC13LVxcXFxbMjUwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogMjUwcHg7XG59XHJcbi5tYXgtdy1cXFxcWzI3MHB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDI3MHB4O1xufVxyXG4ubWF4LXctXFxcXFszNTBweFxcXFxdIHtcbiAgbWF4LXdpZHRoOiAzNTBweDtcbn1cclxuLm1heC13LVxcXFxbNDUwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogNDUwcHg7XG59XHJcbi5tYXgtdy1cXFxcWzQ1cHhcXFxcXSB7XG4gIG1heC13aWR0aDogNDVweDtcbn1cclxuLm1heC13LVxcXFxbNTAwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogNTAwcHg7XG59XHJcbi5tYXgtdy1zbSB7XG4gIG1heC13aWR0aDogMjRyZW07XG59XHJcbi5mbGV4LTEge1xuICBmbGV4OiAxIDEgMCU7XG59XHJcbi5mbGV4LW5vbmUge1xuICBmbGV4OiBub25lO1xufVxyXG4uZ3JvdyB7XG4gIGZsZXgtZ3JvdzogMTtcbn1cclxuLmJvcmRlci1jb2xsYXBzZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG59XHJcbi4tdHJhbnNsYXRlLXgtMVxcXFwvMiB7XG4gIC0tdHctdHJhbnNsYXRlLXg6IC01MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4uLXRyYW5zbGF0ZS15LTFcXFxcLzIge1xuICAtLXR3LXRyYW5zbGF0ZS15OiAtNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbn1cclxuLi10cmFuc2xhdGUteS1cXFxcWzUwXFxcXCVcXFxcXSB7XG4gIC0tdHctdHJhbnNsYXRlLXk6IC01MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4udHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcbi5jdXJzb3ItXFxcXFt1cmxcXFxcKFxcXFwnZGF0YVxcXFw6aW1hZ2VcXFxcL3BuZ1xcXFw7YmFzZTY0XFxcXDJjIGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4XFxcXC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBU0VsRVFWUjRuR05nd0FNa0pTVWJwS1NrT3ZDcElhVDVQeFNUYm9nVVFqTVlNd3hlSUlYbVZGSXhBOFVHRER5UUdnMERuSURpNkpLVWxDeEhNcUNlWkFPZ2hqU0FNRDVGQUtmZWFVUmRVRnhDQUFBQUFFbEZUa1N1UW1DQ1xcXFwnXFxcXClcXFxcMmMgX3BvaW50ZXJcXFxcXSB7XG4gIGN1cnNvcjogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pLCBwb2ludGVyO1xufVxyXG4uY3Vyc29yLWFsbC1zY3JvbGwge1xuICBjdXJzb3I6IGFsbC1zY3JvbGw7XG59XHJcbi5jdXJzb3ItY3Jvc3NoYWlyIHtcbiAgY3Vyc29yOiBjcm9zc2hhaXI7XG59XHJcbi5jdXJzb3ItZGVmYXVsdCB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cclxuLmN1cnNvci1wb2ludGVyIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxyXG4uY3Vyc29yLXByb2dyZXNzIHtcbiAgY3Vyc29yOiBwcm9ncmVzcztcbn1cclxuLnNlbGVjdC1ub25lIHtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cclxuLnJlc2l6ZS1ub25lIHtcbiAgcmVzaXplOiBub25lO1xufVxyXG4ucmVzaXplIHtcbiAgcmVzaXplOiBib3RoO1xufVxyXG4ubGlzdC1kaXNjIHtcbiAgbGlzdC1zdHlsZS10eXBlOiBkaXNjO1xufVxyXG4ubGlzdC1ub25lIHtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xufVxyXG4uZ3JpZC1jb2xzLTEge1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgxLCBtaW5tYXgoMCwgMWZyKSk7XG59XHJcbi5ncmlkLWNvbHMtMTIge1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgxMiwgbWlubWF4KDAsIDFmcikpO1xufVxyXG4uZ3JpZC1jb2xzLTIge1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7XG59XHJcbi5mbGV4LXJvdyB7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG59XHJcbi5mbGV4LWNvbCB7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XHJcbi5mbGV4LXdyYXAge1xuICBmbGV4LXdyYXA6IHdyYXA7XG59XHJcbi5pdGVtcy1zdGFydCB7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xufVxyXG4uaXRlbXMtY2VudGVyIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cclxuLml0ZW1zLXN0cmV0Y2gge1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cclxuLmp1c3RpZnktc3RhcnQge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG59XHJcbi5qdXN0aWZ5LWVuZCB7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG59XHJcbi5qdXN0aWZ5LWNlbnRlciB7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxyXG4uanVzdGlmeS1iZXR3ZWVuIHtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxyXG4uanVzdGlmeS1hcm91bmQge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbn1cclxuLmdhcC0wIHtcbiAgZ2FwOiAwcHg7XG59XHJcbi5nYXAtMFxcXFwuNSB7XG4gIGdhcDogMC4xMjVyZW07XG59XHJcbi5nYXAtMSB7XG4gIGdhcDogMC4yNXJlbTtcbn1cclxuLmdhcC0yIHtcbiAgZ2FwOiAwLjVyZW07XG59XHJcbi5nYXAtMyB7XG4gIGdhcDogMC43NXJlbTtcbn1cclxuLmdhcC00IHtcbiAgZ2FwOiAxcmVtO1xufVxyXG4uZ2FwLTUge1xuICBnYXA6IDEuMjVyZW07XG59XHJcbi5nYXAtOCB7XG4gIGdhcDogMnJlbTtcbn1cclxuLmdhcC1cXFxcWzEwcHhcXFxcXSB7XG4gIGdhcDogMTBweDtcbn1cclxuLmdhcC1cXFxcWzVweFxcXFxdIHtcbiAgZ2FwOiA1cHg7XG59XHJcbi5nYXAtXFxcXFs4cHhcXFxcXSB7XG4gIGdhcDogOHB4O1xufVxyXG4uZ2FwLXgtMiB7XG4gIGNvbHVtbi1nYXA6IDAuNXJlbTtcbn1cclxuLmdhcC14LTQge1xuICBjb2x1bW4tZ2FwOiAxcmVtO1xufVxyXG4uZ2FwLXgtNSB7XG4gIGNvbHVtbi1nYXA6IDEuMjVyZW07XG59XHJcbi5nYXAteC1cXFxcWzJweFxcXFxdIHtcbiAgY29sdW1uLWdhcDogMnB4O1xufVxyXG4uZ2FwLXgtXFxcXFs1cHhcXFxcXSB7XG4gIGNvbHVtbi1nYXA6IDVweDtcbn1cclxuLmdhcC15LTEge1xuICByb3ctZ2FwOiAwLjI1cmVtO1xufVxyXG4uZ2FwLXktMiB7XG4gIHJvdy1nYXA6IDAuNXJlbTtcbn1cclxuLmdhcC15LTMge1xuICByb3ctZ2FwOiAwLjc1cmVtO1xufVxyXG4uZ2FwLXktXFxcXFsycHhcXFxcXSB7XG4gIHJvdy1nYXA6IDJweDtcbn1cclxuLnBsYWNlLXNlbGYtY2VudGVyIHtcbiAgcGxhY2Utc2VsZjogY2VudGVyO1xufVxyXG4uc2VsZi1zdGFydCB7XG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG59XHJcbi5zZWxmLWNlbnRlciB7XG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcbn1cclxuLm92ZXJmbG93LWF1dG8ge1xuICBvdmVyZmxvdzogYXV0bztcbn1cclxuLm92ZXJmbG93LWhpZGRlbiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XHJcbi5vdmVyZmxvdy14LWF1dG8ge1xuICBvdmVyZmxvdy14OiBhdXRvO1xufVxyXG4ub3ZlcmZsb3cteS1hdXRvIHtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cclxuLm92ZXJmbG93LXgtc2Nyb2xsIHtcbiAgb3ZlcmZsb3cteDogc2Nyb2xsO1xufVxyXG4ub3ZlcmZsb3cteS1zY3JvbGwge1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XHJcbi50ZXh0LWVsbGlwc2lzIHtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XHJcbi53aGl0ZXNwYWNlLW5vd3JhcCB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XHJcbi53aGl0ZXNwYWNlLXByZS13cmFwIHtcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xufVxyXG4uYnJlYWstd29yZHMge1xuICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xufVxyXG4uYnJlYWstYWxsIHtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxyXG4ucm91bmRlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XG59XHJcbi5yb3VuZGVkLVxcXFxbMFxcXFwuMzUwcmVtXFxcXF0ge1xuICBib3JkZXItcmFkaXVzOiAwLjM1MHJlbTtcbn1cclxuLnJvdW5kZWQtXFxcXFsycHhcXFxcXSB7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cclxuLnJvdW5kZWQtYm94IHtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xufVxyXG4ucm91bmRlZC1mdWxsIHtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xufVxyXG4ucm91bmRlZC1sZyB7XG4gIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcbn1cclxuLnJvdW5kZWQtbWQge1xuICBib3JkZXItcmFkaXVzOiAwLjM3NXJlbTtcbn1cclxuLnJvdW5kZWQtbm9uZSB7XG4gIGJvcmRlci1yYWRpdXM6IDBweDtcbn1cclxuLnJvdW5kZWQtc20ge1xuICBib3JkZXItcmFkaXVzOiAwLjEyNXJlbTtcbn1cclxuLnJvdW5kZWQteGwge1xuICBib3JkZXItcmFkaXVzOiAwLjc1cmVtO1xufVxyXG4ucm91bmRlZC1yLW5vbmUge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4O1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMHB4O1xufVxyXG4uYm9yZGVyIHtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG59XHJcbi5ib3JkZXItMiB7XG4gIGJvcmRlci13aWR0aDogMnB4O1xufVxyXG4uYm9yZGVyLVxcXFxbMFxcXFwuMXB4XFxcXF0ge1xuICBib3JkZXItd2lkdGg6IDAuMXB4O1xufVxyXG4uYm9yZGVyLVxcXFxbMFxcXFwuMnB4XFxcXF0ge1xuICBib3JkZXItd2lkdGg6IDAuMnB4O1xufVxyXG4uYm9yZGVyLVxcXFxbMVxcXFwuNXB4XFxcXF0ge1xuICBib3JkZXItd2lkdGg6IDEuNXB4O1xufVxyXG4uYm9yZGVyLVxcXFxbMXB4XFxcXF0ge1xuICBib3JkZXItd2lkdGg6IDFweDtcbn1cclxuLmJvcmRlci1cXFxcWzJweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAycHg7XG59XHJcbi5ib3JkZXIteS1cXFxcWzFweFxcXFxdIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMXB4O1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7XG59XHJcbi5ib3JkZXItYi1cXFxcWzFweFxcXFxdIHtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLWItXFxcXFszcHhcXFxcXSB7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDNweDtcbn1cclxuLmJvcmRlci1yLVxcXFxbM3B4XFxcXF0ge1xuICBib3JkZXItcmlnaHQtd2lkdGg6IDNweDtcbn1cclxuLmJvcmRlci10LVxcXFxbMXB4XFxcXF0ge1xuICBib3JkZXItdG9wLXdpZHRoOiAxcHg7XG59XHJcbi5ib3JkZXItZGFzaGVkIHtcbiAgYm9yZGVyLXN0eWxlOiBkYXNoZWQ7XG59XHJcbi5ib3JkZXItbm9uZSB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjMDA3YmZmXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigwIDEyMyAyNTUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCMxODhhZTJcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDI0IDEzOCAyMjYgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCMzM2JiZmZcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDUxIDE4NyAyNTUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCM4Nzg3ODdcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDEzNSAxMzUgMTM1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjODg4XFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigxMzYgMTM2IDEzNiAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcIzhhOGE4YVxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMTM4IDEzOCAxMzggLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCNjZWNlY2VcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIwNiAyMDYgMjA2IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjZDZkM2QzXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyMTQgMjExIDIxMSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcI2ViZThlOFxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjM1IDIzMiAyMzIgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCNmMGE4YThcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDI0MCAxNjggMTY4IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW2dyYXlcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDEyOCAxMjggMTI4IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW3JlZFxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjU1IDAgMCAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItYmFzZS0yMDAge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLmJvcmRlci1iYXNlLTMwMCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4uYm9yZGVyLWJhc2UtY29udGVudCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4uYm9yZGVyLWJsYWNrIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMCAwIDAgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLWdyYXktMzAwIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLWdyYXktNDAwIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMTU2IDE2MyAxNzUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLWluZGlnby04MDAge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYig1NSA0OCAxNjMgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLXQtcHJpbWFyeSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci10b3AtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjMmVkOGI2XFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYig0NiAyMTYgMTgyIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcIzU3NjA4MVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoODcgOTYgMTI5IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcIzhhOGE4YVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTM4IDEzOCAxMzggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjOTNhM2RiXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxNDcgMTYzIDIxOSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCM5ZjlmOWZcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1OSAxNTkgMTU5IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcI0ZGRkZGRlxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjYjdiM2IzXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxODMgMTc5IDE3OSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNjY2NcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCAyMDQgMjA0IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcI2UzZTJlMVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI3IDIyNiAyMjUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjZTZmMmYyXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzAgMjQyIDI0MiAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNlNmYyZjJcXFxcXVxcXFwvNzAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjMwIDI0MiAyNDIgLyAwLjcpO1xufVxyXG4uYmctXFxcXFtcXFxcI2Y0YmViZVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQ0IDE5MCAxOTAgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjZmZmXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNmZmZmZmZcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctYmFzZS0xMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS0yMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS0zMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS1jb250ZW50IHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLmJnLWJsYWNrIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCAwIDAgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1ibGFja1xcXFwvMzAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCAwIDAgLyAwLjMpO1xufVxyXG4uYmctYmx1ZS01MDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctZ3JheS0yMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjkgMjMxIDIzNSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLWdyYXktMzAwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1ncmF5LTQwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctZ3JheS01MCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0OSAyNTAgMjUxIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctaW5oZXJpdCB7XG4gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XG59XHJcbi5iZy10cmFuc3BhcmVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxyXG4uYmctd2hpdGUge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLXdoaXRlXFxcXC8yMCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIDAuMik7XG59XHJcbi5iZy1iYXNlLWNvbnRlbnRcXFxcLzMwIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMykpO1xufVxyXG4uYmctb3BhY2l0eS0yMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC4yO1xufVxyXG4uYmctb3BhY2l0eS0yNSB7XG4gIC0tdHctYmctb3BhY2l0eTogMC4yNTtcbn1cclxuLmJnLW9wYWNpdHktMzAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuMztcbn1cclxuLmJnLW9wYWNpdHktNTAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuNTtcbn1cclxuLmJnLW9wYWNpdHktODAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuODtcbn1cclxuLmZpbGwtY3VycmVudCB7XG4gIGZpbGw6IGN1cnJlbnRDb2xvcjtcbn1cclxuLm9iamVjdC1jb250YWluIHtcbiAgb2JqZWN0LWZpdDogY29udGFpbjtcbn1cclxuLnAtMCB7XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLnAtMTQge1xuICBwYWRkaW5nOiAzLjVyZW07XG59XHJcbi5wLTIge1xuICBwYWRkaW5nOiAwLjVyZW07XG59XHJcbi5wLTMge1xuICBwYWRkaW5nOiAwLjc1cmVtO1xufVxyXG4ucC00IHtcbiAgcGFkZGluZzogMXJlbTtcbn1cclxuLnAtXFxcXFsxMHB4XFxcXF0ge1xuICBwYWRkaW5nOiAxMHB4O1xufVxyXG4ucC1cXFxcWzE1cHhcXFxcXSB7XG4gIHBhZGRpbmc6IDE1cHg7XG59XHJcbi5wLVxcXFxbMTZweFxcXFxdIHtcbiAgcGFkZGluZzogMTZweDtcbn1cclxuLnAtXFxcXFsxcHhcXFxcXSB7XG4gIHBhZGRpbmc6IDFweDtcbn1cclxuLnAtXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nOiAyMHB4O1xufVxyXG4ucC1cXFxcWzJweFxcXFxdIHtcbiAgcGFkZGluZzogMnB4O1xufVxyXG4ucC1cXFxcWzMwcHhcXFxcXSB7XG4gIHBhZGRpbmc6IDMwcHg7XG59XHJcbi5wLVxcXFxbM3B4XFxcXF0ge1xuICBwYWRkaW5nOiAzcHg7XG59XHJcbi5wLVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nOiA1cHg7XG59XHJcbi5wLVxcXFxbOHB4XFxcXF0ge1xuICBwYWRkaW5nOiA4cHg7XG59XHJcbi5weC0wIHtcbiAgcGFkZGluZy1sZWZ0OiAwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDBweDtcbn1cclxuLnB4LTIge1xuICBwYWRkaW5nLWxlZnQ6IDAuNXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC41cmVtO1xufVxyXG4ucHgtMyB7XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbn1cclxuLnB4LTQge1xuICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG59XHJcbi5weC02IHtcbiAgcGFkZGluZy1sZWZ0OiAxLjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDEuNXJlbTtcbn1cclxuLnB4LTcge1xuICBwYWRkaW5nLWxlZnQ6IDEuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDEuNzVyZW07XG59XHJcbi5weC04IHtcbiAgcGFkZGluZy1sZWZ0OiAycmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAycmVtO1xufVxyXG4ucHgtXFxcXFsxXFxcXC4yNXJlbVxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxLjI1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxLjI1cmVtO1xufVxyXG4ucHgtXFxcXFsxMHB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG59XHJcbi5weC1cXFxcWzEycHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMTJweDtcbiAgcGFkZGluZy1yaWdodDogMTJweDtcbn1cclxuLnB4LVxcXFxbMTNweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxM3B4O1xuICBwYWRkaW5nLXJpZ2h0OiAxM3B4O1xufVxyXG4ucHgtXFxcXFsxNXB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG59XHJcbi5weC1cXFxcWzIwcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMjBweDtcbiAgcGFkZGluZy1yaWdodDogMjBweDtcbn1cclxuLnB4LVxcXFxbMjVweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAyNXB4O1xuICBwYWRkaW5nLXJpZ2h0OiAyNXB4O1xufVxyXG4ucHgtXFxcXFszcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogM3B4O1xuICBwYWRkaW5nLXJpZ2h0OiAzcHg7XG59XHJcbi5weC1cXFxcWzQwcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogNDBweDtcbiAgcGFkZGluZy1yaWdodDogNDBweDtcbn1cclxuLnB4LVxcXFxbNHB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDRweDtcbiAgcGFkZGluZy1yaWdodDogNHB4O1xufVxyXG4ucHktMSB7XG4gIHBhZGRpbmctdG9wOiAwLjI1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC4yNXJlbTtcbn1cclxuLnB5LTFcXFxcLjUge1xuICBwYWRkaW5nLXRvcDogMC4zNzVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAwLjM3NXJlbTtcbn1cclxuLnB5LTEwIHtcbiAgcGFkZGluZy10b3A6IDIuNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDIuNXJlbTtcbn1cclxuLnB5LTIge1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xufVxyXG4ucHktMyB7XG4gIHBhZGRpbmctdG9wOiAwLjc1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLnB5LTQge1xuICBwYWRkaW5nLXRvcDogMXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDFyZW07XG59XHJcbi5weS1cXFxcW1xcXFwuNzVyZW1cXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAuNzVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAuNzVyZW07XG59XHJcbi5weS1cXFxcWzFcXFxcLjVweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDEuNXB4O1xuICBwYWRkaW5nLWJvdHRvbTogMS41cHg7XG59XHJcbi5weS1cXFxcWzEwcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAxMHB4O1xuICBwYWRkaW5nLWJvdHRvbTogMTBweDtcbn1cclxuLnB5LVxcXFxbMXB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMXB4O1xuICBwYWRkaW5nLWJvdHRvbTogMXB4O1xufVxyXG4ucHktXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMjBweDtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG59XHJcbi5weS1cXFxcWzNweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDNweDtcbiAgcGFkZGluZy1ib3R0b206IDNweDtcbn1cclxuLnB5LVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogNXB4O1xuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xufVxyXG4ucHktXFxcXFs4cHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiA4cHg7XG4gIHBhZGRpbmctYm90dG9tOiA4cHg7XG59XHJcbi5wYi0wIHtcbiAgcGFkZGluZy1ib3R0b206IDBweDtcbn1cclxuLnBiLTEge1xuICBwYWRkaW5nLWJvdHRvbTogMC4yNXJlbTtcbn1cclxuLnBiLTIge1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xufVxyXG4ucGItMyB7XG4gIHBhZGRpbmctYm90dG9tOiAwLjc1cmVtO1xufVxyXG4ucGItXFxcXFsxNXB4XFxcXF0ge1xuICBwYWRkaW5nLWJvdHRvbTogMTVweDtcbn1cclxuLnBiLVxcXFxbMXB4XFxcXF0ge1xuICBwYWRkaW5nLWJvdHRvbTogMXB4O1xufVxyXG4ucGItXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nLWJvdHRvbTogMjBweDtcbn1cclxuLnBiLVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xufVxyXG4ucGwtMyB7XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbn1cclxuLnBsLTYge1xuICBwYWRkaW5nLWxlZnQ6IDEuNXJlbTtcbn1cclxuLnBsLVxcXFxbMTBweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxyXG4ucGwtXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG59XHJcbi5wbC1cXFxcWzVweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiA1cHg7XG59XHJcbi5wci0xIHtcbiAgcGFkZGluZy1yaWdodDogMC4yNXJlbTtcbn1cclxuLnByLTIge1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVyZW07XG59XHJcbi5wci1cXFxcWzNweFxcXFxdIHtcbiAgcGFkZGluZy1yaWdodDogM3B4O1xufVxyXG4ucHItXFxcXFs1cHhcXFxcXSB7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbn1cclxuLnB0LTAge1xuICBwYWRkaW5nLXRvcDogMHB4O1xufVxyXG4ucHQtMSB7XG4gIHBhZGRpbmctdG9wOiAwLjI1cmVtO1xufVxyXG4ucHQtMiB7XG4gIHBhZGRpbmctdG9wOiAwLjVyZW07XG59XHJcbi5wdC0zIHtcbiAgcGFkZGluZy10b3A6IDAuNzVyZW07XG59XHJcbi5wdC00IHtcbiAgcGFkZGluZy10b3A6IDFyZW07XG59XHJcbi5wdC1cXFxcWzEwcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAxMHB4O1xufVxyXG4ucHQtXFxcXFsxNXB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMTVweDtcbn1cclxuLnB0LVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG59XHJcbi50ZXh0LWxlZnQge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxyXG4udGV4dC1jZW50ZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XHJcbi5hbGlnbi1iYXNlbGluZSB7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cclxuLnRleHQtMnhsIHtcbiAgZm9udC1zaXplOiAxLjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAycmVtO1xufVxyXG4udGV4dC0zeGwge1xuICBmb250LXNpemU6IDEuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMi4yNXJlbTtcbn1cclxuLnRleHQtXFxcXFsxXFxcXC4ycmVtXFxcXF0ge1xuICBmb250LXNpemU6IDEuMnJlbTtcbn1cclxuLnRleHQtXFxcXFsxXFxcXC41cmVtXFxcXF0ge1xuICBmb250LXNpemU6IDEuNXJlbTtcbn1cclxuLnRleHQtXFxcXFsxMHB4XFxcXF0ge1xuICBmb250LXNpemU6IDEwcHg7XG59XHJcbi50ZXh0LVxcXFxbMTFweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxMXB4O1xufVxyXG4udGV4dC1cXFxcWzEycHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cclxuLnRleHQtXFxcXFsxM3B4XFxcXF0ge1xuICBmb250LXNpemU6IDEzcHg7XG59XHJcbi50ZXh0LVxcXFxbMTRweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxyXG4udGV4dC1cXFxcWzE1cHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMTVweDtcbn1cclxuLnRleHQtXFxcXFsxNnB4XFxcXF0ge1xuICBmb250LXNpemU6IDE2cHg7XG59XHJcbi50ZXh0LVxcXFxbMThweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxOHB4O1xufVxyXG4udGV4dC1cXFxcWzIwcHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbn1cclxuLnRleHQtXFxcXFsyNXB4XFxcXF0ge1xuICBmb250LXNpemU6IDI1cHg7XG59XHJcbi50ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgZm9udC1zaXplOiAzMHB4O1xufVxyXG4udGV4dC1cXFxcWzQwcHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogNDBweDtcbn1cclxuLnRleHQtXFxcXFs2MHB4XFxcXF0ge1xuICBmb250LXNpemU6IDYwcHg7XG59XHJcbi50ZXh0LVxcXFxbOHB4XFxcXF0ge1xuICBmb250LXNpemU6IDhweDtcbn1cclxuLnRleHQtYmFzZSB7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNXJlbTtcbn1cclxuLnRleHQtbGcge1xuICBmb250LXNpemU6IDEuMTI1cmVtO1xuICBsaW5lLWhlaWdodDogMS43NXJlbTtcbn1cclxuLnRleHQtc20ge1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbn1cclxuLnRleHQteGwge1xuICBmb250LXNpemU6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjc1cmVtO1xufVxyXG4udGV4dC14cyB7XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDFyZW07XG59XHJcbi5mb250LVxcXFxbNDAwXFxcXF0ge1xuICBmb250LXdlaWdodDogNDAwO1xufVxyXG4uZm9udC1cXFxcWzUwMFxcXFxdIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cclxuLmZvbnQtXFxcXFs2NTBcXFxcXSB7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG59XHJcbi5mb250LVxcXFxbNzAwXFxcXF0ge1xuICBmb250LXdlaWdodDogNzAwO1xufVxyXG4uZm9udC1ib2xkIHtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbn1cclxuLmZvbnQtZXh0cmFsaWdodCB7XG4gIGZvbnQtd2VpZ2h0OiAyMDA7XG59XHJcbi5mb250LWxpZ2h0IHtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbn1cclxuLmZvbnQtbWVkaXVtIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cclxuLmZvbnQtbm9ybWFsIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbn1cclxuLmZvbnQtc2VtaWJvbGQge1xuICBmb250LXdlaWdodDogNjAwO1xufVxyXG4udXBwZXJjYXNlIHtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cclxuLmxvd2VyY2FzZSB7XG4gIHRleHQtdHJhbnNmb3JtOiBsb3dlcmNhc2U7XG59XHJcbi5jYXBpdGFsaXplIHtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG59XHJcbi5pdGFsaWMge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XHJcbi50ZXh0LVxcXFxbXFxcXCMwMDI4NjJcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgNDAgOTggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcIzMzYmJmZlxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoNTEgMTg3IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjNDI0MjQyXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYig2NiA2NiA2NiAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjODc4Nzg3XFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxMzUgMTM1IDEzNSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjYTY0YjRlXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxNjYgNzUgNzggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcI2FjNDg0OFxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMTcyIDcyIDcyIC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbXFxcXCNjNDIxMjFcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDE5NiAzMyAzMyAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjZjU0MDVlXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNDUgNjQgOTQgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcI2ZhYjAwNVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjUwIDE3NiA1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbYmx1ZVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMCAwIDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW2dyYXlcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDEyOCAxMjggMTI4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbZ3JlZW5cXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgMTI4IDAgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtncmV5XFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxMjggMTI4IDEyOCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW3JlZFxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjU1IDAgMCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1iYXNlLTEwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLnRleHQtYmFzZS1jb250ZW50IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1ibGFjayB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgMCAwIC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWJsdWUtNjAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMzcgOTkgMjM1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWdyYXktMzAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtZ3JheS00MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxNTYgMTYzIDE3NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1ncmF5LTUwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDEwNyAxMTQgMTI4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWdyYXktNzAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoNTUgNjUgODEgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtZ3JlZW4tNjAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjIgMTYzIDc0IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LW5ldXRyYWwge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1wcmltYXJ5LWNvbnRlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi50ZXh0LXJlZC01MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyMzkgNjggNjggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtcmVkLTYwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDIyMCAzOCAzOCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC10cmFuc3BhcmVudCB7XG4gIGNvbG9yOiB0cmFuc3BhcmVudDtcbn1cclxuLnRleHQtd2hpdGUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udW5kZXJsaW5lIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTtcbn1cclxuLm5vLXVuZGVybGluZSB7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiBub25lO1xufVxyXG4udW5kZXJsaW5lLW9mZnNldC0xIHtcbiAgdGV4dC11bmRlcmxpbmUtb2Zmc2V0OiAxcHg7XG59XHJcbi51bmRlcmxpbmUtb2Zmc2V0LTIge1xuICB0ZXh0LXVuZGVybGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLnVuZGVybGluZS1vZmZzZXQtOCB7XG4gIHRleHQtdW5kZXJsaW5lLW9mZnNldDogOHB4O1xufVxyXG4ub3BhY2l0eS01MCB7XG4gIG9wYWNpdHk6IDAuNTtcbn1cclxuLm9wYWNpdHktNzAge1xuICBvcGFjaXR5OiAwLjc7XG59XHJcbi5zaGFkb3cge1xuICAtLXR3LXNoYWRvdzogMCAxcHggM3B4IDAgcmdiKDAgMCAwIC8gMC4xKSwgMCAxcHggMnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKTtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAxcHggM3B4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCAxcHggMnB4IC0xcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuLnNoYWRvdy1sZyB7XG4gIC0tdHctc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIDAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIDAuMSk7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMTBweCAxNXB4IC0zcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCA0cHggNnB4IC00cHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuLnNoYWRvdy1tZCB7XG4gIC0tdHctc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjEpO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDRweCA2cHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDJweCA0cHggLTJweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xufVxyXG4ub3V0bGluZS1ub25lIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3V0bGluZSB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xufVxyXG4ub3V0bGluZS0xIHtcbiAgb3V0bGluZS13aWR0aDogMXB4O1xufVxyXG4ub3V0bGluZS1cXFxcWzFcXFxcLjVweFxcXFxdIHtcbiAgb3V0bGluZS13aWR0aDogMS41cHg7XG59XHJcbi5vdXRsaW5lLVxcXFxbXFxcXCMwMDdiZmZcXFxcXSB7XG4gIG91dGxpbmUtY29sb3I6ICMwMDdiZmY7XG59XHJcbi5vdXRsaW5lLXNsYXRlLTMwMFxcXFwvNTAge1xuICBvdXRsaW5lLWNvbG9yOiByZ2IoMjAzIDIxMyAyMjUgLyAwLjUpO1xufVxyXG4ucmluZy1cXFxcWzFweFxcXFxdIHtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7XG4gIC0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMXB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSwgdmFyKC0tdHctcmluZy1zaGFkb3cpLCB2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCk7XG59XHJcbi5yaW5nLVxcXFxbMnB4XFxcXF0ge1xuICAtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpIHZhcigtLXR3LXJpbmctb2Zmc2V0LWNvbG9yKTtcbiAgLS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygycHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKTtcbn1cclxuLnJpbmctXFxcXFtcXFxcIzAwMjg2MlxcXFxdIHtcbiAgLS10dy1yaW5nLW9wYWNpdHk6IDE7XG4gIC0tdHctcmluZy1jb2xvcjogcmdiKDAgNDAgOTggLyB2YXIoLS10dy1yaW5nLW9wYWNpdHkpKTtcbn1cclxuLnJpbmctZ3JheS00MDAge1xuICAtLXR3LXJpbmctb3BhY2l0eTogMTtcbiAgLS10dy1yaW5nLWNvbG9yOiByZ2IoMTU2IDE2MyAxNzUgLyB2YXIoLS10dy1yaW5nLW9wYWNpdHkpKTtcbn1cclxuLnJpbmctb2Zmc2V0LTIge1xuICAtLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAycHg7XG59XHJcbi5ibHVyIHtcbiAgLS10dy1ibHVyOiBibHVyKDhweCk7XG4gIGZpbHRlcjogdmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KTtcbn1cclxuLmZpbHRlciB7XG4gIGZpbHRlcjogdmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KTtcbn1cclxuLnRyYW5zaXRpb24ge1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMTUwbXM7XG59XHJcbi50cmFuc2l0aW9uLWFsbCB7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGFsbDtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDE1MG1zO1xufVxyXG5cclxuYm9keSB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi8qIEN1c3RvbSBDU1MgdG8gaGlkZSBzY3JvbGxiYXIgKi9cclxuLmhpZGUtc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLmhpZGUtc2Nyb2xsYmFyIHtcclxuICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7IC8qIElFIGFuZCBFZGdlICovXHJcbiAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOyAvKiBGaXJlZm94ICovXHJcbn1cclxuXHJcbi8qIGJlbG93IGNzcyBjbGFzcyByZXBsYWNlIGJvb3RzdHJhcCBiYWNrZ3JvdW5kIGNvbG9yIHdpdGggZGFpc3kgKi9cclxuLm9wLWJnLXByaW1hcnkge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJnLXNlY29uZGFyeSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYmctaW5mbyB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC1iZy1zdWNjZXNzIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zdSxva2xjaCh2YXIoLS1zdSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJnLXdhcm5pbmcge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhLG9rbGNoKHZhcigtLXdhKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLyogYmVsb3cgY3NzIGNsYXNzIHJlcGxhY2UgYm9vdHN0cmFwIHRleHQgY29sb3Igd2l0aCBkYWlzeSAqL1xyXG4ub3AtdGV4dC1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtaW5mbyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtc3VjY2VzcyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtd2FybmluZyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJvcmRlci1wcmltYXJ5IHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4vKiBDU1MgZm9yIHNjcm9sbGJhciBjdXN0b21pemF0aW9uICovXHJcbioge1xyXG4gIHNjcm9sbGJhci13aWR0aDogdGhpbjsgLyogRm9yIEZpcmVmb3ggKi9cclxuICBzY3JvbGxiYXItY29sb3I6IGdyYXk7IC8qIEZvciBGaXJlZm94ICovXHJcbn1cclxuXHJcbi8qIEZvciB3ZWJraXQtYmFzZWQgYnJvd3NlcnMgbGlrZSBDaHJvbWUsIFNhZmFyaSAqL1xyXG4qOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgd2lkdGg6IDVweDtcclxufVxyXG5cclxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG59XHJcblxyXG4qOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcclxuICBib3JkZXItcmFkaXVzOiAxMHB4O1xyXG59XHJcblxyXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcblxuICAubWRcXFxcOm9wLWJ0bi1zbSB7XG4gICAgaGVpZ2h0OiAycmVtO1xuICAgIG1pbi1oZWlnaHQ6IDJyZW07XG4gICAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICAgIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6b3AtYnRuLW1kIHtcbiAgICBoZWlnaHQ6IDNyZW07XG4gICAgbWluLWhlaWdodDogM3JlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gICAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICB9XG5cbiAgLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm1kXFxcXDpvcC1idG4tc20pIHtcbiAgICBoZWlnaHQ6IDJyZW07XG4gICAgd2lkdGg6IDJyZW07XG4gICAgcGFkZGluZzogMHB4O1xuICB9XG5cbiAgLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm1kXFxcXDpvcC1idG4tbWQpIHtcbiAgICBoZWlnaHQ6IDNyZW07XG4gICAgd2lkdGg6IDNyZW07XG4gICAgcGFkZGluZzogMHB4O1xuICB9XG5cbiAgLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm1kXFxcXDpvcC1idG4tc20pIHtcbiAgICBoZWlnaHQ6IDJyZW07XG4gICAgd2lkdGg6IDJyZW07XG4gICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIHBhZGRpbmc6IDBweDtcbiAgfVxuXG4gIC5vcC1idG4tY2lyY2xlOndoZXJlKC5tZFxcXFw6b3AtYnRuLW1kKSB7XG4gICAgaGVpZ2h0OiAzcmVtO1xuICAgIHdpZHRoOiAzcmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gIH1cbn1cclxuXHJcbi5hZnRlclxcXFw6YWJzb2x1dGU6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cclxuXHJcbi5hZnRlclxcXFw6c3RhcnQtXFxcXFsycHhcXFxcXTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgaW5zZXQtaW5saW5lLXN0YXJ0OiAycHg7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnRvcC1cXFxcWzJweFxcXFxdOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICB0b3A6IDJweDtcbn1cclxuXHJcbi5hZnRlclxcXFw6aC00OjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICBoZWlnaHQ6IDFyZW07XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnctNDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgd2lkdGg6IDFyZW07XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnJvdW5kZWQtZnVsbDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xufVxyXG5cclxuLmFmdGVyXFxcXDpib3JkZXI6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xufVxyXG5cclxuLmFmdGVyXFxcXDpib3JkZXItZ3JheS0zMDA6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIwOSAyMTMgMjE5IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuXHJcbi5hZnRlclxcXFw6Ymctd2hpdGU6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG5cclxuLmFmdGVyXFxcXDp0cmFuc2l0aW9uLWFsbDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYWxsO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMTUwbXM7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOmNvbnRlbnQtXFxcXFtcXFxcJ1xcXFwnXFxcXF06OmFmdGVyIHtcbiAgLS10dy1jb250ZW50OiAnJztcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG59XHJcblxyXG4ubGFzdFxcXFw6bWItMFxcXFwuNTpsYXN0LWNoaWxkIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4xMjVyZW07XG59XHJcblxyXG4uY2hlY2tlZFxcXFw6Ymctd2hpdGU6Y2hlY2tlZCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG5cclxuLmNoZWNrZWRcXFxcOlxcXFxbLS10Z2xiZ1xcXFw6XFxcXCMzMzY4ZmZcXFxcXTpjaGVja2VkIHtcbiAgLS10Z2xiZzogIzMzNjhmZjtcbn1cclxuXHJcbi5ob3ZlclxcXFw6Y3Vyc29yLXN3LXJlc2l6ZTpob3ZlciB7XG4gIGN1cnNvcjogc3ctcmVzaXplO1xufVxyXG5cclxuLmhvdmVyXFxcXDpib3JkZXItXFxcXFtcXFxcI2QyZTNmY1xcXFxdOmhvdmVyIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjEwIDIyNyAyNTIgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG5cclxuLmhvdmVyXFxcXDpib3JkZXItYmFzZS1jb250ZW50OmhvdmVyIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcblxyXG4uaG92ZXJcXFxcOmJnLVxcXFxbXFxcXCNlY2YzZmViN1xcXFxdOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjZjNmZWI3O1xufVxyXG5cclxuLmhvdmVyXFxcXDpiZy1iYXNlLTMwMDpob3ZlciB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcblxyXG4uaG92ZXJcXFxcOmJnLXRyYW5zcGFyZW50OmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XHJcblxyXG4uaG92ZXJcXFxcOnRleHQtYmFzZS1jb250ZW50OmhvdmVyIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5cclxuLmhvdmVyXFxcXDp0ZXh0LXdoaXRlOmhvdmVyIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6dW5kZXJsaW5lOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6bm8tdW5kZXJsaW5lOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7XG59XHJcblxyXG4uaG92ZXJcXFxcOnNoYWRvdy1sZzpob3ZlciB7XG4gIC0tdHctc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIDAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIDAuMSk7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMTBweCAxNXB4IC0zcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCA0cHggNnB4IC00cHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuXHJcbi5mb2N1c1xcXFw6YmctYmFzZS0zMDA6Zm9jdXMge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLmZvY3VzXFxcXDpvdXRsaW5lLW5vbmU6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcblxyXG4uZGlzYWJsZWRcXFxcOnRleHQtXFxcXFtcXFxcIzVjNWM1Y1xcXFxdOmRpc2FibGVkIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoOTIgOTIgOTIgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuXHJcbi5ncm91cDpob3ZlciAuZ3JvdXAtaG92ZXJcXFxcOmJvcmRlci1iYXNlLWNvbnRlbnQge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5wZWVyOmNoZWNrZWQgfiAucGVlci1jaGVja2VkXFxcXDpiZy1ibHVlLTYwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDM3IDk5IDIzNSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuXHJcbi5wZWVyOmNoZWNrZWQgfiAucGVlci1jaGVja2VkXFxcXDphZnRlclxcXFw6dHJhbnNsYXRlLXgtZnVsbDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy10cmFuc2xhdGUteDogMTAwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcblxyXG4ucGVlcjpjaGVja2VkIH4gLnBlZXItY2hlY2tlZFxcXFw6YWZ0ZXJcXFxcOmJvcmRlci13aGl0ZTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG5cclxuLnBlZXI6Zm9jdXMgfiAucGVlci1mb2N1c1xcXFw6b3V0bGluZS1ub25lIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG5cclxuLnBlZXI6Zm9jdXMgfiAucGVlci1mb2N1c1xcXFw6cmluZy0xIHtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7XG4gIC0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMXB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSwgdmFyKC0tdHctcmluZy1zaGFkb3cpLCB2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCk7XG59XHJcblxyXG4ucGVlcjpmb2N1cyB+IC5wZWVyLWZvY3VzXFxcXDpyaW5nLWJsYWNrIHtcbiAgLS10dy1yaW5nLW9wYWNpdHk6IDE7XG4gIC0tdHctcmluZy1jb2xvcjogcmdiKDAgMCAwIC8gdmFyKC0tdHctcmluZy1vcGFjaXR5KSk7XG59XHJcblxyXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcblxuICAubWRcXFxcOmNvbC1zcGFuLTEyIHtcbiAgICBncmlkLWNvbHVtbjogc3BhbiAxMiAvIHNwYW4gMTI7XG4gIH1cblxuICAubWRcXFxcOmNvbC1zcGFuLTYge1xuICAgIGdyaWQtY29sdW1uOiBzcGFuIDYgLyBzcGFuIDY7XG4gIH1cblxuICAubWRcXFxcOm0tMCB7XG4gICAgbWFyZ2luOiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm0tMTAge1xuICAgIG1hcmdpbjogMi41cmVtO1xuICB9XG5cbiAgLm1kXFxcXDptLTIge1xuICAgIG1hcmdpbjogMC41cmVtO1xuICB9XG5cbiAgLm1kXFxcXDptLVxcXFxbMjBweFxcXFxdIHtcbiAgICBtYXJnaW46IDIwcHg7XG4gIH1cblxuICAubWRcXFxcOm14LTAge1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm1iLTAge1xuICAgIG1hcmdpbi1ib3R0b206IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWItMSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6bWwtMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bXItMCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm10LVxcXFxbNDFweFxcXFxdIHtcbiAgICBtYXJnaW4tdG9wOiA0MXB4O1xuICB9XG5cbiAgLm1kXFxcXDpibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAubWRcXFxcOmlubGluZS1ibG9jayB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG5cbiAgLm1kXFxcXDpmbGV4IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgLm1kXFxcXDpoLVxcXFxbMjAwcHhcXFxcXSB7XG4gICAgaGVpZ2h0OiAyMDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6aC1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIGhlaWdodDogNDAwcHg7XG4gIH1cblxuICAubWRcXFxcOmgtXFxcXFs0MHB4XFxcXF0ge1xuICAgIGhlaWdodDogNDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6aC1cXFxcWzY2cHhcXFxcXSB7XG4gICAgaGVpZ2h0OiA2NnB4O1xuICB9XG5cbiAgLm1kXFxcXDpoLVxcXFxbOTVcXFxcJVxcXFxdIHtcbiAgICBoZWlnaHQ6IDk1JTtcbiAgfVxuXG4gIC5tZFxcXFw6bWF4LWgtXFxcXFs0MDBweFxcXFxdIHtcbiAgICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWluLWgtZnVsbCB7XG4gICAgbWluLWhlaWdodDogMTAwJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzEwMFxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMTVcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogMTUlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMjAwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDIwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMjNcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogMjMlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMjUwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDI1MHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMzAwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDMwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMzUwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDM1MHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNDBcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNDAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNDAwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDQwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNVxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA1JTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzUwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDUwJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA1MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzU1XFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDU1JTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzU3XFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDU3JTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzYwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDYwJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzcwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDcwJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzkyXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDkyJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzk1XFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDk1JTtcbiAgfVxuXG4gIC5tZFxcXFw6bWluLXctXFxcXFs0NDBweFxcXFxdIHtcbiAgICBtaW4td2lkdGg6IDQ0MHB4O1xuICB9XG5cbiAgLm1kXFxcXDptaW4tdy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIG1pbi13aWR0aDogNTAwcHg7XG4gIH1cblxuICAubWRcXFxcOm1pbi13LWZ1bGwge1xuICAgIG1pbi13aWR0aDogMTAwJTtcbiAgfVxuXG4gIC5tZFxcXFw6bWF4LXctXFxcXFs0MDBweFxcXFxdIHtcbiAgICBtYXgtd2lkdGg6IDQwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDptYXgtdy1cXFxcWzQ1MHB4XFxcXF0ge1xuICAgIG1heC13aWR0aDogNDUwcHg7XG4gIH1cblxuICAubWRcXFxcOm1heC13LVxcXFxbNTAwcHhcXFxcXSB7XG4gICAgbWF4LXdpZHRoOiA1MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6Z3JpZC1jb2xzLTIge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTtcbiAgfVxuXG4gIC5tZFxcXFw6ZmxleC1yb3cge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cblxuICAubWRcXFxcOml0ZW1zLWNlbnRlciB7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxuXG4gIC5tZFxcXFw6anVzdGlmeS1iZXR3ZWVuIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIH1cblxuICAubWRcXFxcOmdhcC02IHtcbiAgICBnYXA6IDEuNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6Z2FwLVxcXFxbMTJweFxcXFxdIHtcbiAgICBnYXA6IDEycHg7XG4gIH1cblxuICAubWRcXFxcOmdhcC1cXFxcWzhweFxcXFxdIHtcbiAgICBnYXA6IDhweDtcbiAgfVxuXG4gIC5tZFxcXFw6Z2FwLXktMCB7XG4gICAgcm93LWdhcDogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpwLTEwIHtcbiAgICBwYWRkaW5nOiAyLjVyZW07XG4gIH1cblxuICAubWRcXFxcOnAtNCB7XG4gICAgcGFkZGluZzogMXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cC01IHtcbiAgICBwYWRkaW5nOiAxLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpweS0wIHtcbiAgICBwYWRkaW5nLXRvcDogMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAwcHg7XG4gIH1cblxuICAubWRcXFxcOnB5LTUge1xuICAgIHBhZGRpbmctdG9wOiAxLjI1cmVtO1xuICAgIHBhZGRpbmctYm90dG9tOiAxLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpwYi0wIHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpwYi00IHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cGwtOCB7XG4gICAgcGFkZGluZy1sZWZ0OiAycmVtO1xuICB9XG5cbiAgLm1kXFxcXDpwci0wIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubWRcXFxcOnB0LTMge1xuICAgIHBhZGRpbmctdG9wOiAwLjc1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LWVuZCB7XG4gICAgdGV4dC1hbGlnbjogZW5kO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LTJ4bCB7XG4gICAgZm9udC1zaXplOiAxLjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDJyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtM3hsIHtcbiAgICBmb250LXNpemU6IDEuODc1cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAyLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LVxcXFxbMTNweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDEzcHg7XG4gIH1cblxuICAubWRcXFxcOnRleHQtXFxcXFsxNXB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC1cXFxcWzIzcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAyM3B4O1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDMwcHg7XG4gIH1cblxuICAubWRcXFxcOnRleHQtYmFzZSB7XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtbGcge1xuICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtc20ge1xuICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQteGwge1xuICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgfVxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuXG4gIC5sZ1xcXFw6cmVsYXRpdmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxuXG4gIC5sZ1xcXFw6b3JkZXItbm9uZSB7XG4gICAgb3JkZXI6IDA7XG4gIH1cblxuICAubGdcXFxcOmNvbC1zcGFuLTEyIHtcbiAgICBncmlkLWNvbHVtbjogc3BhbiAxMiAvIHNwYW4gMTI7XG4gIH1cblxuICAubGdcXFxcOmNvbC1zcGFuLTYge1xuICAgIGdyaWQtY29sdW1uOiBzcGFuIDYgLyBzcGFuIDY7XG4gIH1cblxuICAubGdcXFxcOm14LTAge1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubGdcXFxcOm1sLTQge1xuICAgIG1hcmdpbi1sZWZ0OiAxcmVtO1xuICB9XG5cbiAgLmxnXFxcXDpibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAubGdcXFxcOmhpZGRlbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzQwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDQwJTtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA0MDBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA1MDBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6cC0xMCB7XG4gICAgcGFkZGluZzogMi41cmVtO1xuICB9XG5cbiAgLmxnXFxcXDpwLTE2IHtcbiAgICBwYWRkaW5nOiA0cmVtO1xuICB9XG5cbiAgLmxnXFxcXDpwLTQge1xuICAgIHBhZGRpbmc6IDFyZW07XG4gIH1cblxuICAubGdcXFxcOnRleHQtXFxcXFsxMjBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDEyMHB4O1xuICB9XG5cbiAgLmxnXFxcXDp0ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDMwcHg7XG4gIH1cblxuICAubGdcXFxcOnRleHQtXFxcXFs1MHB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogNTBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6dGV4dC1sZyB7XG4gICAgZm9udC1zaXplOiAxLjEyNXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgfVxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDEyODBweCkge1xuXG4gIC54bFxcXFw6bXQtXFxcXFs2M3B4XFxcXF0ge1xuICAgIG1hcmdpbi10b3A6IDYzcHg7XG4gIH1cblxuICAueGxcXFxcOnctXFxcXFs1MDBweFxcXFxdIHtcbiAgICB3aWR0aDogNTAwcHg7XG4gIH1cbn1cclxuXHJcbkBtZWRpYSAobWluLXdpZHRoOiAxNTM2cHgpIHtcblxuICAuXFxcXDMyeGxcXFxcOm0tNSB7XG4gICAgbWFyZ2luOiAxLjI1cmVtO1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDptdC1cXFxcWzYzcHhcXFxcXSB7XG4gICAgbWFyZ2luLXRvcDogNjNweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6bWF4LXctXFxcXFs1MDBweFxcXFxdIHtcbiAgICBtYXgtd2lkdGg6IDUwMHB4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDpwLTMge1xuICAgIHBhZGRpbmc6IDAuNzVyZW07XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOnB4LVxcXFxbMTVweFxcXFxdIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gICAgcGFkZGluZy1yaWdodDogMTVweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6cHktXFxcXFsxMHB4XFxcXF0ge1xuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDp0ZXh0LVxcXFxbMjBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOnRleHQtXFxcXFsyNXB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogMjVweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6dGV4dC1cXFxcWzMwcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAzMHB4O1xuICB9XG59XHJcblxyXG4ucGVlcjpjaGVja2VkIH4gLnJ0bFxcXFw6cGVlci1jaGVja2VkXFxcXDphZnRlclxcXFw6LXRyYW5zbGF0ZS14LWZ1bGw6d2hlcmUoW2Rpcj1cInJ0bFwiXSwgW2Rpcj1cInJ0bFwiXSAqKTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy10cmFuc2xhdGUteDogLTEwMCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG5cclxuQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xuXG4gIC5kYXJrXFxcXDpib3JkZXItYmxhY2sge1xuICAgIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMCAwIDAgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xuICB9XG5cbiAgLmRhcmtcXFxcOmJnLWdyYXktNzAwIHtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDU1IDY1IDgxIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xuICB9XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvaW5kZXguY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBOztDQUFjLENBQWQ7OztDQUFjOztBQUFkOzs7RUFBQSxzQkFBYyxFQUFkLE1BQWM7RUFBZCxlQUFjLEVBQWQsTUFBYztFQUFkLG1CQUFjLEVBQWQsTUFBYztFQUFkLHFCQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOztFQUFBLGdCQUFjO0FBQUE7O0FBQWQ7Ozs7Ozs7O0NBQWM7O0FBQWQ7O0VBQUEsZ0JBQWMsRUFBZCxNQUFjO0VBQWQsOEJBQWMsRUFBZCxNQUFjLEVBQWQsTUFBYztFQUFkLFdBQWMsRUFBZCxNQUFjO0VBQWQsK0hBQWMsRUFBZCxNQUFjO0VBQWQsNkJBQWMsRUFBZCxNQUFjO0VBQWQsK0JBQWMsRUFBZCxNQUFjO0VBQWQsd0NBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkO0VBQUEsU0FBYyxFQUFkLE1BQWM7RUFBZCxvQkFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7OztDQUFjOztBQUFkO0VBQUEsU0FBYyxFQUFkLE1BQWM7RUFBZCxjQUFjLEVBQWQsTUFBYztFQUFkLHFCQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkO0VBQUEseUNBQWM7VUFBZCxpQ0FBYztBQUFBOztBQUFkOztDQUFjOztBQUFkOzs7Ozs7RUFBQSxrQkFBYztFQUFkLG9CQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7RUFBQSxjQUFjO0VBQWQsd0JBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7RUFBQSxtQkFBYztBQUFBOztBQUFkOzs7OztDQUFjOztBQUFkOzs7O0VBQUEsK0dBQWMsRUFBZCxNQUFjO0VBQWQsNkJBQWMsRUFBZCxNQUFjO0VBQWQsK0JBQWMsRUFBZCxNQUFjO0VBQWQsY0FBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGNBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7RUFBQSxjQUFjO0VBQWQsY0FBYztFQUFkLGtCQUFjO0VBQWQsd0JBQWM7QUFBQTs7QUFBZDtFQUFBLGVBQWM7QUFBQTs7QUFBZDtFQUFBLFdBQWM7QUFBQTs7QUFBZDs7OztDQUFjOztBQUFkO0VBQUEsY0FBYyxFQUFkLE1BQWM7RUFBZCxxQkFBYyxFQUFkLE1BQWM7RUFBZCx5QkFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7OztDQUFjOztBQUFkOzs7OztFQUFBLG9CQUFjLEVBQWQsTUFBYztFQUFkLDhCQUFjLEVBQWQsTUFBYztFQUFkLGdDQUFjLEVBQWQsTUFBYztFQUFkLGVBQWMsRUFBZCxNQUFjO0VBQWQsb0JBQWMsRUFBZCxNQUFjO0VBQWQsb0JBQWMsRUFBZCxNQUFjO0VBQWQsdUJBQWMsRUFBZCxNQUFjO0VBQWQsY0FBYyxFQUFkLE1BQWM7RUFBZCxTQUFjLEVBQWQsTUFBYztFQUFkLFVBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7O0VBQUEsb0JBQWM7QUFBQTs7QUFBZDs7O0NBQWM7O0FBQWQ7Ozs7RUFBQSwwQkFBYyxFQUFkLE1BQWM7RUFBZCw2QkFBYyxFQUFkLE1BQWM7RUFBZCxzQkFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGFBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGdCQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7RUFBQSx3QkFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkOztFQUFBLFlBQWM7QUFBQTs7QUFBZDs7O0NBQWM7O0FBQWQ7RUFBQSw2QkFBYyxFQUFkLE1BQWM7RUFBZCxvQkFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLHdCQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkO0VBQUEsMEJBQWMsRUFBZCxNQUFjO0VBQWQsYUFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGtCQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7Ozs7Ozs7Ozs7Ozs7RUFBQSxTQUFjO0FBQUE7O0FBQWQ7RUFBQSxTQUFjO0VBQWQsVUFBYztBQUFBOztBQUFkO0VBQUEsVUFBYztBQUFBOztBQUFkOzs7RUFBQSxnQkFBYztFQUFkLFNBQWM7RUFBZCxVQUFjO0FBQUE7O0FBQWQ7O0NBQWM7QUFBZDtFQUFBLFVBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGdCQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkOztFQUFBLFVBQWMsRUFBZCxNQUFjO0VBQWQsY0FBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7RUFBQSxlQUFjO0FBQUE7O0FBQWQ7O0NBQWM7QUFBZDtFQUFBLGVBQWM7QUFBQTs7QUFBZDs7OztDQUFjOztBQUFkOzs7Ozs7OztFQUFBLGNBQWMsRUFBZCxNQUFjO0VBQWQsc0JBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7O0VBQUEsZUFBYztFQUFkLFlBQWM7QUFBQTs7QUFBZCx3RUFBYztBQUFkO0VBQUEsYUFBYztBQUFBOztBQUFkOztFQUFBLHVEQUFjO0VBQWQ7QUFBYzs7QUFBZDs7RUFBQTtJQUFBLG1CQUFjO0lBQWQscUJBQWM7SUFBZCxzQkFBYztJQUFkLHFCQUFjO0lBQWQsc0JBQWM7SUFBZCxxQkFBYztJQUFkLHNCQUFjO0lBQWQscUJBQWM7SUFBZCxzQkFBYztJQUFkLHNCQUFjO0lBQWQsc0JBQWM7SUFBZCxzQkFBYztJQUFkLHNCQUFjO0lBQWQsc0JBQWM7SUFBZCx1QkFBYztJQUFkLHNCQUFjO0lBQWQsdUJBQWM7SUFBZCxzQkFBYztJQUFkLHVCQUFjO0lB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QUFwQiwwRUFBb0I7SUFBcEIsa0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBOzs7O1dBQW9CO01BQXBCOzs7OztJQUFvQjtFQUFBOztFQUFwQjs7SUFBQTtNQUFBLHNEQUFvQjtNQUFwQjtJQUFvQjtFQUFBOztFQUFwQjtJQUFBLG9CQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7SUFBQTtFQUFvQjs7RUFBcEI7O0lBQUE7TUFBQTtJQUFvQjtFQUFBOztFQUFwQjtJQUFBLHNCQUFvQjtJQUFwQiwwRUFBb0I7SUFBcEIsa0JBQW9CO0lBQXBCLDBFQUFvQjtJQUFwQixvQkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCO0lBQUEsb0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBLHFGQUFvQjtNQUFwQjtJQUFvQjtFQUFBOztFQUFwQjtJQUFBLG9CQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7O0lBQUE7TUFBQSxxRkFBb0I7TUFBcEI7SUFBb0I7RUFBQTs7RUFBcEI7SUFBQSxvQkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCOztJQUFBO01BQUEscUZBQW9CO01BQXBCO0lBQW9CO0VBQUE7O0VBQXBCO0lBQUEsb0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBLHVGQUFvQjtNQUFwQjtJQUFvQjtFQUFBOztFQUFwQjtJQUFBLG9CQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7O0lBQUE7TUFBQSx1RkFBb0I7TUFBcEI7SUFBb0I7RUFBQTs7RUFBcEI7SUFBQSxvQkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCOztJQUFBO01BQUEsdUZBQW9CO01BQXBCO0lBQW9CO0VBQUE7O0VBQXBCO0lBQUEsb0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBLHVGQUFvQjtNQUFwQjtJQUFvQjtFQUFBOztFQUFwQjs7O0lBQUEsc0JBQW9CO0lBQXBCLHdFQUFvQjtJQUFwQixvQkFBb0I7SUFBcEIsaUVBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBLHFGQUFvQjtNQUFw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O0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxlQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLCtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDBCQUFtQjtFQUFuQix1QkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDBCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLHlCQUFtQjtVQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSw0QkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLHFCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9C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O0VBQUEsMEJBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLDBCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSwwQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsMEJBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLDBCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSwwQkF3RUM7RUF4RUQsc0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLDBCQXdFQztFQXhFRCxrQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsMEJBd0VDO0VBeEVELHdCQXdFQztFQXhFRCx3REF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsZ0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBO0FBd0VDOztBQXhFRDtFQUFBLGtCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQTtBQXdFQzs7QUF4RUQ7RUFBQTtBQXdFQzs7QUF4RUQ7RUFBQSxzQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsc0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBO0FBd0VDOztBQXhFRDtFQUFBLGtCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQTtBQXdFQzs7QUF4RUQ7RUFBQSxvQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsb0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBO0FBd0VDOztBQXhFRDtFQUFBO0FBd0VDOztBQXhFRDtFQUFBLCtFQXdFQztFQXhFRCxtR0F3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsa0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLDhCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSxvQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsc0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLGtCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSwwQkF3RUM7RUF4RUQsc0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLDBCQXdFQztFQXhFRCxzQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsOEJBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLDJHQXdFQztFQXhFRCx5R0F3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsb0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDs7RUFBQTtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBLGdCQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQSxnQkF3RUM7SUF4RUQ7RUF3RUM7O0VBeEVEO0lBQUEsb0JBd0VDO0lBeEVEO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBLGlCQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQSxtQkF3RUM7SUF4RUQ7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUEsZUF3RUM7SUF4RUQ7RUF3RUM7O0VBeEVEO0lBQUEsbUJBd0VDO0lBeEVEO0VBd0VDOztFQXhFRDtJQUFBLG1CQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQSxrQkF3RUM7SUF4RUQ7RUF3RUM7QUFBQTs7QUF4RUQ7O0VBQUE7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQSxnQkF3RUM7SUF4RUQ7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUEsbUJBd0VDO0lBeEVEO0VBd0VDO0FBQUE7O0FBeEVEOztFQUFBO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7QUFBQTs7QUF4RUQ7O0VBQUE7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQSxrQkF3RUM7SUF4RUQ7RUF3RUM7O0VBeEVEO0lBQUEsaUJBd0VDO0lBeEVEO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDO0FBQUE7O0FBeEVEO0VBQUEsMEJBd0VDO0VBeEVELHVCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7O0VBQUE7SUFBQSxzQkF3RUM7SUF4RUQ7RUF3RUM7O0VBeEVEO0lBQUEsa0JBd0VDO0lBeEVEO0VBd0VDO0FBQUFcIixcInNvdXJjZXNDb250ZW50XCI6W1wiQHRhaWx3aW5kIGJhc2U7XFxyXFxuQHRhaWx3aW5kIGNvbXBvbmVudHM7XFxyXFxuQHRhaWx3aW5kIHV0aWxpdGllcztcXHJcXG5cXHJcXG5ib2R5IHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBDdXN0b20gQ1NTIHRvIGhpZGUgc2Nyb2xsYmFyICovXFxyXFxuLmhpZGUtc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhciB7XFxyXFxuICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uaGlkZS1zY3JvbGxiYXIge1xcclxcbiAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOyAvKiBJRSBhbmQgRWRnZSAqL1xcclxcbiAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOyAvKiBGaXJlZm94ICovXFxyXFxufVxcclxcblxcclxcbi8qIGJlbG93IGNzcyBjbGFzcyByZXBsYWNlIGJvb3RzdHJhcCBiYWNrZ3JvdW5kIGNvbG9yIHdpdGggZGFpc3kgKi9cXHJcXG4ub3AtYmctcHJpbWFyeSB7XFxyXFxuICBAYXBwbHkgYmctcHJpbWFyeTtcXHJcXG59XFxyXFxuLm9wLWJnLXNlY29uZGFyeSB7XFxyXFxuICBAYXBwbHkgYmctc2Vjb25kYXJ5O1xcclxcbn1cXHJcXG4ub3AtYmctaW5mbyB7XFxyXFxuICBAYXBwbHkgYmctaW5mbztcXHJcXG59XFxyXFxuLm9wLWJnLXN1Y2Nlc3N7XFxyXFxuICBAYXBwbHkgYmctc3VjY2VzcztcXHJcXG59XFxyXFxuLm9wLWJnLXdhcm5pbmcge1xcclxcbiAgQGFwcGx5IGJnLXdhcm5pbmc7XFxyXFxufVxcclxcblxcclxcbi8qIGJlbG93IGNzcyBjbGFzcyByZXBsYWNlIGJvb3RzdHJhcCB0ZXh0IGNvbG9yIHdpdGggZGFpc3kgKi9cXHJcXG4ub3AtdGV4dC1wcmltYXJ5IHtcXHJcXG4gIEBhcHBseSB0ZXh0LXByaW1hcnk7XFxyXFxufVxcclxcbi5vcC10ZXh0LXNlY29uZGFyeSB7XFxyXFxuICBAYXBwbHkgdGV4dC1zZWNvbmRhcnk7XFxyXFxufVxcclxcbi5vcC10ZXh0LWluZm8ge1xcclxcbiAgQGFwcGx5IHRleHQtaW5mbztcXHJcXG59XFxyXFxuLm9wLXRleHQtc3VjY2Vzc3tcXHJcXG4gIEBhcHBseSB0ZXh0LXN1Y2Nlc3M7XFxyXFxufVxcclxcbi5vcC10ZXh0LXdhcm5pbmcge1xcclxcbiAgQGFwcGx5IHRleHQtd2FybmluZztcXHJcXG59XFxyXFxuLm9wLWJvcmRlci1wcmltYXJ5e1xcclxcbiAgQGFwcGx5IGJvcmRlci1wcmltYXJ5XFxyXFxufVxcclxcbi8qIENTUyBmb3Igc2Nyb2xsYmFyIGN1c3RvbWl6YXRpb24gKi9cXHJcXG4qIHtcXHJcXG4gIHNjcm9sbGJhci13aWR0aDogdGhpbjsgLyogRm9yIEZpcmVmb3ggKi9cXHJcXG4gIHNjcm9sbGJhci1jb2xvcjogZ3JheTsgLyogRm9yIEZpcmVmb3ggKi9cXHJcXG59XFxyXFxuXFxyXFxuLyogRm9yIHdlYmtpdC1iYXNlZCBicm93c2VycyBsaWtlIENocm9tZSwgU2FmYXJpICovXFxyXFxuKjo6LXdlYmtpdC1zY3JvbGxiYXIge1xcclxcbiAgd2lkdGg6IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxyXFxufVxcclxcblxcclxcbio6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxyXFxuICBib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8wX19fIGZyb20gXCItIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL2JsYWNrLWFscGhhLmNzc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMV9fXyBmcm9tIFwiLSEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy9tYXV2ZS5jc3NcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzJfX18gZnJvbSBcIi0hLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvdmlvbGV0LmNzc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18uaShfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzBfX18pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18uaShfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzFfX18pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18uaShfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzJfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuQ29udGV4dE1lbnVDb250ZW50LFxyXG4uQ29udGV4dE1lbnVTdWJDb250ZW50IHtcclxuICBtaW4td2lkdGg6IDEzNXB4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIHBhZGRpbmc6IDVweDtcclxuICBib3gtc2hhZG93OlxyXG4gICAgMHB4IDEwcHggMzhweCAtMTBweCByZ2JhKDIyLCAyMywgMjQsIDAuMzUpLFxyXG4gICAgMHB4IDEwcHggMjBweCAtMTVweCByZ2JhKDIyLCAyMywgMjQsIDAuMik7XHJcbiAgei1pbmRleDogOTk7XHJcbn1cclxuXHJcbi5Db250ZXh0TWVudUl0ZW0sXHJcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbSxcclxuLkNvbnRleHRNZW51UmFkaW9JdGVtLFxyXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyIHtcclxuICBmb250LXNpemU6IDEzcHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XHJcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBoZWlnaHQ6IDI1cHg7XHJcbiAgcGFkZGluZzogMCA1cHg7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHBhZGRpbmctbGVmdDogMTVweDtcclxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLXN0YXRlPVwib3BlblwiXSB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcclxufVxyXG5cclxuLkNvbnRleHRNZW51SXRlbVtkYXRhLWRpc2FibGVkXSxcclxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtW2RhdGEtZGlzYWJsZWRdLFxyXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW1bZGF0YS1kaXNhYmxlZF0sXHJcbi5Db250ZXh0TWVudVN1YlRyaWdnZXJbZGF0YS1kaXNhYmxlZF0ge1xyXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcclxuICBwb2ludGVyLWV2ZW50czogXCJub25lXCI7XHJcbn1cclxuXHJcbi5Db250ZXh0TWVudUl0ZW1bZGF0YS1oaWdobGlnaHRlZF0sXHJcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSxcclxuLkNvbnRleHRNZW51UmFkaW9JdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdLFxyXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtaGlnaGxpZ2h0ZWRdIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkOWRiO1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xyXG59XHJcblxyXG4uQ29udGV4dE1lbnVMYWJlbCB7XHJcbiAgcGFkZGluZy1sZWZ0OiAyNXB4O1xyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxuICBsaW5lLWhlaWdodDogMjVweDtcclxuICBjb2xvcjogdmFyKC0tbWF1dmUtMTEpO1xyXG59XHJcblxyXG4uQ29udGV4dE1lbnVJdGVtSW5kaWNhdG9yIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgbGVmdDogMDtcclxuICB3aWR0aDogMjVweDtcclxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG59XHJcblxyXG4uUmlnaHRTbG90IHtcclxuICBtYXJnaW4tbGVmdDogYXV0bztcclxuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XHJcbiAgY29sb3I6IHZhcigtLW1hdXZlLTExKTtcclxufVxyXG5cclxuW2RhdGEtaGlnaGxpZ2h0ZWRdID4gLlJpZ2h0U2xvdCB7XHJcbiAgY29sb3I6IHdoaXRlO1xyXG59XHJcblxyXG5bZGF0YS1kaXNhYmxlZF0gLlJpZ2h0U2xvdCB7XHJcbiAgY29sb3I6IHZhcigtLW1hdXZlLTgpO1xyXG59XHJcblxyXG4uZHJvcGRvd24tbWVudSB7XHJcbiAgbWluLXdpZHRoOiAxMHJlbTtcclxufVxyXG5cclxuLmRyb3Bkb3duLWl0ZW0ge1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIHBhZGRpbmc6IDAuM3JlbSAxLjJyZW07XHJcbiAgY2xlYXI6IGJvdGg7XHJcbiAgZm9udC13ZWlnaHQ6IDQwMDtcclxuICBjb2xvcjogIzM5M2EzOTtcclxuICB0ZXh0LWFsaWduOiBpbmhlcml0O1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XHJcbiAgYm9yZGVyOiAwO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLmRyb3Bkb3duLWl0ZW06aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWQ5ZGI7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XHJcbn1cclxuXHJcbi5tb2RhbCB7XHJcbiAgbWFyZ2luLXRvcDogNTBweDtcclxufVxyXG4ucGRmTmFtZSB7XHJcbiAgZm9udC1zaXplOiAxMHB4O1xyXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbn1cclxuXHJcblxyXG4uaHJTdHlsZSB7XHJcbiAgbWFyZ2luLXRvcDogMHJlbSAhaW1wb3J0YW50O1xyXG4gIG1hcmdpbi1ib3R0b206IDByZW0gIWltcG9ydGFudDtcclxuICBib3JkZXI6IDA7XHJcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcclxufVxyXG5cclxuLnN0YXR1cy1iYWRnZSB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIHRvcDogMDtcclxuICByaWdodDogMDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xyXG4gIHdpZHRoOiAyNHB4O1xyXG4gIGhlaWdodDogMjRweDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbn1cclxuXHJcbi5zdGF0dXMtYmFkZ2UgaSB7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG59XHJcblxyXG4vKiBTdGF0dXMtc3BlY2lmaWMgY29sb3JzICovXHJcbi5jb21wbGV0ZWQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICM0Y2FmNTA7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcbi5pbi1wcm9ncmVzcyB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYzEwNztcclxuICBjb2xvcjogI2ZmZjtcclxufVxyXG5cclxuLmRlY2xpbmVkIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2O1xyXG4gIGNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG4uZXhwaXJlZCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzllOWU5ZTtcclxuICBjb2xvcjogI2ZmZjtcclxufVxyXG5cclxuLmRyYWZ0IHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDc5Y2RjO1xyXG4gIGNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG5cclxuLnNvcnQge1xyXG4gIHBhZGRpbmc6IDhweCAxNXB4O1xyXG4gIG1hcmdpbjogNXB4O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5zb3J0OmhvdmVyIHtcclxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgxNjgsIDIwNCwgMjA2LCAwLjEpO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1hdXZlLTMpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDJweDtcclxufVxyXG5cclxuLmZpbGVOYW1lIHtcclxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgd2lkdGg6IDEwMHB4O1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gIGZvbnQtc2l6ZTogMTFweDtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgZm9udC13ZWlnaHQ6IDQ4MDtcclxufVxyXG5cclxuYSB7XHJcbiAgYWxsOiB1bnNldDtcclxufVxyXG5cclxuLkhvdmVyQ2FyZENvbnRlbnQge1xyXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcclxuICBwYWRkaW5nOiA1cHggMTBweDtcclxuICB3aWR0aDogMTcwcHg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgYm94LXNoYWRvdzpcclxuICAgIGhzbCgyMDYgMjIlIDclIC8gMzUlKSAwcHggMTBweCAzOHB4IC0xMHB4LFxyXG4gICAgaHNsKDIwNiAyMiUgNyUgLyAyMCUpIDBweCAxMHB4IDIwcHggLTE1cHg7XHJcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiA0MDBtcztcclxuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcclxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG59XHJcblxyXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XCJ0b3BcIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZURvd25BbmRGYWRlO1xyXG59XHJcblxyXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XCJyaWdodFwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlTGVmdEFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cImJvdHRvbVwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlVXBBbmRGYWRlO1xyXG59XHJcblxyXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XCJsZWZ0XCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVSaWdodEFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRBcnJvdyB7XHJcbiAgZmlsbDogd2hpdGU7XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc2xpZGVVcEFuZEZhZGUge1xyXG4gIDAlIHtcclxuICAgIG9wYWNpdHk6IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KTtcclxuICB9XHJcblxyXG4gIDEwMCUge1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcclxuICB9XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc2xpZGVSaWdodEFuZEZhZGUge1xyXG4gIDAlIHtcclxuICAgIG9wYWNpdHk6IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTJweCk7XHJcbiAgfVxyXG5cclxuICAxMDAlIHtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XHJcbiAgfVxyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIHNsaWRlRG93bkFuZEZhZGUge1xyXG4gIDAlIHtcclxuICAgIG9wYWNpdHk6IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7XHJcbiAgfVxyXG5cclxuICAxMDAlIHtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XHJcbiAgfVxyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIHNsaWRlTGVmdEFuZEZhZGUge1xyXG4gIDAlIHtcclxuICAgIG9wYWNpdHk6IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMnB4KTtcclxuICB9XHJcblxyXG4gIDEwMCUge1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSAobWluLXdpZHRoOiAzMTBweCkgYW5kIChtYXgtd2lkdGg6IDU1MHB4KSB7XHJcbiAgLnNvcnQge1xyXG4gICAgcGFkZGluZzogMnB4O1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzA5cHgpIHtcclxuICAuc29ydCB7XHJcbiAgICBwYWRkaW5nOiAycHg7XHJcbiAgfVxyXG59XHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazov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OEJBQThCO0FBQ2hDOztBQUVBO0VBQ0UsaUNBQWlDO0FBQ25DOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0U7SUFDRSxVQUFVO0lBQ1YsMEJBQTBCO0VBQzVCOztFQUVBO0lBQ0UsVUFBVTtJQUNWLHdCQUF3QjtFQUMxQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxVQUFVO0lBQ1YsMkJBQTJCO0VBQzdCOztFQUVBO0lBQ0UsVUFBVTtJQUNWLHdCQUF3QjtFQUMxQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxVQUFVO0lBQ1YsMkJBQTJCO0VBQzdCOztFQUVBO0lBQ0UsVUFBVTtJQUNWLHdCQUF3QjtFQUMxQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxVQUFVO0lBQ1YsMEJBQTBCO0VBQzVCOztFQUVBO0lBQ0UsVUFBVTtJQUNWLHdCQUF3QjtFQUMxQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxZQUFZO0VBQ2Q7QUFDRjs7QUFFQTtFQUNFO0lBQ0UsWUFBWTtFQUNkO0FBQ0ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiQGltcG9ydCBcXFwiQHJhZGl4LXVpL2NvbG9ycy9ibGFjay1hbHBoYS5jc3NcXFwiO1xcclxcbkBpbXBvcnQgXFxcIkByYWRpeC11aS9jb2xvcnMvbWF1dmUuY3NzXFxcIjtcXHJcXG5AaW1wb3J0IFxcXCJAcmFkaXgtdWkvY29sb3JzL3Zpb2xldC5jc3NcXFwiO1xcclxcblxcclxcbi5Db250ZXh0TWVudUNvbnRlbnQsXFxyXFxuLkNvbnRleHRNZW51U3ViQ29udGVudCB7XFxyXFxuICBtaW4td2lkdGg6IDEzNXB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBib3JkZXItcmFkaXVzOiA2cHg7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgcGFkZGluZzogNXB4O1xcclxcbiAgYm94LXNoYWRvdzpcXHJcXG4gICAgMHB4IDEwcHggMzhweCAtMTBweCByZ2JhKDIyLCAyMywgMjQsIDAuMzUpLFxcclxcbiAgICAwcHggMTBweCAyMHB4IC0xNXB4IHJnYmEoMjIsIDIzLCAyNCwgMC4yKTtcXHJcXG4gIHotaW5kZXg6IDk5O1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVJdGVtLFxcclxcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbSxcXHJcXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW0sXFxyXFxuLkNvbnRleHRNZW51U3ViVHJpZ2dlciB7XFxyXFxuICBmb250LXNpemU6IDEzcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMTtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBoZWlnaHQ6IDI1cHg7XFxyXFxuICBwYWRkaW5nOiAwIDVweDtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmctbGVmdDogMTVweDtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLXN0YXRlPVxcXCJvcGVuXFxcIl0ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVJdGVtW2RhdGEtZGlzYWJsZWRdLFxcclxcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbVtkYXRhLWRpc2FibGVkXSxcXHJcXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW1bZGF0YS1kaXNhYmxlZF0sXFxyXFxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLWRpc2FibGVkXSB7XFxyXFxuICBjb2xvcjogdmFyKC0tbWF1dmUtOCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogXFxcIm5vbmVcXFwiO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVJdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdLFxcclxcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSxcXHJcXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW1bZGF0YS1oaWdobGlnaHRlZF0sXFxyXFxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLWhpZ2hsaWdodGVkXSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkOWRiO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxufVxcclxcblxcclxcbi5Db250ZXh0TWVudUxhYmVsIHtcXHJcXG4gIHBhZGRpbmctbGVmdDogMjVweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyNXB4O1xcclxcbiAgY29sb3I6IHZhcigtLW1hdXZlLTExKTtcXHJcXG59XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51SXRlbUluZGljYXRvciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgd2lkdGg6IDI1cHg7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLlJpZ2h0U2xvdCB7XFxyXFxuICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gIHBhZGRpbmctbGVmdDogMjBweDtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS0xMSk7XFxyXFxufVxcclxcblxcclxcbltkYXRhLWhpZ2hsaWdodGVkXSA+IC5SaWdodFNsb3Qge1xcclxcbiAgY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG5bZGF0YS1kaXNhYmxlZF0gLlJpZ2h0U2xvdCB7XFxyXFxuICBjb2xvcjogdmFyKC0tbWF1dmUtOCk7XFxyXFxufVxcclxcblxcclxcbi5kcm9wZG93bi1tZW51IHtcXHJcXG4gIG1pbi13aWR0aDogMTByZW07XFxyXFxufVxcclxcblxcclxcbi5kcm9wZG93bi1pdGVtIHtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBwYWRkaW5nOiAwLjNyZW0gMS4ycmVtO1xcclxcbiAgY2xlYXI6IGJvdGg7XFxyXFxuICBmb250LXdlaWdodDogNDAwO1xcclxcbiAgY29sb3I6ICMzOTNhMzk7XFxyXFxuICB0ZXh0LWFsaWduOiBpbmhlcml0O1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyOiAwO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uZHJvcGRvd24taXRlbTpob3ZlciB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkOWRiO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxufVxcclxcblxcclxcbi5tb2RhbCB7XFxyXFxuICBtYXJnaW4tdG9wOiA1MHB4O1xcclxcbn1cXHJcXG4ucGRmTmFtZSB7XFxyXFxuICBmb250LXNpemU6IDEwcHg7XFxyXFxuICBmb250LXdlaWdodDogNjAwO1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4uaHJTdHlsZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAwcmVtICFpbXBvcnRhbnQ7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwcmVtICFpbXBvcnRhbnQ7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbn1cXHJcXG5cXHJcXG4uc3RhdHVzLWJhZGdlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXHJcXG4gIHdpZHRoOiAyNHB4O1xcclxcbiAgaGVpZ2h0OiAyNHB4O1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxufVxcclxcblxcclxcbi5zdGF0dXMtYmFkZ2UgaSB7XFxyXFxuICBmb250LXNpemU6IDEycHg7XFxyXFxufVxcclxcblxcclxcbi8qIFN0YXR1cy1zcGVjaWZpYyBjb2xvcnMgKi9cXHJcXG4uY29tcGxldGVkIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICM0Y2FmNTA7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmluLXByb2dyZXNzIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmMxMDc7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmRlY2xpbmVkIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmV4cGlyZWQge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzllOWU5ZTtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4uZHJhZnQge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA3OWNkYztcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4uc29ydCB7XFxyXFxuICBwYWRkaW5nOiA4cHggMTVweDtcXHJcXG4gIG1hcmdpbjogNXB4O1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLnNvcnQ6aG92ZXIge1xcclxcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMTY4LCAyMDQsIDIwNiwgMC4xKTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1hdXZlLTMpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xcclxcbn1cXHJcXG5cXHJcXG4uZmlsZU5hbWUge1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgd2lkdGg6IDEwMHB4O1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgZm9udC1zaXplOiAxMXB4O1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgZm9udC13ZWlnaHQ6IDQ4MDtcXHJcXG59XFxyXFxuXFxyXFxuYSB7XFxyXFxuICBhbGw6IHVuc2V0O1xcclxcbn1cXHJcXG5cXHJcXG4uSG92ZXJDYXJkQ29udGVudCB7XFxyXFxuICBib3JkZXItcmFkaXVzOiA2cHg7XFxyXFxuICBwYWRkaW5nOiA1cHggMTBweDtcXHJcXG4gIHdpZHRoOiAxNzBweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgYm94LXNoYWRvdzpcXHJcXG4gICAgaHNsKDIwNiAyMiUgNyUgLyAzNSUpIDBweCAxMHB4IDM4cHggLTEwcHgsXFxyXFxuICAgIGhzbCgyMDYgMjIlIDclIC8gMjAlKSAwcHggMTBweCAyMHB4IC0xNXB4O1xcclxcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiA0MDBtcztcXHJcXG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xcclxcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybSwgb3BhY2l0eTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cXFwidG9wXFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlRG93bkFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cXFwicmlnaHRcXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVMZWZ0QW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVxcXCJib3R0b21cXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVVcEFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cXFwibGVmdFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVJpZ2h0QW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZEFycm93IHtcXHJcXG4gIGZpbGw6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlVXBBbmRGYWRlIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDJweCk7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAxMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlUmlnaHRBbmRGYWRlIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0ycHgpO1xcclxcbiAgfVxcclxcblxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBzbGlkZURvd25BbmRGYWRlIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpO1xcclxcbiAgfVxcclxcblxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBzbGlkZUxlZnRBbmRGYWRlIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDJweCk7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAxMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgKG1pbi13aWR0aDogMzEwcHgpIGFuZCAobWF4LXdpZHRoOiA1NTBweCkge1xcclxcbiAgLnNvcnQge1xcclxcbiAgICBwYWRkaW5nOiAycHg7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwOXB4KSB7XFxyXFxuICAuc29ydCB7XFxyXFxuICAgIHBhZGRpbmc6IDJweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIkBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RmFzdGhhbmQmZGlzcGxheT1zd2FwKTtcIl0pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIkBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RGFuY2luZytTY3JpcHQmZGlzcGxheT1zd2FwKTtcIl0pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIkBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RGVsaWNpb3VzK0hhbmRyYXduJmRpc3BsYXk9c3dhcCk7XCJdKTtcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJAaW1wb3J0IHVybChodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUNlZGFydmlsbGUrQ3Vyc2l2ZSZkaXNwbGF5PXN3YXApO1wiXSk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXIge1xyXG4gIHBvc2l0aW9uOiBpbml0aWFsICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi53aWRnZXRzIHtcclxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xyXG4gIC8qIERpc2FibGUgdGV4dCBzZWxlY3Rpb24gaW4gV2ViS2l0IGJyb3dzZXJzICovXHJcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbn1cclxuXHJcbi5yYWRpb0J1dHRvbiB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBsZWZ0OiAwcHg7XHJcbiAgdG9wOiAwcHg7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkICMwMDdiZmY7XHJcbiAgYm9yZGVyLXJhZGl1czogNTBweDtcclxufVxyXG5cclxuLnNpZ25hdHVyZUNhbnZhcyB7XHJcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XHJcbiAgd2lkdGg6IDQ2MHB4O1xyXG4gIGhlaWdodDogMTg0cHg7XHJcbn1cclxuXHJcbi5pbnRpYWxTaWduYXR1cmVDYW52YXMge1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xyXG4gIHdpZHRoOiAxNTBweDtcclxuICBoZWlnaHQ6IDE1MHB4O1xyXG59XHJcblxyXG4uaW50aWFsU2lnbmF0dXJlIHtcclxuICBib3JkZXI6IDJweCBzb2xpZCAjODg4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcclxuICB3aWR0aDogMTgzcHg7XHJcbiAgaGVpZ2h0OiAxODNweDtcclxufVxyXG5cclxuLnBlbkNvbnRhaW5lckRlZmF1bHQge1xyXG4gIHdpZHRoOiA0NjBweDtcclxufVxyXG5cclxuLmljb24ge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBmb250LXNpemU6IDE0cHg7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHotaW5kZXg6IDI7XHJcbiAgYmFja2dyb3VuZDogd2hpdGU7XHJcbn1cclxuXHJcbi5TY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWSB7XHJcbiAgd2lkdGg6IDRweCAhaW1wb3J0YW50O1xyXG59XHJcbi5TY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWCB7XHJcbiAgaGVpZ2h0OiA0cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLnNpZ25Zb3Vyc2VsZkJsb2NrIHtcclxuICBwYWRkaW5nOiAwcHg7XHJcbiAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyICFpbXBvcnRhbnQ7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uc2VuZE1haWwge1xyXG4gIGJveC1zaGFkb3c6XHJcbiAgICAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpLFxyXG4gICAgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7XHJcbiAgcGFkZGluZzogM3B4IDMwcHg7XHJcbiAgY29sb3I6IHdoaXRlO1xyXG4gIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcclxuICBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XHJcbn1cclxuXHJcbi51c2VyIHtcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcclxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxufVxyXG4uZGlzYWJsZWQge1xyXG4gIG9wYWNpdHk6IDAuNTtcclxuICAvKiBFeGFtcGxlOiByZWR1Y2Ugb3BhY2l0eSB0byB2aXN1YWxseSBpbmRpY2F0ZSBkaXNhYmxlZCBzdGF0ZSAqL1xyXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG4gIC8qIFByZXZlbnRzIG1vdXNlIGNsaWNrcyBhbmQgb3RoZXIgZXZlbnRzICovXHJcbiAgLyogYmFja2dyb3VuZC1jb2xvcjogIzg4ODsgKi9cclxufVxyXG5cclxuLnNpZ25UYWIge1xyXG4gIGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50O1xyXG4gIGZvbnQtd2VpZ2h0OiA0MDAgIWltcG9ydGFudDtcclxuICBtYXJnaW46IDdweCAhaW1wb3J0YW50O1xyXG4gIGZvbnQtc2l6ZTogMTVweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uc2lnbmVyQ29tcG9uZW50IHtcclxuICAvKiBib3gtc2hhZG93OiByZ2JhKDE3LCAxMiwgNDYsIDAuMTUpIDBweCA0OHB4IDEwMHB4IDBweDsgKi9cclxuICAvKiB3aWR0aDogMTgwcHg7ICovXHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi51cGxvYWRJbWdMb2dvIHtcclxuICBmb250LXNpemU6IDUwcHg7XHJcbn1cclxuXHJcbi5Ecm9wZG93bk1lbnVDb250ZW50LFxyXG4uRHJvcGRvd25NZW51U3ViQ29udGVudCB7XHJcbiAgbWluLXdpZHRoOiAxMzBweDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcclxuICBwYWRkaW5nOiA1cHg7XHJcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiA0MDBtcztcclxuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcclxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xyXG4gIHotaW5kZXg6IDMwICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cInRvcFwiXSxcclxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVwidG9wXCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVEb3duQW5kRmFkZTtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVwicmlnaHRcIl0sXHJcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cInJpZ2h0XCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVMZWZ0QW5kRmFkZTtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVwiYm90dG9tXCJdLFxyXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XCJib3R0b21cIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVVwQW5kRmFkZTtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVwibGVmdFwiXSxcclxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVwibGVmdFwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlUmlnaHRBbmRGYWRlO1xyXG59XHJcblxyXG4uRHJvcGRvd25NZW51SXRlbSB7XHJcbiAgZm9udC1zaXplOiAxM3B4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxO1xyXG4gIGNvbG9yOiBibGFjaztcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBoZWlnaHQ6IDI1cHg7XHJcbiAgcGFkZGluZzogMCA1cHg7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHBhZGRpbmctbGVmdDogMjBweDtcclxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxuICBib3JkZXI6IG5vbmU7XHJcbn1cclxuXHJcbi5TZWxlY3RUcmlnZ2VyIHtcclxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBwYWRkaW5nOiAwIDcwcHg7XHJcbiAgZm9udC1zaXplOiAxM3B4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxO1xyXG4gIGhlaWdodDogMzVweDtcclxuICBnYXA6IDVweDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4N2FiZjtcclxuICB3aWR0aDogMTAwcHg7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbn1cclxuXHJcbi5zZWxlY3RFbWFpbCB7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgcGFkZGluZzogMCAxNXB4O1xyXG4gIGZvbnQtc2l6ZTogMTNweDtcclxuICBsaW5lLWhlaWdodDogMTtcclxuICBoZWlnaHQ6IDM1cHg7XHJcbiAgZ2FwOiA1cHg7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICM4ODdhYmY7XHJcbiAgd2lkdGg6IDIwMHB4O1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG59XHJcblxyXG5vcHRpb24ge1xyXG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcclxufVxyXG5cclxuLlNlbGVjdFRyaWdnZXI6aG92ZXIge1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4uc2VsZWN0RW1haWw6aG92ZXIge1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4uU2VsZWN0VHJpZ2dlcjpmb2N1cyB7XHJcbiAgLyogYm94LXNoYWRvdzogMCAwIDAgMnB4IGJsYWNrOyAqL1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4uc2VsZWN0RW1haWw6Zm9jdXMge1xyXG4gIC8qIGJveC1zaGFkb3c6IDAgMCAwIDJweCBibGFjazsgKi9cclxuICBib3JkZXI6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLlNlbGVjdFRyaWdnZXJbZGF0YS1wbGFjZWhvbGRlcl0ge1xyXG4gIGNvbG9yOiBibGFjaztcclxufVxyXG5cclxuLlNlbGVjdEljb24ge1xyXG4gIGNvbG9yOiBWYXIoLS12aW9sZXQtMTEpO1xyXG59XHJcblxyXG4uU2VsZWN0Q29udGVudCB7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICBib3JkZXItcmFkaXVzOiA2cHg7XHJcbiAgYm94LXNoYWRvdzpcclxuICAgIDBweCAxMHB4IDM4cHggLTEwcHggcmdiYSgyMiwgMjMsIDI0LCAwLjM1KSxcclxuICAgIDBweCAxMHB4IDIwcHggLTE1cHggcmdiYSgyMiwgMjMsIDI0LCAwLjIpO1xyXG59XHJcblxyXG4uU2VsZWN0Vmlld3BvcnQge1xyXG4gIHBhZGRpbmc6IDVweDtcclxufVxyXG5cclxuLlNlbGVjdEl0ZW0ge1xyXG4gIGZvbnQtc2l6ZTogMTNweDtcclxuICBsaW5lLWhlaWdodDogMTtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcclxuICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGhlaWdodDogMjVweDtcclxuICBwYWRkaW5nOiAwIDM1cHggMCAyNXB4O1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgei1pbmRleDogMTAgIWltcG9ydGFudDtcclxufVxyXG5cclxuLlNlbGVjdEl0ZW1bZGF0YS1kaXNhYmxlZF0ge1xyXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcclxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxufVxyXG5cclxuLlNlbGVjdEl0ZW1bZGF0YS1oaWdobGlnaHRlZF0ge1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmlvbGV0LTkpO1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMSk7XHJcbn1cclxuXHJcbi5TZWxlY3RMYWJlbCB7XHJcbiAgcGFkZGluZzogMCAyNXB4O1xyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxuICBsaW5lLWhlaWdodDogMjVweDtcclxuICBjb2xvcjogdmFyKC0tbWF1dmUtMTEpO1xyXG59XHJcblxyXG4uU2VsZWN0U2VwYXJhdG9yIHtcclxuICBoZWlnaHQ6IDFweDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12aW9sZXQtNik7XHJcbiAgbWFyZ2luOiA1cHg7XHJcbn1cclxuXHJcbi5TZWxlY3RJdGVtSW5kaWNhdG9yIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgbGVmdDogMDtcclxuICB3aWR0aDogMjVweDtcclxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG59XHJcblxyXG4uU2VsZWN0U2Nyb2xsQnV0dG9uIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgaGVpZ2h0OiAyNXB4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xyXG4gIGN1cnNvcjogZGVmYXVsdDtcclxufVxyXG5cclxuLmRyb3BEb3duU3R5bGUge1xyXG4gIHdpZHRoOiBhdXRvO1xyXG59XHJcblxyXG4uYXV0b1NpZ25TY3JvbGwge1xyXG4gIG92ZXJmbG93LXk6IGF1dG87XHJcbn1cclxuXHJcbi5hdXRvU2lnblNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi52YWxpZGF0ZUlucHV0VGV4dCB7XHJcbiAgd2lkdGg6IDc2JTtcclxufVxyXG5cclxuLnJhZGlvR3JvdXBJbnB1dCB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5yYWRpb0dyb3VwIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xyXG59XHJcblxyXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjZweCkge1xyXG4gIC52YWxpZGF0ZUlucHV0VGV4dCB7XHJcbiAgICB3aWR0aDogOTMlO1xyXG4gIH1cclxuXHJcbiAgLmRyb3Bkb3duLW1lbnUge1xyXG4gICAgbWluLXdpZHRoOiAwcmVtICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5cclxuICAjbmF2YmFyIHtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB6LWluZGV4OiA0OTtcclxuICB9XHJcblxyXG4gIC8qIE5hdmJhciBsaW5rcyAqL1xyXG4gICNuYXZiYXIgYSB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgY29sb3I6ICNmMmYyZjI7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBwYWRkaW5nOiAxNHB4O1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gIH1cclxuXHJcbiAgI25hdmJhciBhLmFjdGl2ZSB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGNhZjUwO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gIH1cclxuXHJcbiAgLyogUGFnZSBjb250ZW50ICovXHJcbiAgLmNvbnRlbnQge1xyXG4gICAgcGFkZGluZzogMTZweDtcclxuICB9XHJcblxyXG4gIC8qIFRoZSBzdGlja3kgY2xhc3MgaXMgYWRkZWQgdG8gdGhlIG5hdmJhclxyXG4gIHdpdGggSlMgd2hlbiBpdCByZWFjaGVzIGl0cyBzY3JvbGwgcG9zaXRpb24gKi9cclxuICAuc3RpY2t5SGVhZCB7XHJcbiAgICB0b3A6IDUwcHg7XHJcbiAgICBsZWZ0OiAwLjlyZW07XHJcbiAgfVxyXG5cclxuICAuc3RpY2t5U2lnbmVySGVhZCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgfVxyXG5cclxuICAvKiBBZGQgc29tZSB0b3AgcGFkZGluZyB0byB0aGUgcGFnZSBjb250ZW50XHJcbiAgdG8gcHJldmVudCBzdWRkZW4gcXVpY2sgbW92ZW1lbnQgKGFzIHRoZVxyXG4gIG5hdmlnYXRpb24gYmFyIGdldHMgYSBuZXcgcG9zaXRpb24gYXQgdGhlIHRvcCBvZiB0aGVcclxuICBwYWdlIChwb3NpdGlvbjpmaXhlZCBhbmQgdG9wOjApICovXHJcbiAgLnN0aWNreUhlYWQgKyAuY29udGVudCB7XHJcbiAgICBwYWRkaW5nLXRvcDogNjBweDtcclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4N3B4KSBhbmQgKG1pbi13aWR0aDogMzUxcHgpIHtcclxuICAuc2lnbmF0dXJlQ2FudmFzIHtcclxuICAgIHdpZHRoOiAzMDBweDtcclxuICAgIGhlaWdodDogMTIwcHg7XHJcbiAgfVxyXG5cclxuICAucGVuQ29udGFpbmVyRGVmYXVsdCB7XHJcbiAgICB3aWR0aDogMzAwcHg7XHJcbiAgfVxyXG5cclxuICAudXBsb2FkSW1nTG9nbyB7XHJcbiAgICBmb250LXNpemU6IDMwcHg7XHJcbiAgfVxyXG5cclxuICAuc2lnblRhYiB7XHJcbiAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XHJcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcclxuICB9XHJcbn1cclxuXHJcbi5zY3JvbGwtaGlkZTo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzUwcHgpIGFuZCAobWluLXdpZHRoOiAzMTFweCkge1xyXG4gIC5zaWduYXR1cmVDYW52YXMge1xyXG4gICAgd2lkdGg6IDI4MHB4O1xyXG4gICAgaGVpZ2h0OiAxMTJweDtcclxuICB9XHJcblxyXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcclxuICAgIHdpZHRoOiAyODBweDtcclxuICB9XHJcblxyXG4gIC5zaWduVGFiIHtcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcclxuXHJcbiAgICBmb250LXNpemU6IDEwcHggIWltcG9ydGFudDtcclxuICB9XHJcblxyXG4gIC51cGxvYWRJbWdMb2dvIHtcclxuICAgIGZvbnQtc2l6ZTogMjVweDtcclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMxMHB4KSB7XHJcbiAgLnNpZ25hdHVyZUNhbnZhcyB7XHJcbiAgICB3aWR0aDogMjMwcHg7XHJcbiAgICBoZWlnaHQ6IDkycHg7XHJcbiAgfVxyXG5cclxuICAucGVuQ29udGFpbmVyRGVmYXVsdCB7XHJcbiAgICB3aWR0aDogMjMwcHg7XHJcbiAgfVxyXG5cclxuICAuc2lnblRhYiB7XHJcbiAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XHJcbiAgICBmb250LXNpemU6IDhweCAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgLnVwbG9hZEltZ0xvZ28ge1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gIH1cclxufVxyXG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9zdHlsZXMvc2lnbmF0dXJlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFLQTtFQUNFLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6Qiw4Q0FBOEM7RUFFOUMsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsV0FBVztFQUNYLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsU0FBUztFQUNULFFBQVE7RUFDUixlQUFlO0VBQ2YseUJBQXlCO0VBQ3pCLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLHNC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LFNBQVM7SUFDVCxZQUFZO0VBQ2Q7O0VBRUE7SUFDRSxlQUFlO0VBQ2pCOztFQUVBOzs7bUNBR2lDO0VBQ2pDO0lBQ0UsaUJBQWlCO0VBQ25CO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFlBQVk7SUFDWixhQUFhO0VBQ2Y7O0VBRUE7SUFDRSxZQUFZO0VBQ2Q7O0VBRUE7SUFDRSxlQUFlO0VBQ2pCOztFQUVBO0lBQ0UsMkJBQTJCO0lBQzNCLDBCQUEwQjtFQUM1QjtBQUNGOztBQUVBO0VBQ0UsYUFBYTtBQUNmO0FBQ0E7RUFDRTtJQUNFLFlBQVk7SUFDWixhQUFhO0VBQ2Y7O0VBRUE7SUFDRSxZQUFZO0VBQ2Q7O0VBRUE7SUFDRSwyQkFBMkI7O0lBRTNCLDBCQUEwQjtFQUM1Qjs7RUFFQTtJQUNFLGVBQWU7RUFDakI7QUFDRjs7QUFFQTtFQUNFO0lBQ0UsWUFBWTtJQUNaLFlBQVk7RUFDZDs7RUFFQTtJQUNFLFlBQVk7RUFDZDs7RUFFQTtJQUNFLDJCQUEyQjtJQUMzQix5QkFBeUI7RUFDM0I7O0VBRUE7SUFDRSxlQUFlO0VBQ2pCO0FBQ0ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiQGltcG9ydCB1cmwoXFxcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RmFzdGhhbmQmZGlzcGxheT1zd2FwXFxcIik7XFxyXFxuQGltcG9ydCB1cmwoXFxcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RGFuY2luZytTY3JpcHQmZGlzcGxheT1zd2FwXFxcIik7XFxyXFxuQGltcG9ydCB1cmwoXFxcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RGVsaWNpb3VzK0hhbmRyYXduJmRpc3BsYXk9c3dhcFxcXCIpO1xcclxcbkBpbXBvcnQgdXJsKFxcXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUNlZGFydmlsbGUrQ3Vyc2l2ZSZkaXNwbGF5PXN3YXBcXFwiKTtcXHJcXG5cXHJcXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyIHtcXHJcXG4gIHBvc2l0aW9uOiBpbml0aWFsICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi53aWRnZXRzIHtcXHJcXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICAvKiBEaXNhYmxlIHRleHQgc2VsZWN0aW9uIGluIFdlYktpdCBicm93c2VycyAqL1xcclxcbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4ucmFkaW9CdXR0b24ge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBoZWlnaHQ6IDEwMCU7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBsZWZ0OiAwcHg7XFxyXFxuICB0b3A6IDBweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICMwMDdiZmY7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1MHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uc2lnbmF0dXJlQ2FudmFzIHtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxyXFxuICB3aWR0aDogNDYwcHg7XFxyXFxuICBoZWlnaHQ6IDE4NHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uaW50aWFsU2lnbmF0dXJlQ2FudmFzIHtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxyXFxuICB3aWR0aDogMTUwcHg7XFxyXFxuICBoZWlnaHQ6IDE1MHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uaW50aWFsU2lnbmF0dXJlIHtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxyXFxuICB3aWR0aDogMTgzcHg7XFxyXFxuICBoZWlnaHQ6IDE4M3B4O1xcclxcbn1cXHJcXG5cXHJcXG4ucGVuQ29udGFpbmVyRGVmYXVsdCB7XFxyXFxuICB3aWR0aDogNDYwcHg7XFxyXFxufVxcclxcblxcclxcbi5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGZvbnQtc2l6ZTogMTRweDtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLlNjcm9sbGJhcnNDdXN0b20tVHJhY2tZIHtcXHJcXG4gIHdpZHRoOiA0cHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLlNjcm9sbGJhcnNDdXN0b20tVHJhY2tYIHtcXHJcXG4gIGhlaWdodDogNHB4ICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5zaWduWW91cnNlbGZCbG9jayB7XFxyXFxuICBwYWRkaW5nOiAwcHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uc2VuZE1haWwge1xcclxcbiAgYm94LXNoYWRvdzpcXHJcXG4gICAgMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSxcXHJcXG4gICAgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7XFxyXFxuICBwYWRkaW5nOiAzcHggMzBweDtcXHJcXG4gIGNvbG9yOiB3aGl0ZTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcXHJcXG4gIGZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxyXFxufVxcclxcblxcclxcbi51c2VyIHtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG59XFxyXFxuLmRpc2FibGVkIHtcXHJcXG4gIG9wYWNpdHk6IDAuNTtcXHJcXG4gIC8qIEV4YW1wbGU6IHJlZHVjZSBvcGFjaXR5IHRvIHZpc3VhbGx5IGluZGljYXRlIGRpc2FibGVkIHN0YXRlICovXFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG4gIC8qIFByZXZlbnRzIG1vdXNlIGNsaWNrcyBhbmQgb3RoZXIgZXZlbnRzICovXFxyXFxuICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiAjODg4OyAqL1xcclxcbn1cXHJcXG5cXHJcXG4uc2lnblRhYiB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXIgIWltcG9ydGFudDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA0MDAgIWltcG9ydGFudDtcXHJcXG4gIG1hcmdpbjogN3B4ICFpbXBvcnRhbnQ7XFxyXFxuICBmb250LXNpemU6IDE1cHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLnNpZ25lckNvbXBvbmVudCB7XFxyXFxuICAvKiBib3gtc2hhZG93OiByZ2JhKDE3LCAxMiwgNDYsIDAuMTUpIDBweCA0OHB4IDEwMHB4IDBweDsgKi9cXHJcXG4gIC8qIHdpZHRoOiAxODBweDsgKi9cXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4udXBsb2FkSW1nTG9nbyB7XFxyXFxuICBmb250LXNpemU6IDUwcHg7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVDb250ZW50LFxcclxcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50IHtcXHJcXG4gIG1pbi13aWR0aDogMTMwcHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XFxyXFxuICBwYWRkaW5nOiA1cHg7XFxyXFxuICBhbmltYXRpb24tZHVyYXRpb246IDQwMG1zO1xcclxcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSk7XFxyXFxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xcclxcbiAgei1pbmRleDogMzAgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVxcXCJ0b3BcXFwiXSxcXHJcXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XFxcInRvcFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZURvd25BbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XFxcInJpZ2h0XFxcIl0sXFxyXFxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVxcXCJyaWdodFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZUxlZnRBbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XFxcImJvdHRvbVxcXCJdLFxcclxcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cXFwiYm90dG9tXFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlVXBBbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XFxcImxlZnRcXFwiXSxcXHJcXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XFxcImxlZnRcXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVSaWdodEFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVJdGVtIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTNweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcclxcbiAgY29sb3I6IGJsYWNrO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgaGVpZ2h0OiAyNXB4O1xcclxcbiAgcGFkZGluZzogMCA1cHg7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RUcmlnZ2VyIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgcGFkZGluZzogMCA3MHB4O1xcclxcbiAgZm9udC1zaXplOiAxM3B4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDE7XFxyXFxuICBoZWlnaHQ6IDM1cHg7XFxyXFxuICBnYXA6IDVweDtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICM4ODdhYmY7XFxyXFxuICB3aWR0aDogMTAwcHg7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxufVxcclxcblxcclxcbi5zZWxlY3RFbWFpbCB7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBwYWRkaW5nOiAwIDE1cHg7XFxyXFxuICBmb250LXNpemU6IDEzcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMTtcXHJcXG4gIGhlaWdodDogMzVweDtcXHJcXG4gIGdhcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4N2FiZjtcXHJcXG4gIHdpZHRoOiAyMDBweDtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG59XFxyXFxuXFxyXFxub3B0aW9uIHtcXHJcXG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFRyaWdnZXI6aG92ZXIge1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnNlbGVjdEVtYWlsOmhvdmVyIHtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RUcmlnZ2VyOmZvY3VzIHtcXHJcXG4gIC8qIGJveC1zaGFkb3c6IDAgMCAwIDJweCBibGFjazsgKi9cXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5zZWxlY3RFbWFpbDpmb2N1cyB7XFxyXFxuICAvKiBib3gtc2hhZG93OiAwIDAgMCAycHggYmxhY2s7ICovXFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0VHJpZ2dlcltkYXRhLXBsYWNlaG9sZGVyXSB7XFxyXFxuICBjb2xvcjogYmxhY2s7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RJY29uIHtcXHJcXG4gIGNvbG9yOiBWYXIoLS12aW9sZXQtMTEpO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0Q29udGVudCB7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBib3JkZXItcmFkaXVzOiA2cHg7XFxyXFxuICBib3gtc2hhZG93OlxcclxcbiAgICAwcHggMTBweCAzOHB4IC0xMHB4IHJnYmEoMjIsIDIzLCAyNCwgMC4zNSksXFxyXFxuICAgIDBweCAxMHB4IDIwcHggLTE1cHggcmdiYSgyMiwgMjMsIDI0LCAwLjIpO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0Vmlld3BvcnQge1xcclxcbiAgcGFkZGluZzogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0SXRlbSB7XFxyXFxuICBmb250LXNpemU6IDEzcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMTtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBoZWlnaHQ6IDI1cHg7XFxyXFxuICBwYWRkaW5nOiAwIDM1cHggMCAyNXB4O1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICB6LWluZGV4OiAxMCAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0SXRlbVtkYXRhLWRpc2FibGVkXSB7XFxyXFxuICBjb2xvcjogdmFyKC0tbWF1dmUtOCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdEl0ZW1bZGF0YS1oaWdobGlnaHRlZF0ge1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXZpb2xldC05KTtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMSk7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RMYWJlbCB7XFxyXFxuICBwYWRkaW5nOiAwIDI1cHg7XFxyXFxuICBmb250LXNpemU6IDEycHg7XFxyXFxuICBsaW5lLWhlaWdodDogMjVweDtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS0xMSk7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RTZXBhcmF0b3Ige1xcclxcbiAgaGVpZ2h0OiAxcHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12aW9sZXQtNik7XFxyXFxuICBtYXJnaW46IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdEl0ZW1JbmRpY2F0b3Ige1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHdpZHRoOiAyNXB4O1xcclxcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RTY3JvbGxCdXR0b24ge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGhlaWdodDogMjVweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxyXFxufVxcclxcblxcclxcbi5kcm9wRG93blN0eWxlIHtcXHJcXG4gIHdpZHRoOiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG4uYXV0b1NpZ25TY3JvbGwge1xcclxcbiAgb3ZlcmZsb3cteTogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmF1dG9TaWduU2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7XFxyXFxuICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4udmFsaWRhdGVJbnB1dFRleHQge1xcclxcbiAgd2lkdGg6IDc2JTtcXHJcXG59XFxyXFxuXFxyXFxuLnJhZGlvR3JvdXBJbnB1dCB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLnJhZGlvR3JvdXAge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2NnB4KSB7XFxyXFxuICAudmFsaWRhdGVJbnB1dFRleHQge1xcclxcbiAgICB3aWR0aDogOTMlO1xcclxcbiAgfVxcclxcblxcclxcbiAgLmRyb3Bkb3duLW1lbnUge1xcclxcbiAgICBtaW4td2lkdGg6IDByZW0gIWltcG9ydGFudDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gICNuYXZiYXIge1xcclxcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgICB6LWluZGV4OiA0OTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC8qIE5hdmJhciBsaW5rcyAqL1xcclxcbiAgI25hdmJhciBhIHtcXHJcXG4gICAgZmxvYXQ6IGxlZnQ7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgICBjb2xvcjogI2YyZjJmMjtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBwYWRkaW5nOiAxNHB4O1xcclxcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAjbmF2YmFyIGEuYWN0aXZlIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzRjYWY1MDtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgfVxcclxcblxcclxcbiAgLyogUGFnZSBjb250ZW50ICovXFxyXFxuICAuY29udGVudCB7XFxyXFxuICAgIHBhZGRpbmc6IDE2cHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAvKiBUaGUgc3RpY2t5IGNsYXNzIGlzIGFkZGVkIHRvIHRoZSBuYXZiYXJcXHJcXG4gIHdpdGggSlMgd2hlbiBpdCByZWFjaGVzIGl0cyBzY3JvbGwgcG9zaXRpb24gKi9cXHJcXG4gIC5zdGlja3lIZWFkIHtcXHJcXG4gICAgdG9wOiA1MHB4O1xcclxcbiAgICBsZWZ0OiAwLjlyZW07XFxyXFxuICB9XFxyXFxuXFxyXFxuICAuc3RpY2t5U2lnbmVySGVhZCB7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC8qIEFkZCBzb21lIHRvcCBwYWRkaW5nIHRvIHRoZSBwYWdlIGNvbnRlbnRcXHJcXG4gIHRvIHByZXZlbnQgc3VkZGVuIHF1aWNrIG1vdmVtZW50IChhcyB0aGVcXHJcXG4gIG5hdmlnYXRpb24gYmFyIGdldHMgYSBuZXcgcG9zaXRpb24gYXQgdGhlIHRvcCBvZiB0aGVcXHJcXG4gIHBhZ2UgKHBvc2l0aW9uOmZpeGVkIGFuZCB0b3A6MCkgKi9cXHJcXG4gIC5zdGlja3lIZWFkICsgLmNvbnRlbnQge1xcclxcbiAgICBwYWRkaW5nLXRvcDogNjBweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDg3cHgpIGFuZCAobWluLXdpZHRoOiAzNTFweCkge1xcclxcbiAgLnNpZ25hdHVyZUNhbnZhcyB7XFxyXFxuICAgIHdpZHRoOiAzMDBweDtcXHJcXG4gICAgaGVpZ2h0OiAxMjBweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcXHJcXG4gICAgd2lkdGg6IDMwMHB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnVwbG9hZEltZ0xvZ28ge1xcclxcbiAgICBmb250LXNpemU6IDMwcHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAuc2lnblRhYiB7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcXHJcXG4gICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbi5zY3JvbGwtaGlkZTo6LXdlYmtpdC1zY3JvbGxiYXIge1xcclxcbiAgZGlzcGxheTogbm9uZTtcXHJcXG59XFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzUwcHgpIGFuZCAobWluLXdpZHRoOiAzMTFweCkge1xcclxcbiAgLnNpZ25hdHVyZUNhbnZhcyB7XFxyXFxuICAgIHdpZHRoOiAyODBweDtcXHJcXG4gICAgaGVpZ2h0OiAxMTJweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcXHJcXG4gICAgd2lkdGg6IDI4MHB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnNpZ25UYWIge1xcclxcbiAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XFxyXFxuXFxyXFxuICAgIGZvbnQtc2l6ZTogMTBweCAhaW1wb3J0YW50O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnVwbG9hZEltZ0xvZ28ge1xcclxcbiAgICBmb250LXNpemU6IDI1cHg7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMxMHB4KSB7XFxyXFxuICAuc2lnbmF0dXJlQ2FudmFzIHtcXHJcXG4gICAgd2lkdGg6IDIzMHB4O1xcclxcbiAgICBoZWlnaHQ6IDkycHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAucGVuQ29udGFpbmVyRGVmYXVsdCB7XFxyXFxuICAgIHdpZHRoOiAyMzBweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5zaWduVGFiIHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xcclxcbiAgICBmb250LXNpemU6IDhweCAhaW1wb3J0YW50O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnVwbG9hZEltZ0xvZ28ge1xcclxcbiAgICBmb250LXNpemU6IDIwcHg7XFxyXFxuICB9XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICB1cmwgPSBTdHJpbmcodXJsLl9fZXNNb2R1bGUgPyB1cmwuZGVmYXVsdCA6IHVybCk7XG5cbiAgLy8gSWYgdXJsIGlzIGFscmVhZHkgd3JhcHBlZCBpbiBxdW90ZXMsIHJlbW92ZSB0aGVtXG4gIGlmICgvXlsnXCJdLipbJ1wiXSQvLnRlc3QodXJsKSkge1xuICAgIHVybCA9IHVybC5zbGljZSgxLCAtMSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuaGFzaCkge1xuICAgIHVybCArPSBvcHRpb25zLmhhc2g7XG4gIH1cblxuICAvLyBTaG91bGQgdXJsIGJlIHdyYXBwZWQ/XG4gIC8vIFNlZSBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXZhbHVlcy0zLyN1cmxzXG4gIGlmICgvW1wiJygpIFxcdFxcbl18KCUyMCkvLnRlc3QodXJsKSB8fCBvcHRpb25zLm5lZWRRdW90ZXMpIHtcbiAgICByZXR1cm4gXCJcXFwiXCIuY29uY2F0KHVybC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIiksIFwiXFxcIlwiKTtcbiAgfVxuICByZXR1cm4gdXJsO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRMZWFkaW5nWmVyb3MgPSBhZGRMZWFkaW5nWmVyb3M7XG5mdW5jdGlvbiBhZGRMZWFkaW5nWmVyb3MobnVtYmVyLCB0YXJnZXRMZW5ndGgpIHtcbiAgY29uc3Qgc2lnbiA9IG51bWJlciA8IDAgPyBcIi1cIiA6IFwiXCI7XG4gIGNvbnN0IG91dHB1dCA9IE1hdGguYWJzKG51bWJlcikudG9TdHJpbmcoKS5wYWRTdGFydCh0YXJnZXRMZW5ndGgsIFwiMFwiKTtcbiAgcmV0dXJuIHNpZ24gKyBvdXRwdXQ7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmF1bHRMb2NhbGVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2luZGV4LmVuVVM7XG4gIH0sXG59KTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vbG9jYWxlL2VuLVVTLmpzXCIpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnM7XG5leHBvcnRzLnNldERlZmF1bHRPcHRpb25zID0gc2V0RGVmYXVsdE9wdGlvbnM7XG5cbmxldCBkZWZhdWx0T3B0aW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBzZXREZWZhdWx0T3B0aW9ucyhuZXdPcHRpb25zKSB7XG4gIGRlZmF1bHRPcHRpb25zID0gbmV3T3B0aW9ucztcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5mb3JtYXR0ZXJzID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi9nZXREYXlPZlllYXIuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi9nZXRJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi4vLi4vZ2V0SVNPV2Vla1llYXIuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuLi8uLi9nZXRXZWVrLmpzXCIpO1xudmFyIF9pbmRleDUgPSByZXF1aXJlKFwiLi4vLi4vZ2V0V2Vla1llYXIuanNcIik7XG5cbnZhciBfaW5kZXg2ID0gcmVxdWlyZShcIi4uL2FkZExlYWRpbmdaZXJvcy5qc1wiKTtcbnZhciBfaW5kZXg3ID0gcmVxdWlyZShcIi4vbGlnaHRGb3JtYXR0ZXJzLmpzXCIpO1xuXG5jb25zdCBkYXlQZXJpb2RFbnVtID0ge1xuICBhbTogXCJhbVwiLFxuICBwbTogXCJwbVwiLFxuICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICBub29uOiBcIm5vb25cIixcbiAgbW9ybmluZzogXCJtb3JuaW5nXCIsXG4gIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gIG5pZ2h0OiBcIm5pZ2h0XCIsXG59O1xuXG4vKlxuICogfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCAgYSAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgfCAgQSogfCBNaWxsaXNlY29uZHMgaW4gZGF5ICAgICAgICAgICAgfFxuICogfCAgYiAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgfCAgQiAgfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgfFxuICogfCAgYyAgfCBTdGFuZC1hbG9uZSBsb2NhbCBkYXkgb2Ygd2VlayAgfCAgQyogfCBMb2NhbGl6ZWQgaG91ciB3LyBkYXkgcGVyaW9kICAgfFxuICogfCAgZCAgfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgfCAgRCAgfCBEYXkgb2YgeWVhciAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZSAgfCBMb2NhbCBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgfCAgRSAgfCBEYXkgb2Ygd2VlayAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRiogfCBEYXkgb2Ygd2VlayBpbiBtb250aCAgICAgICAgICAgfFxuICogfCAgZyogfCBNb2RpZmllZCBKdWxpYW4gZGF5ICAgICAgICAgICAgfCAgRyAgfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaCAgfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgfCAgSCAgfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaSEgfCBJU08gZGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgfCAgSSEgfCBJU08gd2VlayBvZiB5ZWFyICAgICAgICAgICAgICAgfFxuICogfCAgaiogfCBMb2NhbGl6ZWQgaG91ciB3LyBkYXkgcGVyaW9kICAgfCAgSiogfCBMb2NhbGl6ZWQgaG91ciB3L28gZGF5IHBlcmlvZCAgfFxuICogfCAgayAgfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgfCAgSyAgfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbCogfCAoZGVwcmVjYXRlZCkgICAgICAgICAgICAgICAgICAgfCAgTCAgfCBTdGFuZC1hbG9uZSBtb250aCAgICAgICAgICAgICAgfFxuICogfCAgbSAgfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTSAgfCBNb250aCAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbyEgfCBPcmRpbmFsIG51bWJlciBtb2RpZmllciAgICAgICAgfCAgTyAgfCBUaW1lem9uZSAoR01UKSAgICAgICAgICAgICAgICAgfFxuICogfCAgcCEgfCBMb25nIGxvY2FsaXplZCB0aW1lICAgICAgICAgICAgfCAgUCEgfCBMb25nIGxvY2FsaXplZCBkYXRlICAgICAgICAgICAgfFxuICogfCAgcSAgfCBTdGFuZC1hbG9uZSBxdWFydGVyICAgICAgICAgICAgfCAgUSAgfCBRdWFydGVyICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgciogfCBSZWxhdGVkIEdyZWdvcmlhbiB5ZWFyICAgICAgICAgfCAgUiEgfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgfFxuICogfCAgcyAgfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgUyAgfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgfFxuICogfCAgdCEgfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgfCAgVCEgfCBNaWxsaXNlY29uZHMgdGltZXN0YW1wICAgICAgICAgfFxuICogfCAgdSAgfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgfCAgVSogfCBDeWNsaWMgeWVhciAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgdiogfCBUaW1lem9uZSAoZ2VuZXJpYyBub24tbG9jYXQuKSAgfCAgViogfCBUaW1lem9uZSAobG9jYXRpb24pICAgICAgICAgICAgfFxuICogfCAgdyAgfCBMb2NhbCB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgfCAgVyogfCBXZWVrIG9mIG1vbnRoICAgICAgICAgICAgICAgICAgfFxuICogfCAgeCAgfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgfCAgWCAgfCBUaW1lem9uZSAoSVNPLTg2MDEpICAgICAgICAgICAgfFxuICogfCAgeSAgfCBZZWFyIChhYnMpICAgICAgICAgICAgICAgICAgICAgfCAgWSAgfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgfFxuICogfCAgeiAgfCBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0LikgfCAgWiogfCBUaW1lem9uZSAoYWxpYXNlcykgICAgICAgICAgICAgfFxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICogYXJlIG5vdCBpbXBsZW1lbnRlZCBidXQgcmVzZXJ2ZWQgYnkgVW5pY29kZSBzdGFuZGFyZC5cbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAhIGFyZSBub24tc3RhbmRhcmQsIGJ1dCBpbXBsZW1lbnRlZCBieSBkYXRlLWZuczpcbiAqIC0gYG9gIG1vZGlmaWVzIHRoZSBwcmV2aW91cyB0b2tlbiB0byB0dXJuIGl0IGludG8gYW4gb3JkaW5hbCAoc2VlIGBmb3JtYXRgIGRvY3MpXG4gKiAtIGBpYCBpcyBJU08gZGF5IG9mIHdlZWsuIEZvciBgaWAgYW5kIGBpaWAgaXMgcmV0dXJucyBudW1lcmljIElTTyB3ZWVrIGRheXMsXG4gKiAgIGkuZS4gNyBmb3IgU3VuZGF5LCAxIGZvciBNb25kYXksIGV0Yy5cbiAqIC0gYElgIGlzIElTTyB3ZWVrIG9mIHllYXIsIGFzIG9wcG9zZWQgdG8gYHdgIHdoaWNoIGlzIGxvY2FsIHdlZWsgb2YgeWVhci5cbiAqIC0gYFJgIGlzIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyLCBhcyBvcHBvc2VkIHRvIGBZYCB3aGljaCBpcyBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogICBgUmAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGBJYCBhbmQgYGlgXG4gKiAgIGZvciB1bml2ZXJzYWwgSVNPIHdlZWstbnVtYmVyaW5nIGRhdGUsIHdoZXJlYXNcbiAqICAgYFlgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgd2AgYW5kIGBlYFxuICogICBmb3Igd2Vlay1udW1iZXJpbmcgZGF0ZSBzcGVjaWZpYyB0byB0aGUgbG9jYWxlLlxuICogLSBgUGAgaXMgbG9uZyBsb2NhbGl6ZWQgZGF0ZSBmb3JtYXRcbiAqIC0gYHBgIGlzIGxvbmcgbG9jYWxpemVkIHRpbWUgZm9ybWF0XG4gKi9cblxuY29uc3QgZm9ybWF0dGVycyA9IChleHBvcnRzLmZvcm1hdHRlcnMgPSB7XG4gIC8vIEVyYVxuICBHOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZXJhID0gZGF0ZS5nZXRGdWxsWWVhcigpID4gMCA/IDEgOiAwO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEFELCBCQ1xuICAgICAgY2FzZSBcIkdcIjpcbiAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgY2FzZSBcIkdHR1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwgeyB3aWR0aDogXCJhYmJyZXZpYXRlZFwiIH0pO1xuICAgICAgLy8gQSwgQlxuICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcIm5hcnJvd1wiIH0pO1xuICAgICAgLy8gQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3RcbiAgICAgIGNhc2UgXCJHR0dHXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwgeyB3aWR0aDogXCJ3aWRlXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFllYXJcbiAgeTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIC8vIE9yZGluYWwgbnVtYmVyXG4gICAgaWYgKHRva2VuID09PSBcInlvXCIpIHtcbiAgICAgIGNvbnN0IHNpZ25lZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyO1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoeWVhciwgeyB1bml0OiBcInllYXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMueShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc2lnbmVkV2Vla1llYXIgPSAoMCwgX2luZGV4NS5nZXRXZWVrWWVhcikoZGF0ZSwgb3B0aW9ucyk7XG4gICAgLy8gUmV0dXJucyAxIGZvciAxIEJDICh3aGljaCBpcyB5ZWFyIDAgaW4gSmF2YVNjcmlwdClcbiAgICBjb25zdCB3ZWVrWWVhciA9IHNpZ25lZFdlZWtZZWFyID4gMCA/IHNpZ25lZFdlZWtZZWFyIDogMSAtIHNpZ25lZFdlZWtZZWFyO1xuXG4gICAgLy8gVHdvIGRpZ2l0IHllYXJcbiAgICBpZiAodG9rZW4gPT09IFwiWVlcIikge1xuICAgICAgY29uc3QgdHdvRGlnaXRZZWFyID0gd2Vla1llYXIgJSAxMDA7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKSh0d29EaWdpdFllYXIsIDIpO1xuICAgIH1cblxuICAgIC8vIE9yZGluYWwgbnVtYmVyXG4gICAgaWYgKHRva2VuID09PSBcIllvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHdlZWtZZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIC8vIFBhZGRpbmdcbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKSh3ZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBpc29XZWVrWWVhciA9ICgwLCBfaW5kZXgzLmdldElTT1dlZWtZZWFyKShkYXRlKTtcblxuICAgIC8vIFBhZGRpbmdcbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShpc29XZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBFeHRlbmRlZCB5ZWFyLiBUaGlzIGlzIGEgc2luZ2xlIG51bWJlciBkZXNpZ25hdGluZyB0aGUgeWVhciBvZiB0aGlzIGNhbGVuZGFyIHN5c3RlbS5cbiAgLy8gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIGxvY2FsaXplcnMgYXJlIEIuQy4geWVhcnM6XG4gIC8vIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gIC8vIHwtLS0tLS18LS0tLS18LS0tLS18XG4gIC8vIHwgQUMgMSB8ICAgMSB8ICAgMSB8XG4gIC8vIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gIC8vIHwgQkMgMiB8ICAgMiB8ICAtMSB8XG4gIC8vIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAgLy8gd2hpbGUgYHV1YCBwYWRzIHNpbmdsZSBkaWdpdCB5ZWFycyB0byAyIGNoYXJhY3RlcnMgYW5kIHJldHVybnMgb3RoZXIgeWVhcnMgdW5jaGFuZ2VkLlxuICB1OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gUXVhcnRlclxuICBROiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwiUVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgXCJRUVwiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShxdWFydGVyLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuICAgICAgY2FzZSBcIlFvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHsgdW5pdDogXCJxdWFydGVyXCIgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuICAgICAgY2FzZSBcIlFRUVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcbiAgICAgIGNhc2UgXCJRUVFRUVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi5cbiAgICAgIGNhc2UgXCJRUVFRXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gU3RhbmQtYWxvbmUgcXVhcnRlclxuICBxOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwicVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgXCJxcVwiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShxdWFydGVyLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuICAgICAgY2FzZSBcInFvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHsgdW5pdDogXCJxdWFydGVyXCIgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuICAgICAgY2FzZSBcInFxcVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcbiAgICAgIGNhc2UgXCJxcXFxcVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi5cbiAgICAgIGNhc2UgXCJxcXFxXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gTW9udGhcbiAgTTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLk0oZGF0ZSwgdG9rZW4pO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuICAgICAgY2FzZSBcIk1vXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKG1vbnRoICsgMSwgeyB1bml0OiBcIm1vbnRoXCIgfSk7XG4gICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWNcbiAgICAgIGNhc2UgXCJNTU1cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKLCBGLCAuLi4sIERcbiAgICAgIGNhc2UgXCJNTU1NTVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBtb250aFxuICBMOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhtb250aCArIDEpO1xuICAgICAgLy8gMDEsIDAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykobW9udGggKyAxLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcbiAgICAgIGNhc2UgXCJMb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihtb250aCArIDEsIHsgdW5pdDogXCJtb250aFwiIH0pO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSiwgRiwgLi4uLCBEXG4gICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2VlayBvZiB5ZWFyXG4gIHc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB3ZWVrID0gKDAsIF9pbmRleDQuZ2V0V2VlaykoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwid29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKSh3ZWVrLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIElTTyB3ZWVrIG9mIHllYXJcbiAgSTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGlzb1dlZWsgPSAoMCwgX2luZGV4Mi5nZXRJU09XZWVrKShkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJJb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29XZWVrLCB7IHVuaXQ6IFwid2Vla1wiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5kKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgeWVhclxuICBEOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZZZWFyID0gKDAsIF9pbmRleC5nZXREYXlPZlllYXIpKGRhdGUpO1xuXG4gICAgaWYgKHRva2VuID09PSBcIkRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRheU9mWWVhciwgeyB1bml0OiBcImRheU9mWWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2Ygd2Vla1xuICBFOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiRUVcIjpcbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiRUVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBMb2NhbCBkYXkgb2Ygd2Vla1xuICBlOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3O1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoTnRoIGRheSBvZiB3ZWVrIHdpdGggY3VycmVudCBsb2NhbGUgb3Igd2Vla1N0YXJ0c09uKVxuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlIFwiZWVcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykobG9jYWxEYXlPZldlZWssIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoXG4gICAgICBjYXNlIFwiZW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobG9jYWxEYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIGNhc2UgXCJlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJlZWVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiZWVlZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiZWVlZVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBsb2NhbCBkYXkgb2Ygd2Vla1xuICBjOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3O1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoc2FtZSBhcyBpbiBgZWApXG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGxvY2FsRGF5T2ZXZWVrKTtcbiAgICAgIC8vIFBhZGRlZCBudW1lcmljYWwgdmFsdWVcbiAgICAgIGNhc2UgXCJjY1wiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShsb2NhbERheU9mV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDd0aFxuICAgICAgY2FzZSBcImNvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7IHVuaXQ6IFwiZGF5XCIgfSk7XG4gICAgICBjYXNlIFwiY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImNjY2NjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSVNPIGRheSBvZiB3ZWVrXG4gIGk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGlzb0RheU9mV2VlayA9IGRheU9mV2VlayA9PT0gMCA/IDcgOiBkYXlPZldlZWs7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMlxuICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhpc29EYXlPZldlZWspO1xuICAgICAgLy8gMDJcbiAgICAgIGNhc2UgXCJpaVwiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAybmRcbiAgICAgIGNhc2UgXCJpb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImlpaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJpaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJpaWlpXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyBcInBtXCIgOiBcImFtXCI7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNLCBQTSwgbWlkbmlnaHQsIG5vb25cbiAgYjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID09PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5ub29uO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPT09IDApIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubWlkbmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYlwiOlxuICAgICAgY2FzZSBcImJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJiYmJiYlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJiXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbiAgQjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID49IDE3KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5hZnRlcm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1vcm5pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkJcIjpcbiAgICAgIGNhc2UgXCJCQlwiOlxuICAgICAgY2FzZSBcIkJCQlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJob1wiKSB7XG4gICAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcbiAgICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAxMjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5oKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTIzXVxuICBIOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcIkhvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0SG91cnMoKSwgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMuSChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0xMV1cbiAgSzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpICUgMTI7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiS29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0yNF1cbiAgazogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMjQ7XG5cbiAgICBpZiAodG9rZW4gPT09IFwia29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwibW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIHsgdW5pdDogXCJtaW51dGVcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMubShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gU2Vjb25kXG4gIHM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwic29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRTZWNvbmRzKCksIHsgdW5pdDogXCJzZWNvbmRcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMucyhkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5TKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKVxuICBYOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJaXCI7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGBcbiAgICAgIGNhc2UgXCJYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYWGBcbiAgICAgIGNhc2UgXCJYWFhYWFwiOlxuICAgICAgY2FzZSBcIlhYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYCcrMDA6MDAnYCBvciBlcXVpdmFsZW50KVxuICB4OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcbiAgICAgIGNhc2UgXCJ4eHh4XCI6XG4gICAgICBjYXNlIFwieHhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGBcbiAgICAgIGNhc2UgXCJ4eHh4eFwiOlxuICAgICAgY2FzZSBcInh4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoR01UKVxuICBPOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJPXCI6XG4gICAgICBjYXNlIFwiT09cIjpcbiAgICAgIGNhc2UgXCJPT09cIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwiT09PT1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0aW9uKVxuICB6OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICBjYXNlIFwienpcIjpcbiAgICAgIGNhc2UgXCJ6enpcIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwienp6elwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZWNvbmRzIHRpbWVzdGFtcFxuICB0OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IE1hdGgudHJ1bmMoZGF0ZS5nZXRUaW1lKCkgLyAxMDAwKTtcbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKSh0aW1lc3RhbXAsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWlsbGlzZWNvbmRzIHRpbWVzdGFtcFxuICBUOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn0pO1xuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZVNob3J0KG9mZnNldCwgZGVsaW1pdGVyID0gXCJcIikge1xuICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gIGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7XG4gIGNvbnN0IGhvdXJzID0gTWF0aC50cnVuYyhhYnNPZmZzZXQgLyA2MCk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBhYnNPZmZzZXQgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gc2lnbiArIFN0cmluZyhob3Vycyk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBzaWduICsgU3RyaW5nKGhvdXJzKSArIGRlbGltaXRlciArICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykobWludXRlcywgMilcbiAgKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzKG9mZnNldCwgZGVsaW1pdGVyKSB7XG4gIGlmIChvZmZzZXQgJSA2MCA9PT0gMCkge1xuICAgIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgICByZXR1cm4gc2lnbiArICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTtcbiAgfVxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlciA9IFwiXCIpIHtcbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICBjb25zdCBob3VycyA9ICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoTWF0aC50cnVuYyhhYnNPZmZzZXQgLyA2MCksIDIpO1xuICBjb25zdCBtaW51dGVzID0gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShhYnNPZmZzZXQgJSA2MCwgMik7XG4gIHJldHVybiBzaWduICsgaG91cnMgKyBkZWxpbWl0ZXIgKyBtaW51dGVzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmxpZ2h0Rm9ybWF0dGVycyA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vYWRkTGVhZGluZ1plcm9zLmpzXCIpO1xuXG4vKlxuICogfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCAgYSAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgfCAgQSogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZCAgfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgfCAgRCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaCAgfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgfCAgSCAgfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbSAgfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTSAgfCBNb250aCAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgcyAgfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgUyAgfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgfFxuICogfCAgeSAgfCBZZWFyIChhYnMpICAgICAgICAgICAgICAgICAgICAgfCAgWSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICogYXJlIG5vdCBpbXBsZW1lbnRlZCBidXQgcmVzZXJ2ZWQgYnkgVW5pY29kZSBzdGFuZGFyZC5cbiAqL1xuXG5jb25zdCBsaWdodEZvcm1hdHRlcnMgPSAoZXhwb3J0cy5saWdodEZvcm1hdHRlcnMgPSB7XG4gIC8vIFllYXJcbiAgeShkYXRlLCB0b2tlbikge1xuICAgIC8vIEZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS0zMS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9Gb3JtYXRfdG9rZW5zXG4gICAgLy8gfCBZZWFyICAgICB8ICAgICB5IHwgeXkgfCAgIHl5eSB8ICB5eXl5IHwgeXl5eXkgfFxuICAgIC8vIHwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXxcbiAgICAvLyB8IEFEIDEgICAgIHwgICAgIDEgfCAwMSB8ICAgMDAxIHwgIDAwMDEgfCAwMDAwMSB8XG4gICAgLy8gfCBBRCAxMiAgICB8ICAgIDEyIHwgMTIgfCAgIDAxMiB8ICAwMDEyIHwgMDAwMTIgfFxuICAgIC8vIHwgQUQgMTIzICAgfCAgIDEyMyB8IDIzIHwgICAxMjMgfCAgMDEyMyB8IDAwMTIzIHxcbiAgICAvLyB8IEFEIDEyMzQgIHwgIDEyMzQgfCAzNCB8ICAxMjM0IHwgIDEyMzQgfCAwMTIzNCB8XG4gICAgLy8gfCBBRCAxMjM0NSB8IDEyMzQ1IHwgNDUgfCAxMjM0NSB8IDEyMzQ1IHwgMTIzNDUgfFxuXG4gICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKFxuICAgICAgdG9rZW4gPT09IFwieXlcIiA/IHllYXIgJSAxMDAgOiB5ZWFyLFxuICAgICAgdG9rZW4ubGVuZ3RoLFxuICAgICk7XG4gIH0sXG5cbiAgLy8gTW9udGhcbiAgTShkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIHJldHVybiB0b2tlbiA9PT0gXCJNXCJcbiAgICAgID8gU3RyaW5nKG1vbnRoICsgMSlcbiAgICAgIDogKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKG1vbnRoICsgMSwgMik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShkYXRlLmdldERhdGUoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBBTSBvciBQTVxuICBhKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF0ZS5nZXRIb3VycygpIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICBjYXNlIFwiYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY2FzZSBcImFhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlO1xuICAgICAgY2FzZSBcImFhYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWVbMF07XG4gICAgICBjYXNlIFwiYWFhYVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZSA9PT0gXCJhbVwiID8gXCJhLm0uXCIgOiBcInAubS5cIjtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoXG4gICAgICBkYXRlLmdldEhvdXJzKCkgJSAxMiB8fCAxMixcbiAgICAgIHRva2VuLmxlbmd0aCxcbiAgICApO1xuICB9LFxuXG4gIC8vIEhvdXIgWzAtMjNdXG4gIEgoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKGRhdGUuZ2V0SG91cnMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaW51dGVcbiAgbShkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoZGF0ZS5nZXRNaW51dGVzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gU2Vjb25kXG4gIHMoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKGRhdGUuZ2V0U2Vjb25kcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEZyYWN0aW9uIG9mIHNlY29uZFxuICBTKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgbnVtYmVyT2ZEaWdpdHMgPSB0b2tlbi5sZW5ndGg7XG4gICAgY29uc3QgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICBjb25zdCBmcmFjdGlvbmFsU2Vjb25kcyA9IE1hdGgudHJ1bmMoXG4gICAgICBtaWxsaXNlY29uZHMgKiBNYXRoLnBvdygxMCwgbnVtYmVyT2ZEaWdpdHMgLSAzKSxcbiAgICApO1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoZnJhY3Rpb25hbFNlY29uZHMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5sb25nRm9ybWF0dGVycyA9IHZvaWQgMDtcblxuY29uc3QgZGF0ZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlIFwiUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgY2FzZSBcIlBQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICBjYXNlIFwiUFBQUFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICB9XG59O1xuXG5jb25zdCB0aW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgXCJwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICBjYXNlIFwicHBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICBjYXNlIFwicHBwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgIGNhc2UgXCJwcHBwXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gIH1cbn07XG5cbmNvbnN0IGRhdGVUaW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIGNvbnN0IG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107XG4gIGNvbnN0IGRhdGVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMV07XG4gIGNvbnN0IHRpbWVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMl07XG5cbiAgaWYgKCF0aW1lUGF0dGVybikge1xuICAgIHJldHVybiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKTtcbiAgfVxuXG4gIGxldCBkYXRlVGltZUZvcm1hdDtcblxuICBzd2l0Y2ggKGRhdGVQYXR0ZXJuKSB7XG4gICAgY2FzZSBcIlBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZGF0ZVRpbWVGb3JtYXRcbiAgICAucmVwbGFjZShcInt7ZGF0ZX19XCIsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nKSlcbiAgICAucmVwbGFjZShcInt7dGltZX19XCIsIHRpbWVMb25nRm9ybWF0dGVyKHRpbWVQYXR0ZXJuLCBmb3JtYXRMb25nKSk7XG59O1xuXG5jb25zdCBsb25nRm9ybWF0dGVycyA9IChleHBvcnRzLmxvbmdGb3JtYXR0ZXJzID0ge1xuICBwOiB0aW1lTG9uZ0Zvcm1hdHRlcixcbiAgUDogZGF0ZVRpbWVMb25nRm9ybWF0dGVyLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9IGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBHb29nbGUgQ2hyb21lIGFzIG9mIDY3LjAuMzM5Ni44NyBpbnRyb2R1Y2VkIHRpbWV6b25lcyB3aXRoIG9mZnNldCB0aGF0IGluY2x1ZGVzIHNlY29uZHMuXG4gKiBUaGV5IHVzdWFsbHkgYXBwZWFyIGZvciBkYXRlcyB0aGF0IGRlbm90ZSB0aW1lIGJlZm9yZSB0aGUgdGltZXpvbmVzIHdlcmUgaW50cm9kdWNlZFxuICogKGUuZy4gZm9yICdFdXJvcGUvUHJhZ3VlJyB0aW1lem9uZSB0aGUgb2Zmc2V0IGlzIEdNVCswMDo1Nzo0NCBiZWZvcmUgMSBPY3RvYmVyIDE4OTFcbiAqIGFuZCBHTVQrMDE6MDA6MDAgYWZ0ZXIgdGhhdCBkYXRlKVxuICpcbiAqIERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgYW5kIHdvdWxkIHJldHVybiA1NyBmb3IgdGhlIGV4YW1wbGUgYWJvdmUsXG4gKiB3aGljaCB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCBjYWxjdWxhdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGFrZXMgc2Vjb25kcyBpbiBhY2NvdW50LlxuICovXG5mdW5jdGlvbiBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHV0Y0RhdGUgPSBuZXcgRGF0ZShcbiAgICBEYXRlLlVUQyhcbiAgICAgIF9kYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBfZGF0ZS5nZXRNb250aCgpLFxuICAgICAgX2RhdGUuZ2V0RGF0ZSgpLFxuICAgICAgX2RhdGUuZ2V0SG91cnMoKSxcbiAgICAgIF9kYXRlLmdldE1pbnV0ZXMoKSxcbiAgICAgIF9kYXRlLmdldFNlY29uZHMoKSxcbiAgICAgIF9kYXRlLmdldE1pbGxpc2Vjb25kcygpLFxuICAgICksXG4gICk7XG4gIHV0Y0RhdGUuc2V0VVRDRnVsbFllYXIoX2RhdGUuZ2V0RnVsbFllYXIoKSk7XG4gIHJldHVybiArZGF0ZSAtICt1dGNEYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4gPSBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuO1xuZXhwb3J0cy5pc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4gPSBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW47XG5leHBvcnRzLndhcm5PclRocm93UHJvdGVjdGVkRXJyb3IgPSB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yO1xuY29uc3QgZGF5T2ZZZWFyVG9rZW5SRSA9IC9eRCskLztcbmNvbnN0IHdlZWtZZWFyVG9rZW5SRSA9IC9eWSskLztcblxuY29uc3QgdGhyb3dUb2tlbnMgPSBbXCJEXCIsIFwiRERcIiwgXCJZWVwiLCBcIllZWVlcIl07XG5cbmZ1bmN0aW9uIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIGRheU9mWWVhclRva2VuUkUudGVzdCh0b2tlbik7XG59XG5cbmZ1bmN0aW9uIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gd2Vla1llYXJUb2tlblJFLnRlc3QodG9rZW4pO1xufVxuXG5mdW5jdGlvbiB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGNvbnN0IF9tZXNzYWdlID0gbWVzc2FnZSh0b2tlbiwgZm9ybWF0LCBpbnB1dCk7XG4gIGNvbnNvbGUud2FybihfbWVzc2FnZSk7XG4gIGlmICh0aHJvd1Rva2Vucy5pbmNsdWRlcyh0b2tlbikpIHRocm93IG5ldyBSYW5nZUVycm9yKF9tZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gbWVzc2FnZSh0b2tlbiwgZm9ybWF0LCBpbnB1dCkge1xuICBjb25zdCBzdWJqZWN0ID0gdG9rZW5bMF0gPT09IFwiWVwiID8gXCJ5ZWFyc1wiIDogXCJkYXlzIG9mIHRoZSBtb250aFwiO1xuICByZXR1cm4gYFVzZSBcXGAke3Rva2VuLnRvTG93ZXJDYXNlKCl9XFxgIGluc3RlYWQgb2YgXFxgJHt0b2tlbn1cXGAgKGluIFxcYCR7Zm9ybWF0fVxcYCkgZm9yIGZvcm1hdHRpbmcgJHtzdWJqZWN0fSB0byB0aGUgaW5wdXQgXFxgJHtpbnB1dH1cXGA7IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZGA7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkRGF5cyA9IGFkZERheXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZERheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGRheXMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheXMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDEwIGRheXMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZERheXMobmV3IERhdGUoMjAxNCwgOCwgMSksIDEwKVxuICogLy89PiBUaHUgU2VwIDExIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkRGF5cyhkYXRlLCBhbW91bnQpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGlmIChpc05hTihhbW91bnQpKSByZXR1cm4gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgTmFOKTtcbiAgaWYgKCFhbW91bnQpIHtcbiAgICAvLyBJZiAwIGRheXMsIG5vLW9wIHRvIGF2b2lkIGNoYW5naW5nIHRpbWVzIGluIHRoZSBob3VyIGJlZm9yZSBlbmQgb2YgRFNUXG4gICAgcmV0dXJuIF9kYXRlO1xuICB9XG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgYW1vdW50KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZEhvdXJzID0gYWRkSG91cnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTWlsbGlzZWNvbmRzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkSG91cnNcbiAqIEBjYXRlZ29yeSBIb3VyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBob3VycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBob3VycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGhvdXJzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBob3VycyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMiBob3VycyB0byAxMCBKdWx5IDIwMTQgMjM6MDA6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRIb3VycyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMjMsIDApLCAyKVxuICogLy89PiBGcmkgSnVsIDExIDIwMTQgMDE6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkSG91cnMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1pbGxpc2Vjb25kcykoZGF0ZSwgYW1vdW50ICogX2luZGV4Mi5taWxsaXNlY29uZHNJbkhvdXIpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZE1pbGxpc2Vjb25kcyA9IGFkZE1pbGxpc2Vjb25kcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkTWlsbGlzZWNvbmRzXG4gKiBAY2F0ZWdvcnkgTWlsbGlzZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIG1pbGxpc2Vjb25kcyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNzUwIG1pbGxpc2Vjb25kcyB0byAxMCBKdWx5IDIwMTQgMTI6NDU6MzAuMDAwOlxuICogY29uc3QgcmVzdWx0ID0gYWRkTWlsbGlzZWNvbmRzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAxMiwgNDUsIDMwLCAwKSwgNzUwKVxuICogLy89PiBUaHUgSnVsIDEwIDIwMTQgMTI6NDU6MzAuNzUwXG4gKi9cbmZ1bmN0aW9uIGFkZE1pbGxpc2Vjb25kcyhkYXRlLCBhbW91bnQpIHtcbiAgY29uc3QgdGltZXN0YW1wID0gKygwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgcmV0dXJuICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIHRpbWVzdGFtcCArIGFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkTWludXRlcyA9IGFkZE1pbnV0ZXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTWlsbGlzZWNvbmRzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkTWludXRlc1xuICogQGNhdGVnb3J5IE1pbnV0ZSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWludXRlcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaW51dGVzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgbWludXRlcyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbWludXRlcyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMzAgbWludXRlcyB0byAxMCBKdWx5IDIwMTQgMTI6MDA6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNaW51dGVzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAxMiwgMCksIDMwKVxuICogLy89PiBUaHUgSnVsIDEwIDIwMTQgMTI6MzA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkTWludXRlcyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkTWlsbGlzZWNvbmRzKShcbiAgICBkYXRlLFxuICAgIGFtb3VudCAqIF9pbmRleDIubWlsbGlzZWNvbmRzSW5NaW51dGUsXG4gICk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkTW9udGhzID0gYWRkTW9udGhzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRNb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbW9udGhzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1vbnRocyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIG1vbnRocyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbW9udGhzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA1IG1vbnRocyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkTW9udGhzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA1KVxuICogLy89PiBTdW4gRmViIDAxIDIwMTUgMDA6MDA6MDBcbiAqXG4gKiAvLyBBZGQgb25lIG1vbnRoIHRvIDMwIEphbnVhcnkgMjAyMzpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1vbnRocyhuZXcgRGF0ZSgyMDIzLCAwLCAzMCksIDEpXG4gKiAvLz0+IFR1ZSBGZWIgMjggMjAyMyAwMDowMDowMFxuICovXG5mdW5jdGlvbiBhZGRNb250aHMoZGF0ZSwgYW1vdW50KSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIE5hTik7XG4gIGlmICghYW1vdW50KSB7XG4gICAgLy8gSWYgMCBtb250aHMsIG5vLW9wIHRvIGF2b2lkIGNoYW5naW5nIHRpbWVzIGluIHRoZSBob3VyIGJlZm9yZSBlbmQgb2YgRFNUXG4gICAgcmV0dXJuIF9kYXRlO1xuICB9XG4gIGNvbnN0IGRheU9mTW9udGggPSBfZGF0ZS5nZXREYXRlKCk7XG5cbiAgLy8gVGhlIEpTIERhdGUgb2JqZWN0IHN1cHBvcnRzIGRhdGUgbWF0aCBieSBhY2NlcHRpbmcgb3V0LW9mLWJvdW5kcyB2YWx1ZXMgZm9yXG4gIC8vIG1vbnRoLCBkYXksIGV0Yy4gRm9yIGV4YW1wbGUsIG5ldyBEYXRlKDIwMjAsIDAsIDApIHJldHVybnMgMzEgRGVjIDIwMTkgYW5kXG4gIC8vIG5ldyBEYXRlKDIwMjAsIDEzLCAxKSByZXR1cm5zIDEgRmViIDIwMjEuICBUaGlzIGlzICphbG1vc3QqIHRoZSBiZWhhdmlvciB3ZVxuICAvLyB3YW50IGV4Y2VwdCB0aGF0IGRhdGVzIHdpbGwgd3JhcCBhcm91bmQgdGhlIGVuZCBvZiBhIG1vbnRoLCBtZWFuaW5nIHRoYXRcbiAgLy8gbmV3IERhdGUoMjAyMCwgMTMsIDMxKSB3aWxsIHJldHVybiAzIE1hciAyMDIxIG5vdCAyOCBGZWIgMjAyMSBhcyBkZXNpcmVkLiBTb1xuICAvLyB3ZSdsbCBkZWZhdWx0IHRvIHRoZSBlbmQgb2YgdGhlIGRlc2lyZWQgbW9udGggYnkgYWRkaW5nIDEgdG8gdGhlIGRlc2lyZWRcbiAgLy8gbW9udGggYW5kIHVzaW5nIGEgZGF0ZSBvZiAwIHRvIGJhY2sgdXAgb25lIGRheSB0byB0aGUgZW5kIG9mIHRoZSBkZXNpcmVkXG4gIC8vIG1vbnRoLlxuICBjb25zdCBlbmRPZkRlc2lyZWRNb250aCA9ICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIF9kYXRlLmdldFRpbWUoKSk7XG4gIGVuZE9mRGVzaXJlZE1vbnRoLnNldE1vbnRoKF9kYXRlLmdldE1vbnRoKCkgKyBhbW91bnQgKyAxLCAwKTtcbiAgY29uc3QgZGF5c0luTW9udGggPSBlbmRPZkRlc2lyZWRNb250aC5nZXREYXRlKCk7XG4gIGlmIChkYXlPZk1vbnRoID49IGRheXNJbk1vbnRoKSB7XG4gICAgLy8gSWYgd2UncmUgYWxyZWFkeSBhdCB0aGUgZW5kIG9mIHRoZSBtb250aCwgdGhlbiB0aGlzIGlzIHRoZSBjb3JyZWN0IGRhdGVcbiAgICAvLyBhbmQgd2UncmUgZG9uZS5cbiAgICByZXR1cm4gZW5kT2ZEZXNpcmVkTW9udGg7XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlLCB3ZSBub3cga25vdyB0aGF0IHNldHRpbmcgdGhlIG9yaWdpbmFsIGRheS1vZi1tb250aCB2YWx1ZSB3b24ndFxuICAgIC8vIGNhdXNlIGFuIG92ZXJmbG93LCBzbyBzZXQgdGhlIGRlc2lyZWQgZGF5LW9mLW1vbnRoLiBOb3RlIHRoYXQgd2UgY2FuJ3RcbiAgICAvLyBqdXN0IHNldCB0aGUgZGF0ZSBvZiBgZW5kT2ZEZXNpcmVkTW9udGhgIGJlY2F1c2UgdGhhdCBvYmplY3QgbWF5IGhhdmUgaGFkXG4gICAgLy8gaXRzIHRpbWUgY2hhbmdlZCBpbiB0aGUgdW51c3VhbCBjYXNlIHdoZXJlIHdoZXJlIGEgRFNUIHRyYW5zaXRpb24gd2FzIG9uXG4gICAgLy8gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCBhbmQgaXRzIGxvY2FsIHRpbWUgd2FzIGluIHRoZSBob3VyIHNraXBwZWQgb3JcbiAgICAvLyByZXBlYXRlZCBuZXh0IHRvIGEgRFNUIHRyYW5zaXRpb24uICBTbyB3ZSB1c2UgYGRhdGVgIGluc3RlYWQgd2hpY2ggaXNcbiAgICAvLyBndWFyYW50ZWVkIHRvIHN0aWxsIGhhdmUgdGhlIG9yaWdpbmFsIHRpbWUuXG4gICAgX2RhdGUuc2V0RnVsbFllYXIoXG4gICAgICBlbmRPZkRlc2lyZWRNb250aC5nZXRGdWxsWWVhcigpLFxuICAgICAgZW5kT2ZEZXNpcmVkTW9udGguZ2V0TW9udGgoKSxcbiAgICAgIGRheU9mTW9udGgsXG4gICAgKTtcbiAgICByZXR1cm4gX2RhdGU7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRRdWFydGVycyA9IGFkZFF1YXJ0ZXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZE1vbnRocy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRRdWFydGVyc1xuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXIgcXVhcnRlcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhciBxdWFydGVycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHF1YXJ0ZXJzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBxdWFydGVycyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMSBxdWFydGVyIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRRdWFydGVycyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMSlcbiAqIC8vPT4gTW9uIERlYyAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIGFkZFF1YXJ0ZXJzKGRhdGUsIGFtb3VudCkge1xuICBjb25zdCBtb250aHMgPSBhbW91bnQgKiAzO1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNb250aHMpKGRhdGUsIG1vbnRocyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkU2Vjb25kcyA9IGFkZFNlY29uZHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTWlsbGlzZWNvbmRzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZFNlY29uZHNcbiAqIEBjYXRlZ29yeSBTZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHNlY29uZHMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHNlY29uZHMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDMwIHNlY29uZHMgdG8gMTAgSnVseSAyMDE0IDEyOjQ1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gYWRkU2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAwKSwgMzApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjo0NTozMFxuICovXG5mdW5jdGlvbiBhZGRTZWNvbmRzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNaWxsaXNlY29uZHMpKGRhdGUsIGFtb3VudCAqIDEwMDApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZFdlZWtzID0gYWRkV2Vla3M7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkRGF5cy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRXZWVrc1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiB3ZWVrcyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgd2Vla3MgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDQgd2Vla3MgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFdlZWtzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA0KVxuICogLy89PiBNb24gU2VwIDI5IDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkV2Vla3MoZGF0ZSwgYW1vdW50KSB7XG4gIGNvbnN0IGRheXMgPSBhbW91bnQgKiA3O1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGREYXlzKShkYXRlLCBkYXlzKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRZZWFycyA9IGFkZFllYXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZE1vbnRocy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRZZWFyc1xuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgeWVhcnMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHllYXJzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA1IHllYXJzIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRZZWFycyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgNSlcbiAqIC8vPT4gU3VuIFNlcCAwMSAyMDE5IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIGFkZFllYXJzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNb250aHMpKGRhdGUsIGFtb3VudCAqIDEyKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZWNvbmRzSW5ZZWFyID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5XZWVrID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5RdWFydGVyID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5Nb250aCA9XG4gIGV4cG9ydHMuc2Vjb25kc0luTWludXRlID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5Ib3VyID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5EYXkgPVxuICBleHBvcnRzLnF1YXJ0ZXJzSW5ZZWFyID1cbiAgZXhwb3J0cy5tb250aHNJblllYXIgPVxuICBleHBvcnRzLm1vbnRoc0luUXVhcnRlciA9XG4gIGV4cG9ydHMubWludXRlc0luWWVhciA9XG4gIGV4cG9ydHMubWludXRlc0luTW9udGggPVxuICBleHBvcnRzLm1pbnV0ZXNJbkhvdXIgPVxuICBleHBvcnRzLm1pbnV0ZXNJbkRheSA9XG4gIGV4cG9ydHMubWluVGltZSA9XG4gIGV4cG9ydHMubWlsbGlzZWNvbmRzSW5XZWVrID1cbiAgZXhwb3J0cy5taWxsaXNlY29uZHNJblNlY29uZCA9XG4gIGV4cG9ydHMubWlsbGlzZWNvbmRzSW5NaW51dGUgPVxuICBleHBvcnRzLm1pbGxpc2Vjb25kc0luSG91ciA9XG4gIGV4cG9ydHMubWlsbGlzZWNvbmRzSW5EYXkgPVxuICBleHBvcnRzLm1heFRpbWUgPVxuICBleHBvcnRzLmRheXNJblllYXIgPVxuICBleHBvcnRzLmRheXNJbldlZWsgPVxuICAgIHZvaWQgMDsgLyoqXG4gKiBAbW9kdWxlIGNvbnN0YW50c1xuICogQHN1bW1hcnkgVXNlZnVsIGNvbnN0YW50c1xuICogQGRlc2NyaXB0aW9uXG4gKiBDb2xsZWN0aW9uIG9mIHVzZWZ1bCBkYXRlIGNvbnN0YW50cy5cbiAqXG4gKiBUaGUgY29uc3RhbnRzIGNvdWxkIGJlIGltcG9ydGVkIGZyb20gYGRhdGUtZm5zL2NvbnN0YW50c2A6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IG1heFRpbWUsIG1pblRpbWUgfSBmcm9tIFwiZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogZnVuY3Rpb24gaXNBbGxvd2VkVGltZSh0aW1lKSB7XG4gKiAgIHJldHVybiB0aW1lIDw9IG1heFRpbWUgJiYgdGltZSA+PSBtaW5UaW1lO1xuICogfVxuICogYGBgXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGRheXNJbldlZWtcbiAqIEBzdW1tYXJ5IERheXMgaW4gMSB3ZWVrLlxuICovXG5jb25zdCBkYXlzSW5XZWVrID0gKGV4cG9ydHMuZGF5c0luV2VlayA9IDcpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luWWVhclxuICogQHN1bW1hcnkgRGF5cyBpbiAxIHllYXIuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIb3cgbWFueSBkYXlzIGluIGEgeWVhci5cbiAqXG4gKiBPbmUgeWVhcnMgZXF1YWxzIDM2NS4yNDI1IGRheXMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOlxuICpcbiAqID4gTGVhcCB5ZWFyIG9jY3VyZXMgZXZlcnkgNCB5ZWFycywgZXhjZXB0IGZvciB5ZWFycyB0aGF0IGFyZSBkaXZpc2FibGUgYnkgMTAwIGFuZCBub3QgZGl2aXNhYmxlIGJ5IDQwMC5cbiAqID4gMSBtZWFuIHllYXIgPSAoMzY1KzEvNC0xLzEwMCsxLzQwMCkgZGF5cyA9IDM2NS4yNDI1IGRheXNcbiAqL1xuY29uc3QgZGF5c0luWWVhciA9IChleHBvcnRzLmRheXNJblllYXIgPSAzNjUuMjQyNSk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtYXhUaW1lXG4gKiBAc3VtbWFyeSBNYXhpbXVtIGFsbG93ZWQgdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbWF4VGltZSB9IGZyb20gXCJkYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBjb25zdCBpc1ZhbGlkID0gODY0MDAwMDAwMDAwMDAwMSA8PSBtYXhUaW1lO1xuICogLy89PiBmYWxzZVxuICpcbiAqIG5ldyBEYXRlKDg2NDAwMDAwMDAwMDAwMDEpO1xuICogLy89PiBJbnZhbGlkIERhdGVcbiAqL1xuY29uc3QgbWF4VGltZSA9IChleHBvcnRzLm1heFRpbWUgPSBNYXRoLnBvdygxMCwgOCkgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pblRpbWVcbiAqIEBzdW1tYXJ5IE1pbmltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtaW5UaW1lIH0gZnJvbSBcImRhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSAtODY0MDAwMDAwMDAwMDAwMSA+PSBtaW5UaW1lO1xuICogLy89PiBmYWxzZVxuICpcbiAqIG5ldyBEYXRlKC04NjQwMDAwMDAwMDAwMDAxKVxuICogLy89PiBJbnZhbGlkIERhdGVcbiAqL1xuY29uc3QgbWluVGltZSA9IChleHBvcnRzLm1pblRpbWUgPSAtbWF4VGltZSk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbldlZWtcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIHdlZWsuXG4gKi9cbmNvbnN0IG1pbGxpc2Vjb25kc0luV2VlayA9IChleHBvcnRzLm1pbGxpc2Vjb25kc0luV2VlayA9IDYwNDgwMDAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbkRheVxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgZGF5LlxuICovXG5jb25zdCBtaWxsaXNlY29uZHNJbkRheSA9IChleHBvcnRzLm1pbGxpc2Vjb25kc0luRGF5ID0gODY0MDAwMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIG1pbnV0ZVxuICovXG5jb25zdCBtaWxsaXNlY29uZHNJbk1pbnV0ZSA9IChleHBvcnRzLm1pbGxpc2Vjb25kc0luTWludXRlID0gNjAwMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5Ib3VyXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBob3VyXG4gKi9cbmNvbnN0IG1pbGxpc2Vjb25kc0luSG91ciA9IChleHBvcnRzLm1pbGxpc2Vjb25kc0luSG91ciA9IDM2MDAwMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5TZWNvbmRcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIHNlY29uZFxuICovXG5jb25zdCBtaWxsaXNlY29uZHNJblNlY29uZCA9IChleHBvcnRzLm1pbGxpc2Vjb25kc0luU2Vjb25kID0gMTAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5ZZWFyXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgeWVhci5cbiAqL1xuY29uc3QgbWludXRlc0luWWVhciA9IChleHBvcnRzLm1pbnV0ZXNJblllYXIgPSA1MjU2MDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luTW9udGhcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBtb250aC5cbiAqL1xuY29uc3QgbWludXRlc0luTW9udGggPSAoZXhwb3J0cy5taW51dGVzSW5Nb250aCA9IDQzMjAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkRheVxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIGRheS5cbiAqL1xuY29uc3QgbWludXRlc0luRGF5ID0gKGV4cG9ydHMubWludXRlc0luRGF5ID0gMTQ0MCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5Ib3VyXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgaG91ci5cbiAqL1xuY29uc3QgbWludXRlc0luSG91ciA9IChleHBvcnRzLm1pbnV0ZXNJbkhvdXIgPSA2MCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtb250aHNJblF1YXJ0ZXJcbiAqIEBzdW1tYXJ5IE1vbnRocyBpbiAxIHF1YXJ0ZXIuXG4gKi9cbmNvbnN0IG1vbnRoc0luUXVhcnRlciA9IChleHBvcnRzLm1vbnRoc0luUXVhcnRlciA9IDMpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbW9udGhzSW5ZZWFyXG4gKiBAc3VtbWFyeSBNb250aHMgaW4gMSB5ZWFyLlxuICovXG5jb25zdCBtb250aHNJblllYXIgPSAoZXhwb3J0cy5tb250aHNJblllYXIgPSAxMik7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBxdWFydGVyc0luWWVhclxuICogQHN1bW1hcnkgUXVhcnRlcnMgaW4gMSB5ZWFyXG4gKi9cbmNvbnN0IHF1YXJ0ZXJzSW5ZZWFyID0gKGV4cG9ydHMucXVhcnRlcnNJblllYXIgPSA0KTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbkhvdXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBob3VyLlxuICovXG5jb25zdCBzZWNvbmRzSW5Ib3VyID0gKGV4cG9ydHMuc2Vjb25kc0luSG91ciA9IDM2MDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luTWludXRlXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgbWludXRlLlxuICovXG5jb25zdCBzZWNvbmRzSW5NaW51dGUgPSAoZXhwb3J0cy5zZWNvbmRzSW5NaW51dGUgPSA2MCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5EYXlcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBkYXkuXG4gKi9cbmNvbnN0IHNlY29uZHNJbkRheSA9IChleHBvcnRzLnNlY29uZHNJbkRheSA9IHNlY29uZHNJbkhvdXIgKiAyNCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5XZWVrXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgd2Vlay5cbiAqL1xuY29uc3Qgc2Vjb25kc0luV2VlayA9IChleHBvcnRzLnNlY29uZHNJbldlZWsgPSBzZWNvbmRzSW5EYXkgKiA3KTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblllYXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB5ZWFyLlxuICovXG5jb25zdCBzZWNvbmRzSW5ZZWFyID0gKGV4cG9ydHMuc2Vjb25kc0luWWVhciA9IHNlY29uZHNJbkRheSAqIGRheXNJblllYXIpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luTW9udGhcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBtb250aFxuICovXG5jb25zdCBzZWNvbmRzSW5Nb250aCA9IChleHBvcnRzLnNlY29uZHNJbk1vbnRoID0gc2Vjb25kc0luWWVhciAvIDEyKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblF1YXJ0ZXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBxdWFydGVyLlxuICovXG5jb25zdCBzZWNvbmRzSW5RdWFydGVyID0gKGV4cG9ydHMuc2Vjb25kc0luUXVhcnRlciA9IHNlY29uZHNJbk1vbnRoICogMyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuY29uc3RydWN0RnJvbSA9IGNvbnN0cnVjdEZyb207XG5cbi8qKlxuICogQG5hbWUgY29uc3RydWN0RnJvbVxuICogQGNhdGVnb3J5IEdlbmVyaWMgSGVscGVyc1xuICogQHN1bW1hcnkgQ29uc3RydWN0cyBhIGRhdGUgdXNpbmcgdGhlIHJlZmVyZW5jZSBkYXRlIGFuZCB0aGUgdmFsdWVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBmdW5jdGlvbiBjb25zdHJ1Y3RzIGEgbmV3IGRhdGUgdXNpbmcgdGhlIGNvbnN0cnVjdG9yIGZyb20gdGhlIHJlZmVyZW5jZVxuICogZGF0ZSBhbmQgdGhlIGdpdmVuIHZhbHVlLiBJdCBoZWxwcyB0byBidWlsZCBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdFxuICogZGF0ZSBleHRlbnNpb25zLlxuICpcbiAqIEl0IGRlZmF1bHRzIHRvIGBEYXRlYCBpZiB0aGUgcGFzc2VkIHJlZmVyZW5jZSBkYXRlIGlzIGEgbnVtYmVyIG9yIGEgc3RyaW5nLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRha2UgY29uc3RydWN0b3IgZnJvbVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNyZWF0ZSB0aGUgZGF0ZVxuICpcbiAqIEByZXR1cm5zIERhdGUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlIGdpdmVuIGRhdGUgYW5kIHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tICdkYXRlLWZucydcbiAqXG4gKiAvLyBBIGZ1bmN0aW9uIHRoYXQgY2xvbmVzIGEgZGF0ZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCB0eXBlXG4gKiBmdW5jdGlvbiBjbG9uZURhdGU8RGF0ZVR5cGUgZXh0ZW5kcyBEYXRlKGRhdGU6IERhdGVUeXBlKTogRGF0ZVR5cGUge1xuICogICByZXR1cm4gY29uc3RydWN0RnJvbShcbiAqICAgICBkYXRlLCAvLyBVc2UgY29udHJ1c3RvciBmcm9tIHRoZSBnaXZlbiBkYXRlXG4gKiAgICAgZGF0ZS5nZXRUaW1lKCkgLy8gVXNlIHRoZSBkYXRlIHZhbHVlIHRvIGNyZWF0ZSBhIG5ldyBkYXRlXG4gKiAgIClcbiAqIH1cbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0RnJvbShkYXRlLCB2YWx1ZSkge1xuICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gbmV3IGRhdGUuY29uc3RydWN0b3IodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zdGFydE9mRGF5LmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHRpbWVzIGFyZSByZW1vdmVkXG4gKiBmcm9tIHRoZSBkYXRlcyBhbmQgdGhlbiB0aGUgZGlmZmVyZW5jZSBpbiBkYXlzIGlzIGNhbGN1bGF0ZWQuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgZWFybGllciBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjAwOjAwIGFuZCAyIEp1bHkgMjAxMiAwMDowMDowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMiwgNiwgMiwgMCwgMCksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCAwKVxuICogKVxuICogLy89PiAzNjZcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjU5OjAwIGFuZCAzIEp1bHkgMjAxMSAwMDowMTowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMywgMCwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCA1OSlcbiAqIClcbiAqIC8vPT4gMVxuICovXG5mdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBzdGFydE9mRGF5TGVmdCA9ICgwLCBfaW5kZXgyLnN0YXJ0T2ZEYXkpKGRhdGVMZWZ0KTtcbiAgY29uc3Qgc3RhcnRPZkRheVJpZ2h0ID0gKDAsIF9pbmRleDIuc3RhcnRPZkRheSkoZGF0ZVJpZ2h0KTtcblxuICBjb25zdCB0aW1lc3RhbXBMZWZ0ID1cbiAgICArc3RhcnRPZkRheUxlZnQgLVxuICAgICgwLCBfaW5kZXgzLmdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMpKHN0YXJ0T2ZEYXlMZWZ0KTtcbiAgY29uc3QgdGltZXN0YW1wUmlnaHQgPVxuICAgICtzdGFydE9mRGF5UmlnaHQgLVxuICAgICgwLCBfaW5kZXgzLmdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMpKHN0YXJ0T2ZEYXlSaWdodCk7XG5cbiAgLy8gUm91bmQgdGhlIG51bWJlciBvZiBkYXlzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIGRheSBpcyBub3QgY29uc3RhbnQgKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2ZcbiAgLy8gdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KS5cbiAgcmV0dXJuIE1hdGgucm91bmQoXG4gICAgKHRpbWVzdGFtcExlZnQgLSB0aW1lc3RhbXBSaWdodCkgLyBfaW5kZXgubWlsbGlzZWNvbmRzSW5EYXksXG4gICk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgZWFybGllciBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgbW9udGhzIGFyZSBiZXR3ZWVuIDMxIEphbnVhcnkgMjAxNCBhbmQgMSBTZXB0ZW1iZXIgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKFxuICogICBuZXcgRGF0ZSgyMDE0LCA4LCAxKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgMCwgMzEpXG4gKiApXG4gKiAvLz0+IDhcbiAqL1xuZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZUxlZnQpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVSaWdodCk7XG5cbiAgY29uc3QgeWVhckRpZmYgPSBfZGF0ZUxlZnQuZ2V0RnVsbFllYXIoKSAtIF9kYXRlUmlnaHQuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGhEaWZmID0gX2RhdGVMZWZ0LmdldE1vbnRoKCkgLSBfZGF0ZVJpZ2h0LmdldE1vbnRoKCk7XG5cbiAgcmV0dXJuIHllYXJEaWZmICogMTIgKyBtb250aERpZmY7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vZ2V0UXVhcnRlci5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnNcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHF1YXJ0ZXJzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgcXVhcnRlcnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgZWFybGllciBkYXRlXG5cbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgY2FsZW5kYXIgcXVhcnRlcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgcXVhcnRlcnMgYXJlIGJldHdlZW4gMzEgRGVjZW1iZXIgMjAxMyBhbmQgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyKSxcbiAqICAgbmV3IERhdGUoMjAxMywgMTEsIDMxKVxuICogKVxuICogLy89PiAzXG4gKi9cbmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGVMZWZ0KTtcbiAgY29uc3QgX2RhdGVSaWdodCA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZVJpZ2h0KTtcblxuICBjb25zdCB5ZWFyRGlmZiA9IF9kYXRlTGVmdC5nZXRGdWxsWWVhcigpIC0gX2RhdGVSaWdodC5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBxdWFydGVyRGlmZiA9XG4gICAgKDAsIF9pbmRleC5nZXRRdWFydGVyKShfZGF0ZUxlZnQpIC0gKDAsIF9pbmRleC5nZXRRdWFydGVyKShfZGF0ZVJpZ2h0KTtcblxuICByZXR1cm4geWVhckRpZmYgKiA0ICsgcXVhcnRlckRpZmY7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnNcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHllYXJzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgeWVhcnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgZWFybGllciBkYXRlXG5cbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgY2FsZW5kYXIgeWVhcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgeWVhcnMgYXJlIGJldHdlZW4gMzEgRGVjZW1iZXIgMjAxMyBhbmQgMTEgRmVicnVhcnkgMjAxNT9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMoXG4gKiAgIG5ldyBEYXRlKDIwMTUsIDEsIDExKSxcbiAqICAgbmV3IERhdGUoMjAxMywgMTEsIDMxKVxuICogKVxuICogLy89PiAyXG4gKi9cbmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZUxlZnQpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVSaWdodCk7XG5cbiAgcmV0dXJuIF9kYXRlTGVmdC5nZXRGdWxsWWVhcigpIC0gX2RhdGVSaWdodC5nZXRGdWxsWWVhcigpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmVuZE9mRGF5ID0gZW5kT2ZEYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZW5kIG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBlbmQgb2YgYSBkYXlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIGVuZCBvZiBhIGRheSBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFR1ZSBTZXAgMDIgMjAxNCAyMzo1OTo1OS45OTlcbiAqL1xuZnVuY3Rpb24gZW5kT2ZEYXkoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmVuZE9mTW9udGggPSBlbmRPZk1vbnRoO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBlbmRPZk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGVuZCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBlbmQgb2YgYSBtb250aFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgbW9udGggZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBlbmRPZk1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFR1ZSBTZXAgMzAgMjAxNCAyMzo1OTo1OS45OTlcbiAqL1xuZnVuY3Rpb24gZW5kT2ZNb250aChkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBtb250aCA9IF9kYXRlLmdldE1vbnRoKCk7XG4gIF9kYXRlLnNldEZ1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoICsgMSwgMCk7XG4gIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5lbmRPZldlZWsgPSBlbmRPZldlZWs7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBlbmRPZldlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBlbmRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZW5kIG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGVuZCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgZW5kIG9mIGEgd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBTYXQgU2VwIDA2IDIwMTQgMjM6NTk6NTkuOTk5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksIHRoZSBlbmQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBlbmRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gU3VuIFNlcCAwNyAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5mdW5jdGlvbiBlbmRPZldlZWsoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXgyLmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTtcbiAgY29uc3QgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyAtNyA6IDApICsgNiAtIChkYXkgLSB3ZWVrU3RhcnRzT24pO1xuXG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgZGlmZik7XG4gIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5lbmRPZlllYXIgPSBlbmRPZlllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZW5kIG9mIGEgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgeWVhciBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mWWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDAwKSlcbiAqIC8vPT4gV2VkIERlYyAzMSAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5mdW5jdGlvbiBlbmRPZlllYXIoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG4gIF9kYXRlLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCAwKTtcbiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmZvcm1hdCA9IGV4cG9ydHMuZm9ybWF0RGF0ZSA9IGZvcm1hdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZvcm1hdHRlcnNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2luZGV4My5mb3JtYXR0ZXJzO1xuICB9LFxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJsb25nRm9ybWF0dGVyc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfaW5kZXg0LmxvbmdGb3JtYXR0ZXJzO1xuICB9LFxufSk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0TG9jYWxlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzLmpzXCIpO1xudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qc1wiKTtcbnZhciBfaW5kZXg1ID0gcmVxdWlyZShcIi4vX2xpYi9wcm90ZWN0ZWRUb2tlbnMuanNcIik7XG5cbnZhciBfaW5kZXg2ID0gcmVxdWlyZShcIi4vaXNWYWxpZC5qc1wiKTtcbnZhciBfaW5kZXg3ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vLyBSZXhwb3J0cyBvZiBpbnRlcm5hbCBmb3IgbGlicmFyaWVzIHRvIHVzZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNjM4I2lzc3VlY29tbWVudC0xODc3MDgyODc0XG5cbi8vIFRoaXMgUmVnRXhwIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzIHNlcGFyYXRlZCBieSBgfGA6XG4vLyAtIFt5WVFxTUx3SWREZWNpaEhLa21zXW8gbWF0Y2hlcyBhbnkgYXZhaWxhYmxlIG9yZGluYWwgbnVtYmVyIHRva2VuXG4vLyAgIChvbmUgb2YgdGhlIGNlcnRhaW4gbGV0dGVycyBmb2xsb3dlZCBieSBgb2ApXG4vLyAtIChcXHcpXFwxKiBtYXRjaGVzIGFueSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgbGV0dGVyXG4vLyAtICcnIG1hdGNoZXMgdHdvIHF1b3RlIGNoYXJhY3RlcnMgaW4gYSByb3dcbi8vIC0gJygnJ3xbXiddKSsoJ3wkKSBtYXRjaGVzIGFueXRoaW5nIHN1cnJvdW5kZWQgYnkgdHdvIHF1b3RlIGNoYXJhY3RlcnMgKCcpLFxuLy8gICBleGNlcHQgYSBzaW5nbGUgcXVvdGUgc3ltYm9sLCB3aGljaCBlbmRzIHRoZSBzZXF1ZW5jZS5cbi8vICAgVHdvIHF1b3RlIGNoYXJhY3RlcnMgZG8gbm90IGVuZCB0aGUgc2VxdWVuY2UuXG4vLyAgIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHNpbmdsZSBxdW90ZVxuLy8gICB0aGVuIHRoZSBzZXF1ZW5jZSB3aWxsIGNvbnRpbnVlIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0cmluZy5cbi8vIC0gLiBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIHVubWF0Y2hlZCBieSBwcmV2aW91cyBwYXJ0cyBvZiB0aGUgUmVnRXhwc1xuY29uc3QgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9XG4gIC9beVlRcU1Md0lkRGVjaWhIS2ttc11vfChcXHcpXFwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuLy8gVGhpcyBSZWdFeHAgY2F0Y2hlcyBzeW1ib2xzIGVzY2FwZWQgYnkgcXVvdGVzLCBhbmQgYWxzb1xuLy8gc2VxdWVuY2VzIG9mIHN5bWJvbHMgUCwgcCwgYW5kIHRoZSBjb21iaW5hdGlvbnMgbGlrZSBgUFBQUFBQUHBwcHBwYFxuY29uc3QgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPSAvUCtwK3xQK3xwK3wnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuY29uc3QgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvO1xuY29uc3QgZG91YmxlUXVvdGVSZWdFeHAgPSAvJycvZztcbmNvbnN0IHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwID0gL1thLXpBLVpdLztcblxuLyoqXG4gKiBUaGUge0BsaW5rIGZvcm1hdH0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGZvcm1hdFxuICogQGFsaWFzIGZvcm1hdERhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgRm9ybWF0IHRoZSBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcgaW4gdGhlIGdpdmVuIGZvcm1hdC4gVGhlIHJlc3VsdCBtYXkgdmFyeSBieSBsb2NhbGUuXG4gKlxuICogPiDimqDvuI8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgYGZvcm1hdGAgdG9rZW5zIGRpZmZlciBmcm9tIE1vbWVudC5qcyBhbmQgb3RoZXIgbGlicmFyaWVzLlxuICogPiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiBUaGUgY2hhcmFjdGVycyB3cmFwcGVkIGJldHdlZW4gdHdvIHNpbmdsZSBxdW90ZXMgY2hhcmFjdGVycyAoJykgYXJlIGVzY2FwZWQuXG4gKiBUd28gc2luZ2xlIHF1b3RlcyBpbiBhIHJvdywgd2hldGhlciBpbnNpZGUgb3Igb3V0c2lkZSBhIHF1b3RlZCBzZXF1ZW5jZSwgcmVwcmVzZW50IGEgJ3JlYWwnIHNpbmdsZSBxdW90ZS5cbiAqIChzZWUgdGhlIGxhc3QgZXhhbXBsZSlcbiAqXG4gKiBGb3JtYXQgb2YgdGhlIHN0cmluZyBpcyBiYXNlZCBvbiBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiBodHRwczovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlXG4gKiB3aXRoIGEgZmV3IGFkZGl0aW9ucyAoc2VlIG5vdGUgNyBiZWxvdyB0aGUgdGFibGUpLlxuICpcbiAqIEFjY2VwdGVkIHBhdHRlcm5zOlxuICogfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUGF0dGVybiB8IFJlc3VsdCBleGFtcGxlcyAgICAgICAgICAgICAgICAgICB8IE5vdGVzIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS18XG4gKiB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHLi5HR0cgIHwgQUQsIEJDICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR0dHRyAgICB8IEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0dHICAgfCBBLCBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IENhbGVuZGFyIHllYXIgICAgICAgICAgICAgICAgICAgfCB5ICAgICAgIHwgNDQsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeW8gICAgICB8IDQ0dGgsIDFzdCwgMHRoLCAxN3RoICAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5ICAgICAgfCA0NCwgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXkgICAgIHwgMDQ0LCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5eSAgICB8IDAwNDQsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXl5ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgfCBZICAgICAgIHwgNDQsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWW8gICAgICB8IDQ0dGgsIDFzdCwgMTkwMHRoLCAyMDE3dGggICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZICAgICAgfCA0NCwgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVkgICAgIHwgMDQ0LCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZWSAgICB8IDAwNDQsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVlZICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICAgfCBSICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlIgICAgICB8IC00MywgMDAsIDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUiAgICAgfCAtMDQzLCAwMDAsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlJSICAgIHwgLTAwNDMsIDAwMDAsIDAwMDEsIDE5MDAsIDIwMTcgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUlIgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSw3IHxcbiAqIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgICB8IHUgICAgICAgfCAtNDMsIDAsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dSAgICAgIHwgLTQzLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1ICAgICB8IC0wNDMsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dXUgICAgfCAtMDA0MywgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1dSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBRdWFydGVyIChmb3JtYXR0aW5nKSAgICAgICAgICAgIHwgUSAgICAgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFvICAgICAgfCAxc3QsIDJuZCwgM3JkLCA0dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUSAgICAgIHwgMDEsIDAyLCAwMywgMDQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRICAgICB8IFExLCBRMiwgUTMsIFE0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUVEgICAgfCAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRUSAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCBRdWFydGVyIChzdGFuZC1hbG9uZSkgICAgICAgICAgIHwgcSAgICAgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFvICAgICAgfCAxc3QsIDJuZCwgM3JkLCA0dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcSAgICAgIHwgMDEsIDAyLCAwMywgMDQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxICAgICB8IFExLCBRMiwgUTMsIFE0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcXEgICAgfCAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxcSAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCBNb250aCAoZm9ybWF0dGluZykgICAgICAgICAgICAgIHwgTSAgICAgICB8IDEsIDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1vICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMnRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTSAgICAgIHwgMDEsIDAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NICAgICB8IEphbiwgRmViLCAuLi4sIERlYyAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTU0gICAgfCBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlciAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NTSAgIHwgSiwgRiwgLi4uLCBEICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNb250aCAoc3RhbmQtYWxvbmUpICAgICAgICAgICAgIHwgTCAgICAgICB8IDEsIDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMnRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTCAgICAgIHwgMDEsIDAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMICAgICB8IEphbiwgRmViLCAuLi4sIERlYyAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTEwgICAgfCBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlciAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMTCAgIHwgSiwgRiwgLi4uLCBEICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgIHwgdyAgICAgICB8IDEsIDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA1M3RoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3dyAgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBJU08gd2VlayBvZiB5ZWFyICAgICAgICAgICAgICAgIHwgSSAgICAgICB8IDEsIDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA1M3RoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJSSAgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgIHwgZCAgICAgICB8IDEsIDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAzMXN0ICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkZCAgICAgIHwgMDEsIDAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBEYXkgb2YgeWVhciAgICAgICAgICAgICAgICAgICAgIHwgRCAgICAgICB8IDEsIDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAzNjV0aCwgMzY2dGggICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBERCAgICAgIHwgMDEsIDAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgIHwgOSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREREICAgICB8IDAwMSwgMDAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEREREQgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzICAgICB8XG4gKiB8IERheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICAgICAgfCBFLi5FRUUgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUVFICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRUUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBJU08gZGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgIHwgaSAgICAgICB8IDEsIDIsIDMsIC4uLiwgNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA3dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaSAgICAgIHwgMDEsIDAyLCAuLi4sIDA3ICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWkgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyLDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpaSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWlpICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8IDcgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICB8IGUgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWUgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZWUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlZSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChzdGFuZC1hbG9uZSkgfCBjICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY28gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2MgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjYyAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2NjICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjY2MgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgYS4uYWEgICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYSAgICAgfCBhbSwgcG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWFhICAgIHwgYS5tLiwgcC5tLiAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYWEgICB8IGEsIHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICB8IGIuLmJiICAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmIgICAgIHwgYW0sIHBtLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiYiAgICB8IGEubS4sIHAubS4sIG5vb24sIG1pZG5pZ2h0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmJiICAgfCBhLCBwLCBuLCBtaSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICAgfCBCLi5CQkIgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQkJCQiAgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkJCICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICAgfCBoICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDEydGggICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhoICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICAgfCBIICAgICAgIHwgMCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSG8gICAgICB8IDB0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhIICAgICAgfCAwMCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICAgfCBLICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMCAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDB0aCAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtLICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICAgfCBrICAgICAgIHwgMjQsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga28gICAgICB8IDI0dGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtrICAgICAgfCAyNCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW8gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1tICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc28gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNzICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICAgfCBTICAgICAgIHwgMCwgMSwgLi4uLCA5ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1MgICAgICB8IDAwLCAwMSwgLi4uLCA5OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTUyAgICAgfCAwMDAsIDAwMSwgLi4uLCA5OTkgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1NTICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy8gWikgICAgICAgIHwgWCAgICAgICB8IC0wOCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYICAgICAgfCAtMDgwMCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFggICAgIHwgLTA4OjAwLCArMDU6MzAsIFogICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYWCAgICB8IC0wODAwLCArMDUzMCwgWiwgKzEyMzQ1NiAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFhYICAgfCAtMDg6MDAsICswNTozMCwgWiwgKzEyOjM0OjU2ICAgICAgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICAgfCB4ICAgICAgIHwgLTA4LCArMDUzMCwgKzAwICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHggICAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eCAgICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHh4ICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCwgKzEyMzQ1NiAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eHggICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAsICsxMjozNDo1NiB8ICAgICAgIHxcbiAqIHwgVGltZXpvbmUgKEdNVCkgICAgICAgICAgICAgICAgICB8IE8uLi5PT08gfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPT09PICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiAgICAgfFxuICogfCBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0LikgIHwgei4uLnp6eiB8IEdNVC04LCBHTVQrNTozMCwgR01UKzAgICAgICAgICAgICB8IDYgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHp6enogICAgfCBHTVQtMDg6MDAsIEdNVCswNTozMCwgR01UKzAwOjAwICAgfCAyLDYgICB8XG4gKiB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICAgfCB0ICAgICAgIHwgNTEyOTY5NTIwICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICB8IFQgICAgICAgfCA1MTI5Njk1MjA5MDAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw3ICAgfFxuICogfCBMb25nIGxvY2FsaXplZCBkYXRlICAgICAgICAgICAgIHwgUCAgICAgICB8IDA0LzI5LzE0NTMgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQICAgICAgfCBBcHIgMjksIDE0NTMgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFAgICAgIHwgQXByaWwgMjl0aCwgMTQ1MyAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUCAgICB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyAgICAgICAgICB8IDIsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgdGltZSAgICAgICAgICAgICB8IHAgICAgICAgfCAxMjowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcCAgICAgIHwgMTI6MDA6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHBwICAgICB8IDEyOjAwOjAwIEFNIEdNVCsyICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcHAgICAgfCAxMjowMDowMCBBTSBHTVQrMDI6MDAgICAgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IENvbWJpbmF0aW9uIG9mIGRhdGUgYW5kIHRpbWUgICAgfCBQcCAgICAgIHwgMDQvMjkvMTQ1MywgMTI6MDAgQU0gICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBwcCAgICB8IEFwciAyOSwgMTQ1MywgMTI6MDA6MDAgQU0gICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUHBwcCAgfCBBcHJpbCAyOXRoLCAxNDUzIGF0IC4uLiAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBQcHBwcHwgRnJpZGF5LCBBcHJpbCAyOXRoLCAxNDUzIGF0IC4uLiAgIHwgMiw3ICAgfFxuICogTm90ZXM6XG4gKiAxLiBcIkZvcm1hdHRpbmdcIiB1bml0cyAoZS5nLiBmb3JtYXR0aW5nIHF1YXJ0ZXIpIGluIHRoZSBkZWZhdWx0IGVuLVVTIGxvY2FsZVxuICogICAgYXJlIHRoZSBzYW1lIGFzIFwic3RhbmQtYWxvbmVcIiB1bml0cywgYnV0IGFyZSBkaWZmZXJlbnQgaW4gc29tZSBsYW5ndWFnZXMuXG4gKiAgICBcIkZvcm1hdHRpbmdcIiB1bml0cyBhcmUgZGVjbGluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgbGFuZ3VhZ2VcbiAqICAgIGluIHRoZSBjb250ZXh0IG9mIGEgZGF0ZS4gXCJTdGFuZC1hbG9uZVwiIHVuaXRzIGFyZSBhbHdheXMgbm9taW5hdGl2ZSBzaW5ndWxhcjpcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ2RvIExMTEwnLCB7bG9jYWxlOiBjc30pIC8vPT4gJzYuIGxpc3RvcGFkJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ2RvIE1NTU0nLCB7bG9jYWxlOiBjc30pIC8vPT4gJzYuIGxpc3RvcGFkdSdgXG4gKlxuICogMi4gQW55IHNlcXVlbmNlIG9mIHRoZSBpZGVudGljYWwgbGV0dGVycyBpcyBhIHBhdHRlcm4sIHVubGVzcyBpdCBpcyBlc2NhcGVkIGJ5XG4gKiAgICB0aGUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgKHNlZSBiZWxvdykuXG4gKiAgICBJZiB0aGUgc2VxdWVuY2UgaXMgbG9uZ2VyIHRoYW4gbGlzdGVkIGluIHRhYmxlIChlLmcuIGBFRUVFRUVFRUVFRWApXG4gKiAgICB0aGUgb3V0cHV0IHdpbGwgYmUgdGhlIHNhbWUgYXMgZGVmYXVsdCBwYXR0ZXJuIGZvciB0aGlzIHVuaXQsIHVzdWFsbHlcbiAqICAgIHRoZSBsb25nZXN0IG9uZSAoaW4gY2FzZSBvZiBJU08gd2Vla2RheXMsIGBFRUVFYCkuIERlZmF1bHQgcGF0dGVybnMgZm9yIHVuaXRzXG4gKiAgICBhcmUgbWFya2VkIHdpdGggXCIyXCIgaW4gdGhlIGxhc3QgY29sdW1uIG9mIHRoZSB0YWJsZS5cbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTScpIC8vPT4gJ05vdidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU0nKSAvLz0+ICdOJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogMy4gU29tZSBwYXR0ZXJucyBjb3VsZCBiZSB1bmxpbWl0ZWQgbGVuZ3RoIChzdWNoIGFzIGB5eXl5eXl5eWApLlxuICogICAgVGhlIG91dHB1dCB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zIHRvIG1hdGNoIHRoZSBsZW5ndGggb2YgdGhlIHBhdHRlcm4uXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICd5eXl5eXl5eScpIC8vPT4gJzAwMDAyMDE3J2BcbiAqXG4gKiA0LiBgUVFRUVFgIGFuZCBgcXFxcXFgIGNvdWxkIGJlIG5vdCBzdHJpY3RseSBudW1lcmljYWwgaW4gc29tZSBsb2NhbGVzLlxuICogICAgVGhlc2UgdG9rZW5zIHJlcHJlc2VudCB0aGUgc2hvcnRlc3QgZm9ybSBvZiB0aGUgcXVhcnRlci5cbiAqXG4gKiA1LiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYHlgIGFuZCBgdWAgcGF0dGVybnMgYXJlIEIuQy4geWVhcnM6XG4gKlxuICogICAgfCBZZWFyIHwgYHlgIHwgYHVgIHxcbiAqICAgIHwtLS0tLS18LS0tLS18LS0tLS18XG4gKiAgICB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICogICAgfCBCQyAxIHwgICAxIHwgICAwIHxcbiAqICAgIHwgQkMgMiB8ICAgMiB8ICAtMSB8XG4gKlxuICogICAgQWxzbyBgeXlgIGFsd2F5cyByZXR1cm5zIHRoZSBsYXN0IHR3byBkaWdpdHMgb2YgYSB5ZWFyLFxuICogICAgd2hpbGUgYHV1YCBwYWRzIHNpbmdsZSBkaWdpdCB5ZWFycyB0byAyIGNoYXJhY3RlcnMgYW5kIHJldHVybnMgb3RoZXIgeWVhcnMgdW5jaGFuZ2VkOlxuICpcbiAqICAgIHwgWWVhciB8IGB5eWAgfCBgdXVgIHxcbiAqICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXxcbiAqICAgIHwgMSAgICB8ICAgMDEgfCAgIDAxIHxcbiAqICAgIHwgMTQgICB8ICAgMTQgfCAgIDE0IHxcbiAqICAgIHwgMzc2ICB8ICAgNzYgfCAgMzc2IHxcbiAqICAgIHwgMTQ1MyB8ICAgNTMgfCAxNDUzIHxcbiAqXG4gKiAgICBUaGUgc2FtZSBkaWZmZXJlbmNlIGlzIHRydWUgZm9yIGxvY2FsIGFuZCBJU08gd2Vlay1udW1iZXJpbmcgeWVhcnMgKGBZYCBhbmQgYFJgKSxcbiAqICAgIGV4Y2VwdCBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFycyBhcmUgZGVwZW5kZW50IG9uIGBvcHRpb25zLndlZWtTdGFydHNPbmBcbiAqICAgIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgIChjb21wYXJlIFtnZXRJU09XZWVrWWVhcl0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9nZXRJU09XZWVrWWVhcilcbiAqICAgIGFuZCBbZ2V0V2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0V2Vla1llYXIpKS5cbiAqXG4gKiA2LiBTcGVjaWZpYyBub24tbG9jYXRpb24gdGltZXpvbmVzIGFyZSBjdXJyZW50bHkgdW5hdmFpbGFibGUgaW4gYGRhdGUtZm5zYCxcbiAqICAgIHNvIHJpZ2h0IG5vdyB0aGVzZSB0b2tlbnMgZmFsbCBiYWNrIHRvIEdNVCB0aW1lem9uZXMuXG4gKlxuICogNy4gVGhlc2UgcGF0dGVybnMgYXJlIG5vdCBpbiB0aGUgVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogICAgLSBgaWA6IElTTyBkYXkgb2Ygd2Vla1xuICogICAgLSBgSWA6IElTTyB3ZWVrIG9mIHllYXJcbiAqICAgIC0gYFJgOiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICogICAgLSBgdGA6IHNlY29uZHMgdGltZXN0YW1wXG4gKiAgICAtIGBUYDogbWlsbGlzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgb2A6IG9yZGluYWwgbnVtYmVyIG1vZGlmaWVyXG4gKiAgICAtIGBQYDogbG9uZyBsb2NhbGl6ZWQgZGF0ZVxuICogICAgLSBgcGA6IGxvbmcgbG9jYWxpemVkIHRpbWVcbiAqXG4gKiA4LiBgWVlgIGFuZCBgWVlZWWAgdG9rZW5zIHJlcHJlc2VudCB3ZWVrLW51bWJlcmluZyB5ZWFycyBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCB5ZWFycy5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIDkuIGBEYCBhbmQgYEREYCB0b2tlbnMgcmVwcmVzZW50IGRheXMgb2YgdGhlIHllYXIgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggZGF5cyBvZiB0aGUgbW9udGguXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zYCB0byB1c2UgdGhlbS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIGZvcm1hdCAtIFRoZSBzdHJpbmcgb2YgdG9rZW5zXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nXG4gKlxuICogQHRocm93cyBgZGF0ZWAgbXVzdCBub3QgYmUgSW52YWxpZCBEYXRlXG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBsb2NhbGl6ZWAgcHJvcGVydHlcbiAqIEB0aHJvd3MgYG9wdGlvbnMubG9jYWxlYCBtdXN0IGNvbnRhaW4gYGZvcm1hdExvbmdgIHByb3BlcnR5XG4gKiBAdGhyb3dzIHVzZSBgeXl5eWAgaW5zdGVhZCBvZiBgWVlZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYHl5YCBpbnN0ZWFkIG9mIGBZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYGRgIGluc3RlYWQgb2YgYERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgZm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAxMSBGZWJydWFyeSAyMDE0IGluIG1pZGRsZS1lbmRpYW4gZm9ybWF0OlxuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDEsIDExKSwgJ01NL2RkL3l5eXknKVxuICogLy89PiAnMDIvMTEvMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVwcmVzZW50IDIgSnVseSAyMDE0IGluIEVzcGVyYW50bzpcbiAqIGltcG9ydCB7IGVvTG9jYWxlIH0gZnJvbSAnZGF0ZS1mbnMvbG9jYWxlL2VvJ1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDYsIDIpLCBcImRvICdkZScgTU1NTSB5eXl5XCIsIHtcbiAqICAgbG9jYWxlOiBlb0xvY2FsZVxuICogfSlcbiAqIC8vPT4gJzItYSBkZSBqdWxpbyAyMDE0J1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFc2NhcGUgc3RyaW5nIGJ5IHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzOlxuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDYsIDIsIDE1KSwgXCJoICdvJydjbG9jaydcIilcbiAqIC8vPT4gXCIzIG8nY2xvY2tcIlxuICovXG5mdW5jdGlvbiBmb3JtYXQoZGF0ZSwgZm9ybWF0U3RyLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDIuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IGxvY2FsZSA9XG4gICAgb3B0aW9ucz8ubG9jYWxlID8/IGRlZmF1bHRPcHRpb25zLmxvY2FsZSA/PyBfaW5kZXguZGVmYXVsdExvY2FsZTtcblxuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3Qgb3JpZ2luYWxEYXRlID0gKDAsIF9pbmRleDcudG9EYXRlKShkYXRlKTtcblxuICBpZiAoISgwLCBfaW5kZXg2LmlzVmFsaWQpKG9yaWdpbmFsRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdGltZSB2YWx1ZVwiKTtcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IGZvcm1hdFN0clxuICAgIC5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcInBcIiB8fCBmaXJzdENoYXJhY3RlciA9PT0gXCJQXCIpIHtcbiAgICAgICAgY29uc3QgbG9uZ0Zvcm1hdHRlciA9IF9pbmRleDQubG9uZ0Zvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdO1xuICAgICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdHJpbmc7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKVxuICAgIC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwKVxuICAgIC5tYXAoKHN1YnN0cmluZykgPT4ge1xuICAgICAgLy8gUmVwbGFjZSB0d28gc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgd2l0aCBvbmUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlclxuICAgICAgaWYgKHN1YnN0cmluZyA9PT0gXCInJ1wiKSB7XG4gICAgICAgIHJldHVybiB7IGlzVG9rZW46IGZhbHNlLCB2YWx1ZTogXCInXCIgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIHJldHVybiB7IGlzVG9rZW46IGZhbHNlLCB2YWx1ZTogY2xlYW5Fc2NhcGVkU3RyaW5nKHN1YnN0cmluZykgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKF9pbmRleDMuZm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl0pIHtcbiAgICAgICAgcmV0dXJuIHsgaXNUb2tlbjogdHJ1ZSwgdmFsdWU6IHN1YnN0cmluZyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIubWF0Y2godW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHApKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgIFwiRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGBcIiArXG4gICAgICAgICAgICBmaXJzdENoYXJhY3RlciArXG4gICAgICAgICAgICBcImBcIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgaXNUb2tlbjogZmFsc2UsIHZhbHVlOiBzdWJzdHJpbmcgfTtcbiAgICB9KTtcblxuICAvLyBpbnZva2UgbG9jYWxpemUgcHJlcHJvY2Vzc29yIChvbmx5IGZvciBmcmVuY2ggbG9jYWxlcyBhdCB0aGUgbW9tZW50KVxuICBpZiAobG9jYWxlLmxvY2FsaXplLnByZXByb2Nlc3Nvcikge1xuICAgIHBhcnRzID0gbG9jYWxlLmxvY2FsaXplLnByZXByb2Nlc3NvcihvcmlnaW5hbERhdGUsIHBhcnRzKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdHRlck9wdGlvbnMgPSB7XG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlLFxuICAgIHdlZWtTdGFydHNPbixcbiAgICBsb2NhbGUsXG4gIH07XG5cbiAgcmV0dXJuIHBhcnRzXG4gICAgLm1hcCgocGFydCkgPT4ge1xuICAgICAgaWYgKCFwYXJ0LmlzVG9rZW4pIHJldHVybiBwYXJ0LnZhbHVlO1xuXG4gICAgICBjb25zdCB0b2tlbiA9IHBhcnQudmFsdWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnMgJiZcbiAgICAgICAgICAoMCwgX2luZGV4NS5pc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4pKHRva2VuKSkgfHxcbiAgICAgICAgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zICYmXG4gICAgICAgICAgKDAsIF9pbmRleDUuaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbikodG9rZW4pKVxuICAgICAgKSB7XG4gICAgICAgICgwLCBfaW5kZXg1Lndhcm5PclRocm93UHJvdGVjdGVkRXJyb3IpKHRva2VuLCBmb3JtYXRTdHIsIFN0cmluZyhkYXRlKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IF9pbmRleDMuZm9ybWF0dGVyc1t0b2tlblswXV07XG4gICAgICByZXR1cm4gZm9ybWF0dGVyKG9yaWdpbmFsRGF0ZSwgdG9rZW4sIGxvY2FsZS5sb2NhbGl6ZSwgZm9ybWF0dGVyT3B0aW9ucyk7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nKGlucHV0KSB7XG4gIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTtcblxuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlZFsxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwLCBcIidcIik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0RGF0ZSA9IGdldERhdGU7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldERhdGVcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBkYXkgb2YgdGhlIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF5IG9mIG1vbnRoXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIGRheSBvZiB0aGUgbW9udGggaXMgMjkgRmVicnVhcnkgMjAxMj9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERhdGUobmV3IERhdGUoMjAxMiwgMSwgMjkpKVxuICogLy89PiAyOVxuICovXG5mdW5jdGlvbiBnZXREYXRlKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRheU9mTW9udGggPSBfZGF0ZS5nZXREYXRlKCk7XG4gIHJldHVybiBkYXlPZk1vbnRoO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERheSA9IGdldERheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0RGF5XG4gKiBAY2F0ZWdvcnkgV2Vla2RheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGRheSBvZiB0aGUgd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF5IG9mIHdlZWssIDAgcmVwcmVzZW50cyBTdW5kYXlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggZGF5IG9mIHRoZSB3ZWVrIGlzIDI5IEZlYnJ1YXJ5IDIwMTI/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXkobmV3IERhdGUoMjAxMiwgMSwgMjkpKVxuICogLy89PiAzXG4gKi9cbmZ1bmN0aW9uIGdldERheShkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTtcbiAgcmV0dXJuIGRheTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXREYXlPZlllYXIgPSBnZXREYXlPZlllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zdGFydE9mWWVhci5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldERheU9mWWVhclxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGRheSBvZiB0aGUgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgZGF5IG9mIHRoZSB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF5IG9mIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggZGF5IG9mIHRoZSB5ZWFyIGlzIDIgSnVseSAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0RGF5T2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDYsIDIpKVxuICogLy89PiAxODNcbiAqL1xuZnVuY3Rpb24gZ2V0RGF5T2ZZZWFyKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4My50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkaWZmID0gKDAsIF9pbmRleC5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMpKFxuICAgIF9kYXRlLFxuICAgICgwLCBfaW5kZXgyLnN0YXJ0T2ZZZWFyKShfZGF0ZSksXG4gICk7XG4gIGNvbnN0IGRheU9mWWVhciA9IGRpZmYgKyAxO1xuICByZXR1cm4gZGF5T2ZZZWFyO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldERheXNJbk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGRheXMgaW4gYSBtb250aFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBkYXlzIGFyZSBpbiBGZWJydWFyeSAyMDAwP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0RGF5c0luTW9udGgobmV3IERhdGUoMjAwMCwgMSkpXG4gKiAvLz0+IDI5XG4gKi9cbmZ1bmN0aW9uIGdldERheXNJbk1vbnRoKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aEluZGV4ID0gX2RhdGUuZ2V0TW9udGgoKTtcbiAgY29uc3QgbGFzdERheU9mTW9udGggPSAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgbGFzdERheU9mTW9udGguc2V0RnVsbFllYXIoeWVhciwgbW9udGhJbmRleCArIDEsIDApO1xuICBsYXN0RGF5T2ZNb250aC5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGxhc3REYXlPZk1vbnRoLmdldERhdGUoKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXREZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zO1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXREZWZhdWx0T3B0aW9uc1xuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgZGVmYXVsdCBvcHRpb25zLlxuICogQHB1cmUgZmFsc2VcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgZGVmYXVsdHMgZm9yXG4gKiBgb3B0aW9ucy5sb2NhbGVgLCBgb3B0aW9ucy53ZWVrU3RhcnRzT25gIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgXG4gKiBhcmd1bWVudHMgZm9yIGFsbCBmdW5jdGlvbnMuXG4gKlxuICogWW91IGNhbiBjaGFuZ2UgdGhlc2Ugd2l0aCBbc2V0RGVmYXVsdE9wdGlvbnNdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3Mvc2V0RGVmYXVsdE9wdGlvbnMpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcmVzdWx0ID0gZ2V0RGVmYXVsdE9wdGlvbnMoKVxuICogLy89PiB7fVxuICpcbiAqIEBleGFtcGxlXG4gKiBzZXREZWZhdWx0T3B0aW9ucyh7IHdlZWtTdGFyc09uOiAxLCBmaXJzdFdlZWtDb250YWluc0RhdGU6IDQgfSlcbiAqIGNvbnN0IHJlc3VsdCA9IGdldERlZmF1bHRPcHRpb25zKClcbiAqIC8vPT4geyB3ZWVrU3RhcnNPbjogMSwgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH1cbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCAoMCwgX2luZGV4LmdldERlZmF1bHRPcHRpb25zKSgpKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRIb3VycyA9IGdldEhvdXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRIb3Vyc1xuICogQGNhdGVnb3J5IEhvdXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBob3VycyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgaG91cnMgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBob3Vyc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIGhvdXJzIG9mIDI5IEZlYnJ1YXJ5IDIwMTIgMTE6NDU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBnZXRIb3VycyhuZXcgRGF0ZSgyMDEyLCAxLCAyOSwgMTEsIDQ1KSlcbiAqIC8vPT4gMTFcbiAqL1xuZnVuY3Rpb24gZ2V0SG91cnMoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgaG91cnMgPSBfZGF0ZS5nZXRIb3VycygpO1xuICByZXR1cm4gaG91cnM7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0SVNPRGF5ID0gZ2V0SVNPRGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRJU09EYXlcbiAqIEBjYXRlZ29yeSBXZWVrZGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgZGF5IG9mIHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZSxcbiAqIHdoaWNoIGlzIDcgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5IGV0Yy5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2YgSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggZGF5IG9mIHRoZSBJU08gd2VlayBpcyAyNiBGZWJydWFyeSAyMDEyP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0SVNPRGF5KG5ldyBEYXRlKDIwMTIsIDEsIDI2KSlcbiAqIC8vPT4gN1xuICovXG5mdW5jdGlvbiBnZXRJU09EYXkoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgbGV0IGRheSA9IF9kYXRlLmdldERheSgpO1xuXG4gIGlmIChkYXkgPT09IDApIHtcbiAgICBkYXkgPSA3O1xuICB9XG5cbiAgcmV0dXJuIGRheTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRJU09XZWVrID0gZ2V0SVNPV2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9zdGFydE9mSVNPV2Vla1llYXIuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiA1M1xuICovXG5mdW5jdGlvbiBnZXRJU09XZWVrKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4NC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkaWZmID1cbiAgICArKDAsIF9pbmRleDIuc3RhcnRPZklTT1dlZWspKF9kYXRlKSAtXG4gICAgKygwLCBfaW5kZXgzLnN0YXJ0T2ZJU09XZWVrWWVhcikoX2RhdGUpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2Ygd2Vla3MgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBiZWNhdXNlIHRoZSBudW1iZXIgb2ZcbiAgLy8gbWlsbGlzZWNvbmRzIGluIGEgd2VlayBpcyBub3QgY29uc3RhbnQgKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2ZcbiAgLy8gdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KS5cbiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIF9pbmRleC5taWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRJU09XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0SVNPV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBJU08gV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZSxcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIElTTy13ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0SVNPV2Vla1llYXIobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDIwMDRcbiAqL1xuZnVuY3Rpb24gZ2V0SVNPV2Vla1llYXIoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gKDAsIF9pbmRleDIuc3RhcnRPZklTT1dlZWspKFxuICAgIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIsXG4gICk7XG5cbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhciA9ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZUaGlzWWVhciA9ICgwLCBfaW5kZXgyLnN0YXJ0T2ZJU09XZWVrKShcbiAgICBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyLFxuICApO1xuXG4gIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldE1pbnV0ZXMgPSBnZXRNaW51dGVzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRNaW51dGVzXG4gKiBAY2F0ZWdvcnkgTWludXRlIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbWludXRlcyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbWludXRlcyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG1pbnV0ZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2V0IHRoZSBtaW51dGVzIG9mIDI5IEZlYnJ1YXJ5IDIwMTIgMTE6NDU6MDU6XG4gKiBjb25zdCByZXN1bHQgPSBnZXRNaW51dGVzKG5ldyBEYXRlKDIwMTIsIDEsIDI5LCAxMSwgNDUsIDUpKVxuICogLy89PiA0NVxuICovXG5mdW5jdGlvbiBnZXRNaW51dGVzKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBfZGF0ZS5nZXRNaW51dGVzKCk7XG4gIHJldHVybiBtaW51dGVzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldE1vbnRoID0gZ2V0TW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldE1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBtb250aCBpbmRleCAoMC0xMSlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggbW9udGggaXMgMjkgRmVicnVhcnkgMjAxMj9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldE1vbnRoKG5ldyBEYXRlKDIwMTIsIDEsIDI5KSlcbiAqIC8vPT4gMVxuICovXG5mdW5jdGlvbiBnZXRNb250aChkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBtb250aCA9IF9kYXRlLmdldE1vbnRoKCk7XG4gIHJldHVybiBtb250aDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRRdWFydGVyID0gZ2V0UXVhcnRlcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0UXVhcnRlclxuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSB5ZWFyIHF1YXJ0ZXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIHllYXIgcXVhcnRlciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHF1YXJ0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggcXVhcnRlciBpcyAyIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFF1YXJ0ZXIobmV3IERhdGUoMjAxNCwgNiwgMikpXG4gKiAvLz0+IDNcbiAqL1xuZnVuY3Rpb24gZ2V0UXVhcnRlcihkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBxdWFydGVyID0gTWF0aC50cnVuYyhfZGF0ZS5nZXRNb250aCgpIC8gMykgKyAxO1xuICByZXR1cm4gcXVhcnRlcjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRTZWNvbmRzID0gZ2V0U2Vjb25kcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0U2Vjb25kc1xuICogQGNhdGVnb3J5IFNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHNlY29uZHMgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIHNlY29uZHMgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBzZWNvbmRzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEdldCB0aGUgc2Vjb25kcyBvZiAyOSBGZWJydWFyeSAyMDEyIDExOjQ1OjA1LjEyMzpcbiAqIGNvbnN0IHJlc3VsdCA9IGdldFNlY29uZHMobmV3IERhdGUoMjAxMiwgMSwgMjksIDExLCA0NSwgNSwgMTIzKSlcbiAqIC8vPT4gNVxuICovXG5mdW5jdGlvbiBnZXRTZWNvbmRzKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHNlY29uZHMgPSBfZGF0ZS5nZXRTZWNvbmRzKCk7XG4gIHJldHVybiBzZWNvbmRzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFRpbWUgPSBnZXRUaW1lO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRUaW1lXG4gKiBAY2F0ZWdvcnkgVGltZXN0YW1wIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbWlsbGlzZWNvbmRzIHRpbWVzdGFtcCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbWlsbGlzZWNvbmRzIHRpbWVzdGFtcCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHRpbWVzdGFtcFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIHRpbWVzdGFtcCBvZiAyOSBGZWJydWFyeSAyMDEyIDExOjQ1OjA1LjEyMzpcbiAqIGNvbnN0IHJlc3VsdCA9IGdldFRpbWUobmV3IERhdGUoMjAxMiwgMSwgMjksIDExLCA0NSwgNSwgMTIzKSlcbiAqIC8vPT4gMTMzMDUxNTkwNTEyM1xuICovXG5mdW5jdGlvbiBnZXRUaW1lKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IF9kYXRlLmdldFRpbWUoKTtcbiAgcmV0dXJuIHRpbWVzdGFtcDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRXZWVrID0gZ2V0V2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZXZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9zdGFydE9mV2Vla1llYXIuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9ucz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5cbmZ1bmN0aW9uIGdldFdlZWsoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXg0LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPVxuICAgICsoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoX2RhdGUsIG9wdGlvbnMpIC1cbiAgICArKDAsIF9pbmRleDMuc3RhcnRPZldlZWtZZWFyKShfZGF0ZSwgb3B0aW9ucyk7XG5cbiAgLy8gUm91bmQgdGhlIG51bWJlciBvZiB3ZWVrcyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGJlY2F1c2UgdGhlIG51bWJlciBvZlxuICAvLyBtaWxsaXNlY29uZHMgaW4gYSB3ZWVrIGlzIG5vdCBjb25zdGFudCAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZlxuICAvLyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpLlxuICByZXR1cm4gTWF0aC5yb3VuZChkaWZmIC8gX2luZGV4Lm1pbGxpc2Vjb25kc0luV2VlaykgKyAxO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFdlZWtZZWFyID0gZ2V0V2Vla1llYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZldlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0V2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrWWVhclxuICogQGNhdGVnb3J5IFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgd2l0aCB0aGUgZGVmYXVsdCBzZXR0aW5ncz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNikpXG4gKiAvLz0+IDIwMDVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHdlZWsgc3RhcnRzIG9uIFNhdHVyZGF5P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSwgeyB3ZWVrU3RhcnRzT246IDYgfSlcbiAqIC8vPT4gMjAwNFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgaWYgdGhlIGZpcnN0IHdlZWsgY29udGFpbnMgNCBKYW51YXJ5P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSwgeyBmaXJzdFdlZWtDb250YWluc0RhdGU6IDQgfSlcbiAqIC8vPT4gMjAwNFxuICovXG5mdW5jdGlvbiBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4NC5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCBmaXJzdFdlZWtPZk5leHRZZWFyID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gKDAsIF9pbmRleDIuc3RhcnRPZldlZWspKFxuICAgIGZpcnN0V2Vla09mTmV4dFllYXIsXG4gICAgb3B0aW9ucyxcbiAgKTtcblxuICBjb25zdCBmaXJzdFdlZWtPZlRoaXNZZWFyID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSAoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoXG4gICAgZmlyc3RXZWVrT2ZUaGlzWWVhcixcbiAgICBvcHRpb25zLFxuICApO1xuXG4gIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFllYXIgPSBnZXRZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHllYXIgaXMgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRZZWFyKG5ldyBEYXRlKDIwMTQsIDYsIDIpKVxuICogLy89PiAyMDE0XG4gKi9cbmZ1bmN0aW9uIGdldFllYXIoZGF0ZSkge1xuICByZXR1cm4gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpLmdldEZ1bGxZZWFyKCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNBZnRlciA9IGlzQWZ0ZXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzQWZ0ZXJcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGZpcnN0IGRhdGUgYWZ0ZXIgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJcyB0aGUgZmlyc3QgZGF0ZSBhZnRlciB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRoYXQgc2hvdWxkIGJlIGFmdGVyIHRoZSBvdGhlciBvbmUgdG8gcmV0dXJuIHRydWVcbiAqIEBwYXJhbSBkYXRlVG9Db21wYXJlIC0gVGhlIGRhdGUgdG8gY29tcGFyZSB3aXRoXG4gKlxuICogQHJldHVybnMgVGhlIGZpcnN0IGRhdGUgaXMgYWZ0ZXIgdGhlIHNlY29uZCBkYXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElzIDEwIEp1bHkgMTk4OSBhZnRlciAxMSBGZWJydWFyeSAxOTg3P1xuICogY29uc3QgcmVzdWx0ID0gaXNBZnRlcihuZXcgRGF0ZSgxOTg5LCA2LCAxMCksIG5ldyBEYXRlKDE5ODcsIDEsIDExKSlcbiAqIC8vPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc0FmdGVyKGRhdGUsIGRhdGVUb0NvbXBhcmUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IF9kYXRlVG9Db21wYXJlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVUb0NvbXBhcmUpO1xuICByZXR1cm4gX2RhdGUuZ2V0VGltZSgpID4gX2RhdGVUb0NvbXBhcmUuZ2V0VGltZSgpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzQmVmb3JlID0gaXNCZWZvcmU7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzQmVmb3JlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRoYXQgc2hvdWxkIGJlIGJlZm9yZSB0aGUgb3RoZXIgb25lIHRvIHJldHVybiB0cnVlXG4gKiBAcGFyYW0gZGF0ZVRvQ29tcGFyZSAtIFRoZSBkYXRlIHRvIGNvbXBhcmUgd2l0aFxuICpcbiAqIEByZXR1cm5zIFRoZSBmaXJzdCBkYXRlIGlzIGJlZm9yZSB0aGUgc2Vjb25kIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSXMgMTAgSnVseSAxOTg5IGJlZm9yZSAxMSBGZWJydWFyeSAxOTg3P1xuICogY29uc3QgcmVzdWx0ID0gaXNCZWZvcmUobmV3IERhdGUoMTk4OSwgNiwgMTApLCBuZXcgRGF0ZSgxOTg3LCAxLCAxMSkpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQmVmb3JlKGRhdGUsIGRhdGVUb0NvbXBhcmUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IF9kYXRlVG9Db21wYXJlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVUb0NvbXBhcmUpO1xuICByZXR1cm4gK19kYXRlIDwgK19kYXRlVG9Db21wYXJlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTsgLyoqXG4gKiBAbmFtZSBpc0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIHZhbHVlIGEgZGF0ZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZS4gVGhlIGZ1bmN0aW9uIHdvcmtzIGZvciBkYXRlcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgaWZyYW1lcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZSgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoTmFOKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3Igc29tZSB2YWx1ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSgnMjAxNC0wMi0zMScpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBvYmplY3Q6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoe30pXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBEYXRlXVwiKVxuICApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzRXF1YWwgPSBpc0VxdWFsO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc0VxdWFsXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgZXF1YWw/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGVxdWFsP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY29tcGFyZVxuICpcbiAqIEByZXR1cm5zIFRoZSBkYXRlcyBhcmUgZXF1YWxcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDIgSnVseSAyMDE0IDA2OjMwOjQ1LjAwMCBhbmQgMiBKdWx5IDIwMTQgMDY6MzA6NDUuNTAwIGVxdWFsP1xuICogY29uc3QgcmVzdWx0ID0gaXNFcXVhbChcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiwgNiwgMzAsIDQ1LCAwKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiwgNiwgMzAsIDQ1LCA1MDApXG4gKiApXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRXF1YWwobGVmdERhdGUsIHJpZ2h0RGF0ZSkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4LnRvRGF0ZSkobGVmdERhdGUpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleC50b0RhdGUpKHJpZ2h0RGF0ZSk7XG4gIHJldHVybiArX2RhdGVMZWZ0ID09PSArX2RhdGVSaWdodDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1NhbWVEYXkgPSBpc1NhbWVEYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vc3RhcnRPZkRheS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc1NhbWVEYXlcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBkYXkgKGFuZCB5ZWFyIGFuZCBtb250aCk/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIGRheSAoYW5kIHllYXIgYW5kIG1vbnRoKT9cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgZmlyc3QgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBzZWNvbmQgZGF0ZSB0byBjaGVja1xuXG4gKiBAcmV0dXJucyBUaGUgZGF0ZXMgYXJlIGluIHRoZSBzYW1lIGRheSAoYW5kIHllYXIgYW5kIG1vbnRoKVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgNCBTZXB0ZW1iZXIgMDY6MDA6MDAgYW5kIDQgU2VwdGVtYmVyIDE4OjAwOjAwIGluIHRoZSBzYW1lIGRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZURheShuZXcgRGF0ZSgyMDE0LCA4LCA0LCA2LCAwKSwgbmV3IERhdGUoMjAxNCwgOCwgNCwgMTgsIDApKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSA0IFNlcHRlbWJlciBhbmQgNCBPY3RvYmVyIGluIHRoZSBzYW1lIGRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZURheShuZXcgRGF0ZSgyMDE0LCA4LCA0KSwgbmV3IERhdGUoMjAxNCwgOSwgNCkpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSA0IFNlcHRlbWJlciwgMjAxNCBhbmQgNCBTZXB0ZW1iZXIsIDIwMTUgaW4gdGhlIHNhbWUgZGF5P1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDQpLCBuZXcgRGF0ZSgyMDE1LCA4LCA0KSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTYW1lRGF5KGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgZGF0ZUxlZnRTdGFydE9mRGF5ID0gKDAsIF9pbmRleC5zdGFydE9mRGF5KShkYXRlTGVmdCk7XG4gIGNvbnN0IGRhdGVSaWdodFN0YXJ0T2ZEYXkgPSAoMCwgX2luZGV4LnN0YXJ0T2ZEYXkpKGRhdGVSaWdodCk7XG5cbiAgcmV0dXJuICtkYXRlTGVmdFN0YXJ0T2ZEYXkgPT09ICtkYXRlUmlnaHRTdGFydE9mRGF5O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzU2FtZU1vbnRoID0gaXNTYW1lTW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzU2FtZU1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBtb250aCAoYW5kIHllYXIpP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBtb250aCAoYW5kIHllYXIpP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSBtb250aCAoYW5kIHllYXIpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAyIFNlcHRlbWJlciAyMDE0IGFuZCAyNSBTZXB0ZW1iZXIgMjAxNCBpbiB0aGUgc2FtZSBtb250aD9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZU1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDIpLCBuZXcgRGF0ZSgyMDE0LCA4LCAyNSkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDIgU2VwdGVtYmVyIDIwMTQgYW5kIDI1IFNlcHRlbWJlciAyMDE1IGluIHRoZSBzYW1lIG1vbnRoP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTUsIDgsIDI1KSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTYW1lTW9udGgoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZUxlZnQpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVSaWdodCk7XG4gIHJldHVybiAoXG4gICAgX2RhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgPT09IF9kYXRlUmlnaHQuZ2V0RnVsbFllYXIoKSAmJlxuICAgIF9kYXRlTGVmdC5nZXRNb250aCgpID09PSBfZGF0ZVJpZ2h0LmdldE1vbnRoKClcbiAgKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1NhbWVRdWFydGVyID0gaXNTYW1lUXVhcnRlcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9zdGFydE9mUXVhcnRlci5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc1NhbWVRdWFydGVyXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIHF1YXJ0ZXIgKGFuZCB5ZWFyKT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgcXVhcnRlciAoYW5kIHllYXIpP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG5cbiAqIEByZXR1cm5zIFRoZSBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgcXVhcnRlciAoYW5kIHllYXIpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAxIEphbnVhcnkgMjAxNCBhbmQgOCBNYXJjaCAyMDE0IGluIHRoZSBzYW1lIHF1YXJ0ZXI/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVRdWFydGVyKG5ldyBEYXRlKDIwMTQsIDAsIDEpLCBuZXcgRGF0ZSgyMDE0LCAyLCA4KSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMSBKYW51YXJ5IDIwMTQgYW5kIDEgSmFudWFyeSAyMDE1IGluIHRoZSBzYW1lIHF1YXJ0ZXI/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVRdWFydGVyKG5ldyBEYXRlKDIwMTQsIDAsIDEpLCBuZXcgRGF0ZSgyMDE1LCAwLCAxKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTYW1lUXVhcnRlcihkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IGRhdGVMZWZ0U3RhcnRPZlF1YXJ0ZXIgPSAoMCwgX2luZGV4LnN0YXJ0T2ZRdWFydGVyKShkYXRlTGVmdCk7XG4gIGNvbnN0IGRhdGVSaWdodFN0YXJ0T2ZRdWFydGVyID0gKDAsIF9pbmRleC5zdGFydE9mUXVhcnRlcikoZGF0ZVJpZ2h0KTtcblxuICByZXR1cm4gK2RhdGVMZWZ0U3RhcnRPZlF1YXJ0ZXIgPT09ICtkYXRlUmlnaHRTdGFydE9mUXVhcnRlcjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1NhbWVZZWFyID0gaXNTYW1lWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNTYW1lWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSB5ZWFyP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSB5ZWFyP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAyIFNlcHRlbWJlciAyMDE0IGFuZCAyNSBTZXB0ZW1iZXIgMjAxNCBpbiB0aGUgc2FtZSB5ZWFyP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lWWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAyKSwgbmV3IERhdGUoMjAxNCwgOCwgMjUpKVxuICogLy89PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzU2FtZVllYXIoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZUxlZnQpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVSaWdodCk7XG4gIHJldHVybiBfZGF0ZUxlZnQuZ2V0RnVsbFllYXIoKSA9PT0gX2RhdGVSaWdodC5nZXRGdWxsWWVhcigpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzVmFsaWQgPSBpc1ZhbGlkO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2lzRGF0ZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzVmFsaWRcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIGRhdGUgdmFsaWQ/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIGZhbHNlIGlmIGFyZ3VtZW50IGlzIEludmFsaWQgRGF0ZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gKiBBcmd1bWVudCBpcyBjb252ZXJ0ZWQgdG8gRGF0ZSB1c2luZyBgdG9EYXRlYC4gU2VlIFt0b0RhdGVdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvdG9EYXRlKVxuICogSW52YWxpZCBEYXRlIGlzIGEgRGF0ZSwgd2hvc2UgdGltZSB2YWx1ZSBpcyBOYU4uXG4gKlxuICogVGltZSB2YWx1ZSBvZiBEYXRlOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjkuMS4xXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIFRoZSBkYXRlIGlzIHZhbGlkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQobmV3IERhdGUoMjAxNCwgMSwgMzEpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgdmFsdWUsIGNvbnZlcnRhYmxlIGludG8gYSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZCgxMzkzODA0ODAwMDAwKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgaW52YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgnJykpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWQoZGF0ZSkge1xuICBpZiAoISgwLCBfaW5kZXguaXNEYXRlKShkYXRlKSAmJiB0eXBlb2YgZGF0ZSAhPT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZSk7XG4gIHJldHVybiAhaXNOYU4oTnVtYmVyKF9kYXRlKSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNXaXRoaW5JbnRlcnZhbCA9IGlzV2l0aGluSW50ZXJ2YWw7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzV2l0aGluSW50ZXJ2YWxcbiAqIEBjYXRlZ29yeSBJbnRlcnZhbCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gZGF0ZSB3aXRoaW4gdGhlIGludGVydmFsP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSXMgdGhlIGdpdmVuIGRhdGUgd2l0aGluIHRoZSBpbnRlcnZhbD8gKEluY2x1ZGluZyBzdGFydCBhbmQgZW5kLilcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gaW50ZXJ2YWwgLSBUaGUgaW50ZXJ2YWwgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZSBpcyB3aXRoaW4gdGhlIGludGVydmFsXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgZGF0ZSB3aXRoaW4gdGhlIGludGVydmFsOlxuICogaXNXaXRoaW5JbnRlcnZhbChuZXcgRGF0ZSgyMDE0LCAwLCAzKSwge1xuICogICBzdGFydDogbmV3IERhdGUoMjAxNCwgMCwgMSksXG4gKiAgIGVuZDogbmV3IERhdGUoMjAxNCwgMCwgNylcbiAqIH0pXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSBkYXRlIG91dHNpZGUgb2YgdGhlIGludGVydmFsOlxuICogaXNXaXRoaW5JbnRlcnZhbChuZXcgRGF0ZSgyMDE0LCAwLCAxMCksIHtcbiAqICAgc3RhcnQ6IG5ldyBEYXRlKDIwMTQsIDAsIDEpLFxuICogICBlbmQ6IG5ldyBEYXRlKDIwMTQsIDAsIDcpXG4gKiB9KVxuICogLy89PiBmYWxzZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgZGF0ZSBlcXVhbCB0byBpbnRlcnZhbCBzdGFydDpcbiAqIGlzV2l0aGluSW50ZXJ2YWwoZGF0ZSwgeyBzdGFydCwgZW5kOiBkYXRlIH0pXG4gKiAvLyA9PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBkYXRlIGVxdWFsIHRvIGludGVydmFsIGVuZDpcbiAqIGlzV2l0aGluSW50ZXJ2YWwoZGF0ZSwgeyBzdGFydDogZGF0ZSwgZW5kIH0pXG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzV2l0aGluSW50ZXJ2YWwoZGF0ZSwgaW50ZXJ2YWwpIHtcbiAgY29uc3QgdGltZSA9ICsoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IFtzdGFydFRpbWUsIGVuZFRpbWVdID0gW1xuICAgICsoMCwgX2luZGV4LnRvRGF0ZSkoaW50ZXJ2YWwuc3RhcnQpLFxuICAgICsoMCwgX2luZGV4LnRvRGF0ZSkoaW50ZXJ2YWwuZW5kKSxcbiAgXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG5cbiAgcmV0dXJuIHRpbWUgPj0gc3RhcnRUaW1lICYmIHRpbWUgPD0gZW5kVGltZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5idWlsZEZvcm1hdExvbmdGbiA9IGJ1aWxkRm9ybWF0TG9uZ0ZuO1xuXG5mdW5jdGlvbiBidWlsZEZvcm1hdExvbmdGbihhcmdzKSB7XG4gIHJldHVybiAob3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIFN0cmluZygpXG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgY29uc3QgZm9ybWF0ID0gYXJncy5mb3JtYXRzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHNbYXJncy5kZWZhdWx0V2lkdGhdO1xuICAgIHJldHVybiBmb3JtYXQ7XG4gIH07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYnVpbGRMb2NhbGl6ZUZuID0gYnVpbGRMb2NhbGl6ZUZuOyAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4vKipcbiAqIFRoZSBsb2NhbGl6ZSBmdW5jdGlvbiBhcmd1bWVudCBjYWxsYmFjayB3aGljaCBhbGxvd3MgdG8gY29udmVydCByYXcgdmFsdWUgdG9cbiAqIHRoZSBhY3R1YWwgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAqL1xuXG4vKipcbiAqIFRoZSBtYXAgb2YgbG9jYWxpemVkIHZhbHVlcyBmb3IgZWFjaCB3aWR0aC5cbiAqL1xuXG4vKipcbiAqIFRoZSBpbmRleCB0eXBlIG9mIHRoZSBsb2NhbGUgdW5pdCB2YWx1ZS4gSXQgdHlwZXMgY29udmVyc2lvbiBvZiB1bml0cyBvZlxuICogdmFsdWVzIHRoYXQgZG9uJ3Qgc3RhcnQgYXQgMCAoaS5lLiBxdWFydGVycykuXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgdW5pdCB2YWx1ZSB0byB0aGUgdHVwbGUgb2YgdmFsdWVzLlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBlcmEgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIEJDLFxuICogdGhlIHNlY29uZCBlbGVtZW50IHJlcHJlc2VudHMgQUQuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIHF1YXJ0ZXIgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIFExLlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBkYXkgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIFN1bmRheS5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgbW9udGggdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIEphbnVhcnkuXG4gKi9cblxuZnVuY3Rpb24gYnVpbGRMb2NhbGl6ZUZuKGFyZ3MpIHtcbiAgcmV0dXJuICh2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBvcHRpb25zPy5jb250ZXh0ID8gU3RyaW5nKG9wdGlvbnMuY29udGV4dCkgOiBcInN0YW5kYWxvbmVcIjtcblxuICAgIGxldCB2YWx1ZXNBcnJheTtcbiAgICBpZiAoY29udGV4dCA9PT0gXCJmb3JtYXR0aW5nXCIgJiYgYXJncy5mb3JtYXR0aW5nVmFsdWVzKSB7XG4gICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRGb3JtYXR0aW5nV2lkdGggfHwgYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YWx1ZXNBcnJheSA9XG4gICAgICAgIGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1t3aWR0aF0gfHwgYXJncy5mb3JtYXR0aW5nVmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MudmFsdWVzW3dpZHRoXSB8fCBhcmdzLnZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGFyZ3MuYXJndW1lbnRDYWxsYmFjayA/IGFyZ3MuYXJndW1lbnRDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBGb3Igc29tZSByZWFzb24gVHlwZVNjcmlwdCBqdXN0IGRvbid0IHdhbnQgdG8gbWF0Y2ggaXQsIG5vIG1hdHRlciBob3cgaGFyZCB3ZSB0cnkuIEkgY2hhbGxlbmdlIHlvdSB0byB0cnkgdG8gcmVtb3ZlIGl0IVxuICAgIHJldHVybiB2YWx1ZXNBcnJheVtpbmRleF07XG4gIH07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYnVpbGRNYXRjaEZuID0gYnVpbGRNYXRjaEZuO1xuXG5mdW5jdGlvbiBidWlsZE1hdGNoRm4oYXJncykge1xuICByZXR1cm4gKHN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoO1xuXG4gICAgY29uc3QgbWF0Y2hQYXR0ZXJuID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLm1hdGNoUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5tYXRjaFBhdHRlcm5zW2FyZ3MuZGVmYXVsdE1hdGNoV2lkdGhdO1xuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKG1hdGNoUGF0dGVybik7XG5cbiAgICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdO1xuXG4gICAgY29uc3QgcGFyc2VQYXR0ZXJucyA9XG4gICAgICAod2lkdGggJiYgYXJncy5wYXJzZVBhdHRlcm5zW3dpZHRoXSkgfHxcbiAgICAgIGFyZ3MucGFyc2VQYXR0ZXJuc1thcmdzLmRlZmF1bHRQYXJzZVdpZHRoXTtcblxuICAgIGNvbnN0IGtleSA9IEFycmF5LmlzQXJyYXkocGFyc2VQYXR0ZXJucylcbiAgICAgID8gZmluZEluZGV4KHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpXG4gICAgICA6IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIEkgY2hhbGxhbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgZmluZEtleShwYXJzZVBhdHRlcm5zLCAocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpKTtcblxuICAgIGxldCB2YWx1ZTtcblxuICAgIHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleSkgOiBrZXk7XG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gSSBjaGFsbGFuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZVxuICAgICAgICBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpXG4gICAgICA6IHZhbHVlO1xuXG4gICAgY29uc3QgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG5cbiAgICByZXR1cm4geyB2YWx1ZSwgcmVzdCB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiZcbiAgICAgIHByZWRpY2F0ZShvYmplY3Rba2V5XSlcbiAgICApIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlKSB7XG4gIGZvciAobGV0IGtleSA9IDA7IGtleSA8IGFycmF5Lmxlbmd0aDsga2V5KyspIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2tleV0pKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmJ1aWxkTWF0Y2hQYXR0ZXJuRm4gPSBidWlsZE1hdGNoUGF0dGVybkZuO1xuXG5mdW5jdGlvbiBidWlsZE1hdGNoUGF0dGVybkZuKGFyZ3MpIHtcbiAgcmV0dXJuIChzdHJpbmcsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MubWF0Y2hQYXR0ZXJuKTtcbiAgICBpZiAoIW1hdGNoUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLnBhcnNlUGF0dGVybik7XG4gICAgaWYgKCFwYXJzZVJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgbGV0IHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrXG4gICAgICA/IGFyZ3MudmFsdWVDYWxsYmFjayhwYXJzZVJlc3VsdFswXSlcbiAgICAgIDogcGFyc2VSZXN1bHRbMF07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBJIGNoYWxsYW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cbiAgICBjb25zdCByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcblxuICAgIHJldHVybiB7IHZhbHVlLCByZXN0IH07XG4gIH07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZW5VUyA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9lbi1VUy9fbGliL2Zvcm1hdExvbmcuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL2VuLVVTL19saWIvbG9jYWxpemUuanNcIik7XG52YXIgX2luZGV4NSA9IHJlcXVpcmUoXCIuL2VuLVVTL19saWIvbWF0Y2guanNcIik7XG5cbi8qKlxuICogQGNhdGVnb3J5IExvY2FsZXNcbiAqIEBzdW1tYXJ5IEVuZ2xpc2ggbG9jYWxlIChVbml0ZWQgU3RhdGVzKS5cbiAqIEBsYW5ndWFnZSBFbmdsaXNoXG4gKiBAaXNvLTYzOS0yIGVuZ1xuICogQGF1dGhvciBTYXNoYSBLb3NzIFtAa29zc25vY29ycF0oaHR0cHM6Ly9naXRodWIuY29tL2tvc3Nub2NvcnApXG4gKiBAYXV0aG9yIExlc2hhIEtvc3MgW0BsZXNoYWtvc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZXNoYWtvc3MpXG4gKi9cbmNvbnN0IGVuVVMgPSAoZXhwb3J0cy5lblVTID0ge1xuICBjb2RlOiBcImVuLVVTXCIsXG4gIGZvcm1hdERpc3RhbmNlOiBfaW5kZXguZm9ybWF0RGlzdGFuY2UsXG4gIGZvcm1hdExvbmc6IF9pbmRleDIuZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IF9pbmRleDMuZm9ybWF0UmVsYXRpdmUsXG4gIGxvY2FsaXplOiBfaW5kZXg0LmxvY2FsaXplLFxuICBtYXRjaDogX2luZGV4NS5tYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMCAvKiBTdW5kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxLFxuICB9LFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZm9ybWF0RGlzdGFuY2UgPSB2b2lkIDA7XG5cbmNvbnN0IGZvcm1hdERpc3RhbmNlTG9jYWxlID0ge1xuICBsZXNzVGhhblhTZWNvbmRzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIHNlY29uZFwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIHhTZWNvbmRzOiB7XG4gICAgb25lOiBcIjEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IHNlY29uZHNcIixcbiAgfSxcblxuICBoYWxmQU1pbnV0ZTogXCJoYWxmIGEgbWludXRlXCIsXG5cbiAgbGVzc1RoYW5YTWludXRlczoge1xuICAgIG9uZTogXCJsZXNzIHRoYW4gYSBtaW51dGVcIixcbiAgICBvdGhlcjogXCJsZXNzIHRoYW4ge3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICB4TWludXRlczoge1xuICAgIG9uZTogXCIxIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBtaW51dGVzXCIsXG4gIH0sXG5cbiAgYWJvdXRYSG91cnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBob3VyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeEhvdXJzOiB7XG4gICAgb25lOiBcIjEgaG91clwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBob3Vyc1wiLFxuICB9LFxuXG4gIHhEYXlzOiB7XG4gICAgb25lOiBcIjEgZGF5XCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGRheXNcIixcbiAgfSxcblxuICBhYm91dFhXZWVrczoge1xuICAgIG9uZTogXCJhYm91dCAxIHdlZWtcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICB4V2Vla3M6IHtcbiAgICBvbmU6IFwiMSB3ZWVrXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IHdlZWtzXCIsXG4gIH0sXG5cbiAgYWJvdXRYTW9udGhzOiB7XG4gICAgb25lOiBcImFib3V0IDEgbW9udGhcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgeE1vbnRoczoge1xuICAgIG9uZTogXCIxIG1vbnRoXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1vbnRoc1wiLFxuICB9LFxuXG4gIGFib3V0WFllYXJzOiB7XG4gICAgb25lOiBcImFib3V0IDEgeWVhclwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIHhZZWFyczoge1xuICAgIG9uZTogXCIxIHllYXJcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcblxuICBvdmVyWFllYXJzOiB7XG4gICAgb25lOiBcIm92ZXIgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwib3ZlciB7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcblxuICBhbG1vc3RYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWxtb3N0IDEgeWVhclwiLFxuICAgIG90aGVyOiBcImFsbW9zdCB7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcbn07XG5cbmNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgY291bnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gXCJpbiBcIiArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIFwiIGFnb1wiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0cy5mb3JtYXREaXN0YW5jZSA9IGZvcm1hdERpc3RhbmNlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmZvcm1hdExvbmcgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uL19saWIvYnVpbGRGb3JtYXRMb25nRm4uanNcIik7XG5cbmNvbnN0IGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiBcIkVFRUUsIE1NTU0gZG8sIHlcIixcbiAgbG9uZzogXCJNTU1NIGRvLCB5XCIsXG4gIG1lZGl1bTogXCJNTU0gZCwgeVwiLFxuICBzaG9ydDogXCJNTS9kZC95eXl5XCIsXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJoOm1tOnNzIGEgenp6elwiLFxuICBsb25nOiBcImg6bW06c3MgYSB6XCIsXG4gIG1lZGl1bTogXCJoOm1tOnNzIGFcIixcbiAgc2hvcnQ6IFwiaDptbSBhXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbWVkaXVtOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICBzaG9ydDogXCJ7e2RhdGV9fSwge3t0aW1lfX1cIixcbn07XG5cbmNvbnN0IGZvcm1hdExvbmcgPSAoZXhwb3J0cy5mb3JtYXRMb25nID0ge1xuICBkYXRlOiAoMCwgX2luZGV4LmJ1aWxkRm9ybWF0TG9uZ0ZuKSh7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgdGltZTogKDAsIF9pbmRleC5idWlsZEZvcm1hdExvbmdGbikoe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIGRhdGVUaW1lOiAoMCwgX2luZGV4LmJ1aWxkRm9ybWF0TG9uZ0ZuKSh7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZm9ybWF0UmVsYXRpdmUgPSB2b2lkIDA7XG5cbmNvbnN0IGZvcm1hdFJlbGF0aXZlTG9jYWxlID0ge1xuICBsYXN0V2VlazogXCInbGFzdCcgZWVlZSAnYXQnIHBcIixcbiAgeWVzdGVyZGF5OiBcIid5ZXN0ZXJkYXkgYXQnIHBcIixcbiAgdG9kYXk6IFwiJ3RvZGF5IGF0JyBwXCIsXG4gIHRvbW9ycm93OiBcIid0b21vcnJvdyBhdCcgcFwiLFxuICBuZXh0V2VlazogXCJlZWVlICdhdCcgcFwiLFxuICBvdGhlcjogXCJQXCIsXG59O1xuXG5jb25zdCBmb3JtYXRSZWxhdGl2ZSA9ICh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpID0+XG4gIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbmV4cG9ydHMuZm9ybWF0UmVsYXRpdmUgPSBmb3JtYXRSZWxhdGl2ZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5sb2NhbGl6ZSA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vX2xpYi9idWlsZExvY2FsaXplRm4uanNcIik7XG5cbmNvbnN0IGVyYVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJCXCIsIFwiQVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIkJDXCIsIFwiQURcIl0sXG4gIHdpZGU6IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXSxcbn07XG5cbmNvbnN0IHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuICB3aWRlOiBbXCIxc3QgcXVhcnRlclwiLCBcIjJuZCBxdWFydGVyXCIsIFwiM3JkIHF1YXJ0ZXJcIiwgXCI0dGggcXVhcnRlclwiXSxcbn07XG5cbi8vIE5vdGU6IGluIEVuZ2xpc2gsIHRoZSBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBtb250aHMgYXJlIGNhcGl0YWxpemVkLlxuLy8gSWYgeW91IGFyZSBtYWtpbmcgYSBuZXcgbG9jYWxlIGJhc2VkIG9uIHRoaXMgb25lLCBjaGVjayBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbGFuZ3VhZ2UgeW91J3JlIHdvcmtpbmcgb24uXG4vLyBHZW5lcmFsbHksIGZvcm1hdHRlZCBkYXRlcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzZW50ZW5jZSxcbi8vIGUuZy4gaW4gU3BhbmlzaCBsYW5ndWFnZSB0aGUgd2Vla2RheXMgYW5kIG1vbnRocyBzaG91bGQgYmUgaW4gdGhlIGxvd2VyY2FzZS5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcbiAgICBcIkphblwiLFxuICAgIFwiRmViXCIsXG4gICAgXCJNYXJcIixcbiAgICBcIkFwclwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5cIixcbiAgICBcIkp1bFwiLFxuICAgIFwiQXVnXCIsXG4gICAgXCJTZXBcIixcbiAgICBcIk9jdFwiLFxuICAgIFwiTm92XCIsXG4gICAgXCJEZWNcIixcbiAgXSxcblxuICB3aWRlOiBbXG4gICAgXCJKYW51YXJ5XCIsXG4gICAgXCJGZWJydWFyeVwiLFxuICAgIFwiTWFyY2hcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1bmVcIixcbiAgICBcIkp1bHlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPY3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGVjZW1iZXJcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJTXCIsIFwiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCJdLFxuICBzaG9ydDogW1wiU3VcIiwgXCJNb1wiLCBcIlR1XCIsIFwiV2VcIiwgXCJUaFwiLCBcIkZyXCIsIFwiU2FcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIl0sXG4gIHdpZGU6IFtcbiAgICBcIlN1bmRheVwiLFxuICAgIFwiTW9uZGF5XCIsXG4gICAgXCJUdWVzZGF5XCIsXG4gICAgXCJXZWRuZXNkYXlcIixcbiAgICBcIlRodXJzZGF5XCIsXG4gICAgXCJGcmlkYXlcIixcbiAgICBcIlNhdHVyZGF5XCIsXG4gIF0sXG59O1xuXG5jb25zdCBkYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOdW1iZXIgPSAoZGlydHlOdW1iZXIsIF9vcHRpb25zKSA9PiB7XG4gIGNvbnN0IG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgLy8gSWYgb3JkaW5hbCBudW1iZXJzIGRlcGVuZCBvbiBjb250ZXh0LCBmb3IgZXhhbXBsZSxcbiAgLy8gaWYgdGhleSBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZ3JhbW1hdGljYWwgZ2VuZGVycyxcbiAgLy8gdXNlIGBvcHRpb25zLnVuaXRgLlxuICAvL1xuICAvLyBgdW5pdGAgY2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXRlJywgJ2RheU9mWWVhcicsXG4gIC8vICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJy5cblxuICBjb25zdCByZW0xMDAgPSBudW1iZXIgJSAxMDA7XG4gIGlmIChyZW0xMDAgPiAyMCB8fCByZW0xMDAgPCAxMCkge1xuICAgIHN3aXRjaCAocmVtMTAwICUgMTApIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwic3RcIjtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwibmRcIjtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwicmRcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bWJlciArIFwidGhcIjtcbn07XG5cbmNvbnN0IGxvY2FsaXplID0gKGV4cG9ydHMubG9jYWxpemUgPSB7XG4gIG9yZGluYWxOdW1iZXIsXG5cbiAgZXJhOiAoMCwgX2luZGV4LmJ1aWxkTG9jYWxpemVGbikoe1xuICAgIHZhbHVlczogZXJhVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6ICgwLCBfaW5kZXguYnVpbGRMb2NhbGl6ZUZuKSh7XG4gICAgdmFsdWVzOiBxdWFydGVyVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gICAgYXJndW1lbnRDYWxsYmFjazogKHF1YXJ0ZXIpID0+IHF1YXJ0ZXIgLSAxLFxuICB9KSxcblxuICBtb250aDogKDAsIF9pbmRleC5idWlsZExvY2FsaXplRm4pKHtcbiAgICB2YWx1ZXM6IG1vbnRoVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheTogKDAsIF9pbmRleC5idWlsZExvY2FsaXplRm4pKHtcbiAgICB2YWx1ZXM6IGRheVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6ICgwLCBfaW5kZXguYnVpbGRMb2NhbGl6ZUZuKSh7XG4gICAgdmFsdWVzOiBkYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRGb3JtYXR0aW5nV2lkdGg6IFwid2lkZVwiLFxuICB9KSxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLm1hdGNoID0gdm9pZCAwO1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uL19saWIvYnVpbGRNYXRjaEZuLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzXCIpO1xuXG5jb25zdCBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXFxkKykodGh8c3R8bmR8cmQpPy9pO1xuY29uc3QgcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9cXGQrL2k7XG5cbmNvbnN0IG1hdGNoRXJhUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYnxhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oYlxcLj9cXHM/Y1xcLj98YlxcLj9cXHM/Y1xcLj9cXHM/ZVxcLj98YVxcLj9cXHM/ZFxcLj98Y1xcLj9cXHM/ZVxcLj8pL2ksXG4gIHdpZGU6IC9eKGJlZm9yZSBjaHJpc3R8YmVmb3JlIGNvbW1vbiBlcmF8YW5ubyBkb21pbml8Y29tbW9uIGVyYSkvaSxcbn07XG5jb25zdCBwYXJzZUVyYVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXmIvaSwgL14oYXxjKS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoUXVhcnRlclBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eWzEyMzRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXnFbMTIzNF0vaSxcbiAgd2lkZTogL15bMTIzNF0odGh8c3R8bmR8cmQpPyBxdWFydGVyL2ksXG59O1xuY29uc3QgcGFyc2VRdWFydGVyUGF0dGVybnMgPSB7XG4gIGFueTogWy8xL2ksIC8yL2ksIC8zL2ksIC80L2ldLFxufTtcblxuY29uc3QgbWF0Y2hNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eW2pmbWFzb25kXS9pLFxuICBhYmJyZXZpYXRlZDogL14oamFufGZlYnxtYXJ8YXByfG1heXxqdW58anVsfGF1Z3xzZXB8b2N0fG5vdnxkZWMpL2ksXG4gIHdpZGU6IC9eKGphbnVhcnl8ZmVicnVhcnl8bWFyY2h8YXByaWx8bWF5fGp1bmV8anVseXxhdWd1c3R8c2VwdGVtYmVyfG9jdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2ksXG59O1xuY29uc3QgcGFyc2VNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFtcbiAgICAvXmovaSxcbiAgICAvXmYvaSxcbiAgICAvXm0vaSxcbiAgICAvXmEvaSxcbiAgICAvXm0vaSxcbiAgICAvXmovaSxcbiAgICAvXmovaSxcbiAgICAvXmEvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcblxuICBhbnk6IFtcbiAgICAvXmphL2ksXG4gICAgL15mL2ksXG4gICAgL15tYXIvaSxcbiAgICAvXmFwL2ksXG4gICAgL15tYXkvaSxcbiAgICAvXmp1bi9pLFxuICAgIC9eanVsL2ksXG4gICAgL15hdS9pLFxuICAgIC9ecy9pLFxuICAgIC9eby9pLFxuICAgIC9ebi9pLFxuICAgIC9eZC9pLFxuICBdLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltzbXR3Zl0vaSxcbiAgc2hvcnQ6IC9eKHN1fG1vfHR1fHdlfHRofGZyfHNhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oc3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLFxuICB3aWRlOiAvXihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSkvaSxcbn07XG5jb25zdCBwYXJzZURheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFsvXnMvaSwgL15tL2ksIC9edC9pLCAvXncvaSwgL150L2ksIC9eZi9pLCAvXnMvaV0sXG4gIGFueTogWy9ec3UvaSwgL15tL2ksIC9edHUvaSwgL153L2ksIC9edGgvaSwgL15mL2ksIC9ec2EvaV0sXG59O1xuXG5jb25zdCBtYXRjaERheVBlcmlvZFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGF8cHxtaXxufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSxcbiAgYW55OiAvXihbYXBdXFwuP1xccz9tXFwuP3xtaWRuaWdodHxub29ufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSxcbn07XG5jb25zdCBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0ge1xuICBhbnk6IHtcbiAgICBhbTogL15hL2ksXG4gICAgcG06IC9ecC9pLFxuICAgIG1pZG5pZ2h0OiAvXm1pL2ksXG4gICAgbm9vbjogL15uby9pLFxuICAgIG1vcm5pbmc6IC9tb3JuaW5nL2ksXG4gICAgYWZ0ZXJub29uOiAvYWZ0ZXJub29uL2ksXG4gICAgZXZlbmluZzogL2V2ZW5pbmcvaSxcbiAgICBuaWdodDogL25pZ2h0L2ksXG4gIH0sXG59O1xuXG5jb25zdCBtYXRjaCA9IChleHBvcnRzLm1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiAoMCwgX2luZGV4Mi5idWlsZE1hdGNoUGF0dGVybkZuKSh7XG4gICAgbWF0Y2hQYXR0ZXJuOiBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHBhcnNlUGF0dGVybjogcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICB2YWx1ZUNhbGxiYWNrOiAodmFsdWUpID0+IHBhcnNlSW50KHZhbHVlLCAxMCksXG4gIH0pLFxuXG4gIGVyYTogKDAsIF9pbmRleC5idWlsZE1hdGNoRm4pKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaEVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZUVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBxdWFydGVyOiAoMCwgX2luZGV4LmJ1aWxkTWF0Y2hGbikoe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgICB2YWx1ZUNhbGxiYWNrOiAoaW5kZXgpID0+IGluZGV4ICsgMSxcbiAgfSksXG5cbiAgbW9udGg6ICgwLCBfaW5kZXguYnVpbGRNYXRjaEZuKSh7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZU1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheTogKDAsIF9pbmRleC5idWlsZE1hdGNoRm4pKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6ICgwLCBfaW5kZXguYnVpbGRNYXRjaEZuKSh7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJhbnlcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLm1heCA9IG1heDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgbWF4XG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgbGF0ZXN0IG9mIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgbGF0ZXN0IG9mIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZXMgLSBUaGUgZGF0ZXMgdG8gY29tcGFyZVxuICpcbiAqIEByZXR1cm5zIFRoZSBsYXRlc3Qgb2YgdGhlIGRhdGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIG9mIHRoZXNlIGRhdGVzIGlzIHRoZSBsYXRlc3Q/XG4gKiBjb25zdCByZXN1bHQgPSBtYXgoW1xuICogICBuZXcgRGF0ZSgxOTg5LCA2LCAxMCksXG4gKiAgIG5ldyBEYXRlKDE5ODcsIDEsIDExKSxcbiAqICAgbmV3IERhdGUoMTk5NSwgNiwgMiksXG4gKiAgIG5ldyBEYXRlKDE5OTAsIDAsIDEpXG4gKiBdKVxuICogLy89PiBTdW4gSnVsIDAyIDE5OTUgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gbWF4KGRhdGVzKSB7XG4gIGxldCByZXN1bHQ7XG4gIGRhdGVzLmZvckVhY2goZnVuY3Rpb24gKGRpcnR5RGF0ZSkge1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRpcnR5RGF0ZSk7XG5cbiAgICBpZiAoXG4gICAgICByZXN1bHQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgcmVzdWx0IDwgY3VycmVudERhdGUgfHxcbiAgICAgIGlzTmFOKE51bWJlcihjdXJyZW50RGF0ZSkpXG4gICAgKSB7XG4gICAgICByZXN1bHQgPSBjdXJyZW50RGF0ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQgfHwgbmV3IERhdGUoTmFOKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5taW4gPSBtaW47XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIG1pblxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBlYXJsaWVzdCBvZiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIHRoZSBlYXJsaWVzdCBvZiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVzIC0gVGhlIGRhdGVzIHRvIGNvbXBhcmVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZWFybGllc3Qgb2YgdGhlIGRhdGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIG9mIHRoZXNlIGRhdGVzIGlzIHRoZSBlYXJsaWVzdD9cbiAqIGNvbnN0IHJlc3VsdCA9IG1pbihbXG4gKiAgIG5ldyBEYXRlKDE5ODksIDYsIDEwKSxcbiAqICAgbmV3IERhdGUoMTk4NywgMSwgMTEpLFxuICogICBuZXcgRGF0ZSgxOTk1LCA2LCAyKSxcbiAqICAgbmV3IERhdGUoMTk5MCwgMCwgMSlcbiAqIF0pXG4gKiAvLz0+IFdlZCBGZWIgMTEgMTk4NyAwMDowMDowMFxuICovXG5mdW5jdGlvbiBtaW4oZGF0ZXMpIHtcbiAgbGV0IHJlc3VsdDtcblxuICBkYXRlcy5mb3JFYWNoKChkaXJ0eURhdGUpID0+IHtcbiAgICBjb25zdCBkYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRpcnR5RGF0ZSk7XG4gICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0ID4gZGF0ZSB8fCBpc05hTigrZGF0ZSkpIHtcbiAgICAgIHJlc3VsdCA9IGRhdGU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0IHx8IG5ldyBEYXRlKE5hTik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxvbmdGb3JtYXR0ZXJzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9pbmRleDUubG9uZ0Zvcm1hdHRlcnM7XG4gIH0sXG59KTtcbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInBhcnNlcnNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2luZGV4Ny5wYXJzZXJzO1xuICB9LFxufSk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vZ2V0RGVmYXVsdE9wdGlvbnMuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG52YXIgX2luZGV4NSA9IHJlcXVpcmUoXCIuL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzXCIpO1xudmFyIF9pbmRleDYgPSByZXF1aXJlKFwiLi9fbGliL3Byb3RlY3RlZFRva2Vucy5qc1wiKTtcblxudmFyIF9pbmRleDcgPSByZXF1aXJlKFwiLi9wYXJzZS9fbGliL3BhcnNlcnMuanNcIik7XG5cbnZhciBfU2V0dGVyID0gcmVxdWlyZShcIi4vcGFyc2UvX2xpYi9TZXR0ZXIuanNcIik7XG5cbi8vIFJleHBvcnRzIG9mIGludGVybmFsIGZvciBsaWJyYXJpZXMgdG8gdXNlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM2MzgjaXNzdWVjb21tZW50LTE4NzcwODI4NzRcblxuLyoqXG4gKiBUaGUge0BsaW5rIHBhcnNlfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8vIFRoaXMgUmVnRXhwIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzIHNlcGFyYXRlZCBieSBgfGA6XG4vLyAtIFt5WVFxTUx3SWREZWNpaEhLa21zXW8gbWF0Y2hlcyBhbnkgYXZhaWxhYmxlIG9yZGluYWwgbnVtYmVyIHRva2VuXG4vLyAgIChvbmUgb2YgdGhlIGNlcnRhaW4gbGV0dGVycyBmb2xsb3dlZCBieSBgb2ApXG4vLyAtIChcXHcpXFwxKiBtYXRjaGVzIGFueSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgbGV0dGVyXG4vLyAtICcnIG1hdGNoZXMgdHdvIHF1b3RlIGNoYXJhY3RlcnMgaW4gYSByb3dcbi8vIC0gJygnJ3xbXiddKSsoJ3wkKSBtYXRjaGVzIGFueXRoaW5nIHN1cnJvdW5kZWQgYnkgdHdvIHF1b3RlIGNoYXJhY3RlcnMgKCcpLFxuLy8gICBleGNlcHQgYSBzaW5nbGUgcXVvdGUgc3ltYm9sLCB3aGljaCBlbmRzIHRoZSBzZXF1ZW5jZS5cbi8vICAgVHdvIHF1b3RlIGNoYXJhY3RlcnMgZG8gbm90IGVuZCB0aGUgc2VxdWVuY2UuXG4vLyAgIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHNpbmdsZSBxdW90ZVxuLy8gICB0aGVuIHRoZSBzZXF1ZW5jZSB3aWxsIGNvbnRpbnVlIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0cmluZy5cbi8vIC0gLiBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIHVubWF0Y2hlZCBieSBwcmV2aW91cyBwYXJ0cyBvZiB0aGUgUmVnRXhwc1xuY29uc3QgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9XG4gIC9beVlRcU1Md0lkRGVjaWhIS2ttc11vfChcXHcpXFwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuLy8gVGhpcyBSZWdFeHAgY2F0Y2hlcyBzeW1ib2xzIGVzY2FwZWQgYnkgcXVvdGVzLCBhbmQgYWxzb1xuLy8gc2VxdWVuY2VzIG9mIHN5bWJvbHMgUCwgcCwgYW5kIHRoZSBjb21iaW5hdGlvbnMgbGlrZSBgUFBQUFBQUHBwcHBwYFxuY29uc3QgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPSAvUCtwK3xQK3xwK3wnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuY29uc3QgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvO1xuY29uc3QgZG91YmxlUXVvdGVSZWdFeHAgPSAvJycvZztcblxuY29uc3Qgbm90V2hpdGVzcGFjZVJlZ0V4cCA9IC9cXFMvO1xuY29uc3QgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAgPSAvW2EtekEtWl0vO1xuXG4vKipcbiAqIEBuYW1lIHBhcnNlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFBhcnNlIHRoZSBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBkYXRlIHBhcnNlZCBmcm9tIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZm9ybWF0IHN0cmluZy5cbiAqXG4gKiA+IOKaoO+4jyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZm9ybWF0YCB0b2tlbnMgZGlmZmVyIGZyb20gTW9tZW50LmpzIGFuZCBvdGhlciBsaWJyYXJpZXMuXG4gKiA+IFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIFRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtYXQgc3RyaW5nIHdyYXBwZWQgYmV0d2VlbiB0d28gc2luZ2xlIHF1b3RlcyBjaGFyYWN0ZXJzICgnKSBhcmUgZXNjYXBlZC5cbiAqIFR3byBzaW5nbGUgcXVvdGVzIGluIGEgcm93LCB3aGV0aGVyIGluc2lkZSBvciBvdXRzaWRlIGEgcXVvdGVkIHNlcXVlbmNlLCByZXByZXNlbnQgYSAncmVhbCcgc2luZ2xlIHF1b3RlLlxuICpcbiAqIEZvcm1hdCBvZiB0aGUgZm9ybWF0IHN0cmluZyBpcyBiYXNlZCBvbiBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiBodHRwczovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlXG4gKiB3aXRoIGEgZmV3IGFkZGl0aW9ucyAoc2VlIG5vdGUgNSBiZWxvdyB0aGUgdGFibGUpLlxuICpcbiAqIE5vdCBhbGwgdG9rZW5zIGFyZSBjb21wYXRpYmxlLiBDb21iaW5hdGlvbnMgdGhhdCBkb24ndCBtYWtlIHNlbnNlIG9yIGNvdWxkIGxlYWQgdG8gYnVncyBhcmUgcHJvaGliaXRlZFxuICogYW5kIHdpbGwgdGhyb3cgYFJhbmdlRXJyb3JgLiBGb3IgZXhhbXBsZSB1c2FnZSBvZiAyNC1ob3VyIGZvcm1hdCB0b2tlbiB3aXRoIEFNL1BNIHRva2VuIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHBhcnNlKCcyMyBBTScsICdISCBhJywgbmV3IERhdGUoKSlcbiAqIC8vPT4gUmFuZ2VFcnJvcjogVGhlIGZvcm1hdCBzdHJpbmcgbXVzdG4ndCBjb250YWluIGBISGAgYW5kIGBhYCBhdCB0aGUgc2FtZSB0aW1lXG4gKiBgYGBcbiAqXG4gKiBTZWUgdGhlIGNvbXBhdGliaWxpdHkgdGFibGU6IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZRT1BVM3hVaHBsbGw2ZHlvTW1WVVhIS2xfOENSRHM2X3VlTG1leDNTb3F3aHVvbGt1TjNPMDVsNHJxeDVoMWRLWDhlYjQ2VWwtQ0NTcnEvcHViaHRtbD9naWQ9MCZzaW5nbGU9dHJ1ZVxuICpcbiAqIEFjY2VwdGVkIGZvcm1hdCBzdHJpbmcgcGF0dGVybnM6XG4gKiB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFByaW9yfCBQYXR0ZXJuIHwgUmVzdWx0IGV4YW1wbGVzICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLXxcbiAqIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE0MCB8IEcuLkdHRyAgfCBBRCwgQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBHR0dHICAgIHwgQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3QgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgR0dHR0cgICB8IEEsIEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQ2FsZW5kYXIgeWVhciAgICAgICAgICAgICAgICAgICB8IDEzMCB8IHkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNywgOTk5OSAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB5byAgICAgIHwgNDR0aCwgMXN0LCAxOTAwdGgsIDk5OTk5OTl0aCAgICAgIHwgNCw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeXkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHl5eSAgICAgfCAwNDQsIDAwMSwgMTIzLCA5OTkgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB5eXl5ICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeXl5eXkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIsNCAgIHxcbiAqIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICB8IDEzMCB8IFkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNywgOTAwMCAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBZbyAgICAgIHwgNDR0aCwgMXN0LCAxOTAwdGgsIDk5OTk5OTl0aCAgICAgIHwgNCw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWVkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDQsNiAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFlZWSAgICAgfCAwNDQsIDAwMSwgMTIzLCA5OTkgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBZWVlZICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNCw2ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWVlZWVkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIsNCAgIHxcbiAqIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgICB8IDEzMCB8IFIgICAgICAgfCAtNDMsIDEsIDE5MDAsIDIwMTcsIDk5OTksIC05OTk5ICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBSUiAgICAgIHwgLTQzLCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgIHwgNCw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUlJSICAgICB8IC0wNDMsIDAwMSwgMTIzLCA5OTksIC05OTkgICAgICAgICB8IDQsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFJSUlIgICAgfCAtMDA0MywgMDAwMSwgMjAxNywgOTk5OSwgLTk5OTkgICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBSUlJSUiAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiw0LDUgfFxuICogfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgIHwgMTMwIHwgdSAgICAgICB8IC00MywgMSwgMTkwMCwgMjAxNywgOTk5OSwgLTk5OSAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHV1ICAgICAgfCAtNDMsIDAxLCA5OSwgLTk5ICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB1dXUgICAgIHwgLTA0MywgMDAxLCAxMjMsIDk5OSwgLTk5OSAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgdXV1dSAgICB8IC0wMDQzLCAwMDAxLCAyMDE3LCA5OTk5LCAtOTk5OSAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHV1dXV1ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyLDQgICB8XG4gKiB8IFF1YXJ0ZXIgKGZvcm1hdHRpbmcpICAgICAgICAgICAgfCAxMjAgfCBRICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFFRICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBRUVEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUVFRUSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFFRUVFRICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8IFF1YXJ0ZXIgKHN0YW5kLWFsb25lKSAgICAgICAgICAgfCAxMjAgfCBxICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHFxICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBxcXEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcXFxcSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHFxcXFxICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAzICAgICB8XG4gKiB8IE1vbnRoIChmb3JtYXR0aW5nKSAgICAgICAgICAgICAgfCAxMTAgfCBNICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IE1NICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBNTU0gICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTU1NTSAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IE1NTU1NICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1vbnRoIChzdGFuZC1hbG9uZSkgICAgICAgICAgICAgfCAxMTAgfCBMICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IExMICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBMTEwgICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTExMTCAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IExMTExMICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgfCAxMDAgfCB3ICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgd28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHd3ICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICAgfCAxMDAgfCBJICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgSW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IElJICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICAgfCAgOTAgfCBkICAgICAgIHwgMSwgMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDMxc3QgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGRkICAgICAgfCAwMSwgMDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICAgfCAgOTAgfCBEICAgICAgIHwgMSwgMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgRG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDM2NXRoLCAzNjZ0aCAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEREICAgICAgfCAwMSwgMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBEREQgICAgIHwgMDAxLCAwMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgRERERCAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgRGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgICAgICB8ICA5MCB8IEUuLkVFRSAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBFRUVFICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgRUVFRUUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEVFRUVFRSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgfCAgOTAgfCBpICAgICAgIHwgMSwgMiwgMywgLi4uLCA3ICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDd0aCAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGlpICAgICAgfCAwMSwgMDIsIC4uLiwgMDcgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBpaWkgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaWlpaSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGlpaWlpICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBpaWlpaWkgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgNSAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgIHwgIDkwIHwgZSAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGVvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlZSAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZWVlICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGVlZWUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlZWVlZSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZWVlZWVlICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKHN0YW5kLWFsb25lKSB8ICA5MCB8IGMgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBjbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgY2MgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGNjYyAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBjY2NjICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgY2NjY2MgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGNjY2NjYyAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODAgfCBhLi5hYWEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCAgODAgfCBiLi5iYmIgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgYmJiYiAgICB8IGEubS4sIHAubS4sIG5vb24sIG1pZG5pZ2h0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGJiYmJiICAgfCBhLCBwLCBuLCBtaSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICAgfCAgODAgfCBCLi5CQkIgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgQkJCQiAgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEJCQkJCICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICAgfCAgNzAgfCBoICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDEydGggICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGhoICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICAgfCAgNzAgfCBIICAgICAgIHwgMCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgSG8gICAgICB8IDB0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEhIICAgICAgfCAwMCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICAgfCAgNzAgfCBLICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMCAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgS28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDB0aCAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEtLICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICAgfCAgNzAgfCBrICAgICAgIHwgMjQsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwga28gICAgICB8IDI0dGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGtrICAgICAgfCAyNCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjAgfCBtICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgbW8gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IG1tICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTAgfCBzICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgc28gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHNzICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICAgfCAgNDAgfCB0ICAgICAgIHwgNTEyOTY5NTIwICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgdHQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgICB8ICAzMCB8IFMgICAgICAgfCAwLCAxLCAuLi4sIDkgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBTUyAgICAgIHwgMDAsIDAxLCAuLi4sIDk5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgU1NTICAgICB8IDAwMCwgMDAxLCAuLi4sIDk5OSAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFNTU1MgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCAgMjAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8ICAxMCB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgIDEwIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICAgfCAgTkEgfCBQICAgICAgIHwgMDUvMjkvMTQ1MyAgICAgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUFAgICAgICB8IE1heSAyOSwgMTQ1MyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFBQUCAgICAgfCBNYXkgMjl0aCwgMTQ1MyAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBQUFBQICAgIHwgU3VuZGF5LCBNYXkgMjl0aCwgMTQ1MyAgICAgICAgICAgIHwgMiw1LDggfFxuICogfCBMb25nIGxvY2FsaXplZCB0aW1lICAgICAgICAgICAgIHwgIE5BIHwgcCAgICAgICB8IDEyOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHBwICAgICAgfCAxMjowMDowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IENvbWJpbmF0aW9uIG9mIGRhdGUgYW5kIHRpbWUgICAgfCAgTkEgfCBQcCAgICAgIHwgMDUvMjkvMTQ1MywgMTI6MDAgQU0gICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUFBwcCAgICB8IE1heSAyOSwgMTQ1MywgMTI6MDA6MDAgQU0gICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFBQUHBwICAgfCBNYXkgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBQUFBQcHAgIHwgU3VuZGF5LCBNYXkgMjl0aCwgMTQ1MyBhdCAuLi4gICAgIHwgMiw1LDggfFxuICogTm90ZXM6XG4gKiAxLiBcIkZvcm1hdHRpbmdcIiB1bml0cyAoZS5nLiBmb3JtYXR0aW5nIHF1YXJ0ZXIpIGluIHRoZSBkZWZhdWx0IGVuLVVTIGxvY2FsZVxuICogICAgYXJlIHRoZSBzYW1lIGFzIFwic3RhbmQtYWxvbmVcIiB1bml0cywgYnV0IGFyZSBkaWZmZXJlbnQgaW4gc29tZSBsYW5ndWFnZXMuXG4gKiAgICBcIkZvcm1hdHRpbmdcIiB1bml0cyBhcmUgZGVjbGluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgbGFuZ3VhZ2VcbiAqICAgIGluIHRoZSBjb250ZXh0IG9mIGEgZGF0ZS4gXCJTdGFuZC1hbG9uZVwiIHVuaXRzIGFyZSBhbHdheXMgbm9taW5hdGl2ZSBzaW5ndWxhci5cbiAqICAgIEluIGBmb3JtYXRgIGZ1bmN0aW9uLCB0aGV5IHdpbGwgcHJvZHVjZSBkaWZmZXJlbnQgcmVzdWx0OlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTExMTCcsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWQnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTU1NTScsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWR1J2BcbiAqXG4gKiAgICBgcGFyc2VgIHdpbGwgdHJ5IHRvIG1hdGNoIGJvdGggZm9ybWF0dGluZyBhbmQgc3RhbmQtYWxvbmUgdW5pdHMgaW50ZXJjaGFuZ2FibHkuXG4gKlxuICogMi4gQW55IHNlcXVlbmNlIG9mIHRoZSBpZGVudGljYWwgbGV0dGVycyBpcyBhIHBhdHRlcm4sIHVubGVzcyBpdCBpcyBlc2NhcGVkIGJ5XG4gKiAgICB0aGUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgKHNlZSBiZWxvdykuXG4gKiAgICBJZiB0aGUgc2VxdWVuY2UgaXMgbG9uZ2VyIHRoYW4gbGlzdGVkIGluIHRhYmxlOlxuICogICAgLSBmb3IgbnVtZXJpY2FsIHVuaXRzIChgeXl5eXl5eXlgKSBgcGFyc2VgIHdpbGwgdHJ5IHRvIG1hdGNoIGEgbnVtYmVyXG4gKiAgICAgIGFzIHdpZGUgYXMgdGhlIHNlcXVlbmNlXG4gKiAgICAtIGZvciB0ZXh0IHVuaXRzIChgTU1NTU1NTU1gKSBgcGFyc2VgIHdpbGwgdHJ5IHRvIG1hdGNoIHRoZSB3aWRlc3QgdmFyaWF0aW9uIG9mIHRoZSB1bml0LlxuICogICAgICBUaGVzZSB2YXJpYXRpb25zIGFyZSBtYXJrZWQgd2l0aCBcIjJcIiBpbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIHRhYmxlLlxuICpcbiAqIDMuIGBRUVFRUWAgYW5kIGBxcXFxcWAgY291bGQgYmUgbm90IHN0cmljdGx5IG51bWVyaWNhbCBpbiBzb21lIGxvY2FsZXMuXG4gKiAgICBUaGVzZSB0b2tlbnMgcmVwcmVzZW50IHRoZSBzaG9ydGVzdCBmb3JtIG9mIHRoZSBxdWFydGVyLlxuICpcbiAqIDQuIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBwYXR0ZXJucyBhcmUgQi5DLiB5ZWFyczpcbiAqXG4gKiAgICB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICogICAgfC0tLS0tLXwtLS0tLXwtLS0tLXxcbiAqICAgIHwgQUMgMSB8ICAgMSB8ICAgMSB8XG4gKiAgICB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICogICAgfCBCQyAyIHwgICAyIHwgIC0xIHxcbiAqXG4gKiAgICBBbHNvIGB5eWAgd2lsbCB0cnkgdG8gZ3Vlc3MgdGhlIGNlbnR1cnkgb2YgdHdvIGRpZ2l0IHllYXIgYnkgcHJveGltaXR5IHdpdGggYHJlZmVyZW5jZURhdGVgOlxuICpcbiAqICAgIGBwYXJzZSgnNTAnLCAneXknLCBuZXcgRGF0ZSgyMDE4LCAwLCAxKSkgLy89PiBTYXQgSmFuIDAxIDIwNTAgMDA6MDA6MDBgXG4gKlxuICogICAgYHBhcnNlKCc3NScsICd5eScsIG5ldyBEYXRlKDIwMTgsIDAsIDEpKSAvLz0+IFdlZCBKYW4gMDEgMTk3NSAwMDowMDowMGBcbiAqXG4gKiAgICB3aGlsZSBgdXVgIHdpbGwganVzdCBhc3NpZ24gdGhlIHllYXIgYXMgaXM6XG4gKlxuICogICAgYHBhcnNlKCc1MCcsICd1dScsIG5ldyBEYXRlKDIwMTgsIDAsIDEpKSAvLz0+IFNhdCBKYW4gMDEgMDA1MCAwMDowMDowMGBcbiAqXG4gKiAgICBgcGFyc2UoJzc1JywgJ3V1JywgbmV3IERhdGUoMjAxOCwgMCwgMSkpIC8vPT4gVHVlIEphbiAwMSAwMDc1IDAwOjAwOjAwYFxuICpcbiAqICAgIFRoZSBzYW1lIGRpZmZlcmVuY2UgaXMgdHJ1ZSBmb3IgbG9jYWwgYW5kIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFycyAoYFlgIGFuZCBgUmApLFxuICogICAgZXhjZXB0IGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJzIGFyZSBkZXBlbmRlbnQgb24gYG9wdGlvbnMud2Vla1N0YXJ0c09uYFxuICogICAgYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKGNvbXBhcmUgW3NldElTT1dlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL3NldElTT1dlZWtZZWFyKVxuICogICAgYW5kIFtzZXRXZWVrWWVhcl0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9zZXRXZWVrWWVhcikpLlxuICpcbiAqIDUuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogNi4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA3LiBgRGAgYW5kIGBERGAgdG9rZW5zIHJlcHJlc2VudCBkYXlzIG9mIHRoZSB5ZWFyIGJ1dCB0aGV5IGFyZSBvZnRoZW4gY29uZnVzZWQgd2l0aCBkYXlzIG9mIHRoZSBtb250aC5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA4LiBgUCtgIHRva2VucyBkbyBub3QgaGF2ZSBhIGRlZmluZWQgcHJpb3JpdHkgc2luY2UgdGhleSBhcmUgbWVyZWx5IGFsaWFzZXMgdG8gb3RoZXIgdG9rZW5zIGJhc2VkXG4gKiAgICBvbiB0aGUgZ2l2ZW4gbG9jYWxlLlxuICpcbiAqICAgIHVzaW5nIGBlbi1VU2AgbG9jYWxlOiBgUGAgPT4gYE1NL2RkL3l5eXlgXG4gKiAgICB1c2luZyBgZW4tVVNgIGxvY2FsZTogYHBgID0+IGBoaDptbSBhYFxuICogICAgdXNpbmcgYHB0LUJSYCBsb2NhbGU6IGBQYCA9PiBgZGQvTU0veXl5eWBcbiAqICAgIHVzaW5nIGBwdC1CUmAgbG9jYWxlOiBgcGAgPT4gYEhIOm1tYFxuICpcbiAqIFZhbHVlcyB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBkYXRlIGluIHRoZSBkZXNjZW5kaW5nIG9yZGVyIG9mIGl0cyB1bml0J3MgcHJpb3JpdHkuXG4gKiBVbml0cyBvZiBhbiBlcXVhbCBwcmlvcml0eSBvdmVyd3JpdGUgZWFjaCBvdGhlciBpbiB0aGUgb3JkZXIgb2YgYXBwZWFyYW5jZS5cbiAqXG4gKiBJZiBubyB2YWx1ZXMgb2YgaGlnaGVyIHByaW9yaXR5IGFyZSBwYXJzZWQgKGUuZy4gd2hlbiBwYXJzaW5nIHN0cmluZyAnSmFudWFyeSAxc3QnIHdpdGhvdXQgYSB5ZWFyKSxcbiAqIHRoZSB2YWx1ZXMgd2lsbCBiZSB0YWtlbiBmcm9tIDNyZCBhcmd1bWVudCBgcmVmZXJlbmNlRGF0ZWAgd2hpY2ggd29ya3MgYXMgYSBjb250ZXh0IG9mIHBhcnNpbmcuXG4gKlxuICogYHJlZmVyZW5jZURhdGVgIG11c3QgYmUgcGFzc2VkIGZvciBjb3JyZWN0IHdvcmsgb2YgdGhlIGZ1bmN0aW9uLlxuICogSWYgeW91J3JlIG5vdCBzdXJlIHdoaWNoIGByZWZlcmVuY2VEYXRlYCB0byBzdXBwbHksIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBEYXRlOlxuICogYHBhcnNlKCcwMi8xMS8yMDE0JywgJ01NL2RkL3l5eXknLCBuZXcgRGF0ZSgpKWBcbiAqIEluIHRoaXMgY2FzZSBwYXJzaW5nIHdpbGwgYmUgZG9uZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBkYXRlLlxuICogSWYgYHJlZmVyZW5jZURhdGVgIGlzIGBJbnZhbGlkIERhdGVgIG9yIGEgdmFsdWUgbm90IGNvbnZlcnRpYmxlIHRvIHZhbGlkIGBEYXRlYCxcbiAqIHRoZW4gYEludmFsaWQgRGF0ZWAgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBUaGUgcmVzdWx0IG1heSB2YXJ5IGJ5IGxvY2FsZS5cbiAqXG4gKiBJZiBgZm9ybWF0U3RyaW5nYCBtYXRjaGVzIHdpdGggYGRhdGVTdHJpbmdgIGJ1dCBkb2VzIG5vdCBwcm92aWRlcyB0b2tlbnMsIGByZWZlcmVuY2VEYXRlYCB3aWxsIGJlIHJldHVybmVkLlxuICpcbiAqIElmIHBhcnNpbmcgZmFpbGVkLCBgSW52YWxpZCBEYXRlYCB3aWxsIGJlIHJldHVybmVkLlxuICogSW52YWxpZCBEYXRlIGlzIGEgRGF0ZSwgd2hvc2UgdGltZSB2YWx1ZSBpcyBOYU4uXG4gKiBUaW1lIHZhbHVlIG9mIERhdGU6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuOS4xLjFcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZVN0ciAtIFRoZSBzdHJpbmcgdG8gcGFyc2VcbiAqIEBwYXJhbSBmb3JtYXRTdHIgLSBUaGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIHJlZmVyZW5jZURhdGUgLSBkZWZpbmVzIHZhbHVlcyBtaXNzaW5nIGZyb20gdGhlIHBhcnNlZCBkYXRlU3RyaW5nXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiAgIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogICBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGRhdGVcbiAqXG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBtYXRjaGAgcHJvcGVydHlcbiAqIEB0aHJvd3MgdXNlIGB5eXl5YCBpbnN0ZWFkIG9mIGBZWVlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgeXlgIGluc3RlYWQgb2YgYFlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGAgaW5zdGVhZCBvZiBgRGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYGRkYCBpbnN0ZWFkIG9mIGBERGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyBmb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUGFyc2UgMTEgRmVicnVhcnkgMjAxNCBmcm9tIG1pZGRsZS1lbmRpYW4gZm9ybWF0OlxuICogdmFyIHJlc3VsdCA9IHBhcnNlKCcwMi8xMS8yMDE0JywgJ01NL2RkL3l5eXknLCBuZXcgRGF0ZSgpKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUGFyc2UgMjh0aCBvZiBGZWJydWFyeSBpbiBFc3BlcmFudG8gbG9jYWxlIGluIHRoZSBjb250ZXh0IG9mIDIwMTAgeWVhcjpcbiAqIGltcG9ydCBlbyBmcm9tICdkYXRlLWZucy9sb2NhbGUvZW8nXG4gKiB2YXIgcmVzdWx0ID0gcGFyc2UoJzI4LWEgZGUgZmVicnVhcm8nLCBcImRvICdkZScgTU1NTVwiLCBuZXcgRGF0ZSgyMDEwLCAwLCAxKSwge1xuICogICBsb2NhbGU6IGVvXG4gKiB9KVxuICogLy89PiBTdW4gRmViIDI4IDIwMTAgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gcGFyc2UoZGF0ZVN0ciwgZm9ybWF0U3RyLCByZWZlcmVuY2VEYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDIuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IGxvY2FsZSA9XG4gICAgb3B0aW9ucz8ubG9jYWxlID8/IGRlZmF1bHRPcHRpb25zLmxvY2FsZSA/PyBfaW5kZXgzLmRlZmF1bHRMb2NhbGU7XG5cbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGlmIChmb3JtYXRTdHIgPT09IFwiXCIpIHtcbiAgICBpZiAoZGF0ZVN0ciA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuICgwLCBfaW5kZXg0LnRvRGF0ZSkocmVmZXJlbmNlRGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIE5hTik7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3ViRm5PcHRpb25zID0ge1xuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSxcbiAgICB3ZWVrU3RhcnRzT24sXG4gICAgbG9jYWxlLFxuICB9O1xuXG4gIC8vIElmIHRpbWV6b25lIGlzbid0IHNwZWNpZmllZCwgaXQgd2lsbCBiZSBzZXQgdG8gdGhlIHN5c3RlbSB0aW1lem9uZVxuICBjb25zdCBzZXR0ZXJzID0gW25ldyBfU2V0dGVyLkRhdGVUb1N5c3RlbVRpbWV6b25lU2V0dGVyKCldO1xuXG4gIGNvbnN0IHRva2VucyA9IGZvcm1hdFN0clxuICAgIC5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyIGluIF9pbmRleDUubG9uZ0Zvcm1hdHRlcnMpIHtcbiAgICAgICAgY29uc3QgbG9uZ0Zvcm1hdHRlciA9IF9pbmRleDUubG9uZ0Zvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdO1xuICAgICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdHJpbmc7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKVxuICAgIC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwKTtcblxuICBjb25zdCB1c2VkVG9rZW5zID0gW107XG5cbiAgZm9yIChsZXQgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgaWYgKFxuICAgICAgIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJlxuICAgICAgKDAsIF9pbmRleDYuaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKSh0b2tlbilcbiAgICApIHtcbiAgICAgICgwLCBfaW5kZXg2Lndhcm5PclRocm93UHJvdGVjdGVkRXJyb3IpKHRva2VuLCBmb3JtYXRTdHIsIGRhdGVTdHIpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJlxuICAgICAgKDAsIF9pbmRleDYuaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbikodG9rZW4pXG4gICAgKSB7XG4gICAgICAoMCwgX2luZGV4Ni53YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKSh0b2tlbiwgZm9ybWF0U3RyLCBkYXRlU3RyKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHRva2VuWzBdO1xuICAgIGNvbnN0IHBhcnNlciA9IF9pbmRleDcucGFyc2Vyc1tmaXJzdENoYXJhY3Rlcl07XG4gICAgaWYgKHBhcnNlcikge1xuICAgICAgY29uc3QgeyBpbmNvbXBhdGlibGVUb2tlbnMgfSA9IHBhcnNlcjtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGluY29tcGF0aWJsZVRva2VucykpIHtcbiAgICAgICAgY29uc3QgaW5jb21wYXRpYmxlVG9rZW4gPSB1c2VkVG9rZW5zLmZpbmQoXG4gICAgICAgICAgKHVzZWRUb2tlbikgPT5cbiAgICAgICAgICAgIGluY29tcGF0aWJsZVRva2Vucy5pbmNsdWRlcyh1c2VkVG9rZW4udG9rZW4pIHx8XG4gICAgICAgICAgICB1c2VkVG9rZW4udG9rZW4gPT09IGZpcnN0Q2hhcmFjdGVyLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaW5jb21wYXRpYmxlVG9rZW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICAgIGBUaGUgZm9ybWF0IHN0cmluZyBtdXN0bid0IGNvbnRhaW4gXFxgJHtpbmNvbXBhdGlibGVUb2tlbi5mdWxsVG9rZW59XFxgIGFuZCBcXGAke3Rva2VufVxcYCBhdCB0aGUgc2FtZSB0aW1lYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlci5pbmNvbXBhdGlibGVUb2tlbnMgPT09IFwiKlwiICYmIHVzZWRUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICBgVGhlIGZvcm1hdCBzdHJpbmcgbXVzdG4ndCBjb250YWluIFxcYCR7dG9rZW59XFxgIGFuZCBhbnkgb3RoZXIgdG9rZW4gYXQgdGhlIHNhbWUgdGltZWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHVzZWRUb2tlbnMucHVzaCh7IHRva2VuOiBmaXJzdENoYXJhY3RlciwgZnVsbFRva2VuOiB0b2tlbiB9KTtcblxuICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBwYXJzZXIucnVuKFxuICAgICAgICBkYXRlU3RyLFxuICAgICAgICB0b2tlbixcbiAgICAgICAgbG9jYWxlLm1hdGNoLFxuICAgICAgICBzdWJGbk9wdGlvbnMsXG4gICAgICApO1xuXG4gICAgICBpZiAoIXBhcnNlUmVzdWx0KSB7XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIE5hTik7XG4gICAgICB9XG5cbiAgICAgIHNldHRlcnMucHVzaChwYXJzZVJlc3VsdC5zZXR0ZXIpO1xuXG4gICAgICBkYXRlU3RyID0gcGFyc2VSZXN1bHQucmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyLm1hdGNoKHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICBcIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgXCIgK1xuICAgICAgICAgICAgZmlyc3RDaGFyYWN0ZXIgK1xuICAgICAgICAgICAgXCJgXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICAgIGlmICh0b2tlbiA9PT0gXCInJ1wiKSB7XG4gICAgICAgIHRva2VuID0gXCInXCI7XG4gICAgICB9IGVsc2UgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcIidcIikge1xuICAgICAgICB0b2tlbiA9IGNsZWFuRXNjYXBlZFN0cmluZyh0b2tlbik7XG4gICAgICB9XG5cbiAgICAgIC8vIEN1dCB0b2tlbiBmcm9tIHN0cmluZywgb3IsIGlmIHN0cmluZyBkb2Vzbid0IG1hdGNoIHRoZSB0b2tlbiwgcmV0dXJuIEludmFsaWQgRGF0ZVxuICAgICAgaWYgKGRhdGVTdHIuaW5kZXhPZih0b2tlbikgPT09IDApIHtcbiAgICAgICAgZGF0ZVN0ciA9IGRhdGVTdHIuc2xpY2UodG9rZW4ubGVuZ3RoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIE5hTik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHJlbWFpbmluZyBpbnB1dCBjb250YWlucyBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGl0ZXNwYWNlXG4gIGlmIChkYXRlU3RyLmxlbmd0aCA+IDAgJiYgbm90V2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGRhdGVTdHIpKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgfVxuXG4gIGNvbnN0IHVuaXF1ZVByaW9yaXR5U2V0dGVycyA9IHNldHRlcnNcbiAgICAubWFwKChzZXR0ZXIpID0+IHNldHRlci5wcmlvcml0eSlcbiAgICAuc29ydCgoYSwgYikgPT4gYiAtIGEpXG4gICAgLmZpbHRlcigocHJpb3JpdHksIGluZGV4LCBhcnJheSkgPT4gYXJyYXkuaW5kZXhPZihwcmlvcml0eSkgPT09IGluZGV4KVxuICAgIC5tYXAoKHByaW9yaXR5KSA9PlxuICAgICAgc2V0dGVyc1xuICAgICAgICAuZmlsdGVyKChzZXR0ZXIpID0+IHNldHRlci5wcmlvcml0eSA9PT0gcHJpb3JpdHkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnN1YlByaW9yaXR5IC0gYS5zdWJQcmlvcml0eSksXG4gICAgKVxuICAgIC5tYXAoKHNldHRlckFycmF5KSA9PiBzZXR0ZXJBcnJheVswXSk7XG5cbiAgbGV0IGRhdGUgPSAoMCwgX2luZGV4NC50b0RhdGUpKHJlZmVyZW5jZURhdGUpO1xuXG4gIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShyZWZlcmVuY2VEYXRlLCBOYU4pO1xuICB9XG5cbiAgY29uc3QgZmxhZ3MgPSB7fTtcbiAgZm9yIChjb25zdCBzZXR0ZXIgb2YgdW5pcXVlUHJpb3JpdHlTZXR0ZXJzKSB7XG4gICAgaWYgKCFzZXR0ZXIudmFsaWRhdGUoZGF0ZSwgc3ViRm5PcHRpb25zKSkge1xuICAgICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBzZXR0ZXIuc2V0KGRhdGUsIGZsYWdzLCBzdWJGbk9wdGlvbnMpO1xuICAgIC8vIFJlc3VsdCBpcyB0dXBsZSAoZGF0ZSwgZmxhZ3MpXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgZGF0ZSA9IHJlc3VsdFswXTtcbiAgICAgIE9iamVjdC5hc3NpZ24oZmxhZ3MsIHJlc3VsdFsxXSk7XG4gICAgICAvLyBSZXN1bHQgaXMgZGF0ZVxuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIGRhdGUpO1xufVxuXG5mdW5jdGlvbiBjbGVhbkVzY2FwZWRTdHJpbmcoaW5wdXQpIHtcbiAgcmV0dXJuIGlucHV0Lm1hdGNoKGVzY2FwZWRTdHJpbmdSZWdFeHApWzFdLnJlcGxhY2UoZG91YmxlUXVvdGVSZWdFeHAsIFwiJ1wiKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5wYXJzZUlTTyA9IHBhcnNlSVNPO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHBhcnNlSVNPfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgcGFyc2VJU09cbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgUGFyc2UgSVNPIHN0cmluZ1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUGFyc2UgdGhlIGdpdmVuIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQgYW5kIHJldHVybiBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEZ1bmN0aW9uIGFjY2VwdHMgY29tcGxldGUgSVNPIDg2MDEgZm9ybWF0cyBhcyB3ZWxsIGFzIHBhcnRpYWwgaW1wbGVtZW50YXRpb25zLlxuICogSVNPIDg2MDE6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDFcbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXNuJ3QgYSBzdHJpbmcsIHRoZSBmdW5jdGlvbiBjYW5ub3QgcGFyc2UgdGhlIHN0cmluZyBvclxuICogdGhlIHZhbHVlcyBhcmUgaW52YWxpZCwgaXQgcmV0dXJucyBJbnZhbGlkIERhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGFyZ3VtZW50IC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgc3RyaW5nICcyMDE0LTAyLTExVDExOjMwOjMwJyB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VJU08oJzIwMTQtMDItMTFUMTE6MzA6MzAnKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBzdHJpbmcgJyswMjAxNDEwMScgdG8gZGF0ZSxcbiAqIC8vIGlmIHRoZSBhZGRpdGlvbmFsIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGV4dGVuZGVkIHllYXIgZm9ybWF0IGlzIDE6XG4gKiBjb25zdCByZXN1bHQgPSBwYXJzZUlTTygnKzAyMDE0MTAxJywgeyBhZGRpdGlvbmFsRGlnaXRzOiAxIH0pXG4gKiAvLz0+IEZyaSBBcHIgMTEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBwYXJzZUlTTyhhcmd1bWVudCwgb3B0aW9ucykge1xuICBjb25zdCBhZGRpdGlvbmFsRGlnaXRzID0gb3B0aW9ucz8uYWRkaXRpb25hbERpZ2l0cyA/PyAyO1xuICBjb25zdCBkYXRlU3RyaW5ncyA9IHNwbGl0RGF0ZVN0cmluZyhhcmd1bWVudCk7XG5cbiAgbGV0IGRhdGU7XG4gIGlmIChkYXRlU3RyaW5ncy5kYXRlKSB7XG4gICAgY29uc3QgcGFyc2VZZWFyUmVzdWx0ID0gcGFyc2VZZWFyKGRhdGVTdHJpbmdzLmRhdGUsIGFkZGl0aW9uYWxEaWdpdHMpO1xuICAgIGRhdGUgPSBwYXJzZURhdGUocGFyc2VZZWFyUmVzdWx0LnJlc3REYXRlU3RyaW5nLCBwYXJzZVllYXJSZXN1bHQueWVhcik7XG4gIH1cblxuICBpZiAoIWRhdGUgfHwgaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cblxuICBjb25zdCB0aW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcbiAgbGV0IHRpbWUgPSAwO1xuICBsZXQgb2Zmc2V0O1xuXG4gIGlmIChkYXRlU3RyaW5ncy50aW1lKSB7XG4gICAgdGltZSA9IHBhcnNlVGltZShkYXRlU3RyaW5ncy50aW1lKTtcbiAgICBpZiAoaXNOYU4odGltZSkpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkYXRlU3RyaW5ncy50aW1lem9uZSkge1xuICAgIG9mZnNldCA9IHBhcnNlVGltZXpvbmUoZGF0ZVN0cmluZ3MudGltZXpvbmUpO1xuICAgIGlmIChpc05hTihvZmZzZXQpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGlydHlEYXRlID0gbmV3IERhdGUodGltZXN0YW1wICsgdGltZSk7XG4gICAgLy8gSlMgcGFyc2VkIHN0cmluZyBhc3N1bWluZyBpdCdzIGluIFVUQyB0aW1lem9uZVxuICAgIC8vIGJ1dCB3ZSBuZWVkIGl0IHRvIGJlIHBhcnNlZCBpbiBvdXIgdGltZXpvbmVcbiAgICAvLyBzbyB3ZSB1c2UgdXRjIHZhbHVlcyB0byBidWlsZCBkYXRlIGluIG91ciB0aW1lem9uZS5cbiAgICAvLyBZZWFyIHZhbHVlcyBmcm9tIDAgdG8gOTkgbWFwIHRvIHRoZSB5ZWFycyAxOTAwIHRvIDE5OTlcbiAgICAvLyBzbyBzZXQgeWVhciBleHBsaWNpdGx5IHdpdGggc2V0RnVsbFllYXIuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IERhdGUoMCk7XG4gICAgcmVzdWx0LnNldEZ1bGxZZWFyKFxuICAgICAgZGlydHlEYXRlLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDTW9udGgoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENEYXRlKCksXG4gICAgKTtcbiAgICByZXN1bHQuc2V0SG91cnMoXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDSG91cnMoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENNaW51dGVzKCksXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDU2Vjb25kcygpLFxuICAgICAgZGlydHlEYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXAgKyB0aW1lICsgb2Zmc2V0KTtcbn1cblxuY29uc3QgcGF0dGVybnMgPSB7XG4gIGRhdGVUaW1lRGVsaW1pdGVyOiAvW1QgXS8sXG4gIHRpbWVab25lRGVsaW1pdGVyOiAvW1ogXS9pLFxuICB0aW1lem9uZTogLyhbWistXS4qKSQvLFxufTtcblxuY29uc3QgZGF0ZVJlZ2V4ID1cbiAgL14tPyg/OihcXGR7M30pfChcXGR7Mn0pKD86LT8oXFxkezJ9KSk/fFcoXFxkezJ9KSg/Oi0/KFxcZHsxfSkpP3wpJC87XG5jb25zdCB0aW1lUmVnZXggPVxuICAvXihcXGR7Mn0oPzpbLixdXFxkKik/KSg/Ojo/KFxcZHsyfSg/OlsuLF1cXGQqKT8pKT8oPzo6PyhcXGR7Mn0oPzpbLixdXFxkKik/KSk/JC87XG5jb25zdCB0aW1lem9uZVJlZ2V4ID0gL14oWystXSkoXFxkezJ9KSg/Ojo/KFxcZHsyfSkpPyQvO1xuXG5mdW5jdGlvbiBzcGxpdERhdGVTdHJpbmcoZGF0ZVN0cmluZykge1xuICBjb25zdCBkYXRlU3RyaW5ncyA9IHt9O1xuICBjb25zdCBhcnJheSA9IGRhdGVTdHJpbmcuc3BsaXQocGF0dGVybnMuZGF0ZVRpbWVEZWxpbWl0ZXIpO1xuICBsZXQgdGltZVN0cmluZztcblxuICAvLyBUaGUgcmVnZXggbWF0Y2ggc2hvdWxkIG9ubHkgcmV0dXJuIGF0IG1heGltdW0gdHdvIGFycmF5IGVsZW1lbnRzLlxuICAvLyBbZGF0ZV0sIFt0aW1lXSwgb3IgW2RhdGUsIHRpbWVdLlxuICBpZiAoYXJyYXkubGVuZ3RoID4gMikge1xuICAgIHJldHVybiBkYXRlU3RyaW5ncztcbiAgfVxuXG4gIGlmICgvOi8udGVzdChhcnJheVswXSkpIHtcbiAgICB0aW1lU3RyaW5nID0gYXJyYXlbMF07XG4gIH0gZWxzZSB7XG4gICAgZGF0ZVN0cmluZ3MuZGF0ZSA9IGFycmF5WzBdO1xuICAgIHRpbWVTdHJpbmcgPSBhcnJheVsxXTtcbiAgICBpZiAocGF0dGVybnMudGltZVpvbmVEZWxpbWl0ZXIudGVzdChkYXRlU3RyaW5ncy5kYXRlKSkge1xuICAgICAgZGF0ZVN0cmluZ3MuZGF0ZSA9IGRhdGVTdHJpbmcuc3BsaXQocGF0dGVybnMudGltZVpvbmVEZWxpbWl0ZXIpWzBdO1xuICAgICAgdGltZVN0cmluZyA9IGRhdGVTdHJpbmcuc3Vic3RyKFxuICAgICAgICBkYXRlU3RyaW5ncy5kYXRlLmxlbmd0aCxcbiAgICAgICAgZGF0ZVN0cmluZy5sZW5ndGgsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aW1lU3RyaW5nKSB7XG4gICAgY29uc3QgdG9rZW4gPSBwYXR0ZXJucy50aW1lem9uZS5leGVjKHRpbWVTdHJpbmcpO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgZGF0ZVN0cmluZ3MudGltZSA9IHRpbWVTdHJpbmcucmVwbGFjZSh0b2tlblsxXSwgXCJcIik7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lem9uZSA9IHRva2VuWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lID0gdGltZVN0cmluZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGF0ZVN0cmluZ3M7XG59XG5cbmZ1bmN0aW9uIHBhcnNlWWVhcihkYXRlU3RyaW5nLCBhZGRpdGlvbmFsRGlnaXRzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBcIl4oPzooXFxcXGR7NH18WystXVxcXFxke1wiICtcbiAgICAgICg0ICsgYWRkaXRpb25hbERpZ2l0cykgK1xuICAgICAgXCJ9KXwoXFxcXGR7Mn18WystXVxcXFxke1wiICtcbiAgICAgICgyICsgYWRkaXRpb25hbERpZ2l0cykgK1xuICAgICAgXCJ9KSQpXCIsXG4gICk7XG5cbiAgY29uc3QgY2FwdHVyZXMgPSBkYXRlU3RyaW5nLm1hdGNoKHJlZ2V4KTtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHllYXJcbiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIHsgeWVhcjogTmFOLCByZXN0RGF0ZVN0cmluZzogXCJcIiB9O1xuXG4gIGNvbnN0IHllYXIgPSBjYXB0dXJlc1sxXSA/IHBhcnNlSW50KGNhcHR1cmVzWzFdKSA6IG51bGw7XG4gIGNvbnN0IGNlbnR1cnkgPSBjYXB0dXJlc1syXSA/IHBhcnNlSW50KGNhcHR1cmVzWzJdKSA6IG51bGw7XG5cbiAgLy8gZWl0aGVyIHllYXIgb3IgY2VudHVyeSBpcyBudWxsLCBub3QgYm90aFxuICByZXR1cm4ge1xuICAgIHllYXI6IGNlbnR1cnkgPT09IG51bGwgPyB5ZWFyIDogY2VudHVyeSAqIDEwMCxcbiAgICByZXN0RGF0ZVN0cmluZzogZGF0ZVN0cmluZy5zbGljZSgoY2FwdHVyZXNbMV0gfHwgY2FwdHVyZXNbMl0pLmxlbmd0aCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF0ZShkYXRlU3RyaW5nLCB5ZWFyKSB7XG4gIC8vIEludmFsaWQgSVNPLWZvcm1hdHRlZCB5ZWFyXG4gIGlmICh5ZWFyID09PSBudWxsKSByZXR1cm4gbmV3IERhdGUoTmFOKTtcblxuICBjb25zdCBjYXB0dXJlcyA9IGRhdGVTdHJpbmcubWF0Y2goZGF0ZVJlZ2V4KTtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHN0cmluZ1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gbmV3IERhdGUoTmFOKTtcblxuICBjb25zdCBpc1dlZWtEYXRlID0gISFjYXB0dXJlc1s0XTtcbiAgY29uc3QgZGF5T2ZZZWFyID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1sxXSk7XG4gIGNvbnN0IG1vbnRoID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1syXSkgLSAxO1xuICBjb25zdCBkYXkgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzNdKTtcbiAgY29uc3Qgd2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNF0pO1xuICBjb25zdCBkYXlPZldlZWsgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzVdKSAtIDE7XG5cbiAgaWYgKGlzV2Vla0RhdGUpIHtcbiAgICBpZiAoIXZhbGlkYXRlV2Vla0RhdGUoeWVhciwgd2VlaywgZGF5T2ZXZWVrKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gICAgfVxuICAgIHJldHVybiBkYXlPZklTT1dlZWtZZWFyKHllYXIsIHdlZWssIGRheU9mV2Vlayk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDApO1xuICAgIGlmIChcbiAgICAgICF2YWxpZGF0ZURhdGUoeWVhciwgbW9udGgsIGRheSkgfHxcbiAgICAgICF2YWxpZGF0ZURheU9mWWVhckRhdGUoeWVhciwgZGF5T2ZZZWFyKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gICAgfVxuICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeWVhciwgbW9udGgsIE1hdGgubWF4KGRheU9mWWVhciwgZGF5KSk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlVW5pdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPyBwYXJzZUludCh2YWx1ZSkgOiAxO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRpbWUodGltZVN0cmluZykge1xuICBjb25zdCBjYXB0dXJlcyA9IHRpbWVTdHJpbmcubWF0Y2godGltZVJlZ2V4KTtcbiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIE5hTjsgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHRpbWVcblxuICBjb25zdCBob3VycyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbMV0pO1xuICBjb25zdCBtaW51dGVzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1syXSk7XG4gIGNvbnN0IHNlY29uZHMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzNdKTtcblxuICBpZiAoIXZhbGlkYXRlVGltZShob3VycywgbWludXRlcywgc2Vjb25kcykpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBob3VycyAqIF9pbmRleC5taWxsaXNlY29uZHNJbkhvdXIgK1xuICAgIG1pbnV0ZXMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5NaW51dGUgK1xuICAgIHNlY29uZHMgKiAxMDAwXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZVVuaXQodmFsdWUpIHtcbiAgcmV0dXJuICh2YWx1ZSAmJiBwYXJzZUZsb2F0KHZhbHVlLnJlcGxhY2UoXCIsXCIsIFwiLlwiKSkpIHx8IDA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZXpvbmUodGltZXpvbmVTdHJpbmcpIHtcbiAgaWYgKHRpbWV6b25lU3RyaW5nID09PSBcIlpcIikgcmV0dXJuIDA7XG5cbiAgY29uc3QgY2FwdHVyZXMgPSB0aW1lem9uZVN0cmluZy5tYXRjaCh0aW1lem9uZVJlZ2V4KTtcbiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIDA7XG5cbiAgY29uc3Qgc2lnbiA9IGNhcHR1cmVzWzFdID09PSBcIitcIiA/IC0xIDogMTtcbiAgY29uc3QgaG91cnMgPSBwYXJzZUludChjYXB0dXJlc1syXSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSAoY2FwdHVyZXNbM10gJiYgcGFyc2VJbnQoY2FwdHVyZXNbM10pKSB8fCAwO1xuXG4gIGlmICghdmFsaWRhdGVUaW1lem9uZShob3VycywgbWludXRlcykpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBzaWduICpcbiAgICAoaG91cnMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIF9pbmRleC5taWxsaXNlY29uZHNJbk1pbnV0ZSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZGF5T2ZJU09XZWVrWWVhcihpc29XZWVrWWVhciwgd2VlaywgZGF5KSB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwKTtcbiAgZGF0ZS5zZXRVVENGdWxsWWVhcihpc29XZWVrWWVhciwgMCwgNCk7XG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeURheSA9IGRhdGUuZ2V0VVRDRGF5KCkgfHwgNztcbiAgY29uc3QgZGlmZiA9ICh3ZWVrIC0gMSkgKiA3ICsgZGF5ICsgMSAtIGZvdXJ0aE9mSmFudWFyeURheTtcbiAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpICsgZGlmZik7XG4gIHJldHVybiBkYXRlO1xufVxuXG4vLyBWYWxpZGF0aW9uIGZ1bmN0aW9uc1xuXG4vLyBGZWJydWFyeSBpcyBudWxsIHRvIGhhbmRsZSB0aGUgbGVhcCB5ZWFyICh1c2luZyB8fClcbmNvbnN0IGRheXNJbk1vbnRocyA9IFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuXG5mdW5jdGlvbiBpc0xlYXBZZWFySW5kZXgoeWVhcikge1xuICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSkge1xuICByZXR1cm4gKFxuICAgIG1vbnRoID49IDAgJiZcbiAgICBtb250aCA8PSAxMSAmJlxuICAgIGRhdGUgPj0gMSAmJlxuICAgIGRhdGUgPD0gKGRheXNJbk1vbnRoc1ttb250aF0gfHwgKGlzTGVhcFllYXJJbmRleCh5ZWFyKSA/IDI5IDogMjgpKVxuICApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURheU9mWWVhckRhdGUoeWVhciwgZGF5T2ZZZWFyKSB7XG4gIHJldHVybiBkYXlPZlllYXIgPj0gMSAmJiBkYXlPZlllYXIgPD0gKGlzTGVhcFllYXJJbmRleCh5ZWFyKSA/IDM2NiA6IDM2NSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlV2Vla0RhdGUoX3llYXIsIHdlZWssIGRheSkge1xuICByZXR1cm4gd2VlayA+PSAxICYmIHdlZWsgPD0gNTMgJiYgZGF5ID49IDAgJiYgZGF5IDw9IDY7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGltZShob3VycywgbWludXRlcywgc2Vjb25kcykge1xuICBpZiAoaG91cnMgPT09IDI0KSB7XG4gICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgJiYgc2Vjb25kcyA9PT0gMDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgc2Vjb25kcyA+PSAwICYmXG4gICAgc2Vjb25kcyA8IDYwICYmXG4gICAgbWludXRlcyA+PSAwICYmXG4gICAgbWludXRlcyA8IDYwICYmXG4gICAgaG91cnMgPj0gMCAmJlxuICAgIGhvdXJzIDwgMjVcbiAgKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUaW1lem9uZShfaG91cnMsIG1pbnV0ZXMpIHtcbiAgcmV0dXJuIG1pbnV0ZXMgPj0gMCAmJiBtaW51dGVzIDw9IDU5O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlBhcnNlciA9IHZvaWQgMDtcbnZhciBfU2V0dGVyID0gcmVxdWlyZShcIi4vU2V0dGVyLmpzXCIpO1xuXG5jbGFzcyBQYXJzZXIge1xuICBydW4oZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gsIG9wdGlvbnMpO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2V0dGVyOiBuZXcgX1NldHRlci5WYWx1ZVNldHRlcihcbiAgICAgICAgcmVzdWx0LnZhbHVlLFxuICAgICAgICB0aGlzLnZhbGlkYXRlLFxuICAgICAgICB0aGlzLnNldCxcbiAgICAgICAgdGhpcy5wcmlvcml0eSxcbiAgICAgICAgdGhpcy5zdWJQcmlvcml0eSxcbiAgICAgICksXG4gICAgICByZXN0OiByZXN1bHQucmVzdCxcbiAgICB9O1xuICB9XG5cbiAgdmFsaWRhdGUoX3V0Y0RhdGUsIF92YWx1ZSwgX29wdGlvbnMpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuZXhwb3J0cy5QYXJzZXIgPSBQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuVmFsdWVTZXR0ZXIgPVxuICBleHBvcnRzLlNldHRlciA9XG4gIGV4cG9ydHMuRGF0ZVRvU3lzdGVtVGltZXpvbmVTZXR0ZXIgPVxuICAgIHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vdHJhbnNwb3NlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuY29uc3QgVElNRVpPTkVfVU5JVF9QUklPUklUWSA9IDEwO1xuXG5jbGFzcyBTZXR0ZXIge1xuICBzdWJQcmlvcml0eSA9IDA7XG5cbiAgdmFsaWRhdGUoX3V0Y0RhdGUsIF9vcHRpb25zKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbmV4cG9ydHMuU2V0dGVyID0gU2V0dGVyO1xuXG5jbGFzcyBWYWx1ZVNldHRlciBleHRlbmRzIFNldHRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHZhbHVlLFxuXG4gICAgdmFsaWRhdGVWYWx1ZSxcblxuICAgIHNldFZhbHVlLFxuXG4gICAgcHJpb3JpdHksXG4gICAgc3ViUHJpb3JpdHksXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZSA9IHZhbGlkYXRlVmFsdWU7XG4gICAgdGhpcy5zZXRWYWx1ZSA9IHNldFZhbHVlO1xuICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICBpZiAoc3ViUHJpb3JpdHkpIHtcbiAgICAgIHRoaXMuc3ViUHJpb3JpdHkgPSBzdWJQcmlvcml0eTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShkYXRlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVWYWx1ZShkYXRlLCB0aGlzLnZhbHVlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHNldChkYXRlLCBmbGFncywgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnNldFZhbHVlKGRhdGUsIGZsYWdzLCB0aGlzLnZhbHVlLCBvcHRpb25zKTtcbiAgfVxufVxuZXhwb3J0cy5WYWx1ZVNldHRlciA9IFZhbHVlU2V0dGVyO1xuXG5jbGFzcyBEYXRlVG9TeXN0ZW1UaW1lem9uZVNldHRlciBleHRlbmRzIFNldHRlciB7XG4gIHByaW9yaXR5ID0gVElNRVpPTkVfVU5JVF9QUklPUklUWTtcbiAgc3ViUHJpb3JpdHkgPSAtMTtcbiAgc2V0KGRhdGUsIGZsYWdzKSB7XG4gICAgaWYgKGZsYWdzLnRpbWVzdGFtcElzU2V0KSByZXR1cm4gZGF0ZTtcbiAgICByZXR1cm4gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgKDAsIF9pbmRleC50cmFuc3Bvc2UpKGRhdGUsIERhdGUpKTtcbiAgfVxufVxuZXhwb3J0cy5EYXRlVG9TeXN0ZW1UaW1lem9uZVNldHRlciA9IERhdGVUb1N5c3RlbVRpbWV6b25lU2V0dGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnRpbWV6b25lUGF0dGVybnMgPSBleHBvcnRzLm51bWVyaWNQYXR0ZXJucyA9IHZvaWQgMDtcbmNvbnN0IG51bWVyaWNQYXR0ZXJucyA9IChleHBvcnRzLm51bWVyaWNQYXR0ZXJucyA9IHtcbiAgbW9udGg6IC9eKDFbMC0yXXwwP1xcZCkvLCAvLyAwIHRvIDEyXG4gIGRhdGU6IC9eKDNbMC0xXXxbMC0yXT9cXGQpLywgLy8gMCB0byAzMVxuICBkYXlPZlllYXI6IC9eKDM2WzAtNl18M1swLTVdXFxkfFswLTJdP1xcZD9cXGQpLywgLy8gMCB0byAzNjZcbiAgd2VlazogL14oNVswLTNdfFswLTRdP1xcZCkvLCAvLyAwIHRvIDUzXG4gIGhvdXIyM2g6IC9eKDJbMC0zXXxbMC0xXT9cXGQpLywgLy8gMCB0byAyM1xuICBob3VyMjRoOiAvXigyWzAtNF18WzAtMV0/XFxkKS8sIC8vIDAgdG8gMjRcbiAgaG91cjExaDogL14oMVswLTFdfDA/XFxkKS8sIC8vIDAgdG8gMTFcbiAgaG91cjEyaDogL14oMVswLTJdfDA/XFxkKS8sIC8vIDAgdG8gMTJcbiAgbWludXRlOiAvXlswLTVdP1xcZC8sIC8vIDAgdG8gNTlcbiAgc2Vjb25kOiAvXlswLTVdP1xcZC8sIC8vIDAgdG8gNTlcblxuICBzaW5nbGVEaWdpdDogL15cXGQvLCAvLyAwIHRvIDlcbiAgdHdvRGlnaXRzOiAvXlxcZHsxLDJ9LywgLy8gMCB0byA5OVxuICB0aHJlZURpZ2l0czogL15cXGR7MSwzfS8sIC8vIDAgdG8gOTk5XG4gIGZvdXJEaWdpdHM6IC9eXFxkezEsNH0vLCAvLyAwIHRvIDk5OTlcblxuICBhbnlEaWdpdHNTaWduZWQ6IC9eLT9cXGQrLyxcbiAgc2luZ2xlRGlnaXRTaWduZWQ6IC9eLT9cXGQvLCAvLyAwIHRvIDksIC0wIHRvIC05XG4gIHR3b0RpZ2l0c1NpZ25lZDogL14tP1xcZHsxLDJ9LywgLy8gMCB0byA5OSwgLTAgdG8gLTk5XG4gIHRocmVlRGlnaXRzU2lnbmVkOiAvXi0/XFxkezEsM30vLCAvLyAwIHRvIDk5OSwgLTAgdG8gLTk5OVxuICBmb3VyRGlnaXRzU2lnbmVkOiAvXi0/XFxkezEsNH0vLCAvLyAwIHRvIDk5OTksIC0wIHRvIC05OTk5XG59KTtcblxuY29uc3QgdGltZXpvbmVQYXR0ZXJucyA9IChleHBvcnRzLnRpbWV6b25lUGF0dGVybnMgPSB7XG4gIGJhc2ljT3B0aW9uYWxNaW51dGVzOiAvXihbKy1dKShcXGR7Mn0pKFxcZHsyfSk/fFovLFxuICBiYXNpYzogL14oWystXSkoXFxkezJ9KShcXGR7Mn0pfFovLFxuICBiYXNpY09wdGlvbmFsU2Vjb25kczogL14oWystXSkoXFxkezJ9KShcXGR7Mn0pKChcXGR7Mn0pKT98Wi8sXG4gIGV4dGVuZGVkOiAvXihbKy1dKShcXGR7Mn0pOihcXGR7Mn0pfFovLFxuICBleHRlbmRlZE9wdGlvbmFsU2Vjb25kczogL14oWystXSkoXFxkezJ9KTooXFxkezJ9KSg6KFxcZHsyfSkpP3xaLyxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnBhcnNlcnMgPSB2b2lkIDA7XG52YXIgX0VyYVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRXJhUGFyc2VyLmpzXCIpO1xudmFyIF9ZZWFyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9ZZWFyUGFyc2VyLmpzXCIpO1xudmFyIF9Mb2NhbFdlZWtZZWFyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Mb2NhbFdlZWtZZWFyUGFyc2VyLmpzXCIpO1xudmFyIF9JU09XZWVrWWVhclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSVNPV2Vla1llYXJQYXJzZXIuanNcIik7XG52YXIgX0V4dGVuZGVkWWVhclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRXh0ZW5kZWRZZWFyUGFyc2VyLmpzXCIpO1xudmFyIF9RdWFydGVyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9RdWFydGVyUGFyc2VyLmpzXCIpO1xudmFyIF9TdGFuZEFsb25lUXVhcnRlclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuanNcIik7XG52YXIgX01vbnRoUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Nb250aFBhcnNlci5qc1wiKTtcbnZhciBfU3RhbmRBbG9uZU1vbnRoUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9TdGFuZEFsb25lTW9udGhQYXJzZXIuanNcIik7XG52YXIgX0xvY2FsV2Vla1BhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvTG9jYWxXZWVrUGFyc2VyLmpzXCIpO1xudmFyIF9JU09XZWVrUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9JU09XZWVrUGFyc2VyLmpzXCIpO1xudmFyIF9EYXRlUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9EYXRlUGFyc2VyLmpzXCIpO1xudmFyIF9EYXlPZlllYXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0RheU9mWWVhclBhcnNlci5qc1wiKTtcbnZhciBfRGF5UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9EYXlQYXJzZXIuanNcIik7XG52YXIgX0xvY2FsRGF5UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Mb2NhbERheVBhcnNlci5qc1wiKTtcbnZhciBfU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIuanNcIik7XG52YXIgX0lTT0RheVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSVNPRGF5UGFyc2VyLmpzXCIpO1xudmFyIF9BTVBNUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9BTVBNUGFyc2VyLmpzXCIpO1xudmFyIF9BTVBNTWlkbmlnaHRQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0FNUE1NaWRuaWdodFBhcnNlci5qc1wiKTtcbnZhciBfRGF5UGVyaW9kUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9EYXlQZXJpb2RQYXJzZXIuanNcIik7XG52YXIgX0hvdXIxdG8xMlBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSG91cjF0bzEyUGFyc2VyLmpzXCIpO1xudmFyIF9Ib3VyMHRvMjNQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0hvdXIwdG8yM1BhcnNlci5qc1wiKTtcbnZhciBfSG91cjBUbzExUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Ib3VyMFRvMTFQYXJzZXIuanNcIik7XG52YXIgX0hvdXIxVG8yNFBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSG91cjFUbzI0UGFyc2VyLmpzXCIpO1xudmFyIF9NaW51dGVQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL01pbnV0ZVBhcnNlci5qc1wiKTtcbnZhciBfU2Vjb25kUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9TZWNvbmRQYXJzZXIuanNcIik7XG52YXIgX0ZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0ZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIuanNcIik7XG52YXIgX0lTT1RpbWV6b25lV2l0aFpQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0lTT1RpbWV6b25lV2l0aFpQYXJzZXIuanNcIik7XG52YXIgX0lTT1RpbWV6b25lUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9JU09UaW1lem9uZVBhcnNlci5qc1wiKTtcbnZhciBfVGltZXN0YW1wU2Vjb25kc1BhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvVGltZXN0YW1wU2Vjb25kc1BhcnNlci5qc1wiKTtcbnZhciBfVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIuanNcIik7XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBQICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6KiB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYHBhcnNlYCBkb2NzKVxuICogLSBgaWAgaXMgSVNPIGRheSBvZiB3ZWVrLiBGb3IgYGlgIGFuZCBgaWlgIGlzIHJldHVybnMgbnVtZXJpYyBJU08gd2VlayBkYXlzLFxuICogICBpLmUuIDcgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5LCBldGMuXG4gKiAtIGBJYCBpcyBJU08gd2VlayBvZiB5ZWFyLCBhcyBvcHBvc2VkIHRvIGB3YCB3aGljaCBpcyBsb2NhbCB3ZWVrIG9mIHllYXIuXG4gKiAtIGBSYCBpcyBJU08gd2Vlay1udW1iZXJpbmcgeWVhciwgYXMgb3Bwb3NlZCB0byBgWWAgd2hpY2ggaXMgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhci5cbiAqICAgYFJgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgSWAgYW5kIGBpYFxuICogICBmb3IgdW5pdmVyc2FsIElTTyB3ZWVrLW51bWJlcmluZyBkYXRlLCB3aGVyZWFzXG4gKiAgIGBZYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYHdgIGFuZCBgZWBcbiAqICAgZm9yIHdlZWstbnVtYmVyaW5nIGRhdGUgc3BlY2lmaWMgdG8gdGhlIGxvY2FsZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gSXQncyBvaywgd2Ugd2FudCBhbnkgaGVyZVxuY29uc3QgcGFyc2VycyA9IChleHBvcnRzLnBhcnNlcnMgPSB7XG4gIEc6IG5ldyBfRXJhUGFyc2VyLkVyYVBhcnNlcigpLFxuICB5OiBuZXcgX1llYXJQYXJzZXIuWWVhclBhcnNlcigpLFxuICBZOiBuZXcgX0xvY2FsV2Vla1llYXJQYXJzZXIuTG9jYWxXZWVrWWVhclBhcnNlcigpLFxuICBSOiBuZXcgX0lTT1dlZWtZZWFyUGFyc2VyLklTT1dlZWtZZWFyUGFyc2VyKCksXG4gIHU6IG5ldyBfRXh0ZW5kZWRZZWFyUGFyc2VyLkV4dGVuZGVkWWVhclBhcnNlcigpLFxuICBROiBuZXcgX1F1YXJ0ZXJQYXJzZXIuUXVhcnRlclBhcnNlcigpLFxuICBxOiBuZXcgX1N0YW5kQWxvbmVRdWFydGVyUGFyc2VyLlN0YW5kQWxvbmVRdWFydGVyUGFyc2VyKCksXG4gIE06IG5ldyBfTW9udGhQYXJzZXIuTW9udGhQYXJzZXIoKSxcbiAgTDogbmV3IF9TdGFuZEFsb25lTW9udGhQYXJzZXIuU3RhbmRBbG9uZU1vbnRoUGFyc2VyKCksXG4gIHc6IG5ldyBfTG9jYWxXZWVrUGFyc2VyLkxvY2FsV2Vla1BhcnNlcigpLFxuICBJOiBuZXcgX0lTT1dlZWtQYXJzZXIuSVNPV2Vla1BhcnNlcigpLFxuICBkOiBuZXcgX0RhdGVQYXJzZXIuRGF0ZVBhcnNlcigpLFxuICBEOiBuZXcgX0RheU9mWWVhclBhcnNlci5EYXlPZlllYXJQYXJzZXIoKSxcbiAgRTogbmV3IF9EYXlQYXJzZXIuRGF5UGFyc2VyKCksXG4gIGU6IG5ldyBfTG9jYWxEYXlQYXJzZXIuTG9jYWxEYXlQYXJzZXIoKSxcbiAgYzogbmV3IF9TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIuU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyKCksXG4gIGk6IG5ldyBfSVNPRGF5UGFyc2VyLklTT0RheVBhcnNlcigpLFxuICBhOiBuZXcgX0FNUE1QYXJzZXIuQU1QTVBhcnNlcigpLFxuICBiOiBuZXcgX0FNUE1NaWRuaWdodFBhcnNlci5BTVBNTWlkbmlnaHRQYXJzZXIoKSxcbiAgQjogbmV3IF9EYXlQZXJpb2RQYXJzZXIuRGF5UGVyaW9kUGFyc2VyKCksXG4gIGg6IG5ldyBfSG91cjF0bzEyUGFyc2VyLkhvdXIxdG8xMlBhcnNlcigpLFxuICBIOiBuZXcgX0hvdXIwdG8yM1BhcnNlci5Ib3VyMHRvMjNQYXJzZXIoKSxcbiAgSzogbmV3IF9Ib3VyMFRvMTFQYXJzZXIuSG91cjBUbzExUGFyc2VyKCksXG4gIGs6IG5ldyBfSG91cjFUbzI0UGFyc2VyLkhvdXIxVG8yNFBhcnNlcigpLFxuICBtOiBuZXcgX01pbnV0ZVBhcnNlci5NaW51dGVQYXJzZXIoKSxcbiAgczogbmV3IF9TZWNvbmRQYXJzZXIuU2Vjb25kUGFyc2VyKCksXG4gIFM6IG5ldyBfRnJhY3Rpb25PZlNlY29uZFBhcnNlci5GcmFjdGlvbk9mU2Vjb25kUGFyc2VyKCksXG4gIFg6IG5ldyBfSVNPVGltZXpvbmVXaXRoWlBhcnNlci5JU09UaW1lem9uZVdpdGhaUGFyc2VyKCksXG4gIHg6IG5ldyBfSVNPVGltZXpvbmVQYXJzZXIuSVNPVGltZXpvbmVQYXJzZXIoKSxcbiAgdDogbmV3IF9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyLlRpbWVzdGFtcFNlY29uZHNQYXJzZXIoKSxcbiAgVDogbmV3IF9UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIuVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyKCksXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5BTVBNTWlkbmlnaHRQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEFNUE1NaWRuaWdodFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA4MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYlwiOlxuICAgICAgY2FzZSBcImJiXCI6XG4gICAgICBjYXNlIFwiYmJiXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgXCJiYmJiYlwiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiYlwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0SG91cnMoKDAsIF91dGlscy5kYXlQZXJpb2RFbnVtVG9Ib3VycykodmFsdWUpLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImFcIiwgXCJCXCIsIFwiSFwiLCBcImtcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuQU1QTU1pZG5pZ2h0UGFyc2VyID0gQU1QTU1pZG5pZ2h0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkFNUE1QYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEFNUE1QYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gODA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImFcIjpcbiAgICAgIGNhc2UgXCJhYVwiOlxuICAgICAgY2FzZSBcImFhYVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICBjYXNlIFwiYWFhYWFcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImFhYWFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldEhvdXJzKCgwLCBfdXRpbHMuZGF5UGVyaW9kRW51bVRvSG91cnMpKHZhbHVlKSwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJiXCIsIFwiQlwiLCBcIkhcIiwgXCJrXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkFNUE1QYXJzZXIgPSBBTVBNUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkRhdGVQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNvbnN0IERBWVNfSU5fTU9OVEggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5jb25zdCBEQVlTX0lOX01PTlRIX0xFQVBfWUVBUiA9IFtcbiAgMzEsIDI5LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMSxcbl07XG5cbi8vIERheSBvZiB0aGUgbW9udGhcbmNsYXNzIERhdGVQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG4gIHN1YlByaW9yaXR5ID0gMTtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiZFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5kYXRlLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiZG9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImRhdGVcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShkYXRlLCB2YWx1ZSkge1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgaXNMZWFwWWVhciA9ICgwLCBfdXRpbHMuaXNMZWFwWWVhckluZGV4KSh5ZWFyKTtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBpZiAoaXNMZWFwWWVhcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gREFZU19JTl9NT05USF9MRUFQX1lFQVJbbW9udGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSBEQVlTX0lOX01PTlRIW21vbnRoXTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0RGF0ZSh2YWx1ZSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIllcIixcbiAgICBcIlJcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIndcIixcbiAgICBcIklcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuRGF0ZVBhcnNlciA9IERhdGVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRGF5T2ZZZWFyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBEYXlPZlllYXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG5cbiAgc3VicHJpb3JpdHkgPSAxO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJEXCI6XG4gICAgICBjYXNlIFwiRERcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuZGF5T2ZZZWFyLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiRG9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImRhdGVcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShkYXRlLCB2YWx1ZSkge1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgaXNMZWFwWWVhciA9ICgwLCBfdXRpbHMuaXNMZWFwWWVhckluZGV4KSh5ZWFyKTtcbiAgICBpZiAoaXNMZWFwWWVhcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMzY2O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAzNjU7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1vbnRoKDAsIHZhbHVlKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiWVwiLFxuICAgIFwiUlwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRVwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5EYXlPZlllYXJQYXJzZXIgPSBEYXlPZlllYXJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRGF5UGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zZXREYXkuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbi8vIERheSBvZiB3ZWVrXG5jbGFzcyBEYXlQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiRVwiOlxuICAgICAgY2FzZSBcIkVFXCI6XG4gICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcIkVFRUVFRVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJFRUVFXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA2O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBkYXRlID0gKDAsIF9pbmRleC5zZXREYXkpKGRhdGUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiRFwiLCBcImlcIiwgXCJlXCIsIFwiY1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5EYXlQYXJzZXIgPSBEYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRGF5UGVyaW9kUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBpbiB0aGUgbW9ybmluZywgaW4gdGhlIGFmdGVybm9vbiwgaW4gdGhlIGV2ZW5pbmcsIGF0IG5pZ2h0XG5jbGFzcyBEYXlQZXJpb2RQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gODA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkJcIjpcbiAgICAgIGNhc2UgXCJCQlwiOlxuICAgICAgY2FzZSBcIkJCQlwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICBjYXNlIFwiQkJCQkJcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldEhvdXJzKCgwLCBfdXRpbHMuZGF5UGVyaW9kRW51bVRvSG91cnMpKHZhbHVlKSwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJhXCIsIFwiYlwiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5EYXlQZXJpb2RQYXJzZXIgPSBEYXlQZXJpb2RQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRXJhUGFyc2VyID0gdm9pZCAwO1xuXG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbmNsYXNzIEVyYVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxNDA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICBjYXNlIFwiR0dHXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEEsIEJcbiAgICAgIGNhc2UgXCJHR0dHR1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuICAgICAgY2FzZSBcIkdHR0dcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZSkge1xuICAgIGZsYWdzLmVyYSA9IHZhbHVlO1xuICAgIGRhdGUuc2V0RnVsbFllYXIodmFsdWUsIDAsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJSXCIsIFwidVwiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5FcmFQYXJzZXIgPSBFcmFQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRXh0ZW5kZWRZZWFyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBFeHRlbmRlZFllYXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTMwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7XG4gICAgaWYgKHRva2VuID09PSBcInVcIikge1xuICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzU2lnbmVkKSg0LCBkYXRlU3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHNTaWduZWQpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0RnVsbFllYXIodmFsdWUsIDAsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJHXCIsIFwieVwiLCBcIllcIiwgXCJSXCIsIFwid1wiLCBcIklcIiwgXCJpXCIsIFwiZVwiLCBcImNcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuRXh0ZW5kZWRZZWFyUGFyc2VyID0gRXh0ZW5kZWRZZWFyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlKSA9PlxuICAgICAgTWF0aC50cnVuYyh2YWx1ZSAqIE1hdGgucG93KDEwLCAtdG9rZW4ubGVuZ3RoICsgMykpO1xuICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLFxuICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICApO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1pbGxpc2Vjb25kcyh2YWx1ZSk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuRnJhY3Rpb25PZlNlY29uZFBhcnNlciA9IEZyYWN0aW9uT2ZTZWNvbmRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSG91cjBUbzExUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBIb3VyMFRvMTFQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIktcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuaG91cjExaCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIktvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTE7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGNvbnN0IGlzUE0gPSBkYXRlLmdldEhvdXJzKCkgPj0gMTI7XG4gICAgaWYgKGlzUE0gJiYgdmFsdWUgPCAxMikge1xuICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZSArIDEyLCAwLCAwLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZSwgMCwgMCwgMCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiaFwiLCBcIkhcIiwgXCJrXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkhvdXIwVG8xMVBhcnNlciA9IEhvdXIwVG8xMVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Ib3VyMHRvMjNQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEhvdXIwdG8yM1BhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA3MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiSFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5ob3VyMjNoLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiSG9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAyMztcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZSwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJhXCIsIFwiYlwiLCBcImhcIiwgXCJLXCIsIFwia1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5Ib3VyMHRvMjNQYXJzZXIgPSBIb3VyMHRvMjNQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSG91cjFUbzI0UGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBIb3VyMVRvMjRQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImtcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuaG91cjI0aCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcImtvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMjQ7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gdmFsdWUgPD0gMjQgPyB2YWx1ZSAlIDI0IDogdmFsdWU7XG4gICAgZGF0ZS5zZXRIb3Vycyhob3VycywgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJhXCIsIFwiYlwiLCBcImhcIiwgXCJIXCIsIFwiS1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5Ib3VyMVRvMjRQYXJzZXIgPSBIb3VyMVRvMjRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSG91cjF0bzEyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBIb3VyMXRvMTJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuaG91cjEyaCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcImhvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMTI7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGNvbnN0IGlzUE0gPSBkYXRlLmdldEhvdXJzKCkgPj0gMTI7XG4gICAgaWYgKGlzUE0gJiYgdmFsdWUgPCAxMikge1xuICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZSArIDEyLCAwLCAwLCAwKTtcbiAgICB9IGVsc2UgaWYgKCFpc1BNICYmIHZhbHVlID09PSAxMikge1xuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZSwgMCwgMCwgMCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiSFwiLCBcIktcIiwgXCJrXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkhvdXIxdG8xMlBhcnNlciA9IEhvdXIxdG8xMlBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5JU09EYXlQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldElTT0RheS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gSVNPIGRheSBvZiB3ZWVrXG5jbGFzcyBJU09EYXlQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICAgIHJldHVybiA3O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAyXG4gICAgICBjYXNlIFwiaVwiOlxuICAgICAgY2FzZSBcImlpXCI6IC8vIDAyXG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICAgIC8vIDJuZFxuICAgICAgY2FzZSBcImlvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImlpaVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJpaWlpaVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiaWlpaWlpXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImlpaWlcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gNztcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZSA9ICgwLCBfaW5kZXguc2V0SVNPRGF5KShkYXRlLCB2YWx1ZSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcInlcIixcbiAgICBcIllcIixcbiAgICBcInVcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcIkVcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuSVNPRGF5UGFyc2VyID0gSVNPRGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLklTT1RpbWV6b25lUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vLi4vX2xpYi9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLmpzXCIpO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBUaW1lem9uZSAoSVNPLTg2MDEpXG5jbGFzcyBJU09UaW1lem9uZVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbE1pbnV0ZXMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ4eFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmJhc2ljLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwieHh4eFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxTZWNvbmRzLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwieHh4eHhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZE9wdGlvbmFsU2Vjb25kcyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInh4eFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBmbGFncywgdmFsdWUpIHtcbiAgICBpZiAoZmxhZ3MudGltZXN0YW1wSXNTZXQpIHJldHVybiBkYXRlO1xuICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKFxuICAgICAgZGF0ZSxcbiAgICAgIGRhdGUuZ2V0VGltZSgpIC1cbiAgICAgICAgKDAsIF9pbmRleDIuZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcykoZGF0ZSkgLVxuICAgICAgICB2YWx1ZSxcbiAgICApO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1widFwiLCBcIlRcIiwgXCJYXCJdO1xufVxuZXhwb3J0cy5JU09UaW1lem9uZVBhcnNlciA9IElTT1RpbWV6b25lUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLklTT1RpbWV6b25lV2l0aFpQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanNcIik7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIFRpbWV6b25lIChJU08tODYwMS4gKzAwOjAwIGlzIGAnWidgKVxuY2xhc3MgSVNPVGltZXpvbmVXaXRoWlBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbE1pbnV0ZXMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJYWFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmJhc2ljLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiWFhYWFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxTZWNvbmRzLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiWFhYWFhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZE9wdGlvbmFsU2Vjb25kcyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIlhYWFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBmbGFncywgdmFsdWUpIHtcbiAgICBpZiAoZmxhZ3MudGltZXN0YW1wSXNTZXQpIHJldHVybiBkYXRlO1xuICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKFxuICAgICAgZGF0ZSxcbiAgICAgIGRhdGUuZ2V0VGltZSgpIC1cbiAgICAgICAgKDAsIF9pbmRleDIuZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcykoZGF0ZSkgLVxuICAgICAgICB2YWx1ZSxcbiAgICApO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1widFwiLCBcIlRcIiwgXCJ4XCJdO1xufVxuZXhwb3J0cy5JU09UaW1lem9uZVdpdGhaUGFyc2VyID0gSVNPVGltZXpvbmVXaXRoWlBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5JU09XZWVrUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zZXRJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vLi4vc3RhcnRPZklTT1dlZWsuanNcIik7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIElTTyB3ZWVrIG9mIHllYXJcbmNsYXNzIElTT1dlZWtQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTAwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJJXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLndlZWssXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJJb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwid2Vla1wiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDUzO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleDIuc3RhcnRPZklTT1dlZWspKCgwLCBfaW5kZXguc2V0SVNPV2VlaykoZGF0ZSwgdmFsdWUpKTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcInlcIixcbiAgICBcIllcIixcbiAgICBcInVcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuSVNPV2Vla1BhcnNlciA9IElTT1dlZWtQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSVNPV2Vla1llYXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3N0YXJ0T2ZJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbmNsYXNzIElTT1dlZWtZZWFyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEzMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikge1xuICAgIGlmICh0b2tlbiA9PT0gXCJSXCIpIHtcbiAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0c1NpZ25lZCkoNCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzU2lnbmVkKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBjb25zdCBmaXJzdFdlZWtPZlllYXIgPSAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgICBmaXJzdFdlZWtPZlllYXIuc2V0RnVsbFllYXIodmFsdWUsIDAsIDQpO1xuICAgIGZpcnN0V2Vla09mWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5zdGFydE9mSVNPV2VlaykoZmlyc3RXZWVrT2ZZZWFyKTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIkdcIixcbiAgICBcInlcIixcbiAgICBcIllcIixcbiAgICBcInVcIixcbiAgICBcIlFcIixcbiAgICBcInFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuSVNPV2Vla1llYXJQYXJzZXIgPSBJU09XZWVrWWVhclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Mb2NhbERheVBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc2V0RGF5LmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBMb2NhbCBkYXkgb2Ygd2Vla1xuY2xhc3MgTG9jYWxEYXlQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUpID0+IHtcbiAgICAgIC8vIFdlIHdhbnQgaGVyZSBmbG9vciBpbnN0ZWFkIG9mIHRydW5jLCBzbyB3ZSBnZXQgLTcgZm9yIHZhbHVlIDAgaW5zdGVhZCBvZiAwXG4gICAgICBjb25zdCB3aG9sZVdlZWtEYXlzID0gTWF0aC5mbG9vcigodmFsdWUgLSAxKSAvIDcpICogNztcbiAgICAgIHJldHVybiAoKHZhbHVlICsgb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA2KSAlIDcpICsgd2hvbGVXZWVrRGF5cztcbiAgICB9O1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gM1xuICAgICAgY2FzZSBcImVcIjpcbiAgICAgIGNhc2UgXCJlZVwiOiAvLyAwM1xuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDNyZFxuICAgICAgY2FzZSBcImVvXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHVuaXQ6IFwiZGF5XCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImVlZVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJlZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiZWVlZVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gNjtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgZGF0ZSA9ICgwLCBfaW5kZXguc2V0RGF5KShkYXRlLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcInlcIixcbiAgICBcIlJcIixcbiAgICBcInVcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcIkVcIixcbiAgICBcImlcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuTG9jYWxEYXlQYXJzZXIgPSBMb2NhbERheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Mb2NhbFdlZWtQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldFdlZWsuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zdGFydE9mV2Vlay5qc1wiKTtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gTG9jYWwgd2VlayBvZiB5ZWFyXG5jbGFzcyBMb2NhbFdlZWtQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTAwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJ3XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLndlZWssXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ3b1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwid2Vla1wiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDUzO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleDIuc3RhcnRPZldlZWspKFxuICAgICAgKDAsIF9pbmRleC5zZXRXZWVrKShkYXRlLCB2YWx1ZSwgb3B0aW9ucyksXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJ5XCIsXG4gICAgXCJSXCIsXG4gICAgXCJ1XCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLkxvY2FsV2Vla1BhcnNlciA9IExvY2FsV2Vla1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Mb2NhbFdlZWtZZWFyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9nZXRXZWVrWWVhci5qc1wiKTtcblxudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vLi4vc3RhcnRPZldlZWsuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJcbmNsYXNzIExvY2FsV2Vla1llYXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTMwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAoeWVhcikgPT4gKHtcbiAgICAgIHllYXIsXG4gICAgICBpc1R3b0RpZ2l0WWVhcjogdG9rZW4gPT09IFwiWVlcIixcbiAgICB9KTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJZXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykoNCwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJZb1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcInllYXJcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmlzVHdvRGlnaXRZZWFyIHx8IHZhbHVlLnllYXIgPiAwO1xuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gKDAsIF9pbmRleC5nZXRXZWVrWWVhcikoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUuaXNUd29EaWdpdFllYXIpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUd29EaWdpdFllYXIgPSAoMCwgX3V0aWxzLm5vcm1hbGl6ZVR3b0RpZ2l0WWVhcikoXG4gICAgICAgIHZhbHVlLnllYXIsXG4gICAgICAgIGN1cnJlbnRZZWFyLFxuICAgICAgKTtcbiAgICAgIGRhdGUuc2V0RnVsbFllYXIoXG4gICAgICAgIG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsXG4gICAgICAgIDAsXG4gICAgICAgIG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlLFxuICAgICAgKTtcbiAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleDIuc3RhcnRPZldlZWspKGRhdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHllYXIgPVxuICAgICAgIShcImVyYVwiIGluIGZsYWdzKSB8fCBmbGFncy5lcmEgPT09IDEgPyB2YWx1ZS55ZWFyIDogMSAtIHZhbHVlLnllYXI7XG4gICAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCAwLCBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gKDAsIF9pbmRleDIuc3RhcnRPZldlZWspKGRhdGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiUlwiLFxuICAgIFwidVwiLFxuICAgIFwiUVwiLFxuICAgIFwicVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5Mb2NhbFdlZWtZZWFyUGFyc2VyID0gTG9jYWxXZWVrWWVhclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5NaW51dGVQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIE1pbnV0ZVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA2MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5taW51dGUsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJtb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwibWludXRlXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gNTk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TWludXRlcyh2YWx1ZSwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuTWludXRlUGFyc2VyID0gTWludXRlUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLk1vbnRoUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBNb250aFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiWVwiLFxuICAgIFwiUlwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiSVwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xuXG4gIHByaW9yaXR5ID0gMTEwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUpID0+IHZhbHVlIC0gMTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMubW9udGgsXG4gICAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykoMiwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcbiAgICAgIGNhc2UgXCJNb1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcIm1vbnRoXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgXCJNTU1NXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTE7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TW9udGgodmFsdWUsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbn1cbmV4cG9ydHMuTW9udGhQYXJzZXIgPSBNb250aFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5RdWFydGVyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBRdWFydGVyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEyMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwiUVwiOlxuICAgICAgY2FzZSBcIlFRXCI6IC8vIDAxLCAwMiwgMDMsIDA0XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuICAgICAgY2FzZSBcIlFvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJxdWFydGVyXCIgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuICAgICAgY2FzZSBcIlFRUVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcIlFRUVFRXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcIlFRUVFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gNDtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNb250aCgodmFsdWUgLSAxKSAqIDMsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJZXCIsXG4gICAgXCJSXCIsXG4gICAgXCJxXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLlF1YXJ0ZXJQYXJzZXIgPSBRdWFydGVyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlNlY29uZFBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgU2Vjb25kUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDUwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLnNlY29uZCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInNvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJzZWNvbmRcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA1OTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRTZWNvbmRzKHZhbHVlLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5TZWNvbmRQYXJzZXIgPSBTZWNvbmRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zZXREYXkuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG5jbGFzcyBTdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gV2Ugd2FudCBoZXJlIGZsb29yIGluc3RlYWQgb2YgdHJ1bmMsIHNvIHdlIGdldCAtNyBmb3IgdmFsdWUgMCBpbnN0ZWFkIG9mIDBcbiAgICAgIGNvbnN0IHdob2xlV2Vla0RheXMgPSBNYXRoLmZsb29yKCh2YWx1ZSAtIDEpIC8gNykgKiA3O1xuICAgICAgcmV0dXJuICgodmFsdWUgKyBvcHRpb25zLndlZWtTdGFydHNPbiArIDYpICUgNykgKyB3aG9sZVdlZWtEYXlzO1xuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAzXG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgY2FzZSBcImNjXCI6IC8vIDAzXG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gM3JkXG4gICAgICBjYXNlIFwiY29cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgdW5pdDogXCJkYXlcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiY2NjXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImNjY2NjY1wiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA2O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBkYXRlID0gKDAsIF9pbmRleC5zZXREYXkpKGRhdGUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiUlwiLFxuICAgIFwidVwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiRVwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIgPSBTdGFuZEFsb25lTG9jYWxEYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuU3RhbmRBbG9uZU1vbnRoUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBTdGFuZEFsb25lTW9udGhQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTEwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUpID0+IHZhbHVlIC0gMTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMubW9udGgsXG4gICAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykoMiwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcbiAgICAgIGNhc2UgXCJMb1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcIm1vbnRoXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTE7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TW9udGgodmFsdWUsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJZXCIsXG4gICAgXCJSXCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJJXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLlN0YW5kQWxvbmVNb250aFBhcnNlciA9IFN0YW5kQWxvbmVNb250aFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5TdGFuZEFsb25lUXVhcnRlclBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTIwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICBjYXNlIFwicXFcIjogLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwicW9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwicXFxXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwicXFxcXFcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwicXFxcVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSA0O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1vbnRoKCh2YWx1ZSAtIDEpICogMywgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIllcIixcbiAgICBcIlJcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIgPSBTdGFuZEFsb25lUXVhcnRlclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIFRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAyMDtcblxuICBwYXJzZShkYXRlU3RyaW5nKSB7XG4gICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VBbnlEaWdpdHNTaWduZWQpKGRhdGVTdHJpbmcpO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICByZXR1cm4gWygwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgdmFsdWUpLCB7IHRpbWVzdGFtcElzU2V0OiB0cnVlIH1dO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gXCIqXCI7XG59XG5leHBvcnRzLlRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlciA9IFRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5UaW1lc3RhbXBTZWNvbmRzUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBUaW1lc3RhbXBTZWNvbmRzUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDQwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcpIHtcbiAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZUFueURpZ2l0c1NpZ25lZCkoZGF0ZVN0cmluZyk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIHJldHVybiBbXG4gICAgICAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIHZhbHVlICogMTAwMCksXG4gICAgICB7IHRpbWVzdGFtcElzU2V0OiB0cnVlIH0sXG4gICAgXTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFwiKlwiO1xufVxuZXhwb3J0cy5UaW1lc3RhbXBTZWNvbmRzUGFyc2VyID0gVGltZXN0YW1wU2Vjb25kc1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5ZZWFyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBGcm9tIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtMzEvdHIzNS1kYXRlcy5odG1sI0RhdGVfRm9ybWF0X1BhdHRlcm5zXG4vLyB8IFllYXIgICAgIHwgICAgIHkgfCB5eSB8ICAgeXl5IHwgIHl5eXkgfCB5eXl5eSB8XG4vLyB8LS0tLS0tLS0tLXwtLS0tLS0tfC0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18XG4vLyB8IEFEIDEgICAgIHwgICAgIDEgfCAwMSB8ICAgMDAxIHwgIDAwMDEgfCAwMDAwMSB8XG4vLyB8IEFEIDEyICAgIHwgICAgMTIgfCAxMiB8ICAgMDEyIHwgIDAwMTIgfCAwMDAxMiB8XG4vLyB8IEFEIDEyMyAgIHwgICAxMjMgfCAyMyB8ICAgMTIzIHwgIDAxMjMgfCAwMDEyMyB8XG4vLyB8IEFEIDEyMzQgIHwgIDEyMzQgfCAzNCB8ICAxMjM0IHwgIDEyMzQgfCAwMTIzNCB8XG4vLyB8IEFEIDEyMzQ1IHwgMTIzNDUgfCA0NSB8IDEyMzQ1IHwgMTIzNDUgfCAxMjM0NSB8XG5jbGFzcyBZZWFyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEzMDtcbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiWVwiLCBcIlJcIiwgXCJ1XCIsIFwid1wiLCBcIklcIiwgXCJpXCIsIFwiZVwiLCBcImNcIiwgXCJ0XCIsIFwiVFwiXTtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHllYXIpID0+ICh7XG4gICAgICB5ZWFyLFxuICAgICAgaXNUd29EaWdpdFllYXI6IHRva2VuID09PSBcInl5XCIsXG4gICAgfSk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwieVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKDQsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwieW9cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgdW5pdDogXCJ5ZWFyXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5pc1R3b0RpZ2l0WWVhciB8fCB2YWx1ZS55ZWFyID4gMDtcbiAgfVxuXG4gIHNldChkYXRlLCBmbGFncywgdmFsdWUpIHtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblxuICAgIGlmICh2YWx1ZS5pc1R3b0RpZ2l0WWVhcikge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR3b0RpZ2l0WWVhciA9ICgwLCBfdXRpbHMubm9ybWFsaXplVHdvRGlnaXRZZWFyKShcbiAgICAgICAgdmFsdWUueWVhcixcbiAgICAgICAgY3VycmVudFllYXIsXG4gICAgICApO1xuICAgICAgZGF0ZS5zZXRGdWxsWWVhcihub3JtYWxpemVkVHdvRGlnaXRZZWFyLCAwLCAxKTtcbiAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCB5ZWFyID1cbiAgICAgICEoXCJlcmFcIiBpbiBmbGFncykgfHwgZmxhZ3MuZXJhID09PSAxID8gdmFsdWUueWVhciA6IDEgLSB2YWx1ZS55ZWFyO1xuICAgIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgMCwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufVxuZXhwb3J0cy5ZZWFyUGFyc2VyID0gWWVhclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5kYXlQZXJpb2RFbnVtVG9Ib3VycyA9IGRheVBlcmlvZEVudW1Ub0hvdXJzO1xuZXhwb3J0cy5pc0xlYXBZZWFySW5kZXggPSBpc0xlYXBZZWFySW5kZXg7XG5leHBvcnRzLm1hcFZhbHVlID0gbWFwVmFsdWU7XG5leHBvcnRzLm5vcm1hbGl6ZVR3b0RpZ2l0WWVhciA9IG5vcm1hbGl6ZVR3b0RpZ2l0WWVhcjtcbmV4cG9ydHMucGFyc2VBbnlEaWdpdHNTaWduZWQgPSBwYXJzZUFueURpZ2l0c1NpZ25lZDtcbmV4cG9ydHMucGFyc2VORGlnaXRzID0gcGFyc2VORGlnaXRzO1xuZXhwb3J0cy5wYXJzZU5EaWdpdHNTaWduZWQgPSBwYXJzZU5EaWdpdHNTaWduZWQ7XG5leHBvcnRzLnBhcnNlTnVtZXJpY1BhdHRlcm4gPSBwYXJzZU51bWVyaWNQYXR0ZXJuO1xuZXhwb3J0cy5wYXJzZVRpbWV6b25lUGF0dGVybiA9IHBhcnNlVGltZXpvbmVQYXR0ZXJuO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi9jb25zdGFudHMuanNcIik7XG5cbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xuXG5mdW5jdGlvbiBtYXBWYWx1ZShwYXJzZUZuUmVzdWx0LCBtYXBGbikge1xuICBpZiAoIXBhcnNlRm5SZXN1bHQpIHtcbiAgICByZXR1cm4gcGFyc2VGblJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmFsdWU6IG1hcEZuKHBhcnNlRm5SZXN1bHQudmFsdWUpLFxuICAgIHJlc3Q6IHBhcnNlRm5SZXN1bHQucmVzdCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1lcmljUGF0dGVybihwYXR0ZXJuLCBkYXRlU3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoUmVzdWx0ID0gZGF0ZVN0cmluZy5tYXRjaChwYXR0ZXJuKTtcblxuICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZhbHVlOiBwYXJzZUludChtYXRjaFJlc3VsdFswXSwgMTApLFxuICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UobWF0Y2hSZXN1bHRbMF0ubGVuZ3RoKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lem9uZVBhdHRlcm4ocGF0dGVybiwgZGF0ZVN0cmluZykge1xuICBjb25zdCBtYXRjaFJlc3VsdCA9IGRhdGVTdHJpbmcubWF0Y2gocGF0dGVybik7XG5cbiAgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gSW5wdXQgaXMgJ1onXG4gIGlmIChtYXRjaFJlc3VsdFswXSA9PT0gXCJaXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IDAsXG4gICAgICByZXN0OiBkYXRlU3RyaW5nLnNsaWNlKDEpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBzaWduID0gbWF0Y2hSZXN1bHRbMV0gPT09IFwiK1wiID8gMSA6IC0xO1xuICBjb25zdCBob3VycyA9IG1hdGNoUmVzdWx0WzJdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbMl0sIDEwKSA6IDA7XG4gIGNvbnN0IG1pbnV0ZXMgPSBtYXRjaFJlc3VsdFszXSA/IHBhcnNlSW50KG1hdGNoUmVzdWx0WzNdLCAxMCkgOiAwO1xuICBjb25zdCBzZWNvbmRzID0gbWF0Y2hSZXN1bHRbNV0gPyBwYXJzZUludChtYXRjaFJlc3VsdFs1XSwgMTApIDogMDtcblxuICByZXR1cm4ge1xuICAgIHZhbHVlOlxuICAgICAgc2lnbiAqXG4gICAgICAoaG91cnMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5Ib3VyICtcbiAgICAgICAgbWludXRlcyAqIF9pbmRleC5taWxsaXNlY29uZHNJbk1pbnV0ZSArXG4gICAgICAgIHNlY29uZHMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5TZWNvbmQpLFxuICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UobWF0Y2hSZXN1bHRbMF0ubGVuZ3RoKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBbnlEaWdpdHNTaWduZWQoZGF0ZVN0cmluZykge1xuICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5hbnlEaWdpdHNTaWduZWQsXG4gICAgZGF0ZVN0cmluZyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VORGlnaXRzKG4sIGRhdGVTdHJpbmcpIHtcbiAgc3dpdGNoIChuKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLnNpbmdsZURpZ2l0LFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMudHdvRGlnaXRzLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMudGhyZWVEaWdpdHMsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5mb3VyRGlnaXRzLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obmV3IFJlZ0V4cChcIl5cXFxcZHsxLFwiICsgbiArIFwifVwiKSwgZGF0ZVN0cmluZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VORGlnaXRzU2lnbmVkKG4sIGRhdGVTdHJpbmcpIHtcbiAgc3dpdGNoIChuKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLnNpbmdsZURpZ2l0U2lnbmVkLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMudHdvRGlnaXRzU2lnbmVkLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMudGhyZWVEaWdpdHNTaWduZWQsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5mb3VyRGlnaXRzU2lnbmVkLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obmV3IFJlZ0V4cChcIl4tP1xcXFxkezEsXCIgKyBuICsgXCJ9XCIpLCBkYXRlU3RyaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkYXlQZXJpb2RFbnVtVG9Ib3VycyhkYXlQZXJpb2QpIHtcbiAgc3dpdGNoIChkYXlQZXJpb2QpIHtcbiAgICBjYXNlIFwibW9ybmluZ1wiOlxuICAgICAgcmV0dXJuIDQ7XG4gICAgY2FzZSBcImV2ZW5pbmdcIjpcbiAgICAgIHJldHVybiAxNztcbiAgICBjYXNlIFwicG1cIjpcbiAgICBjYXNlIFwibm9vblwiOlxuICAgIGNhc2UgXCJhZnRlcm5vb25cIjpcbiAgICAgIHJldHVybiAxMjtcbiAgICBjYXNlIFwiYW1cIjpcbiAgICBjYXNlIFwibWlkbmlnaHRcIjpcbiAgICBjYXNlIFwibmlnaHRcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVHdvRGlnaXRZZWFyKHR3b0RpZ2l0WWVhciwgY3VycmVudFllYXIpIHtcbiAgY29uc3QgaXNDb21tb25FcmEgPSBjdXJyZW50WWVhciA+IDA7XG4gIC8vIEFic29sdXRlIG51bWJlciBvZiB0aGUgY3VycmVudCB5ZWFyOlxuICAvLyAxIC0+IDEgQUNcbiAgLy8gMCAtPiAxIEJDXG4gIC8vIC0xIC0+IDIgQkNcbiAgY29uc3QgYWJzQ3VycmVudFllYXIgPSBpc0NvbW1vbkVyYSA/IGN1cnJlbnRZZWFyIDogMSAtIGN1cnJlbnRZZWFyO1xuXG4gIGxldCByZXN1bHQ7XG4gIGlmIChhYnNDdXJyZW50WWVhciA8PSA1MCkge1xuICAgIHJlc3VsdCA9IHR3b0RpZ2l0WWVhciB8fCAxMDA7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmFuZ2VFbmQgPSBhYnNDdXJyZW50WWVhciArIDUwO1xuICAgIGNvbnN0IHJhbmdlRW5kQ2VudHVyeSA9IE1hdGgudHJ1bmMocmFuZ2VFbmQgLyAxMDApICogMTAwO1xuICAgIGNvbnN0IGlzUHJldmlvdXNDZW50dXJ5ID0gdHdvRGlnaXRZZWFyID49IHJhbmdlRW5kICUgMTAwO1xuICAgIHJlc3VsdCA9IHR3b0RpZ2l0WWVhciArIHJhbmdlRW5kQ2VudHVyeSAtIChpc1ByZXZpb3VzQ2VudHVyeSA/IDEwMCA6IDApO1xuICB9XG5cbiAgcmV0dXJuIGlzQ29tbW9uRXJhID8gcmVzdWx0IDogMSAtIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNMZWFwWWVhckluZGV4KHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0MDAgPT09IDAgfHwgKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldCA9IHNldDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zZXRNb250aC5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgZGF0ZSB2YWx1ZXMgdG8gYSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IGRhdGUgdmFsdWVzIHRvIGEgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBTZXRzIHRpbWUgdmFsdWVzIHRvIGRhdGUgZnJvbSBvYmplY3QgYHZhbHVlc2AuXG4gKiBBIHZhbHVlIGlzIG5vdCBzZXQgaWYgaXQgaXMgdW5kZWZpbmVkIG9yIG51bGwgb3IgZG9lc24ndCBleGlzdCBpbiBgdmFsdWVzYC5cbiAqXG4gKiBOb3RlIGFib3V0IGJ1bmRsZSBzaXplOiBgc2V0YCBkb2VzIG5vdCBpbnRlcm5hbGx5IHVzZSBgc2V0WGAgZnVuY3Rpb25zIGZyb20gZGF0ZS1mbnMgYnV0IGluc3RlYWQgb3B0c1xuICogdG8gdXNlIG5hdGl2ZSBgRGF0ZSNzZXRYYCBtZXRob2RzLiBJZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24sIHlvdSBtYXkgbm90IHdhbnQgdG8gaW5jbHVkZSB0aGVcbiAqIG90aGVyIGBzZXRYYCBmdW5jdGlvbnMgdGhhdCBkYXRlLWZucyBwcm92aWRlcyBpZiB5b3UgYXJlIGNvbmNlcm5lZCBhYm91dCB0aGUgYnVuZGxlIHNpemUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIGRhdGUgdmFsdWVzIHRvIGJlIHNldFxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIG9wdGlvbnMgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRyYW5zZm9ybSAxIFNlcHRlbWJlciAyMDE0IGludG8gMjAgT2N0b2JlciAyMDE1IGluIGEgc2luZ2xlIGxpbmU6XG4gKiBjb25zdCByZXN1bHQgPSBzZXQobmV3IERhdGUoMjAxNCwgOCwgMjApLCB7IHllYXI6IDIwMTUsIG1vbnRoOiA5LCBkYXRlOiAyMCB9KVxuICogLy89PiBUdWUgT2N0IDIwIDIwMTUgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IDEyIFBNIHRvIDEgU2VwdGVtYmVyIDIwMTQgMDE6MjM6NDUgdG8gMSBTZXB0ZW1iZXIgMjAxNCAxMjowMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldChuZXcgRGF0ZSgyMDE0LCA4LCAxLCAxLCAyMywgNDUpLCB7IGhvdXJzOiAxMiB9KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMTI6MjM6NDVcbiAqL1xuXG5mdW5jdGlvbiBzZXQoZGF0ZSwgdmFsdWVzKSB7XG4gIGxldCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnRvRGF0ZSkoZGF0ZSk7XG5cbiAgLy8gQ2hlY2sgaWYgZGF0ZSBpcyBJbnZhbGlkIERhdGUgYmVjYXVzZSBEYXRlLnByb3RvdHlwZS5zZXRGdWxsWWVhciBpZ25vcmVzIHRoZSB2YWx1ZSBvZiBJbnZhbGlkIERhdGVcbiAgaWYgKGlzTmFOKCtfZGF0ZSkpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCBOYU4pO1xuICB9XG5cbiAgaWYgKHZhbHVlcy55ZWFyICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZXMueWVhcik7XG4gIH1cblxuICBpZiAodmFsdWVzLm1vbnRoICE9IG51bGwpIHtcbiAgICBfZGF0ZSA9ICgwLCBfaW5kZXgyLnNldE1vbnRoKShfZGF0ZSwgdmFsdWVzLm1vbnRoKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMuZGF0ZSAhPSBudWxsKSB7XG4gICAgX2RhdGUuc2V0RGF0ZSh2YWx1ZXMuZGF0ZSk7XG4gIH1cblxuICBpZiAodmFsdWVzLmhvdXJzICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXRIb3Vycyh2YWx1ZXMuaG91cnMpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5taW51dGVzICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXRNaW51dGVzKHZhbHVlcy5taW51dGVzKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMuc2Vjb25kcyAhPSBudWxsKSB7XG4gICAgX2RhdGUuc2V0U2Vjb25kcyh2YWx1ZXMuc2Vjb25kcyk7XG4gIH1cblxuICBpZiAodmFsdWVzLm1pbGxpc2Vjb25kcyAhPSBudWxsKSB7XG4gICAgX2RhdGUuc2V0TWlsbGlzZWNvbmRzKHZhbHVlcy5taWxsaXNlY29uZHMpO1xuICB9XG5cbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldERheSA9IHNldERheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGREYXlzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHNldERheX0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHNldERheVxuICogQGNhdGVnb3J5IFdlZWtkYXkgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIGRheSBvZiB0aGUgd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBkYXkgLSBUaGUgZGF5IG9mIHRoZSB3ZWVrIG9mIHRoZSBuZXcgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBkYXkgb2YgdGhlIHdlZWsgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB3ZWVrIGRheSB0byBTdW5kYXksIHdpdGggdGhlIGRlZmF1bHQgd2Vla1N0YXJ0c09uIG9mIFN1bmRheTpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldERheShuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMClcbiAqIC8vPT4gU3VuIEF1ZyAzMSAyMDE0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB3ZWVrIGRheSB0byBTdW5kYXksIHdpdGggYSB3ZWVrU3RhcnRzT24gb2YgTW9uZGF5OlxuICogY29uc3QgcmVzdWx0ID0gc2V0RGF5KG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAwLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBTdW4gU2VwIDA3IDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0RGF5KGRhdGUsIGRheSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXgzLmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgY3VycmVudERheSA9IF9kYXRlLmdldERheSgpO1xuXG4gIGNvbnN0IHJlbWFpbmRlciA9IGRheSAlIDc7XG4gIGNvbnN0IGRheUluZGV4ID0gKHJlbWFpbmRlciArIDcpICUgNztcblxuICBjb25zdCBkZWx0YSA9IDcgLSB3ZWVrU3RhcnRzT247XG4gIGNvbnN0IGRpZmYgPVxuICAgIGRheSA8IDAgfHwgZGF5ID4gNlxuICAgICAgPyBkYXkgLSAoKGN1cnJlbnREYXkgKyBkZWx0YSkgJSA3KVxuICAgICAgOiAoKGRheUluZGV4ICsgZGVsdGEpICUgNykgLSAoKGN1cnJlbnREYXkgKyBkZWx0YSkgJSA3KTtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkRGF5cykoX2RhdGUsIGRpZmYpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldEhvdXJzID0gc2V0SG91cnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldEhvdXJzXG4gKiBAY2F0ZWdvcnkgSG91ciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBob3VycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBob3VycyAtIFRoZSBob3VycyBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgaG91cnMgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCA0IGhvdXJzIHRvIDEgU2VwdGVtYmVyIDIwMTQgMTE6MzA6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRIb3VycyhuZXcgRGF0ZSgyMDE0LCA4LCAxLCAxMSwgMzApLCA0KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDQ6MzA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0SG91cnMoZGF0ZSwgaG91cnMpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldEhvdXJzKGhvdXJzKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldElTT0RheSA9IHNldElTT0RheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGREYXlzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9nZXRJU09EYXkuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRJU09EYXlcbiAqIEBjYXRlZ29yeSBXZWVrZGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgZGF5IG9mIHRoZSBJU08gd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgZGF5IG9mIHRoZSBJU08gd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIElTTyB3ZWVrIHN0YXJ0cyB3aXRoIE1vbmRheS5cbiAqIDcgaXMgdGhlIGluZGV4IG9mIFN1bmRheSwgMSBpcyB0aGUgaW5kZXggb2YgTW9uZGF5IGV0Yy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBkYXkgLSBUaGUgZGF5IG9mIHRoZSBJU08gd2VlayBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5IG9mIHRoZSBJU08gd2VlayBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IFN1bmRheSB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc2V0SVNPRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA3KVxuICogLy89PiBTdW4gU2VwIDA3IDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0SVNPRGF5KGRhdGUsIGRheSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGN1cnJlbnREYXkgPSAoMCwgX2luZGV4Mi5nZXRJU09EYXkpKF9kYXRlKTtcbiAgY29uc3QgZGlmZiA9IGRheSAtIGN1cnJlbnREYXk7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZERheXMpKF9kYXRlLCBkaWZmKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRJU09XZWVrID0gc2V0SVNPV2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9nZXRJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0SVNPV2Vla1xuICogQGNhdGVnb3J5IElTTyBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgSVNPIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIElTTyB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLCBzYXZpbmcgdGhlIHdlZWtkYXkgbnVtYmVyLlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB3ZWVrIC0gVGhlIElTTyB3ZWVrIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBJU08gd2VlayBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHRoZSA1M3JkIElTTyB3ZWVrIHRvIDcgQXVndXN0IDIwMDQ6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRJU09XZWVrKG5ldyBEYXRlKDIwMDQsIDcsIDcpLCA1MylcbiAqIC8vPT4gU2F0IEphbiAwMSAyMDA1IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldElTT1dlZWsoZGF0ZSwgd2Vlaykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPSAoMCwgX2luZGV4LmdldElTT1dlZWspKF9kYXRlKSAtIHdlZWs7XG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZiAqIDcpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0TWludXRlcyA9IHNldE1pbnV0ZXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldE1pbnV0ZXNcbiAqIEBjYXRlZ29yeSBNaW51dGUgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBtaW51dGVzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBtaW51dGVzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIG1pbnV0ZXMgLSBUaGUgbWludXRlcyBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbWludXRlcyBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IDQ1IG1pbnV0ZXMgdG8gMSBTZXB0ZW1iZXIgMjAxNCAxMTozMDo0MDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldE1pbnV0ZXMobmV3IERhdGUoMjAxNCwgOCwgMSwgMTEsIDMwLCA0MCksIDQ1KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMTE6NDU6NDBcbiAqL1xuZnVuY3Rpb24gc2V0TWludXRlcyhkYXRlLCBtaW51dGVzKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBfZGF0ZS5zZXRNaW51dGVzKG1pbnV0ZXMpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0TW9udGggPSBzZXRNb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9nZXREYXlzSW5Nb250aC5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldE1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBtb250aCB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgbW9udGggdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gbW9udGggLSBUaGUgbW9udGggaW5kZXggdG8gc2V0ICgwLTExKVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtb250aCBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IEZlYnJ1YXJ5IHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMSlcbiAqIC8vPT4gU2F0IEZlYiAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldE1vbnRoKGRhdGUsIG1vbnRoKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERhdGUoKTtcblxuICBjb25zdCBkYXRlV2l0aERlc2lyZWRNb250aCA9ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGRhdGVXaXRoRGVzaXJlZE1vbnRoLnNldEZ1bGxZZWFyKHllYXIsIG1vbnRoLCAxNSk7XG4gIGRhdGVXaXRoRGVzaXJlZE1vbnRoLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBkYXlzSW5Nb250aCA9ICgwLCBfaW5kZXgyLmdldERheXNJbk1vbnRoKShkYXRlV2l0aERlc2lyZWRNb250aCk7XG4gIC8vIFNldCB0aGUgbGFzdCBkYXkgb2YgdGhlIG5ldyBtb250aFxuICAvLyBpZiB0aGUgb3JpZ2luYWwgZGF0ZSB3YXMgdGhlIGxhc3QgZGF5IG9mIHRoZSBsb25nZXIgbW9udGhcbiAgX2RhdGUuc2V0TW9udGgobW9udGgsIE1hdGgubWluKGRheSwgZGF5c0luTW9udGgpKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldFF1YXJ0ZXIgPSBzZXRRdWFydGVyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3NldE1vbnRoLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0UXVhcnRlclxuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSB5ZWFyIHF1YXJ0ZXIgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIHllYXIgcXVhcnRlciB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBxdWFydGVyIC0gVGhlIHF1YXJ0ZXIgb2YgdGhlIG5ldyBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHF1YXJ0ZXIgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB0aGUgMm5kIHF1YXJ0ZXIgdG8gMiBKdWx5IDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRRdWFydGVyKG5ldyBEYXRlKDIwMTQsIDYsIDIpLCAyKVxuICogLy89PiBXZWQgQXByIDAyIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0UXVhcnRlcihkYXRlLCBxdWFydGVyKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcbiAgY29uc3Qgb2xkUXVhcnRlciA9IE1hdGgudHJ1bmMoX2RhdGUuZ2V0TW9udGgoKSAvIDMpICsgMTtcbiAgY29uc3QgZGlmZiA9IHF1YXJ0ZXIgLSBvbGRRdWFydGVyO1xuICByZXR1cm4gKDAsIF9pbmRleC5zZXRNb250aCkoX2RhdGUsIF9kYXRlLmdldE1vbnRoKCkgKyBkaWZmICogMyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0U2Vjb25kcyA9IHNldFNlY29uZHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldFNlY29uZHNcbiAqIEBjYXRlZ29yeSBTZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHNlY29uZHMgLSBUaGUgc2Vjb25kcyBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgc2Vjb25kcyBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IDQ1IHNlY29uZHMgdG8gMSBTZXB0ZW1iZXIgMjAxNCAxMTozMDo0MDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFNlY29uZHMobmV3IERhdGUoMjAxNCwgOCwgMSwgMTEsIDMwLCA0MCksIDQ1KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMTE6MzA6NDVcbiAqL1xuZnVuY3Rpb24gc2V0U2Vjb25kcyhkYXRlLCBzZWNvbmRzKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBfZGF0ZS5zZXRTZWNvbmRzKHNlY29uZHMpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0V2VlayA9IHNldFdlZWs7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vZ2V0V2Vlay5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc2V0V2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHNldFdlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgbG9jYWwgd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgbG9jYWwgd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZSwgc2F2aW5nIHRoZSB3ZWVrZGF5IG51bWJlci5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB3ZWVrIC0gVGhlIHdlZWsgb2YgdGhlIG5ldyBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbG9jYWwgd2VlayBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHRoZSAxc3Qgd2VlayB0byAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9uczpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMiksIDEpXG4gKiAvLz0+IFN1biBEZWMgMjYgMjAwNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgdGhlIDFzdCB3ZWVrIHRvIDIgSmFudWFyeSAyMDA1LFxuICogLy8gaWYgTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWssXG4gKiAvLyBhbmQgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIgYWx3YXlzIGNvbnRhaW5zIDQgSmFudWFyeTpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMiksIDEsIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxLFxuICogICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDRcbiAqIH0pXG4gKiAvLz0+IFN1biBKYW4gNCAyMDA0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldFdlZWsoZGF0ZSwgd2Vlaywgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPSAoMCwgX2luZGV4LmdldFdlZWspKF9kYXRlLCBvcHRpb25zKSAtIHdlZWs7XG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZiAqIDcpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0WWVhciA9IHNldFllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldFllYXJcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgeWVhciB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgeWVhciB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB5ZWFyIC0gVGhlIHllYXIgb2YgdGhlIG5ldyBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHllYXIgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB5ZWFyIDIwMTMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFllYXIobmV3IERhdGUoMjAxNCwgOCwgMSksIDIwMTMpXG4gKiAvLz0+IFN1biBTZXAgMDEgMjAxMyAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXRZZWFyKGRhdGUsIHllYXIpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGUpO1xuXG4gIC8vIENoZWNrIGlmIGRhdGUgaXMgSW52YWxpZCBEYXRlIGJlY2F1c2UgRGF0ZS5wcm90b3R5cGUuc2V0RnVsbFllYXIgaWdub3JlcyB0aGUgdmFsdWUgb2YgSW52YWxpZCBEYXRlXG4gIGlmIChpc05hTigrX2RhdGUpKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgTmFOKTtcbiAgfVxuXG4gIF9kYXRlLnNldEZ1bGxZZWFyKHllYXIpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZEYXlcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIGRheVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSBkYXkgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFR1ZSBTZXAgMDIgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mRGF5KGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZklTT1dlZWsgPSBzdGFydE9mSVNPV2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9zdGFydE9mV2Vlay5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mSVNPV2Vla1xuICogQGNhdGVnb3J5IElTTyBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZJU09XZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mSVNPV2VlayhkYXRlKSB7XG4gIHJldHVybiAoMCwgX2luZGV4LnN0YXJ0T2ZXZWVrKShkYXRlLCB7IHdlZWtTdGFydHNPbjogMSB9KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mSVNPV2Vla1llYXIgPSBzdGFydE9mSVNPV2Vla1llYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vZ2V0SVNPV2Vla1llYXIuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcixcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1OlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUpIHtcbiAgY29uc3QgeWVhciA9ICgwLCBfaW5kZXguZ2V0SVNPV2Vla1llYXIpKGRhdGUpO1xuICBjb25zdCBmb3VydGhPZkphbnVhcnkgPSAoMCwgX2luZGV4My5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldEZ1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiAoMCwgX2luZGV4Mi5zdGFydE9mSVNPV2VlaykoZm91cnRoT2ZKYW51YXJ5KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mTW9udGggPSBzdGFydE9mTW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgbW9udGhcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgbW9udGggZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZNb250aChkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBfZGF0ZS5zZXREYXRlKDEpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZRdWFydGVyID0gc3RhcnRPZlF1YXJ0ZXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZRdWFydGVyXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBxdWFydGVyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSB5ZWFyIHF1YXJ0ZXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgcXVhcnRlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSBxdWFydGVyIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZlF1YXJ0ZXIobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIEp1bCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZRdWFydGVyKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGN1cnJlbnRNb250aCA9IF9kYXRlLmdldE1vbnRoKCk7XG4gIGNvbnN0IG1vbnRoID0gY3VycmVudE1vbnRoIC0gKGN1cnJlbnRNb250aCAlIDMpO1xuICBfZGF0ZS5zZXRNb250aChtb250aCwgMSk7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZldlZWsgPSBzdGFydE9mV2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gU3VuIEF1ZyAzMSAyMDE0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksIHRoZSBzdGFydCBvZiB0aGUgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCksIHsgd2Vla1N0YXJ0c09uOiAxIH0pXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDIuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpO1xuICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcblxuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZXZWVrWWVhciA9IHN0YXJ0T2ZXZWVrWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9nZXRXZWVrWWVhci5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vc3RhcnRPZldlZWsuanNcIik7XG5cbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrWWVhclxuICogQGNhdGVnb3J5IFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gYSB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciAyIEp1bHkgMjAwNSB3aXRoIGRlZmF1bHQgc2V0dGluZ3M6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2Vla1llYXIobmV3IERhdGUoMjAwNSwgNiwgMikpXG4gKiAvLz0+IFN1biBEZWMgMjYgMjAwNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciAyIEp1bHkgMjAwNVxuICogLy8gaWYgTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2Ygd2Vla1xuICogLy8gYW5kIDQgSmFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXI6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2Vla1llYXIobmV3IERhdGUoMjAwNSwgNiwgMiksIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxLFxuICogICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDRcbiAqIH0pXG4gKiAvLz0+IE1vbiBKYW4gMDMgMjAwNSAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXg0LmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IHllYXIgPSAoMCwgX2luZGV4Mi5nZXRXZWVrWWVhcikoZGF0ZSwgb3B0aW9ucyk7XG4gIGNvbnN0IGZpcnN0V2VlayA9ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGZpcnN0V2Vlay5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWsuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMuc3RhcnRPZldlZWspKGZpcnN0V2Vlaywgb3B0aW9ucyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mWWVhciA9IHN0YXJ0T2ZZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB5ZWFyIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZlllYXIobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwMCkpXG4gKiAvLz0+IFdlZCBKYW4gMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mWWVhcihkYXRlKSB7XG4gIGNvbnN0IGNsZWFuRGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgX2RhdGUuc2V0RnVsbFllYXIoY2xlYW5EYXRlLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN1YkRheXMgPSBzdWJEYXlzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZERheXMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3ViRGF5c1xuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBkYXlzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheXMgc3VidHJhY3RlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCAxMCBkYXlzIGZyb20gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1YkRheXMobmV3IERhdGUoMjAxNCwgOCwgMSksIDEwKVxuICogLy89PiBGcmkgQXVnIDIyIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3ViRGF5cyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkRGF5cykoZGF0ZSwgLWFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3ViTW9udGhzID0gc3ViTW9udGhzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZE1vbnRocy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdWJNb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb250aHMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1vbnRocyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgbW9udGhzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIG1vbnRocyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDUgbW9udGhzIGZyb20gMSBGZWJydWFyeSAyMDE1OlxuICogY29uc3QgcmVzdWx0ID0gc3ViTW9udGhzKG5ldyBEYXRlKDIwMTUsIDEsIDEpLCA1KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3ViTW9udGhzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNb250aHMpKGRhdGUsIC1hbW91bnQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN1YlF1YXJ0ZXJzID0gc3ViUXVhcnRlcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkUXVhcnRlcnMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3ViUXVhcnRlcnNcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXIgcXVhcnRlcnMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXIgcXVhcnRlcnMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHF1YXJ0ZXJzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHF1YXJ0ZXJzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgMyBxdWFydGVycyBmcm9tIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJRdWFydGVycyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMylcbiAqIC8vPT4gU3VuIERlYyAwMSAyMDEzIDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN1YlF1YXJ0ZXJzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRRdWFydGVycykoZGF0ZSwgLWFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3ViV2Vla3MgPSBzdWJXZWVrcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRXZWVrcy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdWJXZWVrc1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2Vla3MgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWtzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiB3ZWVrcyB0byBiZSBzdWJ0cmFjdGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSB3ZWVrcyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDQgd2Vla3MgZnJvbSAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc3ViV2Vla3MobmV3IERhdGUoMjAxNCwgOCwgMSksIDQpXG4gKiAvLz0+IE1vbiBBdWcgMDQgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdWJXZWVrcyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkV2Vla3MpKGRhdGUsIC1hbW91bnQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN1YlllYXJzID0gc3ViWWVhcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkWWVhcnMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3ViWWVhcnNcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXJzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgeWVhcnMgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgeWVhcnMgc3VidHJhY3RlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCA1IHllYXJzIGZyb20gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1YlllYXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA1KVxuICogLy89PiBUdWUgU2VwIDAxIDIwMDkgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3ViWWVhcnMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZFllYXJzKShkYXRlLCAtYW1vdW50KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy50b0RhdGUgPSB0b0RhdGU7XG5cbi8qKlxuICogQG5hbWUgdG9EYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdHMgY2xvbmUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgbnVtYmVyLCBpdCBpcyB0cmVhdGVkIGFzIGEgdGltZXN0YW1wLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBub25lIG9mIHRoZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBhcmd1bWVudCAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ2xvbmUgdGhlIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUobmV3IERhdGUoMjAxNCwgMSwgMTEsIDExLCAzMCwgMzApKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCB0aGUgdGltZXN0YW1wIHRvIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUoMTM5MjA5ODQzMDAwMClcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKi9cbmZ1bmN0aW9uIHRvRGF0ZShhcmd1bWVudCkge1xuICBjb25zdCBhcmdTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnQpO1xuXG4gIC8vIENsb25lIHRoZSBkYXRlXG4gIGlmIChcbiAgICBhcmd1bWVudCBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAodHlwZW9mIGFyZ3VtZW50ID09PSBcIm9iamVjdFwiICYmIGFyZ1N0ciA9PT0gXCJbb2JqZWN0IERhdGVdXCIpXG4gICkge1xuICAgIC8vIFByZXZlbnQgdGhlIGRhdGUgdG8gbG9zZSB0aGUgbWlsbGlzZWNvbmRzIHdoZW4gcGFzc2VkIHRvIG5ldyBEYXRlKCkgaW4gSUUxMFxuICAgIHJldHVybiBuZXcgYXJndW1lbnQuY29uc3RydWN0b3IoK2FyZ3VtZW50KTtcbiAgfSBlbHNlIGlmIChcbiAgICB0eXBlb2YgYXJndW1lbnQgPT09IFwibnVtYmVyXCIgfHxcbiAgICBhcmdTdHIgPT09IFwiW29iamVjdCBOdW1iZXJdXCIgfHxcbiAgICB0eXBlb2YgYXJndW1lbnQgPT09IFwic3RyaW5nXCIgfHxcbiAgICBhcmdTdHIgPT09IFwiW29iamVjdCBTdHJpbmddXCJcbiAgKSB7XG4gICAgLy8gVE9ETzogQ2FuIHdlIGdldCByaWQgb2YgYXM/XG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUT0RPOiBDYW4gd2UgZ2V0IHJpZCBvZiBhcz9cbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnRyYW5zcG9zZSA9IHRyYW5zcG9zZTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHRyYW5zcG9zZVxuICogQGNhdGVnb3J5IEdlbmVyaWMgSGVscGVyc1xuICogQHN1bW1hcnkgVHJhbnNwb3NlIHRoZSBkYXRlIHRvIHRoZSBnaXZlbiBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBmdW5jdGlvbiB0cmFuc3Bvc2VzIHRoZSBkYXRlIHRvIHRoZSBnaXZlbiBjb25zdHJ1Y3Rvci4gSXQgaGVscHMgeW91XG4gKiB0byB0cmFuc3Bvc2UgdGhlIGRhdGUgaW4gdGhlIHN5c3RlbSB0aW1lIHpvbmUgdG8gc2F5IGBVVENEYXRlYCBvciBhbnkgb3RoZXJcbiAqIGRhdGUgZXh0ZW5zaW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZUlucHV0VHlwZSAtIFRoZSBpbnB1dCBgRGF0ZWAgdHlwZSBkZXJpdmVkIGZyb20gdGhlIHBhc3NlZCBhcmd1bWVudC5cbiAqIEB0eXBlUGFyYW0gRGF0ZU91dHB1dFR5cGUgLSBUaGUgb3V0cHV0IGBEYXRlYCB0eXBlIGRlcml2ZWQgZnJvbSB0aGUgcGFzc2VkIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSBmcm9tRGF0ZSAtIFRoZSBkYXRlIHRvIHVzZSB2YWx1ZXMgZnJvbVxuICogQHBhcmFtIGNvbnN0cnVjdG9yIC0gVGhlIGRhdGUgY29uc3RydWN0b3IgdG8gdXNlXG4gKlxuICogQHJldHVybnMgRGF0ZSB0cmFuc3Bvc2VkIHRvIHRoZSBnaXZlbiBjb25zdHJ1Y3RvclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgSnVseSAxMCwgMjAyMiAwMDowMCBpbiBsb2NhbGUgdGltZSB6b25lXG4gKiBjb25zdCBkYXRlID0gbmV3IERhdGUoMjAyMiwgNiwgMTApXG4gKiAvLz0+ICdTdW4gSnVsIDEwIDIwMjIgMDA6MDA6MDAgR01UKzA4MDAgKFNpbmdhcG9yZSBTdGFuZGFyZCBUaW1lKSdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVHJhbnNwb3NlIHRoZSBkYXRlIHRvIEp1bHkgMTAsIDIwMjIgMDA6MDAgaW4gVVRDXG4gKiB0cmFuc3Bvc2UoZGF0ZSwgVVRDRGF0ZSlcbiAqIC8vPT4gJ1N1biBKdWwgMTAgMjAyMiAwMDowMDowMCBHTVQrMDAwMCAoQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUpJ1xuICovXG5mdW5jdGlvbiB0cmFuc3Bvc2UoZnJvbURhdGUsIGNvbnN0cnVjdG9yKSB7XG4gIGNvbnN0IGRhdGUgPVxuICAgIGNvbnN0cnVjdG9yIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgPyAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGNvbnN0cnVjdG9yLCAwKVxuICAgICAgOiBuZXcgY29uc3RydWN0b3IoMCk7XG4gIGRhdGUuc2V0RnVsbFllYXIoXG4gICAgZnJvbURhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICBmcm9tRGF0ZS5nZXRNb250aCgpLFxuICAgIGZyb21EYXRlLmdldERhdGUoKSxcbiAgKTtcbiAgZGF0ZS5zZXRIb3VycyhcbiAgICBmcm9tRGF0ZS5nZXRIb3VycygpLFxuICAgIGZyb21EYXRlLmdldE1pbnV0ZXMoKSxcbiAgICBmcm9tRGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgZnJvbURhdGUuZ2V0TWlsbGlzZWNvbmRzKCksXG4gICk7XG4gIHJldHVybiBkYXRlO1xufVxuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICpcbiAqICoqV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY29uZmlndXJlU3RvcmVgIG1ldGhvZFxuICogb2YgdGhlIGBAcmVkdXhqcy90b29sa2l0YCBwYWNrYWdlKiosIHdoaWNoIHJlcGxhY2VzIGBjcmVhdGVTdG9yZWAuXG4gKlxuICogUmVkdXggVG9vbGtpdCBpcyBvdXIgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIHdyaXRpbmcgUmVkdXggbG9naWMgdG9kYXksXG4gKiBpbmNsdWRpbmcgc3RvcmUgc2V0dXAsIHJlZHVjZXJzLCBkYXRhIGZldGNoaW5nLCBhbmQgbW9yZS5cbiAqXG4gKiAqKkZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWFkIHRoaXMgUmVkdXggZG9jcyBwYWdlOioqXG4gKiAqKmh0dHBzOi8vcmVkdXguanMub3JnL2ludHJvZHVjdGlvbi93aHktcnRrLWlzLXJlZHV4LXRvZGF5KipcbiAqXG4gKiBgY29uZmlndXJlU3RvcmVgIGZyb20gUmVkdXggVG9vbGtpdCBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTdG9yZWAgdGhhdFxuICogc2ltcGxpZmllcyBzZXR1cCBhbmQgaGVscHMgYXZvaWQgY29tbW9uIGJ1Z3MuXG4gKlxuICogWW91IHNob3VsZCBub3QgYmUgdXNpbmcgdGhlIGByZWR1eGAgY29yZSBwYWNrYWdlIGJ5IGl0c2VsZiB0b2RheSwgZXhjZXB0IGZvciBsZWFybmluZyBwdXJwb3Nlcy5cbiAqIFRoZSBgY3JlYXRlU3RvcmVgIG1ldGhvZCBmcm9tIHRoZSBjb3JlIGByZWR1eGAgcGFja2FnZSB3aWxsIG5vdCBiZSByZW1vdmVkLCBidXQgd2UgZW5jb3VyYWdlXG4gKiBhbGwgdXNlcnMgdG8gbWlncmF0ZSB0byB1c2luZyBSZWR1eCBUb29sa2l0IGZvciBhbGwgUmVkdXggY29kZS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgYGNyZWF0ZVN0b3JlYCB3aXRob3V0IHRoaXMgdmlzdWFsIGRlcHJlY2F0aW9uIHdhcm5pbmcsIHVzZVxuICogdGhlIGBsZWdhY3lfY3JlYXRlU3RvcmVgIGltcG9ydCBpbnN0ZWFkOlxuICpcbiAqIGBpbXBvcnQgeyBsZWdhY3lfY3JlYXRlU3RvcmUgYXMgY3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4J2BcbiAqXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogJ0l0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvICcgKyAnY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gJyArICd0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoZW5oYW5jZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcIkV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihyZWR1Y2VyKSArIFwiJ1wiKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhpcyBtYWtlcyBhIHNoYWxsb3cgY29weSBvZiBjdXJyZW50TGlzdGVuZXJzIHNvIHdlIGNhbiB1c2VcbiAgICogbmV4dExpc3RlbmVycyBhcyBhIHRlbXBvcmFyeSBsaXN0IHdoaWxlIGRpc3BhdGNoaW5nLlxuICAgKlxuICAgKiBUaGlzIHByZXZlbnRzIGFueSBidWdzIGFyb3VuZCBjb25zdW1lcnMgY2FsbGluZ1xuICAgKiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlxuICAgKi9cblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG5cblxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobGlzdGVuZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJ1wiICsga2luZE9mKGFjdGlvbikgKyBcIicuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBcIkV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG5leHRSZWR1Y2VyKSk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjsgLy8gVGhpcyBhY3Rpb24gaGFzIGEgc2ltaWxpYXIgZWZmZWN0IHRvIEFjdGlvblR5cGVzLklOSVQuXG4gICAgLy8gQW55IHJlZHVjZXJzIHRoYXQgZXhpc3RlZCBpbiBib3RoIHRoZSBuZXcgYW5kIG9sZCByb290UmVkdWNlclxuICAgIC8vIHdpbGwgcmVjZWl2ZSB0aGUgcHJldmlvdXMgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gICAgLy8gdGhlIG5ldyBzdGF0ZSB0cmVlIHdpdGggYW55IHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgb2xkIG9uZS5cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihvYnNlcnZlcikgKyBcIidcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgX3JlZlskJG9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX3JlZjtcbiAgfSAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cblxuXG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gIH0pO1xuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyBgY29uZmlndXJlU3RvcmVgIGZyb20gdGhlXG4gKiBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgOlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5cbnZhciBsZWdhY3lfY3JlYXRlU3RvcmUgPSBjcmVhdGVTdG9yZTtcblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBcIlRoZSBcIiArIGFyZ3VtZW50TmFtZSArIFwiIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXFxcIlwiICsga2luZE9mKGlucHV0U3RhdGUpICsgXCJcXFwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIFwiICsgKFwia2V5czogXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCJcIik7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gXCJVbmV4cGVjdGVkIFwiICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyBcIiBcIiArIChcIlxcXCJcIiArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiIGZvdW5kIGluIFwiICsgYXJndW1lbnROYW1lICsgXCIuIFwiKSArIFwiRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiArIChcIlxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBcIiArIFwiSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IFwiICsgXCJleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IFwiICsgXCJub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCBcIiArIFwieW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBcIiArIChcIkRvbid0IHRyeSB0byBoYW5kbGUgJ1wiICsgQWN0aW9uVHlwZXMuSU5JVCArIFwiJyBvciBvdGhlciBhY3Rpb25zIGluIFxcXCJyZWR1eC8qXFxcIiBcIikgKyBcIm5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIFwiICsgXCJjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBcIiArIFwiaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIFwiICsgXCJhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5cIik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoXCJObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOyAvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIHNhbWVcbiAgLy8ga2V5cyBtdWx0aXBsZSB0aW1lcy5cblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2hhcGVBc3NlcnRpb25FcnJvcjtcblxuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuXG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIldoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgXCIgKyAoYWN0aW9uVHlwZSA/IFwiXFxcIlwiICsgU3RyaW5nKGFjdGlvblR5cGUpICsgXCJcXFwiXCIgOiAnKHVua25vd24gdHlwZSknKSArIFwiLCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIF9rZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBcIiArIFwiVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBcIiArIFwiSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBuZXh0U3RhdGVbX2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuXG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYW4gYWN0aW9uIGNyZWF0b3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGRpc3BhdGNoIHdyYXBwZWQgZnVuY3Rpb24gaW4gcmV0dXJuLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBhY3Rpb25DcmVhdG9ycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb25cbiAqIGNyZWF0b3IgZnVuY3Rpb25zLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpbiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhc2BcbiAqIHN5bnRheC4gWW91IG1heSBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcGF0Y2ggVGhlIGBkaXNwYXRjaGAgZnVuY3Rpb24gYXZhaWxhYmxlIG9uIHlvdXIgUmVkdXhcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFRoZSBvYmplY3QgbWltaWNraW5nIHRoZSBvcmlnaW5hbCBvYmplY3QsIGJ1dCB3aXRoXG4gKiBldmVyeSBhY3Rpb24gY3JlYXRvciB3cmFwcGVkIGludG8gdGhlIGBkaXNwYXRjaGAgY2FsbC4gSWYgeW91IHBhc3NlZCBhXG4gKiBmdW5jdGlvbiBhcyBgYWN0aW9uQ3JlYXRvcnNgLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhIHNpbmdsZVxuICogZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09ICdvYmplY3QnIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoYWN0aW9uQ3JlYXRvcnMpICsgXCInLiBcIiArIFwiRGlkIHlvdSB3cml0ZSBcXFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiIGluc3RlYWQgb2YgXFxcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiP1wiKTtcbiAgfVxuXG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuXG4gICAgICB2YXIgX2Rpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6ICdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh2b2lkIDAsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdG9yZSksIHt9LCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlLCBsZWdhY3lfY3JlYXRlU3RvcmUgfTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7XG4gICAgfVxuICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gIH1cbn0pO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gIGlmICh0aGlzLl9ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTtcbiAgfVxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PT0gdW5kZWZpbmVkKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMClcbiAgICAgIGVyID0gYXJnc1swXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgLy8gTm90ZTogVGhlIGNvbW1lbnRzIG9uIHRoZSBgdGhyb3dgIGxpbmVzIGFyZSBpbnRlbnRpb25hbCwgdGhleSBzaG93XG4gICAgICAvLyB1cCBpbiBOb2RlJ3Mgb3V0cHV0IGlmIHRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLlxuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfVxuICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgZXJyb3IuJyArIChlciA/ICcgKCcgKyBlci5tZXNzYWdlICsgJyknIDogJycpKTtcbiAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgIHRocm93IGVycjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFJlZmxlY3RBcHBseShoYW5kbGVyLCB0aGlzLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHtcbiAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgaWYgKG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0gJiYgIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGVycm9yIGNvZGUgZm9yIHRoaXMgc2luY2UgaXQgaXMgYSBXYXJuaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyBTdHJpbmcodHlwZSkgKyAnIGxpc3RlbmVycyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0Jyk7XG4gICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgUHJvY2Vzc0VtaXRXYXJuaW5nKHcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cywgaTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTtcblxuICByZXR1cm4gdW53cmFwID9cbiAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKDsgaW5kZXggKyAxIDwgbGlzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCByZXNvbHZlciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGlmIChuYW1lICE9PSAnZXJyb3InKSB7XG4gICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgaGFuZGxlciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsICdlcnJvcicsIGhhbmRsZXIsIGZsYWdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlXG4gICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZVxuICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS5cbiAgICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlbWl0dGVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGVtaXR0ZXIpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwiYXNzZXRzL2ltYWdlcy9sb2dvLjJhN2JmZjBjMTE4OTE4M2ZhZmU3MWQ3ZDViOTRlMGNkLnBuZ1wiOyIsIihmdW5jdGlvbihhLGIpe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sYik7ZWxzZSBpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgZXhwb3J0cyliKCk7ZWxzZXtiKCksYS5GaWxlU2F2ZXI9e2V4cG9ydHM6e319LmV4cG9ydHN9fSkodGhpcyxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYSxiKXtyZXR1cm5cInVuZGVmaW5lZFwiPT10eXBlb2YgYj9iPXthdXRvQm9tOiExfTpcIm9iamVjdFwiIT10eXBlb2YgYiYmKGNvbnNvbGUud2FybihcIkRlcHJlY2F0ZWQ6IEV4cGVjdGVkIHRoaXJkIGFyZ3VtZW50IHRvIGJlIGEgb2JqZWN0XCIpLGI9e2F1dG9Cb206IWJ9KSxiLmF1dG9Cb20mJi9eXFxzKig/OnRleHRcXC9cXFMqfGFwcGxpY2F0aW9uXFwveG1sfFxcUypcXC9cXFMqXFwreG1sKVxccyo7LipjaGFyc2V0XFxzKj1cXHMqdXRmLTgvaS50ZXN0KGEudHlwZSk/bmV3IEJsb2IoW1wiXFx1RkVGRlwiLGFdLHt0eXBlOmEudHlwZX0pOmF9ZnVuY3Rpb24gYyhhLGIsYyl7dmFyIGQ9bmV3IFhNTEh0dHBSZXF1ZXN0O2Qub3BlbihcIkdFVFwiLGEpLGQucmVzcG9uc2VUeXBlPVwiYmxvYlwiLGQub25sb2FkPWZ1bmN0aW9uKCl7ZyhkLnJlc3BvbnNlLGIsYyl9LGQub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoXCJjb3VsZCBub3QgZG93bmxvYWQgZmlsZVwiKX0sZC5zZW5kKCl9ZnVuY3Rpb24gZChhKXt2YXIgYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yi5vcGVuKFwiSEVBRFwiLGEsITEpO3RyeXtiLnNlbmQoKX1jYXRjaChhKXt9cmV0dXJuIDIwMDw9Yi5zdGF0dXMmJjI5OT49Yi5zdGF0dXN9ZnVuY3Rpb24gZShhKXt0cnl7YS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KFwiY2xpY2tcIikpfWNhdGNoKGMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiTW91c2VFdmVudHNcIik7Yi5pbml0TW91c2VFdmVudChcImNsaWNrXCIsITAsITAsd2luZG93LDAsMCwwLDgwLDIwLCExLCExLCExLCExLDAsbnVsbCksYS5kaXNwYXRjaEV2ZW50KGIpfX12YXIgZj1cIm9iamVjdFwiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cud2luZG93PT09d2luZG93P3dpbmRvdzpcIm9iamVjdFwiPT10eXBlb2Ygc2VsZiYmc2VsZi5zZWxmPT09c2VsZj9zZWxmOlwib2JqZWN0XCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbC5nbG9iYWw9PT1nbG9iYWw/Z2xvYmFsOnZvaWQgMCxhPWYubmF2aWdhdG9yJiYvTWFjaW50b3NoLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYvQXBwbGVXZWJLaXQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGc9Zi5zYXZlQXN8fChcIm9iamVjdFwiIT10eXBlb2Ygd2luZG93fHx3aW5kb3chPT1mP2Z1bmN0aW9uKCl7fTpcImRvd25sb2FkXCJpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGUmJiFhP2Z1bmN0aW9uKGIsZyxoKXt2YXIgaT1mLlVSTHx8Zi53ZWJraXRVUkwsaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtnPWd8fGIubmFtZXx8XCJkb3dubG9hZFwiLGouZG93bmxvYWQ9ZyxqLnJlbD1cIm5vb3BlbmVyXCIsXCJzdHJpbmdcIj09dHlwZW9mIGI/KGouaHJlZj1iLGoub3JpZ2luPT09bG9jYXRpb24ub3JpZ2luP2Uoaik6ZChqLmhyZWYpP2MoYixnLGgpOmUoaixqLnRhcmdldD1cIl9ibGFua1wiKSk6KGouaHJlZj1pLmNyZWF0ZU9iamVjdFVSTChiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5yZXZva2VPYmplY3RVUkwoai5ocmVmKX0sNEU0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZShqKX0sMCkpfTpcIm1zU2F2ZU9yT3BlbkJsb2JcImluIG5hdmlnYXRvcj9mdW5jdGlvbihmLGcsaCl7aWYoZz1nfHxmLm5hbWV8fFwiZG93bmxvYWRcIixcInN0cmluZ1wiIT10eXBlb2YgZiluYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihiKGYsaCksZyk7ZWxzZSBpZihkKGYpKWMoZixnLGgpO2Vsc2V7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7aS5ocmVmPWYsaS50YXJnZXQ9XCJfYmxhbmtcIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZShpKX0pfX06ZnVuY3Rpb24oYixkLGUsZyl7aWYoZz1nfHxvcGVuKFwiXCIsXCJfYmxhbmtcIiksZyYmKGcuZG9jdW1lbnQudGl0bGU9Zy5kb2N1bWVudC5ib2R5LmlubmVyVGV4dD1cImRvd25sb2FkaW5nLi4uXCIpLFwic3RyaW5nXCI9PXR5cGVvZiBiKXJldHVybiBjKGIsZCxlKTt2YXIgaD1cImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiPT09Yi50eXBlLGk9L2NvbnN0cnVjdG9yL2kudGVzdChmLkhUTUxFbGVtZW50KXx8Zi5zYWZhcmksaj0vQ3JpT1NcXC9bXFxkXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoKGp8fGgmJml8fGEpJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgRmlsZVJlYWRlcil7dmFyIGs9bmV3IEZpbGVSZWFkZXI7ay5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXt2YXIgYT1rLnJlc3VsdDthPWo/YTphLnJlcGxhY2UoL15kYXRhOlteO10qOy8sXCJkYXRhOmF0dGFjaG1lbnQvZmlsZTtcIiksZz9nLmxvY2F0aW9uLmhyZWY9YTpsb2NhdGlvbj1hLGc9bnVsbH0say5yZWFkQXNEYXRhVVJMKGIpfWVsc2V7dmFyIGw9Zi5VUkx8fGYud2Via2l0VVJMLG09bC5jcmVhdGVPYmplY3RVUkwoYik7Zz9nLmxvY2F0aW9uPW06bG9jYXRpb24uaHJlZj1tLGc9bnVsbCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bC5yZXZva2VPYmplY3RVUkwobSl9LDRFNCl9fSk7Zi5zYXZlQXM9Zy5zYXZlQXM9ZyxcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlJiYobW9kdWxlLmV4cG9ydHM9Zyl9KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZVNhdmVyLm1pbi5qcy5tYXAiLCJleHBvcnQgdmFyIGZvY3VzT24gPSBmdW5jdGlvbiAodGFyZ2V0LCBmb2N1c09wdGlvbnMpIHtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAvLyBub3QgY2xlYXIgaG93LCBidXQgaXMgcG9zc2libGUgaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS9mb2N1cy1sb2NrL2lzc3Vlcy81M1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgnZm9jdXMnIGluIHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuZm9jdXMoZm9jdXNPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCdjb250ZW50V2luZG93JyBpbiB0YXJnZXQgJiYgdGFyZ2V0LmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgdGFyZ2V0LmNvbnRlbnRXaW5kb3cuZm9jdXMoKTtcbiAgICB9XG59O1xuIiwiLyoqXG4gKiBkZWZpbmVzIGEgZm9jdXMgZ3JvdXBcbiAqL1xuZXhwb3J0IHZhciBGT0NVU19HUk9VUCA9ICdkYXRhLWZvY3VzLWxvY2snO1xuLyoqXG4gKiBkaXNhYmxlcyBlbGVtZW50IGRpc2NvdmVyeSBpbnNpZGUgYSBncm91cCBtYXJrZWQgYnkga2V5XG4gKi9cbmV4cG9ydCB2YXIgRk9DVVNfRElTQUJMRUQgPSAnZGF0YS1mb2N1cy1sb2NrLWRpc2FibGVkJztcbi8qKlxuICogYWxsb3dzIHVuY29udHJvbGxlZCBmb2N1cyB3aXRoaW4gdGhlIG1hcmtlZCBhcmVhLCBlZmZlY3RpdmVseSBkaXNhYmxpbmcgZm9jdXMgbG9jayBmb3IgaXQncyBjb250ZW50XG4gKi9cbmV4cG9ydCB2YXIgRk9DVVNfQUxMT1cgPSAnZGF0YS1uby1mb2N1cy1sb2NrJztcbi8qKlxuICogaW5zdHJ1Y3RzIGF1dG9mb2N1cyBlbmdpbmUgdG8gcGljayBkZWZhdWx0IGF1dG9mb2N1cyBpbnNpZGUgYSBnaXZlbiBub2RlXG4gKiBjYW4gYmUgc2V0IG9uIHRoZSBlbGVtZW50IG9yIGNvbnRhaW5lclxuICovXG5leHBvcnQgdmFyIEZPQ1VTX0FVVE8gPSAnZGF0YS1hdXRvZm9jdXMtaW5zaWRlJztcbi8qKlxuICogaW5zdHJ1Y3RzIGF1dG9mb2N1cyB0byBpZ25vcmUgZWxlbWVudHMgd2l0aGluIGEgZ2l2ZW4gbm9kZVxuICogY2FuIGJlIHNldCBvbiB0aGUgZWxlbWVudCBvciBjb250YWluZXJcbiAqL1xuZXhwb3J0IHZhciBGT0NVU19OT19BVVRPRk9DVVMgPSAnZGF0YS1uby1hdXRvZm9jdXMnO1xuIiwiaW1wb3J0IHsgY29udGFpbnMgfSBmcm9tICcuL3V0aWxzL0RPTXV0aWxzJztcbmltcG9ydCB7IGdldEFsbEFmZmVjdGVkTm9kZXMgfSBmcm9tICcuL3V0aWxzL2FsbC1hZmZlY3RlZCc7XG5pbXBvcnQgeyBnZXRGaXJzdCwgdG9BcnJheSB9IGZyb20gJy4vdXRpbHMvYXJyYXknO1xuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudCB9IGZyb20gJy4vdXRpbHMvZ2V0QWN0aXZlRWxlbWVudCc7XG52YXIgZm9jdXNJbkZyYW1lID0gZnVuY3Rpb24gKGZyYW1lLCBhY3RpdmVFbGVtZW50KSB7IHJldHVybiBmcmFtZSA9PT0gYWN0aXZlRWxlbWVudDsgfTtcbnZhciBmb2N1c0luc2lkZUlmcmFtZSA9IGZ1bmN0aW9uICh0b3BOb2RlLCBhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odG9BcnJheSh0b3BOb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpKS5zb21lKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBmb2N1c0luRnJhbWUobm9kZSwgYWN0aXZlRWxlbWVudCk7IH0pKTtcbn07XG4vKipcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlLCBpZiB0aGUgY3VycmVudCBmb2N1cyBpcyBpbnNpZGUgZ2l2ZW4gbm9kZSBvciBub2Rlcy5cbiAqIFN1cHBvcnRzIG5vZGVzIGhpZGRlbiBpbnNpZGUgc2hhZG93RG9tXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNJbnNpZGUgPSBmdW5jdGlvbiAodG9wTm9kZSwgYWN0aXZlRWxlbWVudCkge1xuICAgIC8vIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudCAmJiBnZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQgPT09IHZvaWQgMCkgeyBhY3RpdmVFbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChnZXRGaXJzdCh0b3BOb2RlKS5vd25lckRvY3VtZW50KTsgfVxuICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAoYWN0aXZlRWxlbWVudC5kYXRhc2V0ICYmIGFjdGl2ZUVsZW1lbnQuZGF0YXNldC5mb2N1c0d1YXJkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBnZXRBbGxBZmZlY3RlZE5vZGVzKHRvcE5vZGUpLnNvbWUoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG5vZGUsIGFjdGl2ZUVsZW1lbnQpIHx8IGZvY3VzSW5zaWRlSWZyYW1lKG5vZGUsIGFjdGl2ZUVsZW1lbnQpO1xuICAgIH0pO1xufTtcbiIsImltcG9ydCB7IEZPQ1VTX0FMTE9XIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgY29udGFpbnMgfSBmcm9tICcuL3V0aWxzL0RPTXV0aWxzJztcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL3V0aWxzL2FycmF5JztcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnQgfSBmcm9tICcuL3V0aWxzL2dldEFjdGl2ZUVsZW1lbnQnO1xuLyoqXG4gKiBjaGVja3MgaWYgZm9jdXMgaXMgaGlkZGVuIEZST00gdGhlIGZvY3VzLWxvY2tcbiAqIGllIGNvbnRhaW5lZCBpbnNpZGUgYSBub2RlIGZvY3VzLWxvY2sgc2hhbGwgaWdub3JlXG4gKlxuICogVGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gY291cGxlZCB3aXRoIHtAbGluayBGT0NVU19BTExPV30gY29uc3RhbnRcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gZm9jdXMgaXMgY3VycmVudGx5IGlzIGluIFwiYWxsb3dcIiBhcmVhXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNJc0hpZGRlbiA9IGZ1bmN0aW9uIChpbkRvY3VtZW50KSB7XG4gICAgaWYgKGluRG9jdW1lbnQgPT09IHZvaWQgMCkgeyBpbkRvY3VtZW50ID0gZG9jdW1lbnQ7IH1cbiAgICB2YXIgYWN0aXZlRWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoaW5Eb2N1bWVudCk7XG4gICAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gdGhpcyBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgRk9DVVNfQUxMT1cgd2l0aGluIHNoYWRvdyBkb21cbiAgICByZXR1cm4gdG9BcnJheShpbkRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIuY29uY2F0KEZPQ1VTX0FMTE9XLCBcIl1cIikpKS5zb21lKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBjb250YWlucyhub2RlLCBhY3RpdmVFbGVtZW50KTsgfSk7XG59O1xuIiwiaW1wb3J0IHsgTkVXX0ZPQ1VTLCBuZXdGb2N1cyB9IGZyb20gJy4vc29sdmVyJztcbmltcG9ydCB7IGdldEZvY3VzYWJsZU5vZGVzIH0gZnJvbSAnLi91dGlscy9ET011dGlscyc7XG5pbXBvcnQgeyBnZXRBbGxBZmZlY3RlZE5vZGVzIH0gZnJvbSAnLi91dGlscy9hbGwtYWZmZWN0ZWQnO1xuaW1wb3J0IHsgYXNBcnJheSwgZ2V0Rmlyc3QgfSBmcm9tICcuL3V0aWxzL2FycmF5JztcbmltcG9ydCB7IHBpY2tBdXRvZm9jdXMgfSBmcm9tICcuL3V0aWxzL2F1dG8tZm9jdXMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudCB9IGZyb20gJy4vdXRpbHMvZ2V0QWN0aXZlRWxlbWVudCc7XG5pbXBvcnQgeyBpc0RlZmluZWQsIGlzTm90QUd1YXJkIH0gZnJvbSAnLi91dGlscy9pcyc7XG5pbXBvcnQgeyBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcywgZ2V0VG9wQ29tbW9uUGFyZW50IH0gZnJvbSAnLi91dGlscy9wYXJlbnRpbmcnO1xudmFyIHJlb3JkZXJOb2RlcyA9IGZ1bmN0aW9uIChzcmNOb2RlcywgZHN0Tm9kZXMpIHtcbiAgICB2YXIgcmVtYXAgPSBuZXcgTWFwKCk7XG4gICAgLy8gbm8gU2V0KGRzdE5vZGVzKSBmb3IgSUUxMSA6KFxuICAgIGRzdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkgeyByZXR1cm4gcmVtYXAuc2V0KGVudGl0eS5ub2RlLCBlbnRpdHkpOyB9KTtcbiAgICAvLyByZW1hcCB0byBkc3ROb2Rlc1xuICAgIHJldHVybiBzcmNOb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHJlbWFwLmdldChub2RlKTsgfSkuZmlsdGVyKGlzRGVmaW5lZCk7XG59O1xuLyoqXG4gKiBjb250YWlucyB0aGUgbWFpbiBsb2dpYyBvZiB0aGUgYGZvY3VzLWxvY2tgIHBhY2thZ2UuXG4gKlxuICogISB5b3UgcHJvYmFibHkgZG9udCBuZWVkIHRoaXMgZnVuY3Rpb24gIVxuICpcbiAqIGdpdmVuIHRvcCBub2RlKHMpIGFuZCB0aGUgbGFzdCBhY3RpdmUgZWxlbWVudCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGJlIGZvY3VzZWQgbmV4dFxuICogQHJldHVybnMgZWxlbWVudCB3aGljaCBzaG91bGQgYmUgZm9jdXNlZCB0byBtb3ZlIGZvY3VzIGluc2lkZVxuICogQHBhcmFtIHRvcE5vZGVcbiAqIEBwYXJhbSBsYXN0Tm9kZVxuICovXG5leHBvcnQgdmFyIGZvY3VzU29sdmVyID0gZnVuY3Rpb24gKHRvcE5vZGUsIGxhc3ROb2RlKSB7XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KGFzQXJyYXkodG9wTm9kZSkubGVuZ3RoID4gMCA/IGRvY3VtZW50IDogZ2V0Rmlyc3QodG9wTm9kZSkub3duZXJEb2N1bWVudCk7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRBbGxBZmZlY3RlZE5vZGVzKHRvcE5vZGUpLmZpbHRlcihpc05vdEFHdWFyZCk7XG4gICAgdmFyIGNvbW1vblBhcmVudCA9IGdldFRvcENvbW1vblBhcmVudChhY3RpdmVFbGVtZW50IHx8IHRvcE5vZGUsIHRvcE5vZGUsIGVudHJpZXMpO1xuICAgIHZhciB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGFueUZvY3VzYWJsZSA9IGdldEZvY3VzYWJsZU5vZGVzKGVudHJpZXMsIHZpc2liaWxpdHlDYWNoZSk7XG4gICAgdmFyIGlubmVyRWxlbWVudHMgPSBhbnlGb2N1c2FibGUuZmlsdGVyKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBpc05vdEFHdWFyZChub2RlKTtcbiAgICB9KTtcbiAgICBpZiAoIWlubmVyRWxlbWVudHNbMF0pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIG91dGVyTm9kZXMgPSBnZXRGb2N1c2FibGVOb2RlcyhbY29tbW9uUGFyZW50XSwgdmlzaWJpbGl0eUNhY2hlKS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gICAgdmFyIG9yZGVyZWRJbm5lckVsZW1lbnRzID0gcmVvcmRlck5vZGVzKG91dGVyTm9kZXMsIGlubmVyRWxlbWVudHMpO1xuICAgIC8vIGNvbGxlY3QgaW5uZXIgZm9jdXNhYmxlIGFuZCBzZXBhcmF0ZWx5IHRhYmJhYmxlc1xuICAgIHZhciBpbm5lckZvY3VzYWJsZXMgPSBvcmRlcmVkSW5uZXJFbGVtZW50cy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gICAgdmFyIGlubmVyVGFiYmFibGUgPSBvcmRlcmVkSW5uZXJFbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciB0YWJJbmRleCA9IF9hLnRhYkluZGV4O1xuICAgICAgICByZXR1cm4gdGFiSW5kZXggPj0gMDtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gICAgdmFyIG5ld0lkID0gbmV3Rm9jdXMoaW5uZXJGb2N1c2FibGVzLCBpbm5lclRhYmJhYmxlLCBvdXRlck5vZGVzLCBhY3RpdmVFbGVtZW50LCBsYXN0Tm9kZSk7XG4gICAgaWYgKG5ld0lkID09PSBORVdfRk9DVVMpIHtcbiAgICAgICAgdmFyIGZvY3VzTm9kZSA9IFxuICAgICAgICAvLyBmaXJzdCB0cnkgb25seSB0YWJiYWJsZSwgYW5kIHRoZSBmYWxsYmFjayB0byBhbGwgZm9jdXNhYmxlLCBhcyBsb25nIGFzIGF0IGxlYXN0IG9uZSBlbGVtZW50IHNob3VsZCBiZSBwaWNrZWQgZm9yIGZvY3VzXG4gICAgICAgIHBpY2tBdXRvZm9jdXMoYW55Rm9jdXNhYmxlLCBpbm5lclRhYmJhYmxlLCBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcyhlbnRyaWVzLCB2aXNpYmlsaXR5Q2FjaGUpKSB8fFxuICAgICAgICAgICAgcGlja0F1dG9mb2N1cyhhbnlGb2N1c2FibGUsIGlubmVyRm9jdXNhYmxlcywgYWxsUGFyZW50QXV0b2ZvY3VzYWJsZXMoZW50cmllcywgdmlzaWJpbGl0eUNhY2hlKSk7XG4gICAgICAgIGlmIChmb2N1c05vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IGZvY3VzTm9kZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdmb2N1cy1sb2NrOiBjYW5ub3QgZmluZCBhbnkgbm9kZSB0byBtb3ZlIGZvY3VzIGludG8nKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5ld0lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ld0lkO1xuICAgIH1cbiAgICByZXR1cm4gb3JkZXJlZElubmVyRWxlbWVudHNbbmV3SWRdO1xufTtcbiIsImltcG9ydCB7IGdldEFsbEFmZmVjdGVkTm9kZXMgfSBmcm9tICcuL3V0aWxzL2FsbC1hZmZlY3RlZCc7XG5pbXBvcnQgeyBpc0d1YXJkLCBpc05vdEFHdWFyZCB9IGZyb20gJy4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgZ2V0VG9wQ29tbW9uUGFyZW50IH0gZnJvbSAnLi91dGlscy9wYXJlbnRpbmcnO1xuaW1wb3J0IHsgb3JkZXJCeVRhYkluZGV4IH0gZnJvbSAnLi91dGlscy90YWJPcmRlcic7XG5pbXBvcnQgeyBnZXRGb2N1c2FibGVzIH0gZnJvbSAnLi91dGlscy90YWJVdGlscyc7XG4vKipcbiAqIHRyYXZlcnNlcyBhbGwgcmVsYXRlZCBub2RlcyAoaW5jbHVkaW5nIGdyb3VwcykgcmV0dXJuaW5nIGEgbGlzdCBvZiBhbGwgbm9kZXMob3V0ZXIgYW5kIGludGVybmFsKSB3aXRoIG1ldGEgaW5mb3JtYXRpb25cbiAqIFRoaXMgaXMgbG93LWxldmVsIEFQSSFcbiAqIEByZXR1cm5zIGxpc3Qgb2YgZm9jdXNhYmxlIGVsZW1lbnRzIGluc2lkZSBhIGdpdmVuIHRvcCghKSBub2RlLlxuICogQHNlZSB7QGxpbmsgZ2V0Rm9jdXNhYmxlTm9kZXN9IHByb3ZpZGluZyBhIHNpbXBsZXIgQVBJXG4gKi9cbmV4cG9ydCB2YXIgZXhwYW5kRm9jdXNhYmxlTm9kZXMgPSBmdW5jdGlvbiAodG9wTm9kZSkge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0QWxsQWZmZWN0ZWROb2Rlcyh0b3BOb2RlKS5maWx0ZXIoaXNOb3RBR3VhcmQpO1xuICAgIHZhciBjb21tb25QYXJlbnQgPSBnZXRUb3BDb21tb25QYXJlbnQodG9wTm9kZSwgdG9wTm9kZSwgZW50cmllcyk7XG4gICAgdmFyIG91dGVyTm9kZXMgPSBvcmRlckJ5VGFiSW5kZXgoZ2V0Rm9jdXNhYmxlcyhbY29tbW9uUGFyZW50XSwgdHJ1ZSksIHRydWUsIHRydWUpO1xuICAgIHZhciBpbm5lckVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlcyhlbnRyaWVzLCBmYWxzZSk7XG4gICAgcmV0dXJuIG91dGVyTm9kZXMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGUsIGluZGV4ID0gX2EuaW5kZXg7XG4gICAgICAgIHJldHVybiAoe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGxvY2tJdGVtOiBpbm5lckVsZW1lbnRzLmluZGV4T2Yobm9kZSkgPj0gMCxcbiAgICAgICAgICAgIGd1YXJkOiBpc0d1YXJkKG5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyBmb2N1c09uIH0gZnJvbSAnLi9jb21tYW5kcyc7XG5pbXBvcnQgeyBmb2N1c1NvbHZlciB9IGZyb20gJy4vZm9jdXNTb2x2ZXInO1xudmFyIGd1YXJkQ291bnQgPSAwO1xudmFyIGxvY2tEaXNhYmxlZCA9IGZhbHNlO1xuLyoqXG4gKiBUaGUgbWFpbiBmdW5jdGlvbmFsaXR5IG9mIHRoZSBmb2N1cy1sb2NrIHBhY2thZ2VcbiAqXG4gKiBDb250YWlucyBmb2N1cyBhdCBhIGdpdmVuIG5vZGUuXG4gKiBUaGUgbGFzdCBmb2N1c2VkIGVsZW1lbnQgd2lsbCBoZWxwIHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50KGZpcnN0IG9yIGxhc3QpIHNob3VsZCBiZSBmb2N1c2VkLlxuICogVGhlIGZvdW5kIGVsZW1lbnQgd2lsbCBiZSBmb2N1c2VkLlxuICpcbiAqIFRoaXMgaXMgb25lIHRpbWUgYWN0aW9uIChtb3ZlKSwgbm90IGEgcGVyc2lzdGVudCBmb2N1cy1sb2NrXG4gKlxuICogSFRNTCBtYXJrZXJzIChzZWUge0BsaW5rIGltcG9ydCgnLi9jb25zdGFudHMnKS5GT0NVU19BVVRPfSBjb25zdGFudHMpIGNhbiBjb250cm9sIGF1dG9mb2N1c1xuICogQHNlZSB7QGxpbmsgZm9jdXNTb2x2ZXJ9IGZvciB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYXV0b2ZvY3VzXG4gKi9cbmV4cG9ydCB2YXIgbW92ZUZvY3VzSW5zaWRlID0gZnVuY3Rpb24gKHRvcE5vZGUsIGxhc3ROb2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgZm9jdXNhYmxlID0gZm9jdXNTb2x2ZXIodG9wTm9kZSwgbGFzdE5vZGUpO1xuICAgIC8vIGdsb2JhbCBsb2NhbCBzaWRlIGVmZmVjdCB0byBjb3VudGFpbiByZWN1cnNpdmUgbG9jayBhY3RpdmF0aW9uIGFuZCByZXNvbHZlIGZvY3VzLWZpZ2h0aW5nXG4gICAgaWYgKGxvY2tEaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgLyoqICtGT0NVUy1GSUdIVElORyBwcmV2ZW50aW9uICoqL1xuICAgICAgICBpZiAoZ3VhcmRDb3VudCA+IDIpIHtcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgcmVjdXJzaXZlIGVudGVyZWQgYmFjayB0aGUgbG9jayBhY3RpdmF0aW9uXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGb2N1c0xvY2s6IGZvY3VzLWZpZ2h0aW5nIGRldGVjdGVkLiBPbmx5IG9uZSBmb2N1cyBtYW5hZ2VtZW50IHN5c3RlbSBjb3VsZCBiZSBhY3RpdmUuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS9mb2N1cy1sb2NrLyNmb2N1cy1maWdodGluZycpO1xuICAgICAgICAgICAgbG9ja0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxvY2tEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ3VhcmRDb3VudCsrO1xuICAgICAgICBmb2N1c09uKGZvY3VzYWJsZS5ub2RlLCBvcHRpb25zLmZvY3VzT3B0aW9ucyk7XG4gICAgICAgIGd1YXJkQ291bnQtLTtcbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgZ2V0VGFiYmFibGVOb2RlcyB9IGZyb20gJy4vdXRpbHMvRE9NdXRpbHMnO1xuZnVuY3Rpb24gd2Vha1JlZih2YWx1ZSkge1xuICAgIGlmICghdmFsdWUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vICM2OCBTYWZhcmkgMTQuMSBkb250IGhhdmUgaXQgeWV0XG4gICAgLy8gRklYTUU6IHJlbW92ZSBpbiAyMDI1XG4gICAgaWYgKHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWUgfHwgbnVsbDsgfTtcbiAgICB9XG4gICAgdmFyIHcgPSB2YWx1ZSA/IG5ldyBXZWFrUmVmKHZhbHVlKSA6IG51bGw7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuICh3ID09PSBudWxsIHx8IHcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHcuZGVyZWYoKSkgfHwgbnVsbDsgfTtcbn1cbmV4cG9ydCB2YXIgcmVjb3JkRWxlbWVudExvY2F0aW9uID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgY3VycmVudDogd2Vha1JlZihjdXJyZW50RWxlbWVudCksXG4gICAgICAgICAgICBwYXJlbnQ6IHdlYWtSZWYoY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudCksXG4gICAgICAgICAgICBsZWZ0OiB3ZWFrUmVmKGN1cnJlbnRFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpLFxuICAgICAgICAgICAgcmlnaHQ6IHdlYWtSZWYoY3VycmVudEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudDogd2Vha1JlZihlbGVtZW50KSxcbiAgICAgICAgc3RhY2s6IHN0YWNrLFxuICAgICAgICBvd25lckRvY3VtZW50OiBlbGVtZW50Lm93bmVyRG9jdW1lbnQsXG4gICAgfTtcbn07XG52YXIgcmVzdG9yZUZvY3VzVG8gPSBmdW5jdGlvbiAobG9jYXRpb24pIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIHN0YWNrID0gbG9jYXRpb24uc3RhY2ssIG93bmVyRG9jdW1lbnQgPSBsb2NhdGlvbi5vd25lckRvY3VtZW50O1xuICAgIHZhciB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBzdGFja18xID0gc3RhY2s7IF9pIDwgc3RhY2tfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBzdGFja18xW19pXTtcbiAgICAgICAgdmFyIHBhcmVudF8xID0gKF9hID0gbGluZS5wYXJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGxpbmUpO1xuICAgICAgICAvLyBpcyBpdCBzdGlsbCBoZXJlP1xuICAgICAgICBpZiAocGFyZW50XzEgJiYgb3duZXJEb2N1bWVudC5jb250YWlucyhwYXJlbnRfMSkpIHtcbiAgICAgICAgICAgIHZhciBsZWZ0ID0gKF9iID0gbGluZS5sZWZ0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChsaW5lKTtcbiAgICAgICAgICAgIHZhciBzYXZlZEN1cnJlbnQgPSBsaW5lLmN1cnJlbnQoKTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gcGFyZW50XzEuY29udGFpbnMoc2F2ZWRDdXJyZW50KSA/IHNhdmVkQ3VycmVudCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZhciByaWdodCA9IChfYyA9IGxpbmUucmlnaHQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5jYWxsKGxpbmUpO1xuICAgICAgICAgICAgdmFyIGZvY3VzYWJsZXMgPSBnZXRUYWJiYWJsZU5vZGVzKFtwYXJlbnRfMV0sIHZpc2liaWxpdHlDYWNoZSk7XG4gICAgICAgICAgICB2YXIgYWltID0gXG4gICAgICAgICAgICAvLyB0aGF0IGlzIGVsZW1lbnQgaXRzZWxmXG4gICAgICAgICAgICAoX2UgPSAoX2QgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQgIT09IHZvaWQgMCA/IGN1cnJlbnQgOiBcbiAgICAgICAgICAgIC8vIG9yIHNvbWV0aGluZyBpbiBpdCdzIHBsYWNlXG4gICAgICAgICAgICBsZWZ0ID09PSBudWxsIHx8IGxlZnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxlZnQubmV4dEVsZW1lbnRTaWJsaW5nKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcbiAgICAgICAgICAgIC8vIG9yIHNvbWVib2R5IHRvIHRoZSByaWdodCwgc3RpbGwgY2xvc2UgZW5vdWdoXG4gICAgICAgICAgICByaWdodCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogXG4gICAgICAgICAgICAvLyBvciBzb21lYm9keSB0byB0aGUgbGVmdCwgc29tZXRoaW5nP1xuICAgICAgICAgICAgbGVmdDtcbiAgICAgICAgICAgIHdoaWxlIChhaW0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfZiA9IDAsIGZvY3VzYWJsZXNfMSA9IGZvY3VzYWJsZXM7IF9mIDwgZm9jdXNhYmxlc18xLmxlbmd0aDsgX2YrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm9jdXNhYmxlID0gZm9jdXNhYmxlc18xW19mXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFpbSA9PT0gbnVsbCB8fCBhaW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFpbS5jb250YWlucyhmb2N1c2FibGUubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2FibGUubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhaW0gPSBhaW0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvY3VzYWJsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgcGFyZW50IGNvbnRhaW5zIGEgZm9jdXNhYmxlIC0gbW92ZSB0aGVyZVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2FibGVzWzBdLm5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbm90aGluZyBtYXRjaGVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4vKipcbiAqIENhcHR1cmVzIHRoZSBjdXJyZW50IGZvY3VzZWQgZWxlbWVudCB0byByZXN0b3JlIGZvY3VzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIGluIHRoZSBmdXR1cmVcbiAqIEhhbmRsZXMgc2l0dWF0aW9ucyB3aGVyZSB0aGUgZm9jdXNlZCBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIG9yIG5vIGxvbmdlciBmb2N1c2FibGVcbiAqIG1vdmluZyBmb2N1cyB0byB0aGUgY2xvc2VzdCBmb2N1c2FibGUgZWxlbWVudFxuICogQHBhcmFtIHRhcmdldEVsZW1lbnQgLSBlbGVtZW50IHdoZXJlIGZvY3VzIHNob3VsZCBiZSByZXN0b3JlZFxuICogQHJldHVybnMgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBuZXcgZWxlbWVudCB0byBmb2N1c1xuICovXG5leHBvcnQgdmFyIGNhcHR1cmVGb2N1c1Jlc3RvcmUgPSBmdW5jdGlvbiAodGFyZ2V0RWxlbWVudCkge1xuICAgIHZhciBsb2NhdGlvbiA9IHJlY29yZEVsZW1lbnRMb2NhdGlvbih0YXJnZXRFbGVtZW50KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmVzdG9yZUZvY3VzVG8obG9jYXRpb24pO1xuICAgIH07XG59O1xuIiwiaW1wb3J0IHsgZm9jdXNPbiB9IGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IHsgZ2V0VGFiYmFibGVOb2RlcywgY29udGFpbnMsIGdldEZvY3VzYWJsZU5vZGVzIH0gZnJvbSAnLi91dGlscy9ET011dGlscyc7XG5pbXBvcnQgeyBhc0FycmF5IH0gZnJvbSAnLi91dGlscy9hcnJheSc7XG4vKipcbiAqIGZvciBhIGdpdmVuIGBlbGVtZW50YCBpbiBhIGdpdmVuIGBzY29wZWAgcmV0dXJucyBmb2N1c2FibGUgc2libGluZ3NcbiAqIEBwYXJhbSBlbGVtZW50IC0gYmFzZSBlbGVtZW50XG4gKiBAcGFyYW0gc2NvcGUgLSBjb21tb24gcGFyZW50LiBDYW4gYmUgZG9jdW1lbnQsIGJ1dCBiZXR0ZXIgdG8gbmFycm93IGl0IGRvd24gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcbiAqIEByZXR1cm5zIHtwcmV2LG5leHR9IC0gcmVmZXJlbmNlcyB0byBhIGZvY3VzYWJsZSBlbGVtZW50IGJlZm9yZSBhbmQgYWZ0ZXJcbiAqIEByZXR1cm5zIHVuZGVmaW5lZCAtIGlmIG9wZXJhdGlvbiBpcyBub3QgYXBwbGljYWJsZVxuICovXG5leHBvcnQgdmFyIGdldFJlbGF0aXZlRm9jdXNhYmxlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHNjb3BlLCB1c2VUYWJiYWJsZXMpIHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIXNjb3BlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ25vIGVsZW1lbnQgb3Igc2NvcGUgZ2l2ZW4nKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICB2YXIgc2hhcmRzID0gYXNBcnJheShzY29wZSk7XG4gICAgaWYgKHNoYXJkcy5ldmVyeShmdW5jdGlvbiAoc2hhcmQpIHsgcmV0dXJuICFjb250YWlucyhzaGFyZCwgZWxlbWVudCk7IH0pKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZSBlbGVtZW50IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIHNjb3BlJyk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgdmFyIGZvY3VzYWJsZXMgPSB1c2VUYWJiYWJsZXNcbiAgICAgICAgPyBnZXRUYWJiYWJsZU5vZGVzKHNoYXJkcywgbmV3IE1hcCgpKVxuICAgICAgICA6IGdldEZvY3VzYWJsZU5vZGVzKHNoYXJkcywgbmV3IE1hcCgpKTtcbiAgICB2YXIgY3VycmVudCA9IGZvY3VzYWJsZXMuZmluZEluZGV4KGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBub2RlID09PSBlbGVtZW50O1xuICAgIH0pO1xuICAgIGlmIChjdXJyZW50ID09PSAtMSkge1xuICAgICAgICAvLyBhbiBlZGdlIGNhc2UsIHdoZW4gYW5jaG9yIGVsZW1lbnQgaXMgbm90IGZvdW5kXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHByZXY6IGZvY3VzYWJsZXNbY3VycmVudCAtIDFdLFxuICAgICAgICBuZXh0OiBmb2N1c2FibGVzW2N1cnJlbnQgKyAxXSxcbiAgICAgICAgZmlyc3Q6IGZvY3VzYWJsZXNbMF0sXG4gICAgICAgIGxhc3Q6IGZvY3VzYWJsZXNbZm9jdXNhYmxlcy5sZW5ndGggLSAxXSxcbiAgICB9O1xufTtcbnZhciBnZXRCb3VuZGFyeSA9IGZ1bmN0aW9uIChzaGFyZHMsIHVzZVRhYmJhYmxlcykge1xuICAgIHZhciBzZXQgPSB1c2VUYWJiYWJsZXNcbiAgICAgICAgPyBnZXRUYWJiYWJsZU5vZGVzKGFzQXJyYXkoc2hhcmRzKSwgbmV3IE1hcCgpKVxuICAgICAgICA6IGdldEZvY3VzYWJsZU5vZGVzKGFzQXJyYXkoc2hhcmRzKSwgbmV3IE1hcCgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaXJzdDogc2V0WzBdLFxuICAgICAgICBsYXN0OiBzZXRbc2V0Lmxlbmd0aCAtIDFdLFxuICAgIH07XG59O1xudmFyIGRlZmF1bHRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHNjb3BlOiBkb2N1bWVudC5ib2R5LFxuICAgICAgICBjeWNsZTogdHJ1ZSxcbiAgICAgICAgb25seVRhYmJhYmxlOiB0cnVlLFxuICAgIH0sIG9wdGlvbnMpO1xufTtcbnZhciBtb3ZlRm9jdXMgPSBmdW5jdGlvbiAoZnJvbUVsZW1lbnQsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgbmV3T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zKG9wdGlvbnMpO1xuICAgIHZhciBzb2x1dGlvbiA9IGdldFJlbGF0aXZlRm9jdXNhYmxlKGZyb21FbGVtZW50LCBuZXdPcHRpb25zLnNjb3BlLCBuZXdPcHRpb25zLm9ubHlUYWJiYWJsZSk7XG4gICAgaWYgKCFzb2x1dGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0YXJnZXQgPSBjYihzb2x1dGlvbiwgbmV3T3B0aW9ucy5jeWNsZSk7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgICBmb2N1c09uKHRhcmdldC5ub2RlLCBuZXdPcHRpb25zLmZvY3VzT3B0aW9ucyk7XG4gICAgfVxufTtcbi8qKlxuICogZm9jdXNlcyBuZXh0IGVsZW1lbnQgaW4gdGhlIHRhYi1vcmRlclxuICogQHBhcmFtIGZyb21FbGVtZW50IC0gY29tbW9uIHBhcmVudCB0byBzY29wZSBhY3RpdmUgZWxlbWVudCBzZWFyY2ggb3IgdGFiIGN5Y2xlIG9yZGVyXG4gKiBAcGFyYW0ge0ZvY3VzTmV4dE9wdGlvbnN9IFtvcHRpb25zXSAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c05leHRFbGVtZW50ID0gZnVuY3Rpb24gKGZyb21FbGVtZW50LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBtb3ZlRm9jdXMoZnJvbUVsZW1lbnQsIG9wdGlvbnMsIGZ1bmN0aW9uIChfYSwgY3ljbGUpIHtcbiAgICAgICAgdmFyIG5leHQgPSBfYS5uZXh0LCBmaXJzdCA9IF9hLmZpcnN0O1xuICAgICAgICByZXR1cm4gbmV4dCB8fCAoY3ljbGUgJiYgZmlyc3QpO1xuICAgIH0pO1xufTtcbi8qKlxuICogZm9jdXNlcyBwcmV2IGVsZW1lbnQgaW4gdGhlIHRhYiBvcmRlclxuICogQHBhcmFtIGZyb21FbGVtZW50IC0gY29tbW9uIHBhcmVudCB0byBzY29wZSBhY3RpdmUgZWxlbWVudCBzZWFyY2ggb3IgdGFiIGN5Y2xlIG9yZGVyXG4gKiBAcGFyYW0ge0ZvY3VzTmV4dE9wdGlvbnN9IFtvcHRpb25zXSAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c1ByZXZFbGVtZW50ID0gZnVuY3Rpb24gKGZyb21FbGVtZW50LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBtb3ZlRm9jdXMoZnJvbUVsZW1lbnQsIG9wdGlvbnMsIGZ1bmN0aW9uIChfYSwgY3ljbGUpIHtcbiAgICAgICAgdmFyIHByZXYgPSBfYS5wcmV2LCBsYXN0ID0gX2EubGFzdDtcbiAgICAgICAgcmV0dXJuIHByZXYgfHwgKGN5Y2xlICYmIGxhc3QpO1xuICAgIH0pO1xufTtcbnZhciBwaWNrQm91bmRhcnkgPSBmdW5jdGlvbiAoc2NvcGUsIG9wdGlvbnMsIHdoYXQpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGJvdW5kYXJ5ID0gZ2V0Qm91bmRhcnkoc2NvcGUsIChfYSA9IG9wdGlvbnMub25seVRhYmJhYmxlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlKTtcbiAgICB2YXIgbm9kZSA9IGJvdW5kYXJ5W3doYXRdO1xuICAgIGlmIChub2RlKSB7XG4gICAgICAgIGZvY3VzT24obm9kZS5ub2RlLCBvcHRpb25zLmZvY3VzT3B0aW9ucyk7XG4gICAgfVxufTtcbi8qKlxuICogZm9jdXNlcyBmaXJzdCBlbGVtZW50IGluIHRoZSB0YWItb3JkZXJcbiAqIEBwYXJhbSB7Rm9jdXNOZXh0T3B0aW9uc30gb3B0aW9ucyAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c0ZpcnN0RWxlbWVudCA9IGZ1bmN0aW9uIChzY29wZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgcGlja0JvdW5kYXJ5KHNjb3BlLCBvcHRpb25zLCAnZmlyc3QnKTtcbn07XG4vKipcbiAqIGZvY3VzZXMgbGFzdCBlbGVtZW50IGluIHRoZSB0YWIgb3JkZXJcbiAqIEBwYXJhbSB7Rm9jdXNOZXh0T3B0aW9uc30gb3B0aW9ucyAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c0xhc3RFbGVtZW50ID0gZnVuY3Rpb24gKHNjb3BlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBwaWNrQm91bmRhcnkoc2NvcGUsIG9wdGlvbnMsICdsYXN0Jyk7XG59O1xuIiwiaW1wb3J0IHsgY29ycmVjdE5vZGVzIH0gZnJvbSAnLi91dGlscy9jb3JyZWN0Rm9jdXMnO1xuaW1wb3J0IHsgcGlja0ZvY3VzYWJsZSB9IGZyb20gJy4vdXRpbHMvZmlyc3RGb2N1cyc7XG5pbXBvcnQgeyBpc0d1YXJkIH0gZnJvbSAnLi91dGlscy9pcyc7XG5leHBvcnQgdmFyIE5FV19GT0NVUyA9ICdORVdfRk9DVVMnO1xuLyoqXG4gKiBNYWluIHNvbHZlciBmb3IgdGhlIFwiZmluZCBuZXh0IGZvY3VzXCIgcXVlc3Rpb25cbiAqIEBwYXJhbSBpbm5lck5vZGVzIC0gdXNlZCB0byBjb250cm9sIFwicmV0dXJuIGZvY3VzXCJcbiAqIEBwYXJhbSBpbm5lclRhYmJhYmxlcyAtIHVzZWQgdG8gY29udHJvbCBcImF1dG9mb2N1c1wiXG4gKiBAcGFyYW0gb3V0ZXJOb2Rlc1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnRcbiAqIEBwYXJhbSBsYXN0Tm9kZVxuICogQHJldHVybnMge251bWJlcnxzdHJpbmd8dW5kZWZpbmVkfCp9XG4gKi9cbmV4cG9ydCB2YXIgbmV3Rm9jdXMgPSBmdW5jdGlvbiAoaW5uZXJOb2RlcywgaW5uZXJUYWJiYWJsZXMsIG91dGVyTm9kZXMsIGFjdGl2ZUVsZW1lbnQsIGxhc3ROb2RlKSB7XG4gICAgdmFyIGNudCA9IGlubmVyTm9kZXMubGVuZ3RoO1xuICAgIHZhciBmaXJzdEZvY3VzID0gaW5uZXJOb2Rlc1swXTtcbiAgICB2YXIgbGFzdEZvY3VzID0gaW5uZXJOb2Rlc1tjbnQgLSAxXTtcbiAgICB2YXIgaXNPbkd1YXJkID0gaXNHdWFyZChhY3RpdmVFbGVtZW50KTtcbiAgICAvLyBmb2N1cyBpcyBpbnNpZGVcbiAgICBpZiAoYWN0aXZlRWxlbWVudCAmJiBpbm5lck5vZGVzLmluZGV4T2YoYWN0aXZlRWxlbWVudCkgPj0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgYWN0aXZlSW5kZXggPSBhY3RpdmVFbGVtZW50ICE9PSB1bmRlZmluZWQgPyBvdXRlck5vZGVzLmluZGV4T2YoYWN0aXZlRWxlbWVudCkgOiAtMTtcbiAgICB2YXIgbGFzdEluZGV4ID0gbGFzdE5vZGUgPyBvdXRlck5vZGVzLmluZGV4T2YobGFzdE5vZGUpIDogYWN0aXZlSW5kZXg7XG4gICAgdmFyIGxhc3ROb2RlSW5zaWRlID0gbGFzdE5vZGUgPyBpbm5lck5vZGVzLmluZGV4T2YobGFzdE5vZGUpIDogLTE7XG4gICAgLy8gbm8gYWN0aXZlIGZvY3VzIChvciBmb2N1cyBpcyBvbiB0aGUgYm9keSlcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIC8vIGtub3duIGZhbGxiYWNrXG4gICAgICAgIGlmIChsYXN0Tm9kZUluc2lkZSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTkVXX0ZPQ1VTO1xuICAgIH1cbiAgICAvLyBuZXcgZm9jdXMsIG5vdGhpbmcgdG8gY2FsY3VsYXRlXG4gICAgaWYgKGxhc3ROb2RlSW5zaWRlID09PSAtMSkge1xuICAgICAgICByZXR1cm4gTkVXX0ZPQ1VTO1xuICAgIH1cbiAgICB2YXIgaW5kZXhEaWZmID0gYWN0aXZlSW5kZXggLSBsYXN0SW5kZXg7XG4gICAgdmFyIGZpcnN0Tm9kZUluZGV4ID0gb3V0ZXJOb2Rlcy5pbmRleE9mKGZpcnN0Rm9jdXMpO1xuICAgIHZhciBsYXN0Tm9kZUluZGV4ID0gb3V0ZXJOb2Rlcy5pbmRleE9mKGxhc3RGb2N1cyk7XG4gICAgdmFyIGNvcnJlY3RlZE5vZGVzID0gY29ycmVjdE5vZGVzKG91dGVyTm9kZXMpO1xuICAgIHZhciBjb3JyZWN0ZWRJbmRleCA9IGFjdGl2ZUVsZW1lbnQgIT09IHVuZGVmaW5lZCA/IGNvcnJlY3RlZE5vZGVzLmluZGV4T2YoYWN0aXZlRWxlbWVudCkgOiAtMTtcbiAgICB2YXIgY29ycmVjdGVkSW5kZXhEaWZmID0gY29ycmVjdGVkSW5kZXggLSAobGFzdE5vZGUgPyBjb3JyZWN0ZWROb2Rlcy5pbmRleE9mKGxhc3ROb2RlKSA6IGFjdGl2ZUluZGV4KTtcbiAgICAvLyBvbGQgZm9jdXNcbiAgICBpZiAoIWluZGV4RGlmZiAmJiBsYXN0Tm9kZUluc2lkZSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICB9XG4gICAgLy8gbm8gdGFiYmFibGUgZWxlbWVudHMsIGF1dG9mb2N1cyBpcyBub3QgcG9zc2libGVcbiAgICBpZiAoaW5uZXJUYWJiYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGFuIGVkZ2UgY2FzZSB3aXRoIG5vIHRhYmJhYmxlIGVsZW1lbnRzXG4gICAgICAgIC8vIHJldHVybiB0aGUgbGFzdCBmb2N1c2FibGUgb25lXG4gICAgICAgIC8vIHdpdGggc29tZSBwcm9iYWJpbGl0eSB0aGlzIHdpbGwgcHJldmVudCBmb2N1cyBmcm9tIGN5Y2xpbmcgYWNyb3NzIHRoZSBsb2NrLCBidXQgdGhlcmUgaXMgbm8gdGFiYmFsZSBlbGVtZW50cyB0byBjeWNsZSB0b1xuICAgICAgICByZXR1cm4gbGFzdE5vZGVJbnNpZGU7XG4gICAgfVxuICAgIHZhciByZXR1cm5GaXJzdE5vZGUgPSBwaWNrRm9jdXNhYmxlKGlubmVyTm9kZXMsIGlubmVyVGFiYmFibGVzWzBdKTtcbiAgICB2YXIgcmV0dXJuTGFzdE5vZGUgPSBwaWNrRm9jdXNhYmxlKGlubmVyTm9kZXMsIGlubmVyVGFiYmFibGVzW2lubmVyVGFiYmFibGVzLmxlbmd0aCAtIDFdKTtcbiAgICAvLyBmaXJzdCBlbGVtZW50XG4gICAgaWYgKGFjdGl2ZUluZGV4IDw9IGZpcnN0Tm9kZUluZGV4ICYmIGlzT25HdWFyZCAmJiBNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgICAgICByZXR1cm4gcmV0dXJuTGFzdE5vZGU7XG4gICAgfVxuICAgIC8vIGxhc3QgZWxlbWVudFxuICAgIGlmIChhY3RpdmVJbmRleCA+PSBsYXN0Tm9kZUluZGV4ICYmIGlzT25HdWFyZCAmJiBNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgICAgICByZXR1cm4gcmV0dXJuRmlyc3ROb2RlO1xuICAgIH1cbiAgICAvLyBqdW1wIG91dCwgYnV0IG5vdCBvbiB0aGUgZ3VhcmRcbiAgICBpZiAoaW5kZXhEaWZmICYmIE1hdGguYWJzKGNvcnJlY3RlZEluZGV4RGlmZikgPiAxKSB7XG4gICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICB9XG4gICAgLy8gZm9jdXMgYWJvdmUgbG9ja1xuICAgIGlmIChhY3RpdmVJbmRleCA8PSBmaXJzdE5vZGVJbmRleCkge1xuICAgICAgICByZXR1cm4gcmV0dXJuTGFzdE5vZGU7XG4gICAgfVxuICAgIC8vIGZvY3VzIGJlbG93IGxvY2tcbiAgICBpZiAoYWN0aXZlSW5kZXggPiBsYXN0Tm9kZUluZGV4KSB7XG4gICAgICAgIHJldHVybiByZXR1cm5GaXJzdE5vZGU7XG4gICAgfVxuICAgIC8vIGluZGV4IGlzIGluc2lkZSB0YWIgb3JkZXIsIGJ1dCBvdXRzaWRlIExvY2tcbiAgICBpZiAoaW5kZXhEaWZmKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3ROb2RlSW5zaWRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY250ICsgbGFzdE5vZGVJbnNpZGUgKyBpbmRleERpZmYpICUgY250O1xuICAgIH1cbiAgICAvLyBkbyBub3RoaW5nXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJpbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgeyBpc0F1dG9Gb2N1c0FsbG93ZWRDYWNoZWQsIGlzVmlzaWJsZUNhY2hlZCwgbm90SGlkZGVuSW5wdXQgfSBmcm9tICcuL2lzJztcbmltcG9ydCB7IG9yZGVyQnlUYWJJbmRleCB9IGZyb20gJy4vdGFiT3JkZXInO1xuaW1wb3J0IHsgZ2V0Rm9jdXNhYmxlcywgZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXMgfSBmcm9tICcuL3RhYlV0aWxzJztcbi8qKlxuICogZ2l2ZW4gbGlzdCBvZiBmb2N1c2FibGUgZWxlbWVudHMga2VlcHMgdGhlIG9uZXMgdXNlciBjYW4gaW50ZXJhY3Qgd2l0aFxuICogQHBhcmFtIG5vZGVzXG4gKiBAcGFyYW0gdmlzaWJpbGl0eUNhY2hlXG4gKi9cbmV4cG9ydCB2YXIgZmlsdGVyRm9jdXNhYmxlID0gZnVuY3Rpb24gKG5vZGVzLCB2aXNpYmlsaXR5Q2FjaGUpIHtcbiAgICByZXR1cm4gdG9BcnJheShub2RlcylcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gaXNWaXNpYmxlQ2FjaGVkKHZpc2liaWxpdHlDYWNoZSwgbm9kZSk7IH0pXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vdEhpZGRlbklucHV0KG5vZGUpOyB9KTtcbn07XG5leHBvcnQgdmFyIGZpbHRlckF1dG9Gb2N1c2FibGUgPSBmdW5jdGlvbiAobm9kZXMsIGNhY2hlKSB7XG4gICAgaWYgKGNhY2hlID09PSB2b2lkIDApIHsgY2FjaGUgPSBuZXcgTWFwKCk7IH1cbiAgICByZXR1cm4gdG9BcnJheShub2RlcykuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBpc0F1dG9Gb2N1c0FsbG93ZWRDYWNoZWQoY2FjaGUsIG5vZGUpOyB9KTtcbn07XG4vKipcbiAqICFfX1dBUk5JTkdfXyEgTG93IGxldmVsIEFQSS5cbiAqIEByZXR1cm5zIGFsbCB0YWJiYWJsZSBub2Rlc1xuICpcbiAqIEBzZWUge0BsaW5rIGdldEZvY3VzYWJsZU5vZGVzfSB0byBnZXQgYW55IGZvY3VzYWJsZSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHRvcE5vZGVzIC0gYXJyYXkgb2YgdG9wIGxldmVsIEhUTUxFbGVtZW50cyB0byBzZWFyY2ggaW5zaWRlXG4gKiBAcGFyYW0gdmlzaWJpbGl0eUNhY2hlIC0gYW4gY2FjaGUgdG8gc3RvcmUgaW50ZXJtZWRpYXRlIG1lYXN1cmVtZW50cy4gRXhwZWN0ZWQgdG8gYmUgYSBmcmVzaCBgbmV3IE1hcGAgb24gZXZlcnkgY2FsbFxuICovXG5leHBvcnQgdmFyIGdldFRhYmJhYmxlTm9kZXMgPSBmdW5jdGlvbiAodG9wTm9kZXMsIHZpc2liaWxpdHlDYWNoZSwgd2l0aEd1YXJkcykge1xuICAgIHJldHVybiBvcmRlckJ5VGFiSW5kZXgoZmlsdGVyRm9jdXNhYmxlKGdldEZvY3VzYWJsZXModG9wTm9kZXMsIHdpdGhHdWFyZHMpLCB2aXNpYmlsaXR5Q2FjaGUpLCB0cnVlLCB3aXRoR3VhcmRzKTtcbn07XG4vKipcbiAqICFfX1dBUk5JTkdfXyEgTG93IGxldmVsIEFQSS5cbiAqXG4gKiBAcmV0dXJucyBhbnl0aGluZyBcImZvY3VzYWJsZVwiLCBub3Qgb25seSB0YWJiYWJsZS4gVGhlIGRpZmZlcmVuY2UgaXMgaW4gYHRhYkluZGV4PS0xYFxuICogKHdpdGhvdXQgZ3VhcmRzLCBhcyBsb25nIGFzIHRoZXkgYXJlIG5vdCBleHBlY3RlZCB0byBiZSBldmVyIGZvY3VzZWQpXG4gKlxuICogQHNlZSB7QGxpbmsgZ2V0VGFiYmFibGVOb2Rlc30gdG8gZ2V0IG9ubHkgdGFiYmxlIG5vZGVzIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gdG9wTm9kZXMgLSBhcnJheSBvZiB0b3AgbGV2ZWwgSFRNTEVsZW1lbnRzIHRvIHNlYXJjaCBpbnNpZGVcbiAqIEBwYXJhbSB2aXNpYmlsaXR5Q2FjaGUgLSBhbiBjYWNoZSB0byBzdG9yZSBpbnRlcm1lZGlhdGUgbWVhc3VyZW1lbnRzLiBFeHBlY3RlZCB0byBiZSBhIGZyZXNoIGBuZXcgTWFwYCBvbiBldmVyeSBjYWxsXG4gKi9cbmV4cG9ydCB2YXIgZ2V0Rm9jdXNhYmxlTm9kZXMgPSBmdW5jdGlvbiAodG9wTm9kZXMsIHZpc2liaWxpdHlDYWNoZSkge1xuICAgIHJldHVybiBvcmRlckJ5VGFiSW5kZXgoZmlsdGVyRm9jdXNhYmxlKGdldEZvY3VzYWJsZXModG9wTm9kZXMpLCB2aXNpYmlsaXR5Q2FjaGUpLCBmYWxzZSk7XG59O1xuLyoqXG4gKiByZXR1cm4gbGlzdCBvZiBub2RlcyB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gYmUgYXV0by1mb2N1c2VkXG4gKiBAcGFyYW0gdG9wTm9kZVxuICogQHBhcmFtIHZpc2liaWxpdHlDYWNoZVxuICovXG5leHBvcnQgdmFyIHBhcmVudEF1dG9mb2N1c2FibGVzID0gZnVuY3Rpb24gKHRvcE5vZGUsIHZpc2liaWxpdHlDYWNoZSkge1xuICAgIHJldHVybiBmaWx0ZXJGb2N1c2FibGUoZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXModG9wTm9kZSksIHZpc2liaWxpdHlDYWNoZSk7XG59O1xuLypcbiAqIERldGVybWluZXMgaWYgZWxlbWVudCBpcyBjb250YWluZWQgaW4gc2NvcGUsIGluY2x1ZGluZyBuZXN0ZWQgc2hhZG93IERPTXNcbiAqL1xuZXhwb3J0IHZhciBjb250YWlucyA9IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCkge1xuICAgIGlmIChzY29wZS5zaGFkb3dSb290KSB7XG4gICAgICAgIHJldHVybiBjb250YWlucyhzY29wZS5zaGFkb3dSb290LCBlbGVtZW50KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc2NvcGUpLmNvbnRhaW5zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihzY29wZSkuY29udGFpbnMuY2FsbChzY29wZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b0FycmF5KHNjb3BlLmNoaWxkcmVuKS5zb21lKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaWZyYW1lQm9keSA9IChfYSA9IGNoaWxkLmNvbnRlbnREb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJvZHk7XG4gICAgICAgICAgICAgICAgaWYgKGlmcmFtZUJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKGlmcmFtZUJvZHksIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbnMoY2hpbGQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgRk9DVVNfRElTQUJMRUQsIEZPQ1VTX0dST1VQIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGFzQXJyYXksIHRvQXJyYXkgfSBmcm9tICcuL2FycmF5Jztcbi8qKlxuICogaW4gY2FzZSBvZiBtdWx0aXBsZSBub2RlcyBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXJcbiAqIGtlZXBzIG9ubHkgdG9wIG9uZXNcbiAqIHRoaXMgaXMgTyhubG9nbilcbiAqIEBwYXJhbSBub2Rlc1xuICogQHJldHVybnMgeyp9XG4gKi9cbnZhciBmaWx0ZXJOZXN0ZWQgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICB2YXIgY29udGFpbmVkID0gbmV3IFNldCgpO1xuICAgIHZhciBsID0gbm9kZXMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSArPSAxKSB7XG4gICAgICAgIGZvciAodmFyIGogPSBpICsgMTsgaiA8IGw7IGogKz0gMSkge1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gbm9kZXNbaV0uY29tcGFyZURvY3VtZW50UG9zaXRpb24obm9kZXNbal0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuICAgICAgICAgICAgaWYgKChwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSA+IDApIHtcbiAgICAgICAgICAgICAgICBjb250YWluZWQuYWRkKGopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTlMpID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lZC5hZGQoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcihmdW5jdGlvbiAoXywgaW5kZXgpIHsgcmV0dXJuICFjb250YWluZWQuaGFzKGluZGV4KTsgfSk7XG59O1xuLyoqXG4gKiBmaW5kcyB0b3AgbW9zdCBwYXJlbnQgZm9yIGEgbm9kZVxuICogQHBhcmFtIG5vZGVcbiAqIEByZXR1cm5zIHsqfVxuICovXG52YXIgZ2V0VG9wUGFyZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlID8gZ2V0VG9wUGFyZW50KG5vZGUucGFyZW50Tm9kZSkgOiBub2RlO1xufTtcbi8qKlxuICogcmV0dXJucyBhbGwgXCJmb2N1cyBjb250YWluZXJzXCIgaW5zaWRlIGEgZ2l2ZW4gbm9kZVxuICogQHBhcmFtIG5vZGUgLSBub2RlIG9yIG5vZGVzIHRvIGxvb2sgaW5zaWRlXG4gKiBAcmV0dXJucyBFbGVtZW50W11cbiAqL1xuZXhwb3J0IHZhciBnZXRBbGxBZmZlY3RlZE5vZGVzID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgbm9kZXMgPSBhc0FycmF5KG5vZGUpO1xuICAgIHJldHVybiBub2Rlcy5maWx0ZXIoQm9vbGVhbikucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGN1cnJlbnROb2RlKSB7XG4gICAgICAgIHZhciBncm91cCA9IGN1cnJlbnROb2RlLmdldEF0dHJpYnV0ZShGT0NVU19HUk9VUCk7XG4gICAgICAgIGFjYy5wdXNoLmFwcGx5KGFjYywgKGdyb3VwXG4gICAgICAgICAgICA/IGZpbHRlck5lc3RlZCh0b0FycmF5KGdldFRvcFBhcmVudChjdXJyZW50Tm9kZSkucXVlcnlTZWxlY3RvckFsbChcIltcIi5jb25jYXQoRk9DVVNfR1JPVVAsIFwiPVxcXCJcIikuY29uY2F0KGdyb3VwLCBcIlxcXCJdOm5vdChbXCIpLmNvbmNhdChGT0NVU19ESVNBQkxFRCwgXCI9XFxcImRpc2FibGVkXFxcIl0pXCIpKSkpXG4gICAgICAgICAgICA6IFtjdXJyZW50Tm9kZV0pKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG59O1xuIiwiLypcbklFMTEgc3VwcG9ydFxuICovXG5leHBvcnQgdmFyIHRvQXJyYXkgPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciByZXQgPSBBcnJheShhLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHJldFtpXSA9IGFbaV07XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59O1xuZXhwb3J0IHZhciBhc0FycmF5ID0gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIChBcnJheS5pc0FycmF5KGEpID8gYSA6IFthXSk7IH07XG5leHBvcnQgdmFyIGdldEZpcnN0ID0gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIChBcnJheS5pc0FycmF5KGEpID8gYVswXSA6IGEpOyB9O1xuIiwiaW1wb3J0IHsgZmlsdGVyQXV0b0ZvY3VzYWJsZSB9IGZyb20gJy4vRE9NdXRpbHMnO1xuaW1wb3J0IHsgcGlja0ZpcnN0Rm9jdXMgfSBmcm9tICcuL2ZpcnN0Rm9jdXMnO1xuaW1wb3J0IHsgZ2V0RGF0YXNldCB9IGZyb20gJy4vaXMnO1xudmFyIGZpbmRBdXRvRm9jdXNlZCA9IGZ1bmN0aW9uIChhdXRvRm9jdXNhYmxlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBhdXRvZm9jdXMgPSAoX2EgPSBnZXREYXRhc2V0KG5vZGUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXV0b2ZvY3VzO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIG5vZGUuYXV0b2ZvY3VzIHx8XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgKGF1dG9mb2N1cyAhPT0gdW5kZWZpbmVkICYmIGF1dG9mb2N1cyAhPT0gJ2ZhbHNlJykgfHxcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBhdXRvRm9jdXNhYmxlcy5pbmRleE9mKG5vZGUpID49IDApO1xuICAgIH07XG59O1xuZXhwb3J0IHZhciBwaWNrQXV0b2ZvY3VzID0gZnVuY3Rpb24gKG5vZGVzSW5kZXhlcywgb3JkZXJlZE5vZGVzLCBncm91cHMpIHtcbiAgICB2YXIgbm9kZXMgPSBub2Rlc0luZGV4ZXMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuICAgIHZhciBhdXRvRm9jdXNhYmxlID0gZmlsdGVyQXV0b0ZvY3VzYWJsZShub2Rlcy5maWx0ZXIoZmluZEF1dG9Gb2N1c2VkKGdyb3VwcykpKTtcbiAgICBpZiAoYXV0b0ZvY3VzYWJsZSAmJiBhdXRvRm9jdXNhYmxlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcGlja0ZpcnN0Rm9jdXMoYXV0b0ZvY3VzYWJsZSk7XG4gICAgfVxuICAgIHJldHVybiBwaWNrRmlyc3RGb2N1cyhmaWx0ZXJBdXRvRm9jdXNhYmxlKG9yZGVyZWROb2RlcykpO1xufTtcbiIsImltcG9ydCB7IGlzUmFkaW9FbGVtZW50IH0gZnJvbSAnLi9pcyc7XG52YXIgZmluZFNlbGVjdGVkUmFkaW8gPSBmdW5jdGlvbiAobm9kZSwgbm9kZXMpIHtcbiAgICByZXR1cm4gbm9kZXNcbiAgICAgICAgLmZpbHRlcihpc1JhZGlvRWxlbWVudClcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLm5hbWUgPT09IG5vZGUubmFtZTsgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmNoZWNrZWQ7IH0pWzBdIHx8IG5vZGU7XG59O1xuZXhwb3J0IHZhciBjb3JyZWN0Tm9kZSA9IGZ1bmN0aW9uIChub2RlLCBub2Rlcykge1xuICAgIGlmIChpc1JhZGlvRWxlbWVudChub2RlKSAmJiBub2RlLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRTZWxlY3RlZFJhZGlvKG5vZGUsIG5vZGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59O1xuLyoqXG4gKiBnaXZpbmcgYSBzZXQgb2YgcmFkaW8gaW5wdXRzIGtlZXBzIG9ubHkgc2VsZWN0ZWQgKHRhYmJhYmxlKSBvbmVzXG4gKiBAcGFyYW0gbm9kZXNcbiAqL1xuZXhwb3J0IHZhciBjb3JyZWN0Tm9kZXMgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICAvLyBJRTExIGhhcyBubyBTZXQoYXJyYXkpIGNvbnN0cnVjdG9yXG4gICAgdmFyIHJlc3VsdFNldCA9IG5ldyBTZXQoKTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiByZXN1bHRTZXQuYWRkKGNvcnJlY3ROb2RlKG5vZGUsIG5vZGVzKSk7IH0pO1xuICAgIC8vIHVzaW5nIGZpbHRlciB0byBzdXBwb3J0IElFMTFcbiAgICByZXR1cm4gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiByZXN1bHRTZXQuaGFzKG5vZGUpOyB9KTtcbn07XG4iLCJpbXBvcnQgeyBjb3JyZWN0Tm9kZSB9IGZyb20gJy4vY29ycmVjdEZvY3VzJztcbmV4cG9ydCB2YXIgcGlja0ZpcnN0Rm9jdXMgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICBpZiAobm9kZXNbMF0gJiYgbm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gY29ycmVjdE5vZGUobm9kZXNbMF0sIG5vZGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzWzBdO1xufTtcbmV4cG9ydCB2YXIgcGlja0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIChub2Rlcywgbm9kZSkge1xuICAgIHJldHVybiBub2Rlcy5pbmRleE9mKGNvcnJlY3ROb2RlKG5vZGUsIG5vZGVzKSk7XG59O1xuIiwiLyoqXG4gKiByZXR1cm5zIGFjdGl2ZSBlbGVtZW50IGZyb20gZG9jdW1lbnQgb3IgZnJvbSBuZXN0ZWQgc2hhZG93ZG9tc1xuICovXG5pbXBvcnQgeyBzYWZlUHJvYmUgfSBmcm9tICcuL3NhZmUnO1xuLyoqXG4gKiByZXR1cm5zIGN1cnJlbnQgYWN0aXZlIGVsZW1lbnQuIElmIHRoZSBhY3RpdmUgZWxlbWVudCBpcyBhIFwiY29udGFpbmVyXCIgaXRzZWxmKHNoYWRvd1Jvb3Qgb3IgaWZyYW1lKSByZXR1cm5zIGFjdGl2ZSBlbGVtZW50IGluc2lkZSBpdFxuICogQHBhcmFtIFtpbkRvY3VtZW50XVxuICovXG5leHBvcnQgdmFyIGdldEFjdGl2ZUVsZW1lbnQgPSBmdW5jdGlvbiAoaW5Eb2N1bWVudCkge1xuICAgIGlmIChpbkRvY3VtZW50ID09PSB2b2lkIDApIHsgaW5Eb2N1bWVudCA9IGRvY3VtZW50OyB9XG4gICAgaWYgKCFpbkRvY3VtZW50IHx8ICFpbkRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBpbkRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuIChhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3RcbiAgICAgICAgPyBnZXRBY3RpdmVFbGVtZW50KGFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdClcbiAgICAgICAgOiBhY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQgJiYgc2FmZVByb2JlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFjdGl2ZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDsgfSlcbiAgICAgICAgICAgID8gZ2V0QWN0aXZlRWxlbWVudChhY3RpdmVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpXG4gICAgICAgICAgICA6IGFjdGl2ZUVsZW1lbnQpO1xufTtcbiIsImltcG9ydCB7IEZPQ1VTX05PX0FVVE9GT0NVUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG52YXIgaXNFbGVtZW50SGlkZGVuID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyB3ZSBjYW4gbWVhc3VyZSBvbmx5IFwiZWxlbWVudHNcIlxuICAgIC8vIGNvbnNpZGVyIG90aGVycyBhcyBcInZpc2libGVcIlxuICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgaWYgKCFjb21wdXRlZFN0eWxlIHx8ICFjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpID09PSAnbm9uZScgfHwgY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICdoaWRkZW4nKTtcbn07XG52YXIgZ2V0UGFyZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSBjYW4gYWxzbyBwb2ludCBvbiBTaGFkb3dSb290LiBJbiB0aGlzIGNhc2UgLmhvc3Qgd2lsbCBwb2ludCBvbiB0aGUgbmV4dCBub2RlXG4gICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZSAmJiBub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERVxuICAgICAgICA/IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBub2RlLnBhcmVudE5vZGUuaG9zdFxuICAgICAgICA6IG5vZGUucGFyZW50Tm9kZTtcbn07XG52YXIgaXNUb3BOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIG5vZGUgPT09IGRvY3VtZW50IHx8IChub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSk7XG59O1xudmFyIGlzSW5lcnQgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5oYXNBdHRyaWJ1dGUoJ2luZXJ0Jyk7IH07XG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Rlc3RpbmctbGlicmFyeS9qZXN0LWRvbS9ibG9iL21haW4vc3JjL3RvLWJlLXZpc2libGUuanNcbiAqL1xudmFyIGlzVmlzaWJsZVVuY2FjaGVkID0gZnVuY3Rpb24gKG5vZGUsIGNoZWNrUGFyZW50KSB7XG4gICAgcmV0dXJuICFub2RlIHx8IGlzVG9wTm9kZShub2RlKSB8fCAoIWlzRWxlbWVudEhpZGRlbihub2RlKSAmJiAhaXNJbmVydChub2RlKSAmJiBjaGVja1BhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKSk7XG59O1xuZXhwb3J0IHZhciBpc1Zpc2libGVDYWNoZWQgPSBmdW5jdGlvbiAodmlzaWJpbGl0eUNhY2hlLCBub2RlKSB7XG4gICAgdmFyIGNhY2hlZCA9IHZpc2liaWxpdHlDYWNoZS5nZXQobm9kZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBpc1Zpc2libGVVbmNhY2hlZChub2RlLCBpc1Zpc2libGVDYWNoZWQuYmluZCh1bmRlZmluZWQsIHZpc2liaWxpdHlDYWNoZSkpO1xuICAgIHZpc2liaWxpdHlDYWNoZS5zZXQobm9kZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBpc0F1dG9Gb2N1c0FsbG93ZWRVbmNhY2hlZCA9IGZ1bmN0aW9uIChub2RlLCBjaGVja1BhcmVudCkge1xuICAgIHJldHVybiBub2RlICYmICFpc1RvcE5vZGUobm9kZSkgPyAoaXNBdXRvRm9jdXNBbGxvd2VkKG5vZGUpID8gY2hlY2tQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSkgOiBmYWxzZSkgOiB0cnVlO1xufTtcbmV4cG9ydCB2YXIgaXNBdXRvRm9jdXNBbGxvd2VkQ2FjaGVkID0gZnVuY3Rpb24gKGNhY2hlLCBub2RlKSB7XG4gICAgdmFyIGNhY2hlZCA9IGNhY2hlLmdldChub2RlKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGlzQXV0b0ZvY3VzQWxsb3dlZFVuY2FjaGVkKG5vZGUsIGlzQXV0b0ZvY3VzQWxsb3dlZENhY2hlZC5iaW5kKHVuZGVmaW5lZCwgY2FjaGUpKTtcbiAgICBjYWNoZS5zZXQobm9kZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCB2YXIgZ2V0RGF0YXNldCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBub2RlLmRhdGFzZXQ7XG59O1xuZXhwb3J0IHZhciBpc0hUTUxCdXR0b25FbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ0JVVFRPTic7IH07XG5leHBvcnQgdmFyIGlzSFRNTElucHV0RWxlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdJTlBVVCc7IH07XG5leHBvcnQgdmFyIGlzUmFkaW9FbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gaXNIVE1MSW5wdXRFbGVtZW50KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ3JhZGlvJztcbn07XG5leHBvcnQgdmFyIG5vdEhpZGRlbklucHV0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gISgoaXNIVE1MSW5wdXRFbGVtZW50KG5vZGUpIHx8IGlzSFRNTEJ1dHRvbkVsZW1lbnQobm9kZSkpICYmIChub2RlLnR5cGUgPT09ICdoaWRkZW4nIHx8IG5vZGUuZGlzYWJsZWQpKTtcbn07XG5leHBvcnQgdmFyIGlzQXV0b0ZvY3VzQWxsb3dlZCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIGF0dHJpYnV0ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKEZPQ1VTX05PX0FVVE9GT0NVUyk7XG4gICAgcmV0dXJuICFbdHJ1ZSwgJ3RydWUnLCAnJ10uaW5jbHVkZXMoYXR0cmlidXRlKTtcbn07XG5leHBvcnQgdmFyIGlzR3VhcmQgPSBmdW5jdGlvbiAobm9kZSkgeyB2YXIgX2E7IHJldHVybiBCb29sZWFuKG5vZGUgJiYgKChfYSA9IGdldERhdGFzZXQobm9kZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1c0d1YXJkKSk7IH07XG5leHBvcnQgdmFyIGlzTm90QUd1YXJkID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuICFpc0d1YXJkKG5vZGUpOyB9O1xuZXhwb3J0IHZhciBpc0RlZmluZWQgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4gQm9vbGVhbih4KTsgfTtcbiIsImltcG9ydCB7IHBhcmVudEF1dG9mb2N1c2FibGVzIH0gZnJvbSAnLi9ET011dGlscyc7XG5pbXBvcnQgeyBjb250YWlucyB9IGZyb20gJy4vRE9NdXRpbHMnO1xuaW1wb3J0IHsgYXNBcnJheSB9IGZyb20gJy4vYXJyYXknO1xudmFyIGdldFBhcmVudHMgPSBmdW5jdGlvbiAobm9kZSwgcGFyZW50cykge1xuICAgIGlmIChwYXJlbnRzID09PSB2b2lkIDApIHsgcGFyZW50cyA9IFtdOyB9XG4gICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgZ2V0UGFyZW50cyhub2RlLnBhcmVudE5vZGUuaG9zdCB8fCBub2RlLnBhcmVudE5vZGUsIHBhcmVudHMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50cztcbn07XG4vKipcbiAqIGZpbmRzIGEgcGFyZW50IGZvciBib3RoIG5vZGVBIGFuZCBub2RlQlxuICogQHBhcmFtIG5vZGVBXG4gKiBAcGFyYW0gbm9kZUJcbiAqIEByZXR1cm5zIHtib29sZWFufCp9XG4gKi9cbmV4cG9ydCB2YXIgZ2V0Q29tbW9uUGFyZW50ID0gZnVuY3Rpb24gKG5vZGVBLCBub2RlQikge1xuICAgIHZhciBwYXJlbnRzQSA9IGdldFBhcmVudHMobm9kZUEpO1xuICAgIHZhciBwYXJlbnRzQiA9IGdldFBhcmVudHMobm9kZUIpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRzQS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgY3VycmVudFBhcmVudCA9IHBhcmVudHNBW2ldO1xuICAgICAgICBpZiAocGFyZW50c0IuaW5kZXhPZihjdXJyZW50UGFyZW50KSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZXhwb3J0IHZhciBnZXRUb3BDb21tb25QYXJlbnQgPSBmdW5jdGlvbiAoYmFzZUFjdGl2ZUVsZW1lbnQsIGxlZnRFbnRyeSwgcmlnaHRFbnRyaWVzKSB7XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnRzID0gYXNBcnJheShiYXNlQWN0aXZlRWxlbWVudCk7XG4gICAgdmFyIGxlZnRFbnRyaWVzID0gYXNBcnJheShsZWZ0RW50cnkpO1xuICAgIHZhciBhY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudHNbMF07XG4gICAgdmFyIHRvcENvbW1vbiA9IGZhbHNlO1xuICAgIGxlZnRFbnRyaWVzLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICB0b3BDb21tb24gPSBnZXRDb21tb25QYXJlbnQodG9wQ29tbW9uIHx8IGVudHJ5LCBlbnRyeSkgfHwgdG9wQ29tbW9uO1xuICAgICAgICByaWdodEVudHJpZXMuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKHN1YkVudHJ5KSB7XG4gICAgICAgICAgICB2YXIgY29tbW9uID0gZ2V0Q29tbW9uUGFyZW50KGFjdGl2ZUVsZW1lbnQsIHN1YkVudHJ5KTtcbiAgICAgICAgICAgIGlmIChjb21tb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRvcENvbW1vbiB8fCBjb250YWlucyhjb21tb24sIHRvcENvbW1vbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wQ29tbW9uID0gY29tbW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wQ29tbW9uID0gZ2V0Q29tbW9uUGFyZW50KGNvbW1vbiwgdG9wQ29tbW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIFRPRE86IGFkZCBhc3NlcnQgaGVyZT9cbiAgICByZXR1cm4gdG9wQ29tbW9uO1xufTtcbi8qKlxuICogcmV0dXJuIGxpc3Qgb2Ygbm9kZXMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvIGJlIGF1dG9mb2N1c2VkIGluc2lkZSBhIGdpdmVuIHRvcCBub2Rlc1xuICogQHBhcmFtIGVudHJpZXNcbiAqIEBwYXJhbSB2aXNpYmlsaXR5Q2FjaGVcbiAqL1xuZXhwb3J0IHZhciBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcyA9IGZ1bmN0aW9uIChlbnRyaWVzLCB2aXNpYmlsaXR5Q2FjaGUpIHtcbiAgICByZXR1cm4gZW50cmllcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgbm9kZSkgeyByZXR1cm4gYWNjLmNvbmNhdChwYXJlbnRBdXRvZm9jdXNhYmxlcyhub2RlLCB2aXNpYmlsaXR5Q2FjaGUpKTsgfSwgW10pO1xufTtcbiIsImV4cG9ydCB2YXIgc2FmZVByb2JlID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufTtcbiIsImltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL2FycmF5JztcbmV4cG9ydCB2YXIgdGFiU29ydCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGFUYWIgPSBNYXRoLm1heCgwLCBhLnRhYkluZGV4KTtcbiAgICB2YXIgYlRhYiA9IE1hdGgubWF4KDAsIGIudGFiSW5kZXgpO1xuICAgIHZhciB0YWJEaWZmID0gYVRhYiAtIGJUYWI7XG4gICAgdmFyIGluZGV4RGlmZiA9IGEuaW5kZXggLSBiLmluZGV4O1xuICAgIGlmICh0YWJEaWZmKSB7XG4gICAgICAgIGlmICghYVRhYikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFiVGFiKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhYkRpZmYgfHwgaW5kZXhEaWZmO1xufTtcbnZhciBnZXRUYWJJbmRleCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKG5vZGUudGFiSW5kZXggPCAwKSB7XG4gICAgICAgIC8vIGFsbCBcImZvY3VzYWJsZVwiIGVsZW1lbnRzIGFyZSBhbHJlYWR5IHByZXNlbGVjdGVkXG4gICAgICAgIC8vIGJ1dCBzb21lIG1pZ2h0IGhhdmUgaW1wbGljaXQgbmVnYXRpdmUgdGFiSW5kZXhcbiAgICAgICAgLy8gcmV0dXJuIDAgZm9yIDxhdWRpbyB3aXRob3V0IHRhYkluZGV4IGF0dHJpYnV0ZSAtIGl0IGlzIFwidGFiYmFibGVcIlxuICAgICAgICBpZiAoIW5vZGUuaGFzQXR0cmlidXRlKCd0YWJpbmRleCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZS50YWJJbmRleDtcbn07XG5leHBvcnQgdmFyIG9yZGVyQnlUYWJJbmRleCA9IGZ1bmN0aW9uIChub2RlcywgZmlsdGVyTmVnYXRpdmUsIGtlZXBHdWFyZHMpIHtcbiAgICByZXR1cm4gdG9BcnJheShub2RlcylcbiAgICAgICAgLm1hcChmdW5jdGlvbiAobm9kZSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgobm9kZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgdGFiSW5kZXg6IGtlZXBHdWFyZHMgJiYgdGFiSW5kZXggPT09IC0xID8gKChub2RlLmRhdGFzZXQgfHwge30pLmZvY3VzR3VhcmQgPyAwIDogLTEpIDogdGFiSW5kZXgsXG4gICAgICAgIH07XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gIWZpbHRlck5lZ2F0aXZlIHx8IGRhdGEudGFiSW5kZXggPj0gMDsgfSlcbiAgICAgICAgLnNvcnQodGFiU29ydCk7XG59O1xuIiwiaW1wb3J0IHsgRk9DVVNfQVVUTyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgeyB0YWJiYWJsZXMgfSBmcm9tICcuL3RhYmJhYmxlcyc7XG52YXIgcXVlcnlUYWJiYWJsZXMgPSB0YWJiYWJsZXMuam9pbignLCcpO1xudmFyIHF1ZXJ5R3VhcmRUYWJiYWJsZXMgPSBcIlwiLmNvbmNhdChxdWVyeVRhYmJhYmxlcywgXCIsIFtkYXRhLWZvY3VzLWd1YXJkXVwiKTtcbnZhciBnZXRGb2N1c2FibGVzV2l0aFNoYWRvd0RvbSA9IGZ1bmN0aW9uIChwYXJlbnQsIHdpdGhHdWFyZHMpIHtcbiAgICByZXR1cm4gdG9BcnJheSgocGFyZW50LnNoYWRvd1Jvb3QgfHwgcGFyZW50KS5jaGlsZHJlbikucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBhY2MuY29uY2F0KGNoaWxkLm1hdGNoZXMod2l0aEd1YXJkcyA/IHF1ZXJ5R3VhcmRUYWJiYWJsZXMgOiBxdWVyeVRhYmJhYmxlcykgPyBbY2hpbGRdIDogW10sIGdldEZvY3VzYWJsZXNXaXRoU2hhZG93RG9tKGNoaWxkKSk7XG4gICAgfSwgW10pO1xufTtcbnZhciBnZXRGb2N1c2FibGVzV2l0aElGcmFtZSA9IGZ1bmN0aW9uIChwYXJlbnQsIHdpdGhHdWFyZHMpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gY29udGVudERvY3VtZW50IG9mIGlmcmFtZSB3aWxsIGJlIG51bGwgaWYgY3VycmVudCBvcmlnaW4gY2Fubm90IGFjY2VzcyBpdFxuICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCAmJiAoKF9hID0gcGFyZW50LmNvbnRlbnREb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJvZHkpKSB7XG4gICAgICAgIHJldHVybiBnZXRGb2N1c2FibGVzKFtwYXJlbnQuY29udGVudERvY3VtZW50LmJvZHldLCB3aXRoR3VhcmRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFtwYXJlbnRdO1xufTtcbmV4cG9ydCB2YXIgZ2V0Rm9jdXNhYmxlcyA9IGZ1bmN0aW9uIChwYXJlbnRzLCB3aXRoR3VhcmRzKSB7XG4gICAgcmV0dXJuIHBhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBhcmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBmb2N1c2FibGVXaXRoU2hhZG93RG9tID0gZ2V0Rm9jdXNhYmxlc1dpdGhTaGFkb3dEb20ocGFyZW50LCB3aXRoR3VhcmRzKTtcbiAgICAgICAgdmFyIGZvY3VzYWJsZVdpdGhJZnJhbWVzID0gKF9hID0gW10pLmNvbmNhdC5hcHBseShfYSwgZm9jdXNhYmxlV2l0aFNoYWRvd0RvbS5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGdldEZvY3VzYWJsZXNXaXRoSUZyYW1lKG5vZGUsIHdpdGhHdWFyZHMpOyB9KSk7XG4gICAgICAgIHJldHVybiBhY2MuY29uY2F0KFxuICAgICAgICAvLyBhZGQgYWxsIHRhYmJhYmxlcyBpbnNpZGUgYW5kIHdpdGhpbiBzaGFkb3cgRE9NcyBpbiBET00gb3JkZXJcbiAgICAgICAgZm9jdXNhYmxlV2l0aElmcmFtZXMsIFxuICAgICAgICAvLyBhZGQgaWYgbm9kZSBpcyB0YWJiYWJsZSBpdHNlbGZcbiAgICAgICAgcGFyZW50LnBhcmVudE5vZGVcbiAgICAgICAgICAgID8gdG9BcnJheShwYXJlbnQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5VGFiYmFibGVzKSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlID09PSBwYXJlbnQ7IH0pXG4gICAgICAgICAgICA6IFtdKTtcbiAgICB9LCBbXSk7XG59O1xuLyoqXG4gKiByZXR1cm4gYSBsaXN0IG9mIGZvY3VzYWJsZSBub2RlcyB3aXRoaW4gYW4gYXJlYSBtYXJrZWQgYXMgXCJhdXRvLWZvY3VzYWJsZVwiXG4gKiBAcGFyYW0gcGFyZW50XG4gKi9cbmV4cG9ydCB2YXIgZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXMgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgdmFyIHBhcmVudEZvY3VzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIuY29uY2F0KEZPQ1VTX0FVVE8sIFwiXVwiKSk7XG4gICAgcmV0dXJuIHRvQXJyYXkocGFyZW50Rm9jdXMpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGdldEZvY3VzYWJsZXMoW25vZGVdKTsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBub2RlcykgeyByZXR1cm4gYWNjLmNvbmNhdChub2Rlcyk7IH0sIFtdKTtcbn07XG4iLCIvKipcbiAqIGxpc3Qgb2YgdGhlIG9iamVjdCB0byBiZSBjb25zaWRlcmVkIGFzIGZvY3VzYWJsZVxuICovXG5leHBvcnQgdmFyIHRhYmJhYmxlcyA9IFtcbiAgICAnYnV0dG9uOmVuYWJsZWQnLFxuICAgICdzZWxlY3Q6ZW5hYmxlZCcsXG4gICAgJ3RleHRhcmVhOmVuYWJsZWQnLFxuICAgICdpbnB1dDplbmFibGVkJyxcbiAgICAvLyBlbGVtZW50cyB3aXRoIGV4cGxpY2l0IHJvbGVzIHdpbGwgYWxzbyB1c2UgZXhwbGljaXQgdGFiaW5kZXhcbiAgICAvLyAnW3JvbGU9XCJidXR0b25cIl0nLFxuICAgICdhW2hyZWZdJyxcbiAgICAnYXJlYVtocmVmXScsXG4gICAgJ3N1bW1hcnknLFxuICAgICdpZnJhbWUnLFxuICAgICdvYmplY3QnLFxuICAgICdlbWJlZCcsXG4gICAgJ2F1ZGlvW2NvbnRyb2xzXScsXG4gICAgJ3ZpZGVvW2NvbnRyb2xzXScsXG4gICAgJ1t0YWJpbmRleF0nLFxuICAgICdbY29udGVudGVkaXRhYmxlXScsXG4gICAgJ1thdXRvZm9jdXNdJyxcbl07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMsIFZsYWRpbWlycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG5cbi8qKlxuICogZm9jdXMtb3V0bGluZS1tYW5hZ2VyXG4gKlxuICogV2F0Y2ggdXNlcnMga2V5Ym9hcmQgaW5wdXQgYW5kIG1hbmFnZSB0aGUgZm9jdXMgb3V0bGluZSB2aXNpYmlsaXR5XG4gKi9cblxuLyoqXG4gKiBUaGUgY2xhc3MgbmFtZSB0byBzZXQgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQuXG4gKiBAY29uc3RcbiAqL1xudmFyIENMQVNTX05BTUUgPSAnZm9jdXMtb3V0bGluZS1oaWRkZW4nO1xuXG4vKipcbiAqIFRoaXMgY2xhc3Mgc2V0cyBhIENTUyBjbGFzcyBuYW1lIG9uIHRoZSBIVE1MIGVsZW1lbnQgd2hlbiBhIHVzZXIgcHJlc3NlcyB0aGVcbiAqIHRhYiBrZXkuIEl0IHJlbW92ZXMgdGhlIGNsYXNzIG5hbWUgd2hlbiB0aGUgdXNlciBjbGlja3MgYW55d2hlcmUuXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIENTUyBsaWtlIHRoaXM6XG4gKlxuICogaHRtbC5mb2N1cy1vdXRsaW5lLWhpZGRlbiAqOmZvY3VzIHtcbiAqICAgICBvdXRsaW5lOiBub25lO1xuICogfVxuICpcbiAqIEFuZCB0aGUgb3V0bGluZSB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIHVzZXIgdXNlcyB0aGUga2V5Ym9hcmQgdG8gZ2V0IHRvIGl0LlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBGb2N1c091dGxpbmVNYW5hZ2VyICgpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5mb2N1c0J5S2V5Ym9hcmQgPSB0cnVlO1xuICAgIH0sIHRydWUpO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5mb2N1c0J5S2V5Ym9hcmQgPSBmYWxzZTtcbiAgICB9LCB0cnVlKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IG9ubHkgd2hlbiBmb2N1cyBpcyBhY3R1YWxseSBjaGFuZ2VkLlxuICAgICAgICB0aGF0LnVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICB9LCB0cnVlKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuaGFzRm9jdXMoKSkge1xuICAgICAgICAgICAgICAgIHRoYXQuZm9jdXNCeUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGF0LnVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHkoKTtcbn1cblxuRm9jdXNPdXRsaW5lTWFuYWdlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBmb2N1cyBjaGFuZ2UgaXMgdHJpZ2dlcmVkIGJ5IFRBQiBrZXkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmb2N1c0J5S2V5Ym9hcmQ6IHRydWUsXG5cbiAgICB1cGRhdGVWaXNpYmlsaXR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaGlkZGVuID0gIXRoaXMuZm9jdXNCeUtleWJvYXJkO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBmb2N1cyBvdXRsaW5lIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgc2V0IGhpZGRlbihoaWRkZW4pIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRSwgaGlkZGVuKTtcbiAgICB9LFxuXG4gICAgZ2V0IGhpZGRlbigpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRSk7XG4gICAgfVxufTtcblxubmV3IEZvY3VzT3V0bGluZU1hbmFnZXIoKTtcbiIsInZhciBjdXJyZW50Tm9uY2U7XG5leHBvcnQgdmFyIHNldE5vbmNlID0gZnVuY3Rpb24gKG5vbmNlKSB7XG4gICAgY3VycmVudE5vbmNlID0gbm9uY2U7XG59O1xuZXhwb3J0IHZhciBnZXROb25jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY3VycmVudE5vbmNlKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9uY2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBfX3dlYnBhY2tfbm9uY2VfXztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJpbXBvcnQgZSBmcm9tXCJ2b2lkLWVsZW1lbnRzXCI7dmFyIHQ9L1xccyhbXidcIi9cXHM+PF0rPylbXFxzLz5dfChbXlxccz1dKyk9XFxzPyhcIi4qP1wifCcuKj8nKS9nO2Z1bmN0aW9uIG4obil7dmFyIHI9e3R5cGU6XCJ0YWdcIixuYW1lOlwiXCIsdm9pZEVsZW1lbnQ6ITEsYXR0cnM6e30sY2hpbGRyZW46W119LGk9bi5tYXRjaCgvPFxcLz8oW15cXHNdKz8pWy9cXHM+XS8pO2lmKGkmJihyLm5hbWU9aVsxXSwoZVtpWzFdXXx8XCIvXCI9PT1uLmNoYXJBdChuLmxlbmd0aC0yKSkmJihyLnZvaWRFbGVtZW50PSEwKSxyLm5hbWUuc3RhcnRzV2l0aChcIiEtLVwiKSkpe3ZhciBzPW4uaW5kZXhPZihcIi0tXFx4M2VcIik7cmV0dXJue3R5cGU6XCJjb21tZW50XCIsY29tbWVudDotMSE9PXM/bi5zbGljZSg0LHMpOlwiXCJ9fWZvcih2YXIgYT1uZXcgUmVnRXhwKHQpLGM9bnVsbDtudWxsIT09KGM9YS5leGVjKG4pKTspaWYoY1swXS50cmltKCkpaWYoY1sxXSl7dmFyIG89Y1sxXS50cmltKCksbD1bbyxcIlwiXTtvLmluZGV4T2YoXCI9XCIpPi0xJiYobD1vLnNwbGl0KFwiPVwiKSksci5hdHRyc1tsWzBdXT1sWzFdLGEubGFzdEluZGV4LS19ZWxzZSBjWzJdJiYoci5hdHRyc1tjWzJdXT1jWzNdLnRyaW0oKS5zdWJzdHJpbmcoMSxjWzNdLmxlbmd0aC0xKSk7cmV0dXJuIHJ9dmFyIHI9LzxbYS16QS1aMC05XFwtXFwhXFwvXSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXidcIj5dKSo+L2csaT0vXlxccyokLyxzPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gYShlLHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2VcInRleHRcIjpyZXR1cm4gZSt0LmNvbnRlbnQ7Y2FzZVwidGFnXCI6cmV0dXJuIGUrPVwiPFwiK3QubmFtZSsodC5hdHRycz9mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gZSl0LnB1c2gobisnPVwiJytlW25dKydcIicpO3JldHVybiB0Lmxlbmd0aD9cIiBcIit0LmpvaW4oXCIgXCIpOlwiXCJ9KHQuYXR0cnMpOlwiXCIpKyh0LnZvaWRFbGVtZW50P1wiLz5cIjpcIj5cIiksdC52b2lkRWxlbWVudD9lOmUrdC5jaGlsZHJlbi5yZWR1Y2UoYSxcIlwiKStcIjwvXCIrdC5uYW1lK1wiPlwiO2Nhc2VcImNvbW1lbnRcIjpyZXR1cm4gZStcIlxceDNjIS0tXCIrdC5jb21tZW50K1wiLS1cXHgzZVwifX12YXIgYz17cGFyc2U6ZnVuY3Rpb24oZSx0KXt0fHwodD17fSksdC5jb21wb25lbnRzfHwodC5jb21wb25lbnRzPXMpO3ZhciBhLGM9W10sbz1bXSxsPS0xLG09ITE7aWYoMCE9PWUuaW5kZXhPZihcIjxcIikpe3ZhciB1PWUuaW5kZXhPZihcIjxcIik7Yy5wdXNoKHt0eXBlOlwidGV4dFwiLGNvbnRlbnQ6LTE9PT11P2U6ZS5zdWJzdHJpbmcoMCx1KX0pfXJldHVybiBlLnJlcGxhY2UocixmdW5jdGlvbihyLHMpe2lmKG0pe2lmKHIhPT1cIjwvXCIrYS5uYW1lK1wiPlwiKXJldHVybjttPSExfXZhciB1LGY9XCIvXCIhPT1yLmNoYXJBdCgxKSxoPXIuc3RhcnRzV2l0aChcIlxceDNjIS0tXCIpLHA9cytyLmxlbmd0aCxkPWUuY2hhckF0KHApO2lmKGgpe3ZhciB2PW4ocik7cmV0dXJuIGw8MD8oYy5wdXNoKHYpLGMpOigodT1vW2xdKS5jaGlsZHJlbi5wdXNoKHYpLGMpfWlmKGYmJihsKyssXCJ0YWdcIj09PShhPW4ocikpLnR5cGUmJnQuY29tcG9uZW50c1thLm5hbWVdJiYoYS50eXBlPVwiY29tcG9uZW50XCIsbT0hMCksYS52b2lkRWxlbWVudHx8bXx8IWR8fFwiPFwiPT09ZHx8YS5jaGlsZHJlbi5wdXNoKHt0eXBlOlwidGV4dFwiLGNvbnRlbnQ6ZS5zbGljZShwLGUuaW5kZXhPZihcIjxcIixwKSl9KSwwPT09bCYmYy5wdXNoKGEpLCh1PW9bbC0xXSkmJnUuY2hpbGRyZW4ucHVzaChhKSxvW2xdPWEpLCghZnx8YS52b2lkRWxlbWVudCkmJihsPi0xJiYoYS52b2lkRWxlbWVudHx8YS5uYW1lPT09ci5zbGljZSgyLC0xKSkmJihsLS0sYT0tMT09PWw/YzpvW2xdKSwhbSYmXCI8XCIhPT1kJiZkKSl7dT0tMT09PWw/YzpvW2xdLmNoaWxkcmVuO3ZhciB4PWUuaW5kZXhPZihcIjxcIixwKSxnPWUuc2xpY2UocCwtMT09PXg/dm9pZCAwOngpO2kudGVzdChnKSYmKGc9XCIgXCIpLCh4Pi0xJiZsK3UubGVuZ3RoPj0wfHxcIiBcIiE9PWcpJiZ1LnB1c2goe3R5cGU6XCJ0ZXh0XCIsY29udGVudDpnfSl9fSksY30sc3RyaW5naWZ5OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlK2EoXCJcIix0KX0sXCJcIil9fTtleHBvcnQgZGVmYXVsdCBjO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHRtbC1wYXJzZS1zdHJpbmdpZnkubW9kdWxlLmpzLm1hcFxuIiwiLyoqXHJcbiAqIFJldHVybnMgdGhlIG9iamVjdCB0eXBlIG9mIHRoZSBnaXZlbiBwYXlsb2FkXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VHlwZShwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHBheWxvYWQpLnNsaWNlKDgsIC0xKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIHVuZGVmaW5lZFxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgdW5kZWZpbmVkfVxyXG4gKi9cclxuZnVuY3Rpb24gaXNVbmRlZmluZWQocGF5bG9hZCkge1xyXG4gICAgcmV0dXJuIGdldFR5cGUocGF5bG9hZCkgPT09ICdVbmRlZmluZWQnO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgbnVsbFxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgbnVsbH1cclxuICovXHJcbmZ1bmN0aW9uIGlzTnVsbChwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZShwYXlsb2FkKSA9PT0gJ051bGwnO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYSBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdCAoZXhjbHVkaW5nIHNwZWNpYWwgY2xhc3NlcyBvciBvYmplY3RzIHdpdGggb3RoZXIgcHJvdG90eXBlcylcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkXHJcbiAqIEByZXR1cm5zIHtwYXlsb2FkIGlzIFBsYWluT2JqZWN0fVxyXG4gKi9cclxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChwYXlsb2FkKSB7XHJcbiAgICBpZiAoZ2V0VHlwZShwYXlsb2FkKSAhPT0gJ09iamVjdCcpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHBheWxvYWQuY29uc3RydWN0b3IgPT09IE9iamVjdCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGF5bG9hZCkgPT09IE9iamVjdC5wcm90b3R5cGU7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0IChleGNsdWRpbmcgc3BlY2lhbCBjbGFzc2VzIG9yIG9iamVjdHMgd2l0aCBvdGhlciBwcm90b3R5cGVzKVxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgUGxhaW5PYmplY3R9XHJcbiAqL1xyXG5mdW5jdGlvbiBpc09iamVjdChwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gaXNQbGFpbk9iamVjdChwYXlsb2FkKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGEgYW4gZW1wdHkgb2JqZWN0IChleGNsdWRpbmcgc3BlY2lhbCBjbGFzc2VzIG9yIG9iamVjdHMgd2l0aCBvdGhlciBwcm90b3R5cGVzKVxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgeyBbSyBpbiBhbnldOiBuZXZlciB9fVxyXG4gKi9cclxuZnVuY3Rpb24gaXNFbXB0eU9iamVjdChwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gaXNQbGFpbk9iamVjdChwYXlsb2FkKSAmJiBPYmplY3Qua2V5cyhwYXlsb2FkKS5sZW5ndGggPT09IDA7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhIGFuIGVtcHR5IG9iamVjdCAoZXhjbHVkaW5nIHNwZWNpYWwgY2xhc3NlcyBvciBvYmplY3RzIHdpdGggb3RoZXIgcHJvdG90eXBlcylcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkXHJcbiAqIEByZXR1cm5zIHtwYXlsb2FkIGlzIFBsYWluT2JqZWN0fVxyXG4gKi9cclxuZnVuY3Rpb24gaXNGdWxsT2JqZWN0KHBheWxvYWQpIHtcclxuICAgIHJldHVybiBpc1BsYWluT2JqZWN0KHBheWxvYWQpICYmIE9iamVjdC5rZXlzKHBheWxvYWQpLmxlbmd0aCA+IDA7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBhbnkga2luZCBvZiBvYmplY3QgKGluY2x1ZGluZyBzcGVjaWFsIGNsYXNzZXMgb3Igb2JqZWN0cyB3aXRoIGRpZmZlcmVudCBwcm90b3R5cGVzKVxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgUGxhaW5PYmplY3R9XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0FueU9iamVjdChwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZShwYXlsb2FkKSA9PT0gJ09iamVjdCc7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBvYmplY3QgbGlrZSBhIHR5cGUgcGFzc2VkIGluIDwgPlxyXG4gKlxyXG4gKiBVc2FnZTogaXNPYmplY3RMaWtlPHtpZDogYW55fT4ocGF5bG9hZCkgLy8gd2lsbCBtYWtlIHN1cmUgaXQncyBhbiBvYmplY3QgYW5kIGhhcyBhbiBgaWRgIHByb3AuXHJcbiAqXHJcbiAqIEB0ZW1wbGF0ZSBUIHRoaXMgbXVzdCBiZSBwYXNzZWQgaW4gPCA+XHJcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZFxyXG4gKiBAcmV0dXJucyB7cGF5bG9hZCBpcyBUfVxyXG4gKi9cclxuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHBheWxvYWQpIHtcclxuICAgIHJldHVybiBpc0FueU9iamVjdChwYXlsb2FkKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGEgZnVuY3Rpb24gKHJlZ3VsYXIgb3IgYXN5bmMpXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZFxyXG4gKiBAcmV0dXJucyB7cGF5bG9hZCBpcyBBbnlGdW5jdGlvbn1cclxuICovXHJcbmZ1bmN0aW9uIGlzRnVuY3Rpb24ocGF5bG9hZCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gYXJyYXlcclxuICpcclxuICogQHBhcmFtIHthbnl9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgYW55W119XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0FycmF5KHBheWxvYWQpIHtcclxuICAgIHJldHVybiBnZXRUeXBlKHBheWxvYWQpID09PSAnQXJyYXknO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYSBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IDEgaXRlbVxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgYW55W119XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0Z1bGxBcnJheShwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gaXNBcnJheShwYXlsb2FkKSAmJiBwYXlsb2FkLmxlbmd0aCA+IDA7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhIGFuIGVtcHR5IGFycmF5XHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZFxyXG4gKiBAcmV0dXJucyB7cGF5bG9hZCBpcyBbXX1cclxuICovXHJcbmZ1bmN0aW9uIGlzRW1wdHlBcnJheShwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gaXNBcnJheShwYXlsb2FkKSAmJiBwYXlsb2FkLmxlbmd0aCA9PT0gMDtcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGEgc3RyaW5nXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZFxyXG4gKiBAcmV0dXJucyB7cGF5bG9hZCBpcyBzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBpc1N0cmluZyhwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZShwYXlsb2FkKSA9PT0gJ1N0cmluZyc7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhIHN0cmluZywgQlVUIHJldHVybnMgZmFsc2UgZm9yICcnXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZFxyXG4gKiBAcmV0dXJucyB7cGF5bG9hZCBpcyBzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0Z1bGxTdHJpbmcocGF5bG9hZCkge1xyXG4gICAgcmV0dXJuIGlzU3RyaW5nKHBheWxvYWQpICYmIHBheWxvYWQgIT09ICcnO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgJydcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkXHJcbiAqIEByZXR1cm5zIHtwYXlsb2FkIGlzIHN0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIGlzRW1wdHlTdHJpbmcocGF5bG9hZCkge1xyXG4gICAgcmV0dXJuIHBheWxvYWQgPT09ICcnO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYSBudW1iZXIgKGJ1dCBub3QgTmFOKVxyXG4gKlxyXG4gKiBUaGlzIHdpbGwgcmV0dXJuIGBmYWxzZWAgZm9yIGBOYU5gISFcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkXHJcbiAqIEByZXR1cm5zIHtwYXlsb2FkIGlzIG51bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGlzTnVtYmVyKHBheWxvYWQpIHtcclxuICAgIHJldHVybiBnZXRUeXBlKHBheWxvYWQpID09PSAnTnVtYmVyJyAmJiAhaXNOYU4ocGF5bG9hZCk7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhIGJvb2xlYW5cclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkXHJcbiAqIEByZXR1cm5zIHtwYXlsb2FkIGlzIGJvb2xlYW59XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0Jvb2xlYW4ocGF5bG9hZCkge1xyXG4gICAgcmV0dXJuIGdldFR5cGUocGF5bG9hZCkgPT09ICdCb29sZWFuJztcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGEgcmVndWxhciBleHByZXNzaW9uIChSZWdFeHApXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZFxyXG4gKiBAcmV0dXJucyB7cGF5bG9hZCBpcyBSZWdFeHB9XHJcbiAqL1xyXG5mdW5jdGlvbiBpc1JlZ0V4cChwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZShwYXlsb2FkKSA9PT0gJ1JlZ0V4cCc7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhIE1hcFxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgTWFwPGFueSwgYW55Pn1cclxuICovXHJcbmZ1bmN0aW9uIGlzTWFwKHBheWxvYWQpIHtcclxuICAgIHJldHVybiBnZXRUeXBlKHBheWxvYWQpID09PSAnTWFwJztcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGEgV2Vha01hcFxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgV2Vha01hcDxhbnksIGFueT59XHJcbiAqL1xyXG5mdW5jdGlvbiBpc1dlYWtNYXAocGF5bG9hZCkge1xyXG4gICAgcmV0dXJuIGdldFR5cGUocGF5bG9hZCkgPT09ICdXZWFrTWFwJztcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGEgU2V0XHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZFxyXG4gKiBAcmV0dXJucyB7cGF5bG9hZCBpcyBTZXQ8YW55Pn1cclxuICovXHJcbmZ1bmN0aW9uIGlzU2V0KHBheWxvYWQpIHtcclxuICAgIHJldHVybiBnZXRUeXBlKHBheWxvYWQpID09PSAnU2V0JztcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGEgV2Vha1NldFxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgV2Vha1NldDxhbnk+fVxyXG4gKi9cclxuZnVuY3Rpb24gaXNXZWFrU2V0KHBheWxvYWQpIHtcclxuICAgIHJldHVybiBnZXRUeXBlKHBheWxvYWQpID09PSAnV2Vha1NldCc7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhIFN5bWJvbFxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgc3ltYm9sfVxyXG4gKi9cclxuZnVuY3Rpb24gaXNTeW1ib2wocGF5bG9hZCkge1xyXG4gICAgcmV0dXJuIGdldFR5cGUocGF5bG9hZCkgPT09ICdTeW1ib2wnO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYSBEYXRlLCBhbmQgdGhhdCB0aGUgZGF0ZSBpcyB2YWxpZFxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgRGF0ZX1cclxuICovXHJcbmZ1bmN0aW9uIGlzRGF0ZShwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZShwYXlsb2FkKSA9PT0gJ0RhdGUnICYmICFpc05hTihwYXlsb2FkKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGEgQmxvYlxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHJldHVybnMge3BheWxvYWQgaXMgQmxvYn1cclxuICovXHJcbmZ1bmN0aW9uIGlzQmxvYihwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZShwYXlsb2FkKSA9PT0gJ0Jsb2InO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYSBGaWxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZFxyXG4gKiBAcmV0dXJucyB7cGF5bG9hZCBpcyBGaWxlfVxyXG4gKi9cclxuZnVuY3Rpb24gaXNGaWxlKHBheWxvYWQpIHtcclxuICAgIHJldHVybiBnZXRUeXBlKHBheWxvYWQpID09PSAnRmlsZSc7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhIFByb21pc2VcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkXHJcbiAqIEByZXR1cm5zIHtwYXlsb2FkIGlzIFByb21pc2U8YW55Pn1cclxuICovXHJcbmZ1bmN0aW9uIGlzUHJvbWlzZShwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZShwYXlsb2FkKSA9PT0gJ1Byb21pc2UnO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gRXJyb3JcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkXHJcbiAqIEByZXR1cm5zIHtwYXlsb2FkIGlzIEVycm9yfVxyXG4gKi9cclxuZnVuY3Rpb24gaXNFcnJvcihwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZShwYXlsb2FkKSA9PT0gJ0Vycm9yJztcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGxpdGVyYWxseSB0aGUgdmFsdWUgYE5hTmAgKGl0J3MgYE5hTmAgYW5kIGFsc28gYSBgbnVtYmVyYClcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkXHJcbiAqIEByZXR1cm5zIHtwYXlsb2FkIGlzIHR5cGVvZiBOYU59XHJcbiAqL1xyXG5mdW5jdGlvbiBpc05hTlZhbHVlKHBheWxvYWQpIHtcclxuICAgIHJldHVybiBnZXRUeXBlKHBheWxvYWQpID09PSAnTnVtYmVyJyAmJiBpc05hTihwYXlsb2FkKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGEgcHJpbWl0aXZlIHR5cGUgKGVnLiBCb29sZWFuIHwgTnVsbCB8IFVuZGVmaW5lZCB8IE51bWJlciB8IFN0cmluZyB8IFN5bWJvbClcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkXHJcbiAqIEByZXR1cm5zIHsocGF5bG9hZCBpcyBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCB8IG51bWJlciB8IHN0cmluZyB8IHN5bWJvbCl9XHJcbiAqL1xyXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShwYXlsb2FkKSB7XHJcbiAgICByZXR1cm4gKGlzQm9vbGVhbihwYXlsb2FkKSB8fFxyXG4gICAgICAgIGlzTnVsbChwYXlsb2FkKSB8fFxyXG4gICAgICAgIGlzVW5kZWZpbmVkKHBheWxvYWQpIHx8XHJcbiAgICAgICAgaXNOdW1iZXIocGF5bG9hZCkgfHxcclxuICAgICAgICBpc1N0cmluZyhwYXlsb2FkKSB8fFxyXG4gICAgICAgIGlzU3ltYm9sKHBheWxvYWQpKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyB0cnVlIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkXHJcbiAqIEByZXR1cm5zIHsocGF5bG9hZCBpcyBudWxsIHwgdW5kZWZpbmVkKX1cclxuICovXHJcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IGlzT25lT2YoaXNOdWxsLCBpc1VuZGVmaW5lZCk7XHJcbmZ1bmN0aW9uIGlzT25lT2YoYSwgYiwgYywgZCwgZSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBhKHZhbHVlKSB8fCBiKHZhbHVlKSB8fCAoISFjICYmIGModmFsdWUpKSB8fCAoISFkICYmIGQodmFsdWUpKSB8fCAoISFlICYmIGUodmFsdWUpKTtcclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIERvZXMgYSBnZW5lcmljIGNoZWNrIHRvIGNoZWNrIHRoYXQgdGhlIGdpdmVuIHBheWxvYWQgaXMgb2YgYSBnaXZlbiB0eXBlLlxyXG4gKiBJbiBjYXNlcyBsaWtlIE51bWJlciwgaXQgd2lsbCByZXR1cm4gdHJ1ZSBmb3IgTmFOIGFzIE5hTiBpcyBhIE51bWJlciAodGhhbmtzIGphdmFzY3JpcHQhKTtcclxuICogSXQgd2lsbCwgaG93ZXZlciwgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG9iamVjdCBhbmQgbnVsbFxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVFxyXG4gKiBAcGFyYW0geyp9IHBheWxvYWRcclxuICogQHBhcmFtIHtUfSB0eXBlXHJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gV2lsbCB0aHJvdyB0eXBlIGVycm9yIGlmIHR5cGUgaXMgYW4gaW52YWxpZCB0eXBlXHJcbiAqIEByZXR1cm5zIHtwYXlsb2FkIGlzIFR9XHJcbiAqL1xyXG5mdW5jdGlvbiBpc1R5cGUocGF5bG9hZCwgdHlwZSkge1xyXG4gICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1R5cGUgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlLCAncHJvdG90eXBlJykpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUeXBlIGlzIG5vdCBhIGNsYXNzJyk7XHJcbiAgICB9XHJcbiAgICAvLyBDbGFzc2VzIHVzdWFsbHkgaGF2ZSBuYW1lcyAoYXMgZnVuY3Rpb25zIHVzdWFsbHkgaGF2ZSBuYW1lcylcclxuICAgIHZhciBuYW1lID0gdHlwZS5uYW1lO1xyXG4gICAgcmV0dXJuIGdldFR5cGUocGF5bG9hZCkgPT09IG5hbWUgfHwgQm9vbGVhbihwYXlsb2FkICYmIHBheWxvYWQuY29uc3RydWN0b3IgPT09IHR5cGUpO1xyXG59XG5cbmV4cG9ydCB7IGdldFR5cGUsIGlzQW55T2JqZWN0LCBpc0FycmF5LCBpc0Jsb2IsIGlzQm9vbGVhbiwgaXNEYXRlLCBpc0VtcHR5QXJyYXksIGlzRW1wdHlPYmplY3QsIGlzRW1wdHlTdHJpbmcsIGlzRXJyb3IsIGlzRmlsZSwgaXNGdWxsQXJyYXksIGlzRnVsbE9iamVjdCwgaXNGdWxsU3RyaW5nLCBpc0Z1bmN0aW9uLCBpc01hcCwgaXNOYU5WYWx1ZSwgaXNOdWxsLCBpc051bGxPclVuZGVmaW5lZCwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc09iamVjdExpa2UsIGlzT25lT2YsIGlzUGxhaW5PYmplY3QsIGlzUHJpbWl0aXZlLCBpc1Byb21pc2UsIGlzUmVnRXhwLCBpc1NldCwgaXNTdHJpbmcsIGlzU3ltYm9sLCBpc1R5cGUsIGlzVW5kZWZpbmVkLCBpc1dlYWtNYXAsIGlzV2Vha1NldCB9O1xuIiwiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nID8gbmF0aXZlTWluKHJlc3VsdCwgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlO1xuIiwiaW1wb3J0IHsgaXNQbGFpbk9iamVjdCwgaXNBcnJheSwgaXNTeW1ib2wgfSBmcm9tICdpcy13aGF0JztcblxuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbmZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cblxuZnVuY3Rpb24gYXNzaWduUHJvcChjYXJyeSwga2V5LCBuZXdWYWwsIG9yaWdpbmFsT2JqZWN0KSB7XHJcbiAgICB2YXIgcHJvcFR5cGUgPSBvcmlnaW5hbE9iamVjdC5wcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpXHJcbiAgICAgICAgPyAnZW51bWVyYWJsZSdcclxuICAgICAgICA6ICdub25lbnVtZXJhYmxlJztcclxuICAgIGlmIChwcm9wVHlwZSA9PT0gJ2VudW1lcmFibGUnKVxyXG4gICAgICAgIGNhcnJ5W2tleV0gPSBuZXdWYWw7XHJcbiAgICBpZiAocHJvcFR5cGUgPT09ICdub25lbnVtZXJhYmxlJykge1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYXJyeSwga2V5LCB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBuZXdWYWwsXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gbWVyZ2VSZWN1cnNpdmVseShvcmlnaW4sIG5ld0NvbWVyLCBleHRlbnNpb25zKSB7XHJcbiAgICAvLyB3b3JrIGRpcmVjdGx5IG9uIG5ld0NvbWVyIGlmIGl0cyBub3QgYW4gb2JqZWN0XHJcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QobmV3Q29tZXIpKSB7XHJcbiAgICAgICAgLy8gZXh0ZW5kIG1lcmdlIHJ1bGVzXHJcbiAgICAgICAgaWYgKGV4dGVuc2lvbnMgJiYgaXNBcnJheShleHRlbnNpb25zKSkge1xyXG4gICAgICAgICAgICBleHRlbnNpb25zLmZvckVhY2goZnVuY3Rpb24gKGV4dGVuZCkge1xyXG4gICAgICAgICAgICAgICAgbmV3Q29tZXIgPSBleHRlbmQob3JpZ2luLCBuZXdDb21lcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3Q29tZXI7XHJcbiAgICB9XHJcbiAgICAvLyBkZWZpbmUgbmV3T2JqZWN0IHRvIG1lcmdlIGFsbCB2YWx1ZXMgdXBvblxyXG4gICAgdmFyIG5ld09iamVjdCA9IHt9O1xyXG4gICAgaWYgKGlzUGxhaW5PYmplY3Qob3JpZ2luKSkge1xyXG4gICAgICAgIHZhciBwcm9wc18xID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob3JpZ2luKTtcclxuICAgICAgICB2YXIgc3ltYm9sc18xID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvcmlnaW4pO1xyXG4gICAgICAgIG5ld09iamVjdCA9IF9fc3ByZWFkQXJyYXlzKHByb3BzXzEsIHN5bWJvbHNfMSkucmVkdWNlKGZ1bmN0aW9uIChjYXJyeSwga2V5KSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgdmFyIHRhcmdldFZhbCA9IG9yaWdpbltrZXldO1xyXG4gICAgICAgICAgICBpZiAoKCFpc1N5bWJvbChrZXkpICYmICFPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhuZXdDb21lcikuaW5jbHVkZXMoa2V5KSkgfHxcclxuICAgICAgICAgICAgICAgIChpc1N5bWJvbChrZXkpICYmICFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG5ld0NvbWVyKS5pbmNsdWRlcyhrZXkpKSkge1xyXG4gICAgICAgICAgICAgICAgYXNzaWduUHJvcChjYXJyeSwga2V5LCB0YXJnZXRWYWwsIG9yaWdpbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNhcnJ5O1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgIH1cclxuICAgIHZhciBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG5ld0NvbWVyKTtcclxuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuZXdDb21lcik7XHJcbiAgICB2YXIgcmVzdWx0ID0gX19zcHJlYWRBcnJheXMocHJvcHMsIHN5bWJvbHMpLnJlZHVjZShmdW5jdGlvbiAoY2FycnksIGtleSkge1xyXG4gICAgICAgIC8vIHJlLWRlZmluZSB0aGUgb3JpZ2luIGFuZCBuZXdDb21lciBhcyB0YXJnZXRWYWwgYW5kIG5ld1ZhbFxyXG4gICAgICAgIHZhciBuZXdWYWwgPSBuZXdDb21lcltrZXldO1xyXG4gICAgICAgIHZhciB0YXJnZXRWYWwgPSAoaXNQbGFpbk9iamVjdChvcmlnaW4pKVxyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgID8gb3JpZ2luW2tleV1cclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgLy8gZXh0ZW5kIG1lcmdlIHJ1bGVzXHJcbiAgICAgICAgaWYgKGV4dGVuc2lvbnMgJiYgaXNBcnJheShleHRlbnNpb25zKSkge1xyXG4gICAgICAgICAgICBleHRlbnNpb25zLmZvckVhY2goZnVuY3Rpb24gKGV4dGVuZCkge1xyXG4gICAgICAgICAgICAgICAgbmV3VmFsID0gZXh0ZW5kKHRhcmdldFZhbCwgbmV3VmFsKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFdoZW4gbmV3VmFsIGlzIGFuIG9iamVjdCBkbyB0aGUgbWVyZ2UgcmVjdXJzaXZlbHlcclxuICAgICAgICBpZiAodGFyZ2V0VmFsICE9PSB1bmRlZmluZWQgJiYgaXNQbGFpbk9iamVjdChuZXdWYWwpKSB7XHJcbiAgICAgICAgICAgIG5ld1ZhbCA9IG1lcmdlUmVjdXJzaXZlbHkodGFyZ2V0VmFsLCBuZXdWYWwsIGV4dGVuc2lvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhc3NpZ25Qcm9wKGNhcnJ5LCBrZXksIG5ld1ZhbCwgbmV3Q29tZXIpO1xyXG4gICAgICAgIHJldHVybiBjYXJyeTtcclxuICAgIH0sIG5ld09iamVjdCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbi8qKlxyXG4gKiBNZXJnZSBhbnl0aGluZyByZWN1cnNpdmVseS5cclxuICogT2JqZWN0cyBnZXQgbWVyZ2VkLCBzcGVjaWFsIG9iamVjdHMgKGNsYXNzZXMgZXRjLikgYXJlIHJlLWFzc2lnbmVkIFwiYXMgaXNcIi5cclxuICogQmFzaWMgdHlwZXMgb3ZlcndyaXRlIG9iamVjdHMgb3Igb3RoZXIgYmFzaWMgdHlwZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7KElDb25maWcgfCBhbnkpfSBvcmlnaW5cclxuICogQHBhcmFtIHsuLi5hbnlbXX0gbmV3Q29tZXJzXHJcbiAqIEByZXR1cm5zIHRoZSByZXN1bHRcclxuICovXHJcbmZ1bmN0aW9uIG1lcmdlKG9yaWdpbikge1xyXG4gICAgdmFyIG5ld0NvbWVycyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBuZXdDb21lcnNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICB2YXIgZXh0ZW5zaW9ucyA9IG51bGw7XHJcbiAgICB2YXIgYmFzZSA9IG9yaWdpbjtcclxuICAgIGlmIChpc1BsYWluT2JqZWN0KG9yaWdpbikgJiYgb3JpZ2luLmV4dGVuc2lvbnMgJiYgT2JqZWN0LmtleXMob3JpZ2luKS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICBiYXNlID0ge307XHJcbiAgICAgICAgZXh0ZW5zaW9ucyA9IG9yaWdpbi5leHRlbnNpb25zO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld0NvbWVycy5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwgbmV3Q29tZXIpIHtcclxuICAgICAgICByZXR1cm4gbWVyZ2VSZWN1cnNpdmVseShyZXN1bHQsIG5ld0NvbWVyLCBleHRlbnNpb25zKTtcclxuICAgIH0sIGJhc2UpO1xyXG59XG5cbmZ1bmN0aW9uIGNvbmNhdEFycmF5cyhvcmlnaW5WYWwsIG5ld1ZhbCkge1xyXG4gICAgaWYgKGlzQXJyYXkob3JpZ2luVmFsKSAmJiBpc0FycmF5KG5ld1ZhbCkpIHtcclxuICAgICAgICAvLyBjb25jYXQgbG9naWNcclxuICAgICAgICByZXR1cm4gb3JpZ2luVmFsLmNvbmNhdChuZXdWYWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1ZhbDsgLy8gYWx3YXlzIHJldHVybiBuZXdWYWwgYXMgZmFsbGJhY2shIVxyXG59XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlO1xuZXhwb3J0IHsgY29uY2F0QXJyYXlzLCBtZXJnZSB9O1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFmcmlrYWFucyBbYWZdXG4vLyEgYXV0aG9yIDogV2VybmVyIE1vbGxlbnR6ZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS93ZXJuZXJtXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgYWYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhZicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyaWVfRmVicnVhcmllX01hYXJ0X0FwcmlsX01laV9KdW5pZV9KdWxpZV9BdWd1c3R1c19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01ydF9BcHJfTWVpX0p1bl9KdWxfQXVnX1NlcF9Pa3RfTm92X0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTb25kYWdfTWFhbmRhZ19EaW5zZGFnX1dvZW5zZGFnX0RvbmRlcmRhZ19WcnlkYWdfU2F0ZXJkYWcnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTb25fTWFhX0Rpbl9Xb2VfRG9uX1ZyeV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTWFfRGlfV29fRG9fVnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC92bXxubS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXm5tJC9pLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3ZtJyA6ICdWTSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ25tJyA6ICdOTSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVmFuZGFnIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW03DtHJlIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0dpc3RlciBvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFhc10gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb29yICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBnZWxlZGUnLFxuICAgICAgICAgICAgczogXCInbiBwYWFyIHNla29uZGVzXCIsXG4gICAgICAgICAgICBzczogJyVkIHNla29uZGVzJyxcbiAgICAgICAgICAgIG06IFwiJ24gbWludXV0XCIsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZScsXG4gICAgICAgICAgICBoOiBcIiduIHV1clwiLFxuICAgICAgICAgICAgaGg6ICclZCB1cmUnLFxuICAgICAgICAgICAgZDogXCInbiBkYWdcIixcbiAgICAgICAgICAgIGRkOiAnJWQgZGFlJyxcbiAgICAgICAgICAgIE06IFwiJ24gbWFhbmRcIixcbiAgICAgICAgICAgIE1NOiAnJWQgbWFhbmRlJyxcbiAgICAgICAgICAgIHk6IFwiJ24gamFhclwiLFxuICAgICAgICAgICAgeXk6ICclZCBqYWFyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0ZXxkZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIG51bWJlciArXG4gICAgICAgICAgICAgICAgKG51bWJlciA9PT0gMSB8fCBudW1iZXIgPT09IDggfHwgbnVtYmVyID49IDIwID8gJ3N0ZScgOiAnZGUnKVxuICAgICAgICAgICAgKTsgLy8gVGhhbmtzIHRvIEpvcmlzIFLDtmxpbmcgOiBodHRwczovL2dpdGh1Yi5jb20vamp1cGl0ZXJcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNYWFuZGFnIGlzIGRpZSBlZXJzdGUgZGFnIHZhbiBkaWUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gRGllIHdlZWsgd2F0IGRpZSA0ZGUgSmFudWFyaWUgYmV2YXQgaXMgZGllIGVlcnN0ZSB3ZWVrIHZhbiBkaWUgamFhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhZjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKEFsZ2VyaWEpIFthci1kel1cbi8vISBhdXRob3IgOiBBbWluZSBSb3VraDogaHR0cHM6Ly9naXRodWIuY29tL0FtaW5lMjdcbi8vISBhdXRob3IgOiBBYmRlbCBTYWlkOiBodHRwczovL2dpdGh1Yi5jb20vYWJkZWxzYWlkXG4vLyEgYXV0aG9yIDogQWhtZWQgRWxraGF0aWJcbi8vISBhdXRob3IgOiBmb3JhYmkgaHR0cHM6Ly9naXRodWIuY29tL2ZvcmFiaVxuLy8hIGF1dGhvciA6IE5vdXJlZGRpbmUgTE9VQUhFREogOiBodHRwczovL2dpdGh1Yi5jb20vbm91cmVkZGluZW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBwbHVyYWxGb3JtID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIHJldHVybiBuID09PSAwXG4gICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgOiBuID09PSAxXG4gICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgIDogbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMFxuICAgICAgICAgICAgICAgICAgICAgID8gM1xuICAgICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAxMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyA0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IDU7XG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbHMgPSB7XG4gICAgICAgICAgICBzOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICfYq9in2YbZitipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2KvYp9mG2YrYqtin2YYnLCAn2KvYp9mG2YrYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KvZiNin2YYnLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAn2K/ZgtmK2YLYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iv2YLZitmC2KrYp9mGJywgJ9iv2YLZitmC2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJ9iz2KfYudipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2LPYp9i52KrYp9mGJywgJ9iz2KfYudiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDZitmI2YUnLFxuICAgICAgICAgICAgICAgICfZitmI2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2YrZiNmF2KfZhicsICfZitmI2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgTTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYtNmH2LEnLFxuICAgICAgICAgICAgICAgICfYtNmH2LEg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LTZh9ix2KfZhicsICfYtNmH2LHZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ix2KcnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LEnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHk6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LnYp9mFJyxcbiAgICAgICAgICAgICAgICAn2LnYp9mFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i52KfZhdin2YYnLCAn2LnYp9mF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i52YjYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxpemUgPSBmdW5jdGlvbiAodSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IHBsdXJhbEZvcm0obnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcGx1cmFsc1t1XVtwbHVyYWxGb3JtKG51bWJlcildO1xuICAgICAgICAgICAgICAgIGlmIChmID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0clt3aXRob3V0U3VmZml4ID8gMCA6IDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBtb250aHMgPSBbXG4gICAgICAgICAgICAn2KzYp9mG2YHZiicsXG4gICAgICAgICAgICAn2YHZitmB2LHZiicsXG4gICAgICAgICAgICAn2YXYp9ix2LMnLFxuICAgICAgICAgICAgJ9ij2YHYsdmK2YQnLFxuICAgICAgICAgICAgJ9mF2KfZiicsXG4gICAgICAgICAgICAn2KzZiNin2YYnLFxuICAgICAgICAgICAgJ9is2YjZitmE2YrYqScsXG4gICAgICAgICAgICAn2KPZiNiqJyxcbiAgICAgICAgICAgICfYs9io2KrZhdio2LEnLFxuICAgICAgICAgICAgJ9ij2YPYqtmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmB2YXYqNixJyxcbiAgICAgICAgICAgICfYr9mK2LPZhdio2LEnLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGFyRHogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1keicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvXFx1MjAwRk0vXFx1MjAwRllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/Zi9inINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9io2LnYryAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgc3M6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGhoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgZGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICB5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgICAgIHl5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJEejtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKEt1d2FpdCkgW2FyLWt3XVxuLy8hIGF1dGhvciA6IE51c3JldCBQYXJsYWs6IGh0dHBzOi8vZ2l0aHViLmNvbS9udXNyZXRwYXJsYWtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBhckt3ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXIta3cnLCB7XG4gICAgICAgIG1vbnRoczogJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mKX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiNiyX9i62LTYql/YtNiq2YbYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YbYqNixX9iv2KzZhtio2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mKX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiNiyX9i62LTYql/YtNiq2YbYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YbYqNixX9iv2KzZhtio2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdiq2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYp9it2K9f2KfYqtmG2YrZhl/Yq9mE2KfYq9in2KFf2KfYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/YpyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogJ9ir2YjYp9mGJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJLdztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKExpYnlhKSBbYXItbHldXG4vLyEgYXV0aG9yIDogQWxpIEhtZXI6IGh0dHBzOi8vZ2l0aHViLmNvbS9raWtvYW5pc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICcxJyxcbiAgICAgICAgICAgIDI6ICcyJyxcbiAgICAgICAgICAgIDM6ICczJyxcbiAgICAgICAgICAgIDQ6ICc0JyxcbiAgICAgICAgICAgIDU6ICc1JyxcbiAgICAgICAgICAgIDY6ICc2JyxcbiAgICAgICAgICAgIDc6ICc3JyxcbiAgICAgICAgICAgIDg6ICc4JyxcbiAgICAgICAgICAgIDk6ICc5JyxcbiAgICAgICAgICAgIDA6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsRm9ybSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gbiA9PT0gMFxuICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgIDogbiA9PT0gMVxuICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICA6IG4gPT09IDJcbiAgICAgICAgICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAzICYmIG4gJSAxMDAgPD0gMTBcbiAgICAgICAgICAgICAgICAgICAgICA/IDNcbiAgICAgICAgICAgICAgICAgICAgICA6IG4gJSAxMDAgPj0gMTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gNFxuICAgICAgICAgICAgICAgICAgICAgICAgOiA1O1xuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxzID0ge1xuICAgICAgICAgICAgczogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAn2KvYp9mG2YrYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9ir2KfZhtmK2KrYp9mGJywgJ9ir2KfZhtmK2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINir2YjYp9mGJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICAgICAgJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJ9iv2YLZitmC2Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYr9mC2YrZgtiq2KfZhicsICfYr9mC2YrZgtiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJyVkINiv2YLZitmC2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGg6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICfYs9in2LnYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iz2KfYudiq2KfZhicsICfYs9in2LnYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudipJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGQ6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2YrZiNmFJyxcbiAgICAgICAgICAgICAgICAn2YrZiNmFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9mK2YjZhdin2YYnLCAn2YrZiNmF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDZitmI2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIE06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAn2LTZh9ixINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i02YfYsdin2YYnLCAn2LTZh9ix2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICAgICAgJyVkINi02YfYsdinJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ixJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB5OiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINi52KfZhScsXG4gICAgICAgICAgICAgICAgJ9i52KfZhSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfYudin2YXYp9mGJywgJ9i52KfZhdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPYudmI2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDYudin2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsaXplID0gZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGYgPSBwbHVyYWxGb3JtKG51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHBsdXJhbHNbdV1bcGx1cmFsRm9ybShudW1iZXIpXTtcbiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHJbd2l0aG91dFN1ZmZpeCA/IDAgOiAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9mK2YbYp9mK2LEnLFxuICAgICAgICAgICAgJ9mB2KjYsdin2YrYsScsXG4gICAgICAgICAgICAn2YXYp9ix2LMnLFxuICAgICAgICAgICAgJ9ij2KjYsdmK2YQnLFxuICAgICAgICAgICAgJ9mF2KfZitmIJyxcbiAgICAgICAgICAgICfZitmI2YbZitmIJyxcbiAgICAgICAgICAgICfZitmI2YTZitmIJyxcbiAgICAgICAgICAgICfYo9i62LPYt9izJyxcbiAgICAgICAgICAgICfYs9io2KrZhdio2LEnLFxuICAgICAgICAgICAgJ9ij2YPYqtmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmB2YXYqNixJyxcbiAgICAgICAgICAgICfYr9mK2LPZhdio2LEnLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGFyTHkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1seScsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvXFx1MjAwRk0vXFx1MjAwRllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/Zi9inINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9io2LnYryAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgc3M6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGhoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgZGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICB5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgICAgIHl5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJMeTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKE1vcm9jY28pIFthci1tYV1cbi8vISBhdXRob3IgOiBFbEZhZGlsaSBZYXNzaW5lIDogaHR0cHM6Ly9naXRodWIuY29tL0VsRmFkaWxpWVxuLy8hIGF1dGhvciA6IEFiZGVsIFNhaWQgOiBodHRwczovL2dpdGh1Yi5jb20vYWJkZWxzYWlkXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgYXJNYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLW1hJywge1xuICAgICAgICBtb250aHM6ICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZil/ZitmI2YbZitmIX9mK2YjZhNmK2YjYsl/Yuti02Kpf2LTYqtmG2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmG2KjYsV/Yr9is2YbYqNixJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZil/ZitmI2YbZitmIX9mK2YjZhNmK2YjYsl/Yuti02Kpf2LTYqtmG2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmG2KjYsV/Yr9is2YbYqNixJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KfYrdivX9in2KvZhtmK2YZf2KvZhNin2KvYp9ihX9in2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2Kcg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2YHZiiAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBzczogJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgbTogJ9iv2YLZitmC2KknLFxuICAgICAgICAgICAgbW06ICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgIGg6ICfYs9in2LnYqScsXG4gICAgICAgICAgICBoaDogJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgZDogJ9mK2YjZhScsXG4gICAgICAgICAgICBkZDogJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgIE06ICfYtNmH2LEnLFxuICAgICAgICAgICAgTU06ICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICB5OiAn2LPZhtipJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPZhtmI2KfYqicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhck1hO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoUGFsZXN0aW5lKSBbYXItcHNdXG4vLyEgYXV0aG9yIDogTWFqZCBBbC1TaGloYWJpIDogaHR0cHM6Ly9naXRodWIuY29tL21hamRhbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfZoScsXG4gICAgICAgICAgICAyOiAn2aInLFxuICAgICAgICAgICAgMzogJ9mjJyxcbiAgICAgICAgICAgIDQ6ICfZpCcsXG4gICAgICAgICAgICA1OiAn2aUnLFxuICAgICAgICAgICAgNjogJ9mmJyxcbiAgICAgICAgICAgIDc6ICfZpycsXG4gICAgICAgICAgICA4OiAn2agnLFxuICAgICAgICAgICAgOTogJ9mpJyxcbiAgICAgICAgICAgIDA6ICfZoCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfZoSc6ICcxJyxcbiAgICAgICAgICAgICfZoic6ICcyJyxcbiAgICAgICAgICAgICfZoyc6ICczJyxcbiAgICAgICAgICAgICfZpCc6ICc0JyxcbiAgICAgICAgICAgICfZpSc6ICc1JyxcbiAgICAgICAgICAgICfZpic6ICc2JyxcbiAgICAgICAgICAgICfZpyc6ICc3JyxcbiAgICAgICAgICAgICfZqCc6ICc4JyxcbiAgICAgICAgICAgICfZqSc6ICc5JyxcbiAgICAgICAgICAgICfZoCc6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBhclBzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItcHMnLCB7XG4gICAgICAgIG1vbnRoczogJ9mD2KfZhtmI2YYg2KfZhNir2KfZhtmKX9i02KjYp9i3X9ii2LDYp9ixX9mG2YrYs9in2YZf2KPZitmR2KfYsV/Yrdiy2YrYsdin2YZf2KrZhdmR2YjYsl/YotioX9ij2YrZhNmI2YRf2KrYtNix2Yog2KfZhNij2YjZkdmEX9iq2LTYsdmK2YYg2KfZhNir2KfZhtmKX9mD2KfZhtmI2YYg2KfZhNij2YjZkdmEJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfZg9miX9i02KjYp9i3X9ii2LDYp9ixX9mG2YrYs9in2YZf2KPZitmR2KfYsV/Yrdiy2YrYsdin2YZf2KrZhdmR2YjYsl/YotioX9ij2YrZhNmI2YRf2KrZoV/YqtmiX9mD2aEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/YpyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogJ9ir2YjYp9mGJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mj2aTZpdmm2afZqNmp2aBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnJykgLy8gcmV2ZXJzZWQgc2luY2UgbmVnYXRpdmUgbG9va2JlaGluZCBub3Qgc3VwcG9ydGVkIGV2ZXJ5d2hlcmVcbiAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1vZodmiXSg/IVtcXHUwNjJhXFx1MDY0M10pL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJQcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKFNhdWRpIEFyYWJpYSkgW2FyLXNhXVxuLy8hIGF1dGhvciA6IFN1aGFpbCBBbGtvd2FpbGVldCA6IGh0dHBzOi8vZ2l0aHViLmNvbS94c29oXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9mhJyxcbiAgICAgICAgICAgIDI6ICfZoicsXG4gICAgICAgICAgICAzOiAn2aMnLFxuICAgICAgICAgICAgNDogJ9mkJyxcbiAgICAgICAgICAgIDU6ICfZpScsXG4gICAgICAgICAgICA2OiAn2aYnLFxuICAgICAgICAgICAgNzogJ9mnJyxcbiAgICAgICAgICAgIDg6ICfZqCcsXG4gICAgICAgICAgICA5OiAn2aknLFxuICAgICAgICAgICAgMDogJ9mgJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAgICAgJ9mgJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGFyU2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1zYScsIHtcbiAgICAgICAgbW9udGhzOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2YrZiF/ZitmI2YbZitmIX9mK2YjZhNmK2Yhf2KPYutiz2LfYs1/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mK2Yhf2YrZiNmG2YrZiF/ZitmI2YTZitmIX9ij2LrYs9i32LNf2LPYqNiq2YXYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YHZhdio2LFf2K/Zitiz2YXYqNixJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/YpyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogJ9ir2YjYp9mGJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mh2aLZo9mk2aXZptmn2ajZqdmgXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhclNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSAgOiAgQXJhYmljIChUdW5pc2lhKSBbYXItdG5dXG4vLyEgYXV0aG9yIDogTmFkZXIgVG91a2FicmkgOiBodHRwczovL2dpdGh1Yi5jb20vbmFkZXJpb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGFyVG4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci10bicsIHtcbiAgICAgICAgbW9udGhzOiAn2KzYp9mG2YHZil/ZgdmK2YHYsdmKX9mF2KfYsdizX9ij2YHYsdmK2YRf2YXYp9mKX9is2YjYp9mGX9is2YjZitmE2YrYqV/Yo9mI2Kpf2LPYqNiq2YXYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YHZhdio2LFf2K/Zitiz2YXYqNixJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfYrNin2YbZgdmKX9mB2YrZgdix2Ypf2YXYp9ix2LNf2KPZgdix2YrZhF/Zhdin2Ypf2KzZiNin2YZf2KzZiNmK2YTZitipX9ij2YjYql/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/YpyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogJ9ir2YjYp9mGJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyVG47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIFthcl1cbi8vISBhdXRob3IgOiBBYmRlbCBTYWlkOiBodHRwczovL2dpdGh1Yi5jb20vYWJkZWxzYWlkXG4vLyEgYXV0aG9yIDogQWhtZWQgRWxraGF0aWJcbi8vISBhdXRob3IgOiBmb3JhYmkgaHR0cHM6Ly9naXRodWIuY29tL2ZvcmFiaVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfZoScsXG4gICAgICAgICAgICAyOiAn2aInLFxuICAgICAgICAgICAgMzogJ9mjJyxcbiAgICAgICAgICAgIDQ6ICfZpCcsXG4gICAgICAgICAgICA1OiAn2aUnLFxuICAgICAgICAgICAgNjogJ9mmJyxcbiAgICAgICAgICAgIDc6ICfZpycsXG4gICAgICAgICAgICA4OiAn2agnLFxuICAgICAgICAgICAgOTogJ9mpJyxcbiAgICAgICAgICAgIDA6ICfZoCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfZoSc6ICcxJyxcbiAgICAgICAgICAgICfZoic6ICcyJyxcbiAgICAgICAgICAgICfZoyc6ICczJyxcbiAgICAgICAgICAgICfZpCc6ICc0JyxcbiAgICAgICAgICAgICfZpSc6ICc1JyxcbiAgICAgICAgICAgICfZpic6ICc2JyxcbiAgICAgICAgICAgICfZpyc6ICc3JyxcbiAgICAgICAgICAgICfZqCc6ICc4JyxcbiAgICAgICAgICAgICfZqSc6ICc5JyxcbiAgICAgICAgICAgICfZoCc6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsRm9ybSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gbiA9PT0gMFxuICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgIDogbiA9PT0gMVxuICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICA6IG4gPT09IDJcbiAgICAgICAgICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAzICYmIG4gJSAxMDAgPD0gMTBcbiAgICAgICAgICAgICAgICAgICAgICA/IDNcbiAgICAgICAgICAgICAgICAgICAgICA6IG4gJSAxMDAgPj0gMTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gNFxuICAgICAgICAgICAgICAgICAgICAgICAgOiA1O1xuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxzID0ge1xuICAgICAgICAgICAgczogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAn2KvYp9mG2YrYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9ir2KfZhtmK2KrYp9mGJywgJ9ir2KfZhtmK2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINir2YjYp9mGJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICAgICAgJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJ9iv2YLZitmC2Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYr9mC2YrZgtiq2KfZhicsICfYr9mC2YrZgtiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJyVkINiv2YLZitmC2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGg6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICfYs9in2LnYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iz2KfYudiq2KfZhicsICfYs9in2LnYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudipJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGQ6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2YrZiNmFJyxcbiAgICAgICAgICAgICAgICAn2YrZiNmFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9mK2YjZhdin2YYnLCAn2YrZiNmF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDZitmI2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIE06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAn2LTZh9ixINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i02YfYsdin2YYnLCAn2LTZh9ix2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICAgICAgJyVkINi02YfYsdinJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ixJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB5OiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINi52KfZhScsXG4gICAgICAgICAgICAgICAgJ9i52KfZhSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfYudin2YXYp9mGJywgJ9i52KfZhdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPYudmI2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDYudin2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsaXplID0gZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGYgPSBwbHVyYWxGb3JtKG51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHBsdXJhbHNbdV1bcGx1cmFsRm9ybShudW1iZXIpXTtcbiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHJbd2l0aG91dFN1ZmZpeCA/IDAgOiAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9mK2YbYp9mK2LEnLFxuICAgICAgICAgICAgJ9mB2KjYsdin2YrYsScsXG4gICAgICAgICAgICAn2YXYp9ix2LMnLFxuICAgICAgICAgICAgJ9ij2KjYsdmK2YQnLFxuICAgICAgICAgICAgJ9mF2KfZitmIJyxcbiAgICAgICAgICAgICfZitmI2YbZitmIJyxcbiAgICAgICAgICAgICfZitmI2YTZitmIJyxcbiAgICAgICAgICAgICfYo9i62LPYt9izJyxcbiAgICAgICAgICAgICfYs9io2KrZhdio2LEnLFxuICAgICAgICAgICAgJ9ij2YPYqtmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmB2YXYqNixJyxcbiAgICAgICAgICAgICfYr9mK2LPZhdio2LEnLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGFyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXInLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdEL1xcdTIwMEZNL1xcdTIwMEZZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LV82YUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i1JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZhSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2YvYpyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfYqNi52K8gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiBwbHVyYWxpemUoJ3MnKSxcbiAgICAgICAgICAgIHNzOiBwbHVyYWxpemUoJ3MnKSxcbiAgICAgICAgICAgIG06IHBsdXJhbGl6ZSgnbScpLFxuICAgICAgICAgICAgbW06IHBsdXJhbGl6ZSgnbScpLFxuICAgICAgICAgICAgaDogcGx1cmFsaXplKCdoJyksXG4gICAgICAgICAgICBoaDogcGx1cmFsaXplKCdoJyksXG4gICAgICAgICAgICBkOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIGRkOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIE06IHBsdXJhbGl6ZSgnTScpLFxuICAgICAgICAgICAgTU06IHBsdXJhbGl6ZSgnTScpLFxuICAgICAgICAgICAgeTogcGx1cmFsaXplKCd5JyksXG4gICAgICAgICAgICB5eTogcGx1cmFsaXplKCd5JyksXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1vZodmi2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEF6ZXJiYWlqYW5pIFthel1cbi8vISBhdXRob3IgOiB0b3BjaGl5ZXYgOiBodHRwczovL2dpdGh1Yi5jb20vdG9wY2hpeWV2XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDE6ICctaW5jaScsXG4gICAgICAgIDU6ICctaW5jaScsXG4gICAgICAgIDg6ICctaW5jaScsXG4gICAgICAgIDcwOiAnLWluY2knLFxuICAgICAgICA4MDogJy1pbmNpJyxcbiAgICAgICAgMjogJy1uY2knLFxuICAgICAgICA3OiAnLW5jaScsXG4gICAgICAgIDIwOiAnLW5jaScsXG4gICAgICAgIDUwOiAnLW5jaScsXG4gICAgICAgIDM6ICctw7xuY8O8JyxcbiAgICAgICAgNDogJy3DvG5jw7wnLFxuICAgICAgICAxMDA6ICctw7xuY8O8JyxcbiAgICAgICAgNjogJy1uY8SxJyxcbiAgICAgICAgOTogJy11bmN1JyxcbiAgICAgICAgMTA6ICctdW5jdScsXG4gICAgICAgIDMwOiAnLXVuY3UnLFxuICAgICAgICA2MDogJy3EsW5jxLEnLFxuICAgICAgICA5MDogJy3EsW5jxLEnLFxuICAgIH07XG5cbiAgICB2YXIgYXogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdheicsIHtcbiAgICAgICAgbW9udGhzOiAneWFudmFyX2ZldnJhbF9tYXJ0X2FwcmVsX21heV9peXVuX2l5dWxfYXZxdXN0X3NlbnR5YWJyX29rdHlhYnJfbm95YWJyX2Rla2Ficicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICd5YW5fZmV2X21hcl9hcHJfbWF5X2l5bl9peWxfYXZxX3Nlbl9va3Rfbm95X2Rlaycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnQmF6YXJfQmF6YXIgZXJ0yZlzaV/Dh8mZcsWfyZluYsmZIGF4xZ9hbcSxX8OHyZlyxZ/JmW5iyZlfQ8O8bcmZIGF4xZ9hbcSxX0PDvG3JmV/FnsmZbmLJmScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQmF6X0J6RV/Dh0F4X8OHyZlyX0NBeF9Dw7xtX8WeyZluJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0J6X0JFX8OHQV/Dh8mZX0NBX0PDvF/FnsmZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYnVnw7xuIHNhYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc2FiYWggc2FhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbZ8mZbMmZbiBoyZlmdMmZXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2TDvG7JmW5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2tlw6fJmW4gaMmZZnTJmV0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBzb25yYScsXG4gICAgICAgICAgICBwYXN0OiAnJXMgyZl2dsmZbCcsXG4gICAgICAgICAgICBzOiAnYmlyIG5lw6fJmSBzYW5pecmZJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2FuaXnJmScsXG4gICAgICAgICAgICBtOiAnYmlyIGTJmXFpccmZJyxcbiAgICAgICAgICAgIG1tOiAnJWQgZMmZcWlxyZknLFxuICAgICAgICAgICAgaDogJ2JpciBzYWF0JyxcbiAgICAgICAgICAgIGhoOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBkOiAnYmlyIGfDvG4nLFxuICAgICAgICAgICAgZGQ6ICclZCBnw7xuJyxcbiAgICAgICAgICAgIE06ICdiaXIgYXknLFxuICAgICAgICAgICAgTU06ICclZCBheScsXG4gICAgICAgICAgICB5OiAnYmlyIGlsJyxcbiAgICAgICAgICAgIHl5OiAnJWQgaWwnLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvZ2VjyZl8c8mZaMmZcnxnw7xuZMO8enxheMWfYW0vLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXihnw7xuZMO8enxheMWfYW0pJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2dlY8mZJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzyZloyZlyJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdnw7xuZMO8eic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnYXjFn2FtJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjEsW5jxLF8aW5jaXxuY2l8w7xuY8O8fG5jxLF8dW5jdSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB6ZXJvXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICctxLFuY8SxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IChudW1iZXIgJSAxMDApIC0gYSxcbiAgICAgICAgICAgICAgICBjID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdIHx8IHN1ZmZpeGVzW2NdKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF6O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJlbGFydXNpYW4gW2JlXVxuLy8hIGF1dGhvciA6IERtaXRyeSBEZW1pZG92IDogaHR0cHM6Ly9naXRodWIuY29tL2RlbWlkb3Y5MVxuLy8hIGF1dGhvcjogUHJhbGVza2E6IGh0dHA6Ly9wcmFsZXNrYS5wcm8vXG4vLyEgQXV0aG9yIDogTWVuZWxpb24gRWxlbnPDumxlIDogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHBsdXJhbCh3b3JkLCBudW0pIHtcbiAgICAgICAgdmFyIGZvcm1zID0gd29yZC5zcGxpdCgnXycpO1xuICAgICAgICByZXR1cm4gbnVtICUgMTAgPT09IDEgJiYgbnVtICUgMTAwICE9PSAxMVxuICAgICAgICAgICAgPyBmb3Jtc1swXVxuICAgICAgICAgICAgOiBudW0gJSAxMCA+PSAyICYmIG51bSAlIDEwIDw9IDQgJiYgKG51bSAlIDEwMCA8IDEwIHx8IG51bSAlIDEwMCA+PSAyMClcbiAgICAgICAgICAgICAgPyBmb3Jtc1sxXVxuICAgICAgICAgICAgICA6IGZvcm1zWzJdO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzczogd2l0aG91dFN1ZmZpeCA/ICfRgdC10LrRg9C90LTQsF/RgdC10LrRg9C90LTRi1/RgdC10LrRg9C90LQnIDogJ9GB0LXQutGD0L3QtNGDX9GB0LXQutGD0L3QtNGLX9GB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtbTogd2l0aG91dFN1ZmZpeCA/ICfRhdCy0ZbQu9GW0L3QsF/RhdCy0ZbQu9GW0L3Ri1/RhdCy0ZbQu9GW0L0nIDogJ9GF0LLRltC70ZbQvdGDX9GF0LLRltC70ZbQvdGLX9GF0LLRltC70ZbQvScsXG4gICAgICAgICAgICBoaDogd2l0aG91dFN1ZmZpeCA/ICfQs9Cw0LTQt9GW0L3QsF/Qs9Cw0LTQt9GW0L3Ri1/Qs9Cw0LTQt9GW0L0nIDogJ9Cz0LDQtNC30ZbQvdGDX9Cz0LDQtNC30ZbQvdGLX9Cz0LDQtNC30ZbQvScsXG4gICAgICAgICAgICBkZDogJ9C00LfQtdC90Yxf0LTQvdGWX9C00LfRkdC9JyxcbiAgICAgICAgICAgIE1NOiAn0LzQtdGB0Y/Rhl/QvNC10YHRj9GG0Ytf0LzQtdGB0Y/RhtCw0Z4nLFxuICAgICAgICAgICAgeXk6ICfQs9C+0LRf0LPQsNC00Ytf0LPQsNC00L7RnicsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0YXQstGW0LvRltC90LAnIDogJ9GF0LLRltC70ZbQvdGDJztcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdoJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0LPQsNC00LfRltC90LAnIDogJ9Cz0LDQtNC30ZbQvdGDJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBwbHVyYWwoZm9ybWF0W2tleV0sICtudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYmUnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0YHRgtGD0LTQt9C10L3Rj1/Qu9GO0YLQsNCz0LBf0YHQsNC60LDQstGW0LrQsF/QutGA0LDRgdCw0LLRltC60LBf0YLRgNCw0Z7QvdGPX9GH0Y3RgNCy0LXQvdGPX9C70ZbQv9C10L3Rj1/QttC90ZbRntC90Y9f0LLQtdGA0LDRgdC90Y9f0LrQsNGB0YLRgNGL0YfQvdGW0LrQsF/Qu9GW0YHRgtCw0L/QsNC00LBf0YHQvdC10LbQvdGPJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfRgdGC0YPQtNC30LXQvdGMX9C70Y7RgtGLX9GB0LDQutCw0LLRltC6X9C60YDQsNGB0LDQstGW0Lpf0YLRgNCw0LLQtdC90Yxf0YfRjdGA0LLQtdC90Yxf0LvRltC/0LXQvdGMX9C20L3RltCy0LXQvdGMX9Cy0LXRgNCw0YHQtdC90Yxf0LrQsNGB0YLRgNGL0YfQvdGW0Lpf0LvRltGB0YLQsNC/0LDQtF/RgdC90LXQttCw0L3RjCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9GB0YLRg9C0X9C70Y7Rgl/RgdCw0Lpf0LrRgNCw0YFf0YLRgNCw0LJf0YfRjdGA0LJf0LvRltC/X9C20L3RltCyX9Cy0LXRgF/QutCw0YHRgl/Qu9GW0YHRgl/RgdC90LXQticuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9C90Y/QtNC30LXQu9GOX9C/0LDQvdGP0LTQt9C10LvQsNC6X9Cw0Z7RgtC+0YDQsNC6X9GB0LXRgNCw0LTRg1/Rh9Cw0YbQstC10YBf0L/Rj9GC0L3RltGG0YNf0YHRg9Cx0L7RgtGDJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfQvdGP0LTQt9C10LvRj1/Qv9Cw0L3Rj9C00LfQtdC70LDQul/QsNGe0YLQvtGA0LDQul/RgdC10YDQsNC00LBf0YfQsNGG0LLQtdGAX9C/0Y/RgtC90ZbRhtCwX9GB0YPQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL1xcWyA/W9Cj0YPRnl0gPyg/OtC80ZbQvdGD0LvRg9GOfNC90LDRgdGC0YPQv9C90YPRjik/ID9cXF0gP2RkZGQvLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0L3QtF/Qv9C9X9Cw0YJf0YHRgF/Rh9GGX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvdC0X9C/0L1f0LDRgl/RgdGAX9GH0YZf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZINCzLicsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDQsy4sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSDQsy4sIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0KHRkdC90L3RjyDRnl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQl9Cw0Z7RgtGA0LAg0Z5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0KPRh9C+0YDQsCDRnl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1vQo10gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQoyDQvNGW0L3Rg9C70YPRjl0gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CjINC80ZbQvdGD0LvRi10gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQv9GA0LDQtyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0YLQsNC80YMnLFxuICAgICAgICAgICAgczogJ9C90LXQutCw0LvRjNC60ZYg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6ICfQtNC30LXQvdGMJyxcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTTogJ9C80LXRgdGP0YYnLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiAn0LPQvtC0JyxcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0L3QvtGH0Yt80YDQsNC90ZbRhtGLfNC00L3Rj3zQstC10YfQsNGA0LAvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijQtNC90Y980LLQtdGH0LDRgNCwKSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQvdC+0YfRiyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YDQsNC90ZbRhtGLJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQtNC90Y8nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Cy0LXRh9Cw0YDQsCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0ZZ80Yt80LPQsCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChudW1iZXIgJSAxMCA9PT0gMiB8fCBudW1iZXIgJSAxMCA9PT0gMykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciAlIDEwMCAhPT0gMTIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciAlIDEwMCAhPT0gMTNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbnVtYmVyICsgJy3RlidcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyICsgJy3Riyc7XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCz0LAnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBiZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCdWxnYXJpYW4gW2JnXVxuLy8hIGF1dGhvciA6IEtyYXNlbiBCb3Jpc292IDogaHR0cHM6Ly9naXRodWIuY29tL2tyYXpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBiZyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JnJywge1xuICAgICAgICBtb250aHM6ICfRj9C90YPQsNGA0Lhf0YTQtdCy0YDRg9Cw0YDQuF/QvNCw0YDRgl/QsNC/0YDQuNC7X9C80LDQuV/RjtC90Lhf0Y7Qu9C4X9Cw0LLQs9GD0YHRgl/RgdC10L/RgtC10LzQstGA0Lhf0L7QutGC0L7QvNCy0YDQuF/QvdC+0LXQvNCy0YDQuF/QtNC10LrQtdC80LLRgNC4Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9GP0L3Rg1/RhNC10LJf0LzQsNGAX9Cw0L/RgF/QvNCw0Llf0Y7QvdC4X9GO0LvQuF/QsNCy0LNf0YHQtdC/X9C+0LrRgl/QvdC+0LVf0LTQtdC6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9C90LXQtNC10LvRj1/Qv9C+0L3QtdC00LXQu9C90LjQul/QstGC0L7RgNC90LjQul/RgdGA0Y/QtNCwX9GH0LXRgtCy0YrRgNGC0YrQul/Qv9C10YLRitC6X9GB0YrQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C90LXQtF/Qv9C+0L1f0LLRgtC+X9GB0YDRj1/Rh9C10YJf0L/QtdGCX9GB0YrQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQlNC90LXRgSDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQo9GC0YDQtSDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvQsl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQktGH0LXRgNCwINCyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JzQuNC90LDQu9Cw0YLQsF0gZGRkZCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JzQuNC90LDQu9C40Y9dIGRkZGQgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0YHQu9C10LQgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9C/0YDQtdC00LggJXMnLFxuICAgICAgICAgICAgczogJ9C90Y/QutC+0LvQutC+INGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgbTogJ9C80LjQvdGD0YLQsCcsXG4gICAgICAgICAgICBtbTogJyVkINC80LjQvdGD0YLQuCcsXG4gICAgICAgICAgICBoOiAn0YfQsNGBJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YfQsNGB0LAnLFxuICAgICAgICAgICAgZDogJ9C00LXQvScsXG4gICAgICAgICAgICBkZDogJyVkINC00LXQvdCwJyxcbiAgICAgICAgICAgIHc6ICfRgdC10LTQvNC40YbQsCcsXG4gICAgICAgICAgICB3dzogJyVkINGB0LXQtNC80LjRhtC4JyxcbiAgICAgICAgICAgIE06ICfQvNC10YHQtdGGJyxcbiAgICAgICAgICAgIE1NOiAnJWQg0LzQtdGB0LXRhtCwJyxcbiAgICAgICAgICAgIHk6ICfQs9C+0LTQuNC90LAnLFxuICAgICAgICAgICAgeXk6ICclZCDQs9C+0LTQuNC90LgnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNC10LJ80LXQvXzRgtC4fNCy0Lh80YDQuHzQvNC4KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBsYXN0RGlnaXQgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBsYXN0MkRpZ2l0cyA9IG51bWJlciAlIDEwMDtcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QtdCyJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdDJEaWdpdHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QtdC9JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdDJEaWdpdHMgPiAxMCAmJiBsYXN0MkRpZ2l0cyA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCy0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgNC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSA3IHx8IGxhc3REaWdpdCA9PT0gOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC80LgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJnO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJhbWJhcmEgW2JtXVxuLy8hIGF1dGhvciA6IEVzdGVsbGUgQ29tbWVudCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9lc3RlbGxlY29tbWVudFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGJtID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm0nLCB7XG4gICAgICAgIG1vbnRoczogJ1phbnd1eWVrYWxvX0Zld3VydXlla2Fsb19NYXJpc2lrYWxvX0F3aXJpbGlrYWxvX03Jm2thbG9fWnV3yZtua2Fsb19adWx1eWVrYWxvX1V0aWthbG9fU8mbdGFuYnVydWthbG9fyZRrdXTJlGJ1cnVrYWxvX05vd2FuYnVydWthbG9fRGVzYW5idXJ1a2Fsbycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdaYW5fRmV3X01hcl9Bd2lfTcmbX1p1d19adWxfVXRpX1PJm3RfyZRrdV9Ob3dfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0thcmlfTnTJm27Jm25fVGFyYXRhX0FyYWJhX0FsYW1pc2FfSnVtYV9TaWJpcmknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdLYXJfTnTJm19UYXJfQXJhX0FsYV9KdW1fU2liJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0thX050X1RhX0FyX0FsX0p1X1NpJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ01NTU0gW3RpbGVdIEQgW3Nhbl0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIFt0aWxlXSBEIFtzYW5dIFlZWVkgW2zJm3LJm10gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgTU1NTSBbdGlsZV0gRCBbc2FuXSBZWVlZIFtsyZtyyZtdIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQmkgbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1NpbmkgbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2RvbiBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS3VudSBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbdMmbbcmbbmVuIGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBryZRuyZQnLFxuICAgICAgICAgICAgcGFzdDogJ2EgYsmbICVzIGLJlCcsXG4gICAgICAgICAgICBzOiAnc2FuZ2EgZGFtYSBkYW1hJyxcbiAgICAgICAgICAgIHNzOiAnc2Vrb25kaSAlZCcsXG4gICAgICAgICAgICBtOiAnbWluaXRpIGtlbGVuJyxcbiAgICAgICAgICAgIG1tOiAnbWluaXRpICVkJyxcbiAgICAgICAgICAgIGg6ICdsyZtyyZsga2VsZW4nLFxuICAgICAgICAgICAgaGg6ICdsyZtyyZsgJWQnLFxuICAgICAgICAgICAgZDogJ3RpbGUga2VsZW4nLFxuICAgICAgICAgICAgZGQ6ICd0aWxlICVkJyxcbiAgICAgICAgICAgIE06ICdrYWxvIGtlbGVuJyxcbiAgICAgICAgICAgIE1NOiAna2FsbyAlZCcsXG4gICAgICAgICAgICB5OiAnc2FuIGtlbGVuJyxcbiAgICAgICAgICAgIHl5OiAnc2FuICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJtO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJlbmdhbGkgKEJhbmdsYWRlc2gpIFtibi1iZF1cbi8vISBhdXRob3IgOiBBc3JhZiBIb3NzYWluIFBhdG9hcnkgOiBodHRwczovL2dpdGh1Yi5jb20vYXNod29vbGZvcmRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KenJyxcbiAgICAgICAgICAgIDI6ICfgp6gnLFxuICAgICAgICAgICAgMzogJ+CnqScsXG4gICAgICAgICAgICA0OiAn4KeqJyxcbiAgICAgICAgICAgIDU6ICfgp6snLFxuICAgICAgICAgICAgNjogJ+CnrCcsXG4gICAgICAgICAgICA3OiAn4KetJyxcbiAgICAgICAgICAgIDg6ICfgp64nLFxuICAgICAgICAgICAgOTogJ+CnrycsXG4gICAgICAgICAgICAwOiAn4KemJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Cnpyc6ICcxJyxcbiAgICAgICAgICAgICfgp6gnOiAnMicsXG4gICAgICAgICAgICAn4KepJzogJzMnLFxuICAgICAgICAgICAgJ+Cnqic6ICc0JyxcbiAgICAgICAgICAgICfgp6snOiAnNScsXG4gICAgICAgICAgICAn4KesJzogJzYnLFxuICAgICAgICAgICAgJ+CnrSc6ICc3JyxcbiAgICAgICAgICAgICfgp64nOiAnOCcsXG4gICAgICAgICAgICAn4KevJzogJzknLFxuICAgICAgICAgICAgJ+Cnpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBibkJkID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm4tYmQnLCB7XG4gICAgICAgIG1vbnRoczogJ+CmnOCmvuCmqOCngeCnn+CmvuCmsOCmv1/gpqvgp4fgpqzgp43gprDgp4Hgp5/gpr7gprDgpr9f4Kau4Ka+4Kaw4KeN4KaaX+Cmj+CmquCnjeCmsOCmv+Cmsl/gpq7gp4df4Kac4KeB4KaoX+CmnOCngeCmsuCmvuCmh1/gpobgppfgprjgp43gpp9f4Ka44KeH4Kaq4KeN4Kaf4KeH4Kau4KeN4Kas4KawX+CmheCmleCnjeCmn+Cni+CmrOCmsF/gpqjgpq3gp4fgpq7gp43gpqzgprBf4Kah4Ka/4Ka44KeH4Kau4KeN4Kas4KawJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgppzgpr7gpqjgp4Ff4Kar4KeH4Kas4KeN4Kaw4KeBX+CmruCmvuCmsOCnjeCmml/gpo/gpqrgp43gprDgpr/gprJf4Kau4KeHX+CmnOCngeCmqF/gppzgp4HgprLgpr7gpodf4KaG4KaX4Ka44KeN4KafX+CmuOCnh+CmquCnjeCmn1/gpoXgppXgp43gpp/gp4tf4Kao4Kat4KeHX+CmoeCmv+CmuOCnhycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+CmsOCmrOCmv+CmrOCmvuCmsF/gprjgp4vgpq7gpqzgpr7gprBf4Kau4KaZ4KeN4KaX4Kay4Kas4Ka+4KawX+CmrOCngeCmp+CmrOCmvuCmsF/gpqzgp4Pgprngprjgp43gpqrgpqTgpr/gpqzgpr7gprBf4Ka24KeB4KaV4KeN4Kaw4Kas4Ka+4KawX+CmtuCmqOCmv+CmrOCmvuCmsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CmsOCmrOCmv1/gprjgp4vgpq5f4Kau4KaZ4KeN4KaX4KayX+CmrOCngeCmp1/gpqzgp4Pgprngprjgp43gpqrgpqTgpr9f4Ka24KeB4KaV4KeN4KawX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgprDgpqzgpr9f4Ka44KeL4KauX+CmruCmmeCnjeCml+Cmsl/gpqzgp4Hgpqdf4Kas4KeD4Ka5X+CmtuCngeCmleCnjeCmsF/gprbgpqjgpr8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgprjgpq7gp58nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CmhuCmnF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpobgppfgpr7gpq7gp4DgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgppfgpqTgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Cml+CmpF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgpqrgprDgp4cnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCmhuCml+CnhycsXG4gICAgICAgICAgICBzOiAn4KaV4Kef4KeH4KaVIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBzczogJyVkIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBtOiAn4KaP4KaVIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBtbTogJyVkIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBoOiAn4KaP4KaVIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBoaDogJyVkIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBkOiAn4KaP4KaVIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBNOiAn4KaP4KaVIOCmruCmvuCmuCcsXG4gICAgICAgICAgICBNTTogJyVkIOCmruCmvuCmuCcsXG4gICAgICAgICAgICB5OiAn4KaP4KaVIOCmrOCmm+CmsCcsXG4gICAgICAgICAgICB5eTogJyVkIOCmrOCmm+CmsCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgp6fgp6jgp6ngp6rgp6vgp6zgp63gp67gp6/gp6ZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CmsOCmvuCmpHzgpq3gp4vgprB84Ka44KaV4Ka+4KayfOCmpuCngeCmquCngeCmsHzgpqzgpr/gppXgpr7gprJ84Ka44Kao4KeN4Kan4KeN4Kav4Ka+fOCmsOCmvuCmpC8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CmsOCmvuCmpCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CmreCni+CmsCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgprjgppXgpr7gprInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kam4KeB4Kaq4KeB4KawJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDMgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CmrOCmv+CmleCmvuCmsicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CmuOCmqOCnjeCmp+CnjeCmr+CmvicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmsOCmvuCmpCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCA2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpq3gp4vgprAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmuOCmleCmvuCmsic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kam4KeB4Kaq4KeB4KawJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpqzgpr/gppXgpr7gprInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmuOCmqOCnjeCmp+CnjeCmr+Cmvic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kaw4Ka+4KakJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJuQmQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmVuZ2FsaSBbYm5dXG4vLyEgYXV0aG9yIDogS2F1c2hpayBHYW5kaGkgOiBodHRwczovL2dpdGh1Yi5jb20va2F1c2hpa2dhbmRoaVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgp6cnLFxuICAgICAgICAgICAgMjogJ+CnqCcsXG4gICAgICAgICAgICAzOiAn4KepJyxcbiAgICAgICAgICAgIDQ6ICfgp6onLFxuICAgICAgICAgICAgNTogJ+CnqycsXG4gICAgICAgICAgICA2OiAn4KesJyxcbiAgICAgICAgICAgIDc6ICfgp60nLFxuICAgICAgICAgICAgODogJ+CnricsXG4gICAgICAgICAgICA5OiAn4KevJyxcbiAgICAgICAgICAgIDA6ICfgp6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KenJzogJzEnLFxuICAgICAgICAgICAgJ+CnqCc6ICcyJyxcbiAgICAgICAgICAgICfgp6knOiAnMycsXG4gICAgICAgICAgICAn4KeqJzogJzQnLFxuICAgICAgICAgICAgJ+Cnqyc6ICc1JyxcbiAgICAgICAgICAgICfgp6wnOiAnNicsXG4gICAgICAgICAgICAn4KetJzogJzcnLFxuICAgICAgICAgICAgJ+Cnric6ICc4JyxcbiAgICAgICAgICAgICfgp68nOiAnOScsXG4gICAgICAgICAgICAn4KemJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGJuID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm4nLCB7XG4gICAgICAgIG1vbnRoczogJ+CmnOCmvuCmqOCngeCnn+CmvuCmsOCmv1/gpqvgp4fgpqzgp43gprDgp4Hgp5/gpr7gprDgpr9f4Kau4Ka+4Kaw4KeN4KaaX+Cmj+CmquCnjeCmsOCmv+Cmsl/gpq7gp4df4Kac4KeB4KaoX+CmnOCngeCmsuCmvuCmh1/gpobgppfgprjgp43gpp9f4Ka44KeH4Kaq4KeN4Kaf4KeH4Kau4KeN4Kas4KawX+CmheCmleCnjeCmn+Cni+CmrOCmsF/gpqjgpq3gp4fgpq7gp43gpqzgprBf4Kah4Ka/4Ka44KeH4Kau4KeN4Kas4KawJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgppzgpr7gpqjgp4Ff4Kar4KeH4Kas4KeN4Kaw4KeBX+CmruCmvuCmsOCnjeCmml/gpo/gpqrgp43gprDgpr/gprJf4Kau4KeHX+CmnOCngeCmqF/gppzgp4HgprLgpr7gpodf4KaG4KaX4Ka44KeN4KafX+CmuOCnh+CmquCnjeCmn1/gpoXgppXgp43gpp/gp4tf4Kao4Kat4KeHX+CmoeCmv+CmuOCnhycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+CmsOCmrOCmv+CmrOCmvuCmsF/gprjgp4vgpq7gpqzgpr7gprBf4Kau4KaZ4KeN4KaX4Kay4Kas4Ka+4KawX+CmrOCngeCmp+CmrOCmvuCmsF/gpqzgp4Pgprngprjgp43gpqrgpqTgpr/gpqzgpr7gprBf4Ka24KeB4KaV4KeN4Kaw4Kas4Ka+4KawX+CmtuCmqOCmv+CmrOCmvuCmsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CmsOCmrOCmv1/gprjgp4vgpq5f4Kau4KaZ4KeN4KaX4KayX+CmrOCngeCmp1/gpqzgp4Pgprngprjgp43gpqrgpqTgpr9f4Ka24KeB4KaV4KeN4KawX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgprDgpqzgpr9f4Ka44KeL4KauX+CmruCmmeCnjeCml+Cmsl/gpqzgp4Hgpqdf4Kas4KeD4Ka5X+CmtuCngeCmleCnjeCmsF/gprbgpqjgpr8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgprjgpq7gp58nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CmhuCmnF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpobgppfgpr7gpq7gp4DgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgppfgpqTgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Cml+CmpF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgpqrgprDgp4cnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCmhuCml+CnhycsXG4gICAgICAgICAgICBzOiAn4KaV4Kef4KeH4KaVIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBzczogJyVkIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBtOiAn4KaP4KaVIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBtbTogJyVkIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBoOiAn4KaP4KaVIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBoaDogJyVkIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBkOiAn4KaP4KaVIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBNOiAn4KaP4KaVIOCmruCmvuCmuCcsXG4gICAgICAgICAgICBNTTogJyVkIOCmruCmvuCmuCcsXG4gICAgICAgICAgICB5OiAn4KaP4KaVIOCmrOCmm+CmsCcsXG4gICAgICAgICAgICB5eTogJyVkIOCmrOCmm+CmsCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgp6fgp6jgp6ngp6rgp6vgp6zgp63gp67gp6/gp6ZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gprDgpr7gpqR84Ka44KaV4Ka+4KayfOCmpuCngeCmquCngeCmsHzgpqzgpr/gppXgpr7gprJ84Kaw4Ka+4KakLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+CmsOCmvuCmpCcgJiYgaG91ciA+PSA0KSB8fFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+CmpuCngeCmquCngeCmsCcgJiYgaG91ciA8IDUpIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgpqzgpr/gppXgpr7gprInXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kaw4Ka+4KakJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprjgppXgpr7gprInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmpuCngeCmquCngeCmsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kas4Ka/4KaV4Ka+4KayJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprDgpr7gpqQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYm47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGliZXRhbiBbYm9dXG4vLyEgYXV0aG9yIDogVGh1cHRlbiBOLiBDaGFrcmlzaGFyIDogaHR0cHM6Ly9naXRodWIuY29tL3ZhanJhZG9nXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+C8oScsXG4gICAgICAgICAgICAyOiAn4LyiJyxcbiAgICAgICAgICAgIDM6ICfgvKMnLFxuICAgICAgICAgICAgNDogJ+C8pCcsXG4gICAgICAgICAgICA1OiAn4LylJyxcbiAgICAgICAgICAgIDY6ICfgvKYnLFxuICAgICAgICAgICAgNzogJ+C8pycsXG4gICAgICAgICAgICA4OiAn4LyoJyxcbiAgICAgICAgICAgIDk6ICfgvKknLFxuICAgICAgICAgICAgMDogJ+C8oCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgvKEnOiAnMScsXG4gICAgICAgICAgICAn4LyiJzogJzInLFxuICAgICAgICAgICAgJ+C8oyc6ICczJyxcbiAgICAgICAgICAgICfgvKQnOiAnNCcsXG4gICAgICAgICAgICAn4LylJzogJzUnLFxuICAgICAgICAgICAgJ+C8pic6ICc2JyxcbiAgICAgICAgICAgICfgvKcnOiAnNycsXG4gICAgICAgICAgICAn4LyoJzogJzgnLFxuICAgICAgICAgICAgJ+C8qSc6ICc5JyxcbiAgICAgICAgICAgICfgvKAnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgYm8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdibycsIHtcbiAgICAgICAgbW9udGhzOiAn4L2f4L6z4LyL4L2W4LyL4L2R4L2E4LyL4L2U4L28X+C9n+C+s+C8i+C9luC8i+C9guC9ieC9suC9puC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvYLgvabgvbTgvZjgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2e4L2y4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9o+C+lOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZHgvrLgvbTgvYLgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2R4L204L2T4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9ouC+kuC+seC9keC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZHgvYLgvbTgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2F4L204LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9heC9tOC8i+C9guC9heC9suC9guC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvYXgvbTgvIvgvYLgvYngvbLgvabgvIvgvZQnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+C9n+C+s+C8izFf4L2f4L6z4LyLMl/gvZ/gvrPgvIszX+C9n+C+s+C8izRf4L2f4L6z4LyLNV/gvZ/gvrPgvIs2X+C9n+C+s+C8izdf4L2f4L6z4LyLOF/gvZ/gvrPgvIs5X+C9n+C+s+C8izEwX+C9n+C+s+C8izExX+C9n+C+s+C8izEyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IC9eKOC9n+C+s+C8i1xcZHsxLDJ9KS8sXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ+C9guC9n+C9oOC8i+C9ieC9suC8i+C9mOC8i1/gvYLgvZ/gvaDgvIvgvZ/gvrPgvIvgvZbgvItf4L2C4L2f4L2g4LyL4L2Y4L2y4L2C4LyL4L2R4L2Y4L2i4LyLX+C9guC9n+C9oOC8i+C9o+C+t+C9guC8i+C9lOC8i1/gvYLgvZ/gvaDgvIvgvZXgvbTgvaLgvIvgvZbgvbRf4L2C4L2f4L2g4LyL4L2U4LyL4L2m4L2E4L2m4LyLX+C9guC9n+C9oOC8i+C9puC+pOC9uuC9k+C8i+C9lOC8iycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4L2J4L2y4LyL4L2Y4LyLX+C9n+C+s+C8i+C9luC8i1/gvZjgvbLgvYLgvIvgvZHgvZjgvaLgvItf4L2j4L634L2C4LyL4L2U4LyLX+C9leC9tOC9ouC8i+C9luC9tF/gvZTgvIvgvabgvYTgvabgvItf4L2m4L6k4L264L2T4LyL4L2U4LyLJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+C9ieC9sl/gvZ/gvrNf4L2Y4L2y4L2CX+C9o+C+t+C9gl/gvZXgvbTgvaJf4L2m4L2E4L2mX+C9puC+pOC9uuC9kycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgvZHgvbLgvIvgvaLgvbLgvYRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4L2m4L2E4LyL4L2J4L2y4L2TXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vgvZbgvZHgvbTgvZPgvIvgvZXgvrLgvYLgvIvgvaLgvpfgvbrgvabgvIvgvZhdLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C9geC8i+C9puC9hF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4L2W4L2R4L204L2T4LyL4L2V4L6y4L2C4LyL4L2Y4L2Q4L2g4LyL4L2YXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOC9o+C8iycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4L2m4L6U4L2T4LyL4L2jJyxcbiAgICAgICAgICAgIHM6ICfgvaPgvZjgvIvgvabgvYQnLFxuICAgICAgICAgICAgc3M6ICclZCDgvabgvpDgvaLgvIvgvYbgvI0nLFxuICAgICAgICAgICAgbTogJ+C9puC+kOC9ouC8i+C9mOC8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICBtbTogJyVkIOC9puC+kOC9ouC8i+C9mCcsXG4gICAgICAgICAgICBoOiAn4L2G4L204LyL4L2a4L284L2R4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4L2G4L204LyL4L2a4L284L2RJyxcbiAgICAgICAgICAgIGQ6ICfgvYngvbLgvZPgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgZGQ6ICclZCDgvYngvbLgvZPgvIsnLFxuICAgICAgICAgICAgTTogJ+C9n+C+s+C8i+C9luC8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICBNTTogJyVkIOC9n+C+s+C8i+C9licsXG4gICAgICAgICAgICB5OiAn4L2j4L284LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4L2j4L28JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+C8oeC8ouC8o+C8pOC8peC8puC8p+C8qOC8qeC8oF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C9mOC9muC9k+C8i+C9mOC9vHzgvZ7gvbzgvYLgvabgvIvgvYDgvaZ84L2J4L2y4L2T4LyL4L2C4L204L2EfOC9keC9guC9vOC9hOC8i+C9keC9gnzgvZjgvZrgvZPgvIvgvZjgvbwvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKG1lcmlkaWVtID09PSAn4L2Y4L2a4L2T4LyL4L2Y4L28JyAmJiBob3VyID49IDQpIHx8XG4gICAgICAgICAgICAgICAgKG1lcmlkaWVtID09PSAn4L2J4L2y4L2T4LyL4L2C4L204L2EJyAmJiBob3VyIDwgNSkgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+C9keC9guC9vOC9hOC8i+C9keC9gidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvZjgvZrgvZPgvIvgvZjgvbwnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9nuC9vOC9guC9puC8i+C9gOC9pic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2J4L2y4L2T4LyL4L2C4L204L2EJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvZHgvYLgvbzgvYTgvIvgvZHgvYInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9mOC9muC9k+C8i+C9mOC9vCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBibztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCcmV0b24gW2JyXVxuLy8hIGF1dGhvciA6IEplYW4tQmFwdGlzdGUgTGUgRHVpZ291IDogaHR0cHM6Ly9naXRodWIuY29tL2pibGVkdWlnb3VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbW06ICdtdW51dGVubicsXG4gICAgICAgICAgICBNTTogJ21peicsXG4gICAgICAgICAgICBkZDogJ2RldmV6aCcsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBtdXRhdGlvbihmb3JtYXRba2V5XSwgbnVtYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3BlY2lhbE11dGF0aW9uRm9yWWVhcnMobnVtYmVyKSB7XG4gICAgICAgIHN3aXRjaCAobGFzdE51bWJlcihudW1iZXIpKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgYmxvYXonO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyB2bG9heic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbGFzdE51bWJlcihudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA+IDkpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0TnVtYmVyKG51bWJlciAlIDEwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtdXRhdGlvbih0ZXh0LCBudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIHNvZnRNdXRhdGlvbih0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgZnVuY3Rpb24gc29mdE11dGF0aW9uKHRleHQpIHtcbiAgICAgICAgdmFyIG11dGF0aW9uVGFibGUgPSB7XG4gICAgICAgICAgICBtOiAndicsXG4gICAgICAgICAgICBiOiAndicsXG4gICAgICAgICAgICBkOiAneicsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChtdXRhdGlvblRhYmxlW3RleHQuY2hhckF0KDApXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXV0YXRpb25UYWJsZVt0ZXh0LmNoYXJBdCgwKV0gKyB0ZXh0LnN1YnN0cmluZygxKTtcbiAgICB9XG5cbiAgICB2YXIgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmdlbi9pLFxuICAgICAgICAgICAgL15jW8q8XFwnXWh3ZS9pLFxuICAgICAgICAgICAgL15tZXUvaSxcbiAgICAgICAgICAgIC9eZWJyL2ksXG4gICAgICAgICAgICAvXm1hZS9pLFxuICAgICAgICAgICAgL14obWV6fGV2ZSkvaSxcbiAgICAgICAgICAgIC9eZ291L2ksXG4gICAgICAgICAgICAvXmVvcy9pLFxuICAgICAgICAgICAgL15nd2UvaSxcbiAgICAgICAgICAgIC9eaGVyL2ksXG4gICAgICAgICAgICAvXmR1L2ksXG4gICAgICAgICAgICAvXmtlci9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihnZW52ZXJ8Y1vKvFxcJ11od2V2cmVyfG1ldXJ6aHxlYnJlbHxtYWV8bWV6aGV2ZW58Z291ZXJlfGVvc3R8Z3dlbmdvbG98aGVyZXxkdXxrZXJ6dXxnZW58Y1vKvFxcJ11od2V8bWV1fGVicnxtYWV8ZXZlfGdvdXxlb3N8Z3dlfGhlcnxkdXxrZXIpL2ksXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4ID1cbiAgICAgICAgICAgIC9eKGdlbnZlcnxjW8q8XFwnXWh3ZXZyZXJ8bWV1cnpofGVicmVsfG1hZXxtZXpoZXZlbnxnb3VlcmV8ZW9zdHxnd2VuZ29sb3xoZXJlfGR1fGtlcnp1KS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4ID1cbiAgICAgICAgICAgIC9eKGdlbnxjW8q8XFwnXWh3ZXxtZXV8ZWJyfG1hZXxldmV8Z291fGVvc3xnd2V8aGVyfGR1fGtlcikvaSxcbiAgICAgICAgZnVsbFdlZWtkYXlzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXnN1bC9pLFxuICAgICAgICAgICAgL15sdW4vaSxcbiAgICAgICAgICAgIC9ebWV1cnpoL2ksXG4gICAgICAgICAgICAvXm1lcmNbyrxcXCddaGVyL2ksXG4gICAgICAgICAgICAvXnlhb3UvaSxcbiAgICAgICAgICAgIC9eZ3dlbmVyL2ksXG4gICAgICAgICAgICAvXnNhZG9ybi9pLFxuICAgICAgICBdLFxuICAgICAgICBzaG9ydFdlZWtkYXlzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXlN1bC9pLFxuICAgICAgICAgICAgL15MdW4vaSxcbiAgICAgICAgICAgIC9eTWV1L2ksXG4gICAgICAgICAgICAvXk1lci9pLFxuICAgICAgICAgICAgL15ZYW8vaSxcbiAgICAgICAgICAgIC9eR3dlL2ksXG4gICAgICAgICAgICAvXlNhZC9pLFxuICAgICAgICBdLFxuICAgICAgICBtaW5XZWVrZGF5c1BhcnNlID0gW1xuICAgICAgICAgICAgL15TdS9pLFxuICAgICAgICAgICAgL15MdS9pLFxuICAgICAgICAgICAgL15NZShbXnJdfCQpL2ksXG4gICAgICAgICAgICAvXk1lci9pLFxuICAgICAgICAgICAgL15ZYS9pLFxuICAgICAgICAgICAgL15Hdy9pLFxuICAgICAgICAgICAgL15TYS9pLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGJyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYnInLCB7XG4gICAgICAgIG1vbnRoczogJ0dlbnZlcl9Dyrxod2V2cmVyX01ldXJ6aF9FYnJlbF9NYWVfTWV6aGV2ZW5fR291ZXJlX0Vvc3RfR3dlbmdvbG9fSGVyZV9EdV9LZXJ6dScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdHZW5fQ8q8aHdlX01ldV9FYnJfTWFlX0V2ZV9Hb3VfRW9zX0d3ZV9IZXJfRHVfS2VyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bF9MdW5fTWV1cnpoX01lcmPKvGhlcl9ZYW91X0d3ZW5lcl9TYWRvcm4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdWxfTHVuX01ldV9NZXJfWWFvX0d3ZV9TYWQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTHVfTWVfTWVyX1lhX0d3X1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlOiBtaW5XZWVrZGF5c1BhcnNlLFxuICAgICAgICBmdWxsV2Vla2RheXNQYXJzZTogZnVsbFdlZWtkYXlzUGFyc2UsXG4gICAgICAgIHNob3J0V2Vla2RheXNQYXJzZTogc2hvcnRXZWVrZGF5c1BhcnNlLFxuICAgICAgICBtaW5XZWVrZGF5c1BhcnNlOiBtaW5XZWVrZGF5c1BhcnNlLFxuXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OiBtb250aHNTdHJpY3RSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogbW9udGhzU2hvcnRTdHJpY3RSZWdleCxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcblxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2Egdml6XSBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbYSB2aXpdIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbYSB2aXpdIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hpeml2IGRhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1dhcmPKvGhvYXpoIGRhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2RhXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0RlY8q8aCBkYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtwYXNldCBkYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdhLWJlbm4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMq8em8nLFxuICAgICAgICAgICAgczogJ3VuIG5lYmV1ZCBzZWdvbmRlbm5vw7knLFxuICAgICAgICAgICAgc3M6ICclZCBlaWxlbm4nLFxuICAgICAgICAgICAgbTogJ3VyIHZ1bnV0ZW5uJyxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24sXG4gICAgICAgICAgICBoOiAndW4gZXVyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgZXVyJyxcbiAgICAgICAgICAgIGQ6ICd1biBkZXZlemgnLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbixcbiAgICAgICAgICAgIE06ICd1ciBtaXonLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbixcbiAgICAgICAgICAgIHk6ICd1ciBibG9heicsXG4gICAgICAgICAgICB5eTogc3BlY2lhbE11dGF0aW9uRm9yWWVhcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShhw7F8dmV0KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSBudW1iZXIgPT09IDEgPyAnYcOxJyA6ICd2ZXQnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvYS5tLnxnLm0uLywgLy8gZ291ZGUgbWVyZW5uIHwgYS1yYW9rIG1lcmVublxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbiA9PT0gJ2cubS4nO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAxMiA/ICdhLm0uJyA6ICdnLm0uJztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBicjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCb3NuaWFuIFtic11cbi8vISBhdXRob3IgOiBOZWRpbSBDaG9saWNoIDogaHR0cHM6Ly9naXRodWIuY29tL2Zyb250eWFyZFxuLy8hIGF1dGhvciA6IFJhc2lkIFJlZHppYyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXNpZHJlXG4vLyEgYmFzZWQgb24gKGhyKSB0cmFuc2xhdGlvbiBieSBCb2phbiBNYXJrb3ZpxIdcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgICA/ICdqZWRuYSBtaW51dGEnXG4gICAgICAgICAgICAgICAgICAgIDogaXNGdXR1cmVcbiAgICAgICAgICAgICAgICAgICAgICA/ICdqZWRudSBtaW51dHUnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnamVkbmUgbWludXRlJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdqZWRhbiBzYXQnIDogJ2plZGFuIHNhdCc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0aSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2Rhbic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkYW5hJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5lJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluYSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYnMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdicycsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFydF9hcHJpbF9tYWpfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iYXJfb2t0b2Jhcl9ub3ZlbWJhcl9kZWNlbWJhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hci5fYXByLl9tYWouX2p1bi5fanVsLl9hdWcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRqZWxqYV9wb25lZGplbGpha191dG9yYWtfc3JpamVkYV/EjWV0dnJ0YWtfcGV0YWtfc3Vib3RhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3V0by5fc3JpLl/EjWV0Ll9wZXQuX3N1Yi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3JfxI1lX3BlX3N1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3N1dHJhIHVdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3NyaWplZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdcSNZXIgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbGVdIFtzdWJvdGVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbGldIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJpamUgJXMnLFxuICAgICAgICAgICAgczogJ3BhciBzZWt1bmRpJyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiAnZGFuJyxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiAnbWplc2VjJyxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAnZ29kaW51JyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2F0YWxhbiBbY2FdXG4vLyEgYXV0aG9yIDogSnVhbiBHLiBIdXJ0YWRvIDogaHR0cHM6Ly9naXRodWIuY29tL2p1YW5naHVydGFkb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGNhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY2EnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnZ2VuZXJfZmVicmVyX21hcsOnX2FicmlsX21haWdfanVueV9qdWxpb2xfYWdvc3Rfc2V0ZW1icmVfb2N0dWJyZV9ub3ZlbWJyZV9kZXNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6IFwiZGUgZ2VuZXJfZGUgZmVicmVyX2RlIG1hcsOnX2QnYWJyaWxfZGUgbWFpZ19kZSBqdW55X2RlIGp1bGlvbF9kJ2Fnb3N0X2RlIHNldGVtYnJlX2Qnb2N0dWJyZV9kZSBub3ZlbWJyZV9kZSBkZXNlbWJyZVwiLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvRFtvRF0/KFxccykrTU1NTS8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2dlbi5fZmVici5fbWFyw6dfYWJyLl9tYWlnX2p1bnlfanVsLl9hZy5fc2V0Ll9vY3QuX25vdi5fZGVzLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdkaXVtZW5nZV9kaWxsdW5zX2RpbWFydHNfZGltZWNyZXNfZGlqb3VzX2RpdmVuZHJlc19kaXNzYWJ0ZScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGcuX2RsLl9kdC5fZGMuX2RqLl9kdi5fZHMuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RnX2RsX2R0X2RjX2RqX2R2X2RzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgbGw6ICdEIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBbZGVdIFlZWVkgW2EgbGVzXSBIOm1tJyxcbiAgICAgICAgICAgIGxsbDogJ0QgTU1NIFlZWVksIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFtkZV0gWVlZWSBbYSBsZXNdIEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCBEIE1NTSBZWVlZLCBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1thdnVpIGEgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnbGVzJyA6ICdsYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tkZW3DoCBhICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2FoaXIgYSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNzYXQgYSAnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgK1xuICAgICAgICAgICAgICAgICAgICAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBcImQnYXF1w60gJXNcIixcbiAgICAgICAgICAgIHBhc3Q6ICdmYSAlcycsXG4gICAgICAgICAgICBzOiAndW5zIHNlZ29ucycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ29ucycsXG4gICAgICAgICAgICBtOiAndW4gbWludXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHMnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yZXMnLFxuICAgICAgICAgICAgZDogJ3VuIGRpYScsXG4gICAgICAgICAgICBkZDogJyVkIGRpZXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc29zJyxcbiAgICAgICAgICAgIHk6ICd1biBhbnknLFxuICAgICAgICAgICAgeXk6ICclZCBhbnlzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHJ8bnx0fMOofGEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICBudW1iZXIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgPyAncidcbiAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICA/ICduJ1xuICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnw6gnO1xuICAgICAgICAgICAgaWYgKHBlcmlvZCA9PT0gJ3cnIHx8IHBlcmlvZCA9PT0gJ1cnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2EnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEN6ZWNoIFtjc11cbi8vISBhdXRob3IgOiBwZXRyYmVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRyYmVsYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ2xlZGVuX8O6bm9yX2LFmWV6ZW5fZHViZW5fa3bEm3Rlbl/EjWVydmVuX8SNZXJ2ZW5lY19zcnBlbl96w6HFmcOtX8WZw61qZW5fbGlzdG9wYWRfcHJvc2luZWMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAnbGVkbmFfw7pub3JhX2LFmWV6bmFfZHVibmFfa3bEm3RuYV/EjWVydm5hX8SNZXJ2ZW5jZV9zcnBuYV96w6HFmcOtX8WZw61qbmFfbGlzdG9wYWR1X3Byb3NpbmNlJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL0REP1tvLl0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NLyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnbGVkX8O6bm9fYsWZZV9kdWJfa3bEm1/EjXZuX8SNdmNfc3JwX3rDocWZX8WZw61qX2xpc19wcm8nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15sZWQvaSxcbiAgICAgICAgICAgIC9ew7puby9pLFxuICAgICAgICAgICAgL15ixZllL2ksXG4gICAgICAgICAgICAvXmR1Yi9pLFxuICAgICAgICAgICAgL15rdsSbL2ksXG4gICAgICAgICAgICAvXijEjXZufMSNZXJ2ZW4kfMSNZXJ2bmEpL2ksXG4gICAgICAgICAgICAvXijEjXZjfMSNZXJ2ZW5lY3zEjWVydmVuY2UpL2ksXG4gICAgICAgICAgICAvXnNycC9pLFxuICAgICAgICAgICAgL156w6HFmS9pLFxuICAgICAgICAgICAgL17FmcOtai9pLFxuICAgICAgICAgICAgL15saXMvaSxcbiAgICAgICAgICAgIC9ecHJvL2ksXG4gICAgICAgIF0sXG4gICAgICAgIC8vIE5PVEU6ICfEjWVydmVuJyBpcyBzdWJzdHJpbmcgb2YgJ8SNZXJ2ZW5lYyc7IHRoZXJlZm9yZSAnxI1lcnZlbmVjJyBtdXN0IHByZWNlZGUgJ8SNZXJ2ZW4nIGluIHRoZSByZWdleCB0byBiZSBmdWxseSBtYXRjaGVkLlxuICAgICAgICAvLyBPdGhlcndpc2UgcGFyc2VyIG1hdGNoZXMgJzEuIMSNZXJ2ZW5lYycgYXMgJzEuIMSNZXJ2ZW4nICsgJ2VjJy5cbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14obGVkZW58w7pub3J8YsWZZXplbnxkdWJlbnxrdsSbdGVufMSNZXJ2ZW5lY3zEjWVydmVuY2V8xI1lcnZlbnzEjWVydm5hfHNycGVufHrDocWZw618xZnDrWplbnxsaXN0b3BhZHxwcm9zaW5lY3xsZWR8w7pub3xixZllfGR1YnxrdsSbfMSNdm58xI12Y3xzcnB8esOhxZl8xZnDrWp8bGlzfHBybykvaTtcblxuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIHJldHVybiBuID4gMSAmJiBuIDwgNSAmJiB+fihuIC8gMTApICE9PSAxO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzogLy8gYSBmZXcgc2Vjb25kcyAvIGluIGEgZmV3IHNlY29uZHMgLyBhIGZldyBzZWNvbmRzIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3DDoXIgc2VrdW5kJyA6ICdww6FyIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6IC8vIDkgc2Vjb25kcyAvIGluIDkgc2Vjb25kcyAvIDkgc2Vjb25kcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Nla3VuZHknIDogJ3Nla3VuZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnc2VrdW5kYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtJzogLy8gYSBtaW51dGUgLyBpbiBhIG1pbnV0ZSAvIGEgbWludXRlIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ21pbnV0YScgOiBpc0Z1dHVyZSA/ICdtaW51dHUnIDogJ21pbnV0b3UnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOiAvLyA5IG1pbnV0ZXMgLyBpbiA5IG1pbnV0ZXMgLyA5IG1pbnV0ZXMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtaW51dHknIDogJ21pbnV0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtaW51dGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaCc6IC8vIGFuIGhvdXIgLyBpbiBhbiBob3VyIC8gYW4gaG91ciBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdob2RpbmEnIDogaXNGdXR1cmUgPyAnaG9kaW51JyA6ICdob2Rpbm91JztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzogLy8gOSBob3VycyAvIGluIDkgaG91cnMgLyA5IGhvdXJzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnaG9kaW55JyA6ICdob2RpbicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnaG9kaW5hbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2QnOiAvLyBhIGRheSAvIGluIGEgZGF5IC8gYSBkYXkgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZGVuJyA6ICdkbmVtJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzogLy8gOSBkYXlzIC8gaW4gOSBkYXlzIC8gOSBkYXlzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnZG55JyA6ICdkbsOtJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkbnknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ00nOiAvLyBhIG1vbnRoIC8gaW4gYSBtb250aCAvIGEgbW9udGggYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbcSbc8OtYycgOiAnbcSbc8OtY2VtJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzogLy8gOSBtb250aHMgLyBpbiA5IG1vbnRocyAvIDkgbW9udGhzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbcSbc8OtY2UnIDogJ23Em3PDrWPFrycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcSbc8OtY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ3knOiAvLyBhIHllYXIgLyBpbiBhIHllYXIgLyBhIHllYXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncm9rJyA6ICdyb2tlbSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6IC8vIDkgeWVhcnMgLyBpbiA5IHllYXJzIC8gOSB5ZWFycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Jva3knIDogJ2xldCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbGV0eSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY3MnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIC8vIE5PVEU6ICfEjWVydmVuJyBpcyBzdWJzdHJpbmcgb2YgJ8SNZXJ2ZW5lYyc7IHRoZXJlZm9yZSAnxI1lcnZlbmVjJyBtdXN0IHByZWNlZGUgJ8SNZXJ2ZW4nIGluIHRoZSByZWdleCB0byBiZSBmdWxseSBtYXRjaGVkLlxuICAgICAgICAvLyBPdGhlcndpc2UgcGFyc2VyIG1hdGNoZXMgJzEuIMSNZXJ2ZW5lYycgYXMgJzEuIMSNZXJ2ZW4nICsgJ2VjJy5cbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihsZWRlbnxsZWRuYXzDum5vcmF8w7pub3J8YsWZZXplbnxixZllem5hfGR1YmVufGR1Ym5hfGt2xJt0ZW58a3bEm3RuYXzEjWVydmVuZWN8xI1lcnZlbmNlfMSNZXJ2ZW58xI1lcnZuYXxzcnBlbnxzcnBuYXx6w6HFmcOtfMWZw61qZW58xZnDrWpuYXxsaXN0b3BhZHV8bGlzdG9wYWR8cHJvc2luZWN8cHJvc2luY2UpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihsZWR8w7pub3xixZllfGR1YnxrdsSbfMSNdm58xI12Y3xzcnB8esOhxZl8xZnDrWp8bGlzfHBybykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWTEm2xlX3BvbmTEm2zDrV/DunRlcsO9X3N0xZllZGFfxI10dnJ0ZWtfcMOhdGVrX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lX3BvX8O6dF9zdF/EjXRfcMOhX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX8O6dF9zdF/EjXRfcMOhX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgbDogJ0QuIE0uIFlZWVknLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkbmVzIHZdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbesOtdHJhIHZdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgbmVkxJtsaSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gZGRkZCBbdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2ZSBzdMWZZWR1IHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdmUgxI10dnJ0ZWsgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHDDoXRlayB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Ygc29ib3R1IHZdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1t2xI1lcmEgdl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWxvdSBuZWTEm2xpIHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMOpXSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsb3Ugc3TFmWVkdSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDvV0gZGRkZCBbdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bG91IHNvYm90dSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3DFmWVkICVzJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaHV2YXNoIFtjdl1cbi8vISBhdXRob3IgOiBBbmF0b2x5IE1pcm9ub3YgOiBodHRwczovL2dpdGh1Yi5jb20vbWlyb250b2xpXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgY3YgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdjdicsIHtcbiAgICAgICAgbW9udGhzOiAn0LrTkdGA0LvQsNGHX9C90LDRgNOR0YFf0L/Rg9GIX9Cw0LrQsF/QvNCw0Llf0qvTl9GA0YLQvNC1X9GD0YLTkV/Sq9GD0YDQu9CwX9Cw0LLTkdC9X9GO0L/QsF/Rh9Oz0Lpf0YDQsNGI0YLQsNCyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9C605HRgF/QvdCw0YBf0L/Rg9GIX9Cw0LrQsF/QvNCw0Llf0qvTl9GAX9GD0YLTkV/Sq9GD0YBf0LDQstC9X9GO0L/QsF/Rh9Oz0Lpf0YDQsNGIJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfQstGL0YDRgdCw0YDQvdC40LrRg9C9X9GC0YPQvdGC0LjQutGD0L1f0YvRgtC70LDRgNC40LrRg9C9X9GO0L3QutGD0L1f0LrTl9Kr0L3QtdGA0L3QuNC60YPQvV/RjdGA0L3QtdC60YPQvV/RiNOR0LzQsNGC0LrRg9C9Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQstGL0YBf0YLRg9C9X9GL0YLQu1/RjtC9X9C605fSq1/RjdGA0L1f0YjTkdC8Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9Cy0YBf0YLQvV/Ri9GCX9GO0L1f0LrSq1/RjdGAX9GI0LwnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnWVlZWSBb0qvRg9C70YXQuF0gTU1NTSBb0YPQudOR0YXTl9C9XSBEWy3QvNOX0YjTl10nLFxuICAgICAgICAgICAgTExMOiAnWVlZWSBb0qvRg9C70YXQuF0gTU1NTSBb0YPQudOR0YXTl9C9XSBEWy3QvNOX0YjTl10sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBZWVlZIFvSq9GD0LvRhdC4XSBNTU1NIFvRg9C505HRhdOX0L1dIERbLdC805fRiNOXXSwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQn9Cw0Y/QvV0gTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Cr0YDQsNC9XSBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb05bQvdC10YBdIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb0qrQuNGC0LXRgV0gZGRkZCBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9CY0YDRgtC905ddIGRkZGQgTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICAgICAgICAgIHZhciBhZmZpeCA9IC/RgdC10YXQtdGCJC9pLmV4ZWMob3V0cHV0KVxuICAgICAgICAgICAgICAgICAgICA/ICfRgNC10L0nXG4gICAgICAgICAgICAgICAgICAgIDogL9Kr0YPQuyQvaS5leGVjKG91dHB1dClcbiAgICAgICAgICAgICAgICAgICAgICA/ICfRgtCw0L0nXG4gICAgICAgICAgICAgICAgICAgICAgOiAn0YDQsNC9JztcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0ICsgYWZmaXg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdDogJyVzINC60LDRj9C70LvQsCcsXG4gICAgICAgICAgICBzOiAn0L/Tl9GALdC40Log0qvQtdC60LrRg9C90YInLFxuICAgICAgICAgICAgc3M6ICclZCDSq9C10LrQutGD0L3RgicsXG4gICAgICAgICAgICBtOiAn0L/Tl9GAINC80LjQvdGD0YInLFxuICAgICAgICAgICAgbW06ICclZCDQvNC40L3Rg9GCJyxcbiAgICAgICAgICAgIGg6ICfQv9OX0YAg0YHQtdGF0LXRgicsXG4gICAgICAgICAgICBoaDogJyVkINGB0LXRhdC10YInLFxuICAgICAgICAgICAgZDogJ9C/05fRgCDQutGD0L0nLFxuICAgICAgICAgICAgZGQ6ICclZCDQutGD0L0nLFxuICAgICAgICAgICAgTTogJ9C/05fRgCDRg9C505HRhScsXG4gICAgICAgICAgICBNTTogJyVkINGD0LnTkdGFJyxcbiAgICAgICAgICAgIHk6ICfQv9OX0YAg0qvRg9C7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0qvRg9C7JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LdC805fRiC8sXG4gICAgICAgIG9yZGluYWw6ICclZC3QvNOX0YgnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3Y7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogV2Vsc2ggW2N5XVxuLy8hIGF1dGhvciA6IFJvYmVydCBBbGxlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JnYWxsZW5cbi8vISBhdXRob3IgOiBodHRwczovL2dpdGh1Yi5jb20vcnlhbmdyZWF2ZXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBjeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2N5Jywge1xuICAgICAgICBtb250aHM6ICdJb25hd3JfQ2h3ZWZyb3JfTWF3cnRoX0VicmlsbF9NYWlfTWVoZWZpbl9Hb3JmZmVubmFmX0F3c3RfTWVkaV9IeWRyZWZfVGFjaHdlZGRfUmhhZ2Z5cicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdJb25fQ2h3ZV9NYXdfRWJyX01haV9NZWhfR29yX0F3c19NZWRfSHlkX1RhY2hfUmhhZycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnRHlkZCBTdWxfRHlkZCBMbHVuX0R5ZGQgTWF3cnRoX0R5ZGQgTWVyY2hlcl9EeWRkIElhdV9EeWRkIEd3ZW5lcl9EeWRkIFNhZHdybicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VsX0xsdW5fTWF3X01lcl9JYXVfR3dlX1NhZCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9MbF9NYV9NZV9JYV9Hd19TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICAvLyB0aW1lIGZvcm1hdHMgYXJlIHRoZSBzYW1lIGFzIGVuLWdiXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGVkZGl3IGFtXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1lmb3J5IGFtXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FtXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0Rkb2UgYW1dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZGl3ZXRoYWYgYW1dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnbWV3biAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgeW4gw7RsJyxcbiAgICAgICAgICAgIHM6ICd5Y2h5ZGlnIGVpbGlhZGF1JyxcbiAgICAgICAgICAgIHNzOiAnJWQgZWlsaWFkJyxcbiAgICAgICAgICAgIG06ICdtdW51ZCcsXG4gICAgICAgICAgICBtbTogJyVkIG11bnVkJyxcbiAgICAgICAgICAgIGg6ICdhd3InLFxuICAgICAgICAgICAgaGg6ICclZCBhd3InLFxuICAgICAgICAgICAgZDogJ2Rpd3Jub2QnLFxuICAgICAgICAgICAgZGQ6ICclZCBkaXdybm9kJyxcbiAgICAgICAgICAgIE06ICdtaXMnLFxuICAgICAgICAgICAgTU06ICclZCBtaXMnLFxuICAgICAgICAgICAgeTogJ2Jsd3lkZHluJyxcbiAgICAgICAgICAgIHl5OiAnJWQgZmx5bmVkZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShmZWR8YWlufGFmfGlsfHlkZHxlZHxlZykvLFxuICAgICAgICAvLyB0cmFkaXRpb25hbCBvcmRpbmFsIG51bWJlcnMgYWJvdmUgMzEgYXJlIG5vdCBjb21tb25seSB1c2VkIGluIGNvbGxvcXVpYWwgV2Vsc2hcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gJycsXG4gICAgICAgICAgICAgICAgbG9va3VwID0gW1xuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FmJyxcbiAgICAgICAgICAgICAgICAgICAgJ2lsJyxcbiAgICAgICAgICAgICAgICAgICAgJ3lkZCcsXG4gICAgICAgICAgICAgICAgICAgICd5ZGQnLFxuICAgICAgICAgICAgICAgICAgICAnZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLCAvLyAxYWYgdG8gMTBmZWRcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsIC8vIDExZWcgdG8gMjBmZWRcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGIgPiAyMCkge1xuICAgICAgICAgICAgICAgIGlmIChiID09PSA0MCB8fCBiID09PSA1MCB8fCBiID09PSA2MCB8fCBiID09PSA4MCB8fCBiID09PSAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2ZlZCc7IC8vIG5vdCAzMGFpbiwgNzBhaW4gb3IgOTBhaW5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnYWluJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGIgPiAwKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbG9va3VwW2JdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGN5O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IERhbmlzaCBbZGFdXG4vLyEgYXV0aG9yIDogVWxyaWsgTmllbHNlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tcmJhc2VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBkYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2RhJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0c19hcHJpbF9tYWpfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWFqX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdzw7huZGFnX21hbmRhZ190aXJzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sw7hyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc8O4bl9tYW5fdGlyX29uc190b3JfZnJlX2zDuHInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc8O4X21hX3RpX29uX3RvX2ZyX2zDuCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIFtkLl0gRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaSBkYWcga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2kgbW9yZ2VuIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdww6UgZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2kgZ8OlciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2ldIGRkZGRbcyBrbC5dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb20gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHNpZGVuJyxcbiAgICAgICAgICAgIHM6ICdmw6Ugc2VrdW5kZXInLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRlcicsXG4gICAgICAgICAgICBtOiAnZXQgbWludXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHRlcicsXG4gICAgICAgICAgICBoOiAnZW4gdGltZScsXG4gICAgICAgICAgICBoaDogJyVkIHRpbWVyJyxcbiAgICAgICAgICAgIGQ6ICdlbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlJyxcbiAgICAgICAgICAgIE06ICdlbiBtw6VuZWQnLFxuICAgICAgICAgICAgTU06ICclZCBtw6VuZWRlcicsXG4gICAgICAgICAgICB5OiAnZXQgw6VyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw6VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHZXJtYW4gKEF1c3RyaWEpIFtkZS1hdF1cbi8vISBhdXRob3IgOiBsbHVjaHMgOiBodHRwczovL2dpdGh1Yi5jb20vbGx1Y2hzXG4vLyEgYXV0aG9yOiBNZW5lbGlvbiBFbGVuc8O6bGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG4vLyEgYXV0aG9yIDogTWFydGluIEdyb2xsZXIgOiBodHRwczovL2dpdGh1Yi5jb20vTWFkTUdcbi8vISBhdXRob3IgOiBNaWtvbGFqIERhZGVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWswMWFqXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbTogWydlaW5lIE1pbnV0ZScsICdlaW5lciBNaW51dGUnXSxcbiAgICAgICAgICAgIGg6IFsnZWluZSBTdHVuZGUnLCAnZWluZXIgU3R1bmRlJ10sXG4gICAgICAgICAgICBkOiBbJ2VpbiBUYWcnLCAnZWluZW0gVGFnJ10sXG4gICAgICAgICAgICBkZDogW251bWJlciArICcgVGFnZScsIG51bWJlciArICcgVGFnZW4nXSxcbiAgICAgICAgICAgIHc6IFsnZWluZSBXb2NoZScsICdlaW5lciBXb2NoZSddLFxuICAgICAgICAgICAgTTogWydlaW4gTW9uYXQnLCAnZWluZW0gTW9uYXQnXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyBNb25hdGUnLCBudW1iZXIgKyAnIE1vbmF0ZW4nXSxcbiAgICAgICAgICAgIHk6IFsnZWluIEphaHInLCAnZWluZW0gSmFociddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIEphaHJlJywgbnVtYmVyICsgJyBKYWhyZW4nXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBkZUF0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZGUtYXQnLCB7XG4gICAgICAgIG1vbnRoczogJ0rDpG5uZXJfRmVicnVhcl9Nw6Ryel9BcHJpbF9NYWlfSnVuaV9KdWxpX0F1Z3VzdF9TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXplbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnSsOkbi5fRmViLl9Nw6Ryel9BcHIuX01haV9KdW5pX0p1bGlfQXVnLl9TZXAuX09rdC5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdTb25udGFnX01vbnRhZ19EaWVuc3RhZ19NaXR0d29jaF9Eb25uZXJzdGFnX0ZyZWl0YWdfU2Ftc3RhZycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU28uX01vLl9EaS5fTWkuX0RvLl9Gci5fU2EuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaGV1dGUgdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vcmdlbiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tnZXN0ZXJuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tsZXR6dGVuXSBkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICd2b3IgJXMnLFxuICAgICAgICAgICAgczogJ2VpbiBwYWFyIFNla3VuZGVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgU2VrdW5kZW4nLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiAnJWQgTWludXRlbicsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6ICclZCBTdHVuZGVuJyxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHc6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3dzogJyVkIFdvY2hlbicsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVBdDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHZXJtYW4gKFN3aXR6ZXJsYW5kKSBbZGUtY2hdXG4vLyEgYXV0aG9yIDogc3NjaHVlbGxlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zc2NodWVsbGVyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbTogWydlaW5lIE1pbnV0ZScsICdlaW5lciBNaW51dGUnXSxcbiAgICAgICAgICAgIGg6IFsnZWluZSBTdHVuZGUnLCAnZWluZXIgU3R1bmRlJ10sXG4gICAgICAgICAgICBkOiBbJ2VpbiBUYWcnLCAnZWluZW0gVGFnJ10sXG4gICAgICAgICAgICBkZDogW251bWJlciArICcgVGFnZScsIG51bWJlciArICcgVGFnZW4nXSxcbiAgICAgICAgICAgIHc6IFsnZWluZSBXb2NoZScsICdlaW5lciBXb2NoZSddLFxuICAgICAgICAgICAgTTogWydlaW4gTW9uYXQnLCAnZWluZW0gTW9uYXQnXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyBNb25hdGUnLCBudW1iZXIgKyAnIE1vbmF0ZW4nXSxcbiAgICAgICAgICAgIHk6IFsnZWluIEphaHInLCAnZWluZW0gSmFociddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIEphaHJlJywgbnVtYmVyICsgJyBKYWhyZW4nXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBkZUNoID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZGUtY2gnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcl9GZWJydWFyX03DpHJ6X0FwcmlsX01haV9KdW5pX0p1bGlfQXVndXN0X1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0RlemVtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKYW4uX0ZlYi5fTcOkcnpfQXByLl9NYWlfSnVuaV9KdWxpX0F1Zy5fU2VwLl9Pa3QuX05vdi5fRGV6Licuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnU29ubnRhZ19Nb250YWdfRGllbnN0YWdfTWl0dHdvY2hfRG9ubmVyc3RhZ19GcmVpdGFnX1NhbXN0YWcnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaGV1dGUgdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vcmdlbiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tnZXN0ZXJuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tsZXR6dGVuXSBkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICd2b3IgJXMnLFxuICAgICAgICAgICAgczogJ2VpbiBwYWFyIFNla3VuZGVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgU2VrdW5kZW4nLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiAnJWQgTWludXRlbicsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6ICclZCBTdHVuZGVuJyxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHc6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3dzogJyVkIFdvY2hlbicsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVDaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHZXJtYW4gW2RlXVxuLy8hIGF1dGhvciA6IGxsdWNocyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sbHVjaHNcbi8vISBhdXRob3I6IE1lbmVsaW9uIEVsZW5zw7psZTogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcbi8vISBhdXRob3IgOiBNaWtvbGFqIERhZGVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWswMWFqXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbTogWydlaW5lIE1pbnV0ZScsICdlaW5lciBNaW51dGUnXSxcbiAgICAgICAgICAgIGg6IFsnZWluZSBTdHVuZGUnLCAnZWluZXIgU3R1bmRlJ10sXG4gICAgICAgICAgICBkOiBbJ2VpbiBUYWcnLCAnZWluZW0gVGFnJ10sXG4gICAgICAgICAgICBkZDogW251bWJlciArICcgVGFnZScsIG51bWJlciArICcgVGFnZW4nXSxcbiAgICAgICAgICAgIHc6IFsnZWluZSBXb2NoZScsICdlaW5lciBXb2NoZSddLFxuICAgICAgICAgICAgTTogWydlaW4gTW9uYXQnLCAnZWluZW0gTW9uYXQnXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyBNb25hdGUnLCBudW1iZXIgKyAnIE1vbmF0ZW4nXSxcbiAgICAgICAgICAgIHk6IFsnZWluIEphaHInLCAnZWluZW0gSmFociddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIEphaHJlJywgbnVtYmVyICsgJyBKYWhyZW4nXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBkZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2RlJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJfRmVicnVhcl9Nw6Ryel9BcHJpbF9NYWlfSnVuaV9KdWxpX0F1Z3VzdF9TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXplbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnSmFuLl9GZWIuX03DpHJ6X0Fwci5fTWFpX0p1bmlfSnVsaV9BdWcuX1NlcC5fT2t0Ll9Ob3YuX0Rlei4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1Nvbm50YWdfTW9udGFnX0RpZW5zdGFnX01pdHR3b2NoX0Rvbm5lcnN0YWdfRnJlaXRhZ19TYW1zdGFnJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTby5fTW8uX0RpLl9NaS5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toZXV0ZSB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dlc3Rlcm4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2xldHp0ZW5dIGRkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzOiAnZWluIHBhYXIgU2VrdW5kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBTZWt1bmRlbicsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06ICclZCBNaW51dGVuJyxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgdzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHd3OiAnJWQgV29jaGVuJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWxkaXZpYW4gW2R2XVxuLy8hIGF1dGhvciA6IEphd2lzaCBIYW1lZWQgOiBodHRwczovL2dpdGh1Yi5jb20vamF3aXNoXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ96W3qzegt6q3ofept6D3qknLFxuICAgICAgICAgICAgJ96K3qzehN6w3oPeqt6H3qbeg96pJyxcbiAgICAgICAgICAgICfeid6n3oPeqN6X3qonLFxuICAgICAgICAgICAgJ96H3q3eld6w3oPeqd6N3qonLFxuICAgICAgICAgICAgJ96J3q0nLFxuICAgICAgICAgICAgJ96W3qvegt6wJyxcbiAgICAgICAgICAgICfelt6q3o3ept6H3qgnLFxuICAgICAgICAgICAgJ96H3q/ejt6m3pDesN6T3qonLFxuICAgICAgICAgICAgJ96Q3qzeld6w3pPerN6J3rDehN6m3oPeqicsXG4gICAgICAgICAgICAn3ofert6G3rDek96v3oTept6D3qonLFxuICAgICAgICAgICAgJ96C3q7eiN6s3onesN6E3qbeg96qJyxcbiAgICAgICAgICAgICfekd6o3pDerN6J3rDehN6m3oPeqicsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzID0gW1xuICAgICAgICAgICAgJ96H3qfei96o3ofesN6M3qYnLFxuICAgICAgICAgICAgJ96A3q/eid6mJyxcbiAgICAgICAgICAgICfeh96m3oLesN6O3qfeg96mJyxcbiAgICAgICAgICAgICfehN6q3ovepicsXG4gICAgICAgICAgICAn3oTeqt6D3qfekN6w3orept6M3qgnLFxuICAgICAgICAgICAgJ96A3qreht6q3oPeqicsXG4gICAgICAgICAgICAn3oDert6C3qjegN6o3oPeqicsXG4gICAgICAgIF07XG5cbiAgICB2YXIgZHYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkdicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogd2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiAn3ofep96L3qhf3oDer96J3qZf3ofept6C3rBf3oTeqt6L3qZf3oTeqt6D3qdf3oDeqt6G3qpf3oDert6C3qgnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL96J3oZ83oneii8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfeid6KJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfeid6GJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfeid6KJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb3oneqN6H3qbei96qXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW96J3qfei96m3onep10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb3ofeqN6H3rDelN6sXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1veit6n3ofeqN6M3qreiN6oXSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn3ozerN6D3q3ejt6m3ofeqCAlcycsXG4gICAgICAgICAgICBwYXN0OiAn3obeqt6D3qjegt6wICVzJyxcbiAgICAgICAgICAgIHM6ICfekN6o3obeqt6C3rDejN6q3obert6F3qzeh96wJyxcbiAgICAgICAgICAgIHNzOiAnZCUg3pDeqN6G3qregt6w3ozeqicsXG4gICAgICAgICAgICBtOiAn3oneqN6C3qjek96s3ofesCcsXG4gICAgICAgICAgICBtbTogJ96J3qjegt6o3pPeqiAlZCcsXG4gICAgICAgICAgICBoOiAn3o7ept6R3qjeh96o3oPerN6H3rAnLFxuICAgICAgICAgICAgaGg6ICfejt6m3pHeqN6H3qjeg96qICVkJyxcbiAgICAgICAgICAgIGQ6ICfei96q3ojept6A3qzeh96wJyxcbiAgICAgICAgICAgIGRkOiAn3oveqt6I3qbekN6wICVkJyxcbiAgICAgICAgICAgIE06ICfeid6m3oDerN6H3rAnLFxuICAgICAgICAgICAgTU06ICfeid6m3pDesCAlZCcsXG4gICAgICAgICAgICB5OiAn3ofept6A3qbeg96s3ofesCcsXG4gICAgICAgICAgICB5eTogJ96H3qbegN6m3oPeqiAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA3LCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZHY7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR3JlZWsgW2VsXVxuLy8hIGF1dGhvciA6IEFnZ2Vsb3MgS2FyYWxpYXMgOiBodHRwczovL2dpdGh1Yi5jb20vbWVoaWVsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodHlwZW9mIEZ1bmN0aW9uICE9PSAndW5kZWZpbmVkJyAmJiBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBlbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VsJywge1xuICAgICAgICBtb250aHNOb21pbmF0aXZlRWw6XG4gICAgICAgICAgICAnzpnOsc69zr/Phc6sz4HOuc6/z4JfzqbOtc6yz4HOv8+FzqzPgc65zr/Pgl/OnM6sz4HPhM65zr/Pgl/Okc+Az4HOr867zrnOv8+CX86czqzOuc6/z4JfzpnOv8+Nzr3Ouc6/z4JfzpnOv8+NzrvOuc6/z4JfzpHPjc6zzr/Phc+Dz4TOv8+CX86jzrXPgM+Ezq3OvM6yz4HOuc6/z4Jfzp/Ous+Ez47Oss+BzrnOv8+CX86dzr/Orc68zrLPgc65zr/Pgl/OlM61zrrOrc68zrLPgc65zr/Pgicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNHZW5pdGl2ZUVsOlxuICAgICAgICAgICAgJ86ZzrHOvc6/z4XOsc+Bzq/Ov8+FX86mzrXOss+Bzr/Phc6xz4HOr86/z4VfzpzOsc+Bz4TOr86/z4VfzpHPgM+BzrnOu86vzr/PhV/OnM6xzpDOv8+FX86Zzr/Phc69zq/Ov8+FX86Zzr/Phc67zq/Ov8+FX86Rz4XOs86/z43Pg8+Ezr/PhV/Oo861z4DPhM61zrzOss+Bzq/Ov8+FX86fzrrPhM+JzrLPgc6vzr/PhV/Onc6/zrXOvM6yz4HOr86/z4VfzpTOtc66zrXOvM6yz4HOr86/z4UnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzOiBmdW5jdGlvbiAobW9tZW50VG9Gb3JtYXQsIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtb21lbnRUb0Zvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNOb21pbmF0aXZlRWw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgL0QvLnRlc3QoZm9ybWF0LnN1YnN0cmluZygwLCBmb3JtYXQuaW5kZXhPZignTU1NTScpKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgZGF5IG51bWJlciBiZWZvcmUgJ01NTU0nXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc0dlbml0aXZlRWxbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNOb21pbmF0aXZlRWxbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnzpnOsc69X86mzrXOsl/OnM6xz4FfzpHPgM+BX86czrHPil/Omc6/z4XOvV/Omc6/z4XOu1/Okc+FzrNfzqPOtc+AX86fzrrPhF/Onc6/zrVfzpTOtc66Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ86az4XPgc65zrHOus6uX86UzrXPhc+Ezq3Pgc6xX86kz4HOr8+EzrdfzqTOtc+EzqzPgc+EzrdfzqDOrc68z4DPhM63X86gzrHPgc6xz4POus61z4XOrl/Oo86szrLOss6xz4TOvycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ86az4XPgV/OlM61z4VfzqTPgc65X86kzrXPhF/OoM61zrxfzqDOsc+BX86jzrHOsicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfOms+FX86UzrVfzqTPgV/OpM61X86gzrVfzqDOsV/Oo86xJy5zcGxpdCgnXycpLFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ868zrwnIDogJ86czpwnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfPgM68JyA6ICfOoM6cJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gKGlucHV0ICsgJycpLnRvTG93ZXJDYXNlKClbMF0gPT09ICfOvCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9bzqDOnF1cXC4/zpw/XFwuPy9pLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhckVsOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW86jzq7OvM61z4HOsSB7fV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vOkc+Nz4HOuc6/IHt9XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3t9XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW86nzrjOtc+CIHt9XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vPhM6/IM+Az4HOv863zrPOv8+NzrzOtc69zr9dIGRkZGQgW3t9XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vPhM63zr0gz4DPgc6/zrfOs86/z43OvM61zr3Ot10gZGRkZCBbe31dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IGZ1bmN0aW9uIChrZXksIG1vbSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX2NhbGVuZGFyRWxba2V5XSxcbiAgICAgICAgICAgICAgICBob3VycyA9IG1vbSAmJiBtb20uaG91cnMoKTtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKG91dHB1dCkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQuYXBwbHkobW9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQucmVwbGFjZSgne30nLCBob3VycyAlIDEyID09PSAxID8gJ8+Dz4TOtycgOiAnz4PPhM65z4InKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfPg861ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDPgM+BzrnOvScsXG4gICAgICAgICAgICBzOiAnzrvOr86zzrEgzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xJyxcbiAgICAgICAgICAgIHNzOiAnJWQgzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xJyxcbiAgICAgICAgICAgIG06ICfOrc69zrEgzrvOtc+Az4TPjCcsXG4gICAgICAgICAgICBtbTogJyVkIM67zrXPgM+EzqwnLFxuICAgICAgICAgICAgaDogJ868zq/OsSDPjs+BzrEnLFxuICAgICAgICAgICAgaGg6ICclZCDPjs+BzrXPgicsXG4gICAgICAgICAgICBkOiAnzrzOr86xIM68zq3Pgc6xJyxcbiAgICAgICAgICAgIGRkOiAnJWQgzrzOrc+BzrXPgicsXG4gICAgICAgICAgICBNOiAnzq3Ovc6xz4IgzrzOrs69zrHPgicsXG4gICAgICAgICAgICBNTTogJyVkIM68zq7Ovc61z4InLFxuICAgICAgICAgICAgeTogJ86tzr3Osc+CIM+Hz4HPjM69zr/PgicsXG4gICAgICAgICAgICB5eTogJyVkIM+Hz4HPjM69zrnOsScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfc63LyxcbiAgICAgICAgb3JkaW5hbDogJyVkzrcnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0c3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoQXVzdHJhbGlhKSBbZW4tYXVdXG4vLyEgYXV0aG9yIDogSmFyZWQgTW9yc2UgOiBodHRwczovL2dpdGh1Yi5jb20vamFyY29hbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuQXUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1hdScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5BdTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChDYW5hZGEpIFtlbi1jYV1cbi8vISBhdXRob3IgOiBKb25hdGhhbiBBYm91cmJpaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb25iY2FcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbkNhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4tY2EnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbkNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKFVuaXRlZCBLaW5nZG9tKSBbZW4tZ2JdXG4vLyEgYXV0aG9yIDogQ2hyaXMgR2VkcmltIDogaHR0cHM6Ly9naXRodWIuY29tL2NocmlzZ2VkcmltXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5HYiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWdiJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuR2I7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoSXJlbGFuZCkgW2VuLWllXVxuLy8hIGF1dGhvciA6IENocmlzIENhcnRsaWRnZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc2NhcnRsaWRnZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuSWUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1pZScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuSWU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoSXNyYWVsKSBbZW4taWxdXG4vLyEgYXV0aG9yIDogQ2hyaXMgR2VkcmltIDogaHR0cHM6Ly9naXRodWIuY29tL2NocmlzZ2VkcmltXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5JbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWlsJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbklsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKEluZGlhKSBbZW4taW5dXG4vLyEgYXV0aG9yIDogSmF0aW4gQWdyYXdhbCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYXRpbmFnMjJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbkluID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4taW4nLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuSW47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoTmV3IFplYWxhbmQpIFtlbi1uel1cbi8vISBhdXRob3IgOiBMdWtlIE1jR3JlZ29yIDogaHR0cHM6Ly9naXRodWIuY29tL2x1a2VtY2dyZWdvclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuTnogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1ueicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5OejtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChTaW5nYXBvcmUpIFtlbi1zZ11cbi8vISBhdXRob3IgOiBNYXR0aGV3IENhc3RyaWxsb24tTWFkcmlnYWwgOiBodHRwczovL2dpdGh1Yi5jb20vdGVjaGRpbWVuc2lvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuU2cgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1zZycsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlblNnO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVzcGVyYW50byBbZW9dXG4vLyEgYXV0aG9yIDogQ29saW4gRGVhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jb2xpbmRlYW5cbi8vISBhdXRob3IgOiBNaWEgTm9yZGVudG9mdCBJbXBlcmF0b3JpIDogaHR0cHM6Ly9naXRodWIuY29tL21pZXN0YXNtaWFcbi8vISBjb21tZW50IDogbWllc3Rhc21pYSBjb3JyZWN0ZWQgdGhlIHRyYW5zbGF0aW9uIGJ5IGNvbGluZGVhblxuLy8hIGNvbW1lbnQgOiBWaXZha3ZvIGNvcnJlY3RlZCB0aGUgdHJhbnNsYXRpb24gYnkgY29saW5kZWFuIGFuZCBtaWVzdGFzbWlhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbycsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyb19mZWJydWFyb19tYXJ0b19hcHJpbG9fbWFqb19qdW5pb19qdWxpb19hxa1ndXN0b19zZXB0ZW1icm9fb2t0b2Jyb19ub3ZlbWJyb19kZWNlbWJybycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcnRfYXByX21hal9qdW5fanVsX2HFrWdfc2VwdF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdkaW1hbsSJb19sdW5kb19tYXJkb19tZXJrcmVkb1/EtWHFrWRvX3ZlbmRyZWRvX3NhYmF0bycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RpbV9sdW5fbWFyZF9tZXJrX8S1YcWtX3Zlbl9zYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGlfbHVfbWFfbWVfxLVhX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1tsYV0gRFstYW4gZGVdIE1NTU0sIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnW2xhXSBEWy1hbiBkZV0gTU1NTSwgWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZFtuXSwgW2xhXSBEWy1hbiBkZV0gTU1NTSwgWVlZWSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBbbGFdIERbLWFuIGRlXSBNTU0sIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvW2FwXVxcLnRcXC5tL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpID09PSAncCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAncC50Lm0uJyA6ICdQLlQuTS4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdhLnQubS4nIDogJ0EuVC5NLic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hvZGlhxa0gamVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbTW9yZ2HFrSBqZV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkW24gamVdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSGllcmHFrSBqZV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbcGFzaW50YW5dIGRkZGRbbiBqZV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdwb3N0ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdhbnRhxa0gJXMnLFxuICAgICAgICAgICAgczogJ2tlbGthaiBzZWt1bmRvaicsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZG9qJyxcbiAgICAgICAgICAgIG06ICd1bnUgbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvaicsXG4gICAgICAgICAgICBoOiAndW51IGhvcm8nLFxuICAgICAgICAgICAgaGg6ICclZCBob3JvaicsXG4gICAgICAgICAgICBkOiAndW51IHRhZ28nLCAvL25lICdkaXVybm8nLCDEiWFyIGVzdGFzIHV6aXRhIHBvciBwcm9rc2ltdW1vXG4gICAgICAgICAgICBkZDogJyVkIHRhZ29qJyxcbiAgICAgICAgICAgIE06ICd1bnUgbW9uYXRvJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9uYXRvaicsXG4gICAgICAgICAgICB5OiAndW51IGphcm8nLFxuICAgICAgICAgICAgeXk6ICclZCBqYXJvaicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfWEvLFxuICAgICAgICBvcmRpbmFsOiAnJWRhJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNwYW5pc2ggKERvbWluaWNhbiBSZXB1YmxpYykgW2VzLWRvXVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0RG90ID1cbiAgICAgICAgICAgICdlbmUuX2ZlYi5fbWFyLl9hYnIuX21heS5fanVuLl9qdWwuX2Fnby5fc2VwLl9vY3QuX25vdi5fZGljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdlbmVfZmViX21hcl9hYnJfbWF5X2p1bl9qdWxfYWdvX3NlcF9vY3Rfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmVuZS9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9ebWFyL2ksXG4gICAgICAgICAgICAvXmFici9pLFxuICAgICAgICAgICAgL15tYXkvaSxcbiAgICAgICAgICAgIC9eanVuL2ksXG4gICAgICAgICAgICAvXmp1bC9pLFxuICAgICAgICAgICAgL15hZ28vaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9jdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGljL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmV8ZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2k7XG5cbiAgICB2YXIgZXNEbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzLWRvJywge1xuICAgICAgICBtb250aHM6ICdlbmVyb19mZWJyZXJvX21hcnpvX2FicmlsX21heW9fanVuaW9fanVsaW9fYWdvc3RvX3NlcHRpZW1icmVfb2N0dWJyZV9ub3ZpZW1icmVfZGljaWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3RbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnZG9taW5nb19sdW5lc19tYXJ0ZXNfbWnDqXJjb2xlc19qdWV2ZXNfdmllcm5lc19zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tLl9sdW4uX21hci5fbWnDqS5fanVlLl92aWUuX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21pX2p1X3ZpX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7FhbmEgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F5ZXIgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tlbF0gZGRkZCBbcGFzYWRvIGEgbGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaGFjZSAlcycsXG4gICAgICAgICAgICBzOiAndW5vcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bmEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgdzogJ3VuYSBzZW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1hbmFzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYcOxbycsXG4gICAgICAgICAgICB5eTogJyVkIGHDsW9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlc0RvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNwYW5pc2ggKE1leGljbykgW2VzLW14XVxuLy8hIGF1dGhvciA6IEpDIEZyYW5jbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qY2ZyYW5jb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0RG90ID1cbiAgICAgICAgICAgICdlbmUuX2ZlYi5fbWFyLl9hYnIuX21heS5fanVuLl9qdWwuX2Fnby5fc2VwLl9vY3QuX25vdi5fZGljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdlbmVfZmViX21hcl9hYnJfbWF5X2p1bl9qdWxfYWdvX3NlcF9vY3Rfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmVuZS9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9ebWFyL2ksXG4gICAgICAgICAgICAvXmFici9pLFxuICAgICAgICAgICAgL15tYXkvaSxcbiAgICAgICAgICAgIC9eanVuL2ksXG4gICAgICAgICAgICAvXmp1bC9pLFxuICAgICAgICAgICAgL15hZ28vaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9jdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGljL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmV8ZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2k7XG5cbiAgICB2YXIgZXNNeCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzLW14Jywge1xuICAgICAgICBtb250aHM6ICdlbmVyb19mZWJyZXJvX21hcnpvX2FicmlsX21heW9fanVuaW9fanVsaW9fYWdvc3RvX3NlcHRpZW1icmVfb2N0dWJyZV9ub3ZpZW1icmVfZGljaWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3RbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnZG9taW5nb19sdW5lc19tYXJ0ZXNfbWnDqXJjb2xlc19qdWV2ZXNfdmllcm5lc19zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tLl9sdW4uX21hci5fbWnDqS5fanVlLl92aWUuX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21pX2p1X3ZpX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3kgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxYW5hIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1theWVyIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbZWxdIGRkZGQgW3Bhc2FkbyBhIGxhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2hhY2UgJXMnLFxuICAgICAgICAgICAgczogJ3Vub3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIHc6ICd1bmEgc2VtYW5hJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYW5hcycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGHDsW8nLFxuICAgICAgICAgICAgeXk6ICclZCBhw7FvcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgICAgIGludmFsaWREYXRlOiAnRmVjaGEgaW52w6FsaWRhJyxcbiAgICB9KTtcblxuICAgIHJldHVybiBlc014O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNwYW5pc2ggKFVuaXRlZCBTdGF0ZXMpIFtlcy11c11cbi8vISBhdXRob3IgOiBidXN0dGEgOiBodHRwczovL2dpdGh1Yi5jb20vYnVzdHRhXG4vLyEgYXV0aG9yIDogY2hyaXNyb2R6IDogaHR0cHM6Ly9naXRodWIuY29tL2Nocmlzcm9kelxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0RG90ID1cbiAgICAgICAgICAgICdlbmUuX2ZlYi5fbWFyLl9hYnIuX21heS5fanVuLl9qdWwuX2Fnby5fc2VwLl9vY3QuX25vdi5fZGljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdlbmVfZmViX21hcl9hYnJfbWF5X2p1bl9qdWxfYWdvX3NlcF9vY3Rfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmVuZS9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9ebWFyL2ksXG4gICAgICAgICAgICAvXmFici9pLFxuICAgICAgICAgICAgL15tYXkvaSxcbiAgICAgICAgICAgIC9eanVuL2ksXG4gICAgICAgICAgICAvXmp1bC9pLFxuICAgICAgICAgICAgL15hZ28vaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9jdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGljL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmV8ZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2k7XG5cbiAgICB2YXIgZXNVcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzLXVzJywge1xuICAgICAgICBtb250aHM6ICdlbmVyb19mZWJyZXJvX21hcnpvX2FicmlsX21heW9fanVuaW9fanVsaW9fYWdvc3RvX3NlcHRpZW1icmVfb2N0dWJyZV9ub3ZpZW1icmVfZGljaWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3RbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnZG9taW5nb19sdW5lc19tYXJ0ZXNfbWnDqXJjb2xlc19qdWV2ZXNfdmllcm5lc19zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tLl9sdW4uX21hci5fbWnDqS5fanVlLl92aWUuX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21pX2p1X3ZpX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7FhbmEgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F5ZXIgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tlbF0gZGRkZCBbcGFzYWRvIGEgbGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaGFjZSAlcycsXG4gICAgICAgICAgICBzOiAndW5vcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bmEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgdzogJ3VuYSBzZW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1hbmFzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYcOxbycsXG4gICAgICAgICAgICB5eTogJyVkIGHDsW9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlc1VzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNwYW5pc2ggW2VzXVxuLy8hIGF1dGhvciA6IEp1bGlvIE5hcHVyw60gOiBodHRwczovL2dpdGh1Yi5jb20vanVsaW9uY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0RG90ID1cbiAgICAgICAgICAgICdlbmUuX2ZlYi5fbWFyLl9hYnIuX21heS5fanVuLl9qdWwuX2Fnby5fc2VwLl9vY3QuX25vdi5fZGljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdlbmVfZmViX21hcl9hYnJfbWF5X2p1bl9qdWxfYWdvX3NlcF9vY3Rfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmVuZS9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9ebWFyL2ksXG4gICAgICAgICAgICAvXmFici9pLFxuICAgICAgICAgICAgL15tYXkvaSxcbiAgICAgICAgICAgIC9eanVuL2ksXG4gICAgICAgICAgICAvXmp1bC9pLFxuICAgICAgICAgICAgL15hZ28vaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9jdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGljL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmV8ZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2k7XG5cbiAgICB2YXIgZXMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlcycsIHtcbiAgICAgICAgbW9udGhzOiAnZW5lcm9fZmVicmVyb19tYXJ6b19hYnJpbF9tYXlvX2p1bmlvX2p1bGlvX2Fnb3N0b19zZXB0aWVtYnJlX29jdHVicmVfbm92aWVtYnJlX2RpY2llbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90W20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWluZ29fbHVuZXNfbWFydGVzX21pw6lyY29sZXNfanVldmVzX3ZpZXJuZXNfc8OhYmFkbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbS5fbHVuLl9tYXIuX21pw6kuX2p1ZS5fdmllLl9zw6FiLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9taV9qdV92aV9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG95IGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDsWFuYSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW2EgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYXllciBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNhZG8gYSBsYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdoYWNlICVzJyxcbiAgICAgICAgICAgIHM6ICd1bm9zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkw61hcycsXG4gICAgICAgICAgICB3OiAndW5hIHNlbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFuYXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhw7FvJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYcOxb3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgICAgICBpbnZhbGlkRGF0ZTogJ0ZlY2hhIGludsOhbGlkYScsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRXN0b25pYW4gW2V0XVxuLy8hIGF1dGhvciA6IEhlbnJ5IEtlaGxtYW5uIDogaHR0cHM6Ly9naXRodWIuY29tL21hZGhlbnJ5XG4vLyEgaW1wcm92ZW1lbnRzIDogSWxsaW1hciBUYW1iZWsgOiBodHRwczovL2dpdGh1Yi5jb20vcmFndWxrYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHM6IFsnbcO1bmUgc2VrdW5kaScsICdtw7VuaSBzZWt1bmQnLCAncGFhciBzZWt1bmRpdCddLFxuICAgICAgICAgICAgc3M6IFtudW1iZXIgKyAnc2VrdW5kaScsIG51bWJlciArICdzZWt1bmRpdCddLFxuICAgICAgICAgICAgbTogWyfDvGhlIG1pbnV0aScsICfDvGtzIG1pbnV0J10sXG4gICAgICAgICAgICBtbTogW251bWJlciArICcgbWludXRpJywgbnVtYmVyICsgJyBtaW51dGl0J10sXG4gICAgICAgICAgICBoOiBbJ8O8aGUgdHVubmknLCAndHVuZCBhZWdhJywgJ8O8a3MgdHVuZCddLFxuICAgICAgICAgICAgaGg6IFtudW1iZXIgKyAnIHR1bm5pJywgbnVtYmVyICsgJyB0dW5kaSddLFxuICAgICAgICAgICAgZDogWyfDvGhlIHDDpGV2YScsICfDvGtzIHDDpGV2J10sXG4gICAgICAgICAgICBNOiBbJ2t1dSBhamEnLCAna3V1IGFlZ2EnLCAnw7xrcyBrdXUnXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyBrdXUnLCBudW1iZXIgKyAnIGt1dWQnXSxcbiAgICAgICAgICAgIHk6IFsnw7xoZSBhYXN0YScsICdhYXN0YScsICfDvGtzIGFhc3RhJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgYWFzdGEnLCBudW1iZXIgKyAnIGFhc3RhdCddLFxuICAgICAgICB9O1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFtrZXldWzJdID8gZm9ybWF0W2tleV1bMl0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBldCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2V0Jywge1xuICAgICAgICBtb250aHM6ICdqYWFudWFyX3ZlZWJydWFyX23DpHJ0c19hcHJpbGxfbWFpX2p1dW5pX2p1dWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b29iZXJfbm92ZW1iZXJfZGV0c2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYWFuX3ZlZWJyX23DpHJ0c19hcHJfbWFpX2p1dW5pX2p1dWxpX2F1Z19zZXB0X29rdF9ub3ZfZGV0cycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAncMO8aGFww6Rldl9lc21hc3DDpGV2X3RlaXNpcMOkZXZfa29sbWFww6Rldl9uZWxqYXDDpGV2X3JlZWRlX2xhdXDDpGV2Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdQX0VfVF9LX05fUl9MJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1BfRV9UX0tfTl9SX0wnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUw6RuYSxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbSG9tbWUsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tKw6RyZ21pbmVdIGRkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tFaWxlLF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbRWVsbWluZV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHDDpHJhc3QnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHRhZ2FzaScsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6ICclZCBww6RldmEnLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGV0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJhc3F1ZSBbZXVdXG4vLyEgYXV0aG9yIDogRW5la28gSWxsYXJyYW1lbmRpIDogaHR0cHM6Ly9naXRodWIuY29tL2VpbGxhcnJhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZXUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdldScsIHtcbiAgICAgICAgbW9udGhzOiAndXJ0YXJyaWxhX290c2FpbGFfbWFydHhvYV9hcGlyaWxhX21haWF0emFfZWthaW5hX3V6dGFpbGFfYWJ1enR1YV9pcmFpbGFfdXJyaWFfYXphcm9hX2FiZW5kdWEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ3VydC5fb3RzLl9tYXIuX2FwaS5fbWFpLl9la2EuX3V6dC5fYWJ1Ll9pcmEuX3Vyci5fYXphLl9hYmUuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ2lnYW5kZWFfYXN0ZWxlaGVuYV9hc3RlYXJ0ZWFfYXN0ZWF6a2VuYV9vc3RlZ3VuYV9vc3RpcmFsYV9sYXJ1bmJhdGEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2lnLl9hbC5fYXIuX2F6Ll9vZy5fb2wuX2xyLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdpZ19hbF9hcl9hel9vZ19vbF9scicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVlba29dIE1NTU1bcmVuXSBEW2FdJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVlba29dIE1NTU1bcmVuXSBEW2FdIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBZWVlZW2tvXSBNTU1NW3Jlbl0gRFthXSBISDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS1NLUQnLFxuICAgICAgICAgICAgbGw6ICdZWVlZW2tvXSBNTU0gRFthXScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZW2tvXSBNTU0gRFthXSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBZWVlZW2tvXSBNTU0gRFthXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2dhdXJdIExUW2V0YW5dJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbYmloYXJdIExUW2V0YW5dJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVFtldGFuXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2F0em9dIExUW2V0YW5dJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2F1cnJla29dIGRkZGQgTFRbZXRhbl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBiYXJydScsXG4gICAgICAgICAgICBwYXN0OiAnZHVlbGEgJXMnLFxuICAgICAgICAgICAgczogJ3NlZ3VuZG8gYmF0enVrJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kbycsXG4gICAgICAgICAgICBtOiAnbWludXR1IGJhdCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dScsXG4gICAgICAgICAgICBoOiAnb3JkdSBiYXQnLFxuICAgICAgICAgICAgaGg6ICclZCBvcmR1JyxcbiAgICAgICAgICAgIGQ6ICdlZ3VuIGJhdCcsXG4gICAgICAgICAgICBkZDogJyVkIGVndW4nLFxuICAgICAgICAgICAgTTogJ2hpbGFiZXRlIGJhdCcsXG4gICAgICAgICAgICBNTTogJyVkIGhpbGFiZXRlJyxcbiAgICAgICAgICAgIHk6ICd1cnRlIGJhdCcsXG4gICAgICAgICAgICB5eTogJyVkIHVydGUnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGV1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFBlcnNpYW4gW2ZhXVxuLy8hIGF1dGhvciA6IEVicmFoaW0gQnlhZ293aSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9lYnJhbWluaW9cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn27EnLFxuICAgICAgICAgICAgMjogJ9uyJyxcbiAgICAgICAgICAgIDM6ICfbsycsXG4gICAgICAgICAgICA0OiAn27QnLFxuICAgICAgICAgICAgNTogJ9u1JyxcbiAgICAgICAgICAgIDY6ICfbticsXG4gICAgICAgICAgICA3OiAn27cnLFxuICAgICAgICAgICAgODogJ9u4JyxcbiAgICAgICAgICAgIDk6ICfbuScsXG4gICAgICAgICAgICAwOiAn27AnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn27EnOiAnMScsXG4gICAgICAgICAgICAn27InOiAnMicsXG4gICAgICAgICAgICAn27MnOiAnMycsXG4gICAgICAgICAgICAn27QnOiAnNCcsXG4gICAgICAgICAgICAn27UnOiAnNScsXG4gICAgICAgICAgICAn27YnOiAnNicsXG4gICAgICAgICAgICAn27cnOiAnNycsXG4gICAgICAgICAgICAn27gnOiAnOCcsXG4gICAgICAgICAgICAn27knOiAnOScsXG4gICAgICAgICAgICAn27AnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgZmEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmYScsIHtcbiAgICAgICAgbW9udGhzOiAn2pjYp9mG2YjbjNmHX9mB2YjYsduM2Ydf2YXYp9ix2LNf2KLZiNix24zZhF/ZhdmHX9qY2YjYptmGX9qY2YjYptuM2Ydf2KfZiNiqX9iz2b7Yqtin2YXYqNixX9in2qnYqtio2LFf2YbZiNin2YXYqNixX9iv2LPYp9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2pjYp9mG2YjbjNmHX9mB2YjYsduM2Ydf2YXYp9ix2LNf2KLZiNix24zZhF/ZhdmHX9qY2YjYptmGX9qY2YjYptuM2Ydf2KfZiNiqX9iz2b7Yqtin2YXYqNixX9in2qnYqtio2LFf2YbZiNin2YXYqNixX9iv2LPYp9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfbjNqpXFx1MjAwY9i02YbYqNmHX9iv2YjYtNmG2KjZh1/Ys9mHXFx1MjAwY9i02YbYqNmHX9qG2YfYp9ix2LTZhtio2Ydf2b7ZhtisXFx1MjAwY9i02YbYqNmHX9is2YXYudmHX9i02YbYqNmHJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6XG4gICAgICAgICAgICAn24zaqVxcdTIwMGPYtNmG2KjZh1/Yr9mI2LTZhtio2Ydf2LPZh1xcdTIwMGPYtNmG2KjZh1/ahtmH2KfYsdi02YbYqNmHX9m+2YbYrFxcdTIwMGPYtNmG2KjZh1/YrNmF2LnZh1/YtNmG2KjZhycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9uMX9ivX9izX9qGX9m+X9isX9i0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9mC2KjZhCDYp9iyINi42YfYsXzYqNi52K8g2KfYsiDYuNmH2LEvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAv2KjYudivINin2LIg2LjZh9ixLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mC2KjZhCDYp9iyINi42YfYsSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2KjYudivINin2LIg2LjZh9ixJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhdix2YjYsiDYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vZgdix2K/YpyDYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYr9uM2LHZiNiyINiz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9m+24zYtF0gW9iz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9iv2LEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzINm+24zYtCcsXG4gICAgICAgICAgICBzOiAn2obZhtivINir2KfZhtuM2YcnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbbjNmHJyxcbiAgICAgICAgICAgIG06ICfbjNqpINiv2YLbjNmC2YcnLFxuICAgICAgICAgICAgbW06ICclZCDYr9mC24zZgtmHJyxcbiAgICAgICAgICAgIGg6ICfbjNqpINiz2KfYudiqJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KonLFxuICAgICAgICAgICAgZDogJ9uM2qkg2LHZiNiyJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2LHZiNiyJyxcbiAgICAgICAgICAgIE06ICfbjNqpINmF2KfZhycsXG4gICAgICAgICAgICBNTTogJyVkINmF2KfZhycsXG4gICAgICAgICAgICB5OiAn24zaqSDYs9in2YQnLFxuICAgICAgICAgICAgeXk6ICclZCDYs9in2YQnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b27At27ldL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ92YUvLFxuICAgICAgICBvcmRpbmFsOiAnJWTZhScsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRmlubmlzaCBbZmldXG4vLyEgYXV0aG9yIDogVGFybW8gQWlkYW50YXVzdGEgOiBodHRwczovL2dpdGh1Yi5jb20vYmxlYWRvZlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG51bWJlcnNQYXN0ID1cbiAgICAgICAgICAgICdub2xsYSB5a3NpIGtha3NpIGtvbG1lIG5lbGrDpCB2aWlzaSBrdXVzaSBzZWl0c2Vtw6RuIGthaGRla3NhbiB5aGRla3PDpG4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICcgJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbnVtYmVyc0Z1dHVyZSA9IFtcbiAgICAgICAgICAgICdub2xsYScsXG4gICAgICAgICAgICAneWhkZW4nLFxuICAgICAgICAgICAgJ2thaGRlbicsXG4gICAgICAgICAgICAna29sbWVuJyxcbiAgICAgICAgICAgICduZWxqw6RuJyxcbiAgICAgICAgICAgICd2aWlkZW4nLFxuICAgICAgICAgICAgJ2t1dWRlbicsXG4gICAgICAgICAgICBudW1iZXJzUGFzdFs3XSxcbiAgICAgICAgICAgIG51bWJlcnNQYXN0WzhdLFxuICAgICAgICAgICAgbnVtYmVyc1Bhc3RbOV0sXG4gICAgICAgIF07XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAnbXV1dGFtYW4gc2VrdW5uaW4nIDogJ211dXRhbWEgc2VrdW50aSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAnc2VrdW5uaW4nIDogJ3Nla3VudGlhJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdtaW51dXRpbicgOiAnbWludXV0dGknO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ21pbnV1dGluJyA6ICdtaW51dXR0aWEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ3R1bm5pbicgOiAndHVudGknO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ3R1bm5pbicgOiAndHVudGlhJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdww6RpdsOkbicgOiAncMOkaXbDpCc7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAncMOkaXbDpG4nIDogJ3DDpGl2w6TDpCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAna3V1a2F1ZGVuJyA6ICdrdXVrYXVzaSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAna3V1a2F1ZGVuJyA6ICdrdXVrYXV0dGEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ3Z1b2RlbicgOiAndnVvc2knO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ3Z1b2RlbicgOiAndnVvdHRhJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB2ZXJiYWxOdW1iZXIobnVtYmVyLCBpc0Z1dHVyZSkgKyAnICcgKyByZXN1bHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZlcmJhbE51bWJlcihudW1iZXIsIGlzRnV0dXJlKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIgPCAxMFxuICAgICAgICAgICAgPyBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgID8gbnVtYmVyc0Z1dHVyZVtudW1iZXJdXG4gICAgICAgICAgICAgICAgOiBudW1iZXJzUGFzdFtudW1iZXJdXG4gICAgICAgICAgICA6IG51bWJlcjtcbiAgICB9XG5cbiAgICB2YXIgZmkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmaScsIHtcbiAgICAgICAgbW9udGhzOiAndGFtbWlrdXVfaGVsbWlrdXVfbWFhbGlza3V1X2h1aHRpa3V1X3RvdWtva3V1X2tlc8Oka3V1X2hlaW7DpGt1dV9lbG9rdXVfc3l5c2t1dV9sb2tha3V1X21hcnJhc2t1dV9qb3VsdWt1dScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAndGFtbWlfaGVsbWlfbWFhbGlzX2h1aHRpX3RvdWtvX2tlc8OkX2hlaW7DpF9lbG9fc3l5c19sb2thX21hcnJhc19qb3VsdScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdzdW5udW50YWlfbWFhbmFudGFpX3RpaXN0YWlfa2Vza2l2aWlra29fdG9yc3RhaV9wZXJqYW50YWlfbGF1YW50YWknLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3N1X21hX3RpX2tlX3RvX3BlX2xhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3N1X21hX3RpX2tlX3RvX3BlX2xhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0RvIE1NTU1bdGFdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRG8gTU1NTVt0YV0gWVlZWSwgW2tsb10gSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIERvIE1NTU1bdGFdIFlZWVksIFtrbG9dIEhILm1tJyxcbiAgICAgICAgICAgIGw6ICdELk0uWVlZWScsXG4gICAgICAgICAgICBsbDogJ0RvIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIGxsbDogJ0RvIE1NTSBZWVlZLCBba2xvXSBISC5tbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEbyBNTU0gWVlZWSwgW2tsb10gSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1t0w6Ruw6TDpG5dIFtrbG9dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbaHVvbWVubmFdIFtrbG9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBba2xvXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2VpbGVuXSBba2xvXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1t2aWltZV0gZGRkZFtuYV0gW2tsb10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBww6TDpHN0w6QnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHNpdHRlbicsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRmlsaXBpbm8gW2ZpbF1cbi8vISBhdXRob3IgOiBEYW4gSGFnbWFuIDogaHR0cHM6Ly9naXRodWIuY29tL2hhZ21hbmRhblxuLy8hIGF1dGhvciA6IE1hdHRoZXcgQ28gOiBodHRwczovL2dpdGh1Yi5jb20vbWF0dGhld2RlZWNvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZmlsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZmlsJywge1xuICAgICAgICBtb250aHM6ICdFbmVyb19QZWJyZXJvX01hcnNvX0FicmlsX01heW9fSHVueW9fSHVseW9fQWdvc3RvX1NldHllbWJyZV9Pa3R1YnJlX05vYnllbWJyZV9EaXN5ZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnRW5lX1BlYl9NYXJfQWJyX01heV9IdW5fSHVsX0Fnb19TZXRfT2t0X05vYl9EaXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnTGluZ2dvX0x1bmVzX01hcnRlc19NaXllcmt1bGVzX0h1d2ViZXNfQml5ZXJuZXNfU2FiYWRvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnTGluX0x1bl9NYXJfTWl5X0h1d19CaXlfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0xpX0x1X01hX01pX0h1X0JpX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ01NL0QvWVlZWScsXG4gICAgICAgICAgICBMTDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIEQsIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gREQsIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ0xUIFtuZ2F5b25nIGFyYXddJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQnVrYXMgbmddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnTFQgW3NhIHN1c3Vub2QgbmFdIGRkZGQnLFxuICAgICAgICAgICAgbGFzdERheTogJ0xUIFtrYWhhcG9uXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ0xUIFtub29uZyBuYWthcmFhbmddIGRkZGQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdzYSBsb29iIG5nICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhbmcgbmFrYWxpcGFzJyxcbiAgICAgICAgICAgIHM6ICdpbGFuZyBzZWd1bmRvJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kbycsXG4gICAgICAgICAgICBtOiAnaXNhbmcgbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvJyxcbiAgICAgICAgICAgIGg6ICdpc2FuZyBvcmFzJyxcbiAgICAgICAgICAgIGhoOiAnJWQgb3JhcycsXG4gICAgICAgICAgICBkOiAnaXNhbmcgYXJhdycsXG4gICAgICAgICAgICBkZDogJyVkIGFyYXcnLFxuICAgICAgICAgICAgTTogJ2lzYW5nIGJ1d2FuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgYnV3YW4nLFxuICAgICAgICAgICAgeTogJ2lzYW5nIHRhb24nLFxuICAgICAgICAgICAgeXk6ICclZCB0YW9uJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGYXJvZXNlIFtmb11cbi8vISBhdXRob3IgOiBSYWduYXIgSm9oYW5uZXNlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYWduYXIxMjNcbi8vISBhdXRob3IgOiBLcmlzdGlhbiBTYWthcmlzc29uIDogaHR0cHM6Ly9naXRodWIuY29tL3Nha2FyaXNzb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBmbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZvJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJzX2FwcsOtbF9tYWlfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWFpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnc3VubnVkYWd1cl9tw6FuYWRhZ3VyX3TDvXNkYWd1cl9taWt1ZGFndXJfaMOzc2RhZ3VyX2Zyw61nZ2phZGFndXJfbGV5Z2FyZGFndXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3N1bl9tw6FuX3TDvXNfbWlrX2jDs3NfZnLDrV9sZXknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc3VfbcOhX3TDvV9taV9ow7NfZnJfbGUnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSwgWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW8ONIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbw40gbW9yZ2luIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbw40gZ2rDoXIga2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tzw63DsHN0dV0gZGRkZCBba2xdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAndW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHPDrcOwYW5pJyxcbiAgICAgICAgICAgIHM6ICdmw6Egc2VrdW5kJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kaXInLFxuICAgICAgICAgICAgbTogJ2VpbiBtaW51dHR1cicsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dGlyJyxcbiAgICAgICAgICAgIGg6ICdlaW4gdMOtbWknLFxuICAgICAgICAgICAgaGg6ICclZCB0w61tYXInLFxuICAgICAgICAgICAgZDogJ2VpbiBkYWd1cicsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2FyJyxcbiAgICAgICAgICAgIE06ICdlaW4gbcOhbmHDsHVyJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOhbmHDsGlyJyxcbiAgICAgICAgICAgIHk6ICdlaXR0IMOhcicsXG4gICAgICAgICAgICB5eTogJyVkIMOhcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZm87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRnJlbmNoIChDYW5hZGEpIFtmci1jYV1cbi8vISBhdXRob3IgOiBKb25hdGhhbiBBYm91cmJpaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb25iY2FcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBmckNhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnItY2EnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnZpZXJfZsOpdnJpZXJfbWFyc19hdnJpbF9tYWlfanVpbl9qdWlsbGV0X2Fvw7t0X3NlcHRlbWJyZV9vY3RvYnJlX25vdmVtYnJlX2TDqWNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFudi5fZsOpdnIuX21hcnNfYXZyLl9tYWlfanVpbl9qdWlsLl9hb8O7dF9zZXB0Ll9vY3QuX25vdi5fZMOpYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdkaW1hbmNoZV9sdW5kaV9tYXJkaV9tZXJjcmVkaV9qZXVkaV92ZW5kcmVkaV9zYW1lZGknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkaW0uX2x1bi5fbWFyLl9tZXIuX2pldS5fdmVuLl9zYW0uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RpX2x1X21hX21lX2plX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tBdWpvdXJk4oCZaHVpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0RlbWFpbiDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2Rlcm5pZXIgw6BdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFucyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaWwgeSBhICVzJyxcbiAgICAgICAgICAgIHM6ICdxdWVscXVlcyBzZWNvbmRlcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGVzJyxcbiAgICAgICAgICAgIG06ICd1bmUgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAndW5lIGhldXJlJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaGV1cmVzJyxcbiAgICAgICAgICAgIGQ6ICd1biBqb3VyJyxcbiAgICAgICAgICAgIGRkOiAnJWQgam91cnMnLFxuICAgICAgICAgICAgTTogJ3VuIG1vaXMnLFxuICAgICAgICAgICAgTU06ICclZCBtb2lzJyxcbiAgICAgICAgICAgIHk6ICd1biBhbicsXG4gICAgICAgICAgICB5eTogJyVkIGFucycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcnxlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIG1hc2N1bGluZSBncmFtbWF0aWNhbCBnZW5kZXI6IG1vaXMsIHRyaW1lc3RyZSwgam91clxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJ2UnKTtcblxuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggZmVtaW5pbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBzZW1haW5lXG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ3JlJyA6ICdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnJDYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGcmVuY2ggKFN3aXR6ZXJsYW5kKSBbZnItY2hdXG4vLyEgYXV0aG9yIDogR2FzcGFyZCBCdWNoZXIgOiBodHRwczovL2dpdGh1Yi5jb20vZ2FzcGFyZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGZyQ2ggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmci1jaCcsIHtcbiAgICAgICAgbW9udGhzOiAnamFudmllcl9mw6l2cmllcl9tYXJzX2F2cmlsX21haV9qdWluX2p1aWxsZXRfYW/Du3Rfc2VwdGVtYnJlX29jdG9icmVfbm92ZW1icmVfZMOpY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW52Ll9mw6l2ci5fbWFyc19hdnIuX21haV9qdWluX2p1aWwuX2Fvw7t0X3NlcHQuX29jdC5fbm92Ll9kw6ljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWFuY2hlX2x1bmRpX21hcmRpX21lcmNyZWRpX2pldWRpX3ZlbmRyZWRpX3NhbWVkaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RpbS5fbHVuLl9tYXIuX21lci5famV1Ll92ZW4uX3NhbS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGlfbHVfbWFfbWVfamVfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0F1am91cmTigJlodWkgw6BdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRGVtYWluIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8OgXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0hpZXIgw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZGVybmllciDDoF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYW5zICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdpbCB5IGEgJXMnLFxuICAgICAgICAgICAgczogJ3F1ZWxxdWVzIHNlY29uZGVzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kZXMnLFxuICAgICAgICAgICAgbTogJ3VuZSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICd1bmUgaGV1cmUnLFxuICAgICAgICAgICAgaGg6ICclZCBoZXVyZXMnLFxuICAgICAgICAgICAgZDogJ3VuIGpvdXInLFxuICAgICAgICAgICAgZGQ6ICclZCBqb3VycycsXG4gICAgICAgICAgICBNOiAndW4gbW9pcycsXG4gICAgICAgICAgICBNTTogJyVkIG1vaXMnLFxuICAgICAgICAgICAgeTogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGVyfGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggbWFzY3VsaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogbW9pcywgdHJpbWVzdHJlLCBqb3VyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdlcicgOiAnZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBmZW1pbmluZSBncmFtbWF0aWNhbCBnZW5kZXI6IHNlbWFpbmVcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAncmUnIDogJ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZyQ2g7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRnJlbmNoIFtmcl1cbi8vISBhdXRob3IgOiBKb2huIEZpc2NoZXIgOiBodHRwczovL2dpdGh1Yi5jb20vamZyb2ZmaWNlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU3RyaWN0UmVnZXggPVxuICAgICAgICAgICAgL14oamFudmllcnxmw6l2cmllcnxtYXJzfGF2cmlsfG1haXxqdWlufGp1aWxsZXR8YW/Du3R8c2VwdGVtYnJlfG9jdG9icmV8bm92ZW1icmV8ZMOpY2VtYnJlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4ID1cbiAgICAgICAgICAgIC8oamFudlxcLj98ZsOpdnJcXC4/fG1hcnN8YXZyXFwuP3xtYWl8anVpbnxqdWlsXFwuP3xhb8O7dHxzZXB0XFwuP3xvY3RcXC4/fG5vdlxcLj98ZMOpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC8oamFudlxcLj98ZsOpdnJcXC4/fG1hcnN8YXZyXFwuP3xtYWl8anVpbnxqdWlsXFwuP3xhb8O7dHxzZXB0XFwuP3xvY3RcXC4/fG5vdlxcLj98ZMOpY1xcLj98amFudmllcnxmw6l2cmllcnxtYXJzfGF2cmlsfG1haXxqdWlufGp1aWxsZXR8YW/Du3R8c2VwdGVtYnJlfG9jdG9icmV8bm92ZW1icmV8ZMOpY2VtYnJlKS9pLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eamFudi9pLFxuICAgICAgICAgICAgL15mw6l2ci9pLFxuICAgICAgICAgICAgL15tYXJzL2ksXG4gICAgICAgICAgICAvXmF2ci9pLFxuICAgICAgICAgICAgL15tYWkvaSxcbiAgICAgICAgICAgIC9eanVpbi9pLFxuICAgICAgICAgICAgL15qdWlsL2ksXG4gICAgICAgICAgICAvXmFvw7t0L2ksXG4gICAgICAgICAgICAvXnNlcHQvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kw6ljL2ksXG4gICAgICAgIF07XG5cbiAgICB2YXIgZnIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmcicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudmllcl9mw6l2cmllcl9tYXJzX2F2cmlsX21haV9qdWluX2p1aWxsZXRfYW/Du3Rfc2VwdGVtYnJlX29jdG9icmVfbm92ZW1icmVfZMOpY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW52Ll9mw6l2ci5fbWFyc19hdnIuX21haV9qdWluX2p1aWwuX2Fvw7t0X3NlcHQuX29jdC5fbm92Ll9kw6ljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDogbW9udGhzU3RyaWN0UmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6IG1vbnRoc1Nob3J0U3RyaWN0UmVnZXgsXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnZGltYW5jaGVfbHVuZGlfbWFyZGlfbWVyY3JlZGlfamV1ZGlfdmVuZHJlZGlfc2FtZWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGltLl9sdW4uX21hci5fbWVyLl9qZXUuX3Zlbi5fc2FtLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkaV9sdV9tYV9tZV9qZV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQXVqb3VyZOKAmWh1aSDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEZW1haW4gw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSGllciDDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtkZXJuaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbnMgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2lsIHkgYSAlcycsXG4gICAgICAgICAgICBzOiAncXVlbHF1ZXMgc2Vjb25kZXMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlcycsXG4gICAgICAgICAgICBtOiAndW5lIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ3VuZSBoZXVyZScsXG4gICAgICAgICAgICBoaDogJyVkIGhldXJlcycsXG4gICAgICAgICAgICBkOiAndW4gam91cicsXG4gICAgICAgICAgICBkZDogJyVkIGpvdXJzJyxcbiAgICAgICAgICAgIHc6ICd1bmUgc2VtYWluZScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFpbmVzJyxcbiAgICAgICAgICAgIE06ICd1biBtb2lzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9pcycsXG4gICAgICAgICAgICB5OiAndW4gYW4nLFxuICAgICAgICAgICAgeXk6ICclZCBhbnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZXJ8KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXR1cm4gJ2UnIHdoZW4gZGF5IG9mIG1vbnRoID4gMS4gTW92ZSB0aGlzIGNhc2UgaW5zaWRlXG4gICAgICAgICAgICAgICAgLy8gYmxvY2sgZm9yIG1hc2N1bGluZSB3b3JkcyBiZWxvdy5cbiAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzMzNzVcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJycpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBtYXNjdWxpbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBtb2lzLCB0cmltZXN0cmUsIGpvdXJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ2VyJyA6ICdlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIGZlbWluaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogc2VtYWluZVxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdyZScgOiAnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRnJpc2lhbiBbZnldXG4vLyEgYXV0aG9yIDogUm9iaW4gdmFuIGRlciBWbGlldCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JpbjB2YW4wZGVyMHZcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydFdpdGhEb3RzID1cbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbXJ0Ll9hcHIuX21haV9qdW4uX2p1bC5fYXVnLl9zZXAuX29rdC5fbm92Ll9kZXMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydFdpdGhvdXREb3RzID1cbiAgICAgICAgICAgICdqYW5fZmViX21ydF9hcHJfbWFpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2Rlcycuc3BsaXQoJ18nKTtcblxuICAgIHZhciBmeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2Z5Jywge1xuICAgICAgICBtb250aHM6ICdqYW5uZXdhcmlzX2ZlYnJld2FyaXNfbWFhcnRfYXByaWxfbWFhaWVfanVueV9qdWx5X2F1Z3VzdHVzX3NlcHRpbWJlcl9va3RvYmVyX25vdmltYmVyX2Rlc2ltYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aG91dERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdzbmVpbl9tb2FuZGVpX3RpaXNkZWlfd29hbnNkZWlfdG9uZ2Vyc2RlaV9mcmVlZF9zbmVvbicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3NpLl9tby5fdGkuX3dvLl90by5fZnIuX3NvLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTaV9Nb19UaV9Xb19Ub19Gcl9Tbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaGpvZWQgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9hcm4gb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbanVzdGVyIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vDtGZyw7tuZV0gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb2VyICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBseW4nLFxuICAgICAgICAgICAgczogJ2luIHBlYXIgc2Vrb25kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWtvbmRlbicsXG4gICAgICAgICAgICBtOiAnaWVuIG1pbsO6dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZW4nLFxuICAgICAgICAgICAgaDogJ2llbiBvZXJlJyxcbiAgICAgICAgICAgIGhoOiAnJWQgb2VyZW4nLFxuICAgICAgICAgICAgZDogJ2llbiBkZWknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlbicsXG4gICAgICAgICAgICBNOiAnaWVuIG1vYW5uZScsXG4gICAgICAgICAgICBNTTogJyVkIG1vYW5uZW4nLFxuICAgICAgICAgICAgeTogJ2llbiBqaWVyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgamllcnJlbicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdGV8ZGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBudW1iZXIgK1xuICAgICAgICAgICAgICAgIChudW1iZXIgPT09IDEgfHwgbnVtYmVyID09PSA4IHx8IG51bWJlciA+PSAyMCA/ICdzdGUnIDogJ2RlJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmeTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBJcmlzaCBvciBJcmlzaCBHYWVsaWMgW2dhXVxuLy8hIGF1dGhvciA6IEFuZHLDqSBTaWx2YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hc2twdFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IFtcbiAgICAgICAgICAgICdFYW7DoWlyJyxcbiAgICAgICAgICAgICdGZWFiaHJhJyxcbiAgICAgICAgICAgICdNw6FydGEnLFxuICAgICAgICAgICAgJ0FpYnJlw6FuJyxcbiAgICAgICAgICAgICdCZWFsdGFpbmUnLFxuICAgICAgICAgICAgJ01laXRoZWFtaCcsXG4gICAgICAgICAgICAnScO6aWwnLFxuICAgICAgICAgICAgJ0zDum5hc2EnLFxuICAgICAgICAgICAgJ01lw6FuIEbDs21oYWlyJyxcbiAgICAgICAgICAgICdEZWlyZWFkaCBGw7NtaGFpcicsXG4gICAgICAgICAgICAnU2FtaGFpbicsXG4gICAgICAgICAgICAnTm9sbGFpZycsXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gW1xuICAgICAgICAgICAgJ0VhbicsXG4gICAgICAgICAgICAnRmVhYmgnLFxuICAgICAgICAgICAgJ03DoXJ0JyxcbiAgICAgICAgICAgICdBaWInLFxuICAgICAgICAgICAgJ0JlYWwnLFxuICAgICAgICAgICAgJ01laXRoJyxcbiAgICAgICAgICAgICdJw7ppbCcsXG4gICAgICAgICAgICAnTMO6bicsXG4gICAgICAgICAgICAnTS5GLicsXG4gICAgICAgICAgICAnRC5GLicsXG4gICAgICAgICAgICAnU2FtaCcsXG4gICAgICAgICAgICAnTm9sbCcsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzID0gW1xuICAgICAgICAgICAgJ0TDqSBEb21obmFpZ2gnLFxuICAgICAgICAgICAgJ0TDqSBMdWFpbicsXG4gICAgICAgICAgICAnRMOpIE3DoWlydCcsXG4gICAgICAgICAgICAnRMOpIEPDqWFkYW9pbicsXG4gICAgICAgICAgICAnRMOpYXJkYW9pbicsXG4gICAgICAgICAgICAnRMOpIGhBb2luZScsXG4gICAgICAgICAgICAnRMOpIFNhdGhhaXJuJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA9IFsnRG9taCcsICdMdWFuJywgJ03DoWlydCcsICdDw6lhZCcsICdEw6lhcicsICdBb2luZScsICdTYXRoJ10sXG4gICAgICAgIHdlZWtkYXlzTWluID0gWydEbycsICdMdScsICdNw6EnLCAnQ8OpJywgJ0TDqScsICdBJywgJ1NhJ107XG5cbiAgICB2YXIgZ2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnYScsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHNTaG9ydCxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6IHdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiB3ZWVrZGF5c1Nob3J0LFxuICAgICAgICB3ZWVrZGF5c01pbjogd2Vla2RheXNNaW4sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSW5uaXUgYWddIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQW3DoXJhY2ggYWddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYWddIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSW5uw6kgYWddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbc2VvIGNhaXRlXSBbYWddIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgw7Mgc2hpbicsXG4gICAgICAgICAgICBzOiAnY8O6cGxhIHNvaWNpbmQnLFxuICAgICAgICAgICAgc3M6ICclZCBzb2ljaW5kJyxcbiAgICAgICAgICAgIG06ICduw7NpbcOpYWQnLFxuICAgICAgICAgICAgbW06ICclZCBuw7NpbcOpYWQnLFxuICAgICAgICAgICAgaDogJ3VhaXIgYW4gY2hsb2lnJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdWFpciBhbiBjaGxvaWcnLFxuICAgICAgICAgICAgZDogJ2zDoScsXG4gICAgICAgICAgICBkZDogJyVkIGzDoScsXG4gICAgICAgICAgICBNOiAnbcOtJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOtb25uYScsXG4gICAgICAgICAgICB5OiAnYmxpYWluJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYmxpYWluJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGR8bmF8bWgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IG51bWJlciA9PT0gMSA/ICdkJyA6IG51bWJlciAlIDEwID09PSAyID8gJ25hJyA6ICdtaCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ2E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2NvdHRpc2ggR2FlbGljIFtnZF1cbi8vISBhdXRob3IgOiBKb24gQXNoZG93biA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb25hc2hkb3duXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ0FtIEZhb2lsbGVhY2gnLFxuICAgICAgICAgICAgJ0FuIEdlYXJyYW4nLFxuICAgICAgICAgICAgJ0FtIE3DoHJ0JyxcbiAgICAgICAgICAgICdBbiBHaWJsZWFuJyxcbiAgICAgICAgICAgICdBbiBDw6hpdGVhbicsXG4gICAgICAgICAgICAnQW4gdC3DkmdtaGlvcycsXG4gICAgICAgICAgICAnQW4gdC1JdWNoYXInLFxuICAgICAgICAgICAgJ0FuIEzDuW5hc3RhbCcsXG4gICAgICAgICAgICAnQW4gdC1TdWx0YWluJyxcbiAgICAgICAgICAgICdBbiBEw6BtaGFpcicsXG4gICAgICAgICAgICAnQW4gdC1TYW1oYWluJyxcbiAgICAgICAgICAgICdBbiBEw7liaGxhY2hkJyxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSBbXG4gICAgICAgICAgICAnRmFvaScsXG4gICAgICAgICAgICAnR2VhcicsXG4gICAgICAgICAgICAnTcOgcnQnLFxuICAgICAgICAgICAgJ0dpYmwnLFxuICAgICAgICAgICAgJ0PDqGl0JyxcbiAgICAgICAgICAgICfDkmdtaCcsXG4gICAgICAgICAgICAnSXVjaCcsXG4gICAgICAgICAgICAnTMO5bicsXG4gICAgICAgICAgICAnU3VsdCcsXG4gICAgICAgICAgICAnRMOgbWgnLFxuICAgICAgICAgICAgJ1NhbWgnLFxuICAgICAgICAgICAgJ0TDuWJoJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXMgPSBbXG4gICAgICAgICAgICAnRGlkw7JtaG5haWNoJyxcbiAgICAgICAgICAgICdEaWx1YWluJyxcbiAgICAgICAgICAgICdEaW3DoGlydCcsXG4gICAgICAgICAgICAnRGljaWFkYWluJyxcbiAgICAgICAgICAgICdEaWFyZGFvaW4nLFxuICAgICAgICAgICAgJ0RpaGFvaW5lJyxcbiAgICAgICAgICAgICdEaXNhdGhhaXJuZScsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgPSBbJ0RpZCcsICdEaWwnLCAnRGltJywgJ0RpYycsICdEaWEnLCAnRGloJywgJ0RpcyddLFxuICAgICAgICB3ZWVrZGF5c01pbiA9IFsnRMOyJywgJ0x1JywgJ03DoCcsICdDaScsICdBcicsICdIYScsICdTYSddO1xuXG4gICAgdmFyIGdkID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ2QnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogd2Vla2RheXNTaG9ydCxcbiAgICAgICAgd2Vla2RheXNNaW46IHdlZWtkYXlzTWluLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0FuLWRpdWdoIGFpZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBLW3DoGlyZWFjaCBhaWddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYWlnXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0FuLWTDqCBhaWddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbc2VvIGNoYWlkaF0gW2FpZ10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdhbm4gYW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2JobyBjaGlvbm4gJXMnLFxuICAgICAgICAgICAgczogJ2JlYWdhbiBkaW9nYW4nLFxuICAgICAgICAgICAgc3M6ICclZCBkaW9nYW4nLFxuICAgICAgICAgICAgbTogJ21pb25haWQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW9uYWlkZWFuJyxcbiAgICAgICAgICAgIGg6ICd1YWlyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdWFpcmVhbicsXG4gICAgICAgICAgICBkOiAnbGF0aGEnLFxuICAgICAgICAgICAgZGQ6ICclZCBsYXRoYScsXG4gICAgICAgICAgICBNOiAnbcOsb3MnLFxuICAgICAgICAgICAgTU06ICclZCBtw6xvc2FuJyxcbiAgICAgICAgICAgIHk6ICdibGlhZGhuYScsXG4gICAgICAgICAgICB5eTogJyVkIGJsaWFkaG5hJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGR8bmF8bWgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IG51bWJlciA9PT0gMSA/ICdkJyA6IG51bWJlciAlIDEwID09PSAyID8gJ25hJyA6ICdtaCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ2Q7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR2FsaWNpYW4gW2dsXVxuLy8hIGF1dGhvciA6IEp1YW4gRy4gSHVydGFkbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qdWFuZ2h1cnRhZG9cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBnbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2dsJywge1xuICAgICAgICBtb250aHM6ICd4YW5laXJvX2ZlYnJlaXJvX21hcnpvX2FicmlsX21haW9feHXDsW9feHVsbG9fYWdvc3RvX3NldGVtYnJvX291dHVicm9fbm92ZW1icm9fZGVjZW1icm8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ3hhbi5fZmViLl9tYXIuX2Fici5fbWFpLl94dcOxLl94dWwuX2Fnby5fc2V0Ll9vdXQuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWluZ29fbHVuc19tYXJ0ZXNfbcOpcmNvcmVzX3hvdmVzX3ZlbnJlc19zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tLl9sdW4uX21hci5fbcOpci5feG92Ll92ZW4uX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX23DqV94b192ZV9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG94ZSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICfDoXMnIDogJ8OhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7HDoSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICfDoXMnIDogJ8OhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgWycgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ8OhcycgOiAnYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tvbnRlICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ8OhJyA6ICdhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW29dIGRkZGQgW3Bhc2FkbyAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICfDoXMnIDogJ2EnKSArICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ3VuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICduJyArIHN0cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlbiAnICsgc3RyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3Q6ICdoYWkgJXMnLFxuICAgICAgICAgICAgczogJ3VucyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bmhhIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYW5vJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5vcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ2w7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS29ua2FuaSBEZXZhbmFnYXJpIHNjcmlwdCBbZ29tLWRldmFdXG4vLyEgYXV0aG9yIDogVGhlIERpc2NvdmVyZXIgOiBodHRwczovL2dpdGh1Yi5jb20vV2lraURpc2NvdmVyZXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzOiBbJ+CkpeCli+CkoeCkr+CkviDgpLjgpYXgpJXgpILgpKHgpL7gpILgpKjgpYAnLCAn4KSl4KWL4KSh4KWHIOCkuOClheCkleCkguCkoSddLFxuICAgICAgICAgICAgc3M6IFtudW1iZXIgKyAnIOCkuOClheCkleCkguCkoeCkvuCkguCkqOClgCcsIG51bWJlciArICcg4KS44KWF4KSV4KSC4KShJ10sXG4gICAgICAgICAgICBtOiBbJ+Ckj+CkleCkviDgpK7gpL/gpKPgpJ/gpL7gpKgnLCAn4KSP4KSVIOCkruCkv+CkqOClguCknyddLFxuICAgICAgICAgICAgbW06IFtudW1iZXIgKyAnIOCkruCkv+Cko+Ckn+CkvuCkguCkqOClgCcsIG51bWJlciArICcg4KSu4KS/4KSj4KSf4KS+4KSCJ10sXG4gICAgICAgICAgICBoOiBbJ+Ckj+CkleCkviDgpLXgpLDgpL7gpKgnLCAn4KSP4KSVIOCkteCksCddLFxuICAgICAgICAgICAgaGg6IFtudW1iZXIgKyAnIOCkteCksOCkvuCkguCkqOClgCcsIG51bWJlciArICcg4KS14KSw4KS+4KSCJ10sXG4gICAgICAgICAgICBkOiBbJ+Ckj+CkleCkviDgpKbgpL/gpLjgpL7gpKgnLCAn4KSP4KSVIOCkpuClgOCkuCddLFxuICAgICAgICAgICAgZGQ6IFtudW1iZXIgKyAnIOCkpuCkv+CkuOCkvuCkguCkqOClgCcsIG51bWJlciArICcg4KSm4KWA4KS4J10sXG4gICAgICAgICAgICBNOiBbJ+Ckj+CkleCkviDgpK7gpY3gpLngpK/gpKjgpY3gpK/gpL7gpKgnLCAn4KSP4KSVIOCkruCljeCkueCkr+CkqOCliyddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIOCkruCljeCkueCkr+CkqOCljeCkr+CkvuCkqOClgCcsIG51bWJlciArICcg4KSu4KWN4KS54KSv4KSo4KWHJ10sXG4gICAgICAgICAgICB5OiBbJ+Ckj+CkleCkviDgpLXgpLDgpY3gpLjgpL7gpKgnLCAn4KSP4KSVIOCkteCksOCljeCkuCddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIOCkteCksOCljeCkuOCkvuCkguCkqOClgCcsIG51bWJlciArICcg4KS14KSw4KWN4KS44KS+4KSCJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc0Z1dHVyZSA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGdvbURldmEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnb20tZGV2YScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfgpJzgpL7gpKjgpYfgpLXgpL7gpLDgpYBf4KSr4KWH4KSs4KWN4KSw4KWB4KS14KS+4KSw4KWAX+CkruCkvuCksOCljeCkml/gpI/gpKrgpY3gpLDgpYDgpLJf4KSu4KWHX+CknOClguCkqF/gpJzgpYHgpLLgpK9f4KSR4KSX4KS44KWN4KSfX+CkuOCkquCljeCkn+Clh+CkguCkrOCksF/gpJHgpJXgpY3gpJ/gpYvgpKzgpLBf4KSo4KWL4KS14KWN4KS54KWH4KSC4KSs4KSwX+CkoeCkv+CkuOClh+CkguCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6ICfgpJzgpL7gpKjgpYfgpLXgpL7gpLDgpYDgpJrgpY3gpK/gpL5f4KSr4KWH4KSs4KWN4KSw4KWB4KS14KS+4KSw4KWA4KSa4KWN4KSv4KS+X+CkruCkvuCksOCljeCkmuCkvuCkmuCljeCkr+Ckvl/gpI/gpKrgpY3gpLDgpYDgpLLgpL7gpJrgpY3gpK/gpL5f4KSu4KWH4KSv4KS+4KSa4KWN4KSv4KS+X+CknOClguCkqOCkvuCkmuCljeCkr+Ckvl/gpJzgpYHgpLLgpK/gpL7gpJrgpY3gpK/gpL5f4KSR4KSX4KS44KWN4KSf4KS+4KSa4KWN4KSv4KS+X+CkuOCkquCljeCkn+Clh+CkguCkrOCksOCkvuCkmuCljeCkr+Ckvl/gpJHgpJXgpY3gpJ/gpYvgpKzgpLDgpL7gpJrgpY3gpK/gpL5f4KSo4KWL4KS14KWN4KS54KWH4KSC4KSs4KSw4KS+4KSa4KWN4KSv4KS+X+CkoeCkv+CkuOClh+CkguCkrOCksOCkvuCkmuCljeCkr+Ckvicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9NTU1NKFxccykrRFtvRF0/LyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4KSc4KS+4KSo4KWHLl/gpKvgpYfgpKzgpY3gpLDgpYEuX+CkruCkvuCksOCljeCkml/gpI/gpKrgpY3gpLDgpYAuX+CkruClh1/gpJzgpYLgpKhf4KSc4KWB4KSyLl/gpJHgpJcuX+CkuOCkquCljeCkn+Clh+Ckgi5f4KSR4KSV4KWN4KSf4KWLLl/gpKjgpYvgpLXgpY3gpLngpYfgpIIuX+CkoeCkv+CkuOClh+Ckgi4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfgpIbgpK/gpKTgpL7gpLBf4KS44KWL4KSu4KS+4KSwX+CkruCkguCkl+Cks+CkvuCksF/gpKzgpYHgpKfgpLXgpL7gpLBf4KSs4KS/4KSw4KWH4KS44KWN4KSk4KS+4KSwX+CkuOClgeCkleCljeCksOCkvuCksF/gpLbgpYfgpKjgpLXgpL7gpLAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgpIbgpK/gpKQuX+CkuOCli+Ckri5f4KSu4KSC4KSX4KSzLl/gpKzgpYHgpKcuX+CkrOCljeCksOClh+CkuOCljeCkpC5f4KS44KWB4KSV4KWN4KSwLl/gpLbgpYfgpKguJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+Ckhl/gpLjgpYtf4KSu4KSCX+CkrOClgV/gpKzgpY3gpLDgpYdf4KS44KWBX+CktuClhycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0gW+CkteCkvuCknOCkpOCkvuCkgl0nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIFvgpLXgpL7gpJzgpKTgpL7gpIJdJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgQSBoOm1tIFvgpLXgpL7gpJzgpKTgpL7gpIJdJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIERvLCBZWVlZLCBBIGg6bW0gW+CkteCkvuCknOCkpOCkvuCkgl0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCwgRCBNTU0gWVlZWSwgQSBoOm1tIFvgpLXgpL7gpJzgpKTgpL7gpIJdJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KSG4KSv4KScXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+Ckq+CkvuCksuCljeCkr+CkvuCkgl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4KSr4KWB4KSh4KSy4KWLXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KSV4KS+4KSyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgpKvgpL7gpJ/gpLLgpYtdIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4KSG4KSm4KWA4KSCJyxcbiAgICAgICAgICAgIHM6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBzczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOCkteClh+CksCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIG9yZGluYWwgJ+CkteClh+CksCcgb25seSBhcHBsaWVzIHRvIGRheSBvZiB0aGUgbW9udGhcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfgpLXgpYfgpLAnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vla1xuICAgICAgICAgICAgZG95OiAzLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIgKDcgKyAwIC0gNClcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CksOCkvuCkpOClgHzgpLjgpJXgpL7gpLPgpYDgpIJ84KSm4KSo4KSq4KS+4KSw4KS+4KSCfOCkuOCkvuCkguCknOClhy8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpOClgCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkleCkvuCks+ClgOCkgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpKjgpKrgpL7gpLDgpL7gpIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPiAxMiA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KS44KS+4KSC4KSc4KWHJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOClgCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KSV4KS+4KSz4KWA4KSCJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKbgpKjgpKrgpL7gpLDgpL7gpIInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkvuCkguCknOClhyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSk4KWAJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBnb21EZXZhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEtvbmthbmkgTGF0aW4gc2NyaXB0IFtnb20tbGF0bl1cbi8vISBhdXRob3IgOiBUaGUgRGlzY292ZXJlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9XaWtpRGlzY292ZXJlclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHM6IFsndGhvZGRlYSBzZWtvbmRhbW5pJywgJ3Rob2RkZSBzZWtvbmQnXSxcbiAgICAgICAgICAgIHNzOiBbbnVtYmVyICsgJyBzZWtvbmRhbW5pJywgbnVtYmVyICsgJyBzZWtvbmQnXSxcbiAgICAgICAgICAgIG06IFsnZWthIG1pbnRhbicsICdlayBtaW51dCddLFxuICAgICAgICAgICAgbW06IFtudW1iZXIgKyAnIG1pbnRhbW5pJywgbnVtYmVyICsgJyBtaW50YW0nXSxcbiAgICAgICAgICAgIGg6IFsnZWthIHZvcmFuJywgJ2VrIHZvciddLFxuICAgICAgICAgICAgaGg6IFtudW1iZXIgKyAnIHZvcmFtbmknLCBudW1iZXIgKyAnIHZvcmFtJ10sXG4gICAgICAgICAgICBkOiBbJ2VrYSBkaXNhbicsICdlayBkaXMnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyBkaXNhbW5pJywgbnVtYmVyICsgJyBkaXMnXSxcbiAgICAgICAgICAgIE06IFsnZWthIG1ob2luZWFuJywgJ2VrIG1ob2lubyddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIG1ob2luZWFtbmknLCBudW1iZXIgKyAnIG1ob2luZSddLFxuICAgICAgICAgICAgeTogWydla2Egdm9yc2FuJywgJ2VrIHZvcm9zJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgdm9yc2FtbmknLCBudW1iZXIgKyAnIHZvcnNhbSddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBnb21MYXRuID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ29tLWxhdG4nLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnSmFuZXJfRmVicmVyX01hcnNfQWJyaWxfTWFpX0p1bl9KdWxhaV9BZ29zdF9TZXRlbWJyX090dWJyX05vdmVtYnJfRGV6ZW1icicuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6ICdKYW5lcmFjaGVhX0ZlYnJlcmFjaGVhX01hcnNhY2hlYV9BYnJpbGFjaGVhX01haWFjaGVhX0p1bmFjaGVhX0p1bGFpYWNoZWFfQWdvc3RhY2hlYV9TZXRlbWJyYWNoZWFfT3R1YnJhY2hlYV9Ob3ZlbWJyYWNoZWFfRGV6ZW1icmFjaGVhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL01NTU0oXFxzKStEW29EXT8vLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKYW4uX0ZlYi5fTWFyc19BYnIuX01haV9KdW5fSnVsLl9BZ28uX1NldC5fT3R1Ll9Ob3YuX0Rlei4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiBcIkFpdGFyX1NvbWFyX01vbmdsbGFyX0J1ZGh2YXJfQmlyZXN0YXJfU3VrcmFyX1Nvbid2YXJcIi5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQWl0Ll9Tb20uX01vbi5fQnVkLl9CcmUuX1N1ay5fU29uLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdBaV9TbV9Nb19CdV9Ccl9TdV9Tbicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0gW3ZhenRhXScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MgW3ZhenRhXScsXG4gICAgICAgICAgICBMOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEEgaDptbSBbdmF6dGFdJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIERvLCBZWVlZLCBBIGg6bW0gW3ZhenRhXScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEIE1NTSBZWVlZLCBBIGg6bW0gW3ZhenRhXScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0Fpel0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tGYWxlYW1dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW0Z1ZGRsb10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0thbF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbRmF0dGxvXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFkaW0nLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZXIpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRpbmFsICdlcicgb25seSBhcHBsaWVzIHRvIGRheSBvZiB0aGUgbW9udGhcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICdlcic7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrXG4gICAgICAgICAgICBkb3k6IDMsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhciAoNyArIDAgLSA0KVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvcmF0aXxzb2thbGxpbXxkb25wYXJhbXxzYW5qZS8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ3JhdGknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzb2thbGxpbScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdkb25wYXJhbScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+IDEyID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzYW5qZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyYXRpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzb2thbGxpbSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZG9ucGFyYW0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NhbmplJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyYXRpJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBnb21MYXRuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEd1amFyYXRpIFtndV1cbi8vISBhdXRob3IgOiBLYXVzaGlrIFRoYW5raSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9LYXVzaGlrMTk4N1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgq6cnLFxuICAgICAgICAgICAgMjogJ+CrqCcsXG4gICAgICAgICAgICAzOiAn4KupJyxcbiAgICAgICAgICAgIDQ6ICfgq6onLFxuICAgICAgICAgICAgNTogJ+CrqycsXG4gICAgICAgICAgICA2OiAn4KusJyxcbiAgICAgICAgICAgIDc6ICfgq60nLFxuICAgICAgICAgICAgODogJ+CrricsXG4gICAgICAgICAgICA5OiAn4KuvJyxcbiAgICAgICAgICAgIDA6ICfgq6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KunJzogJzEnLFxuICAgICAgICAgICAgJ+CrqCc6ICcyJyxcbiAgICAgICAgICAgICfgq6knOiAnMycsXG4gICAgICAgICAgICAn4KuqJzogJzQnLFxuICAgICAgICAgICAgJ+Crqyc6ICc1JyxcbiAgICAgICAgICAgICfgq6wnOiAnNicsXG4gICAgICAgICAgICAn4KutJzogJzcnLFxuICAgICAgICAgICAgJ+Crric6ICc4JyxcbiAgICAgICAgICAgICfgq68nOiAnOScsXG4gICAgICAgICAgICAn4KumJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGd1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ3UnLCB7XG4gICAgICAgIG1vbnRoczogJ+CqnOCqvuCqqOCrjeCqr+CrgeCqhuCqsOCrgF/gqqvgq4fgqqzgq43gqrDgq4HgqobgqrDgq4Bf4Kqu4Kq+4Kqw4KuN4KqaX+Cqj+CqquCrjeCqsOCqv+Cqsl/gqq7gq4df4Kqc4KuC4KqoX+CqnOCrgeCqsuCqvuCqiF/gqpHgqpfgqrjgq43gqp9f4Kq44Kqq4KuN4Kqf4KuH4Kqu4KuN4Kqs4KqwX+CqkeCqleCrjeCqn+CrjeCqrOCqsF/gqqjgqrXgq4fgqq7gq43gqqzgqrBf4Kqh4Kq/4Kq44KuH4Kqu4KuN4Kqs4KqwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgqpzgqr7gqqjgq43gqq/gq4EuX+Cqq+Crh+CqrOCrjeCqsOCrgS5f4Kqu4Kq+4Kqw4KuN4KqaX+Cqj+CqquCrjeCqsOCqvy5f4Kqu4KuHX+CqnOCrguCqqF/gqpzgq4HgqrLgqr4uX+CqkeCqly5f4Kq44Kqq4KuN4Kqf4KuHLl/gqpHgqpXgq43gqp/gq40uX+CqqOCqteCrhy5f4Kqh4Kq/4Kq44KuHLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+CqsOCqteCqv+CqteCqvuCqsF/gqrjgq4vgqq7gqrXgqr7gqrBf4Kqu4KqC4KqX4Kqz4Kq14Kq+4KqwX+CqrOCrgeCqp+CrjeCqteCqvuCqsF/gqpfgq4HgqrDgq4HgqrXgqr7gqrBf4Kq24KuB4KqV4KuN4Kqw4Kq14Kq+4KqwX+CqtuCqqOCqv+CqteCqvuCqsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CqsOCqteCqv1/gqrjgq4vgqq5f4Kqu4KqC4KqX4KqzX+CqrOCrgeCqp+CrjV/gqpfgq4HgqrDgq4Ff4Kq24KuB4KqV4KuN4KqwX+CqtuCqqOCqvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgqrBf4Kq44KuLX+CqruCqgl/gqqzgq4Ff4KqX4KuBX+CqtuCrgV/gqrYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgqrXgqr7gqpfgq43gqq/gq4cnLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCqteCqvuCql+CrjeCqr+CrhycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4Kq14Kq+4KqX4KuN4Kqv4KuHJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCqteCqvuCql+CrjeCqr+CrhycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CqhuCqnF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgqpXgqr7gqrLgq4ddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgqpfgqofgqpXgqr7gqrLgq4ddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CqquCqvuCqm+CqsuCqvl0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgqq7gqr4nLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCqquCqueCrh+CqsuCqvicsXG4gICAgICAgICAgICBzOiAn4KqF4Kqu4KuB4KqVIOCqquCqs+CriycsXG4gICAgICAgICAgICBzczogJyVkIOCquOCrh+CqleCqguCqoScsXG4gICAgICAgICAgICBtOiAn4KqP4KqVIOCqruCqv+CqqOCqv+CqnycsXG4gICAgICAgICAgICBtbTogJyVkIOCqruCqv+CqqOCqv+CqnycsXG4gICAgICAgICAgICBoOiAn4KqP4KqVIOCqleCqsuCqvuCqlScsXG4gICAgICAgICAgICBoaDogJyVkIOCqleCqsuCqvuCqlScsXG4gICAgICAgICAgICBkOiAn4KqP4KqVIOCqpuCqv+CqteCquCcsXG4gICAgICAgICAgICBkZDogJyVkIOCqpuCqv+CqteCquCcsXG4gICAgICAgICAgICBNOiAn4KqP4KqVIOCqruCqueCqv+CqqOCriycsXG4gICAgICAgICAgICBNTTogJyVkIOCqruCqueCqv+CqqOCriycsXG4gICAgICAgICAgICB5OiAn4KqP4KqVIOCqteCqsOCrjeCqtycsXG4gICAgICAgICAgICB5eTogJyVkIOCqteCqsOCrjeCqtycsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgq6fgq6jgq6ngq6rgq6vgq6zgq63gq67gq6/gq6ZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIEd1amFyYXRpIG5vdGF0aW9uIGZvciBtZXJpZGllbXMgYXJlIHF1aXRlIGZ1enp5IGluIHByYWN0aWNlLiBXaGlsZSB0aGVyZSBleGlzdHNcbiAgICAgICAgLy8gYSByaWdpZCBub3Rpb24gb2YgYSAnUGFoYXInIGl0IGlzIG5vdCB1c2VkIGFzIHJpZ2lkbHkgaW4gbW9kZXJuIEd1amFyYXRpLlxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Kqw4Kq+4KqkfOCqrOCqquCri+CqsHzgqrjgqrXgqr7gqrB84Kq44Kq+4KqC4KqcLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4Kqw4Kq+4KqkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kq44Kq14Kq+4KqwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CqrOCqquCri+CqsCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kq44Kq+4KqC4KqcJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CqsOCqvuCqpCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kq44Kq14Kq+4KqwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqqzgqqrgq4vgqrAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CquOCqvuCqguCqnCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kqw4Kq+4KqkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGd1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEhlYnJldyBbaGVdXG4vLyEgYXV0aG9yIDogVG9tZXIgQ29oZW4gOiBodHRwczovL2dpdGh1Yi5jb20vdG9tZXJcbi8vISBhdXRob3IgOiBNb3NoZSBTaW1hbnRvdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9EZXZlbG9wbWVudElMXG4vLyEgYXV0aG9yIDogVGFsIEF0ZXIgOiBodHRwczovL2dpdGh1Yi5jb20vVGFsQXRlclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGhlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaGUnLCB7XG4gICAgICAgIG1vbnRoczogJ9eZ16DXldeQ16hf16TXkdeo15XXkNeoX9ee16jXpV/XkNek16jXmdecX9ee15DXmV/XmdeV16DXmV/XmdeV15zXmV/XkNeV15LXldeh15hf16HXpNeY157XkdeoX9eQ15XXp9eY15XXkdeoX9eg15XXkdee15HXqF/Xk9em157XkdeoJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfXmdeg15XXs1/XpNeR16jXs1/Xnteo16Vf15DXpNeo17Nf157XkNeZX9eZ15XXoNeZX9eZ15XXnNeZX9eQ15XXktezX9eh16TXmNezX9eQ15XXp9ezX9eg15XXkdezX9eT16bXntezJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9eo15DXqdeV159f16nXoNeZX9ep15zXmdep15lf16jXkdeZ16LXmV/Xl9ee15nXqdeZX9ep15nXqdeZX9ep15HXqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9eQ17Nf15HXs1/XktezX9eT17Nf15TXs1/XldezX9ep17MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn15Bf15Ff15Jf15Nf15Rf15Vf16knLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBb15FdTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW9eRXU1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBb15FdTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBsbDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb15TXmdeV150g15HWvl1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9ee15fXqCDXkda+XUxUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb15HXqdei15RdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb15DXqtee15XXnCDXkda+XUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9eR15nXldedXSBkZGRkIFvXlNeQ15fXqNeV158g15HXqdei15RdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn15HXoteV15MgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9ec16TXoNeZICVzJyxcbiAgICAgICAgICAgIHM6ICfXnteh16TXqCDXqdeg15nXldeqJyxcbiAgICAgICAgICAgIHNzOiAnJWQg16nXoNeZ15XXqicsXG4gICAgICAgICAgICBtOiAn15PXp9eUJyxcbiAgICAgICAgICAgIG1tOiAnJWQg15PXp9eV16onLFxuICAgICAgICAgICAgaDogJ9ep16LXlCcsXG4gICAgICAgICAgICBoaDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfXqdei16rXmdeZ150nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXqdei15XXqic7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZDogJ9eZ15XXnScsXG4gICAgICAgICAgICBkZDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfXmdeV157XmdeZ150nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXmdee15nXnSc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgTTogJ9eX15XXk9epJyxcbiAgICAgICAgICAgIE1NOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9eX15XXk9ep15nXmdedJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg15fXldeT16nXmdedJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5OiAn16nXoNeUJyxcbiAgICAgICAgICAgIHl5OiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9ep16DXqteZ15nXnSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgJSAxMCA9PT0gMCAmJiBudW1iZXIgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16DXlCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16DXmdedJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6XG4gICAgICAgICAgICAv15DXl9eUXCLXpnzXnNek16DXlFwi16Z815DXl9eo15kg15TXpteU16jXmdeZ151815zXpNeg15kg15TXpteU16jXmdeZ151815zXpNeg15XXqiDXkdeV16fXqHzXkdeR15XXp9eofNeR16LXqNeRL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNeQ15fXlFwi16Z815DXl9eo15kg15TXpteU16jXmdeZ151815HXoteo15EpJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9ec16TXoNeV16og15HXlden16gnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9eR15HXlden16gnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfXnNek16DXlFwi16YnIDogJ9ec16TXoNeZINeU16bXlNeo15nXmdedJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAn15DXl9eUXCLXpicgOiAn15DXl9eo15kg15TXpteU16jXmdeZ150nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9eR16LXqNeRJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBoZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBIaW5kaSBbaGldXG4vLyEgYXV0aG9yIDogTWF5YW5rIFNpbmdoYWwgOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YW5rc2luZ2hhbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgpacnLFxuICAgICAgICAgICAgMjogJ+ClqCcsXG4gICAgICAgICAgICAzOiAn4KWpJyxcbiAgICAgICAgICAgIDQ6ICfgpaonLFxuICAgICAgICAgICAgNTogJ+ClqycsXG4gICAgICAgICAgICA2OiAn4KWsJyxcbiAgICAgICAgICAgIDc6ICfgpa0nLFxuICAgICAgICAgICAgODogJ+ClricsXG4gICAgICAgICAgICA5OiAn4KWvJyxcbiAgICAgICAgICAgIDA6ICfgpaYnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KWnJzogJzEnLFxuICAgICAgICAgICAgJ+ClqCc6ICcyJyxcbiAgICAgICAgICAgICfgpaknOiAnMycsXG4gICAgICAgICAgICAn4KWqJzogJzQnLFxuICAgICAgICAgICAgJ+Clqyc6ICc1JyxcbiAgICAgICAgICAgICfgpawnOiAnNicsXG4gICAgICAgICAgICAn4KWtJzogJzcnLFxuICAgICAgICAgICAgJ+Clric6ICc4JyxcbiAgICAgICAgICAgICfgpa8nOiAnOScsXG4gICAgICAgICAgICAn4KWmJzogJzAnLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9e4KSc4KSoL2ksXG4gICAgICAgICAgICAvXuCkq+CkvOCksHzgpKvgpLAvaSxcbiAgICAgICAgICAgIC9e4KSu4KS+4KSw4KWN4KSaL2ksXG4gICAgICAgICAgICAvXuCkheCkquCljeCksOCliC9pLFxuICAgICAgICAgICAgL17gpK7gpIgvaSxcbiAgICAgICAgICAgIC9e4KSc4KWC4KSoL2ksXG4gICAgICAgICAgICAvXuCknOClgeCksi9pLFxuICAgICAgICAgICAgL17gpIXgpJcvaSxcbiAgICAgICAgICAgIC9e4KS44KS/4KSk4KSCfOCkuOCkv+CkpC9pLFxuICAgICAgICAgICAgL17gpIXgpJXgpY3gpJ/gpYIvaSxcbiAgICAgICAgICAgIC9e4KSo4KS1fOCkqOCkteCkgi9pLFxuICAgICAgICAgICAgL17gpKbgpL/gpLjgpIJ84KSm4KS/4KS4L2ksXG4gICAgICAgIF0sXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXuCknOCkqC9pLFxuICAgICAgICAgICAgL17gpKvgpLzgpLAvaSxcbiAgICAgICAgICAgIC9e4KSu4KS+4KSw4KWN4KSaL2ksXG4gICAgICAgICAgICAvXuCkheCkquCljeCksOCliC9pLFxuICAgICAgICAgICAgL17gpK7gpIgvaSxcbiAgICAgICAgICAgIC9e4KSc4KWC4KSoL2ksXG4gICAgICAgICAgICAvXuCknOClgeCksi9pLFxuICAgICAgICAgICAgL17gpIXgpJcvaSxcbiAgICAgICAgICAgIC9e4KS44KS/4KSkL2ksXG4gICAgICAgICAgICAvXuCkheCkleCljeCkn+Clgi9pLFxuICAgICAgICAgICAgL17gpKjgpLUvaSxcbiAgICAgICAgICAgIC9e4KSm4KS/4KS4L2ksXG4gICAgICAgIF07XG5cbiAgICB2YXIgaGkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdoaScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfgpJzgpKjgpLXgpLDgpYBf4KSr4KS84KSw4KS14KSw4KWAX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpYjgpLJf4KSu4KSIX+CknOClguCkqF/gpJzgpYHgpLLgpL7gpIhf4KSF4KSX4KS44KWN4KSkX+CkuOCkv+CkpOCkruCljeCkrOCksF/gpIXgpJXgpY3gpJ/gpYLgpKzgpLBf4KSo4KS14KSu4KWN4KSs4KSwX+CkpuCkv+CkuOCkruCljeCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn4KSc4KSo4KS14KSw4KWAX+Ckq+CksOCkteCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KWI4KSyX+CkruCkiF/gpJzgpYLgpKhf4KSc4KWB4KSy4KS+4KSIX+CkheCkl+CkuOCljeCkpF/gpLjgpL/gpKTgpILgpKzgpLBf4KSF4KSV4KWN4KSf4KWC4KSs4KSwX+CkqOCkteCkguCkrOCksF/gpKbgpL/gpLjgpILgpKzgpLAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgpJzgpKguX+Ckq+CkvOCksC5f4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCliC5f4KSu4KSIX+CknOClguCkqF/gpJzgpYHgpLIuX+CkheCkly5f4KS44KS/4KSkLl/gpIXgpJXgpY3gpJ/gpYIuX+CkqOCktS5f4KSm4KS/4KS4Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfgpLDgpLXgpL/gpLXgpL7gpLBf4KS44KWL4KSu4KS14KS+4KSwX+CkruCkguCkl+CksuCkteCkvuCksF/gpKzgpYHgpKfgpLXgpL7gpLBf4KSX4KWB4KSw4KWC4KS14KS+4KSwX+CktuClgeCkleCljeCksOCkteCkvuCksF/gpLbgpKjgpL/gpLXgpL7gpLAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgpLDgpLXgpL9f4KS44KWL4KSuX+CkruCkguCkl+Cksl/gpKzgpYHgpKdf4KSX4KWB4KSw4KWCX+CktuClgeCkleCljeCksF/gpLbgpKjgpL8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4KSwX+CkuOCli1/gpK7gpIJf4KSs4KWBX+Ckl+ClgV/gpLbgpYFf4KS2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCkrOCknOClhycsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICB9LFxuXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogc2hvcnRNb250aHNQYXJzZSxcblxuICAgICAgICBtb250aHNSZWdleDpcbiAgICAgICAgICAgIC9eKOCknOCkqOCkteCksOClgHzgpJzgpKhcXC4/fOCkq+CkvOCksOCkteCksOClgHzgpKvgpLDgpLXgpLDgpYB84KSr4KS84KSwXFwuP3zgpK7gpL7gpLDgpY3gpJo/fOCkheCkquCljeCksOCliOCksnzgpIXgpKrgpY3gpLDgpYhcXC4/fOCkruCkiD984KSc4KWC4KSoP3zgpJzgpYHgpLLgpL7gpIh84KSc4KWB4KSyXFwuP3zgpIXgpJfgpLjgpY3gpKR84KSF4KSXXFwuP3zgpLjgpL/gpKTgpK7gpY3gpKzgpLB84KS44KS/4KSk4KSC4KSs4KSwfOCkuOCkv+CkpFxcLj984KSF4KSV4KWN4KSf4KWC4KSs4KSwfOCkheCkleCljeCkn+ClglxcLj984KSo4KS14KSu4KWN4KSs4KSwfOCkqOCkteCkguCkrOCksHzgpKjgpLVcXC4/fOCkpuCkv+CkuOCkruCljeCkrOCksHzgpKbgpL/gpLjgpILgpKzgpLB84KSm4KS/4KS4XFwuPykvaSxcblxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OlxuICAgICAgICAgICAgL14o4KSc4KSo4KS14KSw4KWAfOCknOCkqFxcLj984KSr4KS84KSw4KS14KSw4KWAfOCkq+CksOCkteCksOClgHzgpKvgpLzgpLBcXC4/fOCkruCkvuCksOCljeCkmj984KSF4KSq4KWN4KSw4KWI4KSyfOCkheCkquCljeCksOCliFxcLj984KSu4KSIP3zgpJzgpYLgpKg/fOCknOClgeCksuCkvuCkiHzgpJzgpYHgpLJcXC4/fOCkheCkl+CkuOCljeCkpHzgpIXgpJdcXC4/fOCkuOCkv+CkpOCkruCljeCkrOCksHzgpLjgpL/gpKTgpILgpKzgpLB84KS44KS/4KSkXFwuP3zgpIXgpJXgpY3gpJ/gpYLgpKzgpLB84KSF4KSV4KWN4KSf4KWCXFwuP3zgpKjgpLXgpK7gpY3gpKzgpLB84KSo4KS14KSC4KSs4KSwfOCkqOCktVxcLj984KSm4KS/4KS44KSu4KWN4KSs4KSwfOCkpuCkv+CkuOCkguCkrOCksHzgpKbgpL/gpLhcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14o4KSc4KSo4KS14KSw4KWAP3zgpKvgpLzgpLDgpLXgpLDgpYB84KSr4KSw4KS14KSw4KWAP3zgpK7gpL7gpLDgpY3gpJo/fOCkheCkquCljeCksOCliOCksj984KSu4KSIP3zgpJzgpYLgpKg/fOCknOClgeCksuCkvuCkiD984KSF4KSX4KS44KWN4KSkP3zgpLjgpL/gpKTgpK7gpY3gpKzgpLB84KS44KS/4KSk4KSC4KSs4KSwfOCkuOCkv+CkpD9cXC4/fOCkheCkleCljeCkn+ClguCkrOCksHzgpIXgpJXgpY3gpJ/gpYJcXC4/fOCkqOCkteCkruCljeCkrOCksHzgpKjgpLXgpILgpKzgpLA/fOCkpuCkv+CkuOCkruCljeCkrOCksHzgpKbgpL/gpLjgpILgpKzgpLA/KS9pLFxuXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXijgpJzgpKhcXC4/fOCkq+CkvOCksFxcLj984KSu4KS+4KSw4KWN4KSaP3zgpIXgpKrgpY3gpLDgpYhcXC4/fOCkruCkiD984KSc4KWC4KSoP3zgpJzgpYHgpLJcXC4/fOCkheCkl1xcLj984KS44KS/4KSkXFwuP3zgpIXgpJXgpY3gpJ/gpYJcXC4/fOCkqOCktVxcLj984KSm4KS/4KS4XFwuPykvaSxcblxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpIbgpJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KSV4KSyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KSV4KSyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgpKrgpL/gpJvgpLLgpYddIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4KSu4KWH4KSCJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgpKrgpLngpLLgpYcnLFxuICAgICAgICAgICAgczogJ+CkleClgeCkmyDgpLngpYAg4KSV4KWN4KS34KSjJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4KS44KWH4KSV4KSC4KShJyxcbiAgICAgICAgICAgIG06ICfgpI/gpJUg4KSu4KS/4KSo4KSfJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4KSu4KS/4KSo4KSfJyxcbiAgICAgICAgICAgIGg6ICfgpI/gpJUg4KSY4KSC4KSf4KS+JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KSY4KSC4KSf4KWHJyxcbiAgICAgICAgICAgIGQ6ICfgpI/gpJUg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIE06ICfgpI/gpJUg4KSu4KS54KWA4KSo4KWHJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4KSu4KS54KWA4KSo4KWHJyxcbiAgICAgICAgICAgIHk6ICfgpI/gpJUg4KS14KSw4KWN4KS3JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4KS14KSw4KWN4KS3JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Clp+ClqOClqeClquClq+ClrOClreClruClr+Clpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gSGluZGkgbm90YXRpb24gZm9yIG1lcmlkaWVtcyBhcmUgcXVpdGUgZnV6enkgaW4gcHJhY3RpY2UuIFdoaWxlIHRoZXJlIGV4aXN0c1xuICAgICAgICAvLyBhIHJpZ2lkIG5vdGlvbiBvZiBhICdQYWhhcicgaXQgaXMgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gSGluZGkuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gpLDgpL7gpKR84KS44KWB4KSs4KS5fOCkpuCli+CkquCkueCksHzgpLbgpL7gpK4vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgpLDgpL7gpKQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLjgpYHgpKzgpLknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KSm4KWL4KSq4KS54KSwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLbgpL7gpK4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSkJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpYHgpKzgpLknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuCli+CkquCkueCksCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS24KS+4KSuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ3JvYXRpYW4gW2hyXVxuLy8hIGF1dGhvciA6IEJvamFuIE1hcmtvdmnEhyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ibWFya292aWNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2plZG5hIG1pbnV0YScgOiAnamVkbmUgbWludXRlJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdqZWRhbiBzYXQnIDogJ2plZG5vZyBzYXRhJztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0YSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2RhbmEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWMnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNhJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBociA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2hyJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ3NpamXEjW5qYV92ZWxqYcSNZV9vxb51amthX3RyYXZuamFfc3ZpYm5qYV9saXBuamFfc3JwbmphX2tvbG92b3phX3J1am5hX2xpc3RvcGFkYV9zdHVkZW5vZ2FfcHJvc2luY2EnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ3NpamXEjWFual92ZWxqYcSNYV9vxb51amFrX3RyYXZhbmpfc3ZpYmFual9saXBhbmpfc3JwYW5qX2tvbG92b3pfcnVqYW5fbGlzdG9wYWRfc3R1ZGVuaV9wcm9zaW5hYycuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ3Npai5fdmVsai5fb8W+dS5fdHJhLl9zdmkuX2xpcC5fc3JwLl9rb2wuX3J1ai5fbGlzLl9zdHUuX3Byby4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRqZWxqYV9wb25lZGplbGpha191dG9yYWtfc3JpamVkYV/EjWV0dnJ0YWtfcGV0YWtfc3Vib3RhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3V0by5fc3JpLl/EjWV0Ll9wZXQuX3N1Yi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3JfxI1lX3BlX3N1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0RvIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEbyBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRG8gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3N1dHJhIHVdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3NyaWplZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdcSNZXIgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsdV0gW25lZGplbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBbc3JpamVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsaV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmlqZSAlcycsXG4gICAgICAgICAgICBzOiAncGFyIHNla3VuZGknLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogJ2RhbicsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogJ21qZXNlYycsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogJ2dvZGludScsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEh1bmdhcmlhbiBbaHVdXG4vLyEgYXV0aG9yIDogQWRhbSBCcnVubmVyIDogaHR0cHM6Ly9naXRodWIuY29tL2FkYW1icnVubmVyXG4vLyEgYXV0aG9yIDogUGV0ZXIgVmlzenQgIDogaHR0cHM6Ly9naXRodWIuY29tL3Bhc3NhdGd0XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgd2Vla0VuZGluZ3MgPVxuICAgICAgICAndmFzw6FybmFwIGjDqXRmxZFuIGtlZGRlbiBzemVyZMOhbiBjc8O8dMO2cnTDtmvDtm4gcMOpbnRla2VuIHN6b21iYXRvbicuc3BsaXQoJyAnKTtcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBudW0gPSBudW1iZXI7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgICA/ICduw6low6FueSBtw6Fzb2RwZXJjJ1xuICAgICAgICAgICAgICAgICAgICA6ICduw6low6FueSBtw6Fzb2RwZXJjZSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4KVxuICAgICAgICAgICAgICAgICAgICA/ICcgbcOhc29kcGVyYydcbiAgICAgICAgICAgICAgICAgICAgOiAnIG3DoXNvZHBlcmNlJztcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBwZXJjJyA6ICcgcGVyY2UnKTtcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIHBlcmMnIDogJyBwZXJjZScpO1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIMOzcmEnIDogJyDDs3LDoWphJyk7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyDDs3JhJyA6ICcgw7Nyw6FqYScpO1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIG5hcCcgOiAnIG5hcGphJyk7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBuYXAnIDogJyBuYXBqYScpO1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIGjDs25hcCcgOiAnIGjDs25hcGphJyk7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBow7NuYXAnIDogJyBow7NuYXBqYScpO1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIMOpdicgOiAnIMOpdmUnKTtcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIMOpdicgOiAnIMOpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdlZWsoaXNGdXR1cmUpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChpc0Z1dHVyZSA/ICcnIDogJ1ttw7psdF0gJykgK1xuICAgICAgICAgICAgJ1snICtcbiAgICAgICAgICAgIHdlZWtFbmRpbmdzW3RoaXMuZGF5KCldICtcbiAgICAgICAgICAgICddIExUWy1rb3JdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBodSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2h1Jywge1xuICAgICAgICBtb250aHM6ICdqYW51w6FyX2ZlYnJ1w6FyX23DoXJjaXVzX8OhcHJpbGlzX23DoWp1c19qw7puaXVzX2rDumxpdXNfYXVndXN6dHVzX3N6ZXB0ZW1iZXJfb2t0w7NiZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tw6FyYy5fw6Fwci5fbcOhai5fasO6bi5fasO6bC5fYXVnLl9zemVwdC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICd2YXPDoXJuYXBfaMOpdGbFkV9rZWRkX3N6ZXJkYV9jc8O8dMO2cnTDtmtfcMOpbnRla19zem9tYmF0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAndmFzX2jDqXRfa2VkZF9zemVfY3PDvHRfcMOpbl9zem8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAndl9oX2tfc3plX2NzX3Bfc3pvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkuTU0uREQuJyxcbiAgICAgICAgICAgIExMOiAnWVlZWS4gTU1NTSBELicsXG4gICAgICAgICAgICBMTEw6ICdZWVlZLiBNTU1NIEQuIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVkuIE1NTU0gRC4sIGRkZGQgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9kZXxkdS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5jaGFyQXQoMSkudG9Mb3dlckNhc2UoKSA9PT0gJ3UnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID09PSB0cnVlID8gJ2RlJyA6ICdERSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID09PSB0cnVlID8gJ2R1JyA6ICdEVSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW21hXSBMVFsta29yXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2hvbG5hcF0gTFRbLWtvcl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2Vlay5jYWxsKHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbdGVnbmFwXSBMVFsta29yXScsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3ZWVrLmNhbGwodGhpcywgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgbcO6bHZhJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcycsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJtZW5pYW4gW2h5LWFtXVxuLy8hIGF1dGhvciA6IEFybWVuZGFyYWJ5YW4gOiBodHRwczovL2dpdGh1Yi5jb20vYXJtZW5kYXJhYnlhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGh5QW0gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdoeS1hbScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfVsNW41oLVttW+1aHWgNWrX9aD1aXVv9aA1b7VodaA1atf1bTVodaA1b/Vq1/VodW61oDVq9Ws1atf1bTVodW11avVvdWrX9Ww1bjWgtW21avVvdWrX9Ww1bjWgtWs1avVvdWrX9aF1aPVuNW91b/VuNW91atf1b3VpdW61b/VpdW01aLVpdaA1atf1bDVuNWv1b/VpdW01aLVpdaA1atf1bbVuNW11aXVtNWi1aXWgNWrX9Wk1aXVr9W/1aXVtNWi1aXWgNWrJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfVsNW41oLVttW+1aHWgF/Wg9Wl1b/WgNW+1aHWgF/VtNWh1oDVv1/VodW61oDVq9WsX9W01aHVtdWr1b1f1bDVuNaC1bbVq9W9X9Ww1bjWgtWs1avVvV/WhdWj1bjVvdW/1bjVvV/VvdWl1brVv9Wl1bTVotWl1oBf1bDVuNWv1b/VpdW01aLVpdaAX9W21bjVtdWl1bTVotWl1oBf1aTVpdWv1b/VpdW01aLVpdaAJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfVsNW21b5f1oPVv9aAX9W01oDVv1/VodW61oBf1bTVtdW9X9Ww1bbVvV/VsNWs1b1f1oXVo9W9X9W91brVv1/VsNWv1b9f1bbVtNWiX9Wk1a/Vvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn1a/Vq9aA1aHVr9WrX9Wl1oDVr9W41oLVt9Wh1aLVqdWrX9Wl1oDVpdaE1bfVodWi1anVq1/VudW41oDVpdaE1bfVodWi1anVq1/VsNWr1bbVo9W31aHVotWp1atf1bjWgtaA1aLVodWpX9W31aHVotWh1aknLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9Wv1oDVr1/VpdaA1a9f1aXWgNaEX9W51oDWhF/VsNW21aNf1bjWgtaA1aJf1bfVotWpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9Wv1oDVr1/VpdaA1a9f1aXWgNaEX9W51oDWhF/VsNW21aNf1bjWgtaA1aJf1bfVotWpJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZINWpLicsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDVqS4sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSDVqS4sIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb1aHVtdW91oXWgF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vVvtWh1bLVqF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vVpdaA1aXVr10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW9aF1oDVqCDVqtWh1bTVqF0gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdb1aHVttaB1aHVrl0gZGRkZCBb1oXWgNWoINWq1aHVtNWoXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDVsNWl1b/VuCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMg1aHVvNWh1bsnLFxuICAgICAgICAgICAgczogJ9W01asg1oTVodW21asg1b7VodW11oDVr9W11aHVticsXG4gICAgICAgICAgICBzczogJyVkINW+1aHVtdaA1a/VtdWh1bYnLFxuICAgICAgICAgICAgbTogJ9aA1bjVutWlJyxcbiAgICAgICAgICAgIG1tOiAnJWQg1oDVuNW61aUnLFxuICAgICAgICAgICAgaDogJ9Wq1aHVtCcsXG4gICAgICAgICAgICBoaDogJyVkINWq1aHVtCcsXG4gICAgICAgICAgICBkOiAn1oXWgCcsXG4gICAgICAgICAgICBkZDogJyVkINaF1oAnLFxuICAgICAgICAgICAgTTogJ9Wh1bTVq9W9JyxcbiAgICAgICAgICAgIE1NOiAnJWQg1aHVtNWr1b0nLFxuICAgICAgICAgICAgeTogJ9W/1aHWgNWrJyxcbiAgICAgICAgICAgIHl5OiAnJWQg1b/VodaA1asnLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv1aPVq9W31aXWgNW+1aF81aHVvNWh1b7VuNW/1b7VoXzWgdWl1oDVpdWv1b7VoXzVpdaA1aXVr9W41bXVodW2LyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o1oHVpdaA1aXVr9W+1aF81aXWgNWl1a/VuNW11aHVtikkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Wj1avVt9Wl1oDVvtWhJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfVodW81aHVvtW41b/VvtWhJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfWgdWl1oDVpdWv1b7VoSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1aXWgNWl1a/VuNW11aHVtic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfXxcXGR7MSwyfS0o1avVtnzWgNWkKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERG8nOlxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Vq9W2JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3WgNWkJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHlBbTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBJbmRvbmVzaWFuIFtpZF1cbi8vISBhdXRob3IgOiBNb2hhbW1hZCBTYXRyaW8gVXRvbW8gOiBodHRwczovL2dpdGh1Yi5jb20vdHlva1xuLy8hIHJlZmVyZW5jZTogaHR0cDovL2lkLndpa2lzb3VyY2Uub3JnL3dpa2kvUGVkb21hbl9VbXVtX0VqYWFuX0JhaGFzYV9JbmRvbmVzaWFfeWFuZ19EaXNlbXB1cm5ha2FuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgaWQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdpZCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyaV9GZWJydWFyaV9NYXJldF9BcHJpbF9NZWlfSnVuaV9KdWxpX0FndXN0dXNfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01laV9KdW5fSnVsX0FndF9TZXBfT2t0X05vdl9EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnTWluZ2d1X1NlbmluX1NlbGFzYV9SYWJ1X0thbWlzX0p1bWF0X1NhYnR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnTWluX1Nlbl9TZWxfUmFiX0thbV9KdW1fU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ01nX1NuX1NsX1JiX0ttX0ptX1NiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvcGFnaXxzaWFuZ3xzb3JlfG1hbGFtLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAncGFnaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzaWFuZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnc29yZScgfHwgbWVyaWRpZW0gPT09ICdtYWxhbScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGFnaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NpYW5nJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc29yZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbWFsYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIYXJpIGluaSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tCZXNvayBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLZW1hcmluIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2xhbHUgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFsYW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHlhbmcgbGFsdScsXG4gICAgICAgICAgICBzOiAnYmViZXJhcGEgZGV0aWsnLFxuICAgICAgICAgICAgc3M6ICclZCBkZXRpaycsXG4gICAgICAgICAgICBtOiAnc2VtZW5pdCcsXG4gICAgICAgICAgICBtbTogJyVkIG1lbml0JyxcbiAgICAgICAgICAgIGg6ICdzZWphbScsXG4gICAgICAgICAgICBoaDogJyVkIGphbScsXG4gICAgICAgICAgICBkOiAnc2VoYXJpJyxcbiAgICAgICAgICAgIGRkOiAnJWQgaGFyaScsXG4gICAgICAgICAgICBNOiAnc2VidWxhbicsXG4gICAgICAgICAgICBNTTogJyVkIGJ1bGFuJyxcbiAgICAgICAgICAgIHk6ICdzZXRhaHVuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGFodW4nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSWNlbGFuZGljIFtpc11cbi8vISBhdXRob3IgOiBIaW5yaWsgw5ZybiBTaWd1csOwc3NvbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oaW5yaWtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIGlmIChuICUgMTAwID09PSAxMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobiAlIDEwID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlXG4gICAgICAgICAgICAgICAgICAgID8gJ25va2tyYXIgc2Vrw7puZHVyJ1xuICAgICAgICAgICAgICAgICAgICA6ICdub2trcnVtIHNla8O6bmR1bSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnc2Vrw7puZHVyJyA6ICdzZWvDum5kdW0nKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ3Nla8O6bmRhJztcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ23DrW7DunRhJyA6ICdtw61uw7p0dSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKyAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtw61uw7p0dXInIDogJ23DrW7DunR1bScpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOtbsO6dGEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23DrW7DunR1JztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2tsdWtrdXN0dW5kaXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAna2x1a2t1c3R1bmR1bScpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAna2x1a2t1c3R1bmQnO1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYWd1cic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdkYWcnIDogJ2RlZ2knO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkYWdhcic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdkYWdhJyA6ICdkw7ZndW0nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkYWd1cic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoaXNGdXR1cmUgPyAnZGFnJyA6ICdkZWdpJyk7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ23DoW51w7B1cic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdtw6FudcOwJyA6ICdtw6FudcOwaSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23DoW51w7Bpcic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdtw6FudcOwaScgOiAnbcOhbnXDsHVtJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOhbnXDsHVyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdtw6FudcOwJyA6ICdtw6FudcOwaScpO1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnw6FyJyA6ICfDoXJpJztcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ8OhcicgOiAnw6FydW0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ8OhcicgOiAnw6FyaScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaXMnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbsO6YXJfZmVicsO6YXJfbWFyc19hcHLDrWxfbWHDrV9qw7puw61fasO6bMOtX8OhZ8O6c3Rfc2VwdGVtYmVyX29rdMOzYmVyX27Ds3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWHDrV9qw7puX2rDumxfw6Fnw7pfc2VwX29rdF9uw7N2X2Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnc3VubnVkYWd1cl9tw6FudWRhZ3VyX8O+cmnDsGp1ZGFndXJfbWnDsHZpa3VkYWd1cl9maW1tdHVkYWd1cl9mw7ZzdHVkYWd1cl9sYXVnYXJkYWd1cicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc3VuX23DoW5fw75yaV9tacOwX2ZpbV9mw7ZzX2xhdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nw6Ffw55yX01pX0ZpX0bDtl9MYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBba2wuXSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgW2tsLl0gSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW8OtIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbw6EgbW9yZ3VuIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbw60gZ8OmciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3PDrcOwYXN0YV0gZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VmdGlyICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdmeXJpciAlcyBzw63DsGFuJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogJ2tsdWtrdXN0dW5kJyxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSXRhbGlhbiAoU3dpdHplcmxhbmQpIFtpdC1jaF1cbi8vISBhdXRob3IgOiB4ZmggOiBodHRwczovL2dpdGh1Yi5jb20veGZoXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgaXRDaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2l0LWNoJywge1xuICAgICAgICBtb250aHM6ICdnZW5uYWlvX2ZlYmJyYWlvX21hcnpvX2FwcmlsZV9tYWdnaW9fZ2l1Z25vX2x1Z2xpb19hZ29zdG9fc2V0dGVtYnJlX290dG9icmVfbm92ZW1icmVfZGljZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnZ2VuX2ZlYl9tYXJfYXByX21hZ19naXVfbHVnX2Fnb19zZXRfb3R0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnZG9tZW5pY2FfbHVuZWTDrF9tYXJ0ZWTDrF9tZXJjb2xlZMOsX2dpb3ZlZMOsX3ZlbmVyZMOsX3NhYmF0bycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbV9sdW5fbWFyX21lcl9naW9fdmVuX3NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9tZV9naV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW09nZ2kgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEb21hbmkgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthbGxlXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0llcmkgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbGEgc2NvcnNhXSBkZGRkIFthbGxlXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tsbyBzY29yc29dIGRkZGQgW2FsbGVdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgvXlswLTldLiskLy50ZXN0KHMpID8gJ3RyYScgOiAnaW4nKSArICcgJyArIHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdDogJyVzIGZhJyxcbiAgICAgICAgICAgIHM6ICdhbGN1bmkgc2Vjb25kaScsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGknLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0aScsXG4gICAgICAgICAgICBoOiBcInVuJ29yYVwiLFxuICAgICAgICAgICAgaGg6ICclZCBvcmUnLFxuICAgICAgICAgICAgZDogJ3VuIGdpb3JubycsXG4gICAgICAgICAgICBkZDogJyVkIGdpb3JuaScsXG4gICAgICAgICAgICBNOiAndW4gbWVzZScsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2knLFxuICAgICAgICAgICAgeTogJ3VuIGFubm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm5pJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpdENoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEl0YWxpYW4gW2l0XVxuLy8hIGF1dGhvciA6IExvcmVuem8gOiBodHRwczovL2dpdGh1Yi5jb20vYWxpZW1cbi8vISBhdXRob3I6IE1hdHRpYSBMYXJlbnRpczogaHR0cHM6Ly9naXRodWIuY29tL25vc3RhbGdpYXpcbi8vISBhdXRob3I6IE1hcmNvIDogaHR0cHM6Ly9naXRodWIuY29tL01hbmZyZTk4XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgaXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdpdCcsIHtcbiAgICAgICAgbW9udGhzOiAnZ2VubmFpb19mZWJicmFpb19tYXJ6b19hcHJpbGVfbWFnZ2lvX2dpdWdub19sdWdsaW9fYWdvc3RvX3NldHRlbWJyZV9vdHRvYnJlX25vdmVtYnJlX2RpY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2dlbl9mZWJfbWFyX2Fwcl9tYWdfZ2l1X2x1Z19hZ29fc2V0X290dF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWVuaWNhX2x1bmVkw6xfbWFydGVkw6xfbWVyY29sZWTDrF9naW92ZWTDrF92ZW5lcmTDrF9zYWJhdG8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb21fbHVuX21hcl9tZXJfZ2lvX3Zlbl9zYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWVfZ2lfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbT2dnaSBhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxID8gJ2xsZSAnIDogdGhpcy5ob3VycygpID09PSAwID8gJyAnIDogXCJsbCdcIikgK1xuICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbRG9tYW5pIGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDEgPyAnbGxlICcgOiB0aGlzLmhvdXJzKCkgPT09IDAgPyAnICcgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdkZGRkIFthJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxID8gJ2xsZSAnIDogdGhpcy5ob3VycygpID09PSAwID8gJyAnIDogXCJsbCdcIikgK1xuICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbSWVyaSBhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxID8gJ2xsZSAnIDogdGhpcy5ob3VycygpID09PSAwID8gJyAnIDogXCJsbCdcIikgK1xuICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW0xhIHNjb3JzYV0gZGRkZCBbYScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2xsZSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5ob3VycygpID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwibGwnXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tMbyBzY29yc29dIGRkZGQgW2EnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdsbGUgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuaG91cnMoKSA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJyAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ11MVCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAndHJhICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBmYScsXG4gICAgICAgICAgICBzOiAnYWxjdW5pIHNlY29uZGknLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRpJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGknLFxuICAgICAgICAgICAgaDogXCJ1bidvcmFcIixcbiAgICAgICAgICAgIGhoOiAnJWQgb3JlJyxcbiAgICAgICAgICAgIGQ6ICd1biBnaW9ybm8nLFxuICAgICAgICAgICAgZGQ6ICclZCBnaW9ybmknLFxuICAgICAgICAgICAgdzogJ3VuYSBzZXR0aW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZXR0aW1hbmUnLFxuICAgICAgICAgICAgTTogJ3VuIG1lc2UnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNpJyxcbiAgICAgICAgICAgIHk6ICd1biBhbm5vJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5uaScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSmFwYW5lc2UgW2phXVxuLy8hIGF1dGhvciA6IExJIExvbmcgOiBodHRwczovL2dpdGh1Yi5jb20vYmFyeW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgamEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdqYScsIHtcbiAgICAgICAgZXJhczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMjAxOS0wNS0wMScsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICfku6TlkownLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ+OLvycsXG4gICAgICAgICAgICAgICAgYWJicjogJ1InLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzE5ODktMDEtMDgnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAnMjAxOS0wNC0zMCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICflubPmiJAnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ+ONuycsXG4gICAgICAgICAgICAgICAgYWJicjogJ0gnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzE5MjYtMTItMjUnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAnMTk4OS0wMS0wNycsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICfmmK3lkownLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ+ONvCcsXG4gICAgICAgICAgICAgICAgYWJicjogJ1MnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzE5MTItMDctMzAnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAnMTkyNi0xMi0yNCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICflpKfmraMnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ+ONvScsXG4gICAgICAgICAgICAgICAgYWJicjogJ1QnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzE4NzMtMDEtMDEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAnMTkxMi0wNy0yOScsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiA2LFxuICAgICAgICAgICAgICAgIG5hbWU6ICfmmI7msrsnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ+ONvicsXG4gICAgICAgICAgICAgICAgYWJicjogJ00nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzAwMDEtMDEtMDEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAnMTg3My0xMi0zMScsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICfopb/mmqYnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ0FEJyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnQUQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzAwMDAtMTItMzEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAtSW5maW5pdHksXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICfntIDlhYPliY0nLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ0JDJyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnQkMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZXJhWWVhck9yZGluYWxSZWdleDogLyjlhYN8XFxkKynlubQvLFxuICAgICAgICBlcmFZZWFyT3JkaW5hbFBhcnNlOiBmdW5jdGlvbiAoaW5wdXQsIG1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV0gPT09ICflhYMnID8gMSA6IHBhcnNlSW50KG1hdGNoWzFdIHx8IGlucHV0LCAxMCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoczogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aXpeabnOaXpV/mnIjmm5zml6Vf54Gr5puc5pelX+awtOabnOaXpV/mnKjmm5zml6Vf6YeR5puc5pelX+Wcn+abnOaXpScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+aXpV/mnIhf54GrX+awtF/mnKhf6YeRX+Wcnycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5pyIX+eBq1/msLRf5pyoX+mHkV/lnJ8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelIGRkZGQgSEg6bW0nLFxuICAgICAgICAgICAgbDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6UoZGRkKSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/ljYjliY185Y2I5b6ML2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn5Y2I5b6MJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WNiOWJjSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Y2I5b6MJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb5LuK5pelXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuaXpV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93LndlZWsoKSAhPT0gdGhpcy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5p2l6YCxXWRkZGQgTFQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5pelXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLndlZWsoKSAhPT0gbm93LndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vlhYjpgLFdZGRkZCBMVCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ95pelLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyID09PSAxID8gJ+WFg+W5tCcgOiBudW1iZXIgKyAn5bm0JztcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+W+jCcsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+aVsOenkicsXG4gICAgICAgICAgICBzczogJyVk56eSJyxcbiAgICAgICAgICAgIG06ICcx5YiGJyxcbiAgICAgICAgICAgIG1tOiAnJWTliIYnLFxuICAgICAgICAgICAgaDogJzHmmYLplpMnLFxuICAgICAgICAgICAgaGg6ICclZOaZgumWkycsXG4gICAgICAgICAgICBkOiAnMeaXpScsXG4gICAgICAgICAgICBkZDogJyVk5pelJyxcbiAgICAgICAgICAgIE06ICcx44O25pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWTjg7bmnIgnLFxuICAgICAgICAgICAgeTogJzHlubQnLFxuICAgICAgICAgICAgeXk6ICclZOW5tCcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gamE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSmF2YW5lc2UgW2p2XVxuLy8hIGF1dGhvciA6IFJvbnkgTGFudGlwIDogaHR0cHM6Ly9naXRodWIuY29tL2xhbnRpcFxuLy8hIHJlZmVyZW5jZTogaHR0cDovL2p2Lndpa2lwZWRpYS5vcmcvd2lraS9CYXNhX0phd2FcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBqdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2p2Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hcmV0X0FwcmlsX01laV9KdW5pX0p1bGlfQWd1c3R1c19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3BlbWJlcl9EZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWVpX0p1bl9KdWxfQWdzX1NlcF9Pa3RfTm9wX0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdNaW5nZ3VfU2VuZW5fU2Vsb3NvX1JlYnVfS2VtaXNfSmVtdXdhaF9TZXB0dScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ01pbl9TZW5fU2VsX1JlYl9LZW1fSmVtX1NlcCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdNZ19Tbl9TbF9SYl9LbV9KbV9TcCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2VuamluZ3xzaXlhbmd8c29udGVufG5kYWx1LyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAnZW5qaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NpeWFuZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnc29udGVuJyB8fCBtZXJpZGllbSA9PT0gJ25kYWx1Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlbmppbmcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzaXlhbmcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzb250ZW4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25kYWx1JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbRGludGVuIHB1bmlrbyBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tNYmVuamFuZyBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLYWxhIHdpbmdpIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2tlcGVuZ2tlciBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd3b250ZW4gaW5nICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBpbmdrYW5nIGtlcGVuZ2tlcicsXG4gICAgICAgICAgICBzOiAnc2F3ZXRhd2lzIGRldGlrJyxcbiAgICAgICAgICAgIHNzOiAnJWQgZGV0aWsnLFxuICAgICAgICAgICAgbTogJ3NldHVuZ2dhbCBtZW5pdCcsXG4gICAgICAgICAgICBtbTogJyVkIG1lbml0JyxcbiAgICAgICAgICAgIGg6ICdzZXR1bmdnYWwgamFtJyxcbiAgICAgICAgICAgIGhoOiAnJWQgamFtJyxcbiAgICAgICAgICAgIGQ6ICdzZWRpbnRlbicsXG4gICAgICAgICAgICBkZDogJyVkIGRpbnRlbicsXG4gICAgICAgICAgICBNOiAnc2V3dWxhbicsXG4gICAgICAgICAgICBNTTogJyVkIHd1bGFuJyxcbiAgICAgICAgICAgIHk6ICdzZXRhdW4nLFxuICAgICAgICAgICAgeXk6ICclZCB0YXVuJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGp2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdlb3JnaWFuIFtrYV1cbi8vISBhdXRob3IgOiBJcmFrbGkgSmFuaWFzaHZpbGkgOiBodHRwczovL2dpdGh1Yi5jb20vSXJha2xpSmFuaVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGthID0gbW9tZW50LmRlZmluZUxvY2FsZSgna2EnLCB7XG4gICAgICAgIG1vbnRoczogJ+GDmOGDkOGDnOGDleGDkOGDoOGDmF/hg5fhg5Thg5Hhg5Thg6Dhg5Xhg5Dhg5rhg5hf4YOb4YOQ4YOg4YOi4YOYX+GDkOGDnuGDoOGDmOGDmuGDmF/hg5vhg5Dhg5jhg6Hhg5hf4YOY4YOV4YOc4YOY4YOh4YOYX+GDmOGDleGDmuGDmOGDoeGDmF/hg5Dhg5Lhg5Xhg5jhg6Hhg6Lhg51f4YOh4YOU4YOl4YOi4YOU4YOb4YOR4YOU4YOg4YOYX+GDneGDpeGDouGDneGDm+GDkeGDlOGDoOGDmF/hg5zhg53hg5Thg5vhg5Hhg5Thg6Dhg5hf4YOT4YOU4YOZ4YOU4YOb4YOR4YOU4YOg4YOYJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ+GDmOGDkOGDnF/hg5fhg5Thg5Ff4YOb4YOQ4YOgX+GDkOGDnuGDoF/hg5vhg5Dhg5hf4YOY4YOV4YOcX+GDmOGDleGDml/hg5Dhg5Lhg5Vf4YOh4YOU4YOlX+GDneGDpeGDol/hg5zhg53hg5Rf4YOT4YOU4YOZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn4YOZ4YOV4YOY4YOg4YOQX+GDneGDoOGDqOGDkOGDkeGDkOGDl+GDmF/hg6Hhg5Dhg5vhg6jhg5Dhg5Hhg5Dhg5fhg5hf4YOd4YOX4YOu4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDruGDo+GDl+GDqOGDkOGDkeGDkOGDl+GDmF/hg57hg5Dhg6Dhg5Dhg6Hhg5nhg5Thg5Xhg5hf4YOo4YOQ4YOR4YOQ4YOX4YOYJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ+GDmeGDleGDmOGDoOGDkOGDoV/hg53hg6Dhg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOh4YOQ4YOb4YOo4YOQ4YOR4YOQ4YOX4YOhX+GDneGDl+GDruGDqOGDkOGDkeGDkOGDl+GDoV/hg67hg6Phg5fhg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOe4YOQ4YOg4YOQ4YOh4YOZ4YOU4YOV4YOhX+GDqOGDkOGDkeGDkOGDl+GDoScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC8o4YOs4YOY4YOc4YOQfOGDqOGDlOGDm+GDk+GDlOGDkikvLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4YOZ4YOV4YOYX+GDneGDoOGDqF/hg6Hhg5Dhg5tf4YOd4YOX4YOuX+GDruGDo+GDl1/hg57hg5Dhg6Bf4YOo4YOQ4YORJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+GDmeGDlV/hg53hg6Bf4YOh4YOQX+GDneGDl1/hg67hg6Nf4YOe4YOQX+GDqOGDkCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vhg5Phg6bhg5Thg6FdIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4YOu4YOV4YOQ4YOaXSBMVFst4YOW4YOUXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+GDkuGDo+GDqOGDmOGDnF0gTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4YOo4YOU4YOb4YOT4YOU4YOSXSBkZGRkIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+GDrOGDmOGDnOGDkF0gZGRkZCBMVC3hg5bhg5QnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgLyjhg6zhg5Dhg5t84YOs4YOj4YOXfOGDoeGDkOGDkOGDl3zhg6zhg5Thg5p84YOT4YOmfOGDl+GDlSko4YOYfOGDlCkvLFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoJDAsICQxLCAkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQyID09PSAn4YOYJyA/ICQxICsgJ+GDqOGDmCcgOiAkMSArICQyICsgJ+GDqOGDmCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3Q6IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgaWYgKC8o4YOs4YOQ4YOb4YOYfOGDrOGDo+GDl+GDmHzhg6Hhg5Dhg5Dhg5fhg5h84YOT4YOm4YOUfOGDl+GDleGDlCkvLnRlc3QocykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvKOGDmHzhg5QpJC8sICfhg5jhg6Eg4YOs4YOY4YOcJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgv4YOs4YOU4YOa4YOYLy50ZXN0KHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL+GDrOGDlOGDmuGDmCQvLCAn4YOs4YOa4YOY4YOhIOGDrOGDmOGDnCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzOiAn4YOg4YOQ4YOb4YOT4YOU4YOc4YOY4YOb4YOUIOGDrOGDkOGDm+GDmCcsXG4gICAgICAgICAgICBzczogJyVkIOGDrOGDkOGDm+GDmCcsXG4gICAgICAgICAgICBtOiAn4YOs4YOj4YOX4YOYJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4YOs4YOj4YOX4YOYJyxcbiAgICAgICAgICAgIGg6ICfhg6Hhg5Dhg5Dhg5fhg5gnLFxuICAgICAgICAgICAgaGg6ICclZCDhg6Hhg5Dhg5Dhg5fhg5gnLFxuICAgICAgICAgICAgZDogJ+GDk+GDpuGDlCcsXG4gICAgICAgICAgICBkZDogJyVkIOGDk+GDpuGDlCcsXG4gICAgICAgICAgICBNOiAn4YOX4YOV4YOUJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4YOX4YOV4YOUJyxcbiAgICAgICAgICAgIHk6ICfhg6zhg5Thg5rhg5gnLFxuICAgICAgICAgICAgeXk6ICclZCDhg6zhg5Thg5rhg5gnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvMHwxLeGDmuGDmHzhg5vhg5QtXFxkezEsMn18XFxkezEsMn0t4YOULyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct4YOa4YOYJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBudW1iZXIgPCAyMCB8fFxuICAgICAgICAgICAgICAgIChudW1iZXIgPD0gMTAwICYmIG51bWJlciAlIDIwID09PSAwKSB8fFxuICAgICAgICAgICAgICAgIG51bWJlciAlIDEwMCA9PT0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfhg5vhg5QtJyArIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLeGDlCc7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSxcbiAgICAgICAgICAgIGRveTogNyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBrYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLYXpha2ggW2trXVxuLy8hIGF1dGhvcnMgOiBOdXJsYW4gUmFraGltemhhbm92IDogaHR0cHM6Ly9naXRodWIuY29tL251cmxhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN1ZmZpeGVzID0ge1xuICAgICAgICAwOiAnLdGI0ZYnLFxuICAgICAgICAxOiAnLdGI0ZYnLFxuICAgICAgICAyOiAnLdGI0ZYnLFxuICAgICAgICAzOiAnLdGI0ZYnLFxuICAgICAgICA0OiAnLdGI0ZYnLFxuICAgICAgICA1OiAnLdGI0ZYnLFxuICAgICAgICA2OiAnLdGI0YsnLFxuICAgICAgICA3OiAnLdGI0ZYnLFxuICAgICAgICA4OiAnLdGI0ZYnLFxuICAgICAgICA5OiAnLdGI0YsnLFxuICAgICAgICAxMDogJy3RiNGLJyxcbiAgICAgICAgMjA6ICct0YjRiycsXG4gICAgICAgIDMwOiAnLdGI0YsnLFxuICAgICAgICA0MDogJy3RiNGLJyxcbiAgICAgICAgNTA6ICct0YjRlicsXG4gICAgICAgIDYwOiAnLdGI0YsnLFxuICAgICAgICA3MDogJy3RiNGWJyxcbiAgICAgICAgODA6ICct0YjRlicsXG4gICAgICAgIDkwOiAnLdGI0YsnLFxuICAgICAgICAxMDA6ICct0YjRlicsXG4gICAgfTtcblxuICAgIHZhciBrayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2trJywge1xuICAgICAgICBtb250aHM6ICfSm9Cw0qPRgtCw0YBf0LDSm9C/0LDQvV/QvdCw0YPRgNGL0Ldf0YHTmdGD0ZbRgF/QvNCw0LzRi9GAX9C80LDRg9GB0YvQvF/RiNGW0LvQtNC1X9GC0LDQvNGL0Ldf0pvRi9GA0LrSr9C50LXQul/Sm9Cw0LfQsNC9X9Kb0LDRgNCw0YjQsF/QttC10LvRgtC+0pvRgdCw0L0nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0pvQsNKjX9Cw0pvQv1/QvdCw0YNf0YHTmdGDX9C80LDQvF/QvNCw0YNf0YjRltC7X9GC0LDQvF/Sm9GL0YBf0pvQsNC3X9Kb0LDRgF/QttC10LsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0LbQtdC60YHQtdC90LHRll/QtNKv0LnRgdC10L3QsdGWX9GB0LXQudGB0LXQvdCx0ZZf0YHTmdGA0YHQtdC90LHRll/QsdC10LnRgdC10L3QsdGWX9C20rHQvNCwX9GB0LXQvdCx0ZYnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQttC10Lpf0LTSr9C5X9GB0LXQuV/RgdOZ0YBf0LHQtdC5X9C20rHQvF/RgdC10L0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0LbQul/QtNC5X9GB0Llf0YHRgF/QsdC5X9C20Lxf0YHQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQkdKv0LPRltC9INGB0LDSk9Cw0YJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0JXRgNGC0LXSoyDRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9GB0LDSk9Cw0YJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JrQtdGI0LUg0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb06jRgtC60LXQvSDQsNC/0YLQsNC90YvSo10gZGRkZCBb0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDRltGI0ZbQvdC00LUnLFxuICAgICAgICAgICAgcGFzdDogJyVzINCx0rHRgNGL0L0nLFxuICAgICAgICAgICAgczogJ9Cx0ZbRgNC90LXRiNC1INGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBzczogJyVkINGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtOiAn0LHRltGAINC80LjQvdGD0YInLFxuICAgICAgICAgICAgbW06ICclZCDQvNC40L3Rg9GCJyxcbiAgICAgICAgICAgIGg6ICfQsdGW0YAg0YHQsNKT0LDRgicsXG4gICAgICAgICAgICBoaDogJyVkINGB0LDSk9Cw0YInLFxuICAgICAgICAgICAgZDogJ9Cx0ZbRgCDQutKv0L0nLFxuICAgICAgICAgICAgZGQ6ICclZCDQutKv0L0nLFxuICAgICAgICAgICAgTTogJ9Cx0ZbRgCDQsNC5JyxcbiAgICAgICAgICAgIE1NOiAnJWQg0LDQuScsXG4gICAgICAgICAgICB5OiAn0LHRltGAINC20YvQuycsXG4gICAgICAgICAgICB5eTogJyVkINC20YvQuycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0YjRlnzRiNGLKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1tudW1iZXJdIHx8IHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGtrO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENhbWJvZGlhbiBba21dXG4vLyEgYXV0aG9yIDogS3J1eSBWYW5uYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rcnV5dmFubmFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4Z+hJyxcbiAgICAgICAgICAgIDI6ICfhn6InLFxuICAgICAgICAgICAgMzogJ+GfoycsXG4gICAgICAgICAgICA0OiAn4Z+kJyxcbiAgICAgICAgICAgIDU6ICfhn6UnLFxuICAgICAgICAgICAgNjogJ+GfpicsXG4gICAgICAgICAgICA3OiAn4Z+nJyxcbiAgICAgICAgICAgIDg6ICfhn6gnLFxuICAgICAgICAgICAgOTogJ+GfqScsXG4gICAgICAgICAgICAwOiAn4Z+gJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+GfoSc6ICcxJyxcbiAgICAgICAgICAgICfhn6InOiAnMicsXG4gICAgICAgICAgICAn4Z+jJzogJzMnLFxuICAgICAgICAgICAgJ+GfpCc6ICc0JyxcbiAgICAgICAgICAgICfhn6UnOiAnNScsXG4gICAgICAgICAgICAn4Z+mJzogJzYnLFxuICAgICAgICAgICAgJ+Gfpyc6ICc3JyxcbiAgICAgICAgICAgICfhn6gnOiAnOCcsXG4gICAgICAgICAgICAn4Z+pJzogJzknLFxuICAgICAgICAgICAgJ+GfoCc6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBrbSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ttJywge1xuICAgICAgICBtb250aHM6ICfhnpjhnoDhnprhnrZf4Z6A4Z674Z6Y4Z+S4Z6X4Z+IX+GemOGeuOGek+Getl/hnpjhn4Hhnp/hnrZf4Z6n4Z6f4Z6X4Z62X+GemOGet+GekOGeu+Gek+Getl/hnoDhnoDhn5LhnoDhnorhnrZf4Z6f4Z644Z6g4Z62X+GegOGeieGfkuGeieGetl/hno/hnrvhnpvhnrZf4Z6c4Z634Z6F4Z+S4Z6G4Z634Z6A4Z62X+GekuGfkuGek+GevCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Z6Y4Z6A4Z6a4Z62X+GegOGeu+GemOGfkuGel+GfiF/hnpjhnrjhnpPhnrZf4Z6Y4Z+B4Z6f4Z62X+Gep+Gen+Gel+Getl/hnpjhnrfhnpDhnrvhnpPhnrZf4Z6A4Z6A4Z+S4Z6A4Z6K4Z62X+Gen+GeuOGeoOGetl/hnoDhnonhn5LhnonhnrZf4Z6P4Z674Z6b4Z62X+GenOGet+GeheGfkuGehuGet+GegOGetl/hnpLhn5LhnpPhnrwnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfhnqLhnrbhnpHhnrfhno/hn5Lhnplf4Z6F4Z+Q4Z6T4Z+S4Z6RX+GeouGehOGfkuGeguGetuGeml/hnpbhnrvhnpJf4Z6W4Z+S4Z6a4Z6g4Z6f4Z+S4Z6U4Z6P4Z634Z+NX+Gen+Geu+GegOGfkuGeml/hnp/hn4Xhnprhn40nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfhnqLhnrZf4Z6FX+Geol/hnpZf4Z6W4Z+S4Z6aX+Gen+Geu1/hnp8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4Z6i4Z62X+GehV/hnqJf4Z6WX+GeluGfkuGeml/hnp/hnrtf4Z6fJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+GeluGfkuGemuGeueGegHzhnpvhn5LhnoThnrbhnoUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+Gem+GfkuGehOGetuGehSc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfhnpbhn5LhnprhnrnhnoAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+Gem+GfkuGehOGetuGehSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+GekOGfkuGehOGfg+Gek+GfgeGfhyDhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4Z6f4Z+S4Z6i4Z+C4Z6AIOGemOGfieGfhOGehF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4Z6Y4Z+S4Z6f4Z634Z6b4Z6Y4Z634Z6JIOGemOGfieGfhOGehF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvhnp/hnpThn5Lhno/hnrbhnqDhn43hnpjhnrvhnpNdIFvhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPhnpHhn4Dhno8nLFxuICAgICAgICAgICAgcGFzdDogJyVz4Z6Y4Z674Z6TJyxcbiAgICAgICAgICAgIHM6ICfhnpThn4nhnrvhnpPhn5LhnpjhnrbhnpPhnpzhnrfhnpPhnrbhnpHhnrgnLFxuICAgICAgICAgICAgc3M6ICclZCDhnpzhnrfhnpPhnrbhnpHhnrgnLFxuICAgICAgICAgICAgbTogJ+GemOGeveGemeGek+GetuGekeGeuCcsXG4gICAgICAgICAgICBtbTogJyVkIOGek+GetuGekeGeuCcsXG4gICAgICAgICAgICBoOiAn4Z6Y4Z694Z6Z4Z6Y4Z+J4Z+E4Z6EJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4Z6Y4Z+J4Z+E4Z6EJyxcbiAgICAgICAgICAgIGQ6ICfhnpjhnr3hnpnhnpDhn5LhnoThn4MnLFxuICAgICAgICAgICAgZGQ6ICclZCDhnpDhn5LhnoThn4MnLFxuICAgICAgICAgICAgTTogJ+GemOGeveGemeGegeGfgicsXG4gICAgICAgICAgICBNTTogJyVkIOGegeGfgicsXG4gICAgICAgICAgICB5OiAn4Z6Y4Z694Z6Z4Z6G4Z+S4Z6T4Z624Z+GJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Z6G4Z+S4Z6T4Z624Z+GJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL+GekeGeuFxcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogJ+GekeGeuCVkJyxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+GfoeGfouGfo+GfpOGfpeGfpuGfp+GfqOGfqeGfoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGttO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEthbm5hZGEgW2tuXVxuLy8hIGF1dGhvciA6IFJhamVldiBOYWlrIDogaHR0cHM6Ly9naXRodWIuY29tL3JhamVldm5haWt0ZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgs6cnLFxuICAgICAgICAgICAgMjogJ+CzqCcsXG4gICAgICAgICAgICAzOiAn4LOpJyxcbiAgICAgICAgICAgIDQ6ICfgs6onLFxuICAgICAgICAgICAgNTogJ+CzqycsXG4gICAgICAgICAgICA2OiAn4LOsJyxcbiAgICAgICAgICAgIDc6ICfgs60nLFxuICAgICAgICAgICAgODogJ+CzricsXG4gICAgICAgICAgICA5OiAn4LOvJyxcbiAgICAgICAgICAgIDA6ICfgs6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4LOnJzogJzEnLFxuICAgICAgICAgICAgJ+CzqCc6ICcyJyxcbiAgICAgICAgICAgICfgs6knOiAnMycsXG4gICAgICAgICAgICAn4LOqJzogJzQnLFxuICAgICAgICAgICAgJ+Czqyc6ICc1JyxcbiAgICAgICAgICAgICfgs6wnOiAnNicsXG4gICAgICAgICAgICAn4LOtJzogJzcnLFxuICAgICAgICAgICAgJ+Czric6ICc4JyxcbiAgICAgICAgICAgICfgs68nOiAnOScsXG4gICAgICAgICAgICAn4LOmJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGtuID0gbW9tZW50LmRlZmluZUxvY2FsZSgna24nLCB7XG4gICAgICAgIG1vbnRoczogJ+CynOCyqOCyteCysOCyv1/gsqvgs4bgsqzgs43gsrDgsrXgsrDgsr9f4LKu4LK+4LKw4LON4LKa4LONX+Cyj+CyquCzjeCysOCyv+CysuCzjV/gsq7gs4bgs5Vf4LKc4LOC4LKo4LONX+CynOCzgeCysuCzhuCzll/gsobgspfgsrjgs43gsp/gs41f4LK44LOG4LKq4LON4LKf4LOG4LKC4LKs4LKw4LONX+CyheCyleCzjeCyn+CzhuCzguCzleCyrOCysOCzjV/gsqjgsrXgs4bgsoLgsqzgsrDgs41f4LKh4LK/4LK44LOG4LKC4LKs4LKw4LONJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgspzgsqhf4LKr4LOG4LKs4LON4LKwX+CyruCyvuCysOCzjeCymuCzjV/gso/gsqrgs43gsrDgsr/gsrLgs41f4LKu4LOG4LOVX+CynOCzguCyqOCzjV/gspzgs4HgsrLgs4bgs5Zf4LKG4LKX4LK44LON4LKf4LONX+CyuOCzhuCyquCzjeCyn+CzhuCygl/gsoXgspXgs43gsp/gs4bgs4Lgs5Vf4LKo4LK14LOG4LKCX+CyoeCyv+CyuOCzhuCygicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+CyreCyvuCyqOCzgeCyteCyvuCysF/gsrjgs4bgs4Lgs5Xgsq7gsrXgsr7gsrBf4LKu4LKC4LKX4LKz4LK14LK+4LKwX+CyrOCzgeCyp+CyteCyvuCysF/gspfgs4HgsrDgs4HgsrXgsr7gsrBf4LK24LOB4LKV4LON4LKw4LK14LK+4LKwX+CytuCyqOCyv+CyteCyvuCysCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CyreCyvuCyqOCzgV/gsrjgs4bgs4Lgs5Xgsq5f4LKu4LKC4LKX4LKzX+CyrOCzgeCyp1/gspfgs4HgsrDgs4Ff4LK24LOB4LKV4LON4LKwX+CytuCyqOCyvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgsq3gsr5f4LK44LOG4LOC4LOVX+CyruCygl/gsqzgs4Ff4LKX4LOBX+CytuCzgV/gsrYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4LKH4LKC4LKm4LOBXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CyqOCyvuCys+Czhl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CyqOCyv+CyqOCzjeCyqOCzhl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4LKV4LOG4LOC4LKo4LOG4LKvXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCyqOCyguCypOCysCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4LK54LK/4LKC4LKm4LOGJyxcbiAgICAgICAgICAgIHM6ICfgspXgs4bgsrLgsrXgs4Eg4LKV4LON4LK34LKj4LKX4LKz4LOBJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4LK44LOG4LKV4LOG4LKC4LKh4LOB4LKX4LKz4LOBJyxcbiAgICAgICAgICAgIG06ICfgspLgsoLgsqbgs4Eg4LKo4LK/4LKu4LK/4LK3JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4LKo4LK/4LKu4LK/4LK3JyxcbiAgICAgICAgICAgIGg6ICfgspLgsoLgsqbgs4Eg4LKX4LKC4LKf4LOGJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4LKX4LKC4LKf4LOGJyxcbiAgICAgICAgICAgIGQ6ICfgspLgsoLgsqbgs4Eg4LKm4LK/4LKoJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4LKm4LK/4LKoJyxcbiAgICAgICAgICAgIE06ICfgspLgsoLgsqbgs4Eg4LKk4LK/4LKC4LKX4LKz4LOBJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4LKk4LK/4LKC4LKX4LKz4LOBJyxcbiAgICAgICAgICAgIHk6ICfgspLgsoLgsqbgs4Eg4LK14LKw4LON4LK3JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4LK14LKw4LON4LK3JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Czp+CzqOCzqeCzquCzq+CzrOCzreCzruCzr+Czpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CysOCyvuCypOCzjeCysOCyv3zgsqzgs4bgsrPgsr/gspfgs43gspfgs4Z84LKu4LKn4LON4LKv4LK+4LK54LON4LKofOCyuOCyguCynOCzhi8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CysOCyvuCypOCzjeCysOCyvycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CyrOCzhuCys+Cyv+Cyl+CzjeCyl+CzhicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsq7gsqfgs43gsq/gsr7gsrngs43gsqgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CyuOCyguCynOCzhicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsrDgsr7gsqTgs43gsrDgsr8nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CyrOCzhuCys+Cyv+Cyl+CzjeCyl+Czhic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LKu4LKn4LON4LKv4LK+4LK54LON4LKoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsrjgsoLgspzgs4YnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CysOCyvuCypOCzjeCysOCyvyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjgsqjgs4bgs5UpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfgsqjgs4bgs5UnO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga247XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS29yZWFuIFtrb11cbi8vISBhdXRob3IgOiBLeXVuZ3dvb2ssIFBhcmsgOiBodHRwczovL2dpdGh1Yi5jb20va3l1bmd3MDBrXG4vLyEgYXV0aG9yIDogSmVlZXl1bCBMZWUgPGplZWV5dWxAZ21haWwuY29tPlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGtvID0gbW9tZW50LmRlZmluZUxvY2FsZSgna28nLCB7XG4gICAgICAgIG1vbnRoczogJzHsm5RfMuyblF8z7JuUXzTsm5RfNeyblF827JuUXzfsm5RfOOyblF857JuUXzEw7JuUXzEx7JuUXzEy7JuUJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJzHsm5RfMuyblF8z7JuUXzTsm5RfNeyblF827JuUXzfsm5RfOOyblF857JuUXzEw7JuUXzEx7JuUXzEy7JuUJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+ydvOyalOydvF/sm5TsmpTsnbxf7ZmU7JqU7J28X+yImOyalOydvF/rqqnsmpTsnbxf6riI7JqU7J28X+2GoOyalOydvCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+ydvF/sm5Rf7ZmUX+yImF/rqqlf6riIX+2GoCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfsnbxf7JuUX+2ZlF/siJhf66qpX+q4iF/thqAnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkuTU0uREQuJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeuFhCBNTU1NIETsnbwnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeuFhCBNTU1NIETsnbwgQSBoOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ64WEIE1NTU0gROydvCBkZGRkIEEgaDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS5NTS5ERC4nLFxuICAgICAgICAgICAgbGw6ICdZWVlZ64WEIE1NTU0gROydvCcsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ64WEIE1NTU0gROydvCBBIGg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnrhYQgTU1NTSBE7J28IGRkZGQgQSBoOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICfsmKTripggTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ+uCtOydvCBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ+yWtOygnCBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ+yngOuCnOyjvCBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg7ZuEJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDsoIQnLFxuICAgICAgICAgICAgczogJ+uqhyDstIgnLFxuICAgICAgICAgICAgc3M6ICclZOy0iCcsXG4gICAgICAgICAgICBtOiAnMeu2hCcsXG4gICAgICAgICAgICBtbTogJyVk67aEJyxcbiAgICAgICAgICAgIGg6ICftlZwg7Iuc6rCEJyxcbiAgICAgICAgICAgIGhoOiAnJWTsi5zqsIQnLFxuICAgICAgICAgICAgZDogJ+2VmOujqCcsXG4gICAgICAgICAgICBkZDogJyVk7J28JyxcbiAgICAgICAgICAgIE06ICftlZwg64usJyxcbiAgICAgICAgICAgIE1NOiAnJWTri6wnLFxuICAgICAgICAgICAgeTogJ+ydvCDrhYQnLFxuICAgICAgICAgICAgeXk6ICclZOuFhCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjsnbx87JuUfOyjvCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfsnbwnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+yblCc7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn7KO8JztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv7Jik7KCEfOyYpO2bhC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuID09PSAn7Jik7ZuEJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzVXBwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBob3VyIDwgMTIgPyAn7Jik7KCEJyA6ICfsmKTtm4QnO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGtvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE5vcnRoZXJuIEt1cmRpc2ggW2t1LWttcl1cbi8vISBhdXRob3JzIDogTWF6bHVtIMOWemRvZ2FuIDogaHR0cHM6Ly9naXRodWIuY29tL21lcmdlaGV6XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bSwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgczogWyfDp2VuZCBzYW7DrnllJywgJ8OnZW5kIHNhbsOueWV5YW4nXSxcbiAgICAgICAgICAgIHNzOiBbbnVtICsgJyBzYW7DrnllJywgbnVtICsgJyBzYW7DrnlleWFuJ10sXG4gICAgICAgICAgICBtOiBbJ2RlccOucWV5ZWsnLCAnZGVxw65xZXlla8OqJ10sXG4gICAgICAgICAgICBtbTogW251bSArICcgZGVxw65xZScsIG51bSArICcgZGVxw65xZXlhbiddLFxuICAgICAgICAgICAgaDogWydzYWV0ZWsnLCAnc2FldGVrw6onXSxcbiAgICAgICAgICAgIGhoOiBbbnVtICsgJyBzYWV0JywgbnVtICsgJyBzYWV0YW4nXSxcbiAgICAgICAgICAgIGQ6IFsncm9qZWsnLCAncm9qZWvDqiddLFxuICAgICAgICAgICAgZGQ6IFtudW0gKyAnIHJvaicsIG51bSArICcgcm9qYW4nXSxcbiAgICAgICAgICAgIHc6IFsnaGVmdGV5ZWsnLCAnaGVmdGV5ZWvDqiddLFxuICAgICAgICAgICAgd3c6IFtudW0gKyAnIGhlZnRlJywgbnVtICsgJyBoZWZ0ZXlhbiddLFxuICAgICAgICAgICAgTTogWydtZWhlaycsICdtZWhla8OqJ10sXG4gICAgICAgICAgICBNTTogW251bSArICcgbWVoJywgbnVtICsgJyBtZWhhbiddLFxuICAgICAgICAgICAgeTogWydzYWxlaycsICdzYWxla8OqJ10sXG4gICAgICAgICAgICB5eTogW251bSArICcgc2FsJywgbnVtICsgJyBzYWxhbiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuICAgIC8vIGZ1bmN0aW9uIG9ibGlxdWVOdW1TdWZmaXgobnVtKSB7XG4gICAgLy8gICAgIGlmKG51bS5pbmNsdWRlcygnOicpKVxuICAgIC8vICAgICAgICAgbnVtID0gcGFyc2VJbnQobnVtLnNwbGl0KCc6JylbMF0pO1xuICAgIC8vICAgICBlbHNlXG4gICAgLy8gICAgICAgICBudW0gPSBwYXJzZUludChudW0pO1xuICAgIC8vICAgICByZXR1cm4gbnVtID09IDAgfHwgbnVtICUgMTAgPT0gMSA/ICfDqidcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICA6IChudW0gPiAxMCAmJiBudW0gJSAxMCA9PSAwID8gJ8OuJyA6ICdhbicpO1xuICAgIC8vIH1cbiAgICBmdW5jdGlvbiBlemFmZU51bVN1ZmZpeChudW0pIHtcbiAgICAgICAgbnVtID0gJycgKyBudW07XG4gICAgICAgIHZhciBsID0gbnVtLnN1YnN0cmluZyhudW0ubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICBsbCA9IG51bS5sZW5ndGggPiAxID8gbnVtLnN1YnN0cmluZyhudW0ubGVuZ3RoIC0gMikgOiAnJztcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShsbCA9PSAxMiB8fCBsbCA9PSAxMykgJiZcbiAgICAgICAgICAgIChsID09ICcyJyB8fCBsID09ICczJyB8fCBsbCA9PSAnNTAnIHx8IGwgPT0gJzcwJyB8fCBsID09ICc4MCcpXG4gICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiAnecOqJztcbiAgICAgICAgcmV0dXJuICfDqic7XG4gICAgfVxuXG4gICAgdmFyIGt1S21yID0gbW9tZW50LmRlZmluZUxvY2FsZSgna3Uta21yJywge1xuICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWxsaW5nIHJ1bGVzIGRlZmluZWQgYnkgdGhlIHdvcmsgZ3JvdXAgb2YgV2VxZmEgTWV6b3BvdGFteWF5w6ogKE1lc29wb3RhbWlhIEZvdW5kYXRpb24pXG4gICAgICAgIC8vIHRoaXMgc2hvdWxkIGJlOiAnS2Fuw7tuYSBQYcWfw65uX1NpYmF0X0FkYXJfTsOuc2FuX0d1bGFuX0hlesOucmFuX1TDrnJtZWhfVGViYXhfw45sb25fw4dpcsOueWEgUMOqxZ/Drm5fw4dpcsOueWEgUGHFn8Oubl9LYW7Du25hIFDDqsWfw65uJ1xuICAgICAgICAvLyBCdXQgdGhlIG5hbWVzIGJlbG93IGFyZSBtb3JlIHdlbGwga25vd24gYW5kIGhhbmR5XG4gICAgICAgIG1vbnRoczogJ1LDqmJlbmRhbl9TaWJhdF9BZGFyX07DrnNhbl9HdWxhbl9IZXrDrnJhbl9Uw65ybWVoX1RlYmF4X8OObG9uX0NvdG1laF9NaWpkYXJfQmVyZmFuYmFyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ1LDqmJfU2liX0FkYV9Ow65zX0d1bF9IZXpfVMOucl9UZWJfw45sb19Db3RfTWlqX0Jlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdZZWvFn2VtX0R1xZ9lbV9Tw6rFn2VtX8OHYXLFn2VtX1DDqm5jxZ9lbV/Djm5fxZ5lbcOuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnWWVrX0R1X1PDql/Dh2FyX1DDqm5fw45uX8WeZW0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnWWVfRHVfU8OqX8OHYV9Qw6pfw45uX8WeZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdibicgOiAnQk4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbicgOiAnUE4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvYm58Qk58cG58UE4vLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0RvIE1NTU1bYV0gWVlZWVthbl0nLFxuICAgICAgICAgICAgTExMOiAnRG8gTU1NTVthXSBZWVlZW2FuXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRG8gTU1NTVthXSBZWVlZW2FuXSBISDptbScsXG4gICAgICAgICAgICBsbDogJ0RvIE1NTVsuXSBZWVlZW2FuXScsXG4gICAgICAgICAgICBsbGw6ICdEbyBNTU1bLl0gWVlZWVthbl0gSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZFsuXSwgRG8gTU1NWy5dIFlZWVlbYW5dIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbw45ybyBkaSBzYWV0XSBMVCBbZGVdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbU2liw6ogZGkgc2FldF0gTFQgW2RlXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2RpIHNhZXRdIExUIFtkZV0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tEdWggZGkgc2FldF0gTFQgW2RlXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGRbYSBib3LDriBkaSBzYWV0XSBMVCBbZGVdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGkgJXMgZGUnLFxuICAgICAgICAgICAgcGFzdDogJ2JlcsOuICVzJyxcbiAgICAgICAgICAgIHM6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBzczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHc6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3dzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KD86ecOqfMOqfFxcLikvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBwID0gcGVyaW9kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocC5pbmNsdWRlcygndycpIHx8IHAuaW5jbHVkZXMoJ20nKSkgcmV0dXJuIG51bSArICcuJztcblxuICAgICAgICAgICAgcmV0dXJuIG51bSArIGV6YWZlTnVtU3VmZml4KG51bSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBrdUttcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLdXJkaXNoIFtrdV1cbi8vISBhdXRob3IgOiBTaGFocmFtIE1lYmFzaGFyIDogaHR0cHM6Ly9naXRodWIuY29tL1NoYWhyYW1NZWJhc2hhclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfZoScsXG4gICAgICAgICAgICAyOiAn2aInLFxuICAgICAgICAgICAgMzogJ9mjJyxcbiAgICAgICAgICAgIDQ6ICfZpCcsXG4gICAgICAgICAgICA1OiAn2aUnLFxuICAgICAgICAgICAgNjogJ9mmJyxcbiAgICAgICAgICAgIDc6ICfZpycsXG4gICAgICAgICAgICA4OiAn2agnLFxuICAgICAgICAgICAgOTogJ9mpJyxcbiAgICAgICAgICAgIDA6ICfZoCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfZoSc6ICcxJyxcbiAgICAgICAgICAgICfZoic6ICcyJyxcbiAgICAgICAgICAgICfZoyc6ICczJyxcbiAgICAgICAgICAgICfZpCc6ICc0JyxcbiAgICAgICAgICAgICfZpSc6ICc1JyxcbiAgICAgICAgICAgICfZpic6ICc2JyxcbiAgICAgICAgICAgICfZpyc6ICc3JyxcbiAgICAgICAgICAgICfZqCc6ICc4JyxcbiAgICAgICAgICAgICfZqSc6ICc5JyxcbiAgICAgICAgICAgICfZoCc6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9qp2KfZhtmI2YbbjCDYr9mI2YjbldmFJyxcbiAgICAgICAgICAgICfYtNmI2KjYp9iqJyxcbiAgICAgICAgICAgICfYptin2LLYp9ixJyxcbiAgICAgICAgICAgICfZhtuM2LPYp9mGJyxcbiAgICAgICAgICAgICfYptin24zYp9ixJyxcbiAgICAgICAgICAgICfYrdmI2LLblduM2LHYp9mGJyxcbiAgICAgICAgICAgICfYqtuV2YXZhdmI2LInLFxuICAgICAgICAgICAgJ9im2KfYqCcsXG4gICAgICAgICAgICAn2KbblduM2YTZiNmI2YQnLFxuICAgICAgICAgICAgJ9iq2LTYsduM2YbbjCDbjNuV2YPbldmFJyxcbiAgICAgICAgICAgICfYqti02LHbjNmG24wg2K/ZiNmI25XZhScsXG4gICAgICAgICAgICAn2YPYp9mG2YjZhtuMINuM25XaqduV2YUnLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGt1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgna3UnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfbjNmH4oCM2YPYtNmH4oCM2YXZhdmH4oCMX9iv2YjZiNi02YfigIzZhdmF2YfigIxf2LPbjti02YfigIzZhdmF2YfigIxf2obZiNin2LHYtNmH4oCM2YXZhdmH4oCMX9m+247Zhtis2LTZh+KAjNmF2YXZh+KAjF/Zh9mH4oCM24zZhtuMX9i02YfigIzZhdmF2YfigIwnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDpcbiAgICAgICAgICAgICfbjNmH4oCM2YPYtNmH4oCM2YVf2K/ZiNmI2LTZh+KAjNmFX9iz247YtNmH4oCM2YVf2obZiNin2LHYtNmH4oCM2YVf2b7bjtmG2KzYtNmH4oCM2YVf2YfZh+KAjNuM2YbbjF/YtNmH4oCM2YXZhdmH4oCMJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9uMX9ivX9izX9qGX9m+X9mHX9i0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9im247ZiNin2LHZh+KAjHzYqNmH4oCM24zYp9mG24wvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAv2KbbjtmI2KfYsdmH4oCMLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9io2YfigIzbjNin2YbbjCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2KbbjtmI2KfYsdmH4oCMJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KbZh+KAjNmF2LHbhiDZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYqNmH4oCM24zYp9mG24wg2YPYp9iq2pjZhduO2LFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2YPYp9iq2pjZhduO2LFdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2K/ZiNuO2YbbjiDZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZhNmH4oCMICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcycsXG4gICAgICAgICAgICBzOiAn2obZh+KAjNmG2K8g2obYsdmD2YfigIzbjNmH4oCM2YMnLFxuICAgICAgICAgICAgc3M6ICfahtix2YPZh+KAjCAlZCcsXG4gICAgICAgICAgICBtOiAn24zZh+KAjNmDINiu2YjZhNmH4oCM2YMnLFxuICAgICAgICAgICAgbW06ICclZCDYrtmI2YTZh+KAjNmDJyxcbiAgICAgICAgICAgIGg6ICfbjNmH4oCM2YMg2YPYp9iq2pjZhduO2LEnLFxuICAgICAgICAgICAgaGg6ICclZCDZg9in2KramNmF247YsScsXG4gICAgICAgICAgICBkOiAn24zZh+KAjNmDINqV24bamCcsXG4gICAgICAgICAgICBkZDogJyVkINqV24bamCcsXG4gICAgICAgICAgICBNOiAn24zZh+KAjNmDINmF2KfZhtqvJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2YXYp9mG2q8nLFxuICAgICAgICAgICAgeTogJ9uM2YfigIzZgyDYs9in2rUnLFxuICAgICAgICAgICAgeXk6ICclZCDYs9in2rUnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b2aHZotmj2aTZpdmm2afZqNmp2aBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBrdTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLeXJneXogW2t5XVxuLy8hIGF1dGhvciA6IENoeW5neXogQXJ5c3RhbiB1dWx1IDogaHR0cHM6Ly9naXRodWIuY29tL2NoeW5neXpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMDogJy3Rh9KvJyxcbiAgICAgICAgMTogJy3Rh9C4JyxcbiAgICAgICAgMjogJy3Rh9C4JyxcbiAgICAgICAgMzogJy3Rh9KvJyxcbiAgICAgICAgNDogJy3Rh9KvJyxcbiAgICAgICAgNTogJy3Rh9C4JyxcbiAgICAgICAgNjogJy3Rh9GLJyxcbiAgICAgICAgNzogJy3Rh9C4JyxcbiAgICAgICAgODogJy3Rh9C4JyxcbiAgICAgICAgOTogJy3Rh9GDJyxcbiAgICAgICAgMTA6ICct0YfRgycsXG4gICAgICAgIDIwOiAnLdGH0YsnLFxuICAgICAgICAzMDogJy3Rh9GDJyxcbiAgICAgICAgNDA6ICct0YfRiycsXG4gICAgICAgIDUwOiAnLdGH0q8nLFxuICAgICAgICA2MDogJy3Rh9GLJyxcbiAgICAgICAgNzA6ICct0YfQuCcsXG4gICAgICAgIDgwOiAnLdGH0LgnLFxuICAgICAgICA5MDogJy3Rh9GDJyxcbiAgICAgICAgMTAwOiAnLdGH0q8nLFxuICAgIH07XG5cbiAgICB2YXIga3kgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdreScsIHtcbiAgICAgICAgbW9udGhzOiAn0Y/QvdCy0LDRgNGMX9GE0LXQstGA0LDQu9GMX9C80LDRgNGCX9Cw0L/RgNC10LvRjF/QvNCw0Llf0LjRjtC90Yxf0LjRjtC70Yxf0LDQstCz0YPRgdGCX9GB0LXQvdGC0Y/QsdGA0Yxf0L7QutGC0Y/QsdGA0Yxf0L3QvtGP0LHRgNGMX9C00LXQutCw0LHRgNGMJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9GP0L3Qsl/RhNC10LJf0LzQsNGA0YJf0LDQv9GAX9C80LDQuV/QuNGO0L3RjF/QuNGO0LvRjF/QsNCy0LNf0YHQtdC9X9C+0LrRgl/QvdC+0Y9f0LTQtdC6Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9CW0LXQutGI0LXQvNCx0Lhf0JTSr9C50YjTqdC80LHSr1/QqNC10LnRiNC10LzQsdC4X9Co0LDRgNGI0LXQvNCx0Lhf0JHQtdC50YjQtdC80LHQuF/QltGD0LzQsF/QmNGI0LXQvNCx0LgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQltC10Lpf0JTSr9C5X9Co0LXQuV/QqNCw0YBf0JHQtdC5X9CW0YPQvF/QmNGI0LUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0JbQul/QlNC5X9Co0Llf0KjRgF/QkdC5X9CW0Lxf0JjRiCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQkdKv0LPSr9C9INGB0LDQsNGCXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Ct0YDRgtC10qMg0YHQsNCw0YJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb0YHQsNCw0YJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JrQtdGH0Y3RjSDRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb06jRgtC606nQvSDQsNC/0YLQsNC90YvQvV0gZGRkZCBb0LrSr9C90q9dIFvRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDQuNGH0LjQvdC00LUnLFxuICAgICAgICAgICAgcGFzdDogJyVzINC80YPRgNGD0L0nLFxuICAgICAgICAgICAgczogJ9Cx0LjRgNC90LXRh9C1INGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBzczogJyVkINGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtOiAn0LHQuNGAINC80q/QvdOp0YInLFxuICAgICAgICAgICAgbW06ICclZCDQvNKv0L3TqdGCJyxcbiAgICAgICAgICAgIGg6ICfQsdC40YAg0YHQsNCw0YInLFxuICAgICAgICAgICAgaGg6ICclZCDRgdCw0LDRgicsXG4gICAgICAgICAgICBkOiAn0LHQuNGAINC60q/QvScsXG4gICAgICAgICAgICBkZDogJyVkINC60q/QvScsXG4gICAgICAgICAgICBNOiAn0LHQuNGAINCw0LknLFxuICAgICAgICAgICAgTU06ICclZCDQsNC5JyxcbiAgICAgICAgICAgIHk6ICfQsdC40YAg0LbRi9C7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LbRi9C7JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRh9C4fNGH0Yt80YfSr3zRh9GDKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1tudW1iZXJdIHx8IHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGt5O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEx1eGVtYm91cmdpc2ggW2xiXVxuLy8hIGF1dGhvciA6IG13ZWltZXJza2lyY2ggOiBodHRwczovL2dpdGh1Yi5jb20vbXdlaW1lcnNraXJjaFxuLy8hIGF1dGhvciA6IERhdmlkIFJhaXNvbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rd2lzYXR6XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbTogWydlbmcgTWludXR0JywgJ2VuZ2VyIE1pbnV0dCddLFxuICAgICAgICAgICAgaDogWydlbmcgU3Rvbm4nLCAnZW5nZXIgU3Rvbm4nXSxcbiAgICAgICAgICAgIGQ6IFsnZWVuIERhZycsICdlbmdlbSBEYWcnXSxcbiAgICAgICAgICAgIE06IFsnZWUgTW91bnQnLCAnZW5nZW0gTW91bnQnXSxcbiAgICAgICAgICAgIHk6IFsnZWUgSm9lcicsICdlbmdlbSBKb2VyJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc0Z1dHVyZVRpbWUoc3RyaW5nKSB7XG4gICAgICAgIHZhciBudW1iZXIgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKCcgJykpO1xuICAgICAgICBpZiAoZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcikpIHtcbiAgICAgICAgICAgIHJldHVybiAnYSAnICsgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnYW4gJyArIHN0cmluZztcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc1Bhc3RUaW1lKHN0cmluZykge1xuICAgICAgICB2YXIgbnVtYmVyID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZignICcpKTtcbiAgICAgICAgaWYgKGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihudW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3ZpcnUgJyArIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3ZpcnVuICcgKyBzdHJpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd29yZCBiZWZvcmUgdGhlIGdpdmVuIG51bWJlciBsb3NlcyB0aGUgJy1uJyBlbmRpbmcuXG4gICAgICogZS5nLiAnYW4gMTAgRGVlZycgYnV0ICdhIDUgRGVlZydcbiAgICAgKlxuICAgICAqIEBwYXJhbSBudW1iZXIge2ludGVnZXJ9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnVuY3Rpb24gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcikge1xuICAgICAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIsIDEwKTtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgLy8gTmVnYXRpdmUgTnVtYmVyIC0tPiBhbHdheXMgdHJ1ZVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMTApIHtcbiAgICAgICAgICAgIC8vIE9ubHkgMSBkaWdpdFxuICAgICAgICAgICAgaWYgKDQgPD0gbnVtYmVyICYmIG51bWJlciA8PSA3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMTAwKSB7XG4gICAgICAgICAgICAvLyAyIGRpZ2l0c1xuICAgICAgICAgICAgdmFyIGxhc3REaWdpdCA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGZpcnN0RGlnaXQgPSBudW1iZXIgLyAxMDtcbiAgICAgICAgICAgIGlmIChsYXN0RGlnaXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKGZpcnN0RGlnaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihsYXN0RGlnaXQpO1xuICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDEwMDAwKSB7XG4gICAgICAgICAgICAvLyAzIG9yIDQgZGlnaXRzIC0tPiByZWN1cnNpdmVseSBjaGVjayBmaXJzdCBkaWdpdFxuICAgICAgICAgICAgd2hpbGUgKG51bWJlciA+PSAxMCkge1xuICAgICAgICAgICAgICAgIG51bWJlciA9IG51bWJlciAvIDEwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQW55dGhpbmcgbGFyZ2VyIHRoYW4gNCBkaWdpdHM6IHJlY3Vyc2l2ZWx5IGNoZWNrIGZpcnN0IG4tMyBkaWdpdHNcbiAgICAgICAgICAgIG51bWJlciA9IG51bWJlciAvIDEwMDA7XG4gICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdsYicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyX0ZlYnJ1YXJfTcOkZXJ6X0FicsOrbGxfTWVlX0p1bmlfSnVsaV9BdWd1c3RfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGV6ZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0phbi5fRmVici5fTXJ6Ll9BYnIuX01lZV9KdW4uX0p1bC5fQXVnLl9TZXB0Ll9Pa3QuX05vdi5fRGV6Licuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdTb25uZGVnX03DqWluZGVnX0TDq25zY2hkZWdfTcOrdHR3b2NoX0Rvbm5lc2NoZGVnX0ZyZWlkZWdfU2Ftc2NoZGVnJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTby5fTcOpLl9Ew6suX03Dqy5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTcOpX0TDq19Nw6tfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbSBbQXVlcl0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcyBbQXVlcl0nLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0gW0F1ZXJdJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbSBbQXVlcl0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIYXV0IHVtXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tNdWVyIHVtXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0fDq3NjaHRlciB1bV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBEaWZmZXJlbnQgZGF0ZSBzdHJpbmcgZm9yICdEw6tuc2NoZGVnJyAoVHVlc2RheSkgYW5kICdEb25uZXNjaGRlZycgKFRodXJzZGF5KSBkdWUgdG8gcGhvbm9sb2dpY2FsIHJ1bGVcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tMZXNjaHRlbl0gZGRkZCBbdW1dIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW0xlc2NodGVdIGRkZGQgW3VtXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IHByb2Nlc3NGdXR1cmVUaW1lLFxuICAgICAgICAgICAgcGFzdDogcHJvY2Vzc1Bhc3RUaW1lLFxuICAgICAgICAgICAgczogJ2UgcHVlciBTZWtvbm5lbicsXG4gICAgICAgICAgICBzczogJyVkIFNla29ubmVuJyxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogJyVkIE1pbnV0dGVuJyxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogJyVkIFN0b25uZW4nLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiAnJWQgRGVlZycsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06ICclZCBNw6lpbnQnLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiAnJWQgSm9lcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTGFvIFtsb11cbi8vISBhdXRob3IgOiBSeWFuIEhhcnQgOiBodHRwczovL2dpdGh1Yi5jb20vcnlhbmhhcnQyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbG8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdsbycsIHtcbiAgICAgICAgbW9udGhzOiAn4Lqh4Lqx4LqH4LqB4Lqt4LqZX+C6geC6uOC6oeC6nuC6sl/guqHgurXgupngurJf4LuA4Lqh4Lqq4LqyX+C6nuC6tuC6lOC6quC6sOC6nuC6sl/guqHgurTgupbgurjgupngurJf4LqB4LuN4Lql4Lqw4LqB4Lq74LqUX+C6quC6tOC6h+C6q+C6sl/guoHgurHgupnguo3gurJf4LqV4Lq44Lql4LqyX+C6nuC6sOC6iOC6tOC6gV/gupfgurHgupnguqfgurInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+C6oeC6seC6h+C6geC6reC6mV/guoHgurjguqHgup7gurJf4Lqh4Lq14LqZ4LqyX+C7gOC6oeC6quC6sl/gup7gurbgupTguqrgurDgup7gurJf4Lqh4Lq04LqW4Lq44LqZ4LqyX+C6geC7jeC6peC6sOC6geC6u+C6lF/guqrgurTguofguqvgurJf4LqB4Lqx4LqZ4LqN4LqyX+C6leC6uOC6peC6sl/gup7gurDguojgurTguoFf4LqX4Lqx4LqZ4Lqn4LqyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4Lqt4Lqy4LqX4Lq04LqUX+C6iOC6seC6mV/guq3gurHguofguoTgurLguplf4Lqe4Lq44LqUX+C6nuC6sOC6q+C6seC6lF/guqrgurjguoFf4LuA4Lqq4Lq74LqyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4LqX4Lq04LqUX+C6iOC6seC6mV/guq3gurHguofguoTgurLguplf4Lqe4Lq44LqUX+C6nuC6sOC6q+C6seC6lF/guqrgurjguoFf4LuA4Lqq4Lq74LqyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+C6l1/guohf4Lqt4LqEX+C6nl/gup7guqtf4Lqq4LqBX+C6qicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICfguqfgurHguplkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C6leC6reC6meC7gOC6iuC6u+C7ieC6snzgupXguq3gupngu4HguqXguocvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+C6leC6reC6meC7geC6peC6hyc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgupXguq3gupngu4Dguorgurvgu4ngurInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C6leC6reC6meC7geC6peC6hyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+C6oeC6t+C7ieC6meC6teC7ieC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vguqHgurfgu4nguq3gurfgu4jgupngu4DguqfguqXgurJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+C6p+C6seC6mV1kZGRkW+C7nOC7ieC6suC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vguqHgurfgu4nguqfgurLgupngupngurXgu4ngu4DguqfguqXgurJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+C6p+C6seC6mV1kZGRkW+C7geC6peC7ieC6p+C6meC6teC7ieC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfguq3gurXguoEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVz4Lqc4LuI4Lqy4LqZ4Lqh4LqyJyxcbiAgICAgICAgICAgIHM6ICfguprgu43gu4jgu4Dgupfgurvgu4jgurLgu4PgupTguqfgurTgupngurLgupfgurUnLFxuICAgICAgICAgICAgc3M6ICclZCDguqfgurTgupngurLgupfgurUnLFxuICAgICAgICAgICAgbTogJzEg4LqZ4Lqy4LqX4Lq1JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4LqZ4Lqy4LqX4Lq1JyxcbiAgICAgICAgICAgIGg6ICcxIOC6iuC6u+C7iOC6p+C7guC6oeC6hycsXG4gICAgICAgICAgICBoaDogJyVkIOC6iuC6u+C7iOC6p+C7guC6oeC6hycsXG4gICAgICAgICAgICBkOiAnMSDguqHgurfgu4knLFxuICAgICAgICAgICAgZGQ6ICclZCDguqHgurfgu4knLFxuICAgICAgICAgICAgTTogJzEg4LuA4LqU4Lq34Lqt4LqZJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4LuA4LqU4Lq34Lqt4LqZJyxcbiAgICAgICAgICAgIHk6ICcxIOC6m+C6tScsXG4gICAgICAgICAgICB5eTogJyVkIOC6m+C6tScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC8o4LqX4Lq14LuIKVxcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuICfgupfgurXgu4gnICsgbnVtYmVyO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IExpdGh1YW5pYW4gW2x0XVxuLy8hIGF1dGhvciA6IE1pbmRhdWdhcyBNb3rFq3JhcyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tbW96dXJhc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHVuaXRzID0ge1xuICAgICAgICBzczogJ3Nla3VuZMSXX3Nla3VuZMW+acWzX3Nla3VuZGVzJyxcbiAgICAgICAgbTogJ21pbnV0xJdfbWludXTEl3NfbWludXTEmScsXG4gICAgICAgIG1tOiAnbWludXTEl3NfbWludcSNacWzX21pbnV0ZXMnLFxuICAgICAgICBoOiAndmFsYW5kYV92YWxhbmRvc192YWxhbmTEhScsXG4gICAgICAgIGhoOiAndmFsYW5kb3NfdmFsYW5kxbNfdmFsYW5kYXMnLFxuICAgICAgICBkOiAnZGllbmFfZGllbm9zX2RpZW7EhScsXG4gICAgICAgIGRkOiAnZGllbm9zX2RpZW7Fs19kaWVuYXMnLFxuICAgICAgICBNOiAnbcSXbnVvX23El25lc2lvX23El25lc8SvJyxcbiAgICAgICAgTU06ICdtxJduZXNpYWlfbcSXbmVzacWzX23El25lc2l1cycsXG4gICAgICAgIHk6ICdtZXRhaV9tZXTFs19tZXR1cycsXG4gICAgICAgIHl5OiAnbWV0YWlfbWV0xbNfbWV0dXMnLFxuICAgIH07XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlU2Vjb25kcyhudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiAna2VsaW9zIHNla3VuZMSXcyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAna2VsacWzIHNla3VuZMW+acWzJyA6ICdrZWxpYXMgc2VrdW5kZXMnO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVNpbmd1bGFyKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeFxuICAgICAgICAgICAgPyBmb3JtcyhrZXkpWzBdXG4gICAgICAgICAgICA6IGlzRnV0dXJlXG4gICAgICAgICAgICAgID8gZm9ybXMoa2V5KVsxXVxuICAgICAgICAgICAgICA6IGZvcm1zKGtleSlbMl07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNwZWNpYWwobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMCB8fCAobnVtYmVyID4gMTAgJiYgbnVtYmVyIDwgMjApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmb3JtcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIHVuaXRzW2tleV0uc3BsaXQoJ18nKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHJlc3VsdCArIHRyYW5zbGF0ZVNpbmd1bGFyKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5WzBdLCBpc0Z1dHVyZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChzcGVjaWFsKG51bWJlcikgPyBmb3JtcyhrZXkpWzFdIDogZm9ybXMoa2V5KVswXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgZm9ybXMoa2V5KVsxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChzcGVjaWFsKG51bWJlcikgPyBmb3JtcyhrZXkpWzFdIDogZm9ybXMoa2V5KVsyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGx0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbHQnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAnc2F1c2lvX3Zhc2FyaW9fa292b19iYWxhbmTFvmlvX2dlZ3XFvsSXc19iaXLFvmVsaW9fbGllcG9zX3J1Z3BqxavEjWlvX3J1Z3PEl2pvX3NwYWxpb19sYXBrcmnEjWlvX2dydW9kxb5pbycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnc2F1c2lzX3Zhc2FyaXNfa292YXNfYmFsYW5kaXNfZ2VndcW+xJdfYmlyxb5lbGlzX2xpZXBhX3J1Z3Bqxat0aXNfcnVnc8SXamlzX3NwYWxpc19sYXBrcml0aXNfZ3J1b2Rpcycuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL0Rbb0RdPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrTU1NTT98TU1NTT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK0Rbb0RdPy8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnc2F1X3Zhc19rb3ZfYmFsX2dlZ19iaXJfbGllX3JncF9yZ3Nfc3BhX2xhcF9ncmQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdzZWttYWRpZW7Er19waXJtYWRpZW7Er19hbnRyYWRpZW7Er190cmXEjWlhZGllbsSvX2tldHZpcnRhZGllbsSvX3Blbmt0YWRpZW7Er1/FoWXFoXRhZGllbsSvJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdzZWttYWRpZW5pc19waXJtYWRpZW5pc19hbnRyYWRpZW5pc190cmXEjWlhZGllbmlzX2tldHZpcnRhZGllbmlzX3Blbmt0YWRpZW5pc1/FoWXFoXRhZGllbmlzJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvZGRkZCBISDptbS8sXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTZWtfUGlyX0FudF9UcmVfS2V0X1Blbl/FoGXFoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTX1BfQV9UX0tfUG5fxaAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0nLFxuICAgICAgICAgICAgTExMOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBISDptbSBbdmFsLl0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXSwgZGRkZCwgSEg6bW0gW3ZhbC5dJyxcbiAgICAgICAgICAgIGw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXSwgSEg6bW0gW3ZhbC5dJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0sIGRkZCwgSEg6bW0gW3ZhbC5dJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbxaBpYW5kaWVuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1J5dG9qXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tWYWthcl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbUHJhxJdqdXPEr10gZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3BvICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmllxaEgJXMnLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlU2Vjb25kcyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS1vamkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy1vamknO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbHQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTGF0dmlhbiBbbHZdXG4vLyEgYXV0aG9yIDogS3Jpc3RhcHMgS2FybHNvbnMgOiBodHRwczovL2dpdGh1Yi5jb20vc2tha3JpXG4vLyEgYXV0aG9yIDogSsSBbmlzIEVsbWVyaXMgOiBodHRwczovL2dpdGh1Yi5jb20vSmFuaXNFXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdW5pdHMgPSB7XG4gICAgICAgIHNzOiAnc2VrdW5kZXNfc2VrdW5kxJNtX3Nla3VuZGVfc2VrdW5kZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIG06ICdtaW7Fq3Rlc19taW7Fq3TEk21fbWluxat0ZV9taW7Fq3Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW06ICdtaW7Fq3Rlc19taW7Fq3TEk21fbWluxat0ZV9taW7Fq3Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgaDogJ3N0dW5kYXNfc3R1bmTEgW1fc3R1bmRhX3N0dW5kYXMnLnNwbGl0KCdfJyksXG4gICAgICAgIGhoOiAnc3R1bmRhc19zdHVuZMSBbV9zdHVuZGFfc3R1bmRhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgZDogJ2RpZW5hc19kaWVuxIFtX2RpZW5hX2RpZW5hcycuc3BsaXQoJ18nKSxcbiAgICAgICAgZGQ6ICdkaWVuYXNfZGllbsSBbV9kaWVuYV9kaWVuYXMnLnNwbGl0KCdfJyksXG4gICAgICAgIE06ICdtxJNuZcWhYV9txJNuZcWhaWVtX23Ek25lc2lzX23Ek25lxaFpJy5zcGxpdCgnXycpLFxuICAgICAgICBNTTogJ23Ek25lxaFhX23Ek25lxaFpZW1fbcSTbmVzaXNfbcSTbmXFoWknLnNwbGl0KCdfJyksXG4gICAgICAgIHk6ICdnYWRhX2dhZGllbV9nYWRzX2dhZGknLnNwbGl0KCdfJyksXG4gICAgICAgIHl5OiAnZ2FkYV9nYWRpZW1fZ2Fkc19nYWRpJy5zcGxpdCgnXycpLFxuICAgIH07XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHdpdGhvdXRTdWZmaXggYm9vbGVhbiB0cnVlID0gYSBsZW5ndGggb2YgdGltZTsgZmFsc2UgPSBiZWZvcmUvYWZ0ZXIgYSBwZXJpb2Qgb2YgdGltZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JtYXQoZm9ybXMsIG51bWJlciwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgLy8gRS5nLiBcIjIxIG1pbsWrdGVcIiwgXCIzIG1pbsWrdGVzXCIuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDEgJiYgbnVtYmVyICUgMTAwICE9PSAxMSA/IGZvcm1zWzJdIDogZm9ybXNbM107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBFLmcuIFwiMjEgbWluxat0ZXNcIiBhcyBpbiBcInDEk2MgMjEgbWluxat0ZXNcIi5cbiAgICAgICAgICAgIC8vIEUuZy4gXCIzIG1pbsWrdMSTbVwiIGFzIGluIFwicMSTYyAzIG1pbsWrdMSTbVwiLlxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAxICYmIG51bWJlciAlIDEwMCAhPT0gMTEgPyBmb3Jtc1swXSA6IGZvcm1zWzFdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIGZvcm1hdCh1bml0c1trZXldLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh1bml0c1trZXldLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVNlY29uZHMobnVtYmVyLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2Rhxb5hcyBzZWt1bmRlcycgOiAnZGHFvsSBbSBzZWt1bmTEk20nO1xuICAgIH1cblxuICAgIHZhciBsdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2x2Jywge1xuICAgICAgICBtb250aHM6ICdqYW52xIFyaXNfZmVicnXEgXJpc19tYXJ0c19hcHLEq2xpc19tYWlqc19qxatuaWpzX2rFq2xpanNfYXVndXN0c19zZXB0ZW1icmlzX29rdG9icmlzX25vdmVtYnJpc19kZWNlbWJyaXMnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnamFuX2ZlYl9tYXJfYXByX21haV9qxatuX2rFq2xfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnc3bEk3RkaWVuYV9waXJtZGllbmFfb3RyZGllbmFfdHJlxaFkaWVuYV9jZXR1cnRkaWVuYV9waWVrdGRpZW5hX3Nlc3RkaWVuYScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3ZfUF9PX1RfQ19Qa19TJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N2X1BfT19UX0NfUGtfUycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWS4nLFxuICAgICAgICAgICAgTEw6ICdZWVlZLiBbZ2FkYV0gRC4gTU1NTScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZLiBbZ2FkYV0gRC4gTU1NTSwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVkuIFtnYWRhXSBELiBNTU1NLCBkZGRkLCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW8Wgb2RpZW4gcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbUsSrdCBwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tWYWthciBwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbUGFnxIFqdcWhxIFdIGRkZGQgW3B1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3DEk2MgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3Bpcm1zICVzJyxcbiAgICAgICAgICAgIHM6IHJlbGF0aXZlU2Vjb25kcyxcbiAgICAgICAgICAgIHNzOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoOiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTTogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBsdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNb250ZW5lZ3JpbiBbbWVdXG4vLyEgYXV0aG9yIDogTWlvZHJhZyBOaWthxI0gPG1pb2RyYWdAcmVzdGFydGl0Lm1lPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taW9kcmFnbmlrYWNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0cmFuc2xhdG9yID0ge1xuICAgICAgICB3b3Jkczoge1xuICAgICAgICAgICAgLy9EaWZmZXJlbnQgZ3JhbW1hdGljYWwgY2FzZXNcbiAgICAgICAgICAgIHNzOiBbJ3Nla3VuZCcsICdzZWt1bmRhJywgJ3Nla3VuZGknXSxcbiAgICAgICAgICAgIG06IFsnamVkYW4gbWludXQnLCAnamVkbm9nIG1pbnV0YSddLFxuICAgICAgICAgICAgbW06IFsnbWludXQnLCAnbWludXRhJywgJ21pbnV0YSddLFxuICAgICAgICAgICAgaDogWydqZWRhbiBzYXQnLCAnamVkbm9nIHNhdGEnXSxcbiAgICAgICAgICAgIGhoOiBbJ3NhdCcsICdzYXRhJywgJ3NhdGknXSxcbiAgICAgICAgICAgIGRkOiBbJ2RhbicsICdkYW5hJywgJ2RhbmEnXSxcbiAgICAgICAgICAgIE1NOiBbJ21qZXNlYycsICdtamVzZWNhJywgJ21qZXNlY2knXSxcbiAgICAgICAgICAgIHl5OiBbJ2dvZGluYScsICdnb2RpbmUnLCAnZ29kaW5hJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGNvcnJlY3RHcmFtbWF0aWNhbENhc2U6IGZ1bmN0aW9uIChudW1iZXIsIHdvcmRLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgPT09IDFcbiAgICAgICAgICAgICAgICA/IHdvcmRLZXlbMF1cbiAgICAgICAgICAgICAgICA6IG51bWJlciA+PSAyICYmIG51bWJlciA8PSA0XG4gICAgICAgICAgICAgICAgICA/IHdvcmRLZXlbMV1cbiAgICAgICAgICAgICAgICAgIDogd29yZEtleVsyXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgICAgIHZhciB3b3JkS2V5ID0gdHJhbnNsYXRvci53b3Jkc1trZXldO1xuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdG9yLmNvcnJlY3RHcmFtbWF0aWNhbENhc2UobnVtYmVyLCB3b3JkS2V5KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHZhciBtZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21lJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0X2FwcmlsX21hal9qdW5fanVsX2F2Z3VzdF9zZXB0ZW1iYXJfb2t0b2Jhcl9ub3ZlbWJhcl9kZWNlbWJhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hci5fYXByLl9tYWpfanVuX2p1bF9hdmcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkamVsamFfcG9uZWRqZWxqYWtfdXRvcmFrX3NyaWplZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lZC5fcG9uLl91dG8uX3NyaS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3NyX8SNZV9wZV9zdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZGFuYXMgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tzanV0cmEgdV0gTFQnLFxuXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbbmVkamVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmlqZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3Vib3R1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbanXEjWUgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdFdlZWtEYXlzID0gW1xuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtuZWRqZWxqZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3BvbmVkamVsamthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbdXRvcmthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtzcmlqZWRlXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbxI1ldHZydGthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcGV0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXN0V2Vla0RheXNbdGhpcy5kYXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJpamUgJXMnLFxuICAgICAgICAgICAgczogJ25la29saWtvIHNla3VuZGknLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICdkYW4nLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogJ21qZXNlYycsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAnZ29kaW51JyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYW9yaSBbbWldXG4vLyEgYXV0aG9yIDogSm9obiBDb3JyaWdhbiA8cm9iYmllY2xvc2V0QGdtYWlsLmNvbT4gOiBodHRwczovL2dpdGh1Yi5jb20vam9obmlkZWFsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbWkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtaScsIHtcbiAgICAgICAgbW9udGhzOiAnS29oaS10xIF0ZV9IdWktdGFuZ3VydV9Qb3V0xastdGUtcmFuZ2lfUGFlbmdhLXdoxIF3aMSBX0hhcmF0dWFfUGlwaXJpX0jFjW5nb2luZ29pX0hlcmUtdHVyaS1rxY1rxIFfTWFodXJ1X1doaXJpbmdhLcSBLW51a3VfV2hpcmluZ2EtxIEtcmFuZ2lfSGFraWhlYScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnS29oaV9IdWlfUG91X1BhZV9IYXJhX1BpcGlfSMWNbmdvaV9IZXJlX01haHVfV2hpLW51X1doaS1yYV9IYWtpJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1JlZ2V4OiAvKD86WydhLXpcXHUwMTAxXFx1MDE0RFxcdTAxNkJdK1xcLT8pezEsM30vaSxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6IC8oPzpbJ2EtelxcdTAxMDFcXHUwMTREXFx1MDE2Ql0rXFwtPyl7MSwzfS9pLFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiAvKD86WydhLXpcXHUwMTAxXFx1MDE0RFxcdTAxNkJdK1xcLT8pezEsM30vaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogLyg/OlsnYS16XFx1MDEwMVxcdTAxNERcXHUwMTZCXStcXC0/KXsxLDJ9L2ksXG4gICAgICAgIHdlZWtkYXlzOiAnUsSBdGFwdV9NYW5lX1TFq3JlaV9XZW5lcmVpX1TEgWl0ZV9QYXJhaXJlX0jEgXRhcmVpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnVGFfTWFfVMWrX1dlX1TEgWlfUGFfSMSBJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1RhX01hX1TFq19XZV9UxIFpX1BhX0jEgScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBbaV0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtpXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2kgdGVpZSBtYWhhbmEsIGldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbYXBvcG8gaV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtpXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2luYW5haGkgaV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFt3aGFrYW11dHVuZ2EgaV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpIHJvdG8gaSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgaSBtdWEnLFxuICAgICAgICAgICAgczogJ3RlIGjEk2tvbmEgcnVhcnVhJyxcbiAgICAgICAgICAgIHNzOiAnJWQgaMSTa29uYScsXG4gICAgICAgICAgICBtOiAnaGUgbWVuZXRpJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWVuZXRpJyxcbiAgICAgICAgICAgIGg6ICd0ZSBoYW9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhhb3JhJyxcbiAgICAgICAgICAgIGQ6ICdoZSByYScsXG4gICAgICAgICAgICBkZDogJyVkIHJhJyxcbiAgICAgICAgICAgIE06ICdoZSBtYXJhbWEnLFxuICAgICAgICAgICAgTU06ICclZCBtYXJhbWEnLFxuICAgICAgICAgICAgeTogJ2hlIHRhdScsXG4gICAgICAgICAgICB5eTogJyVkIHRhdScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFjZWRvbmlhbiBbbWtdXG4vLyEgYXV0aG9yIDogQm9yaXNsYXYgTWlja292IDogaHR0cHM6Ly9naXRodWIuY29tL0IwazBcbi8vISBhdXRob3IgOiBTYXNoa28gVG9kb3JvdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ia3ljZWhcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21rJywge1xuICAgICAgICBtb250aHM6ICfRmNCw0L3Rg9Cw0YDQuF/RhNC10LLRgNGD0LDRgNC4X9C80LDRgNGCX9Cw0L/RgNC40Ltf0LzQsNGYX9GY0YPQvdC4X9GY0YPQu9C4X9Cw0LLQs9GD0YHRgl/RgdC10L/RgtC10LzQstGA0Lhf0L7QutGC0L7QvNCy0YDQuF/QvdC+0LXQvNCy0YDQuF/QtNC10LrQtdC80LLRgNC4Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9GY0LDQvV/RhNC10LJf0LzQsNGAX9Cw0L/RgF/QvNCw0Zhf0ZjRg9C9X9GY0YPQu1/QsNCy0LNf0YHQtdC/X9C+0LrRgl/QvdC+0LVf0LTQtdC6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9C90LXQtNC10LvQsF/Qv9C+0L3QtdC00LXQu9C90LjQul/QstGC0L7RgNC90LjQul/RgdGA0LXQtNCwX9GH0LXRgtCy0YDRgtC+0Lpf0L/QtdGC0L7Qul/RgdCw0LHQvtGC0LAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC10LRf0L/QvtC9X9Cy0YLQvl/RgdGA0LVf0YfQtdGCX9C/0LXRgl/RgdCw0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0L1lX9C/b1/QstGCX9GB0YBf0YfQtV/Qv9C1X9GBYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0JTQtdC90LXRgSDQstC+XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Cj0YLRgNC1INCy0L5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW9CS0L5dIGRkZGQgW9Cy0L5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JLRh9C10YDQsCDQstC+XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JjQt9C80LjQvdCw0YLQsNGC0LBdIGRkZGQgW9Cy0L5dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JjQt9C80LjQvdCw0YLQuNC+0YJdIGRkZGQgW9Cy0L5dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQt9CwICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfQv9GA0LXQtCAlcycsXG4gICAgICAgICAgICBzOiAn0L3QtdC60L7Qu9C60YMg0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgc3M6ICclZCDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBtOiAn0LXQtNC90LAg0LzQuNC90YPRgtCwJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LzQuNC90YPRgtC4JyxcbiAgICAgICAgICAgIGg6ICfQtdC00LXQvSDRh9Cw0YEnLFxuICAgICAgICAgICAgaGg6ICclZCDRh9Cw0YHQsCcsXG4gICAgICAgICAgICBkOiAn0LXQtNC10L0g0LTQtdC9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LTQtdC90LAnLFxuICAgICAgICAgICAgTTogJ9C10LTQtdC9INC80LXRgdC10YYnLFxuICAgICAgICAgICAgTU06ICclZCDQvNC10YHQtdGG0LgnLFxuICAgICAgICAgICAgeTogJ9C10LTQvdCwINCz0L7QtNC40L3QsCcsXG4gICAgICAgICAgICB5eTogJyVkINCz0L7QtNC40L3QuCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0LXQsnzQtdC9fNGC0Lh80LLQuHzRgNC4fNC80LgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGxhc3REaWdpdCA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGxhc3QyRGlnaXRzID0gbnVtYmVyICUgMTAwO1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10LInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10L0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA+IDEwICYmIGxhc3QyRGlnaXRzIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGA0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDcgfHwgbGFzdERpZ2l0ID09PSA4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LzQuCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWs7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFsYXlhbGFtIFttbF1cbi8vISBhdXRob3IgOiBGbG95ZCBQaW5rIDogaHR0cHM6Ly9naXRodWIuY29tL2Zsb3lkcGlua1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1sID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbWwnLCB7XG4gICAgICAgIG1vbnRoczogJ+C0nOC0qOC1geC0teC0sOC0v1/gtKvgtYbgtKzgtY3gtLDgtYHgtLXgtLDgtL9f4LSu4LS+4LW84LSa4LWN4LSa4LWNX+C0j+C0quC1jeC0sOC0v+C1vV/gtK7gtYfgtK/gtY1f4LSc4LWC4LW6X+C0nOC1guC0suC1iF/gtJPgtJfgtLjgtY3gtLHgtY3gtLHgtY1f4LS44LWG4LSq4LWN4LSx4LWN4LSx4LSC4LSs4LW8X+C0kuC0leC1jeC0n+C1i+C0rOC1vF/gtKjgtLXgtILgtKzgtbxf4LSh4LS/4LS44LSC4LSs4LW8Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgtJzgtKjgtYEuX+C0q+C1huC0rOC1jeC0sOC1gS5f4LSu4LS+4LW8Ll/gtI/gtKrgtY3gtLDgtL8uX+C0ruC1h+C0r+C1jV/gtJzgtYLgtbpf4LSc4LWC4LSy4LWILl/gtJPgtJcuX+C0uOC1huC0quC1jeC0seC1jeC0sS5f4LSS4LSV4LWN4LSf4LWLLl/gtKjgtLXgtIIuX+C0oeC0v+C0uOC0gi4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4LSe4LS+4LSv4LSx4LS+4LS04LWN4LSaX+C0pOC0v+C0meC1jeC0leC0s+C0vuC0tOC1jeC0ml/gtJrgtYrgtLXgtY3gtLXgtL7gtLTgtY3gtJpf4LSs4LWB4LSn4LSo4LS+4LS04LWN4LSaX+C0teC1jeC0r+C0vuC0tOC0vuC0tOC1jeC0ml/gtLXgtYbgtLPgtY3gtLPgtL/gtK/gtL7gtLTgtY3gtJpf4LS24LSo4LS/4LSv4LS+4LS04LWN4LSaJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgtJ7gtL7gtK/gtbxf4LSk4LS/4LSZ4LWN4LSV4LW+X+C0muC1iuC0teC1jeC0tV/gtKzgtYHgtKfgtbtf4LS14LWN4LSv4LS+4LS04LSCX+C0teC1huC0s+C1jeC0s+C0v1/gtLbgtKjgtL8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4LSe4LS+X+C0pOC0v1/gtJrgtYpf4LSs4LWBX+C0teC1jeC0r+C0vl/gtLXgtYZf4LS2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0gLeC0qOC1gScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MgLeC0qOC1gScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0gLeC0qOC1gScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSAt4LSo4LWBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4LSH4LSo4LWN4LSo4LWNXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C0qOC0vuC0s+C1hl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C0h+C0qOC1jeC0qOC0suC1hl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4LSV4LS04LS/4LSe4LWN4LSeXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOC0leC0tOC0v+C0nuC1jeC0nuC1jScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4LSu4LWB4LW74LSq4LWNJyxcbiAgICAgICAgICAgIHM6ICfgtIXgtb3gtKog4LSo4LS/4LSu4LS/4LS34LSZ4LWN4LSZ4LW+JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4LS44LWG4LSV4LWN4LSV4LW74LSh4LWNJyxcbiAgICAgICAgICAgIG06ICfgtJLgtLDgtYEg4LSu4LS/4LSo4LS/4LSx4LWN4LSx4LWNJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4LSu4LS/4LSo4LS/4LSx4LWN4LSx4LWNJyxcbiAgICAgICAgICAgIGg6ICfgtJLgtLDgtYEg4LSu4LSj4LS/4LSV4LWN4LSV4LWC4LW8JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4LSu4LSj4LS/4LSV4LWN4LSV4LWC4LW8JyxcbiAgICAgICAgICAgIGQ6ICfgtJLgtLDgtYEg4LSm4LS/4LS14LS44LSCJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4LSm4LS/4LS14LS44LSCJyxcbiAgICAgICAgICAgIE06ICfgtJLgtLDgtYEg4LSu4LS+4LS44LSCJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4LSu4LS+4LS44LSCJyxcbiAgICAgICAgICAgIHk6ICfgtJLgtLDgtYEg4LS14LW84LS34LSCJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4LS14LW84LS34LSCJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C0sOC0vuC0pOC1jeC0sOC0v3zgtLDgtL7gtLXgtL/gtLLgtYZ84LSJ4LSa4LWN4LSaIOC0leC0tOC0v+C0nuC1jeC0nuC1jXzgtLXgtYjgtJXgtYHgtKjgtY3gtKjgtYfgtLDgtIJ84LSw4LS+4LSk4LWN4LSw4LS/L2ksXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobWVyaWRpZW0gPT09ICfgtLDgtL7gtKTgtY3gtLDgtL8nICYmIGhvdXIgPj0gNCkgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+C0ieC0muC1jeC0miDgtJXgtLTgtL/gtJ7gtY3gtJ7gtY0nIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgtLXgtYjgtJXgtYHgtKjgtY3gtKjgtYfgtLDgtIInXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LSw4LS+4LSk4LWN4LSw4LS/JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtLDgtL7gtLXgtL/gtLLgtYYnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0ieC0muC1jeC0miDgtJXgtLTgtL/gtJ7gtY3gtJ7gtY0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0teC1iOC0leC1geC0qOC1jeC0qOC1h+C0sOC0gic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LSw4LS+4LSk4LWN4LSw4LS/JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNb25nb2xpYW4gW21uXVxuLy8hIGF1dGhvciA6IEphdmtobGFudHVncyBOeWFtZG9yaiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZraGFhbmo3XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfRhdGN0LTRhdGN0L0g0YHQtdC60YPQvdC0JyA6ICfRhdGN0LTRhdGN0L0g0YHQtdC60YPQvdC00YvQvSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDRgdC10LrRg9C90LQnIDogJyDRgdC10LrRg9C90LTRi9C9Jyk7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINC80LjQvdGD0YInIDogJyDQvNC40L3Rg9GC0YvQvScpO1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDRhtCw0LMnIDogJyDRhtCw0LPQuNC50L0nKTtcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg06nQtNOp0YAnIDogJyDTqdC00YDQuNC50L0nKTtcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg0YHQsNGAJyA6ICcg0YHQsNGA0YvQvScpO1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDQttC40LsnIDogJyDQttC40LvQuNC50L0nKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21uJywge1xuICAgICAgICBtb250aHM6ICfQndGN0LPQtNKv0LPRjdGN0YAg0YHQsNGAX9Cl0L7RkdGA0LTRg9Cz0LDQsNGAINGB0LDRgF/Qk9GD0YDQsNCy0LTRg9Cz0LDQsNGAINGB0LDRgF/QlNOp0YDTqdCy0LTSr9Cz0Y3RjdGAINGB0LDRgF/QotCw0LLQtNGD0LPQsNCw0YAg0YHQsNGAX9CX0YPRgNCz0LDQtNGD0LPQsNCw0YAg0YHQsNGAX9CU0L7Qu9C00YPQs9Cw0LDRgCDRgdCw0YBf0J3QsNC50LzQtNGD0LPQsNCw0YAg0YHQsNGAX9CV0YHQtNKv0LPRjdGN0YAg0YHQsNGAX9CQ0YDQsNCy0LTRg9Cz0LDQsNGAINGB0LDRgF/QkNGA0LLQsNC9INC90Y3Qs9C00q/Qs9GN0Y3RgCDRgdCw0YBf0JDRgNCy0LDQvSDRhdC+0ZHRgNC00YPQs9Cw0LDRgCDRgdCw0YAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJzEg0YHQsNGAXzIg0YHQsNGAXzMg0YHQsNGAXzQg0YHQsNGAXzUg0YHQsNGAXzYg0YHQsNGAXzcg0YHQsNGAXzgg0YHQsNGAXzkg0YHQsNGAXzEwINGB0LDRgF8xMSDRgdCw0YBfMTIg0YHQsNGAJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn0J3Rj9C8X9CU0LDQstCw0LBf0JzRj9Cz0LzQsNGAX9Cb0YXQsNCz0LLQsF/Qn9Kv0YDRjdCyX9CR0LDQsNGB0LDQvV/QkdGP0LzQsdCwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0J3Rj9C8X9CU0LDQsl/QnNGP0LNf0JvRhdCwX9Cf0q/RgF/QkdCw0LBf0JHRj9C8Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9Cd0Y9f0JTQsF/QnNGPX9Cb0YVf0J/Sr1/QkdCwX9CR0Y8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZINC+0L3RiyBNTU1N0YvQvSBEJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkg0L7QvdGLIE1NTU3Ri9C9IEQgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIFlZWVkg0L7QvdGLIE1NTU3Ri9C9IEQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0q7TqHzSrtClL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn0q7QpSc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfSrtOoJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfSrtClJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb06jQvdOp06nQtNOp0YBdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0JzQsNGA0LPQsNCw0YhdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW9CY0YDRjdGFXSBkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb06jRh9C40LPQtNOp0YBdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9Oo0L3Qs9Op0YDRgdOp0L1dIGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDQtNCw0YDQsNCwJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDTqdC80L3TqScsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSDTqdC006nRgC8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDTqdC006nRgCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYXJhdGhpIFttcl1cbi8vISBhdXRob3IgOiBIYXJzaGFkIEthbGUgOiBodHRwczovL2dpdGh1Yi5jb20va2FsZWh2XG4vLyEgYXV0aG9yIDogVml2ZWsgQXRoYWx5ZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS92bmF0aGFseWVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KWnJyxcbiAgICAgICAgICAgIDI6ICfgpagnLFxuICAgICAgICAgICAgMzogJ+ClqScsXG4gICAgICAgICAgICA0OiAn4KWqJyxcbiAgICAgICAgICAgIDU6ICfgpasnLFxuICAgICAgICAgICAgNjogJ+ClrCcsXG4gICAgICAgICAgICA3OiAn4KWtJyxcbiAgICAgICAgICAgIDg6ICfgpa4nLFxuICAgICAgICAgICAgOTogJ+ClrycsXG4gICAgICAgICAgICAwOiAn4KWmJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Clpyc6ICcxJyxcbiAgICAgICAgICAgICfgpagnOiAnMicsXG4gICAgICAgICAgICAn4KWpJzogJzMnLFxuICAgICAgICAgICAgJ+Clqic6ICc0JyxcbiAgICAgICAgICAgICfgpasnOiAnNScsXG4gICAgICAgICAgICAn4KWsJzogJzYnLFxuICAgICAgICAgICAgJ+ClrSc6ICc3JyxcbiAgICAgICAgICAgICfgpa4nOiAnOCcsXG4gICAgICAgICAgICAn4KWvJzogJzknLFxuICAgICAgICAgICAgJ+Clpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZU1yKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gJyc7XG4gICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHN0cmluZykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSV4KS+4KS54KWAIOCkuOClh+CkleCkguCkpic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkuOClh+CkleCkguCkpic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSVIOCkruCkv+CkqOCkv+Cknyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkruCkv+CkqOCkv+Ckn+Clhyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSVIOCkpOCkvuCkuCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkpOCkvuCkuCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSVIOCkpuCkv+CkteCkuCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkpuCkv+CkteCkuCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSVIOCkruCkueCkv+CkqOCkvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkruCkueCkv+CkqOClhyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSVIOCkteCksOCljeCktyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkteCksOCljeCkt+Clhyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoIChzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+CkleCkvuCkueClgCDgpLjgpYfgpJXgpILgpKbgpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpLjgpYfgpJXgpILgpKbgpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CkleCkviDgpK7gpL/gpKjgpL/gpJ/gpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpK7gpL/gpKjgpL/gpJ/gpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CkleCkviDgpKTgpL7gpLjgpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpKTgpL7gpLjgpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CkleCkviDgpKbgpL/gpLXgpLjgpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpKbgpL/gpLXgpLjgpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CkleCkviDgpK7gpLngpL/gpKjgpY3gpK/gpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpK7gpLngpL/gpKjgpY3gpK/gpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CkleCkviDgpLXgpLDgpY3gpLfgpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpLXgpLDgpY3gpLfgpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgfVxuXG4gICAgdmFyIG1yID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbXInLCB7XG4gICAgICAgIG1vbnRoczogJ+CknOCkvuCkqOClh+CkteCkvuCksOClgF/gpKvgpYfgpKzgpY3gpLDgpYHgpLXgpL7gpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+Ckj+CkquCljeCksOCkv+Cksl/gpK7gpYdf4KSc4KWC4KSoX+CknOClgeCksuCliF/gpJHgpJfgpLjgpY3gpJ9f4KS44KSq4KWN4KSf4KWH4KSC4KSs4KSwX+CkkeCkleCljeCkn+Cli+CkrOCksF/gpKjgpYvgpLXgpY3gpLngpYfgpILgpKzgpLBf4KSh4KS/4KS44KWH4KSC4KSs4KSwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgpJzgpL7gpKjgpYcuX+Ckq+Clh+CkrOCljeCksOClgS5f4KSu4KS+4KSw4KWN4KSaLl/gpI/gpKrgpY3gpLDgpL8uX+CkruClhy5f4KSc4KWC4KSoLl/gpJzgpYHgpLLgpYguX+CkkeCkly5f4KS44KSq4KWN4KSf4KWH4KSCLl/gpJHgpJXgpY3gpJ/gpYsuX+CkqOCli+CkteCljeCkueClh+Ckgi5f4KSh4KS/4KS44KWH4KSCLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+CksOCkteCkv+CkteCkvuCksF/gpLjgpYvgpK7gpLXgpL7gpLBf4KSu4KSC4KSX4KSz4KS14KS+4KSwX+CkrOClgeCkp+CkteCkvuCksF/gpJfgpYHgpLDgpYLgpLXgpL7gpLBf4KS24KWB4KSV4KWN4KSw4KS14KS+4KSwX+CktuCkqOCkv+CkteCkvuCksCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CksOCkteCkv1/gpLjgpYvgpK5f4KSu4KSC4KSX4KSzX+CkrOClgeCkp1/gpJfgpYHgpLDgpYJf4KS24KWB4KSV4KWN4KSwX+CktuCkqOCkvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgpLBf4KS44KWLX+CkruCkgl/gpKzgpYFf4KSX4KWBX+CktuClgV/gpLYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgpLXgpL7gpJzgpKTgpL4nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCkteCkvuCknOCkpOCkvicsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4KS14KS+4KSc4KSk4KS+JyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCkteCkvuCknOCkpOCkvicsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpIngpKbgpY3gpK/gpL5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgpJXgpL7gpLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CkruCkvuCkl+ClgOCksl0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+CkruCkp+CljeCkr+ClhycsXG4gICAgICAgICAgICBwYXN0OiAnJXPgpKrgpYLgpLDgpY3gpLXgpYAnLFxuICAgICAgICAgICAgczogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBzczogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBtOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIGg6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgZDogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBNOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIHk6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWv4KWmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4KSq4KS54KS+4KSf4KWHfOCkuOCkleCkvuCks+ClgHzgpKbgpYHgpKrgpL7gpLDgpYB84KS44KS+4KSv4KSC4KSV4KS+4KSz4KWAfOCksOCkvuCkpOCljeCksOClgC8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CkquCkueCkvuCkn+ClhycgfHwgbWVyaWRpZW0gPT09ICfgpLjgpJXgpL7gpLPgpYAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4KSm4KWB4KSq4KS+4KSw4KWAJyB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4KS44KS+4KSv4KSC4KSV4KS+4KSz4KWAJyB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4KSw4KS+4KSk4KWN4KSw4KWAJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTIgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPj0gMCAmJiBob3VyIDwgNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSq4KS54KS+4KSf4KWHJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpJXgpL7gpLPgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuClgeCkquCkvuCksOClgCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KS+4KSv4KSC4KSV4KS+4KSz4KWAJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpY3gpLDgpYAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbXI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFsYXkgW21zLW15XVxuLy8hIG5vdGUgOiBERVBSRUNBVEVELCB0aGUgY29ycmVjdCBvbmUgaXMgW21zXVxuLy8hIGF1dGhvciA6IFdlbGRhbiBKYW1pbGkgOiBodHRwczovL2dpdGh1Yi5jb20vd2VsZGFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbXNNeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21zLW15Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hY19BcHJpbF9NZWlfSnVuX0p1bGFpX09nb3NfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGlzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYWNfQXByX01laV9KdW5fSnVsX09nc19TZXBfT2t0X05vdl9EaXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnQWhhZF9Jc25pbl9TZWxhc2FfUmFidV9LaGFtaXNfSnVtYWF0X1NhYnR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQWhkX0lzbl9TZWxfUmFiX0toYV9KdW1fU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0FoX0lzX1NsX1JiX0ttX0ptX1NiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvcGFnaXx0ZW5nYWhhcml8cGV0YW5nfG1hbGFtLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAncGFnaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICd0ZW5nYWhhcmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3BldGFuZycgfHwgbWVyaWRpZW0gPT09ICdtYWxhbScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGFnaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RlbmdhaGFyaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BldGFuZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbWFsYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIYXJpIGluaSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tFc29rIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3B1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0tlbG1hcmluIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2xlcGFzIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbGFtICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB5YW5nIGxlcGFzJyxcbiAgICAgICAgICAgIHM6ICdiZWJlcmFwYSBzYWF0JyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBtOiAnc2VtaW5pdCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbml0JyxcbiAgICAgICAgICAgIGg6ICdzZWphbScsXG4gICAgICAgICAgICBoaDogJyVkIGphbScsXG4gICAgICAgICAgICBkOiAnc2VoYXJpJyxcbiAgICAgICAgICAgIGRkOiAnJWQgaGFyaScsXG4gICAgICAgICAgICBNOiAnc2VidWxhbicsXG4gICAgICAgICAgICBNTTogJyVkIGJ1bGFuJyxcbiAgICAgICAgICAgIHk6ICdzZXRhaHVuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGFodW4nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbXNNeTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWxheSBbbXNdXG4vLyEgYXV0aG9yIDogV2VsZGFuIEphbWlsaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS93ZWxkYW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21zJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hY19BcHJpbF9NZWlfSnVuX0p1bGFpX09nb3NfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGlzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYWNfQXByX01laV9KdW5fSnVsX09nc19TZXBfT2t0X05vdl9EaXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnQWhhZF9Jc25pbl9TZWxhc2FfUmFidV9LaGFtaXNfSnVtYWF0X1NhYnR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQWhkX0lzbl9TZWxfUmFiX0toYV9KdW1fU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0FoX0lzX1NsX1JiX0ttX0ptX1NiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvcGFnaXx0ZW5nYWhhcml8cGV0YW5nfG1hbGFtLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAncGFnaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICd0ZW5nYWhhcmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3BldGFuZycgfHwgbWVyaWRpZW0gPT09ICdtYWxhbScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGFnaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RlbmdhaGFyaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BldGFuZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbWFsYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIYXJpIGluaSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tFc29rIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3B1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0tlbG1hcmluIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2xlcGFzIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbGFtICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB5YW5nIGxlcGFzJyxcbiAgICAgICAgICAgIHM6ICdiZWJlcmFwYSBzYWF0JyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBtOiAnc2VtaW5pdCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbml0JyxcbiAgICAgICAgICAgIGg6ICdzZWphbScsXG4gICAgICAgICAgICBoaDogJyVkIGphbScsXG4gICAgICAgICAgICBkOiAnc2VoYXJpJyxcbiAgICAgICAgICAgIGRkOiAnJWQgaGFyaScsXG4gICAgICAgICAgICBNOiAnc2VidWxhbicsXG4gICAgICAgICAgICBNTTogJyVkIGJ1bGFuJyxcbiAgICAgICAgICAgIHk6ICdzZXRhaHVuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGFodW4nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbXM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFsdGVzZSAoTWFsdGEpIFttdF1cbi8vISBhdXRob3IgOiBBbGVzc2FuZHJvIE1hcnVjY2lhIDogaHR0cHM6Ly9naXRodWIuY29tL2FsZXNtYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG10ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbXQnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbm5hcl9GcmFyX01hcnp1X0FwcmlsX01lamp1X8SgdW5qdV9MdWxqdV9Bd3dpc3N1X1NldHRlbWJydV9PdHR1YnJ1X05vdmVtYnJ1X0RpxItlbWJydScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRnJhX01hcl9BcHJfTWVqX8SgdW5fTHVsX0F3d19TZXRfT3R0X05vdl9EacSLJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdJbC3EpmFkZF9JdC1UbmVqbl9JdC1UbGlldGFfTC1FcmJnxKdhX0lsLcSmYW1pc19JbC3EoGltZ8SnYV9Jcy1TaWJ0Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfEpmFkX1RuZV9UbGlfRXJiX8SmYW1fxKBpbV9TaWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnxKZhX1RuX1RsX0VyX8SmYV/EoGlfU2knLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSWxsdW0gZmlsLV1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0fEp2FkYSBmaWwtXUxUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZmlsLV1MVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0lsLWJpZXJhxKcgZmlsLV1MVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2xpIGfEp2FkZGFdIFtmaWwtXUxUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZuKAmSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgaWx1JyxcbiAgICAgICAgICAgIHM6ICdmdGl0IHNla29uZGknLFxuICAgICAgICAgICAgc3M6ICclZCBzZWtvbmRpJyxcbiAgICAgICAgICAgIG06ICdtaW51dGEnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGknLFxuICAgICAgICAgICAgaDogJ3NpZWfEp2EnLFxuICAgICAgICAgICAgaGg6ICclZCBzaWVnxKdhdCcsXG4gICAgICAgICAgICBkOiAnxKF1cm5hdGEnLFxuICAgICAgICAgICAgZGQ6ICclZCDEoXJhbmV0JyxcbiAgICAgICAgICAgIE06ICd4YWhhcicsXG4gICAgICAgICAgICBNTTogJyVkIHhodXInLFxuICAgICAgICAgICAgeTogJ3NlbmEnLFxuICAgICAgICAgICAgeXk6ICclZCBzbmknLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG10O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJ1cm1lc2UgW215XVxuLy8hIGF1dGhvciA6IFNxdWFyIHRlYW0sIG15c3F1YXIuY29tXG4vLyEgYXV0aG9yIDogRGF2aWQgUm9zc2VsbGF0IDogaHR0cHM6Ly9naXRodWIuY29tL2dob2xhZHJcbi8vISBhdXRob3IgOiBUaW4gQXVuZyBMaW4gOiBodHRwczovL2dpdGh1Yi5jb20vdGhhbnlhd3ppbm1pblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfhgYEnLFxuICAgICAgICAgICAgMjogJ+GBgicsXG4gICAgICAgICAgICAzOiAn4YGDJyxcbiAgICAgICAgICAgIDQ6ICfhgYQnLFxuICAgICAgICAgICAgNTogJ+GBhScsXG4gICAgICAgICAgICA2OiAn4YGGJyxcbiAgICAgICAgICAgIDc6ICfhgYcnLFxuICAgICAgICAgICAgODogJ+GBiCcsXG4gICAgICAgICAgICA5OiAn4YGJJyxcbiAgICAgICAgICAgIDA6ICfhgYAnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4YGBJzogJzEnLFxuICAgICAgICAgICAgJ+GBgic6ICcyJyxcbiAgICAgICAgICAgICfhgYMnOiAnMycsXG4gICAgICAgICAgICAn4YGEJzogJzQnLFxuICAgICAgICAgICAgJ+GBhSc6ICc1JyxcbiAgICAgICAgICAgICfhgYYnOiAnNicsXG4gICAgICAgICAgICAn4YGHJzogJzcnLFxuICAgICAgICAgICAgJ+GBiCc6ICc4JyxcbiAgICAgICAgICAgICfhgYknOiAnOScsXG4gICAgICAgICAgICAn4YGAJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIG15ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbXknLCB7XG4gICAgICAgIG1vbnRoczogJ+GAh+GAlOGAuuGAlOGAneGAq+GAm+GArl/hgJbhgLHhgJbhgLHhgKzhgLrhgJ3hgKvhgJvhgK5f4YCZ4YCQ4YC6X+GAp+GAleGAvOGArl/hgJnhgLFf4YCH4YC94YCU4YC6X+GAh+GAsOGAnOGAreGAr+GAhOGAul/hgJ7hgLzhgILhgK/hgJDhgLpf4YCF4YCA4YC64YCQ4YCE4YC64YCY4YCsX+GAoeGAseGArOGAgOGAuuGAkOGAreGAr+GAmOGArF/hgJThgK3hgK/hgJ3hgIThgLrhgJjhgKxf4YCS4YCu4YCH4YCE4YC64YCY4YCsJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ+GAh+GAlOGAul/hgJbhgLFf4YCZ4YCQ4YC6X+GAleGAvOGArl/hgJnhgLFf4YCH4YC94YCU4YC6X+GAnOGAreGAr+GAhOGAul/hgJ7hgLxf4YCF4YCA4YC6X+GAoeGAseGArOGAgOGAul/hgJThgK3hgK9f4YCS4YCuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ+GAkOGAlOGAhOGAuuGAueGAguGAlOGAveGAsV/hgJDhgJThgIThgLrhgLnhgJzhgKxf4YCh4YCE4YC64YC54YCC4YCrX+GAl+GAr+GAkuGAueGAk+GAn+GAsOGAuF/hgIDhgLzhgKzhgJ7hgJXhgJDhgLHhgLhf4YCe4YCx4YCs4YCA4YC84YCsX+GAheGAlOGAsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+GAlOGAveGAsV/hgJzhgKxf4YCC4YCrX+GAn+GAsOGAuF/hgIDhgLzhgKxf4YCe4YCx4YCsX+GAlOGAsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfhgJThgL3hgLFf4YCc4YCsX+GAguGAq1/hgJ/hgLDhgLhf4YCA4YC84YCsX+GAnuGAseGArF/hgJThgLEnLnNwbGl0KCdfJyksXG5cbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+GAmuGAlOGAsS5dIExUIFvhgJnhgL7hgKxdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4YCZ4YCU4YCA4YC64YCW4YC84YCU4YC6XSBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vhgJnhgJThgLEu4YCAXSBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vhgJXhgLzhgK7hgLjhgIHhgLLhgLfhgJ7hgLHhgKxdIGRkZGQgTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfhgJzhgKzhgJnhgIrhgLrhgLcgJXMg4YCZ4YC+4YCsJyxcbiAgICAgICAgICAgIHBhc3Q6ICfhgJzhgL3hgJThgLrhgIHhgLLhgLfhgJ7hgLHhgKwgJXMg4YCAJyxcbiAgICAgICAgICAgIHM6ICfhgIXhgIDhgLnhgIDhgJThgLou4YCh4YCU4YCK4YC64YC44YCE4YCa4YC6JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4YCF4YCA4YC54YCA4YCU4YC34YC6JyxcbiAgICAgICAgICAgIG06ICfhgJDhgIXhgLrhgJnhgK3hgJThgIXhgLonLFxuICAgICAgICAgICAgbW06ICclZCDhgJnhgK3hgJThgIXhgLonLFxuICAgICAgICAgICAgaDogJ+GAkOGAheGAuuGAlOGArOGAm+GAricsXG4gICAgICAgICAgICBoaDogJyVkIOGAlOGArOGAm+GAricsXG4gICAgICAgICAgICBkOiAn4YCQ4YCF4YC64YCb4YCA4YC6JyxcbiAgICAgICAgICAgIGRkOiAnJWQg4YCb4YCA4YC6JyxcbiAgICAgICAgICAgIE06ICfhgJDhgIXhgLrhgJwnLFxuICAgICAgICAgICAgTU06ICclZCDhgJwnLFxuICAgICAgICAgICAgeTogJ+GAkOGAheGAuuGAlOGAvuGAheGAuicsXG4gICAgICAgICAgICB5eTogJyVkIOGAlOGAvuGAheGAuicsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vhgYHhgYLhgYPhgYThgYXhgYbhgYfhgYjhgYnhgYBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBteTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBOb3J3ZWdpYW4gQm9rbcOlbCBbbmJdXG4vLyEgYXV0aG9ycyA6IEVzcGVuIEhvdmxhbmRzZGFsIDogaHR0cHM6Ly9naXRodWIuY29tL3JleHhhcnNcbi8vISAgICAgICAgICAgU2lndXJkIEdhcnRtYW5uIDogaHR0cHM6Ly9naXRodWIuY29tL3NpZ3VyZGdhXG4vLyEgICAgICAgICAgIFN0ZXBoZW4gUmFtdGh1biA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdGVwaGVucmFtdGh1blxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG5iID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbmInLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnNfYXByaWxfbWFpX2p1bmlfanVsaV9hdWd1c3Rfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tYXJzX2Fwci5fbWFpX2p1bmlfanVsaV9hdWcuX3NlcC5fb2t0Ll9ub3YuX2Rlcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnc8O4bmRhZ19tYW5kYWdfdGlyc2RhZ19vbnNkYWdfdG9yc2RhZ19mcmVkYWdfbMO4cmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3PDuC5fbWEuX3RpLl9vbi5fdG8uX2ZyLl9sw7guJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3PDuF9tYV90aV9vbl90b19mcl9sw7gnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQuIE1NTU0gWVlZWSBba2wuXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2kgZGFnIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tpIG1vcmdlbiBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2kgZ8OlciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2ZvcnJpZ2VdIGRkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgc2lkZW4nLFxuICAgICAgICAgICAgczogJ25vZW4gc2VrdW5kZXInLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRlcicsXG4gICAgICAgICAgICBtOiAnZXR0IG1pbnV0dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dGVyJyxcbiAgICAgICAgICAgIGg6ICfDqW4gdGltZScsXG4gICAgICAgICAgICBoaDogJyVkIHRpbWVyJyxcbiAgICAgICAgICAgIGQ6ICfDqW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnZXInLFxuICAgICAgICAgICAgdzogJ8OpbiB1a2UnLFxuICAgICAgICAgICAgd3c6ICclZCB1a2VyJyxcbiAgICAgICAgICAgIE06ICfDqW4gbcOlbmVkJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOlbmVkZXInLFxuICAgICAgICAgICAgeTogJ2V0dCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5iO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE5lcGFsZXNlIFtuZV1cbi8vISBhdXRob3IgOiBzdXZhc2ggOiBodHRwczovL2dpdGh1Yi5jb20vc3V2YXNoXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+ClpycsXG4gICAgICAgICAgICAyOiAn4KWoJyxcbiAgICAgICAgICAgIDM6ICfgpaknLFxuICAgICAgICAgICAgNDogJ+ClqicsXG4gICAgICAgICAgICA1OiAn4KWrJyxcbiAgICAgICAgICAgIDY6ICfgpawnLFxuICAgICAgICAgICAgNzogJ+ClrScsXG4gICAgICAgICAgICA4OiAn4KWuJyxcbiAgICAgICAgICAgIDk6ICfgpa8nLFxuICAgICAgICAgICAgMDogJ+ClpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgpacnOiAnMScsXG4gICAgICAgICAgICAn4KWoJzogJzInLFxuICAgICAgICAgICAgJ+ClqSc6ICczJyxcbiAgICAgICAgICAgICfgpaonOiAnNCcsXG4gICAgICAgICAgICAn4KWrJzogJzUnLFxuICAgICAgICAgICAgJ+ClrCc6ICc2JyxcbiAgICAgICAgICAgICfgpa0nOiAnNycsXG4gICAgICAgICAgICAn4KWuJzogJzgnLFxuICAgICAgICAgICAgJ+Clryc6ICc5JyxcbiAgICAgICAgICAgICfgpaYnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgbmUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCduZScsIHtcbiAgICAgICAgbW9udGhzOiAn4KSc4KSo4KS14KSw4KWAX+Ckq+Clh+CkrOCljeCksOClgeCkteCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KS/4KSyX+CkruCkiF/gpJzgpYHgpKhf4KSc4KWB4KSy4KS+4KSIX+CkheCkl+Ckt+CljeCkn1/gpLjgpYfgpKrgpY3gpJ/gpYfgpK7gpY3gpKzgpLBf4KSF4KSV4KWN4KSf4KWL4KSs4KSwX+CkqOCli+CkreClh+CkruCljeCkrOCksF/gpKHgpL/gpLjgpYfgpK7gpY3gpKzgpLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CknOCkqC5f4KSr4KWH4KSs4KWN4KSw4KWBLl/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KS/Ll/gpK7gpIhf4KSc4KWB4KSoX+CknOClgeCksuCkvuCkiC5f4KSF4KSXLl/gpLjgpYfgpKrgpY3gpJ8uX+CkheCkleCljeCkn+Cliy5f4KSo4KWL4KSt4KWHLl/gpKHgpL/gpLjgpYcuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4KSG4KSH4KSk4KSs4KS+4KSwX+CkuOCli+CkruCkrOCkvuCksF/gpK7gpJngpY3gpJfgpLLgpKzgpL7gpLBf4KSs4KWB4KSn4KSs4KS+4KSwX+CkrOCkv+CkueCkv+CkrOCkvuCksF/gpLbgpYHgpJXgpY3gpLDgpKzgpL7gpLBf4KS24KSo4KS/4KSs4KS+4KSwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4KSG4KSH4KSkLl/gpLjgpYvgpK4uX+CkruCkmeCljeCkl+Cksi5f4KSs4KWB4KSnLl/gpKzgpL/gpLngpL8uX+CktuClgeCkleCljeCksC5f4KS24KSo4KS/Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgpIYuX+CkuOCliy5f4KSu4KSCLl/gpKzgpYEuX+CkrOCkvy5f4KS24KWBLl/gpLYuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0HgpJXgpYsgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTFRTOiAnQeCkleCliyBoOm1tOnNzIOCkrOCknOClhycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBB4KSV4KWLIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQeCkleCliyBoOm1tIOCkrOCknOClhycsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgpafgpajgpangpargpavgpazgpa3gpa7gpa/gpaZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gpLDgpL7gpKTgpL984KSs4KS/4KS54KS+4KSofOCkpuCkv+CkieCkgeCkuOCli3zgpLjgpL7gpIHgpJ0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgpLDgpL7gpKTgpL8nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKzgpL/gpLngpL7gpKgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KSm4KS/4KSJ4KSB4KS44KWLJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLjgpL7gpIHgpJ0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSk4KS/JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKzgpL/gpLngpL7gpKgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuCkv+CkieCkgeCkuOCliyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KS+4KSB4KSdJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpL8nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpIbgpJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KSt4KWL4KSy4KS/XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vgpIbgpIngpIHgpKbgpYtdIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgpLngpL/gpJzgpYtdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Ckl+Ckj+CkleCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz4KSu4KS+JyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgpIXgpJfgpL7gpKHgpL8nLFxuICAgICAgICAgICAgczogJ+CkleClh+CkueClgCDgpJXgpY3gpLfgpKMnLFxuICAgICAgICAgICAgc3M6ICclZCDgpLjgpYfgpJXgpYfgpKPgpY3gpKEnLFxuICAgICAgICAgICAgbTogJ+Ckj+CklSDgpK7gpL/gpKjgpYfgpJ8nLFxuICAgICAgICAgICAgbW06ICclZCDgpK7gpL/gpKjgpYfgpJ8nLFxuICAgICAgICAgICAgaDogJ+Ckj+CklSDgpJjgpKPgpY3gpJ/gpL4nLFxuICAgICAgICAgICAgaGg6ICclZCDgpJjgpKPgpY3gpJ/gpL4nLFxuICAgICAgICAgICAgZDogJ+Ckj+CklSDgpKbgpL/gpKgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgpKbgpL/gpKgnLFxuICAgICAgICAgICAgTTogJ+Ckj+CklSDgpK7gpLngpL/gpKjgpL4nLFxuICAgICAgICAgICAgTU06ICclZCDgpK7gpLngpL/gpKjgpL4nLFxuICAgICAgICAgICAgeTogJ+Ckj+CklSDgpKzgpLDgpY3gpLcnLFxuICAgICAgICAgICAgeXk6ICclZCDgpKzgpLDgpY3gpLcnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRHV0Y2ggKEJlbGdpdW0pIFtubC1iZV1cbi8vISBhdXRob3IgOiBKb3JpcyBSw7ZsaW5nIDogaHR0cHM6Ly9naXRodWIuY29tL2pvcmlzcm9saW5nXG4vLyEgYXV0aG9yIDogSmFjb2IgTWlkZGFnIDogaHR0cHM6Ly9naXRodWIuY29tL21pZGRhZ2pcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydFdpdGhEb3RzID1cbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbXJ0Ll9hcHIuX21laV9qdW4uX2p1bC5fYXVnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydFdpdGhvdXREb3RzID1cbiAgICAgICAgICAgICdqYW5fZmViX21ydF9hcHJfbWVpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmphbi9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9eKG1hYXJ0fG1ydFxcLj8pJC9pLFxuICAgICAgICAgICAgL15hcHIvaSxcbiAgICAgICAgICAgIC9ebWVpJC9pLFxuICAgICAgICAgICAgL15qdW5baS5dPyQvaSxcbiAgICAgICAgICAgIC9eanVsW2kuXT8kL2ksXG4gICAgICAgICAgICAvXmF1Zy9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2t0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kZWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcnxqYW5cXC4/fGZlYlxcLj98bXJ0XFwuP3xhcHJcXC4/fGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pO1xuXG4gICAgdmFyIG5sQmUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdubC1iZScsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyaV9mZWJydWFyaV9tYWFydF9hcHJpbF9tZWlfanVuaV9qdWxpX2F1Z3VzdHVzX3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aG91dERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGphbnVhcml8ZmVicnVhcml8bWFhcnR8YXByaWx8bWVpfGp1W25sXWl8YXVndXN0dXN8c2VwdGVtYmVyfG9rdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihqYW5cXC4/fGZlYlxcLj98bXJ0XFwuP3xhcHJcXC4/fG1laXxqdVtubF1cXC4/fGF1Z1xcLj98c2VwXFwuP3xva3RcXC4/fG5vdlxcLj98ZGVjXFwuPykvaSxcblxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3pvbmRhZ19tYWFuZGFnX2RpbnNkYWdfd29lbnNkYWdfZG9uZGVyZGFnX3ZyaWpkYWdfemF0ZXJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICd6by5fbWEuX2RpLl93by5fZG8uX3ZyLl96YS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnem9fbWFfZGlfd29fZG9fdnJfemEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW3ZhbmRhYWcgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dpc3RlcmVuIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1thZmdlbG9wZW5dIGRkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ292ZXIgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGdlbGVkZW4nLFxuICAgICAgICAgICAgczogJ2VlbiBwYWFyIHNlY29uZGVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kZW4nLFxuICAgICAgICAgICAgbTogJ8Opw6luIG1pbnV1dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZW4nLFxuICAgICAgICAgICAgaDogJ8Opw6luIHV1cicsXG4gICAgICAgICAgICBoaDogJyVkIHV1cicsXG4gICAgICAgICAgICBkOiAnw6nDqW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnZW4nLFxuICAgICAgICAgICAgTTogJ8Opw6luIG1hYW5kJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWFhbmRlbicsXG4gICAgICAgICAgICB5OiAnw6nDqW4gamFhcicsXG4gICAgICAgICAgICB5eTogJyVkIGphYXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICtcbiAgICAgICAgICAgICAgICAobnVtYmVyID09PSAxIHx8IG51bWJlciA9PT0gOCB8fCBudW1iZXIgPj0gMjAgPyAnc3RlJyA6ICdkZScpXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmxCZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBEdXRjaCBbbmxdXG4vLyEgYXV0aG9yIDogSm9yaXMgUsO2bGluZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3Jpc3JvbGluZ1xuLy8hIGF1dGhvciA6IEphY29iIE1pZGRhZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWRkYWdqXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnRXaXRoRG90cyA9XG4gICAgICAgICAgICAnamFuLl9mZWIuX21ydC5fYXByLl9tZWlfanVuLl9qdWwuX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnRXaXRob3V0RG90cyA9XG4gICAgICAgICAgICAnamFuX2ZlYl9tcnRfYXByX21laV9qdW5fanVsX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15qYW4vaSxcbiAgICAgICAgICAgIC9eZmViL2ksXG4gICAgICAgICAgICAvXihtYWFydHxtcnRcXC4/KSQvaSxcbiAgICAgICAgICAgIC9eYXByL2ksXG4gICAgICAgICAgICAvXm1laSQvaSxcbiAgICAgICAgICAgIC9eanVuW2kuXT8kL2ksXG4gICAgICAgICAgICAvXmp1bFtpLl0/JC9pLFxuICAgICAgICAgICAgL15hdWcvaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9rdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGVjL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGphbnVhcml8ZmVicnVhcml8bWFhcnR8YXByaWx8bWVpfGp1W25sXWl8YXVndXN0dXN8c2VwdGVtYmVyfG9rdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXJ8amFuXFwuP3xmZWJcXC4/fG1ydFxcLj98YXByXFwuP3xqdVtubF1cXC4/fGF1Z1xcLj98c2VwXFwuP3xva3RcXC4/fG5vdlxcLj98ZGVjXFwuPykvaTtcblxuICAgIHZhciBubCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25sJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJpX2ZlYnJ1YXJpX21hYXJ0X2FwcmlsX21laV9qdW5pX2p1bGlfYXVndXN0dXNfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRob3V0RG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcikvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98bWVpfGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG5cbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnem9uZGFnX21hYW5kYWdfZGluc2RhZ193b2Vuc2RhZ19kb25kZXJkYWdfdnJpamRhZ196YXRlcmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3pvLl9tYS5fZGkuX3dvLl9kby5fdnIuX3phLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICd6b19tYV9kaV93b19kb192cl96YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbdmFuZGFhZyBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb3JnZW4gb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZ2lzdGVyZW4gb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2FmZ2Vsb3Blbl0gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb3ZlciAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgZ2VsZWRlbicsXG4gICAgICAgICAgICBzOiAnZWVuIHBhYXIgc2Vjb25kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlbicsXG4gICAgICAgICAgICBtOiAnw6nDqW4gbWludXV0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlbicsXG4gICAgICAgICAgICBoOiAnw6nDqW4gdXVyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdXVyJyxcbiAgICAgICAgICAgIGQ6ICfDqcOpbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlbicsXG4gICAgICAgICAgICB3OiAnw6nDqW4gd2VlaycsXG4gICAgICAgICAgICB3dzogJyVkIHdla2VuJyxcbiAgICAgICAgICAgIE06ICfDqcOpbiBtYWFuZCcsXG4gICAgICAgICAgICBNTTogJyVkIG1hYW5kZW4nLFxuICAgICAgICAgICAgeTogJ8Opw6luIGphYXInLFxuICAgICAgICAgICAgeXk6ICclZCBqYWFyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0ZXxkZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIG51bWJlciArXG4gICAgICAgICAgICAgICAgKG51bWJlciA9PT0gMSB8fCBudW1iZXIgPT09IDggfHwgbnVtYmVyID49IDIwID8gJ3N0ZScgOiAnZGUnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5sO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE55bm9yc2sgW25uXVxuLy8hIGF1dGhvcnMgOiBodHRwczovL2dpdGh1Yi5jb20vbWVjaHV3aW5kXG4vLyEgICAgICAgICAgIFN0ZXBoZW4gUmFtdGh1biA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdGVwaGVucmFtdGh1blxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG5uID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbm4nLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnNfYXByaWxfbWFpX2p1bmlfanVsaV9hdWd1c3Rfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tYXJzX2Fwci5fbWFpX2p1bmlfanVsaV9hdWcuX3NlcC5fb2t0Ll9ub3YuX2Rlcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnc3VuZGFnX23DpW5kYWdfdHlzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sYXVyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc3UuX23DpS5fdHkuX29uLl90by5fZnIuX2xhdS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc3VfbcOlX3R5X29uX3RvX2ZyX2xhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBba2wuXSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQuIE1NTU0gWVlZWSBba2wuXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0kgZGFnIGtsb2trYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tJIG1vcmdvbiBrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBba2xva2thXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0kgZ8OlciBrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0bDuHJlZ8OlYW5kZV0gZGRkZCBba2xva2thXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBzaWRhbicsXG4gICAgICAgICAgICBzOiAnbm9rcmUgc2VrdW5kJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kJyxcbiAgICAgICAgICAgIG06ICdlaXQgbWludXR0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXR0JyxcbiAgICAgICAgICAgIGg6ICdlaW4gdGltZScsXG4gICAgICAgICAgICBoaDogJyVkIHRpbWFyJyxcbiAgICAgICAgICAgIGQ6ICdlaW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnYXInLFxuICAgICAgICAgICAgdzogJ2VpIHZla2UnLFxuICAgICAgICAgICAgd3c6ICclZCB2ZWtlcicsXG4gICAgICAgICAgICBNOiAnZWluIG3DpW5hZCcsXG4gICAgICAgICAgICBNTTogJyVkIG3DpW5hZGVyJyxcbiAgICAgICAgICAgIHk6ICdlaXQgw6VyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw6VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBubjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBPY2NpdGFuLCBsZW5nYWRvY2lhbiBkaWFsZWN0ZSBbb2MtbG5jXVxuLy8hIGF1dGhvciA6IFF1ZW50aW4gUEFHw4hTIDogaHR0cHM6Ly9naXRodWIuY29tL1F1ZW50eTMxXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgb2NMbmMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdvYy1sbmMnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnZ2VuacOocl9mZWJyacOocl9tYXLDp19hYnJpbF9tYWlfanVuaF9qdWxoZXRfYWdvc3Rfc2V0ZW1icmVfb2N0w7JicmVfbm92ZW1icmVfZGVjZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiBcImRlIGdlbmnDqHJfZGUgZmVicmnDqHJfZGUgbWFyw6dfZCdhYnJpbF9kZSBtYWlfZGUganVuaF9kZSBqdWxoZXRfZCdhZ29zdF9kZSBzZXRlbWJyZV9kJ29jdMOyYnJlX2RlIG5vdmVtYnJlX2RlIGRlY2VtYnJlXCIuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9EW29EXT8oXFxzKStNTU1NLyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnZ2VuLl9mZWJyLl9tYXLDp19hYnIuX21haV9qdW5oX2p1bGguX2Fnby5fc2V0Ll9vY3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWVuZ2VfZGlsdW5zX2RpbWFyc19kaW3DqGNyZXNfZGlqw7J1c19kaXZlbmRyZXNfZGlzc2FidGUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkZy5fZGwuX2RtLl9kYy5fZGouX2R2Ll9kcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGdfZGxfZG1fZGNfZGpfZHZfZHMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBsbDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFtkZV0gWVlZWSBbYV0gSDptbScsXG4gICAgICAgICAgICBsbGw6ICdEIE1NTSBZWVlZLCBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBbZGVdIFlZWVkgW2FdIEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCBEIE1NTSBZWVlZLCBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbdcOoaSBhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2RlbWFuIGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpw6hyIGFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbcGFzc2F0IGFdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBcImQnYXF1w60gJXNcIixcbiAgICAgICAgICAgIHBhc3Q6ICdmYSAlcycsXG4gICAgICAgICAgICBzOiAndW5hcyBzZWdvbmRhcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ29uZGFzJyxcbiAgICAgICAgICAgIG06ICd1bmEgbWludXRhJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRhcycsXG4gICAgICAgICAgICBoOiAndW5hIG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGpvcm4nLFxuICAgICAgICAgICAgZGQ6ICclZCBqb3JucycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHJ8bnx0fMOofGEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICBudW1iZXIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgPyAncidcbiAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICA/ICduJ1xuICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnw6gnO1xuICAgICAgICAgICAgaWYgKHBlcmlvZCA9PT0gJ3cnIHx8IHBlcmlvZCA9PT0gJ1cnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2EnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBvY0xuYztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBQdW5qYWJpIChJbmRpYSkgW3BhLWluXVxuLy8hIGF1dGhvciA6IEhhcnByZWV0IFNpbmdoIDogaHR0cHM6Ly9naXRodWIuY29tL2hhcnByZWV0a2hhbHNhZ3RiaXRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KmnJyxcbiAgICAgICAgICAgIDI6ICfgqagnLFxuICAgICAgICAgICAgMzogJ+CpqScsXG4gICAgICAgICAgICA0OiAn4KmqJyxcbiAgICAgICAgICAgIDU6ICfgqasnLFxuICAgICAgICAgICAgNjogJ+CprCcsXG4gICAgICAgICAgICA3OiAn4KmtJyxcbiAgICAgICAgICAgIDg6ICfgqa4nLFxuICAgICAgICAgICAgOTogJ+CprycsXG4gICAgICAgICAgICAwOiAn4KmmJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Cppyc6ICcxJyxcbiAgICAgICAgICAgICfgqagnOiAnMicsXG4gICAgICAgICAgICAn4KmpJzogJzMnLFxuICAgICAgICAgICAgJ+Cpqic6ICc0JyxcbiAgICAgICAgICAgICfgqasnOiAnNScsXG4gICAgICAgICAgICAn4KmsJzogJzYnLFxuICAgICAgICAgICAgJ+CprSc6ICc3JyxcbiAgICAgICAgICAgICfgqa4nOiAnOCcsXG4gICAgICAgICAgICAn4KmvJzogJzknLFxuICAgICAgICAgICAgJ+Cppic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBwYUluID0gbW9tZW50LmRlZmluZUxvY2FsZSgncGEtaW4nLCB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBtb250aHMgbmFtZSBhcyBwZXIgTmFuYWtzaGFoaSBDYWxlbmRhciBidXQgdGhleSBhcmUgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gUHVuamFiaS5cbiAgICAgICAgbW9udGhzOiAn4Kic4Kio4Ki14Kiw4KmAX+Coq+CovOCosOCoteCosOCpgF/gqK7gqL7gqLDgqJpf4KiF4Kiq4KmN4Kiw4KmI4KiyX+CoruCoiF/gqJzgqYLgqKhf4Kic4KmB4Kiy4Ki+4KiIX+CoheCol+CouOCopF/gqLjgqKTgqbDgqKzgqLBf4KiF4KiV4Kik4KmC4Kis4KiwX+CoqOCoteCpsOCorOCosF/gqKbgqLjgqbDgqKzgqLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+ConOCoqOCoteCosOCpgF/gqKvgqLzgqLDgqLXgqLDgqYBf4Kiu4Ki+4Kiw4KiaX+CoheCoquCpjeCosOCpiOCosl/gqK7gqIhf4Kic4KmC4KioX+ConOCpgeCosuCovuCoiF/gqIXgqJfgqLjgqKRf4Ki44Kik4Kmw4Kis4KiwX+CoheColeCopOCpguCorOCosF/gqKjgqLXgqbDgqKzgqLBf4Kim4Ki44Kmw4Kis4KiwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4KiQ4Kik4Ki14Ki+4KiwX+CouOCpi+CoruCoteCovuCosF/gqK7gqbDgqJfgqLLgqLXgqL7gqLBf4Kis4KmB4Kin4Ki14Ki+4KiwX+CoteCpgOCosOCoteCovuCosF/gqLjgqLzgqYHgqbHgqJXgqLDgqLXgqL7gqLBf4Ki44Ki84Kio4KmA4Kia4Kiw4Ki14Ki+4KiwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4KiQ4KikX+CouOCpi+Corl/gqK7gqbDgqJfgqLJf4Kis4KmB4KinX+CoteCpgOCosF/gqLjgqLzgqYHgqJXgqLBf4Ki44Ki84Kio4KmAJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CokOCopF/gqLjgqYvgqK5f4Kiu4Kmw4KiX4KiyX+CorOCpgeCop1/gqLXgqYDgqLBf4Ki44Ki84KmB4KiV4KiwX+CouOCovOCoqOCpgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCoteConOCphycsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4Ki14Kic4KmHJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgqLXgqJzgqYcnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4Ki14Kic4KmHJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KiF4KicXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+ColeCosl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4KiF4KiX4Kiy4Ki+XSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+ColeCosl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4Kiq4Ki/4Kib4Kiy4KmHXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCoteCov+CpseComicsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4Kiq4Ki/4Kib4Kiy4KmHJyxcbiAgICAgICAgICAgIHM6ICfgqJXgqYHgqJ0g4Ki44KiV4Ki/4Kmw4KifJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Ki44KiV4Ki/4Kmw4KifJyxcbiAgICAgICAgICAgIG06ICfgqIfgqJUg4Kiu4Ki/4Kmw4KifJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4Kiu4Ki/4Kmw4KifJyxcbiAgICAgICAgICAgIGg6ICfgqIfgqbHgqJUg4KiY4Kmw4Kif4Ki+JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KiY4Kmw4Kif4KmHJyxcbiAgICAgICAgICAgIGQ6ICfgqIfgqbHgqJUg4Kim4Ki/4KioJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Kim4Ki/4KioJyxcbiAgICAgICAgICAgIE06ICfgqIfgqbHgqJUg4Kiu4Ki54KmA4Kio4Ki+JyxcbiAgICAgICAgICAgIE1NOiAnJWQg4Kiu4Ki54KmA4Kio4KmHJyxcbiAgICAgICAgICAgIHk6ICfgqIfgqbHgqJUg4Ki44Ki+4KiyJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Ki44Ki+4KiyJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cpp+CpqOCpqeCpquCpq+CprOCpreCpruCpr+Cppl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gUHVuamFiaSBub3RhdGlvbiBmb3IgbWVyaWRpZW1zIGFyZSBxdWl0ZSBmdXp6eSBpbiBwcmFjdGljZS4gV2hpbGUgdGhlcmUgZXhpc3RzXG4gICAgICAgIC8vIGEgcmlnaWQgbm90aW9uIG9mIGEgJ1BhaGFyJyBpdCBpcyBub3QgdXNlZCBhcyByaWdpZGx5IGluIG1vZGVybiBQdW5qYWJpLlxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Kiw4Ki+4KikfOCouOCoteCph+CosHzgqKbgqYHgqKrgqLngqL/gqLB84Ki44Ki84Ki+4KiuLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4Kiw4Ki+4KikJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Ki44Ki14KmH4KiwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CopuCpgeCoquCoueCov+CosCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Ki44Ki84Ki+4KiuJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CosOCovuCopCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ki44Ki14KmH4KiwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqKbgqYHgqKrgqLngqL/gqLAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CouOCovOCovuCoric7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kiw4Ki+4KikJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhSW47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUG9saXNoIFtwbF1cbi8vISBhdXRob3IgOiBSYWZhbCBIaXJzeiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ldm9MXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzTm9taW5hdGl2ZSA9XG4gICAgICAgICAgICAnc3R5Y3plxYRfbHV0eV9tYXJ6ZWNfa3dpZWNpZcWEX21hal9jemVyd2llY19saXBpZWNfc2llcnBpZcWEX3dyemVzaWXFhF9wYcW6ZHppZXJuaWtfbGlzdG9wYWRfZ3J1ZHppZcWEJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1N1YmplY3RpdmUgPVxuICAgICAgICAgICAgJ3N0eWN6bmlhX2x1dGVnb19tYXJjYV9rd2lldG5pYV9tYWphX2N6ZXJ3Y2FfbGlwY2Ffc2llcnBuaWFfd3J6ZcWbbmlhX3Bhxbpkemllcm5pa2FfbGlzdG9wYWRhX2dydWRuaWEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXnN0eS9pLFxuICAgICAgICAgICAgL15sdXQvaSxcbiAgICAgICAgICAgIC9ebWFyL2ksXG4gICAgICAgICAgICAvXmt3aS9pLFxuICAgICAgICAgICAgL15tYWovaSxcbiAgICAgICAgICAgIC9eY3plL2ksXG4gICAgICAgICAgICAvXmxpcC9pLFxuICAgICAgICAgICAgL15zaWUvaSxcbiAgICAgICAgICAgIC9ed3J6L2ksXG4gICAgICAgICAgICAvXnBhxbovaSxcbiAgICAgICAgICAgIC9ebGlzL2ksXG4gICAgICAgICAgICAvXmdydS9pLFxuICAgICAgICBdO1xuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIHJldHVybiBuICUgMTAgPCA1ICYmIG4gJSAxMCA+IDEgJiYgfn4obiAvIDEwKSAlIDEwICE9PSAxO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Nla3VuZHknIDogJ3Nla3VuZCcpO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnbWludXRhJyA6ICdtaW51dMSZJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21pbnV0eScgOiAnbWludXQnKTtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2dvZHppbmEnIDogJ2dvZHppbsSZJztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2dvZHppbnknIDogJ2dvZHppbicpO1xuICAgICAgICAgICAgY2FzZSAnd3cnOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAndHlnb2RuaWUnIDogJ3R5Z29kbmknKTtcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21pZXNpxIVjZScgOiAnbWllc2nEmWN5Jyk7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdsYXRhJyA6ICdsYXQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3BsJywge1xuICAgICAgICBtb250aHM6IGZ1bmN0aW9uIChtb21lbnRUb0Zvcm1hdCwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudFRvRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc05vbWluYXRpdmU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9EIE1NTU0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTdWJqZWN0aXZlW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzTm9taW5hdGl2ZVttb21lbnRUb0Zvcm1hdC5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdzdHlfbHV0X21hcl9rd2lfbWFqX2N6ZV9saXBfc2llX3dyel9wYcW6X2xpc19ncnUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ25pZWR6aWVsYV9wb25pZWR6aWHFgmVrX3d0b3Jla1/Fm3JvZGFfY3p3YXJ0ZWtfcGnEhXRla19zb2JvdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZHpfcG9uX3d0X8Wbcl9jendfcHRfc29iJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ05kX1BuX1d0X8Wacl9Del9QdF9Tbycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tEemnFmyBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0p1dHJvIG9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgbmllZHppZWzEmSBvXSBMVCc7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbV2Ugd3RvcmVrIG9dIExUJztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIMWbcm9kxJkgb10gTFQnO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgc29ib3TEmSBvXSBMVCc7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1ddIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1tXY3pvcmFqIG9dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgemVzesWCxIUgbmllZHppZWzEmSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgemVzesWCxIUgxZtyb2TEmSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgemVzesWCxIUgc29ib3TEmSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIHplc3rFgnldIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgdGVtdScsXG4gICAgICAgICAgICBzOiAna2lsa2Egc2VrdW5kJyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICcxIGR6aWXFhCcsXG4gICAgICAgICAgICBkZDogJyVkIGRuaScsXG4gICAgICAgICAgICB3OiAndHlkemllxYQnLFxuICAgICAgICAgICAgd3c6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06ICdtaWVzacSFYycsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogJ3JvaycsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFBvcnR1Z3Vlc2UgKEJyYXppbCkgW3B0LWJyXVxuLy8hIGF1dGhvciA6IENhaW8gUmliZWlybyBQZXJlaXJhIDogaHR0cHM6Ly9naXRodWIuY29tL2NhaW8tcmliZWlyby1wZXJlaXJhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgcHRCciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3B0LWJyJywge1xuICAgICAgICBtb250aHM6ICdqYW5laXJvX2ZldmVyZWlyb19tYXLDp29fYWJyaWxfbWFpb19qdW5ob19qdWxob19hZ29zdG9fc2V0ZW1icm9fb3V0dWJyb19ub3ZlbWJyb19kZXplbWJybycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmV2X21hcl9hYnJfbWFpX2p1bl9qdWxfYWdvX3NldF9vdXRfbm92X2Rleicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnZG9taW5nb19zZWd1bmRhLWZlaXJhX3RlcsOnYS1mZWlyYV9xdWFydGEtZmVpcmFfcXVpbnRhLWZlaXJhX3NleHRhLWZlaXJhX3PDoWJhZG8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbV9zZWdfdGVyX3F1YV9xdWlfc2V4X3PDoWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fMsKqXzPCql80wqpfNcKqXzbCql9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIFvDoHNdIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgW8Ogc10gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIb2plIMOgc10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBbWFuaMOjIMOgc10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbT250ZW0gw6BzXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpID09PSAwIHx8IHRoaXMuZGF5KCkgPT09IDZcbiAgICAgICAgICAgICAgICAgICAgPyAnW8OabHRpbW9dIGRkZGQgW8Ogc10gTFQnIC8vIFNhdHVyZGF5ICsgU3VuZGF5XG4gICAgICAgICAgICAgICAgICAgIDogJ1vDmmx0aW1hXSBkZGRkIFvDoHNdIExUJzsgLy8gTW9uZGF5IC0gRnJpZGF5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaMOhICVzJyxcbiAgICAgICAgICAgIHM6ICdwb3Vjb3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW0gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW1hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW0gZGlhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGlhcycsXG4gICAgICAgICAgICBNOiAndW0gbcOqcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1bSBhbm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIGludmFsaWREYXRlOiAnRGF0YSBpbnbDoWxpZGEnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHB0QnI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUG9ydHVndWVzZSBbcHRdXG4vLyEgYXV0aG9yIDogSmVmZmVyc29uIDogaHR0cHM6Ly9naXRodWIuY29tL2phbGV4NzlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBwdCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3B0Jywge1xuICAgICAgICBtb250aHM6ICdqYW5laXJvX2ZldmVyZWlyb19tYXLDp29fYWJyaWxfbWFpb19qdW5ob19qdWxob19hZ29zdG9fc2V0ZW1icm9fb3V0dWJyb19ub3ZlbWJyb19kZXplbWJybycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmV2X21hcl9hYnJfbWFpX2p1bl9qdWxfYWdvX3NldF9vdXRfbm92X2Rleicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnRG9taW5nb19TZWd1bmRhLWZlaXJhX1RlcsOnYS1mZWlyYV9RdWFydGEtZmVpcmFfUXVpbnRhLWZlaXJhX1NleHRhLWZlaXJhX1PDoWJhZG8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0RvbV9TZWdfVGVyX1F1YV9RdWlfU2V4X1PDoWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnRG9fMsKqXzPCql80wqpfNcKqXzbCql9Tw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIb2plIMOgc10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBbWFuaMOjIMOgc10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbT250ZW0gw6BzXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpID09PSAwIHx8IHRoaXMuZGF5KCkgPT09IDZcbiAgICAgICAgICAgICAgICAgICAgPyAnW8OabHRpbW9dIGRkZGQgW8Ogc10gTFQnIC8vIFNhdHVyZGF5ICsgU3VuZGF5XG4gICAgICAgICAgICAgICAgICAgIDogJ1vDmmx0aW1hXSBkZGRkIFvDoHNdIExUJzsgLy8gTW9uZGF5IC0gRnJpZGF5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaMOhICVzJyxcbiAgICAgICAgICAgIHM6ICdzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1bSBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bWEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1bSBkaWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkaWFzJyxcbiAgICAgICAgICAgIHc6ICd1bWEgc2VtYW5hJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYW5hcycsXG4gICAgICAgICAgICBNOiAndW0gbcOqcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1bSBhbm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBwdDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBSb21hbmlhbiBbcm9dXG4vLyEgYXV0aG9yIDogVmxhZCBHdXJkaWdhIDogaHR0cHM6Ly9naXRodWIuY29tL2d1cmRpZ2Fcbi8vISBhdXRob3IgOiBWYWxlbnRpbiBBZ2FjaGkgOiBodHRwczovL2dpdGh1Yi5jb20vYXZhbHlcbi8vISBhdXRob3IgOiBFbWFudWVsIENlcG9pIDogaHR0cHM6Ly9naXRodWIuY29tL2NlcGVtXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICAgICAgc3M6ICdzZWN1bmRlJyxcbiAgICAgICAgICAgICAgICBtbTogJ21pbnV0ZScsXG4gICAgICAgICAgICAgICAgaGg6ICdvcmUnLFxuICAgICAgICAgICAgICAgIGRkOiAnemlsZScsXG4gICAgICAgICAgICAgICAgd3c6ICdzxINwdMSDbcOibmknLFxuICAgICAgICAgICAgICAgIE1NOiAnbHVuaScsXG4gICAgICAgICAgICAgICAgeXk6ICdhbmknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcGFyYXRvciA9ICcgJztcbiAgICAgICAgaWYgKG51bWJlciAlIDEwMCA+PSAyMCB8fCAobnVtYmVyID49IDEwMCAmJiBudW1iZXIgJSAxMDAgPT09IDApKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSAnIGRlICc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bWJlciArIHNlcGFyYXRvciArIGZvcm1hdFtrZXldO1xuICAgIH1cblxuICAgIHZhciBybyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3JvJywge1xuICAgICAgICBtb250aHM6ICdpYW51YXJpZV9mZWJydWFyaWVfbWFydGllX2FwcmlsaWVfbWFpX2l1bmllX2l1bGllX2F1Z3VzdF9zZXB0ZW1icmllX29jdG9tYnJpZV9ub2llbWJyaWVfZGVjZW1icmllJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdpYW4uX2ZlYi5fbWFydC5fYXByLl9tYWlfaXVuLl9pdWwuX2F1Zy5fc2VwdC5fb2N0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdkdW1pbmljxINfbHVuaV9tYXLIm2lfbWllcmN1cmlfam9pX3ZpbmVyaV9zw6JtYsSDdMSDJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnRHVtX0x1bl9NYXJfTWllX0pvaV9WaW5fU8OibScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdEdV9MdV9NYV9NaV9Kb19WaV9Tw6InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1themkgbGFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbcOiaW5lIGxhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2xhXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2llcmkgbGFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2Zvc3RhXSBkZGRkIFtsYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdwZXN0ZSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgw65uIHVybcSDJyxcbiAgICAgICAgICAgIHM6ICdjw6J0ZXZhIHNlY3VuZGUnLFxuICAgICAgICAgICAgc3M6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtOiAndW4gbWludXQnLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoOiAnbyBvcsSDJyxcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZDogJ28gemknLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB3OiAnbyBzxINwdMSDbcOibsSDJyxcbiAgICAgICAgICAgIHd3OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTTogJ28gbHVuxIMnLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiAndW4gYW4nLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBybztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBSdXNzaWFuIFtydV1cbi8vISBhdXRob3IgOiBWaWt0b3JtaW5hdG9yIDogaHR0cHM6Ly9naXRodWIuY29tL1Zpa3Rvcm1pbmF0b3Jcbi8vISBhdXRob3IgOiBNZW5lbGlvbiBFbGVuc8O6bGUgOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuLy8hIGF1dGhvciA6INCa0L7RgNC10L3QsdC10YDQsyDQnNCw0YDQuiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRwYWlyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwbHVyYWwod29yZCwgbnVtKSB7XG4gICAgICAgIHZhciBmb3JtcyA9IHdvcmQuc3BsaXQoJ18nKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDEwID09PSAxICYmIG51bSAlIDEwMCAhPT0gMTFcbiAgICAgICAgICAgID8gZm9ybXNbMF1cbiAgICAgICAgICAgIDogbnVtICUgMTAgPj0gMiAmJiBudW0gJSAxMCA8PSA0ICYmIChudW0gJSAxMDAgPCAxMCB8fCBudW0gJSAxMDAgPj0gMjApXG4gICAgICAgICAgICAgID8gZm9ybXNbMV1cbiAgICAgICAgICAgICAgOiBmb3Jtc1syXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgc3M6IHdpdGhvdXRTdWZmaXggPyAn0YHQtdC60YPQvdC00LBf0YHQtdC60YPQvdC00Ytf0YHQtdC60YPQvdC0JyA6ICfRgdC10LrRg9C90LTRg1/RgdC10LrRg9C90LTRi1/RgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbW06IHdpdGhvdXRTdWZmaXggPyAn0LzQuNC90YPRgtCwX9C80LjQvdGD0YLRi1/QvNC40L3Rg9GCJyA6ICfQvNC40L3Rg9GC0YNf0LzQuNC90YPRgtGLX9C80LjQvdGD0YInLFxuICAgICAgICAgICAgaGg6ICfRh9Cw0YFf0YfQsNGB0LBf0YfQsNGB0L7QsicsXG4gICAgICAgICAgICBkZDogJ9C00LXQvdGMX9C00L3Rj1/QtNC90LXQuScsXG4gICAgICAgICAgICB3dzogJ9C90LXQtNC10LvRj1/QvdC10LTQtdC70Lhf0L3QtdC00LXQu9GMJyxcbiAgICAgICAgICAgIE1NOiAn0LzQtdGB0Y/Rhl/QvNC10YHRj9GG0LBf0LzQtdGB0Y/RhtC10LInLFxuICAgICAgICAgICAgeXk6ICfQs9C+0LRf0LPQvtC00LBf0LvQtdGCJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ20nKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfQvNC40L3Rg9GC0LAnIDogJ9C80LjQvdGD0YLRgyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgcGx1cmFsKGZvcm1hdFtrZXldLCArbnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgIC9e0Y/QvdCyL2ksXG4gICAgICAgIC9e0YTQtdCyL2ksXG4gICAgICAgIC9e0LzQsNGAL2ksXG4gICAgICAgIC9e0LDQv9GAL2ksXG4gICAgICAgIC9e0LzQsFvQudGPXS9pLFxuICAgICAgICAvXtC40Y7QvS9pLFxuICAgICAgICAvXtC40Y7Quy9pLFxuICAgICAgICAvXtCw0LLQsy9pLFxuICAgICAgICAvXtGB0LXQvS9pLFxuICAgICAgICAvXtC+0LrRgi9pLFxuICAgICAgICAvXtC90L7Rjy9pLFxuICAgICAgICAvXtC00LXQui9pLFxuICAgIF07XG5cbiAgICAvLyBodHRwOi8vbmV3LmdyYW1vdGEucnUvc3ByYXZrYS9ydWxlcy8xMzktcHJvcCA6IMKnIDEwM1xuICAgIC8vINCh0L7QutGA0LDRidC10L3QuNGPINC80LXRgdGP0YbQtdCyOiBodHRwOi8vbmV3LmdyYW1vdGEucnUvc3ByYXZrYS9idXJvL3NlYXJjaC1hbnN3ZXI/cz0yNDI2MzdcbiAgICAvLyBDTERSIGRhdGE6ICAgICAgICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2xkci9jaGFydHMvMjgvc3VtbWFyeS9ydS5odG1sIzE3NTNcbiAgICB2YXIgcnUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdydScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfRj9C90LLQsNGA0Y9f0YTQtdCy0YDQsNC70Y9f0LzQsNGA0YLQsF/QsNC/0YDQtdC70Y9f0LzQsNGPX9C40Y7QvdGPX9C40Y7Qu9GPX9Cw0LLQs9GD0YHRgtCwX9GB0LXQvdGC0Y/QsdGA0Y9f0L7QutGC0Y/QsdGA0Y9f0L3QvtGP0LHRgNGPX9C00LXQutCw0LHRgNGPJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfRj9C90LLQsNGA0Yxf0YTQtdCy0YDQsNC70Yxf0LzQsNGA0YJf0LDQv9GA0LXQu9GMX9C80LDQuV/QuNGO0L3RjF/QuNGO0LvRjF/QsNCy0LPRg9GB0YJf0YHQtdC90YLRj9Cx0YDRjF/QvtC60YLRj9Cx0YDRjF/QvdC+0Y/QsdGA0Yxf0LTQtdC60LDQsdGA0YwnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDoge1xuICAgICAgICAgICAgLy8g0L/QviBDTERSINC40LzQtdC90L3QviBcItC40Y7Quy5cIiDQuCBcItC40Y7QvS5cIiwg0L3QviDQutCw0LrQvtC5INGB0LzRi9GB0Lsg0LzQtdC90Y/RgtGMINCx0YPQutCy0YMg0L3QsCDRgtC+0YfQutGDP1xuICAgICAgICAgICAgZm9ybWF0OiAn0Y/QvdCyLl/RhNC10LLRgC5f0LzQsNGALl/QsNC/0YAuX9C80LDRj1/QuNGO0L3Rj1/QuNGO0LvRj1/QsNCy0LMuX9GB0LXQvdGCLl/QvtC60YIuX9C90L7Rj9CxLl/QtNC10LouJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfRj9C90LIuX9GE0LXQstGALl/QvNCw0YDRgl/QsNC/0YAuX9C80LDQuV/QuNGO0L3RjF/QuNGO0LvRjF/QsNCy0LMuX9GB0LXQvdGCLl/QvtC60YIuX9C90L7Rj9CxLl/QtNC10LouJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vla2RheXM6IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9Cy0L7RgdC60YDQtdGB0LXQvdGM0LVf0L/QvtC90LXQtNC10LvRjNC90LjQul/QstGC0L7RgNC90LjQul/RgdGA0LXQtNCwX9GH0LXRgtCy0LXRgNCzX9C/0Y/RgtC90LjRhtCwX9GB0YPQsdCx0L7RgtCwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ9Cy0L7RgdC60YDQtdGB0LXQvdGM0LVf0L/QvtC90LXQtNC10LvRjNC90LjQul/QstGC0L7RgNC90LjQul/RgdGA0LXQtNGDX9GH0LXRgtCy0LXRgNCzX9C/0Y/RgtC90LjRhtGDX9GB0YPQsdCx0L7RgtGDJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL1xcWyA/W9CS0LJdID8oPzrQv9GA0L7RiNC70YPRjnzRgdC70LXQtNGD0Y7RidGD0Y580Y3RgtGDKT8gP10gP2RkZGQvLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0LLRgV/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQstGBX9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuXG4gICAgICAgIC8vINC/0L7Qu9C90YvQtSDQvdCw0LfQstCw0L3QuNGPINGBINC/0LDQtNC10LbQsNC80LgsINC/0L4g0YLRgNC4INCx0YPQutCy0YssINC00LvRjyDQvdC10LrQvtGC0L7RgNGL0YUsINC/0L4gNCDQsdGD0LrQstGLLCDRgdC+0LrRgNCw0YnQtdC90LjRjyDRgSDRgtC+0YfQutC+0Lkg0Lgg0LHQtdC3INGC0L7Rh9C60LhcbiAgICAgICAgbW9udGhzUmVnZXg6XG4gICAgICAgICAgICAvXijRj9C90LLQsNGAW9GM0Y9dfNGP0L3QslxcLj980YTQtdCy0YDQsNC7W9GM0Y9dfNGE0LXQstGAP1xcLj980LzQsNGA0YLQsD980LzQsNGAXFwuP3zQsNC/0YDQtdC7W9GM0Y9dfNCw0L/RgFxcLj980LzQsFvQudGPXXzQuNGO0L1b0YzRj1180LjRjtC9XFwuP3zQuNGO0Ltb0YzRj1180LjRjtC7XFwuP3zQsNCy0LPRg9GB0YLQsD980LDQstCzXFwuP3zRgdC10L3RgtGP0LHRgFvRjNGPXXzRgdC10L3Rgj9cXC4/fNC+0LrRgtGP0LHRgFvRjNGPXXzQvtC60YJcXC4/fNC90L7Rj9Cx0YBb0YzRj1180L3QvtGP0LE/XFwuP3zQtNC10LrQsNCx0YBb0YzRj1180LTQtdC6XFwuPykvaSxcblxuICAgICAgICAvLyDQutC+0L/QuNGPINC/0YDQtdC00YvQtNGD0YnQtdCz0L5cbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDpcbiAgICAgICAgICAgIC9eKNGP0L3QstCw0YBb0YzRj1180Y/QvdCyXFwuP3zRhNC10LLRgNCw0Ltb0YzRj1180YTQtdCy0YA/XFwuP3zQvNCw0YDRgtCwP3zQvNCw0YBcXC4/fNCw0L/RgNC10Ltb0YzRj1180LDQv9GAXFwuP3zQvNCwW9C50Y9dfNC40Y7QvVvRjNGPXXzQuNGO0L1cXC4/fNC40Y7Qu1vRjNGPXXzQuNGO0LtcXC4/fNCw0LLQs9GD0YHRgtCwP3zQsNCy0LNcXC4/fNGB0LXQvdGC0Y/QsdGAW9GM0Y9dfNGB0LXQvdGCP1xcLj980L7QutGC0Y/QsdGAW9GM0Y9dfNC+0LrRglxcLj980L3QvtGP0LHRgFvRjNGPXXzQvdC+0Y/QsT9cXC4/fNC00LXQutCw0LHRgFvRjNGPXXzQtNC10LpcXC4/KS9pLFxuXG4gICAgICAgIC8vINC/0L7Qu9C90YvQtSDQvdCw0LfQstCw0L3QuNGPINGBINC/0LDQtNC10LbQsNC80LhcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXijRj9C90LLQsNGAW9GP0YxdfNGE0LXQstGA0LDQu1vRj9GMXXzQvNCw0YDRgtCwP3zQsNC/0YDQtdC7W9GP0YxdfNC80LBb0Y/QuV180LjRjtC9W9GP0YxdfNC40Y7Qu1vRj9GMXXzQsNCy0LPRg9GB0YLQsD980YHQtdC90YLRj9Cx0YBb0Y/RjF180L7QutGC0Y/QsdGAW9GP0YxdfNC90L7Rj9Cx0YBb0Y/RjF180LTQtdC60LDQsdGAW9GP0YxdKS9pLFxuXG4gICAgICAgIC8vINCS0YvRgNCw0LbQtdC90LjQtSwg0LrQvtGC0L7RgNC+0LUg0YHQvtC+0YLQstC10YLRgdGC0LLRg9C10YIg0YLQvtC70YzQutC+INGB0L7QutGA0LDRidGR0L3QvdGL0Lwg0YTQvtGA0LzQsNC8XG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXijRj9C90LJcXC580YTQtdCy0YA/XFwufNC80LDRgFvRgi5dfNCw0L/RgFxcLnzQvNCwW9GP0LldfNC40Y7QvVvRjNGPLl180LjRjtC7W9GM0Y8uXXzQsNCy0LNcXC580YHQtdC90YI/XFwufNC+0LrRglxcLnzQvdC+0Y/QsT9cXC580LTQtdC6XFwuKS9pLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWSDQsy4nLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkg0LMuLCBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSDQsy4sIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQodC10LPQvtC00L3Rjywg0LJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0JfQsNCy0YLRgNCwLCDQsl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQktGH0LXRgNCwLCDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93LndlZWsoKSAhPT0gdGhpcy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0YHQu9C10LTRg9GO0YnQtdC1XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDRgdC70LXQtNGD0Y7RidC40LldIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINGB0LvQtdC00YPRjtGJ0YPRjl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXkoKSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JLQvl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93LndlZWsoKSAhPT0gdGhpcy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0L/RgNC+0YjQu9C+0LVdIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINC/0YDQvtGI0LvRi9C5XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDQv9GA0L7RiNC70YPRjl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXkoKSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JLQvl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfRh9C10YDQtdC3ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDQvdCw0LfQsNC0JyxcbiAgICAgICAgICAgIHM6ICfQvdC10YHQutC+0LvRjNC60L4g0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaDogJ9GH0LDRgScsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6ICfQtNC10L3RjCcsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHc6ICfQvdC10LTQtdC70Y8nLFxuICAgICAgICAgICAgd3c6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiAn0LzQtdGB0Y/RhicsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHk6ICfQs9C+0LQnLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/QvdC+0YfQuHzRg9GC0YDQsHzQtNC90Y980LLQtdGH0LXRgNCwL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNC00L3Rj3zQstC10YfQtdGA0LApJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C90L7Rh9C4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRg9GC0YDQsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LTQvdGPJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQstC10YfQtdGA0LAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNC5fNCz0L580Y8pLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC5JztcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LPQvic7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGPJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcnU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2luZGhpIFtzZF1cbi8vISBhdXRob3IgOiBOYXJhaW4gU2FnYXIgOiBodHRwczovL2dpdGh1Yi5jb20vbmFyYWluc2FnYXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICAgICAn2KzZhtmI2LHZiicsXG4gICAgICAgICAgICAn2YHZitio2LHZiNix2YonLFxuICAgICAgICAgICAgJ9mF2KfYsdqGJyxcbiAgICAgICAgICAgICfYp9m+2LHZitmEJyxcbiAgICAgICAgICAgICfZhdim2YonLFxuICAgICAgICAgICAgJ9is2YjZhicsXG4gICAgICAgICAgICAn2KzZiNmE2KfYodmQJyxcbiAgICAgICAgICAgICfYotqv2LPZvScsXG4gICAgICAgICAgICAn2LPZitm+2b3Zhdio2LEnLFxuICAgICAgICAgICAgJ9ii2qrZvdmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmF2KjYsScsXG4gICAgICAgICAgICAn2orYs9mF2KjYsScsXG4gICAgICAgIF0sXG4gICAgICAgIGRheXMgPSBbJ9ii2obYsScsICfYs9mI2YXYsScsICfYp9qx2KfYsdmIJywgJ9in2LHYqNi5JywgJ9iu2YXZitizJywgJ9is2YXYuScsICfah9mG2ofYsSddO1xuXG4gICAgdmFyIHNkID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2QnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czogZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW46IGRheXMsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGTYjCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/Ytdio2K182LTYp9mFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9i02KfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LXYqNitJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAn2LTYp9mFJztcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfahF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYs9qA2Kfau9mKXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9in2rPZitmGINmH2YHYqtmKINiq2YpdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2qrYp9mE2YfZh10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb2q/Ystix2YrZhCDZh9mB2KrZil0gZGRkZCBb2KrZil0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDZvtmI2KEnLFxuICAgICAgICAgICAgcGFzdDogJyVzINin2rMnLFxuICAgICAgICAgICAgczogJ9qG2YbYryDYs9mK2qrZhtqKJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2LPZitqq2YbaiicsXG4gICAgICAgICAgICBtOiAn2YfaqiDZhdmG2b0nLFxuICAgICAgICAgICAgbW06ICclZCDZhdmG2b0nLFxuICAgICAgICAgICAgaDogJ9mH2qog2qrZhNin2qonLFxuICAgICAgICAgICAgaGg6ICclZCDaqtmE2KfaqicsXG4gICAgICAgICAgICBkOiAn2YfaqiDaj9mK2YbZh9mGJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2o/ZitmG2YfZhicsXG4gICAgICAgICAgICBNOiAn2YfaqiDZhdmH2YrZhtmIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2YXZh9mK2YbYpycsXG4gICAgICAgICAgICB5OiAn2YfaqiDYs9in2YQnLFxuICAgICAgICAgICAgeXk6ICclZCDYs9in2YQnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzZDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBOb3J0aGVybiBTYW1pIFtzZV1cbi8vISBhdXRob3JzIDogQsOlcmQgUm9sc3RhZCBIZW5yaWtzZW4gOiBodHRwczovL2dpdGh1Yi5jb20va2FyYW1lbGxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NlJywge1xuICAgICAgICBtb250aHM6ICdvxJHEkWFqYWdlbcOhbm51X2d1b3Z2YW3DoW5udV9uanVrxI1hbcOhbm51X2N1b8WLb23DoW5udV9taWVzc2Vtw6FubnVfZ2Vhc3NlbcOhbm51X3N1b2lkbmVtw6FubnVfYm9yZ2Vtw6FubnVfxI1ha8SNYW3DoW5udV9nb2xnZ290bcOhbm51X3Nrw6FibWFtw6FubnVfanVvdmxhbcOhbm51Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdvxJHEkWpfZ3Vvdl9uanVrX2N1b19taWVzX2dlYXNfc3VvaV9ib3JnX8SNYWvEjV9nb2xnX3Nrw6FiX2p1b3YnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3NvdG5hYmVhaXZpX3Z1b3Nzw6FyZ2FfbWHFi8WLZWLDoXJnYV9nYXNrYXZhaGtrdV9kdW9yYXN0YXRfYmVhcmphZGF0X2zDoXZ2YXJkYXQnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3NvdG5fdnVvc19tYcWLX2dhc2tfZHVvcl9iZWFyX2zDoXYnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc192X21fZ19kX2JfTCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdNTU1NIEQuIFtiLl0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIEQuIFtiLl0gWVlZWSBbdGkuXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBELiBbYi5dIFlZWVkgW3RpLl0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tvdG5lIHRpXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2lodHRpbiB0aV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt0aV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpa3RlIHRpXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tvdmRkaXRdIGRkZGQgW3RpXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIGdlYcW+ZXMnLFxuICAgICAgICAgICAgcGFzdDogJ21hxYtpdCAlcycsXG4gICAgICAgICAgICBzOiAnbW9hZGRlIHNla3VuZGRhdCcsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGRhdCcsXG4gICAgICAgICAgICBtOiAnb2t0YSBtaW51aHRhJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludWh0YXQnLFxuICAgICAgICAgICAgaDogJ29rdGEgZGlpbW11JyxcbiAgICAgICAgICAgIGhoOiAnJWQgZGlpbW11dCcsXG4gICAgICAgICAgICBkOiAnb2t0YSBiZWFpdmknLFxuICAgICAgICAgICAgZGQ6ICclZCBiZWFpdnZpdCcsXG4gICAgICAgICAgICBNOiAnb2t0YSBtw6FubnUnLFxuICAgICAgICAgICAgTU06ICclZCBtw6FudXQnLFxuICAgICAgICAgICAgeTogJ29rdGEgamFoa2knLFxuICAgICAgICAgICAgeXk6ICclZCBqYWdpdCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2U7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2luaGFsZXNlIFtzaV1cbi8vISBhdXRob3IgOiBTYW1wYXRoIFNpdGluYW1hbHV3YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYW1wYXRoc3Jpc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgLypqc2hpbnQgLVcxMDAqL1xuICAgIHZhciBzaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NpJywge1xuICAgICAgICBtb250aHM6ICfgtqLgtrHgt4Dgt4/gtrvgt5Jf4La04LeZ4La24La74LeA4LeP4La74LeSX+C2uOC3j+C2u+C3iuC2reC3lF/gtoXgtrTgt4rigI3gtrvgt5rgtr3gt4pf4La44LeQ4La64LeSX+C2ouC3luC2seC3kl/gtqLgt5bgtr3gt5Jf4LaF4Lac4Led4LeD4LeK4Lat4LeUX+C3g+C3kOC2tOC3iuC2reC3kOC2uOC3iuC2tuC2u+C3il/gtpTgtprgt4rgtq3gt53gtrbgtrvgt4pf4Lax4Lec4LeA4LeQ4La44LeK4La24La74LeKX+C2r+C3meC3g+C3kOC2uOC3iuC2tuC2u+C3iicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfgtqLgtrFf4La04LeZ4La2X+C2uOC3j+C2u+C3il/gtoXgtrTgt4pf4La44LeQ4La64LeSX+C2ouC3luC2seC3kl/gtqLgt5bgtr3gt5Jf4LaF4Lac4LedX+C3g+C3kOC2tOC3il/gtpTgtprgt4pf4Lax4Lec4LeA4LeQX+C2r+C3meC3g+C3kCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4LaJ4La74LeS4Lav4LePX+C3g+C2s+C3lOC2r+C3j1/gtoXgtp/gt4Tgtrvgt5Tgt4Dgt4/gtq/gt49f4La24Lav4LeP4Lav4LePX+C2tuC3iuKAjeC2u+C3hOC3g+C3iuC2tOC2reC3kuC2seC3iuC2r+C3j1/gt4Pgt5Lgtprgt5Tgtrvgt4/gtq/gt49f4LeD4LeZ4Lax4LeD4LeU4La74LeP4Lav4LePJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgtongtrvgt5Jf4LeD4Laz4LeUX+C2heC2n1/gtrbgtq/gt49f4La24LeK4oCN4La74LeEX+C3g+C3kuC2muC3lF/gt4Pgt5ngtrEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4LaJX+C3g1/gtoVf4La2X+C2tuC3iuKAjeC2u1/gt4Pgt5Jf4LeD4LeZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2EgaDptbScsXG4gICAgICAgICAgICBMVFM6ICdhIGg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZIE1NTU0gRCcsXG4gICAgICAgICAgICBMTEw6ICdZWVlZIE1NTU0gRCwgYSBoOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZIE1NTU0gRCBb4LeA4LeQ4Lax4LeSXSBkZGRkLCBhIGg6bW06c3MnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgtoXgtq9dIExUW+C2p10nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgt4Tgt5ngtqddIExUW+C2p10nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIExUW+C2p10nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgtorgtrrgt5pdIExUW+C2p10nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4La04LeD4LeU4Lac4LeS4La6XSBkZGRkIExUW+C2p10nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+C2muC3kuC2seC3iicsXG4gICAgICAgICAgICBwYXN0OiAnJXPgtprgtqcg4La04LeZ4La7JyxcbiAgICAgICAgICAgIHM6ICfgtq3gtq3gt4rgtrTgtrsg4Laa4LeS4LeE4LeS4La04La6JyxcbiAgICAgICAgICAgIHNzOiAn4Lat4Lat4LeK4La04La7ICVkJyxcbiAgICAgICAgICAgIG06ICfgtrjgt5LgtrHgt5Lgtq3gt4rgtq3gt5Tgt4AnLFxuICAgICAgICAgICAgbW06ICfgtrjgt5LgtrHgt5Lgtq3gt4rgtq3gt5QgJWQnLFxuICAgICAgICAgICAgaDogJ+C2tOC3kOC2uicsXG4gICAgICAgICAgICBoaDogJ+C2tOC3kOC2uiAlZCcsXG4gICAgICAgICAgICBkOiAn4Lav4LeS4Lax4La6JyxcbiAgICAgICAgICAgIGRkOiAn4Lav4LeS4LaxICVkJyxcbiAgICAgICAgICAgIE06ICfgtrjgt4/gt4PgtronLFxuICAgICAgICAgICAgTU06ICfgtrjgt4/gt4MgJWQnLFxuICAgICAgICAgICAgeTogJ+C3gOC3g+C2uycsXG4gICAgICAgICAgICB5eTogJ+C3gOC3g+C2uyAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSDgt4Dgt5DgtrHgt5IvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDgt4Dgt5DgtrHgt5InO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4La04LeZ4La7IOC3gOC2u+C3lHzgtrTgt4Pgt4og4LeA4La74LeUfOC2tOC3mS7gt4B84La0LuC3gC4vLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+C2tC7gt4AuJyB8fCBpbnB1dCA9PT0gJ+C2tOC3g+C3iiDgt4Dgtrvgt5QnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ+C2tC7gt4AuJyA6ICfgtrTgt4Pgt4og4LeA4La74LeUJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAn4La04LeZLuC3gC4nIDogJ+C2tOC3meC2uyDgt4Dgtrvgt5QnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNsb3ZhayBbc2tdXG4vLyEgYXV0aG9yIDogTWFydGluIE1pbmthIDogaHR0cHM6Ly9naXRodWIuY29tL2syc1xuLy8hIGJhc2VkIG9uIHdvcmsgb2YgcGV0cmJlbGEgOiBodHRwczovL2dpdGh1Yi5jb20vcGV0cmJlbGFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPVxuICAgICAgICAgICAgJ2phbnXDoXJfZmVicnXDoXJfbWFyZWNfYXByw61sX23DoWpfasO6bl9qw7psX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0w7NiZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnamFuX2ZlYl9tYXJfYXByX23DoWpfasO6bl9qw7psX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgcmV0dXJuIG4gPiAxICYmIG4gPCA1O1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzogLy8gYSBmZXcgc2Vjb25kcyAvIGluIGEgZmV3IHNlY29uZHMgLyBhIGZldyBzZWNvbmRzIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3DDoXIgc2Vrw7puZCcgOiAncMOhciBzZWt1bmRhbWknO1xuICAgICAgICAgICAgY2FzZSAnc3MnOiAvLyA5IHNlY29uZHMgLyBpbiA5IHNlY29uZHMgLyA5IHNlY29uZHMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdzZWt1bmR5JyA6ICdzZWvDum5kJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdzZWt1bmRhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ20nOiAvLyBhIG1pbnV0ZSAvIGluIGEgbWludXRlIC8gYSBtaW51dGUgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnbWluw7p0YScgOiBpc0Z1dHVyZSA/ICdtaW7DunR1JyA6ICdtaW7DunRvdSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6IC8vIDkgbWludXRlcyAvIGluIDkgbWludXRlcyAvIDkgbWludXRlcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21pbsO6dHknIDogJ21pbsO6dCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbWluw7p0YW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdoJzogLy8gYW4gaG91ciAvIGluIGFuIGhvdXIgLyBhbiBob3VyIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2hvZGluYScgOiBpc0Z1dHVyZSA/ICdob2RpbnUnIDogJ2hvZGlub3UnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOiAvLyA5IGhvdXJzIC8gaW4gOSBob3VycyAvIDkgaG91cnMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdob2RpbnknIDogJ2hvZMOtbicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnaG9kaW5hbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2QnOiAvLyBhIGRheSAvIGluIGEgZGF5IC8gYSBkYXkgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZGXFiCcgOiAnZMWIb20nO1xuICAgICAgICAgICAgY2FzZSAnZGQnOiAvLyA5IGRheXMgLyBpbiA5IGRheXMgLyA5IGRheXMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdkbmknIDogJ2Ruw60nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2TFiGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnTSc6IC8vIGEgbW9udGggLyBpbiBhIG1vbnRoIC8gYSBtb250aCBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNpYWMnIDogJ21lc2lhY29tJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzogLy8gOSBtb250aHMgLyBpbiA5IG1vbnRocyAvIDkgbW9udGhzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWVzaWFjZScgOiAnbWVzaWFjb3YnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ21lc2lhY21pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICd5JzogLy8gYSB5ZWFyIC8gaW4gYSB5ZWFyIC8gYSB5ZWFyIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3JvaycgOiAncm9rb20nO1xuICAgICAgICAgICAgY2FzZSAneXknOiAvLyA5IHllYXJzIC8gaW4gOSB5ZWFycyAvIDkgeWVhcnMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdyb2t5JyA6ICdyb2tvdicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAncm9rbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NrJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRoc1Nob3J0LFxuICAgICAgICB3ZWVrZGF5czogJ25lZGXEvmFfcG9uZGVsb2tfdXRvcm9rX3N0cmVkYV/FoXR2cnRva19waWF0b2tfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVfcG9fdXRfc3RfxaF0X3BpX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3N0X8WhdF9waV9zbycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZG5lcyBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3phanRyYSBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IG5lZGXEvnUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBzdHJlZHUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2byDFoXR2cnRvayBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgcGlhdG9rIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBzb2JvdHUgb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3bEjWVyYSBvXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IG5lZGXEvnUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw71dIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDuiBzdHJlZHUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw71dIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDuiBzb2JvdHUgb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmVkICVzJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzaztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTbG92ZW5pYW4gW3NsXVxuLy8hIGF1dGhvciA6IFJvYmVydCBTZWRvdsWhZWsgOiBodHRwczovL2dpdGh1Yi5jb20vc2Vkb3ZzZWtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgICAgICA/ICduZWthaiBzZWt1bmQnXG4gICAgICAgICAgICAgICAgICAgIDogJ25la2FqIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCA/ICdzZWt1bmRvJyA6ICdzZWt1bmRpJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdzZWt1bmRpJyA6ICdzZWt1bmRhaCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3Nla3VuZGUnIDogJ3Nla3VuZGFoJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdlbmEgbWludXRhJyA6ICdlbm8gbWludXRvJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4ID8gJ21pbnV0YScgOiAnbWludXRvJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtaW51dGknIDogJ21pbnV0YW1hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWludXRlJyA6ICdtaW51dGFtaSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWludXQnIDogJ21pbnV0YW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2VuYSB1cmEnIDogJ2VubyB1cm8nO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggPyAndXJhJyA6ICd1cm8nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3VyaScgOiAndXJhbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICd1cmUnIDogJ3VyYW1pJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICd1cicgOiAndXJhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW4gZGFuJyA6ICdlbmltIGRuZW0nO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZGFuJyA6ICdkbmVtJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkbmknIDogJ2RuZXZvbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2RuaScgOiAnZG5ldmknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW4gbWVzZWMnIDogJ2VuaW0gbWVzZWNlbSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlYycgOiAnbWVzZWNlbSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWVzZWNhJyA6ICdtZXNlY2VtYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2VjZScgOiAnbWVzZWNpJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlY2V2JyA6ICdtZXNlY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW5vIGxldG8nIDogJ2VuaW0gbGV0b20nO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbGV0bycgOiAnbGV0b20nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldGknIDogJ2xldG9tYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldGEnIDogJ2xldGknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldCcgOiAnbGV0aSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2wgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzbCcsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFyZWNfYXByaWxfbWFqX2p1bmlqX2p1bGlqX2F2Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hci5fYXByLl9tYWouX2p1bi5fanVsLl9hdmcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRlbGphX3BvbmVkZWxqZWtfdG9yZWtfc3JlZGFfxI1ldHJ0ZWtfcGV0ZWtfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3Rvci5fc3JlLl/EjWV0Ll9wZXQuX3NvYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdG9fc3JfxI1lX3BlX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuIE1NLiBZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmVzIG9iXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2p1dHJpIG9iXSBMVCcsXG5cbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIFtuZWRlbGpvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gW3NyZWRvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gW3NvYm90b10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIGRkZGQgW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbdsSNZXJhaiBvYl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmpvXSBbbmVkZWxqb10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZWrFoW5qb10gW3NyZWRvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmpvXSBbc29ib3RvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmppXSBkZGRkIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ8SNZXogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByZWQgJXMnLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFsYmFuaWFuIFtzcV1cbi8vISBhdXRob3IgOiBGbGFrw6tyaW0gSXNtYW5pIDogaHR0cHM6Ly9naXRodWIuY29tL2ZsYWtlcmltaVxuLy8hIGF1dGhvciA6IE1lbmVsaW9uIEVsZW5zw7psZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG4vLyEgYXV0aG9yIDogT2VyZCBDdWthbGxhIDogaHR0cHM6Ly9naXRodWIuY29tL29lcmRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzcSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NxJywge1xuICAgICAgICBtb250aHM6ICdKYW5hcl9TaGt1cnRfTWFyc19QcmlsbF9NYWpfUWVyc2hvcl9Lb3JyaWtfR3VzaHRfU2h0YXRvcl9UZXRvcl9Ow6tudG9yX0RoamV0b3InLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX1Noa19NYXJfUHJpX01hal9RZXJfS29yX0d1c19TaHRfVGV0X07Dq25fRGhqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0UgRGllbF9FIEjDq27Dq19FIE1hcnTDq19FIE3Dq3JrdXLDq19FIEVuanRlX0UgUHJlbXRlX0UgU2h0dW7Dqycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0RpZV9Iw6tuX01hcl9Nw6tyX0Vual9QcmVfU2h0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0RfSF9NYV9Nw6tfRV9QX1NoJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9QRHxNRC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LmNoYXJBdCgwKSA9PT0gJ00nO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gaG91cnMgPCAxMiA/ICdQRCcgOiAnTUQnO1xuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1NvdCBuw6tdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbTmVzw6tyIG7Dq10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtuw6tdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRGplIG7Dq10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtlIGthbHVhciBuw6tdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnbsOrICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBtw6sgcGFyw6snLFxuICAgICAgICAgICAgczogJ2Rpc2Egc2Vrb25kYScsXG4gICAgICAgICAgICBzczogJyVkIHNla29uZGEnLFxuICAgICAgICAgICAgbTogJ25qw6sgbWludXTDqycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0YScsXG4gICAgICAgICAgICBoOiAnbmrDqyBvcsOrJyxcbiAgICAgICAgICAgIGhoOiAnJWQgb3LDqycsXG4gICAgICAgICAgICBkOiAnbmrDqyBkaXTDqycsXG4gICAgICAgICAgICBkZDogJyVkIGRpdMOrJyxcbiAgICAgICAgICAgIE06ICduasOrIG11YWonLFxuICAgICAgICAgICAgTU06ICclZCBtdWFqJyxcbiAgICAgICAgICAgIHk6ICduasOrIHZpdCcsXG4gICAgICAgICAgICB5eTogJyVkIHZpdGUnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNxO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNlcmJpYW4gQ3lyaWxsaWMgW3NyLWN5cmxdXG4vLyEgYXV0aG9yIDogTWlsYW4gSmFuYcSNa292acSHPG1pbGFuamFuYWNrb3ZpY0BnbWFpbC5jb20+IDogaHR0cHM6Ly9naXRodWIuY29tL21pbGFuLWpcbi8vISBhdXRob3IgOiBTdGVmYW4gQ3JuamFrb3ZpxIcgPHN0ZWZhbkBob3RtYWlsLnJzPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jcm5qYWtvdmljXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdHJhbnNsYXRvciA9IHtcbiAgICAgICAgd29yZHM6IHtcbiAgICAgICAgICAgIC8vRGlmZmVyZW50IGdyYW1tYXRpY2FsIGNhc2VzXG4gICAgICAgICAgICBzczogWyfRgdC10LrRg9C90LTQsCcsICfRgdC10LrRg9C90LTQtScsICfRgdC10LrRg9C90LTQuCddLFxuICAgICAgICAgICAgbTogWyfRmNC10LTQsNC9INC80LjQvdGD0YInLCAn0ZjQtdC00L3QvtCzINC80LjQvdGD0YLQsCddLFxuICAgICAgICAgICAgbW06IFsn0LzQuNC90YPRgicsICfQvNC40L3Rg9GC0LAnLCAn0LzQuNC90YPRgtCwJ10sXG4gICAgICAgICAgICBoOiBbJ9GY0LXQtNCw0L0g0YHQsNGCJywgJ9GY0LXQtNC90L7QsyDRgdCw0YLQsCddLFxuICAgICAgICAgICAgaGg6IFsn0YHQsNGCJywgJ9GB0LDRgtCwJywgJ9GB0LDRgtC4J10sXG4gICAgICAgICAgICBkOiBbJ9GY0LXQtNCw0L0g0LTQsNC9JywgJ9GY0LXQtNC90L7QsyDQtNCw0L3QsCddLFxuICAgICAgICAgICAgZGQ6IFsn0LTQsNC9JywgJ9C00LDQvdCwJywgJ9C00LDQvdCwJ10sXG4gICAgICAgICAgICBNOiBbJ9GY0LXQtNCw0L0g0LzQtdGB0LXRhicsICfRmNC10LTQvdC+0LMg0LzQtdGB0LXRhtCwJ10sXG4gICAgICAgICAgICBNTTogWyfQvNC10YHQtdGGJywgJ9C80LXRgdC10YbQsCcsICfQvNC10YHQtdGG0LgnXSxcbiAgICAgICAgICAgIHk6IFsn0ZjQtdC00L3RgyDQs9C+0LTQuNC90YMnLCAn0ZjQtdC00L3QtSDQs9C+0LTQuNC90LUnXSxcbiAgICAgICAgICAgIHl5OiBbJ9Cz0L7QtNC40L3RgycsICfQs9C+0LTQuNC90LUnLCAn0LPQvtC00LjQvdCwJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGNvcnJlY3RHcmFtbWF0aWNhbENhc2U6IGZ1bmN0aW9uIChudW1iZXIsIHdvcmRLZXkpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBudW1iZXIgJSAxMCA+PSAxICYmXG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAgPD0gNCAmJlxuICAgICAgICAgICAgICAgIChudW1iZXIgJSAxMDAgPCAxMCB8fCBudW1iZXIgJSAxMDAgPj0gMjApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDEgPyB3b3JkS2V5WzBdIDogd29yZEtleVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3JkS2V5WzJdO1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgIHZhciB3b3JkS2V5ID0gdHJhbnNsYXRvci53b3Jkc1trZXldLFxuICAgICAgICAgICAgICAgIHdvcmQ7XG5cbiAgICAgICAgICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gTm9taW5hdGl2XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3knICYmIHdpdGhvdXRTdWZmaXgpIHJldHVybiAn0ZjQtdC00L3QsCDQs9C+0LTQuNC90LAnO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdvcmQgPSB0cmFuc2xhdG9yLmNvcnJlY3RHcmFtbWF0aWNhbENhc2UobnVtYmVyLCB3b3JkS2V5KTtcbiAgICAgICAgICAgIC8vIE5vbWluYXRpdlxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3l5JyAmJiB3aXRob3V0U3VmZml4ICYmIHdvcmQgPT09ICfQs9C+0LTQuNC90YMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg0LPQvtC00LjQvdCwJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHdvcmQ7XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHZhciBzckN5cmwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzci1jeXJsJywge1xuICAgICAgICBtb250aHM6ICfRmNCw0L3Rg9Cw0YBf0YTQtdCx0YDRg9Cw0YBf0LzQsNGA0YJf0LDQv9GA0LjQu1/QvNCw0Zhf0ZjRg9C9X9GY0YPQu1/QsNCy0LPRg9GB0YJf0YHQtdC/0YLQtdC80LHQsNGAX9C+0LrRgtC+0LHQsNGAX9C90L7QstC10LzQsdCw0YBf0LTQtdGG0LXQvNCx0LDRgCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn0ZjQsNC9Ll/RhNC10LEuX9C80LDRgC5f0LDQv9GALl/QvNCw0Zhf0ZjRg9C9X9GY0YPQu1/QsNCy0LMuX9GB0LXQvy5f0L7QutGCLl/QvdC+0LIuX9C00LXRhi4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn0L3QtdC00LXRmdCwX9C/0L7QvdC10LTQtdGZ0LDQul/Rg9GC0L7RgNCw0Lpf0YHRgNC10LTQsF/Rh9C10YLQstGA0YLQsNC6X9C/0LXRgtCw0Lpf0YHRg9Cx0L7RgtCwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0L3QtdC0Ll/Qv9C+0L0uX9GD0YLQvi5f0YHRgNC1Ll/Rh9C10YIuX9C/0LXRgi5f0YHRg9CxLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvdC1X9C/0L5f0YPRgl/RgdGAX9GH0LVf0L/QtV/RgdGDJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC4gTS4gWVlZWS4nLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVkuJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWS4gSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZLiBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0LTQsNC90LDRgSDRg10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vRgdGD0YLRgNCwINGDXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gW9C90LXQtNC10ZnRg10gW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9GDXSBb0YHRgNC10LTRg10gW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9GDXSBb0YHRg9Cx0L7RgtGDXSBb0YNdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIGRkZGQgW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0ZjRg9GH0LUg0YNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RXZWVrRGF5cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70LVdIFvQvdC10LTQtdGZ0LVdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQvtCzXSBb0L/QvtC90LXQtNC10ZnQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9GD0YLQvtGA0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C1XSBb0YHRgNC10LTQtV0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvRh9C10YLQstGA0YLQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9C/0LXRgtC60LBdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQtV0gW9GB0YPQsdC+0YLQtV0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFdlZWtEYXlzW3RoaXMuZGF5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0LfQsCAlcycsXG4gICAgICAgICAgICBwYXN0OiAn0L/RgNC1ICVzJyxcbiAgICAgICAgICAgIHM6ICfQvdC10LrQvtC70LjQutC+INGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3JDeXJsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNlcmJpYW4gW3NyXVxuLy8hIGF1dGhvciA6IE1pbGFuIEphbmHEjWtvdmnEhzxtaWxhbmphbmFja292aWNAZ21haWwuY29tPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWxhbi1qXG4vLyEgYXV0aG9yIDogU3RlZmFuIENybmpha292acSHIDxzdGVmYW5AaG90bWFpbC5ycz4gOiBodHRwczovL2dpdGh1Yi5jb20vY3JuamFrb3ZpY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRyYW5zbGF0b3IgPSB7XG4gICAgICAgIHdvcmRzOiB7XG4gICAgICAgICAgICAvL0RpZmZlcmVudCBncmFtbWF0aWNhbCBjYXNlc1xuICAgICAgICAgICAgc3M6IFsnc2VrdW5kYScsICdzZWt1bmRlJywgJ3Nla3VuZGknXSxcbiAgICAgICAgICAgIG06IFsnamVkYW4gbWludXQnLCAnamVkbm9nIG1pbnV0YSddLFxuICAgICAgICAgICAgbW06IFsnbWludXQnLCAnbWludXRhJywgJ21pbnV0YSddLFxuICAgICAgICAgICAgaDogWydqZWRhbiBzYXQnLCAnamVkbm9nIHNhdGEnXSxcbiAgICAgICAgICAgIGhoOiBbJ3NhdCcsICdzYXRhJywgJ3NhdGknXSxcbiAgICAgICAgICAgIGQ6IFsnamVkYW4gZGFuJywgJ2plZG5vZyBkYW5hJ10sXG4gICAgICAgICAgICBkZDogWydkYW4nLCAnZGFuYScsICdkYW5hJ10sXG4gICAgICAgICAgICBNOiBbJ2plZGFuIG1lc2VjJywgJ2plZG5vZyBtZXNlY2EnXSxcbiAgICAgICAgICAgIE1NOiBbJ21lc2VjJywgJ21lc2VjYScsICdtZXNlY2knXSxcbiAgICAgICAgICAgIHk6IFsnamVkbnUgZ29kaW51JywgJ2plZG5lIGdvZGluZSddLFxuICAgICAgICAgICAgeXk6IFsnZ29kaW51JywgJ2dvZGluZScsICdnb2RpbmEnXSxcbiAgICAgICAgfSxcbiAgICAgICAgY29ycmVjdEdyYW1tYXRpY2FsQ2FzZTogZnVuY3Rpb24gKG51bWJlciwgd29yZEtleSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bWJlciAlIDEwID49IDEgJiZcbiAgICAgICAgICAgICAgICBudW1iZXIgJSAxMCA8PSA0ICYmXG4gICAgICAgICAgICAgICAgKG51bWJlciAlIDEwMCA8IDEwIHx8IG51bWJlciAlIDEwMCA+PSAyMClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMSA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdvcmRLZXlbMl07XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgdmFyIHdvcmRLZXkgPSB0cmFuc2xhdG9yLndvcmRzW2tleV0sXG4gICAgICAgICAgICAgICAgd29yZDtcblxuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBOb21pbmF0aXZcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAneScgJiYgd2l0aG91dFN1ZmZpeCkgcmV0dXJuICdqZWRuYSBnb2RpbmEnO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdvcmQgPSB0cmFuc2xhdG9yLmNvcnJlY3RHcmFtbWF0aWNhbENhc2UobnVtYmVyLCB3b3JkS2V5KTtcbiAgICAgICAgICAgIC8vIE5vbWluYXRpdlxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3l5JyAmJiB3aXRob3V0U3VmZml4ICYmIHdvcmQgPT09ICdnb2RpbnUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgZ29kaW5hJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHdvcmQ7XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHZhciBzciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NyJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0X2FwcmlsX21hal9qdW5fanVsX2F2Z3VzdF9zZXB0ZW1iYXJfb2t0b2Jhcl9ub3ZlbWJhcl9kZWNlbWJhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hci5fYXByLl9tYWpfanVuX2p1bF9hdmcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkZWxqYV9wb25lZGVsamFrX3V0b3Jha19zcmVkYV/EjWV0dnJ0YWtfcGV0YWtfc3Vib3RhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3V0by5fc3JlLl/EjWV0Ll9wZXQuX3N1Yi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3JfxI1lX3BlX3N1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC4gTS4gWVlZWS4nLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVkuJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWS4gSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZLiBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZGFuYXMgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tzdXRyYSB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbbmVkZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3NyZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3Vib3R1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbanXEjWUgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdFdlZWtEYXlzID0gW1xuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtuZWRlbGplXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcG9uZWRlbGprYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3V0b3JrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbc3JlZGVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFvEjWV0dnJ0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFtwZXRrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RXZWVrRGF5c1t0aGlzLmRheSgpXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmUgJXMnLFxuICAgICAgICAgICAgczogJ25la29saWtvIHNla3VuZGknLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBzaVN3YXRpIFtzc11cbi8vISBhdXRob3IgOiBOaWNvbGFpIERhdmllczxtYWlsQG5pY29sYWkuaW8+IDogaHR0cHM6Ly9naXRodWIuY29tL25pY29sYWlkYXZpZXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NzJywge1xuICAgICAgICBtb250aHM6IFwiQmhpbWJpZHZ3YW5lX0luZGxvdmFuYV9JbmRsb3YnbGVua2h1bHVfTWFiYXNhX0lua2h3ZWtod2V0aV9JbmhsYWJhX0tob2x3YW5lX0luZ2NpX0lueW9uaV9JbXBoYWxhX0x3ZXRpX0luZ29uZ29uaVwiLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnQmhpX0luYV9JbnVfTWFiX0lua19JbmhfS2hvX0lnY19JbnlfSW1wX0x3ZV9JZ28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ0xpc29udGZvX1Vtc29tYnVsdWtvX0xlc2liaWxpX0xlc2l0c2F0ZnVfTGVzaW5lX0xlc2lobGFudV9VbWdjaWJlbG8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0xpc19VbWJfTHNiX0xlc19Mc2lfTHNoX1VtZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdMaV9Vc19MYl9MdF9Mc19MaF9VZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tOYW11aGxhIG5nYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tLdXNhc2EgbmdhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW25nYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJdG9sbyBuZ2FdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGVsaXBoZWxpbGVdIFtuZ2FdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnbmdhICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICd3ZW50ZWthIG5nYSAlcycsXG4gICAgICAgICAgICBzOiAnZW1penV6d2FuYSBsb21jYW5lJyxcbiAgICAgICAgICAgIHNzOiAnJWQgbXp1endhbmEnLFxuICAgICAgICAgICAgbTogJ3VtenV6dScsXG4gICAgICAgICAgICBtbTogJyVkIGVtaXp1enUnLFxuICAgICAgICAgICAgaDogJ2xpaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGVtYWhvcmEnLFxuICAgICAgICAgICAgZDogJ2xpbGFuZ2EnLFxuICAgICAgICAgICAgZGQ6ICclZCBlbWFsYW5nYScsXG4gICAgICAgICAgICBNOiAnaW55YW5nYScsXG4gICAgICAgICAgICBNTTogJyVkIHRpbnlhbmdhJyxcbiAgICAgICAgICAgIHk6ICd1bW55YWthJyxcbiAgICAgICAgICAgIHl5OiAnJWQgaW1pbnlha2EnLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvZWt1c2VuaXxlbWluaXxlbnRzYW1iYW1hfGVidXN1a3UvLFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZWt1c2VuaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VtaW5pJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZW50c2FtYmFtYSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZWJ1c3VrdSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ2VrdXNlbmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnZW1pbmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ2VudHNhbWJhbWEnIHx8IG1lcmlkaWVtID09PSAnZWJ1c3VrdScpIHtcbiAgICAgICAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogJyVkJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFN3ZWRpc2ggW3N2XVxuLy8hIGF1dGhvciA6IEplbnMgQWxtIDogaHR0cHM6Ly9naXRodWIuY29tL3VsbXVzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3YgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzdicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyaV9mZWJydWFyaV9tYXJzX2FwcmlsX21hal9qdW5pX2p1bGlfYXVndXN0aV9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWFqX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdzw7ZuZGFnX23DpW5kYWdfdGlzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sw7ZyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc8O2bl9tw6VuX3Rpc19vbnNfdG9yX2ZyZV9sw7ZyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3PDtl9tw6VfdGlfb25fdG9fZnJfbMO2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbDogJ0QgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCBEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSWRhZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tJbW9yZ29uXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0lnw6VyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tQw6VdIGRkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbSV0gZGRkZFtzXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdmw7ZyICVzIHNlZGFuJyxcbiAgICAgICAgICAgIHM6ICduw6VncmEgc2VrdW5kZXInLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRlcicsXG4gICAgICAgICAgICBtOiAnZW4gbWludXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVyJyxcbiAgICAgICAgICAgIGg6ICdlbiB0aW1tZScsXG4gICAgICAgICAgICBoaDogJyVkIHRpbW1hcicsXG4gICAgICAgICAgICBkOiAnZW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnYXInLFxuICAgICAgICAgICAgTTogJ2VuIG3DpW5hZCcsXG4gICAgICAgICAgICBNTTogJyVkIG3DpW5hZGVyJyxcbiAgICAgICAgICAgIHk6ICdldHQgw6VyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw6VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KFxcOmV8XFw6YSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICc6ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICc6YSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnOmEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICc6ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJzplJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTd2FoaWxpIFtzd11cbi8vISBhdXRob3IgOiBGYWhhZCBLYXNzaW0gOiBodHRwczovL2dpdGh1Yi5jb20vZmFkc2VsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3cgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzdycsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyaV9GZWJydWFyaV9NYWNoaV9BcHJpbGlfTWVpX0p1bmlfSnVsYWlfQWdvc3RpX1NlcHRlbWJhX09rdG9iYV9Ob3ZlbWJhX0Rlc2VtYmEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYWNfQXByX01laV9KdW5fSnVsX0Fnb19TZXBfT2t0X05vdl9EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ0p1bWFwaWxpX0p1bWF0YXR1X0p1bWFubmVfSnVtYXRhbm9fQWxoYW1pc2lfSWp1bWFhX0p1bWFtb3NpJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdKcGxfSnRhdF9Kbm5lX0p0YW5fQWxoX0lqbV9KbW9zJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0oyX0ozX0o0X0o1X0FsX0lqX0oxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2hoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tsZW8gc2FhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2tlc2hvIHNhYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbd2lraSBpamF5b10gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tqYW5hXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1t3aWtpIGlsaXlvcGl0YV0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBiYWFkYXllJyxcbiAgICAgICAgICAgIHBhc3Q6ICd0b2tlYSAlcycsXG4gICAgICAgICAgICBzOiAnaGl2aSBwdW5kZScsXG4gICAgICAgICAgICBzczogJ3Nla3VuZGUgJWQnLFxuICAgICAgICAgICAgbTogJ2Rha2lrYSBtb2phJyxcbiAgICAgICAgICAgIG1tOiAnZGFraWthICVkJyxcbiAgICAgICAgICAgIGg6ICdzYWEgbGltb2phJyxcbiAgICAgICAgICAgIGhoOiAnbWFzYWEgJWQnLFxuICAgICAgICAgICAgZDogJ3Npa3UgbW9qYScsXG4gICAgICAgICAgICBkZDogJ3Npa3UgJWQnLFxuICAgICAgICAgICAgTTogJ213ZXppIG1tb2phJyxcbiAgICAgICAgICAgIE1NOiAnbWllemkgJWQnLFxuICAgICAgICAgICAgeTogJ213YWthIG1tb2phJyxcbiAgICAgICAgICAgIHl5OiAnbWlha2EgJWQnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3c7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGFtaWwgW3RhXVxuLy8hIGF1dGhvciA6IEFyanVua3VtYXIgS3Jpc2huYW1vb3J0aHkgOiBodHRwczovL2dpdGh1Yi5jb20vdGsxMjA0MDRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4K+nJyxcbiAgICAgICAgICAgIDI6ICfgr6gnLFxuICAgICAgICAgICAgMzogJ+CvqScsXG4gICAgICAgICAgICA0OiAn4K+qJyxcbiAgICAgICAgICAgIDU6ICfgr6snLFxuICAgICAgICAgICAgNjogJ+CvrCcsXG4gICAgICAgICAgICA3OiAn4K+tJyxcbiAgICAgICAgICAgIDg6ICfgr64nLFxuICAgICAgICAgICAgOTogJ+CvrycsXG4gICAgICAgICAgICAwOiAn4K+mJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Cvpyc6ICcxJyxcbiAgICAgICAgICAgICfgr6gnOiAnMicsXG4gICAgICAgICAgICAn4K+pJzogJzMnLFxuICAgICAgICAgICAgJ+Cvqic6ICc0JyxcbiAgICAgICAgICAgICfgr6snOiAnNScsXG4gICAgICAgICAgICAn4K+sJzogJzYnLFxuICAgICAgICAgICAgJ+CvrSc6ICc3JyxcbiAgICAgICAgICAgICfgr64nOiAnOCcsXG4gICAgICAgICAgICAn4K+vJzogJzknLFxuICAgICAgICAgICAgJ+Cvpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciB0YSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RhJywge1xuICAgICAgICBtb250aHM6ICfgrpzgrqngrrXgrrDgrr9f4K6q4K6/4K6q4K+N4K6w4K614K6w4K6/X+CuruCuvuCusOCvjeCumuCvjV/gro/grqrgr43grrDgrrLgr41f4K6u4K+HX+CunOCvguCuqeCvjV/grpzgr4LgrrLgr4hf4K6G4K6V4K644K+N4K6f4K+NX+CumuCvhuCuquCvjeCun+CvhuCuruCvjeCuquCusOCvjV/groXgrpXgr43grp/gr4fgrr7grqrgrrDgr41f4K6o4K614K6u4K+N4K6q4K6w4K+NX+Cun+Cuv+CumuCuruCvjeCuquCusOCvjScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4K6c4K6p4K614K6w4K6/X+CuquCuv+CuquCvjeCusOCuteCusOCuv1/grq7grr7grrDgr43grprgr41f4K6P4K6q4K+N4K6w4K6y4K+NX+CuruCvh1/grpzgr4Lgrqngr41f4K6c4K+C4K6y4K+IX+CuhuCuleCuuOCvjeCun+CvjV/grprgr4bgrqrgr43grp/gr4bgrq7gr43grqrgrrDgr41f4K6F4K6V4K+N4K6f4K+H4K6+4K6q4K6w4K+NX+CuqOCuteCuruCvjeCuquCusOCvjV/grp/grr/grprgrq7gr43grqrgrrDgr40nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4K6e4K6+4K6v4K6/4K6x4K+N4K6x4K+B4K6V4K+N4K6V4K6/4K604K6u4K+IX+CupOCuv+CumeCvjeCuleCun+CvjeCuleCuv+CutOCuruCviF/grprgr4bgrrXgr43grrXgrr7grq/gr43grpXgrr/grrTgrq7gr4hf4K6q4K+B4K6k4K6p4K+N4K6V4K6/4K604K6u4K+IX+CuteCuv+Cur+CuvuCutOCuleCvjeCuleCuv+CutOCuruCviF/grrXgr4bgrrPgr43grrPgrr/grpXgr43grpXgrr/grrTgrq7gr4hf4K6a4K6p4K6/4K6V4K+N4K6V4K6/4K604K6u4K+IJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgrp7grr7grq/grr/grrHgr4Ff4K6k4K6/4K6Z4K+N4K6V4K6z4K+NX+CumuCvhuCuteCvjeCuteCuvuCur+CvjV/grqrgr4HgrqTgrqngr41f4K614K6/4K6v4K6+4K604K6p4K+NX+CuteCvhuCus+CvjeCus+Cuv1/grprgrqngrr8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4K6e4K6+X+CupOCuv1/grprgr4Zf4K6q4K+BX+CuteCuv1/grrXgr4Zf4K6aJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4K6H4K6p4K+N4K6x4K+BXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CuqOCuvuCus+CviF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CuqOCvh+CuseCvjeCuseCvgV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4K6V4K6f4K6o4K+N4K6kIOCuteCuvuCusOCuruCvjV0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgrofgrrLgr40nLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCuruCvgeCuqeCvjScsXG4gICAgICAgICAgICBzOiAn4K6S4K6w4K+BIOCumuCuv+CusiDgrrXgrr/grqjgrr7grp/grr/grpXgrrPgr40nLFxuICAgICAgICAgICAgc3M6ICclZCDgrrXgrr/grqjgrr7grp/grr/grpXgrrPgr40nLFxuICAgICAgICAgICAgbTogJ+CukuCusOCvgSDgrqjgrr/grq7grr/grp/grq7gr40nLFxuICAgICAgICAgICAgbW06ICclZCDgrqjgrr/grq7grr/grp/grpngr43grpXgrrPgr40nLFxuICAgICAgICAgICAgaDogJ+CukuCusOCvgSDgrq7grqPgrr8g4K6o4K+H4K6w4K6u4K+NJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4K6u4K6j4K6/IOCuqOCvh+CusOCuruCvjScsXG4gICAgICAgICAgICBkOiAn4K6S4K6w4K+BIOCuqOCuvuCus+CvjScsXG4gICAgICAgICAgICBkZDogJyVkIOCuqOCuvuCun+CvjeCuleCus+CvjScsXG4gICAgICAgICAgICBNOiAn4K6S4K6w4K+BIOCuruCuvuCupOCuruCvjScsXG4gICAgICAgICAgICBNTTogJyVkIOCuruCuvuCupOCumeCvjeCuleCus+CvjScsXG4gICAgICAgICAgICB5OiAn4K6S4K6w4K+BIOCuteCusOCvgeCun+CuruCvjScsXG4gICAgICAgICAgICB5eTogJyVkIOCuhuCuo+CvjeCun+CvgeCuleCus+CvjScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfeCuteCupOCvgS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn4K614K6k4K+BJztcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cvp+CvqOCvqeCvquCvq+CvrOCvreCvruCvr+Cvpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gcmVmZXIgaHR0cDovL3RhLndpa2lwZWRpYS5vcmcvcy8xZXIxXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/grq/grr7grq7grq7gr4184K614K+I4K6V4K6x4K+IfOCuleCuvuCusuCviHzgrqjgrqPgr43grqrgrpXgrrLgr4184K6O4K6x4K+N4K6q4K6+4K6f4K+BfOCuruCuvuCusuCviC8sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrq/grr7grq7grq7gr40nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuteCviOCuleCuseCviCc7IC8vIOCuteCviOCuleCuseCviFxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrpXgrr7grrLgr4gnOyAvLyDgrpXgrr7grrLgr4hcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6o4K6j4K+N4K6q4K6V4K6y4K+NJzsgLy8g4K6o4K6j4K+N4K6q4K6V4K6y4K+NXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCujuCuseCvjeCuquCuvuCun+CvgSc7IC8vIOCujuCuseCvjeCuquCuvuCun+CvgVxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrq7grr7grrLgr4gnOyAvLyDgrq7grr7grrLgr4hcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6v4K6+4K6u4K6u4K+NJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4K6v4K6+4K6u4K6u4K+NJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgMiA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4K614K+I4K6V4K6x4K+IJyB8fCBtZXJpZGllbSA9PT0gJ+CuleCuvuCusuCviCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgrqjgrqPgr43grqrgrpXgrrLgr40nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGVsdWd1IFt0ZV1cbi8vISBhdXRob3IgOiBLcmlzaG5hIENoYWl0YW55YSBUaG90YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rY3Rob3RhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdGUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0ZScsIHtcbiAgICAgICAgbW9udGhzOiAn4LCc4LCo4LC14LCw4LC/X+Cwq+Cwv+CwrOCxjeCwsOCwteCwsOCwv1/gsK7gsL7gsLDgsY3gsJrgsL9f4LCP4LCq4LGN4LCw4LC/4LCy4LGNX+CwruCxh1/gsJzgsYLgsKjgsY1f4LCc4LGB4LCy4LGIX+CwhuCwl+CwuOCxjeCwn+CxgV/gsLjgsYbgsKrgsY3gsJ/gsYbgsILgsKzgsLDgsY1f4LCF4LCV4LGN4LCf4LGL4LCs4LCw4LGNX+CwqOCwteCwguCwrOCwsOCxjV/gsKHgsL/gsLjgsYbgsILgsKzgsLDgsY0nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CwnOCwqC5f4LCr4LC/4LCs4LGN4LCwLl/gsK7gsL7gsLDgsY3gsJrgsL9f4LCP4LCq4LGN4LCw4LC/Ll/gsK7gsYdf4LCc4LGC4LCo4LGNX+CwnOCxgeCwsuCxiF/gsIbgsJcuX+CwuOCxhuCwquCxjS5f4LCF4LCV4LGN4LCf4LGLLl/gsKjgsLUuX+CwoeCwv+CwuOCxhi4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4LCG4LCm4LC/4LC14LC+4LCw4LCCX+CwuOCxi+CwruCwteCwvuCwsOCwgl/gsK7gsILgsJfgsLPgsLXgsL7gsLDgsIJf4LCs4LGB4LCn4LC14LC+4LCw4LCCX+Cwl+CxgeCwsOCxgeCwteCwvuCwsOCwgl/gsLbgsYHgsJXgsY3gsLDgsLXgsL7gsLDgsIJf4LC24LCo4LC/4LC14LC+4LCw4LCCJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgsIbgsKbgsL9f4LC44LGL4LCuX+CwruCwguCwl+Cws1/gsKzgsYHgsKdf4LCX4LGB4LCw4LGBX+CwtuCxgeCwleCxjeCwsF/gsLbgsKjgsL8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4LCGX+CwuOCxi1/gsK7gsIJf4LCs4LGBX+Cwl+CxgV/gsLbgsYFf4LC2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CwqOCxh+CwoeCxgV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgsLDgsYfgsKrgsYFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgsKjgsL/gsKjgsY3gsKhdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Cwl+CwpF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgsLLgsYsnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCwleCxjeCwsOCwv+CwpOCwgicsXG4gICAgICAgICAgICBzOiAn4LCV4LGK4LCo4LGN4LCo4LC/IOCwleCxjeCwt+Cwo+CwvuCwsuCxgScsXG4gICAgICAgICAgICBzczogJyVkIOCwuOCxhuCwleCwqOCxjeCwsuCxgScsXG4gICAgICAgICAgICBtOiAn4LCS4LCVIOCwqOCwv+CwruCwv+Cwt+CwgicsXG4gICAgICAgICAgICBtbTogJyVkIOCwqOCwv+CwruCwv+Cwt+CwvuCwsuCxgScsXG4gICAgICAgICAgICBoOiAn4LCS4LCVIOCwl+CwguCwnycsXG4gICAgICAgICAgICBoaDogJyVkIOCwl+CwguCwn+CwsuCxgScsXG4gICAgICAgICAgICBkOiAn4LCS4LCVIOCwsOCxi+CwnOCxgScsXG4gICAgICAgICAgICBkZDogJyVkIOCwsOCxi+CwnOCxgeCwsuCxgScsXG4gICAgICAgICAgICBNOiAn4LCS4LCVIOCwqOCxhuCwsicsXG4gICAgICAgICAgICBNTTogJyVkIOCwqOCxhuCwsuCwsuCxgScsXG4gICAgICAgICAgICB5OiAn4LCS4LCVIOCwuOCwguCwteCwpOCxjeCwuOCwsOCwgicsXG4gICAgICAgICAgICB5eTogJyVkIOCwuOCwguCwteCwpOCxjeCwuOCwsOCwvuCwsuCxgScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfeCwtS8sXG4gICAgICAgIG9yZGluYWw6ICclZOCwtScsXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gsLDgsL7gsKTgsY3gsLDgsL984LCJ4LCm4LCv4LCCfOCwruCwp+CxjeCwr+CwvuCwueCxjeCwqOCwgnzgsLjgsL7gsK/gsILgsKTgsY3gsLDgsIIvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgsLDgsL7gsKTgsY3gsLDgsL8nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsIngsKbgsK/gsIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LCu4LCn4LGN4LCv4LC+4LC54LGN4LCo4LCCJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsLjgsL7gsK/gsILgsKTgsY3gsLDgsIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LCw4LC+4LCk4LGN4LCw4LC/JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsIngsKbgsK/gsIInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwruCwp+CxjeCwr+CwvuCwueCxjeCwqOCwgic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LC44LC+4LCv4LCC4LCk4LGN4LCw4LCCJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsLDgsL7gsKTgsY3gsLDgsL8nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGV0dW4gRGlsaSAoRWFzdCBUaW1vcikgW3RldF1cbi8vISBhdXRob3IgOiBKb3NodWEgQnJvb2tzIDogaHR0cHM6Ly9naXRodWIuY29tL2pvc2hicm9va3Ncbi8vISBhdXRob3IgOiBPbm9yaW8gRGUgSi4gQWZvbnNvIDogaHR0cHM6Ly9naXRodWIuY29tL21hcm9ib1xuLy8hIGF1dGhvciA6IFNvbmlhIFNpbW9lcyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zb25pYXNpbW9lc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRldCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RldCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFuZWlydV9GZXZlcmVpcnVfTWFyc3VfQWJyaWxfTWFpdV9KdcOxdV9KdWxsdV9BZ3VzdHVfU2V0ZW1icnVfT3V0dWJydV9Ob3ZlbWJydV9EZXplbWJydScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmV2X01hcl9BYnJfTWFpX0p1bl9KdWxfQWdvX1NldF9PdXRfTm92X0Rleicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdEb21pbmd1X1NlZ3VuZGFfVGVyc2FfS3VhcnRhX0tpbnRhX1Nlc3RhX1NhYmFkdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0RvbV9TZWdfVGVyc19LdWFfS2ludF9TZXN0X1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdEb19TZWdfVGVfS3VfS2lfU2VzX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW09oaW4gaWhhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0FiYW4gaWhhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2loYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIb3Jpc2VpayBpaGFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbc2VtYW5hIGtvdHVrXSBbaWhhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2loYSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgbGl1YmEnLFxuICAgICAgICAgICAgczogJ3NlZ3VuZHUgYmFsdW4nLFxuICAgICAgICAgICAgc3M6ICdzZWd1bmR1ICVkJyxcbiAgICAgICAgICAgIG06ICdtaW51dHUgaWRhJyxcbiAgICAgICAgICAgIG1tOiAnbWludXR1ICVkJyxcbiAgICAgICAgICAgIGg6ICdvcmFzIGlkYScsXG4gICAgICAgICAgICBoaDogJ29yYXMgJWQnLFxuICAgICAgICAgICAgZDogJ2xvcm9uIGlkYScsXG4gICAgICAgICAgICBkZDogJ2xvcm9uICVkJyxcbiAgICAgICAgICAgIE06ICdmdWxhbiBpZGEnLFxuICAgICAgICAgICAgTU06ICdmdWxhbiAlZCcsXG4gICAgICAgICAgICB5OiAndGluYW4gaWRhJyxcbiAgICAgICAgICAgIHl5OiAndGluYW4gJWQnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGV0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRhamlrIFt0Z11cbi8vISBhdXRob3IgOiBPcmlmIE4uIEpyLiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9vcmlmLWpyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDA6ICct0YPQvCcsXG4gICAgICAgIDE6ICct0YPQvCcsXG4gICAgICAgIDI6ICct0Y7QvCcsXG4gICAgICAgIDM6ICct0Y7QvCcsXG4gICAgICAgIDQ6ICct0YPQvCcsXG4gICAgICAgIDU6ICct0YPQvCcsXG4gICAgICAgIDY6ICct0YPQvCcsXG4gICAgICAgIDc6ICct0YPQvCcsXG4gICAgICAgIDg6ICct0YPQvCcsXG4gICAgICAgIDk6ICct0YPQvCcsXG4gICAgICAgIDEwOiAnLdGD0LwnLFxuICAgICAgICAxMjogJy3Rg9C8JyxcbiAgICAgICAgMTM6ICct0YPQvCcsXG4gICAgICAgIDIwOiAnLdGD0LwnLFxuICAgICAgICAzMDogJy3RjtC8JyxcbiAgICAgICAgNDA6ICct0YPQvCcsXG4gICAgICAgIDUwOiAnLdGD0LwnLFxuICAgICAgICA2MDogJy3Rg9C8JyxcbiAgICAgICAgNzA6ICct0YPQvCcsXG4gICAgICAgIDgwOiAnLdGD0LwnLFxuICAgICAgICA5MDogJy3Rg9C8JyxcbiAgICAgICAgMTAwOiAnLdGD0LwnLFxuICAgIH07XG5cbiAgICB2YXIgdGcgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0ZycsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfRj9C90LLQsNGA0Lhf0YTQtdCy0YDQsNC70Lhf0LzQsNGA0YLQuF/QsNC/0YDQtdC70Lhf0LzQsNC50Lhf0LjRjtC90Lhf0LjRjtC70Lhf0LDQstCz0YPRgdGC0Lhf0YHQtdC90YLRj9Cx0YDQuF/QvtC60YLRj9Cx0YDQuF/QvdC+0Y/QsdGA0Lhf0LTQtdC60LDQsdGA0LgnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GP0L3QstCw0YBf0YTQtdCy0YDQsNC7X9C80LDRgNGCX9Cw0L/RgNC10Ltf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCz0YPRgdGCX9GB0LXQvdGC0Y/QsdGAX9C+0LrRgtGP0LHRgF/QvdC+0Y/QsdGAX9C00LXQutCw0LHRgCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0Y/QvdCyX9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDQuV/QuNGO0L1f0LjRjtC7X9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0Y/QutGI0LDQvdCx0LVf0LTRg9GI0LDQvdCx0LVf0YHQtdGI0LDQvdCx0LVf0YfQvtGA0YjQsNC90LHQtV/Qv9Cw0L3St9GI0LDQvdCx0LVf0rfRg9C80YrQsF/RiNCw0L3QsdC1Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0Y/RiNCxX9C00YjQsV/RgdGI0LFf0YfRiNCxX9C/0YjQsV/St9GD0Lxf0YjQvdCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9GP0Yhf0LTRiF/RgdGIX9GH0Yhf0L/RiF/St9C8X9GI0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0JjQvNGA06/QtyDRgdC+0LDRgtC4XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Ck0LDRgNC00L4g0YHQvtCw0YLQuF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQlNC40YDTr9C3INGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZFvQuF0gW9Kz0LDRhNGC0LDQuCDQvtGP0L3QtNCwINGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZFvQuF0gW9Kz0LDRhNGC0LDQuCDQs9GD0LfQsNGI0YLQsCDRgdC+0LDRgtC4XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9Cx0LDRitC00LggJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzINC/0LXRiCcsXG4gICAgICAgICAgICBzOiAn0Y/QutGH0LDQvdC0INGB0L7QvdC40Y8nLFxuICAgICAgICAgICAgbTogJ9GP0Log0LTQsNKb0LjSm9CwJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LTQsNKb0LjSm9CwJyxcbiAgICAgICAgICAgIGg6ICfRj9C6INGB0L7QsNGCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YHQvtCw0YInLFxuICAgICAgICAgICAgZDogJ9GP0Log0YDTr9C3JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0YDTr9C3JyxcbiAgICAgICAgICAgIE06ICfRj9C6INC80L7SsycsXG4gICAgICAgICAgICBNTTogJyVkINC80L7SsycsXG4gICAgICAgICAgICB5OiAn0Y/QuiDRgdC+0LsnLFxuICAgICAgICAgICAgeXk6ICclZCDRgdC+0LsnLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0YjQsNCxfNGB0YPQsdKzfNGA06/Qt3zQsdC10LPQvtKzLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn0YjQsNCxJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn0YHRg9Cx0rMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn0YDTr9C3Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfQsdC10LPQvtKzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GI0LDQsSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YHRg9Cx0rMnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GA06/Qtyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LHQtdCz0L7Ssyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YjQsNCxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRg9C8fNGO0LwpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW251bWJlcl0gfHwgc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxdGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGc7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGhhaSBbdGhdXG4vLyEgYXV0aG9yIDogS3JpZHNhZGEgVGhhbmFidWxwb25nIDogaHR0cHM6Ly9naXRodWIuY29tL3Npcm5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0aCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RoJywge1xuICAgICAgICBtb250aHM6ICfguKHguIHguKPguLLguITguKFf4LiB4Li44Lih4Lig4Liy4Lie4Lix4LiZ4LiY4LmMX+C4oeC4teC4meC4suC4hOC4oV/guYDguKHguKnguLLguKLguJlf4Lie4Lik4Lip4Lig4Liy4LiE4LihX+C4oeC4tOC4luC4uOC4meC4suC4ouC4mV/guIHguKPguIHguI7guLLguITguKFf4Liq4Li04LiH4Lir4Liy4LiE4LihX+C4geC4seC4meC4ouC4suC4ouC4mV/guJXguLjguKXguLLguITguKFf4Lie4Lik4Lio4LiI4Li04LiB4Liy4Lii4LiZX+C4mOC4seC4meC4p+C4suC4hOC4oScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4LihLuC4hC5f4LiBLuC4ni5f4Lih4Li1LuC4hC5f4LmA4LihLuC4oi5f4LieLuC4hC5f4Lih4Li0LuC4oi5f4LiBLuC4hC5f4LiqLuC4hC5f4LiBLuC4oi5f4LiVLuC4hC5f4LieLuC4oi5f4LiYLuC4hC4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfguK3guLLguJfguLTguJXguKLguYxf4LiI4Lix4LiZ4LiX4Lij4LmMX+C4reC4seC4h+C4hOC4suC4o1/guJ7guLjguJhf4Lie4Lik4Lir4Lix4Liq4Lia4LiU4Li1X+C4qOC4uOC4geC4o+C5jF/guYDguKrguLLguKPguYwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfguK3guLLguJfguLTguJXguKLguYxf4LiI4Lix4LiZ4LiX4Lij4LmMX+C4reC4seC4h+C4hOC4suC4o1/guJ7guLjguJhf4Lie4Lik4Lir4Lix4LiqX+C4qOC4uOC4geC4o+C5jF/guYDguKrguLLguKPguYwnLnNwbGl0KCdfJyksIC8vIHllcywgdGhyZWUgY2hhcmFjdGVycyBkaWZmZXJlbmNlXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4Lit4LiyLl/guIguX+C4rS5f4LieLl/guJ7guKQuX+C4qC5f4LiqLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDguYDguKfguKXguLIgSDptbScsXG4gICAgICAgICAgICBMTExMOiAn4Lin4Lix4LiZZGRkZOC4l+C4teC5iCBEIE1NTU0gWVlZWSDguYDguKfguKXguLIgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/guIHguYjguK3guJnguYDguJfguLXguYjguKLguId84Lir4Lil4Lix4LiH4LmA4LiX4Li14LmI4Lii4LiHLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LiB4LmI4Lit4LiZ4LmA4LiX4Li14LmI4Lii4LiHJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vguKfguLHguJnguJnguLXguYkg4LmA4Lin4Lil4LiyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C4nuC4o+C4uOC5iOC4h+C4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZFvguKvguJnguYnguLIg4LmA4Lin4Lil4LiyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C5gOC4oeC4t+C5iOC4reC4p+C4suC4meC4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+C4p+C4seC4mV1kZGRkW+C4l+C4teC5iOC5geC4peC5ieC4pyDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn4Lit4Li14LiBICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+C4l+C4teC5iOC5geC4peC5ieC4pycsXG4gICAgICAgICAgICBzOiAn4LmE4Lih4LmI4LiB4Li14LmI4Lin4Li04LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Lin4Li04LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIG06ICcxIOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBtbTogJyVkIOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBoOiAnMSDguIrguLHguYjguKfguYLguKHguIcnLFxuICAgICAgICAgICAgaGg6ICclZCDguIrguLHguYjguKfguYLguKHguIcnLFxuICAgICAgICAgICAgZDogJzEg4Lin4Lix4LiZJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Lin4Lix4LiZJyxcbiAgICAgICAgICAgIHc6ICcxIOC4quC4seC4m+C4lOC4suC4q+C5jCcsXG4gICAgICAgICAgICB3dzogJyVkIOC4quC4seC4m+C4lOC4suC4q+C5jCcsXG4gICAgICAgICAgICBNOiAnMSDguYDguJTguLfguK3guJknLFxuICAgICAgICAgICAgTU06ICclZCDguYDguJTguLfguK3guJknLFxuICAgICAgICAgICAgeTogJzEg4Lib4Li1JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Lib4Li1JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUdXJrbWVuIFt0a11cbi8vISBhdXRob3IgOiBBdGFteXJhdCBBYmR5cmFobWFub3YgOiBodHRwczovL2dpdGh1Yi5jb20vYXRhbXlyYXRhYmR5XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDE6IFwiJ2luamlcIixcbiAgICAgICAgNTogXCInaW5qaVwiLFxuICAgICAgICA4OiBcIidpbmppXCIsXG4gICAgICAgIDcwOiBcIidpbmppXCIsXG4gICAgICAgIDgwOiBcIidpbmppXCIsXG4gICAgICAgIDI6IFwiJ25qaVwiLFxuICAgICAgICA3OiBcIiduamlcIixcbiAgICAgICAgMjA6IFwiJ25qaVwiLFxuICAgICAgICA1MDogXCInbmppXCIsXG4gICAgICAgIDM6IFwiJ8O8bmppXCIsXG4gICAgICAgIDQ6IFwiJ8O8bmppXCIsXG4gICAgICAgIDEwMDogXCInw7xuamlcIixcbiAgICAgICAgNjogXCInbmp5XCIsXG4gICAgICAgIDk6IFwiJ3VuanlcIixcbiAgICAgICAgMTA6IFwiJ3VuanlcIixcbiAgICAgICAgMzA6IFwiJ3VuanlcIixcbiAgICAgICAgNjA6IFwiJ3luanlcIixcbiAgICAgICAgOTA6IFwiJ3luanlcIixcbiAgICB9O1xuXG4gICAgdmFyIHRrID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGsnLCB7XG4gICAgICAgIG1vbnRoczogJ8OdYW53YXJfRmV3cmFsX01hcnRfQXByZWxfTWHDvV9Jw711bl9Jw711bF9Bd2d1c3RfU2VudMO9YWJyX09rdMO9YWJyX05vw71hYnJfRGVrYWJyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ8OdYW5fRmV3X01hcl9BcHJfTWHDvV9Jw71uX0nDvWxfQXdnX1Nlbl9Pa3RfTm/DvV9EZWsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnw51la8WfZW5iZV9EdcWfZW5iZV9TacWfZW5iZV/Dh2FyxZ9lbmJlX1BlbsWfZW5iZV9Bbm5hX8WeZW5iZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ8OdZWtfRHXFn19TacWfX8OHYXJfUGVuX0Fubl/FnmVuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ8Oda19ExZ9fU8WfX8OHcl9Qbl9Bbl/Fnm4nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYnVnw7xuIHNhZ2F0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2VydGlyIHNhZ2F0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tpbmRpa2ldIGRkZGQgW3NhZ2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2TDvMO9bl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZ2XDp2VuXSBkZGRkIFtzYWdhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBzb8WIJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDtsWIJyxcbiAgICAgICAgICAgIHM6ICdiaXJuw6TDp2Ugc2VrdW50JyxcbiAgICAgICAgICAgIG06ICdiaXIgbWludXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dCcsXG4gICAgICAgICAgICBoOiAnYmlyIHNhZ2F0JyxcbiAgICAgICAgICAgIGhoOiAnJWQgc2FnYXQnLFxuICAgICAgICAgICAgZDogJ2JpciBnw7xuJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZ8O8bicsXG4gICAgICAgICAgICBNOiAnYmlyIGHDvScsXG4gICAgICAgICAgICBNTTogJyVkIGHDvScsXG4gICAgICAgICAgICB5OiAnYmlyIMO9eWwnLFxuICAgICAgICAgICAgeXk6ICclZCDDvXlsJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RvJzpcbiAgICAgICAgICAgICAgICBjYXNlICdERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB6ZXJvXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgXCIndW5qeVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICBiID0gKG51bWJlciAlIDEwMCkgLSBhLFxuICAgICAgICAgICAgICAgICAgICAgICAgYyA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdIHx8IHN1ZmZpeGVzW2NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRrO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRhZ2Fsb2cgKFBoaWxpcHBpbmVzKSBbdGwtcGhdXG4vLyEgYXV0aG9yIDogRGFuIEhhZ21hbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYWdtYW5kYW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0bFBoID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGwtcGgnLCB7XG4gICAgICAgIG1vbnRoczogJ0VuZXJvX1BlYnJlcm9fTWFyc29fQWJyaWxfTWF5b19IdW55b19IdWx5b19BZ29zdG9fU2V0eWVtYnJlX09rdHVicmVfTm9ieWVtYnJlX0Rpc3llbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdFbmVfUGViX01hcl9BYnJfTWF5X0h1bl9IdWxfQWdvX1NldF9Pa3RfTm9iX0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdMaW5nZ29fTHVuZXNfTWFydGVzX01peWVya3VsZXNfSHV3ZWJlc19CaXllcm5lc19TYWJhZG8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdMaW5fTHVuX01hcl9NaXlfSHV3X0JpeV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnTGlfTHVfTWFfTWlfSHVfQmlfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnTU0vRC9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnTU1NTSBELCBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ01NTU0gRCwgWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBERCwgWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnTFQgW25nYXlvbmcgYXJhd10nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tCdWthcyBuZ10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdMVCBbc2Egc3VzdW5vZCBuYV0gZGRkZCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnTFQgW2thaGFwb25dJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnTFQgW25vb25nIG5ha2FyYWFuZ10gZGRkZCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3NhIGxvb2IgbmcgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFuZyBuYWthbGlwYXMnLFxuICAgICAgICAgICAgczogJ2lsYW5nIHNlZ3VuZG8nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvJyxcbiAgICAgICAgICAgIG06ICdpc2FuZyBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG8nLFxuICAgICAgICAgICAgaDogJ2lzYW5nIG9yYXMnLFxuICAgICAgICAgICAgaGg6ICclZCBvcmFzJyxcbiAgICAgICAgICAgIGQ6ICdpc2FuZyBhcmF3JyxcbiAgICAgICAgICAgIGRkOiAnJWQgYXJhdycsXG4gICAgICAgICAgICBNOiAnaXNhbmcgYnV3YW4nLFxuICAgICAgICAgICAgTU06ICclZCBidXdhbicsXG4gICAgICAgICAgICB5OiAnaXNhbmcgdGFvbicsXG4gICAgICAgICAgICB5eTogJyVkIHRhb24nLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGxQaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLbGluZ29uIFt0bGhdXG4vLyEgYXV0aG9yIDogRG9taW5pa2EgS3J1ayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbWFyYW50aHJvc2VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBudW1iZXJzTm91bnMgPSAncGFnaF93YeKAmV9jaGHigJlfd2VqX2xvU192YWdoX2phdl9Tb2NoX2Nob3JnaF9IdXQnLnNwbGl0KCdfJyk7XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVGdXR1cmUob3V0cHV0KSB7XG4gICAgICAgIHZhciB0aW1lID0gb3V0cHV0O1xuICAgICAgICB0aW1lID1cbiAgICAgICAgICAgIG91dHB1dC5pbmRleE9mKCdqYWonKSAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ2xlUydcbiAgICAgICAgICAgICAgICA6IG91dHB1dC5pbmRleE9mKCdqYXInKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnd2FRJ1xuICAgICAgICAgICAgICAgICAgOiBvdXRwdXQuaW5kZXhPZignRElTJykgIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnbmVtJ1xuICAgICAgICAgICAgICAgICAgICA6IHRpbWUgKyAnIHBJcSc7XG4gICAgICAgIHJldHVybiB0aW1lO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVBhc3Qob3V0cHV0KSB7XG4gICAgICAgIHZhciB0aW1lID0gb3V0cHV0O1xuICAgICAgICB0aW1lID1cbiAgICAgICAgICAgIG91dHB1dC5pbmRleE9mKCdqYWonKSAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ0h14oCZJ1xuICAgICAgICAgICAgICAgIDogb3V0cHV0LmluZGV4T2YoJ2phcicpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICd3ZW4nXG4gICAgICAgICAgICAgICAgICA6IG91dHB1dC5pbmRleE9mKCdESVMnKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICdiZW4nXG4gICAgICAgICAgICAgICAgICAgIDogdGltZSArICcgcmV0JztcbiAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgbnVtYmVyTm91biA9IG51bWJlckFzTm91bihudW1iZXIpO1xuICAgICAgICBzd2l0Y2ggKHN0cmluZykge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBsdXAnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyB0dXAnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyByZXAnO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBqYWonO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBqYXInO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBESVMnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbnVtYmVyQXNOb3VuKG51bWJlcikge1xuICAgICAgICB2YXIgaHVuZHJlZCA9IE1hdGguZmxvb3IoKG51bWJlciAlIDEwMDApIC8gMTAwKSxcbiAgICAgICAgICAgIHRlbiA9IE1hdGguZmxvb3IoKG51bWJlciAlIDEwMCkgLyAxMCksXG4gICAgICAgICAgICBvbmUgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgIHdvcmQgPSAnJztcbiAgICAgICAgaWYgKGh1bmRyZWQgPiAwKSB7XG4gICAgICAgICAgICB3b3JkICs9IG51bWJlcnNOb3Vuc1todW5kcmVkXSArICd2YXRsaCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlbiA+IDApIHtcbiAgICAgICAgICAgIHdvcmQgKz0gKHdvcmQgIT09ICcnID8gJyAnIDogJycpICsgbnVtYmVyc05vdW5zW3Rlbl0gKyAnbWFIJztcbiAgICAgICAgfVxuICAgICAgICBpZiAob25lID4gMCkge1xuICAgICAgICAgICAgd29yZCArPSAod29yZCAhPT0gJycgPyAnICcgOiAnJykgKyBudW1iZXJzTm91bnNbb25lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd29yZCA9PT0gJycgPyAncGFnaCcgOiB3b3JkO1xuICAgIH1cblxuICAgIHZhciB0bGggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0bGgnLCB7XG4gICAgICAgIG1vbnRoczogJ3RlcmHigJkgamFyIHdh4oCZX3RlcmHigJkgamFyIGNoYeKAmV90ZXJh4oCZIGphciB3ZWpfdGVyYeKAmSBqYXIgbG9TX3RlcmHigJkgamFyIHZhZ2hfdGVyYeKAmSBqYXIgamF2X3RlcmHigJkgamFyIFNvY2hfdGVyYeKAmSBqYXIgY2hvcmdoX3RlcmHigJkgamFyIEh1dF90ZXJh4oCZIGphciB3YeKAmW1hSF90ZXJh4oCZIGphciB3YeKAmW1hSCB3YeKAmV90ZXJh4oCZIGphciB3YeKAmW1hSCBjaGHigJknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phciB3YeKAmV9qYXIgY2hh4oCZX2phciB3ZWpfamFyIGxvU19qYXIgdmFnaF9qYXIgamF2X2phciBTb2NoX2phciBjaG9yZ2hfamFyIEh1dF9qYXIgd2HigJltYUhfamFyIHdh4oCZbWFIIHdh4oCZX2phciB3YeKAmW1hSCBjaGHigJknLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdsb2ptSXRqYWpfRGFTamFqX3Bvdmphal9naEl0bGhqYWpfbG9naGphal9idXFqYWpfZ2hJbmphaicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDpcbiAgICAgICAgICAgICdsb2ptSXRqYWpfRGFTamFqX3Bvdmphal9naEl0bGhqYWpfbG9naGphal9idXFqYWpfZ2hJbmphaicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46XG4gICAgICAgICAgICAnbG9qbUl0amFqX0RhU2phal9wb3ZqYWpfZ2hJdGxoamFqX2xvZ2hqYWpfYnVxamFqX2doSW5qYWonLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbRGFIamFqXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3dh4oCZbGVTXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ0xMTCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3dh4oCZSHXigJldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnTExMJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiB0cmFuc2xhdGVGdXR1cmUsXG4gICAgICAgICAgICBwYXN0OiB0cmFuc2xhdGVQYXN0LFxuICAgICAgICAgICAgczogJ3B1UyBsdXAnLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06ICd3YeKAmSB0dXAnLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6ICd3YeKAmSByZXAnLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICd3YeKAmSBqYWonLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06ICd3YeKAmSBqYXInLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6ICd3YeKAmSBESVMnLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0bGg7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVHVya2lzaCBbdHJdXG4vLyEgYXV0aG9ycyA6IEVyaGFuIEd1bmRvZ2FuIDogaHR0cHM6Ly9naXRodWIuY29tL2VyaGFuZ3VuZG9nYW4sXG4vLyEgICAgICAgICAgIEJ1cmFrIFlpxJ9pdCBLYXlhOiBodHRwczovL2dpdGh1Yi5jb20vQllLXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDE6IFwiJ2luY2lcIixcbiAgICAgICAgNTogXCInaW5jaVwiLFxuICAgICAgICA4OiBcIidpbmNpXCIsXG4gICAgICAgIDcwOiBcIidpbmNpXCIsXG4gICAgICAgIDgwOiBcIidpbmNpXCIsXG4gICAgICAgIDI6IFwiJ25jaVwiLFxuICAgICAgICA3OiBcIiduY2lcIixcbiAgICAgICAgMjA6IFwiJ25jaVwiLFxuICAgICAgICA1MDogXCInbmNpXCIsXG4gICAgICAgIDM6IFwiJ8O8bmPDvFwiLFxuICAgICAgICA0OiBcIifDvG5jw7xcIixcbiAgICAgICAgMTAwOiBcIifDvG5jw7xcIixcbiAgICAgICAgNjogXCInbmPEsVwiLFxuICAgICAgICA5OiBcIid1bmN1XCIsXG4gICAgICAgIDEwOiBcIid1bmN1XCIsXG4gICAgICAgIDMwOiBcIid1bmN1XCIsXG4gICAgICAgIDYwOiBcIifEsW5jxLFcIixcbiAgICAgICAgOTA6IFwiJ8SxbmPEsVwiLFxuICAgIH07XG5cbiAgICB2YXIgdHIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0cicsIHtcbiAgICAgICAgbW9udGhzOiAnT2Nha1/FnnViYXRfTWFydF9OaXNhbl9NYXnEsXNfSGF6aXJhbl9UZW1tdXpfQcSfdXN0b3NfRXlsw7xsX0VraW1fS2FzxLFtX0FyYWzEsWsnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnT2NhX8WedWJfTWFyX05pc19NYXlfSGF6X1RlbV9BxJ91X0V5bF9Fa2lfS2FzX0FyYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdQYXphcl9QYXphcnRlc2lfU2FsxLFfw4dhcsWfYW1iYV9QZXLFn2VtYmVfQ3VtYV9DdW1hcnRlc2knLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdQYXpfUHp0X1NhbF/Dh2FyX1Blcl9DdW1fQ210Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1B6X1B0X1NhX8OHYV9QZV9DdV9DdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfDtsO2JyA6ICfDlsOWJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnw7ZzJyA6ICfDllMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvw7bDtnzDlsOWfMO2c3zDllMvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ8O2cycgfHwgaW5wdXQgPT09ICfDllMnO1xuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2J1Z8O8biBzYWF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3lhcsSxbiBzYWF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tnZWxlY2VrXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2TDvG5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2dlw6dlbl0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBzb25yYScsXG4gICAgICAgICAgICBwYXN0OiAnJXMgw7ZuY2UnLFxuICAgICAgICAgICAgczogJ2Jpcmthw6cgc2FuaXllJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2FuaXllJyxcbiAgICAgICAgICAgIG06ICdiaXIgZGFraWthJyxcbiAgICAgICAgICAgIG1tOiAnJWQgZGFraWthJyxcbiAgICAgICAgICAgIGg6ICdiaXIgc2FhdCcsXG4gICAgICAgICAgICBoaDogJyVkIHNhYXQnLFxuICAgICAgICAgICAgZDogJ2JpciBnw7xuJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZ8O8bicsXG4gICAgICAgICAgICB3OiAnYmlyIGhhZnRhJyxcbiAgICAgICAgICAgIHd3OiAnJWQgaGFmdGEnLFxuICAgICAgICAgICAgTTogJ2JpciBheScsXG4gICAgICAgICAgICBNTTogJyVkIGF5JyxcbiAgICAgICAgICAgIHk6ICdiaXIgecSxbCcsXG4gICAgICAgICAgICB5eTogJyVkIHnEsWwnLFxuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRG8nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0REJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHplcm9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBcIifEsW5jxLFcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChudW1iZXIgJSAxMDApIC0gYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBudW1iZXIgPj0gMTAwID8gMTAwIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1thXSB8fCBzdWZmaXhlc1tiXSB8fCBzdWZmaXhlc1tjXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUYWxvc3NhbiBbdHpsXVxuLy8hIGF1dGhvciA6IFJvYmluIHZhbiBkZXIgVmxpZXQgOiBodHRwczovL2dpdGh1Yi5jb20vcm9iaW4wdmFuMGRlcjB2XG4vLyEgYXV0aG9yIDogSXVzdMOsIENhbnVuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICAvLyBBZnRlciB0aGUgeWVhciB0aGVyZSBzaG91bGQgYmUgYSBzbGFzaCBhbmQgdGhlIGFtb3VudCBvZiB5ZWFycyBzaW5jZSBEZWNlbWJlciAyNiwgMTk3OSBpbiBSb21hbiBudW1lcmFscy5cbiAgICAvLyBUaGlzIGlzIGN1cnJlbnRseSB0b28gZGlmZmljdWx0IChtYXliZSBldmVuIGltcG9zc2libGUpIHRvIGFkZC5cbiAgICB2YXIgdHpsID0gbW9tZW50LmRlZmluZUxvY2FsZSgndHpsJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJfRmV2cmFnbGhfTWFyw6dfQXZyw691X01haV9Hw7xuX0p1bGlhX0d1c2NodF9TZXRlbXZhcl9MaXN0b3DDpHRzX05vZW12YXJfWmVjZW12YXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0Zldl9NYXJfQXZyX01haV9Hw7xuX0p1bF9HdXNfU2V0X0xpc19Ob2VfWmVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1PDumxhZGlfTMO6bmXDp2lfTWFpdHppX03DoXJjdXJpX1how7phZGlfVmnDqW5lcsOnaV9Tw6F0dXJpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU8O6bF9Mw7puX01haV9Nw6FyX1how7pfVmnDqV9Tw6F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1PDul9Mw7pfTWFfTcOhX1hoX1ZpX1PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFtkYWxsYXNdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBbZGFsbGFzXSBZWVlZIEhILm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBbbGldIEQuIE1NTU0gW2RhbGxhc10gWVlZWSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9kXFwnb3xkXFwnYS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBcImQnb1wiID09PSBpbnB1dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gXCJkJ29cIiA6IFwiRCdPXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gXCJkJ2FcIiA6IFwiRCdBXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW294aGkgw6BdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbZGVtw6Agw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaWVpcmkgw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3PDvHIgZWxdIGRkZGQgW2xhc3RldSDDoF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvc3ByZWkgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2phJXMnLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHM6IFsndmllbnNhcyBzZWN1bmRzJywgXCInaWVuc2FzIHNlY3VuZHNcIl0sXG4gICAgICAgICAgICBzczogW251bWJlciArICcgc2VjdW5kcycsICcnICsgbnVtYmVyICsgJyBzZWN1bmRzJ10sXG4gICAgICAgICAgICBtOiBbXCInbiBtw611dFwiLCBcIidpZW5zIG3DrXV0XCJdLFxuICAgICAgICAgICAgbW06IFtudW1iZXIgKyAnIG3DrXV0cycsICcnICsgbnVtYmVyICsgJyBtw611dHMnXSxcbiAgICAgICAgICAgIGg6IFtcIiduIMO+b3JhXCIsIFwiJ2llbnNhIMO+b3JhXCJdLFxuICAgICAgICAgICAgaGg6IFtudW1iZXIgKyAnIMO+b3JhcycsICcnICsgbnVtYmVyICsgJyDDvm9yYXMnXSxcbiAgICAgICAgICAgIGQ6IFtcIiduIHppdWFcIiwgXCInaWVuc2Egeml1YVwiXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyB6aXVhcycsICcnICsgbnVtYmVyICsgJyB6aXVhcyddLFxuICAgICAgICAgICAgTTogW1wiJ24gbWVzXCIsIFwiJ2llbnMgbWVzXCJdLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIG1lc2VuJywgJycgKyBudW1iZXIgKyAnIG1lc2VuJ10sXG4gICAgICAgICAgICB5OiBbXCInbiBhclwiLCBcIidpZW5zIGFyXCJdLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIGFycycsICcnICsgbnVtYmVyICsgJyBhcnMnXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGlzRnV0dXJlXG4gICAgICAgICAgICA/IGZvcm1hdFtrZXldWzBdXG4gICAgICAgICAgICA6IHdpdGhvdXRTdWZmaXhcbiAgICAgICAgICAgICAgPyBmb3JtYXRba2V5XVswXVxuICAgICAgICAgICAgICA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHJldHVybiB0emw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2VudHJhbCBBdGxhcyBUYW1hemlnaHQgTGF0aW4gW3R6bS1sYXRuXVxuLy8hIGF1dGhvciA6IEFiZGVsIFNhaWQgOiBodHRwczovL2dpdGh1Yi5jb20vYWJkZWxzYWlkXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdHptTGF0biA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3R6bS1sYXRuJywge1xuICAgICAgICBtb250aHM6ICdpbm5heXJfYnLLpGF5csukX21hcsukc8ukX2licmlyX21heXl3X3l3bnl3X3l3bHl3el/Jo3fFoXRfxaF3dGFuYmlyX2t0y6R3YnLLpF9ud3dhbmJpcl9kd2puYmlyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdpbm5heXJfYnLLpGF5csukX21hcsukc8ukX2licmlyX21heXl3X3l3bnl3X3l3bHl3el/Jo3fFoXRfxaF3dGFuYmlyX2t0y6R3YnLLpF9ud3dhbmJpcl9kd2puYmlyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAnYXNhbWFzX2F5bmFzX2FzaW5hc19ha3Jhc19ha3dhc19hc2ltd2FzX2FzaeG4jXlhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2FzYW1hc19heW5hc19hc2luYXNfYWtyYXNfYWt3YXNfYXNpbXdhc19hc2nhuI15YXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnYXNhbWFzX2F5bmFzX2FzaW5hc19ha3Jhc19ha3dhc19hc2ltd2FzX2FzaeG4jXlhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2FzZGtoIGddIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbYXNrYSBnXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2ddIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbYXNzYW50IGddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZ10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYWRraCBzIHlhbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAneWFuICVzJyxcbiAgICAgICAgICAgIHM6ICdpbWlrJyxcbiAgICAgICAgICAgIHNzOiAnJWQgaW1paycsXG4gICAgICAgICAgICBtOiAnbWludeG4jScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnXhuI0nLFxuICAgICAgICAgICAgaDogJ3NhyZthJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGFzc2HJm2luJyxcbiAgICAgICAgICAgIGQ6ICdhc3MnLFxuICAgICAgICAgICAgZGQ6ICclZCBvc3NhbicsXG4gICAgICAgICAgICBNOiAnYXlvd3InLFxuICAgICAgICAgICAgTU06ICclZCBpeXlpcm4nLFxuICAgICAgICAgICAgeTogJ2FzZ2FzJyxcbiAgICAgICAgICAgIHl5OiAnJWQgaXNnYXNuJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0em1MYXRuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENlbnRyYWwgQXRsYXMgVGFtYXppZ2h0IFt0em1dXG4vLyEgYXV0aG9yIDogQWJkZWwgU2FpZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0em0gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0em0nLCB7XG4gICAgICAgIG1vbnRoczogJ+K1ieK1j+K1j+K0sOK1ouK1lF/itLHitZXitLDitaLitZVf4rWO4rSw4rWV4rWaX+K1ieK0seK1lOK1ieK1lF/itY7itLDitaLitaLitZNf4rWi4rWT4rWP4rWi4rWTX+K1ouK1k+K1jeK1ouK1k+K1o1/itZbitZPitZvitZxf4rWb4rWT4rWc4rSw4rWP4rSx4rWJ4rWUX+K0veK1n+K1k+K0seK1lV/itY/itZPitaHitLDitY/itLHitYnitZRf4rS34rWT4rWK4rWP4rSx4rWJ4rWUJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfitYnitY/itY/itLDitaLitZRf4rSx4rWV4rSw4rWi4rWVX+K1juK0sOK1leK1ml/itYnitLHitZTitYnitZRf4rWO4rSw4rWi4rWi4rWTX+K1ouK1k+K1j+K1ouK1k1/itaLitZPitY3itaLitZPitaNf4rWW4rWT4rWb4rWcX+K1m+K1k+K1nOK0sOK1j+K0seK1ieK1lF/itL3itZ/itZPitLHitZVf4rWP4rWT4rWh4rSw4rWP4rSx4rWJ4rWUX+K0t+K1k+K1iuK1j+K0seK1ieK1lCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+K0sOK1meK0sOK1juK0sOK1mV/itLDitaLitY/itLDitZlf4rSw4rWZ4rWJ4rWP4rSw4rWZX+K0sOK0veK1lOK0sOK1mV/itLDitL3itaHitLDitZlf4rSw4rWZ4rWJ4rWO4rWh4rSw4rWZX+K0sOK1meK1ieK0ueK1ouK0sOK1mScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+K0sOK1meK0sOK1juK0sOK1mV/itLDitaLitY/itLDitZlf4rSw4rWZ4rWJ4rWP4rSw4rWZX+K0sOK0veK1lOK0sOK1mV/itLDitL3itaHitLDitZlf4rSw4rWZ4rWJ4rWO4rWh4rSw4rWZX+K0sOK1meK1ieK0ueK1ouK0sOK1mScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfitLDitZnitLDitY7itLDitZlf4rSw4rWi4rWP4rSw4rWZX+K0sOK1meK1ieK1j+K0sOK1mV/itLDitL3itZTitLDitZlf4rSw4rS94rWh4rSw4rWZX+K0sOK1meK1ieK1juK1oeK0sOK1mV/itLDitZnitYnitLnitaLitLDitZknLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vitLDitZnitLfitYUg4rS0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+K0sOK1meK0veK0sCDitLRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb4rS0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+K0sOK1muK0sOK1j+K1nCDitLRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb4rS0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ+K0t+K0sOK0t+K1hSDitZkg4rWi4rSw4rWPICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfitaLitLDitY8gJXMnLFxuICAgICAgICAgICAgczogJ+K1ieK1juK1ieK0vScsXG4gICAgICAgICAgICBzczogJyVkIOK1ieK1juK1ieK0vScsXG4gICAgICAgICAgICBtOiAn4rWO4rWJ4rWP4rWT4rS6JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4rWO4rWJ4rWP4rWT4rS6JyxcbiAgICAgICAgICAgIGg6ICfitZnitLDitYTitLAnLFxuICAgICAgICAgICAgaGg6ICclZCDitZzitLDitZnitZnitLDitYTitYnitY8nLFxuICAgICAgICAgICAgZDogJ+K0sOK1meK1mScsXG4gICAgICAgICAgICBkZDogJyVkIG/itZnitZnitLDitY8nLFxuICAgICAgICAgICAgTTogJ+K0sOK1om/itZPitZQnLFxuICAgICAgICAgICAgTU06ICclZCDitYnitaLitaLitYnitZTitY8nLFxuICAgICAgICAgICAgeTogJ+K0sOK1meK0s+K0sOK1mScsXG4gICAgICAgICAgICB5eTogJyVkIOK1ieK1meK0s+K0sOK1meK1jycsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHptO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFV5Z2h1ciAoQ2hpbmEpIFt1Zy1jbl1cbi8vISBhdXRob3I6IGJveWFxIDogaHR0cHM6Ly9naXRodWIuY29tL2JveWFxXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdWdDbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3VnLWNuJywge1xuICAgICAgICBtb250aHM6ICfZitin2Ybbi9in2LFf2YHbkNuL2LHYp9mEX9mF2KfYsdiqX9im2KfZvtix25DZhF/Zhdin2Ypf2KbZidmK24fZhl/YptmJ2Yrbh9mEX9im2Kfbi9i624fYs9iqX9iz25DZhtiq25XYqNmJ2LFf2KbbhtmD2Krbldio2YnYsV/ZhtmI2YrYp9io2YnYsV/Yr9uQ2YPYp9io2YnYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2YrYp9mG24vYp9ixX9mB25Dbi9ix2KfZhF/Zhdin2LHYql/Yptin2b7YsduQ2YRf2YXYp9mKX9im2YnZituH2YZf2KbZidmK24fZhF/Yptin24vYutuH2LPYql/Ys9uQ2YbYqtuV2KjZidixX9im24bZg9iq25XYqNmJ2LFf2YbZiNmK2KfYqNmJ2LFf2K/bkNmD2KfYqNmJ2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfZituV2YPYtNuV2YbYqNuVX9iv24jYtNuV2YbYqNuVX9iz25XZiti025XZhtio25Vf2obYp9ix2LTbldmG2KjblV/ZvtuV2YrYtNuV2YbYqNuVX9is24jZhduVX9i025XZhtio25UnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfZituVX9iv24hf2LPblV/ahtinX9m+25Vf2KzbiF/YtNuVJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9mK25Vf2K/biF/Ys9uVX9qG2Kdf2b7blV/YrNuIX9i025UnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnWVlZWS3ZitmJ2YTZiU0t2KbYp9mK2YbZidqtRC3Zg9uI2YbZiScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZLdmK2YnZhNmJTS3Yptin2YrZhtmJ2q1ELdmD24jZhtmJ2IwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGTYjCBZWVlZLdmK2YnZhNmJTS3Yptin2YrZhtmJ2q1ELdmD24jZhtmJ2IwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2YrbkNix2YnZhSDZg9uQ2obblXzYs9uV2r7bldixfNqG24jYtNiq2YnZhiDYqNuH2LHbh9mGfNqG24jYtHzahtuI2LTYqtmJ2YYg2YPbkNmK2YnZhnzZg9uV2oYvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfZituQ2LHZidmFINmD25DahtuVJyB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn2LPbldq+25XYsScgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ9qG24jYtNiq2YnZhiDYqNuH2LHbh9mGJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn2obbiNi02KrZidmGINmD25DZitmJ2YYnIHx8IG1lcmlkaWVtID09PSAn2YPbldqGJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mK25DYsdmJ2YUg2YPbkNqG25UnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LPbldq+25XYsSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTEzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2obbiNi02KrZidmGINio24fYsduH2YYnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9qG24jYtCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2obbiNi02KrZidmGINmD25DZitmJ2YYnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mD25Xahic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9io24jar9uI2YYg2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYptuV2KrblSDYs9in2KbbldiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vZg9uQ2YTbldix2YPZiV0gZGRkZCBb2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYqtuG2YbbiNqv24jZhl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb2KbYp9mE2K/ZidmG2YLZiV0gZGRkZCBb2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDZg9uQ2YrZidmGJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDYqNuH2LHbh9mGJyxcbiAgICAgICAgICAgIHM6ICfZhtuV2obahtuVINiz25DZg9mI2YbYqicsXG4gICAgICAgICAgICBzczogJyVkINiz25DZg9mI2YbYqicsXG4gICAgICAgICAgICBtOiAn2KjZidixINmF2YnZhtuH2KonLFxuICAgICAgICAgICAgbW06ICclZCDZhdmJ2Ybbh9iqJyxcbiAgICAgICAgICAgIGg6ICfYqNmJ2LEg2LPYp9im25XYqicsXG4gICAgICAgICAgICBoaDogJyVkINiz2KfYptuV2KonLFxuICAgICAgICAgICAgZDogJ9io2YnYsSDZg9uI2YYnLFxuICAgICAgICAgICAgZGQ6ICclZCDZg9uI2YYnLFxuICAgICAgICAgICAgTTogJ9io2YnYsSDYptin2YonLFxuICAgICAgICAgICAgTU06ICclZCDYptin2YonLFxuICAgICAgICAgICAgeTogJ9io2YnYsSDZitmJ2YQnLFxuICAgICAgICAgICAgeXk6ICclZCDZitmJ2YQnLFxuICAgICAgICB9LFxuXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSgt2YPbiNmG2Yl8Ldim2KfZinwt2r7bldm+2KrblSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct2YPbiNmG2YknO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3avtuV2b7YqtuVJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIC8vIEdCL1QgNzQwOC0xOTk044CK5pWw5o2u5YWD5ZKM5Lqk5o2i5qC85byPwrfkv6Hmga/kuqTmjaLCt+aXpeacn+WSjOaXtumXtOihqOekuuazleOAi+S4jklTTyA4NjAxOjE5ODjnrYnmlYhcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1Z0NuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFVrcmFpbmlhbiBbdWtdXG4vLyEgYXV0aG9yIDogemVtbGFuaW4gOiBodHRwczovL2dpdGh1Yi5jb20vemVtbGFuaW5cbi8vISBBdXRob3IgOiBNZW5lbGlvbiBFbGVuc8O6bGUgOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcGx1cmFsKHdvcmQsIG51bSkge1xuICAgICAgICB2YXIgZm9ybXMgPSB3b3JkLnNwbGl0KCdfJyk7XG4gICAgICAgIHJldHVybiBudW0gJSAxMCA9PT0gMSAmJiBudW0gJSAxMDAgIT09IDExXG4gICAgICAgICAgICA/IGZvcm1zWzBdXG4gICAgICAgICAgICA6IG51bSAlIDEwID49IDIgJiYgbnVtICUgMTAgPD0gNCAmJiAobnVtICUgMTAwIDwgMTAgfHwgbnVtICUgMTAwID49IDIwKVxuICAgICAgICAgICAgICA/IGZvcm1zWzFdXG4gICAgICAgICAgICAgIDogZm9ybXNbMl07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHNzOiB3aXRob3V0U3VmZml4ID8gJ9GB0LXQutGD0L3QtNCwX9GB0LXQutGD0L3QtNC4X9GB0LXQutGD0L3QtCcgOiAn0YHQtdC60YPQvdC00YNf0YHQtdC60YPQvdC00Lhf0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG1tOiB3aXRob3V0U3VmZml4ID8gJ9GF0LLQuNC70LjQvdCwX9GF0LLQuNC70LjQvdC4X9GF0LLQuNC70LjQvScgOiAn0YXQstC40LvQuNC90YNf0YXQstC40LvQuNC90Lhf0YXQstC40LvQuNC9JyxcbiAgICAgICAgICAgIGhoOiB3aXRob3V0U3VmZml4ID8gJ9Cz0L7QtNC40L3QsF/Qs9C+0LTQuNC90Lhf0LPQvtC00LjQvScgOiAn0LPQvtC00LjQvdGDX9Cz0L7QtNC40L3QuF/Qs9C+0LTQuNC9JyxcbiAgICAgICAgICAgIGRkOiAn0LTQtdC90Yxf0LTQvdGWX9C00L3RltCyJyxcbiAgICAgICAgICAgIE1NOiAn0LzRltGB0Y/RhtGMX9C80ZbRgdGP0YbRll/QvNGW0YHRj9GG0ZbQsicsXG4gICAgICAgICAgICB5eTogJ9GA0ZbQul/RgNC+0LrQuF/RgNC+0LrRltCyJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ20nKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfRhdCy0LjQu9C40L3QsCcgOiAn0YXQstC40LvQuNC90YMnO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2gnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfQs9C+0LTQuNC90LAnIDogJ9Cz0L7QtNC40L3Rgyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgcGx1cmFsKGZvcm1hdFtrZXldLCArbnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c0Nhc2VSZXBsYWNlKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgd2Vla2RheXMgPSB7XG4gICAgICAgICAgICAgICAgbm9taW5hdGl2ZTpcbiAgICAgICAgICAgICAgICAgICAgJ9C90LXQtNGW0LvRj1/Qv9C+0L3QtdC00ZbQu9C+0Lpf0LLRltCy0YLQvtGA0L7Qul/RgdC10YDQtdC00LBf0YfQtdGC0LLQtdGAX9C/4oCZ0Y/RgtC90LjRhtGPX9GB0YPQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBhY2N1c2F0aXZlOlxuICAgICAgICAgICAgICAgICAgICAn0L3QtdC00ZbQu9GOX9C/0L7QvdC10LTRltC70L7Qul/QstGW0LLRgtC+0YDQvtC6X9GB0LXRgNC10LTRg1/Rh9C10YLQstC10YBf0L/igJnRj9GC0L3QuNGG0Y5f0YHRg9Cx0L7RgtGDJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGdlbml0aXZlOlxuICAgICAgICAgICAgICAgICAgICAn0L3QtdC00ZbQu9GWX9C/0L7QvdC10LTRltC70LrQsF/QstGW0LLRgtC+0YDQutCwX9GB0LXRgNC10LTQuF/Rh9C10YLQstC10YDQs9CwX9C/4oCZ0Y/RgtC90LjRhtGWX9GB0YPQsdC+0YLQuCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBub3VuQ2FzZTtcblxuICAgICAgICBpZiAobSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXlzWydub21pbmF0aXZlJ11cbiAgICAgICAgICAgICAgICAuc2xpY2UoMSwgNylcbiAgICAgICAgICAgICAgICAuY29uY2F0KHdlZWtkYXlzWydub21pbmF0aXZlJ10uc2xpY2UoMCwgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXlzWydub21pbmF0aXZlJ107XG4gICAgICAgIH1cblxuICAgICAgICBub3VuQ2FzZSA9IC8oXFxbW9CS0LLQo9GDXVxcXSkgP2RkZGQvLnRlc3QoZm9ybWF0KVxuICAgICAgICAgICAgPyAnYWNjdXNhdGl2ZSdcbiAgICAgICAgICAgIDogL1xcWz8oPzrQvNC40L3Rg9C70L7Rl3zQvdCw0YHRgtGD0L/QvdC+0ZcpPyA/XFxdID9kZGRkLy50ZXN0KGZvcm1hdClcbiAgICAgICAgICAgICAgPyAnZ2VuaXRpdmUnXG4gICAgICAgICAgICAgIDogJ25vbWluYXRpdmUnO1xuICAgICAgICByZXR1cm4gd2Vla2RheXNbbm91bkNhc2VdW20uZGF5KCldO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzSG91cnNGdW5jdGlvbihzdHIpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIgKyAn0L4nICsgKHRoaXMuaG91cnMoKSA9PT0gMTEgPyAn0LEnIDogJycpICsgJ10gTFQnO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciB1ayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3VrJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9GB0ZbRh9C90Y9f0LvRjtGC0L7Qs9C+X9Cx0LXRgNC10LfQvdGPX9C60LLRltGC0L3Rj1/RgtGA0LDQstC90Y9f0YfQtdGA0LLQvdGPX9C70LjQv9C90Y9f0YHQtdGA0L/QvdGPX9Cy0LXRgNC10YHQvdGPX9C20L7QstGC0L3Rj1/Qu9C40YHRgtC+0L/QsNC00LBf0LPRgNGD0LTQvdGPJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfRgdGW0YfQtdC90Yxf0LvRjtGC0LjQuV/QsdC10YDQtdC30LXQvdGMX9C60LLRltGC0LXQvdGMX9GC0YDQsNCy0LXQvdGMX9GH0LXRgNCy0LXQvdGMX9C70LjQv9C10L3RjF/RgdC10YDQv9C10L3RjF/QstC10YDQtdGB0LXQvdGMX9C20L7QstGC0LXQvdGMX9C70LjRgdGC0L7Qv9Cw0LRf0LPRgNGD0LTQtdC90YwnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDogJ9GB0ZbRh1/Qu9GO0YJf0LHQtdGAX9C60LLRltGCX9GC0YDQsNCyX9GH0LXRgNCyX9C70LjQv1/RgdC10YDQv1/QstC10YBf0LbQvtCy0YJf0LvQuNGB0YJf0LPRgNGD0LQnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiB3ZWVrZGF5c0Nhc2VSZXBsYWNlLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0L3QtF/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZINGALicsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDRgC4sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSDRgC4sIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0KHRjNC+0LPQvtC00L3RliAnKSxcbiAgICAgICAgICAgIG5leHREYXk6IHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0JfQsNCy0YLRgNCwICcpLFxuICAgICAgICAgICAgbGFzdERheTogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQktGH0L7RgNCwICcpLFxuICAgICAgICAgICAgbmV4dFdlZWs6IHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0KNdIGRkZGQgWycpLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0JzQuNC90YPQu9C+0ZddIGRkZGQgWycpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQnNC40L3Rg9C70L7Qs9C+XSBkZGRkIFsnKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9C30LAgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzINGC0L7QvNGDJyxcbiAgICAgICAgICAgIHM6ICfQtNC10LrRltC70YzQutCwINGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBzczogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6ICfQs9C+0LTQuNC90YMnLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkOiAn0LTQtdC90YwnLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiAn0LzRltGB0Y/RhtGMJyxcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeTogJ9GA0ZbQuicsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gTS4gRS46IHRob3NlIHR3byBhcmUgdmlydHVhbGx5IHVudXNlZCBidXQgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gaW1wbGVtZW50IHRoZW0gZm9yIGhpcy9oZXIgd2Vic2l0ZSBmb3Igc29tZSByZWFzb25cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9C90L7Rh9GWfNGA0LDQvdC60YN80LTQvdGPfNCy0LXRh9C+0YDQsC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNC00L3Rj3zQstC10YfQvtGA0LApJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C90L7Rh9GWJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRgNCw0L3QutGDJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQtNC90Y8nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Cy0LXRh9C+0YDQsCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0Ll80LPQvikvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LknO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Qs9C+JztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdWs7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVXJkdSBbdXJdXG4vLyEgYXV0aG9yIDogU2F3b29kIEFsYW0gOiBodHRwczovL2dpdGh1Yi5jb20vaWJuZXNheWVlZFxuLy8hIGF1dGhvciA6IFphY2sgOiBodHRwczovL2dpdGh1Yi5jb20vWmFja1Zpc2lvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IFtcbiAgICAgICAgICAgICfYrNmG2YjYsduMJyxcbiAgICAgICAgICAgICfZgdix2YjYsduMJyxcbiAgICAgICAgICAgICfZhdin2LHahicsXG4gICAgICAgICAgICAn2KfZvtix24zZhCcsXG4gICAgICAgICAgICAn2YXYptuMJyxcbiAgICAgICAgICAgICfYrNmI2YYnLFxuICAgICAgICAgICAgJ9is2YjZhNin2KbbjCcsXG4gICAgICAgICAgICAn2Kfar9iz2KonLFxuICAgICAgICAgICAgJ9iz2KrZhdio2LEnLFxuICAgICAgICAgICAgJ9in2qnYqtmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmF2KjYsScsXG4gICAgICAgICAgICAn2K/Ys9mF2KjYsScsXG4gICAgICAgIF0sXG4gICAgICAgIGRheXMgPSBbJ9in2KrZiNin2LEnLCAn2b7bjNixJywgJ9mF2Ybar9mEJywgJ9io2K/avicsICfYrNmF2LnYsdin2KonLCAn2KzZhdi524EnLCAn24HZgdiq24EnXTtcblxuICAgIHZhciB1ciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3VyJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6IGRheXMsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IGRheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiBkYXlzLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRk2IwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LXYqNitfNi02KfZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfYtNin2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i12KjYrSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ9i02KfZhSc7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9ii2Kwg2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2qnZhCDYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1var9iw2LTYqtuBINix2YjYsiDYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb2q/YsNi02KrbgV0gZGRkZCBb2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg2KjYudivJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDZgtio2YQnLFxuICAgICAgICAgICAgczogJ9qG2YbYryDYs9uM2qnZhtqIJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2LPbjNqp2YbaiCcsXG4gICAgICAgICAgICBtOiAn2KfbjNqpINmF2YbZuScsXG4gICAgICAgICAgICBtbTogJyVkINmF2YbZuScsXG4gICAgICAgICAgICBoOiAn2KfbjNqpINqv2r7Zhtm524EnLFxuICAgICAgICAgICAgaGg6ICclZCDar9q+2YbZuduSJyxcbiAgICAgICAgICAgIGQ6ICfYp9uM2qkg2K/ZhicsXG4gICAgICAgICAgICBkZDogJyVkINiv2YYnLFxuICAgICAgICAgICAgTTogJ9in24zaqSDZhdin24EnLFxuICAgICAgICAgICAgTU06ICclZCDZhdin24EnLFxuICAgICAgICAgICAgeTogJ9in24zaqSDYs9in2YQnLFxuICAgICAgICAgICAgeXk6ICclZCDYs9in2YQnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1cjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBVemJlayBMYXRpbiBbdXotbGF0bl1cbi8vISBhdXRob3IgOiBSYXN1bGJlayBNaXJ6YXlldiA6IGdpdGh1Yi5jb20vUmFzdWxiZWVla1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHV6TGF0biA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3V6LWxhdG4nLCB7XG4gICAgICAgIG1vbnRoczogJ1lhbnZhcl9GZXZyYWxfTWFydF9BcHJlbF9NYXlfSXl1bl9JeXVsX0F2Z3VzdF9TZW50YWJyX09rdGFicl9Ob3lhYnJfRGVrYWJyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ1lhbl9GZXZfTWFyX0Fwcl9NYXlfSXl1bl9JeXVsX0F2Z19TZW5fT2t0X05veV9EZWsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1lha3NoYW5iYV9EdXNoYW5iYV9TZXNoYW5iYV9DaG9yc2hhbmJhX1BheXNoYW5iYV9KdW1hX1NoYW5iYScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnWWFrX0R1c2hfU2VzaF9DaG9yX1BheV9KdW1fU2hhbicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdZYV9EdV9TZV9DaG9fUGFfSnVfU2hhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdEIE1NTU0gWVlZWSwgZGRkZCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0J1Z3VuIHNvYXRdIExUIFtkYV0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tFcnRhZ2FdIExUIFtkYV0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrdW5pIHNvYXRdIExUIFtkYV0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLZWNoYSBzb2F0XSBMVCBbZGFdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBcIltPJ3RnYW5dIGRkZGQgW2t1bmkgc29hdF0gTFQgW2RhXVwiLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdZYXFpbiAlcyBpY2hpZGEnLFxuICAgICAgICAgICAgcGFzdDogJ0JpciBuZWNoYSAlcyBvbGRpbicsXG4gICAgICAgICAgICBzOiAnc29uaXlhJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc29uaXlhJyxcbiAgICAgICAgICAgIG06ICdiaXIgZGFxaXFhJyxcbiAgICAgICAgICAgIG1tOiAnJWQgZGFxaXFhJyxcbiAgICAgICAgICAgIGg6ICdiaXIgc29hdCcsXG4gICAgICAgICAgICBoaDogJyVkIHNvYXQnLFxuICAgICAgICAgICAgZDogJ2JpciBrdW4nLFxuICAgICAgICAgICAgZGQ6ICclZCBrdW4nLFxuICAgICAgICAgICAgTTogJ2JpciBveScsXG4gICAgICAgICAgICBNTTogJyVkIG95JyxcbiAgICAgICAgICAgIHk6ICdiaXIgeWlsJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWlsJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHV6TGF0bjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBVemJlayBbdXpdXG4vLyEgYXV0aG9yIDogU2FyZG9yIE11bWlub3YgOiBodHRwczovL2dpdGh1Yi5jb20vbXVtaW5vZmZcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB1eiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3V6Jywge1xuICAgICAgICBtb250aHM6ICfRj9C90LLQsNGAX9GE0LXQstGA0LDQu1/QvNCw0YDRgl/QsNC/0YDQtdC7X9C80LDQuV/QuNGO0L1f0LjRjtC7X9Cw0LLQs9GD0YHRgl/RgdC10L3RgtGP0LHRgF/QvtC60YLRj9Cx0YBf0L3QvtGP0LHRgF/QtNC10LrQsNCx0YAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0Y/QvdCyX9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDQuV/QuNGO0L1f0LjRjtC7X9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0K/QutGI0LDQvdCx0LBf0JTRg9GI0LDQvdCx0LBf0KHQtdGI0LDQvdCx0LBf0KfQvtGA0YjQsNC90LHQsF/Qn9Cw0LnRiNCw0L3QsdCwX9CW0YPQvNCwX9Co0LDQvdCx0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQr9C60Yhf0JTRg9GIX9Ch0LXRiF/Qp9C+0YBf0J/QsNC5X9CW0YPQvF/QqNCw0L0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0K/Qul/QlNGDX9Ch0LVf0KfQvl/Qn9CwX9CW0YNf0KjQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnRCBNTU1NIFlZWVksIGRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQkdGD0LPRg9C9INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQrdGA0YLQsNCz0LBdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9C60YPQvdC4INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQmtC10YfQsCDRgdC+0LDRgl0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9Cj0YLQs9Cw0L1dIGRkZGQgW9C60YPQvdC4INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQr9C60LjQvSAlcyDQuNGH0LjQtNCwJyxcbiAgICAgICAgICAgIHBhc3Q6ICfQkdC40YAg0L3QtdGH0LAgJXMg0L7Qu9C00LjQvScsXG4gICAgICAgICAgICBzOiAn0YTRg9GA0YHQsNGCJyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YTRg9GA0YHQsNGCJyxcbiAgICAgICAgICAgIG06ICfQsdC40YAg0LTQsNC60LjQutCwJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LTQsNC60LjQutCwJyxcbiAgICAgICAgICAgIGg6ICfQsdC40YAg0YHQvtCw0YInLFxuICAgICAgICAgICAgaGg6ICclZCDRgdC+0LDRgicsXG4gICAgICAgICAgICBkOiAn0LHQuNGAINC60YPQvScsXG4gICAgICAgICAgICBkZDogJyVkINC60YPQvScsXG4gICAgICAgICAgICBNOiAn0LHQuNGAINC+0LknLFxuICAgICAgICAgICAgTU06ICclZCDQvtC5JyxcbiAgICAgICAgICAgIHk6ICfQsdC40YAg0LnQuNC7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LnQuNC7JyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHV6O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFZpZXRuYW1lc2UgW3ZpXVxuLy8hIGF1dGhvciA6IEJhbmcgTmd1eWVuIDogaHR0cHM6Ly9naXRodWIuY29tL2Jhbmdua1xuLy8hIGF1dGhvciA6IENoaWVuIEtpcmEgOiBodHRwczovL2dpdGh1Yi5jb20vY2hpZW5raXJhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdmkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd2aScsIHtcbiAgICAgICAgbW9udGhzOiAndGjDoW5nIDFfdGjDoW5nIDJfdGjDoW5nIDNfdGjDoW5nIDRfdGjDoW5nIDVfdGjDoW5nIDZfdGjDoW5nIDdfdGjDoW5nIDhfdGjDoW5nIDlfdGjDoW5nIDEwX3Row6FuZyAxMV90aMOhbmcgMTInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ1RoZyAwMV9UaGcgMDJfVGhnIDAzX1RoZyAwNF9UaGcgMDVfVGhnIDA2X1RoZyAwN19UaGcgMDhfVGhnIDA5X1RoZyAxMF9UaGcgMTFfVGhnIDEyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnY2jhu6cgbmjhuq10X3Ro4bupIGhhaV90aOG7qSBiYV90aOG7qSB0xrBfdGjhu6kgbsSDbV90aOG7qSBzw6F1X3Ro4bupIGLhuqN5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQ05fVDJfVDNfVDRfVDVfVDZfVDcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQ05fVDJfVDNfVDRfVDVfVDZfVDcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3NhfGNoL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eY2gkL2kudGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnc2EnIDogJ1NBJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnY2gnIDogJ0NIJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gW27Eg21dIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFtuxINtXSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gW27Eg21dIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgbDogJ0REL00vWVlZWScsXG4gICAgICAgICAgICBsbDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSMO0bSBuYXkgbMO6Y10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tOZ8OgeSBtYWkgbMO6Y10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt0deG6p24gdOG7m2kgbMO6Y10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIw7RtIHF1YSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3R14bqnbiB0csaw4bubYyBsw7pjXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHThu5tpJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB0csaw4bubYycsXG4gICAgICAgICAgICBzOiAndsOgaSBnacOieScsXG4gICAgICAgICAgICBzczogJyVkIGdpw6J5JyxcbiAgICAgICAgICAgIG06ICdt4buZdCBwaMO6dCcsXG4gICAgICAgICAgICBtbTogJyVkIHBow7p0JyxcbiAgICAgICAgICAgIGg6ICdt4buZdCBnaeG7nScsXG4gICAgICAgICAgICBoaDogJyVkIGdp4budJyxcbiAgICAgICAgICAgIGQ6ICdt4buZdCBuZ8OgeScsXG4gICAgICAgICAgICBkZDogJyVkIG5nw6B5JyxcbiAgICAgICAgICAgIHc6ICdt4buZdCB0deG6p24nLFxuICAgICAgICAgICAgd3c6ICclZCB0deG6p24nLFxuICAgICAgICAgICAgTTogJ23hu5l0IHRow6FuZycsXG4gICAgICAgICAgICBNTTogJyVkIHRow6FuZycsXG4gICAgICAgICAgICB5OiAnbeG7mXQgbsSDbScsXG4gICAgICAgICAgICB5eTogJyVkIG7Eg20nLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUHNldWRvIFt4LXBzZXVkb11cbi8vISBhdXRob3IgOiBBbmRyZXcgSG9vZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXdob29kMTI1XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgeFBzZXVkbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3gtcHNldWRvJywge1xuICAgICAgICBtb250aHM6ICdKfsOhw7HDusOhfnLDvV9GfsOpYnLDun7DoXLDvV9+TcOhcmN+aF/DgXB+csOtbF9+TcOhw71ffkrDusOxw6l+X0rDumx+w71fw4HDun5nw7pzdH5fU8OpcH50w6ltYn7DqXJfw5N+Y3TDs2J+w6lyX8ORfsOzdsOpbX5iw6lyX35Ew6ljw6l+bWLDqXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0p+w6HDsV9+RsOpYl9+TcOhcl9+w4Fwcl9+TcOhw71ffkrDusOxX35Kw7psX37DgcO6Z19+U8OpcF9+w5NjdF9+w5HDs3ZffkTDqWMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnU37DusOxZMOhfsO9X03Ds37DsWTDocO9fl9Uw7rDqX5zZMOhw71+X1fDqWR+w7HDqXNkfsOhw71fVH5ow7pyc35kw6HDvV9+RnLDrWR+w6HDvV9TfsOhdMO6cn5kw6HDvScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU37DusOxX35Nw7PDsV9+VMO6w6lfflfDqWRfflRow7pffkZyw61fflPDoXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU37Dul9Nw7N+X1TDul9+V8OpX1R+aF9Gcn5fU8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVH7Ds2TDoX7DvSDDoXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVH7Ds23Ds35ycsOzfncgw6F0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8OhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vDnX7DqXN0fsOpcmTDoX7DvSDDoXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0x+w6FzdF0gZGRkZCBbw6F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ8OtfsOxICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDoX5nw7MnLFxuICAgICAgICAgICAgczogJ8OhIH5mw6l3IH5zw6ljw7N+w7FkcycsXG4gICAgICAgICAgICBzczogJyVkIHN+w6ljw7PDsX5kcycsXG4gICAgICAgICAgICBtOiAnw6Egfm3DrcOxfsO6dMOpJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbX7DrcOxw7p+dMOpcycsXG4gICAgICAgICAgICBoOiAnw6F+w7EgaMOzfsO6cicsXG4gICAgICAgICAgICBoaDogJyVkIGh+w7PDunJzJyxcbiAgICAgICAgICAgIGQ6ICfDoSB+ZMOhw70nLFxuICAgICAgICAgICAgZGQ6ICclZCBkfsOhw71zJyxcbiAgICAgICAgICAgIE06ICfDoSB+bcOzw7F+dGgnLFxuICAgICAgICAgICAgTU06ICclZCBtfsOzw7F0fmhzJyxcbiAgICAgICAgICAgIHk6ICfDoSB+w73DqcOhcicsXG4gICAgICAgICAgICB5eTogJyVkIMO9fsOpw6FycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSh0aHxzdHxuZHxyZCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB4UHNldWRvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFlvcnViYSBOaWdlcmlhIFt5b11cbi8vISBhdXRob3IgOiBBdG9sYWdiZSBBYmlzb3llIDogaHR0cHM6Ly9naXRodWIuY29tL2FuZGVsYS1iYXRvbGFnYmVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB5byA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3lvJywge1xuICAgICAgICBtb250aHM6ICdT4bq5zIFy4bq5zIFfRcyAcmXMgGxlzIBf4bq4cuG6ucyAbmHMgF9JzIBnYmXMgV9FzIBiaWJpX0/MgGt1zIBkdV9BZ+G6uW1vX0/MgGd1zIFuX093ZXdlX+G7jMyAd2HMgHJhzIBfQmXMgWx1zIFf4buMzIBw4bq5zIDMgCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdT4bq5zIFyX0XMgHJsX+G6uHJuX0nMgGdiX0XMgGJpX0/MgGt1zIBfQWfhurlfT8yAZ3XMgV9Pd2Vf4buMzIB3YcyAX0JlzIFsX+G7jMyAcOG6ucyAzIAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnQcyAacyAa3XMgV9BamXMgV9JzIBz4bq5zIFndW5f4buMauG7jcyBcnXMgV/hu4xq4buNzIFi4buNX+G6uHRpzIBfQcyAYmHMgW3hurnMgXRhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQcyAacyAa19BamXMgV9JzIBz4bq5zIFf4buManJf4buMamJf4bq4dGnMgF9BzIBiYcyBJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0HMgGnMgF9Bal9JzIBzX+G7jHJf4buMYl/hurh0X0HMgGInLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0/MgG5pzIAgbmldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4buMzIBsYSBuaV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IFwiZGRkZCBb4buMc+G6ucyAIHRvzIFuJ2Lhu41dIFtuaV0gTFRcIixcbiAgICAgICAgICAgIGxhc3REYXk6ICdbQcyAbmEgbmldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb4buMc+G6ucyAIHRvzIFs4buNzIFdIFtuaV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICduacyBICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBr4buNamHMgScsXG4gICAgICAgICAgICBzOiAnacyAc+G6uWp1zIEgYWF5YcyBIGRpZScsXG4gICAgICAgICAgICBzczogJ2FheWHMgSAlZCcsXG4gICAgICAgICAgICBtOiAnacyAc+G6uWp1zIEga2FuJyxcbiAgICAgICAgICAgIG1tOiAnacyAc+G6uWp1zIEgJWQnLFxuICAgICAgICAgICAgaDogJ3dhzIFrYXRpIGthbicsXG4gICAgICAgICAgICBoaDogJ3dhzIFrYXRpICVkJyxcbiAgICAgICAgICAgIGQ6ICfhu41q4buNzIEga2FuJyxcbiAgICAgICAgICAgIGRkOiAn4buNauG7jcyBICVkJyxcbiAgICAgICAgICAgIE06ICdvc3XMgCBrYW4nLFxuICAgICAgICAgICAgTU06ICdvc3XMgCAlZCcsXG4gICAgICAgICAgICB5OiAn4buNZHXMgW4ga2FuJyxcbiAgICAgICAgICAgIHl5OiAn4buNZHXMgW4gJWQnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAv4buNauG7jcyBXFxzXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiAn4buNauG7jcyBICVkJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHlvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENoaW5lc2UgKENoaW5hKSBbemgtY25dXG4vLyEgYXV0aG9yIDogc3V1cGljIDogaHR0cHM6Ly9naXRodWIuY29tL3N1dXBpY1xuLy8hIGF1dGhvciA6IFplbm8gWmVuZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS96ZW5vemVuZ1xuLy8hIGF1dGhvciA6IHV1MTA5IDogaHR0cHM6Ly9naXRodWIuY29tL3V1MTA5XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgemhDbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3poLWNuJywge1xuICAgICAgICBtb250aHM6ICfkuIDmnIhf5LqM5pyIX+S4ieaciF/lm5vmnIhf5LqU5pyIX+WFreaciF/kuIPmnIhf5YWr5pyIX+S5neaciF/ljYHmnIhf5Y2B5LiA5pyIX+WNgeS6jOaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfmmJ/mnJ/ml6Vf5pif5pyf5LiAX+aYn+acn+S6jF/mmJ/mnJ/kuIlf5pif5pyf5ZubX+aYn+acn+S6lF/mmJ/mnJ/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICflkajml6Vf5ZGo5LiAX+WRqOS6jF/lkajkuIlf5ZGo5ZubX+WRqOS6lF/lkajlha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn5pelX+S4gF/kuoxf5LiJX+Wbm1/kupRf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZ5bm0TeaciETml6VBaOeCuW1t5YiGJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6VkZGRkQWjngrltbeWIhicsXG4gICAgICAgICAgICBsOiAnWVlZWS9NL0QnLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHwgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5LiL5Y2IJyB8fCBtZXJpZGllbSA9PT0gJ+aZmuS4iicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAn5Lit5Y2IJ1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WHjOaZqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmIChub3cud2VlaygpICE9PSB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vkuItdZGRkTFQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+acrF1kZGRMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2VlaygpICE9PSBub3cud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+S4il1kZGRMVCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5pysXWRkZExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOaXpXzmnIh85ZGoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICflkagnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlkI4nLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICflh6Dnp5InLFxuICAgICAgICAgICAgc3M6ICclZCDnp5InLFxuICAgICAgICAgICAgbTogJzEg5YiG6ZKfJyxcbiAgICAgICAgICAgIG1tOiAnJWQg5YiG6ZKfJyxcbiAgICAgICAgICAgIGg6ICcxIOWwj+aXticsXG4gICAgICAgICAgICBoaDogJyVkIOWwj+aXticsXG4gICAgICAgICAgICBkOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQ6ICclZCDlpKknLFxuICAgICAgICAgICAgdzogJzEg5ZGoJyxcbiAgICAgICAgICAgIHd3OiAnJWQg5ZGoJyxcbiAgICAgICAgICAgIE06ICcxIOS4quaciCcsXG4gICAgICAgICAgICBNTTogJyVkIOS4quaciCcsXG4gICAgICAgICAgICB5OiAnMSDlubQnLFxuICAgICAgICAgICAgeXk6ICclZCDlubQnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICAvLyBHQi9UIDc0MDgtMTk5NOOAiuaVsOaNruWFg+WSjOS6pOaNouagvOW8j8K35L+h5oGv5Lqk5o2iwrfml6XmnJ/lkozml7bpl7TooajnpLrms5XjgIvkuI5JU08gODYwMToxOTg4562J5pWIXG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gemhDbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaGluZXNlIChIb25nIEtvbmcpIFt6aC1oa11cbi8vISBhdXRob3IgOiBCZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmVuLWxpblxuLy8hIGF1dGhvciA6IENocmlzIExhbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWhhY2hyaXNcbi8vISBhdXRob3IgOiBLb25zdGFudGluIDogaHR0cHM6Ly9naXRodWIuY29tL3NrZmRcbi8vISBhdXRob3IgOiBBbnRob255IDogaHR0cHM6Ly9naXRodWIuY29tL2FudGhvbnlsYXVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB6aEhrID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtaGsnLCB7XG4gICAgICAgIG1vbnRoczogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+mAseaXpV/pgLHkuIBf6YCx5LqMX+mAseS4iV/pgLHlm5tf6YCx5LqUX+mAseWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS9NL0QnLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHwgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5Lit5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuIvljYgnIHx8IG1lcmlkaWVtID09PSAn5pma5LiKJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA9PT0gMTIwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vkuItdZGRkZExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+S4il1kZGRkTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOaXpXzmnIh86YCxKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfpgLEnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlvownLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICflub7np5InLFxuICAgICAgICAgICAgc3M6ICclZCDnp5InLFxuICAgICAgICAgICAgbTogJzEg5YiG6ZCYJyxcbiAgICAgICAgICAgIG1tOiAnJWQg5YiG6ZCYJyxcbiAgICAgICAgICAgIGg6ICcxIOWwj+aZgicsXG4gICAgICAgICAgICBoaDogJyVkIOWwj+aZgicsXG4gICAgICAgICAgICBkOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQ6ICclZCDlpKknLFxuICAgICAgICAgICAgTTogJzEg5YCL5pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg5YCL5pyIJyxcbiAgICAgICAgICAgIHk6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eTogJyVkIOW5tCcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gemhIaztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaGluZXNlIChNYWNhdSkgW3poLW1vXVxuLy8hIGF1dGhvciA6IEJlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZW4tbGluXG4vLyEgYXV0aG9yIDogQ2hyaXMgTGFtIDogaHR0cHM6Ly9naXRodWIuY29tL2hlaGFjaHJpc1xuLy8hIGF1dGhvciA6IFRhbiBZdWFuaG9uZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sZTB0YW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB6aE1vID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtbW8nLCB7XG4gICAgICAgIG1vbnRoczogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+mAseaXpV/pgLHkuIBf6YCx5LqMX+mAseS4iV/pgLHlm5tf6YCx5LqUX+mAseWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgICAgICBsOiAnRC9NL1lZWVknLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHwgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5Lit5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuIvljYgnIHx8IG1lcmlkaWVtID09PSAn5pma5LiKJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4reWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiL5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfmmZrkuIonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vku4rlpKldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5aSpXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vkuItdZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOWkqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb5LiKXWRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOaXpXzmnIh86YCxKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfpgLEnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlhacnLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICflub7np5InLFxuICAgICAgICAgICAgc3M6ICclZCDnp5InLFxuICAgICAgICAgICAgbTogJzEg5YiG6ZCYJyxcbiAgICAgICAgICAgIG1tOiAnJWQg5YiG6ZCYJyxcbiAgICAgICAgICAgIGg6ICcxIOWwj+aZgicsXG4gICAgICAgICAgICBoaDogJyVkIOWwj+aZgicsXG4gICAgICAgICAgICBkOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQ6ICclZCDlpKknLFxuICAgICAgICAgICAgTTogJzEg5YCL5pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg5YCL5pyIJyxcbiAgICAgICAgICAgIHk6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eTogJyVkIOW5tCcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gemhNbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaGluZXNlIChUYWl3YW4pIFt6aC10d11cbi8vISBhdXRob3IgOiBCZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmVuLWxpblxuLy8hIGF1dGhvciA6IENocmlzIExhbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWhhY2hyaXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB6aFR3ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtdHcnLCB7XG4gICAgICAgIG1vbnRoczogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+mAseaXpV/pgLHkuIBf6YCx5LqMX+mAseS4iV/pgLHlm5tf6YCx5LqUX+mAseWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS9NL0QnLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHwgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5Lit5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuIvljYgnIHx8IG1lcmlkaWVtID09PSAn5pma5LiKJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4reWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiL5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfmmZrkuIonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vku4rlpKldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5aSpXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vkuItdZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOWkqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb5LiKXWRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOaXpXzmnIh86YCxKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfpgLEnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlvownLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICflub7np5InLFxuICAgICAgICAgICAgc3M6ICclZCDnp5InLFxuICAgICAgICAgICAgbTogJzEg5YiG6ZCYJyxcbiAgICAgICAgICAgIG1tOiAnJWQg5YiG6ZCYJyxcbiAgICAgICAgICAgIGg6ICcxIOWwj+aZgicsXG4gICAgICAgICAgICBoaDogJyVkIOWwj+aZgicsXG4gICAgICAgICAgICBkOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQ6ICclZCDlpKknLFxuICAgICAgICAgICAgTTogJzEg5YCL5pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg5YCL5pyIJyxcbiAgICAgICAgICAgIHk6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eTogJyVkIOW5tCcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gemhUdztcblxufSkpKTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9hZlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYWYuanNcIixcblx0XCIuL2FmLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hZi5qc1wiLFxuXHRcIi4vYXJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLmpzXCIsXG5cdFwiLi9hci1kelwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItZHouanNcIixcblx0XCIuL2FyLWR6LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1kei5qc1wiLFxuXHRcIi4vYXIta3dcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWt3LmpzXCIsXG5cdFwiLi9hci1rdy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIta3cuanNcIixcblx0XCIuL2FyLWx5XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1seS5qc1wiLFxuXHRcIi4vYXItbHkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWx5LmpzXCIsXG5cdFwiLi9hci1tYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItbWEuanNcIixcblx0XCIuL2FyLW1hLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1tYS5qc1wiLFxuXHRcIi4vYXItcHNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXBzLmpzXCIsXG5cdFwiLi9hci1wcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItcHMuanNcIixcblx0XCIuL2FyLXNhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1zYS5qc1wiLFxuXHRcIi4vYXItc2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXNhLmpzXCIsXG5cdFwiLi9hci10blwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItdG4uanNcIixcblx0XCIuL2FyLXRuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci10bi5qc1wiLFxuXHRcIi4vYXIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLmpzXCIsXG5cdFwiLi9helwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXouanNcIixcblx0XCIuL2F6LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hei5qc1wiLFxuXHRcIi4vYmVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JlLmpzXCIsXG5cdFwiLi9iZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmUuanNcIixcblx0XCIuL2JnXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iZy5qc1wiLFxuXHRcIi4vYmcuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JnLmpzXCIsXG5cdFwiLi9ibVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm0uanNcIixcblx0XCIuL2JtLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibS5qc1wiLFxuXHRcIi4vYm5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLmpzXCIsXG5cdFwiLi9ibi1iZFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4tYmQuanNcIixcblx0XCIuL2JuLWJkLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibi1iZC5qc1wiLFxuXHRcIi4vYm4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLmpzXCIsXG5cdFwiLi9ib1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm8uanNcIixcblx0XCIuL2JvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iby5qc1wiLFxuXHRcIi4vYnJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JyLmpzXCIsXG5cdFwiLi9ici5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnIuanNcIixcblx0XCIuL2JzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9icy5qc1wiLFxuXHRcIi4vYnMuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JzLmpzXCIsXG5cdFwiLi9jYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY2EuanNcIixcblx0XCIuL2NhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jYS5qc1wiLFxuXHRcIi4vY3NcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NzLmpzXCIsXG5cdFwiLi9jcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3MuanNcIixcblx0XCIuL2N2XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jdi5qc1wiLFxuXHRcIi4vY3YuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2N2LmpzXCIsXG5cdFwiLi9jeVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3kuanNcIixcblx0XCIuL2N5LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jeS5qc1wiLFxuXHRcIi4vZGFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RhLmpzXCIsXG5cdFwiLi9kYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGEuanNcIixcblx0XCIuL2RlXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS5qc1wiLFxuXHRcIi4vZGUtYXRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWF0LmpzXCIsXG5cdFwiLi9kZS1hdC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtYXQuanNcIixcblx0XCIuL2RlLWNoXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS1jaC5qc1wiLFxuXHRcIi4vZGUtY2guanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWNoLmpzXCIsXG5cdFwiLi9kZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUuanNcIixcblx0XCIuL2R2XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kdi5qc1wiLFxuXHRcIi4vZHYuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2R2LmpzXCIsXG5cdFwiLi9lbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZWwuanNcIixcblx0XCIuL2VsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbC5qc1wiLFxuXHRcIi4vZW4tYXVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWF1LmpzXCIsXG5cdFwiLi9lbi1hdS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tYXUuanNcIixcblx0XCIuL2VuLWNhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1jYS5qc1wiLFxuXHRcIi4vZW4tY2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWNhLmpzXCIsXG5cdFwiLi9lbi1nYlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tZ2IuanNcIixcblx0XCIuL2VuLWdiLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1nYi5qc1wiLFxuXHRcIi4vZW4taWVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWllLmpzXCIsXG5cdFwiLi9lbi1pZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWUuanNcIixcblx0XCIuL2VuLWlsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbC5qc1wiLFxuXHRcIi4vZW4taWwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWlsLmpzXCIsXG5cdFwiLi9lbi1pblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taW4uanNcIixcblx0XCIuL2VuLWluLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbi5qc1wiLFxuXHRcIi4vZW4tbnpcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLW56LmpzXCIsXG5cdFwiLi9lbi1uei5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tbnouanNcIixcblx0XCIuL2VuLXNnXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1zZy5qc1wiLFxuXHRcIi4vZW4tc2cuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLXNnLmpzXCIsXG5cdFwiLi9lb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW8uanNcIixcblx0XCIuL2VvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lby5qc1wiLFxuXHRcIi4vZXNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLmpzXCIsXG5cdFwiLi9lcy1kb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtZG8uanNcIixcblx0XCIuL2VzLWRvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy1kby5qc1wiLFxuXHRcIi4vZXMtbXhcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLW14LmpzXCIsXG5cdFwiLi9lcy1teC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtbXguanNcIixcblx0XCIuL2VzLXVzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy11cy5qc1wiLFxuXHRcIi4vZXMtdXMuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLXVzLmpzXCIsXG5cdFwiLi9lcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMuanNcIixcblx0XCIuL2V0XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldC5qc1wiLFxuXHRcIi4vZXQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2V0LmpzXCIsXG5cdFwiLi9ldVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXUuanNcIixcblx0XCIuL2V1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldS5qc1wiLFxuXHRcIi4vZmFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZhLmpzXCIsXG5cdFwiLi9mYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmEuanNcIixcblx0XCIuL2ZpXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9maS5qc1wiLFxuXHRcIi4vZmkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZpLmpzXCIsXG5cdFwiLi9maWxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZpbC5qc1wiLFxuXHRcIi4vZmlsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9maWwuanNcIixcblx0XCIuL2ZvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mby5qc1wiLFxuXHRcIi4vZm8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZvLmpzXCIsXG5cdFwiLi9mclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnIuanNcIixcblx0XCIuL2ZyLWNhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci1jYS5qc1wiLFxuXHRcIi4vZnItY2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNhLmpzXCIsXG5cdFwiLi9mci1jaFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2guanNcIixcblx0XCIuL2ZyLWNoLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci1jaC5qc1wiLFxuXHRcIi4vZnIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLmpzXCIsXG5cdFwiLi9meVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnkuanNcIixcblx0XCIuL2Z5LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9meS5qc1wiLFxuXHRcIi4vZ2FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dhLmpzXCIsXG5cdFwiLi9nYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2EuanNcIixcblx0XCIuL2dkXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nZC5qc1wiLFxuXHRcIi4vZ2QuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dkLmpzXCIsXG5cdFwiLi9nbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2wuanNcIixcblx0XCIuL2dsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nbC5qc1wiLFxuXHRcIi4vZ29tLWRldmFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dvbS1kZXZhLmpzXCIsXG5cdFwiLi9nb20tZGV2YS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWRldmEuanNcIixcblx0XCIuL2dvbS1sYXRuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nb20tbGF0bi5qc1wiLFxuXHRcIi4vZ29tLWxhdG4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dvbS1sYXRuLmpzXCIsXG5cdFwiLi9ndVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ3UuanNcIixcblx0XCIuL2d1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ndS5qc1wiLFxuXHRcIi4vaGVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hlLmpzXCIsXG5cdFwiLi9oZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGUuanNcIixcblx0XCIuL2hpXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oaS5qc1wiLFxuXHRcIi4vaGkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hpLmpzXCIsXG5cdFwiLi9oclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHIuanNcIixcblx0XCIuL2hyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oci5qc1wiLFxuXHRcIi4vaHVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h1LmpzXCIsXG5cdFwiLi9odS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHUuanNcIixcblx0XCIuL2h5LWFtXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oeS1hbS5qc1wiLFxuXHRcIi4vaHktYW0uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h5LWFtLmpzXCIsXG5cdFwiLi9pZFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaWQuanNcIixcblx0XCIuL2lkLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pZC5qc1wiLFxuXHRcIi4vaXNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lzLmpzXCIsXG5cdFwiLi9pcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXMuanNcIixcblx0XCIuL2l0XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC5qc1wiLFxuXHRcIi4vaXQtY2hcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LWNoLmpzXCIsXG5cdFwiLi9pdC1jaC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXQtY2guanNcIixcblx0XCIuL2l0LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC5qc1wiLFxuXHRcIi4vamFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2phLmpzXCIsXG5cdFwiLi9qYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvamEuanNcIixcblx0XCIuL2p2XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9qdi5qc1wiLFxuXHRcIi4vanYuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2p2LmpzXCIsXG5cdFwiLi9rYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2EuanNcIixcblx0XCIuL2thLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rYS5qc1wiLFxuXHRcIi4va2tcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2trLmpzXCIsXG5cdFwiLi9ray5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2suanNcIixcblx0XCIuL2ttXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbS5qc1wiLFxuXHRcIi4va20uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ttLmpzXCIsXG5cdFwiLi9rblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva24uanNcIixcblx0XCIuL2tuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbi5qc1wiLFxuXHRcIi4va29cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tvLmpzXCIsXG5cdFwiLi9rby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva28uanNcIixcblx0XCIuL2t1XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS5qc1wiLFxuXHRcIi4va3Uta21yXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS1rbXIuanNcIixcblx0XCIuL2t1LWttci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3Uta21yLmpzXCIsXG5cdFwiLi9rdS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3UuanNcIixcblx0XCIuL2t5XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9reS5qc1wiLFxuXHRcIi4va3kuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t5LmpzXCIsXG5cdFwiLi9sYlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbGIuanNcIixcblx0XCIuL2xiLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sYi5qc1wiLFxuXHRcIi4vbG9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2xvLmpzXCIsXG5cdFwiLi9sby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbG8uanNcIixcblx0XCIuL2x0XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sdC5qc1wiLFxuXHRcIi4vbHQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x0LmpzXCIsXG5cdFwiLi9sdlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHYuanNcIixcblx0XCIuL2x2LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sdi5qc1wiLFxuXHRcIi4vbWVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21lLmpzXCIsXG5cdFwiLi9tZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWUuanNcIixcblx0XCIuL21pXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9taS5qc1wiLFxuXHRcIi4vbWkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21pLmpzXCIsXG5cdFwiLi9ta1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWsuanNcIixcblx0XCIuL21rLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tay5qc1wiLFxuXHRcIi4vbWxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21sLmpzXCIsXG5cdFwiLi9tbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWwuanNcIixcblx0XCIuL21uXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbi5qc1wiLFxuXHRcIi4vbW4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21uLmpzXCIsXG5cdFwiLi9tclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXIuanNcIixcblx0XCIuL21yLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tci5qc1wiLFxuXHRcIi4vbXNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLmpzXCIsXG5cdFwiLi9tcy1teVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXMtbXkuanNcIixcblx0XCIuL21zLW15LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy1teS5qc1wiLFxuXHRcIi4vbXMuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLmpzXCIsXG5cdFwiLi9tdFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXQuanNcIixcblx0XCIuL210LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tdC5qc1wiLFxuXHRcIi4vbXlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL215LmpzXCIsXG5cdFwiLi9teS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXkuanNcIixcblx0XCIuL25iXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uYi5qc1wiLFxuXHRcIi4vbmIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25iLmpzXCIsXG5cdFwiLi9uZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmUuanNcIixcblx0XCIuL25lLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uZS5qc1wiLFxuXHRcIi4vbmxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLmpzXCIsXG5cdFwiLi9ubC1iZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmwtYmUuanNcIixcblx0XCIuL25sLWJlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC1iZS5qc1wiLFxuXHRcIi4vbmwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLmpzXCIsXG5cdFwiLi9ublwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbm4uanNcIixcblx0XCIuL25uLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubi5qc1wiLFxuXHRcIi4vb2MtbG5jXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9vYy1sbmMuanNcIixcblx0XCIuL29jLWxuYy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvb2MtbG5jLmpzXCIsXG5cdFwiLi9wYS1pblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGEtaW4uanNcIixcblx0XCIuL3BhLWluLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wYS1pbi5qc1wiLFxuXHRcIi4vcGxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3BsLmpzXCIsXG5cdFwiLi9wbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGwuanNcIixcblx0XCIuL3B0XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC5qc1wiLFxuXHRcIi4vcHQtYnJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LWJyLmpzXCIsXG5cdFwiLi9wdC1ici5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQtYnIuanNcIixcblx0XCIuL3B0LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC5qc1wiLFxuXHRcIi4vcm9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3JvLmpzXCIsXG5cdFwiLi9yby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcm8uanNcIixcblx0XCIuL3J1XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ydS5qc1wiLFxuXHRcIi4vcnUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3J1LmpzXCIsXG5cdFwiLi9zZFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2QuanNcIixcblx0XCIuL3NkLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZC5qc1wiLFxuXHRcIi4vc2VcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NlLmpzXCIsXG5cdFwiLi9zZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2UuanNcIixcblx0XCIuL3NpXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zaS5qc1wiLFxuXHRcIi4vc2kuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NpLmpzXCIsXG5cdFwiLi9za1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2suanNcIixcblx0XCIuL3NrLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zay5qc1wiLFxuXHRcIi4vc2xcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NsLmpzXCIsXG5cdFwiLi9zbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2wuanNcIixcblx0XCIuL3NxXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcS5qc1wiLFxuXHRcIi4vc3EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NxLmpzXCIsXG5cdFwiLi9zclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3IuanNcIixcblx0XCIuL3NyLWN5cmxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NyLWN5cmwuanNcIixcblx0XCIuL3NyLWN5cmwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NyLWN5cmwuanNcIixcblx0XCIuL3NyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci5qc1wiLFxuXHRcIi4vc3NcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NzLmpzXCIsXG5cdFwiLi9zcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3MuanNcIixcblx0XCIuL3N2XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zdi5qc1wiLFxuXHRcIi4vc3YuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N2LmpzXCIsXG5cdFwiLi9zd1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3cuanNcIixcblx0XCIuL3N3LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zdy5qc1wiLFxuXHRcIi4vdGFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RhLmpzXCIsXG5cdFwiLi90YS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGEuanNcIixcblx0XCIuL3RlXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ZS5qc1wiLFxuXHRcIi4vdGUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RlLmpzXCIsXG5cdFwiLi90ZXRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RldC5qc1wiLFxuXHRcIi4vdGV0LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ZXQuanNcIixcblx0XCIuL3RnXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90Zy5qc1wiLFxuXHRcIi4vdGcuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RnLmpzXCIsXG5cdFwiLi90aFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGguanNcIixcblx0XCIuL3RoLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90aC5qc1wiLFxuXHRcIi4vdGtcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RrLmpzXCIsXG5cdFwiLi90ay5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGsuanNcIixcblx0XCIuL3RsLXBoXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bC1waC5qc1wiLFxuXHRcIi4vdGwtcGguanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsLXBoLmpzXCIsXG5cdFwiLi90bGhcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsaC5qc1wiLFxuXHRcIi4vdGxoLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bGguanNcIixcblx0XCIuL3RyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ci5qc1wiLFxuXHRcIi4vdHIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RyLmpzXCIsXG5cdFwiLi90emxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bC5qc1wiLFxuXHRcIi4vdHpsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90emwuanNcIixcblx0XCIuL3R6bVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLmpzXCIsXG5cdFwiLi90em0tbGF0blwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLWxhdG4uanNcIixcblx0XCIuL3R6bS1sYXRuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0tbGF0bi5qc1wiLFxuXHRcIi4vdHptLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0uanNcIixcblx0XCIuL3VnLWNuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91Zy1jbi5qc1wiLFxuXHRcIi4vdWctY24uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VnLWNuLmpzXCIsXG5cdFwiLi91a1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWsuanNcIixcblx0XCIuL3VrLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ay5qc1wiLFxuXHRcIi4vdXJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VyLmpzXCIsXG5cdFwiLi91ci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXIuanNcIixcblx0XCIuL3V6XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei5qc1wiLFxuXHRcIi4vdXotbGF0blwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXotbGF0bi5qc1wiLFxuXHRcIi4vdXotbGF0bi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXotbGF0bi5qc1wiLFxuXHRcIi4vdXouanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3V6LmpzXCIsXG5cdFwiLi92aVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdmkuanNcIixcblx0XCIuL3ZpLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS92aS5qc1wiLFxuXHRcIi4veC1wc2V1ZG9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3gtcHNldWRvLmpzXCIsXG5cdFwiLi94LXBzZXVkby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUveC1wc2V1ZG8uanNcIixcblx0XCIuL3lvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS95by5qc1wiLFxuXHRcIi4veW8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3lvLmpzXCIsXG5cdFwiLi96aC1jblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtY24uanNcIixcblx0XCIuL3poLWNuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1jbi5qc1wiLFxuXHRcIi4vemgtaGtcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLWhrLmpzXCIsXG5cdFwiLi96aC1oay5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtaGsuanNcIixcblx0XCIuL3poLW1vXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1tby5qc1wiLFxuXHRcIi4vemgtbW8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLW1vLmpzXCIsXG5cdFwiLi96aC10d1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtdHcuanNcIixcblx0XCIuL3poLXR3LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC10dy5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLiokXCI7IiwiLy8hIG1vbWVudC5qc1xuLy8hIHZlcnNpb24gOiAyLjMwLjFcbi8vISBhdXRob3JzIDogVGltIFdvb2QsIElza3JlbiBDaGVybmV2LCBNb21lbnQuanMgY29udHJpYnV0b3JzXG4vLyEgbGljZW5zZSA6IE1JVFxuLy8hIG1vbWVudGpzLmNvbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICBnbG9iYWwubW9tZW50ID0gZmFjdG9yeSgpXG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBob29rQ2FsbGJhY2s7XG5cbiAgICBmdW5jdGlvbiBob29rcygpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tDYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4gICAgLy8gd2l0aG91dCBjcmVhdGluZyBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGhvb2tDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgQXJyYXkgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdChpbnB1dCkge1xuICAgICAgICAvLyBJRTggd2lsbCB0cmVhdCB1bmRlZmluZWQgYW5kIG51bGwgYXMgb2JqZWN0IGlmIGl0IHdhc24ndCBmb3JcbiAgICAgICAgLy8gaW5wdXQgIT0gbnVsbFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaW5wdXQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdEVtcHR5KG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKG9iaiwgaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IE51bWJlcl0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IERhdGVdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgICAgIHZhciByZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBhcnJMZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyTGVuOyArK2kpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGZuKGFycltpXSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBiKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChiLCBpKSkge1xuICAgICAgICAgICAgICAgIGFbaV0gPSBiW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgJ3RvU3RyaW5nJykpIHtcbiAgICAgICAgICAgIGEudG9TdHJpbmcgPSBiLnRvU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgJ3ZhbHVlT2YnKSkge1xuICAgICAgICAgICAgYS52YWx1ZU9mID0gYi52YWx1ZU9mO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCB0cnVlKS51dGMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZXAgY2xvbmUgdGhpcyBvYmplY3QuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eTogZmFsc2UsXG4gICAgICAgICAgICB1bnVzZWRUb2tlbnM6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQ6IFtdLFxuICAgICAgICAgICAgb3ZlcmZsb3c6IC0yLFxuICAgICAgICAgICAgY2hhcnNMZWZ0T3ZlcjogMCxcbiAgICAgICAgICAgIG51bGxJbnB1dDogZmFsc2UsXG4gICAgICAgICAgICBpbnZhbGlkRXJhOiBudWxsLFxuICAgICAgICAgICAgaW52YWxpZE1vbnRoOiBudWxsLFxuICAgICAgICAgICAgaW52YWxpZEZvcm1hdDogZmFsc2UsXG4gICAgICAgICAgICB1c2VySW52YWxpZGF0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNvOiBmYWxzZSxcbiAgICAgICAgICAgIHBhcnNlZERhdGVQYXJ0czogW10sXG4gICAgICAgICAgICBlcmE6IG51bGwsXG4gICAgICAgICAgICBtZXJpZGllbTogbnVsbCxcbiAgICAgICAgICAgIHJmYzI4MjI6IGZhbHNlLFxuICAgICAgICAgICAgd2Vla2RheU1pc21hdGNoOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQYXJzaW5nRmxhZ3MobSkge1xuICAgICAgICBpZiAobS5fcGYgPT0gbnVsbCkge1xuICAgICAgICAgICAgbS5fcGYgPSBkZWZhdWx0UGFyc2luZ0ZsYWdzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX3BmO1xuICAgIH1cblxuICAgIHZhciBzb21lO1xuICAgIGlmIChBcnJheS5wcm90b3R5cGUuc29tZSkge1xuICAgICAgICBzb21lID0gQXJyYXkucHJvdG90eXBlLnNvbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc29tZSA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0KHRoaXMpLFxuICAgICAgICAgICAgICAgIGxlbiA9IHQubGVuZ3RoID4+PiAwLFxuICAgICAgICAgICAgICAgIGk7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgICAgIHZhciBmbGFncyA9IG51bGwsXG4gICAgICAgICAgICBwYXJzZWRQYXJ0cyA9IGZhbHNlLFxuICAgICAgICAgICAgaXNOb3dWYWxpZCA9IG0uX2QgJiYgIWlzTmFOKG0uX2QuZ2V0VGltZSgpKTtcbiAgICAgICAgaWYgKGlzTm93VmFsaWQpIHtcbiAgICAgICAgICAgIGZsYWdzID0gZ2V0UGFyc2luZ0ZsYWdzKG0pO1xuICAgICAgICAgICAgcGFyc2VkUGFydHMgPSBzb21lLmNhbGwoZmxhZ3MucGFyc2VkRGF0ZVBhcnRzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpICE9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlzTm93VmFsaWQgPVxuICAgICAgICAgICAgICAgIGZsYWdzLm92ZXJmbG93IDwgMCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5lbXB0eSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkRXJhICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRNb250aCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkV2Vla2RheSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgKCFmbGFncy5tZXJpZGllbSB8fCAoZmxhZ3MubWVyaWRpZW0gJiYgcGFyc2VkUGFydHMpKTtcbiAgICAgICAgICAgIGlmIChtLl9zdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBpc05vd1ZhbGlkID1cbiAgICAgICAgICAgICAgICAgICAgaXNOb3dWYWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5jaGFyc0xlZnRPdmVyID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLnVudXNlZFRva2Vucy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYmlnSG91ciA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4gPT0gbnVsbCB8fCAhT2JqZWN0LmlzRnJvemVuKG0pKSB7XG4gICAgICAgICAgICBtLl9pc1ZhbGlkID0gaXNOb3dWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc05vd1ZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQoZmxhZ3MpIHtcbiAgICAgICAgdmFyIG0gPSBjcmVhdGVVVEMoTmFOKTtcbiAgICAgICAgaWYgKGZsYWdzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGV4dGVuZChnZXRQYXJzaW5nRmxhZ3MobSksIGZsYWdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS51c2VySW52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gUGx1Z2lucyB0aGF0IGFkZCBwcm9wZXJ0aWVzIHNob3VsZCBhbHNvIGFkZCB0aGUga2V5IGhlcmUgKG51bGwgdmFsdWUpLFxuICAgIC8vIHNvIHdlIGNhbiBwcm9wZXJseSBjbG9uZSBvdXJzZWx2ZXMuXG4gICAgdmFyIG1vbWVudFByb3BlcnRpZXMgPSAoaG9va3MubW9tZW50UHJvcGVydGllcyA9IFtdKSxcbiAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gY29weUNvbmZpZyh0bywgZnJvbSkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBtb21lbnRQcm9wZXJ0aWVzTGVuID0gbW9tZW50UHJvcGVydGllcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc0FNb21lbnRPYmplY3QpKSB7XG4gICAgICAgICAgICB0by5faXNBTW9tZW50T2JqZWN0ID0gZnJvbS5faXNBTW9tZW50T2JqZWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faSkpIHtcbiAgICAgICAgICAgIHRvLl9pID0gZnJvbS5faTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2YpKSB7XG4gICAgICAgICAgICB0by5fZiA9IGZyb20uX2Y7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sKSkge1xuICAgICAgICAgICAgdG8uX2wgPSBmcm9tLl9sO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fc3RyaWN0KSkge1xuICAgICAgICAgICAgdG8uX3N0cmljdCA9IGZyb20uX3N0cmljdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3R6bSkpIHtcbiAgICAgICAgICAgIHRvLl90em0gPSBmcm9tLl90em07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc1VUQykpIHtcbiAgICAgICAgICAgIHRvLl9pc1VUQyA9IGZyb20uX2lzVVRDO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fb2Zmc2V0KSkge1xuICAgICAgICAgICAgdG8uX29mZnNldCA9IGZyb20uX29mZnNldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3BmKSkge1xuICAgICAgICAgICAgdG8uX3BmID0gZ2V0UGFyc2luZ0ZsYWdzKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fbG9jYWxlKSkge1xuICAgICAgICAgICAgdG8uX2xvY2FsZSA9IGZyb20uX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb21lbnRQcm9wZXJ0aWVzTGVuID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXNMZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHByb3AgPSBtb21lbnRQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIHZhbCA9IGZyb21bcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvW3Byb3BdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0bztcbiAgICB9XG5cbiAgICAvLyBNb21lbnQgcHJvdG90eXBlIG9iamVjdFxuICAgIGZ1bmN0aW9uIE1vbWVudChjb25maWcpIHtcbiAgICAgICAgY29weUNvbmZpZyh0aGlzLCBjb25maWcpO1xuICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoY29uZmlnLl9kICE9IG51bGwgPyBjb25maWcuX2QuZ2V0VGltZSgpIDogTmFOKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wIGluIGNhc2UgdXBkYXRlT2Zmc2V0IGNyZWF0ZXMgbmV3IG1vbWVudFxuICAgICAgICAvLyBvYmplY3RzLlxuICAgICAgICBpZiAodXBkYXRlSW5Qcm9ncmVzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNNb21lbnQob2JqKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaG9va3Muc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBjb25zb2xlLndhcm5cbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0RlcHJlY2F0aW9uIHdhcm5pbmc6ICcgKyBtc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVwcmVjYXRlKG1zZywgZm4pIHtcbiAgICAgICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobnVsbCwgbXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBhcmcsXG4gICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgYXJnTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9ICdcXG5bJyArIGkgKyAnXSAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gYXJndW1lbnRzWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093blByb3AoYXJndW1lbnRzWzBdLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSBrZXkgKyAnOiAnICsgYXJndW1lbnRzWzBdW2tleV0gKyAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgICAgICAgbXNnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXG5Bcmd1bWVudHM6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yKCkuc3RhY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHR5cGVvZiBGdW5jdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbikgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICBmb3IgKGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjb25maWcsIGkpKSB7XG4gICAgICAgICAgICAgICAgcHJvcCA9IGNvbmZpZ1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAvLyBMZW5pZW50IG9yZGluYWwgcGFyc2luZyBhY2NlcHRzIGp1c3QgYSBudW1iZXIgaW4gYWRkaXRpb24gdG9cbiAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICB0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgICAgICd8JyArXG4gICAgICAgICAgICAgICAgL1xcZHsxLDJ9Ly5zb3VyY2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjaGlsZENvbmZpZykge1xuICAgICAgICB2YXIgcmVzID0gZXh0ZW5kKHt9LCBwYXJlbnRDb25maWcpLFxuICAgICAgICAgICAgcHJvcDtcbiAgICAgICAgZm9yIChwcm9wIGluIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjaGlsZENvbmZpZywgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSAmJiBpc09iamVjdChjaGlsZENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIHBhcmVudENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIGNoaWxkQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkQ29uZmlnW3Byb3BdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gY2hpbGRDb25maWdbcHJvcF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChwcm9wIGluIHBhcmVudENvbmZpZykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGhhc093blByb3AocGFyZW50Q29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgICFoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgZG9uJ3QgbW9kaWZ5IHBhcmVudCBjb25maWdcbiAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBleHRlbmQoe30sIHJlc1twcm9wXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMb2NhbGUoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cztcbiAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICAgICAgcmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3Aob2JqLCBpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0Q2FsZW5kYXIgPSB7XG4gICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyKGtleSwgbW9tLCBub3cpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX2NhbGVuZGFyW2tleV0gfHwgdGhpcy5fY2FsZW5kYXJbJ3NhbWVFbHNlJ107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG91dHB1dCkgPyBvdXRwdXQuY2FsbChtb20sIG5vdykgOiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gemVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgsIGZvcmNlU2lnbikge1xuICAgICAgICB2YXIgYWJzTnVtYmVyID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxuICAgICAgICAgICAgemVyb3NUb0ZpbGwgPSB0YXJnZXRMZW5ndGggLSBhYnNOdW1iZXIubGVuZ3RoLFxuICAgICAgICAgICAgc2lnbiA9IG51bWJlciA+PSAwO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHNpZ24gPyAoZm9yY2VTaWduID8gJysnIDogJycpIDogJy0nKSArXG4gICAgICAgICAgICBNYXRoLnBvdygxMCwgTWF0aC5tYXgoMCwgemVyb3NUb0ZpbGwpKS50b1N0cmluZygpLnN1YnN0cigxKSArXG4gICAgICAgICAgICBhYnNOdW1iZXJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0dGluZ1Rva2VucyA9XG4gICAgICAgICAgICAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fE57MSw1fXxZWVlZWVl8WVlZWVl8WVlZWXxZWXx5ezIsNH18eW8/fGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nLFxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oTFRTfExUfExMP0w/TD98bHsxLDR9KS9nLFxuICAgICAgICBmb3JtYXRGdW5jdGlvbnMgPSB7fSxcbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7fTtcblxuICAgIC8vIHRva2VuOiAgICAnTSdcbiAgICAvLyBwYWRkZWQ6ICAgWydNTScsIDJdXG4gICAgLy8gb3JkaW5hbDogICdNbydcbiAgICAvLyBjYWxsYmFjazogZnVuY3Rpb24gKCkgeyB0aGlzLm1vbnRoKCkgKyAxIH1cbiAgICBmdW5jdGlvbiBhZGRGb3JtYXRUb2tlbih0b2tlbiwgcGFkZGVkLCBvcmRpbmFsLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tjYWxsYmFja10oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWRkZWQpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3BhZGRlZFswXV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHplcm9GaWxsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgcGFkZGVkWzFdLCBwYWRkZWRbMl0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3JkaW5hbCkge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbb3JkaW5hbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwoXG4gICAgICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbGVuZ3RoO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhhcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1vbSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9ICcnLFxuICAgICAgICAgICAgICAgIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gaXNGdW5jdGlvbihhcnJheVtpXSlcbiAgICAgICAgICAgICAgICAgICAgPyBhcnJheVtpXS5jYWxsKG1vbSwgZm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICA6IGFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBmb3JtYXQgZGF0ZSB1c2luZyBuYXRpdmUgZGF0ZSBvYmplY3RcbiAgICBmdW5jdGlvbiBmb3JtYXRNb21lbnQobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBtLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbS5sb2NhbGVEYXRhKCkpO1xuICAgICAgICBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSA9XG4gICAgICAgICAgICBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSB8fCBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KTtcblxuICAgICAgICByZXR1cm4gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0obSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbG9jYWxlKSB7XG4gICAgICAgIHZhciBpID0gNTtcblxuICAgICAgICBmdW5jdGlvbiByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubG9uZ0RhdGVGb3JtYXQoaW5wdXQpIHx8IGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChpID49IDAgJiYgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLFxuICAgICAgICAgICAgICAgIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2Vuc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvbmdEYXRlRm9ybWF0ID0ge1xuICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgIEw6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgTEw6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICBMTEw6ICdNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsb25nRGF0ZUZvcm1hdChrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0sXG4gICAgICAgICAgICBmb3JtYXRVcHBlciA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleS50b1VwcGVyQ2FzZSgpXTtcblxuICAgICAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlclxuICAgICAgICAgICAgLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uICh0b2spIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ01NTU0nIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ01NJyB8fFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdERCcgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnZGRkZCdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvay5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvaztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRJbnZhbGlkRGF0ZSA9ICdJbnZhbGlkIGRhdGUnO1xuXG4gICAgZnVuY3Rpb24gaW52YWxpZERhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZhbGlkRGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdE9yZGluYWwgPSAnJWQnLFxuICAgICAgICBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSA9IC9cXGR7MSwyfS87XG5cbiAgICBmdW5jdGlvbiBvcmRpbmFsKG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JkaW5hbC5yZXBsYWNlKCclZCcsIG51bWJlcik7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRSZWxhdGl2ZVRpbWUgPSB7XG4gICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgdzogJ2Egd2VlaycsXG4gICAgICAgIHd3OiAnJWQgd2Vla3MnLFxuICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbc3RyaW5nXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KVxuICAgICAgICAgICAgPyBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKVxuICAgICAgICAgICAgOiBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXN0RnV0dXJlKGRpZmYsIG91dHB1dCkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW2RpZmYgPiAwID8gJ2Z1dHVyZScgOiAncGFzdCddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihmb3JtYXQpID8gZm9ybWF0KG91dHB1dCkgOiBmb3JtYXQucmVwbGFjZSgvJXMvaSwgb3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgYWxpYXNlcyA9IHtcbiAgICAgICAgRDogJ2RhdGUnLFxuICAgICAgICBkYXRlczogJ2RhdGUnLFxuICAgICAgICBkYXRlOiAnZGF0ZScsXG4gICAgICAgIGQ6ICdkYXknLFxuICAgICAgICBkYXlzOiAnZGF5JyxcbiAgICAgICAgZGF5OiAnZGF5JyxcbiAgICAgICAgZTogJ3dlZWtkYXknLFxuICAgICAgICB3ZWVrZGF5czogJ3dlZWtkYXknLFxuICAgICAgICB3ZWVrZGF5OiAnd2Vla2RheScsXG4gICAgICAgIEU6ICdpc29XZWVrZGF5JyxcbiAgICAgICAgaXNvd2Vla2RheXM6ICdpc29XZWVrZGF5JyxcbiAgICAgICAgaXNvd2Vla2RheTogJ2lzb1dlZWtkYXknLFxuICAgICAgICBEREQ6ICdkYXlPZlllYXInLFxuICAgICAgICBkYXlvZnllYXJzOiAnZGF5T2ZZZWFyJyxcbiAgICAgICAgZGF5b2Z5ZWFyOiAnZGF5T2ZZZWFyJyxcbiAgICAgICAgaDogJ2hvdXInLFxuICAgICAgICBob3VyczogJ2hvdXInLFxuICAgICAgICBob3VyOiAnaG91cicsXG4gICAgICAgIG1zOiAnbWlsbGlzZWNvbmQnLFxuICAgICAgICBtaWxsaXNlY29uZHM6ICdtaWxsaXNlY29uZCcsXG4gICAgICAgIG1pbGxpc2Vjb25kOiAnbWlsbGlzZWNvbmQnLFxuICAgICAgICBtOiAnbWludXRlJyxcbiAgICAgICAgbWludXRlczogJ21pbnV0ZScsXG4gICAgICAgIG1pbnV0ZTogJ21pbnV0ZScsXG4gICAgICAgIE06ICdtb250aCcsXG4gICAgICAgIG1vbnRoczogJ21vbnRoJyxcbiAgICAgICAgbW9udGg6ICdtb250aCcsXG4gICAgICAgIFE6ICdxdWFydGVyJyxcbiAgICAgICAgcXVhcnRlcnM6ICdxdWFydGVyJyxcbiAgICAgICAgcXVhcnRlcjogJ3F1YXJ0ZXInLFxuICAgICAgICBzOiAnc2Vjb25kJyxcbiAgICAgICAgc2Vjb25kczogJ3NlY29uZCcsXG4gICAgICAgIHNlY29uZDogJ3NlY29uZCcsXG4gICAgICAgIGdnOiAnd2Vla1llYXInLFxuICAgICAgICB3ZWVreWVhcnM6ICd3ZWVrWWVhcicsXG4gICAgICAgIHdlZWt5ZWFyOiAnd2Vla1llYXInLFxuICAgICAgICBHRzogJ2lzb1dlZWtZZWFyJyxcbiAgICAgICAgaXNvd2Vla3llYXJzOiAnaXNvV2Vla1llYXInLFxuICAgICAgICBpc293ZWVreWVhcjogJ2lzb1dlZWtZZWFyJyxcbiAgICAgICAgdzogJ3dlZWsnLFxuICAgICAgICB3ZWVrczogJ3dlZWsnLFxuICAgICAgICB3ZWVrOiAnd2VlaycsXG4gICAgICAgIFc6ICdpc29XZWVrJyxcbiAgICAgICAgaXNvd2Vla3M6ICdpc29XZWVrJyxcbiAgICAgICAgaXNvd2VlazogJ2lzb1dlZWsnLFxuICAgICAgICB5OiAneWVhcicsXG4gICAgICAgIHllYXJzOiAneWVhcicsXG4gICAgICAgIHllYXI6ICd5ZWFyJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bml0cyA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gYWxpYXNlc1t1bml0c10gfHwgYWxpYXNlc1t1bml0cy50b0xvd2VyQ2FzZSgpXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0VW5pdHMoaW5wdXRPYmplY3QpIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IHt9LFxuICAgICAgICAgICAgbm9ybWFsaXplZFByb3AsXG4gICAgICAgICAgICBwcm9wO1xuXG4gICAgICAgIGZvciAocHJvcCBpbiBpbnB1dE9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoaW5wdXRPYmplY3QsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZFByb3AgPSBub3JtYWxpemVVbml0cyhwcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZElucHV0W25vcm1hbGl6ZWRQcm9wXSA9IGlucHV0T2JqZWN0W3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkSW5wdXQ7XG4gICAgfVxuXG4gICAgdmFyIHByaW9yaXRpZXMgPSB7XG4gICAgICAgIGRhdGU6IDksXG4gICAgICAgIGRheTogMTEsXG4gICAgICAgIHdlZWtkYXk6IDExLFxuICAgICAgICBpc29XZWVrZGF5OiAxMSxcbiAgICAgICAgZGF5T2ZZZWFyOiA0LFxuICAgICAgICBob3VyOiAxMyxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IDE2LFxuICAgICAgICBtaW51dGU6IDE0LFxuICAgICAgICBtb250aDogOCxcbiAgICAgICAgcXVhcnRlcjogNyxcbiAgICAgICAgc2Vjb25kOiAxNSxcbiAgICAgICAgd2Vla1llYXI6IDEsXG4gICAgICAgIGlzb1dlZWtZZWFyOiAxLFxuICAgICAgICB3ZWVrOiA1LFxuICAgICAgICBpc29XZWVrOiA1LFxuICAgICAgICB5ZWFyOiAxLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzT2JqKSB7XG4gICAgICAgIHZhciB1bml0cyA9IFtdLFxuICAgICAgICAgICAgdTtcbiAgICAgICAgZm9yICh1IGluIHVuaXRzT2JqKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcCh1bml0c09iaiwgdSkpIHtcbiAgICAgICAgICAgICAgICB1bml0cy5wdXNoKHsgdW5pdDogdSwgcHJpb3JpdHk6IHByaW9yaXRpZXNbdV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIHZhciBtYXRjaDEgPSAvXFxkLywgLy8gICAgICAgMCAtIDlcbiAgICAgICAgbWF0Y2gyID0gL1xcZFxcZC8sIC8vICAgICAgMDAgLSA5OVxuICAgICAgICBtYXRjaDMgPSAvXFxkezN9LywgLy8gICAgIDAwMCAtIDk5OVxuICAgICAgICBtYXRjaDQgPSAvXFxkezR9LywgLy8gICAgMDAwMCAtIDk5OTlcbiAgICAgICAgbWF0Y2g2ID0gL1srLV0/XFxkezZ9LywgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaDF0bzIgPSAvXFxkXFxkPy8sIC8vICAgICAgIDAgLSA5OVxuICAgICAgICBtYXRjaDN0bzQgPSAvXFxkXFxkXFxkXFxkPy8sIC8vICAgICA5OTkgLSA5OTk5XG4gICAgICAgIG1hdGNoNXRvNiA9IC9cXGRcXGRcXGRcXGRcXGRcXGQ/LywgLy8gICA5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaDF0bzMgPSAvXFxkezEsM30vLCAvLyAgICAgICAwIC0gOTk5XG4gICAgICAgIG1hdGNoMXRvNCA9IC9cXGR7MSw0fS8sIC8vICAgICAgIDAgLSA5OTk5XG4gICAgICAgIG1hdGNoMXRvNiA9IC9bKy1dP1xcZHsxLDZ9LywgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaFVuc2lnbmVkID0gL1xcZCsvLCAvLyAgICAgICAwIC0gaW5mXG4gICAgICAgIG1hdGNoU2lnbmVkID0gL1srLV0/XFxkKy8sIC8vICAgIC1pbmYgLSBpbmZcbiAgICAgICAgbWF0Y2hPZmZzZXQgPSAvWnxbKy1dXFxkXFxkOj9cXGRcXGQvZ2ksIC8vICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuICAgICAgICBtYXRjaFNob3J0T2Zmc2V0ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2ksIC8vICswMCAtMDAgKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgICAgIG1hdGNoVGltZXN0YW1wID0gL1srLV0/XFxkKyhcXC5cXGR7MSwzfSk/LywgLy8gMTIzNDU2Nzg5IDEyMzQ1Njc4OS4xMjNcbiAgICAgICAgLy8gYW55IHdvcmQgKG9yIHR3bykgY2hhcmFjdGVycyBvciBudW1iZXJzIGluY2x1ZGluZyB0d28vdGhyZWUgd29yZCBtb250aCBpbiBhcmFiaWMuXG4gICAgICAgIC8vIGluY2x1ZGVzIHNjb3R0aXNoIGdhZWxpYyB0d28gd29yZCBhbmQgaHlwaGVuYXRlZCBtb250aHNcbiAgICAgICAgbWF0Y2hXb3JkID1cbiAgICAgICAgICAgIC9bMC05XXswLDI1Nn1bJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkYwN1xcdUZGMTAtXFx1RkZFRl17MSwyNTZ9fFtcXHUwNjAwLVxcdTA2RkZcXC9dezEsMjU2fShcXHMqP1tcXHUwNjAwLVxcdTA2RkZdezEsMjU2fSl7MSwyfS9pLFxuICAgICAgICBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvID0gL15bMS05XVxcZD8vLCAvLyAgICAgICAgIDEtOTlcbiAgICAgICAgbWF0Y2gxdG8ySGFzWmVybyA9IC9eKFsxLTldXFxkfFxcZCkvLCAvLyAgICAgICAgICAgMC05OVxuICAgICAgICByZWdleGVzO1xuXG4gICAgcmVnZXhlcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkUmVnZXhUb2tlbih0b2tlbiwgcmVnZXgsIHN0cmljdFJlZ2V4KSB7XG4gICAgICAgIHJlZ2V4ZXNbdG9rZW5dID0gaXNGdW5jdGlvbihyZWdleClcbiAgICAgICAgICAgID8gcmVnZXhcbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaXNTdHJpY3QgJiYgc3RyaWN0UmVnZXggPyBzdHJpY3RSZWdleCA6IHJlZ2V4O1xuICAgICAgICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUoXG4gICAgICAgICAgICBzXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1xcXFwnLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZyxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVnZXhFc2NhcGUocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNGbG9vcihudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIC0wIC0+IDBcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKSB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBhYnNGbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgdG9rZW5zID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRQYXJzZVRva2VuKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGZ1bmMgPSBjYWxsYmFjayxcbiAgICAgICAgICAgIHRva2VuTGVuO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcihjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbY2FsbGJhY2tdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbkxlbiA9IHRva2VuLmxlbmd0aDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2VuTGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbltpXV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1BhcnNlVG9rZW4odG9rZW4sIGNhbGxiYWNrKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgICAgIGNvbmZpZy5fdyA9IGNvbmZpZy5fdyB8fCB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGlucHV0LCBjb25maWcuX3csIGNvbmZpZywgdG9rZW4pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgaW5wdXQsIGNvbmZpZykge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBoYXNPd25Qcm9wKHRva2VucywgdG9rZW4pKSB7XG4gICAgICAgICAgICB0b2tlbnNbdG9rZW5dKGlucHV0LCBjb25maWcuX2EsIGNvbmZpZywgdG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gICAgICAgIHJldHVybiAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkgfHwgeWVhciAlIDQwMCA9PT0gMDtcbiAgICB9XG5cbiAgICB2YXIgWUVBUiA9IDAsXG4gICAgICAgIE1PTlRIID0gMSxcbiAgICAgICAgREFURSA9IDIsXG4gICAgICAgIEhPVVIgPSAzLFxuICAgICAgICBNSU5VVEUgPSA0LFxuICAgICAgICBTRUNPTkQgPSA1LFxuICAgICAgICBNSUxMSVNFQ09ORCA9IDYsXG4gICAgICAgIFdFRUsgPSA3LFxuICAgICAgICBXRUVLREFZID0gODtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdZJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueWVhcigpO1xuICAgICAgICByZXR1cm4geSA8PSA5OTk5ID8gemVyb0ZpbGwoeSwgNCkgOiAnKycgKyB5O1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWScsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWScsIDRdLCAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVknLCA1XSwgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZWScsIDYsIHRydWVdLCAwLCAneWVhcicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPVxuICAgICAgICAgICAgaW5wdXQubGVuZ3RoID09PSAyID8gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpIDogdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1lZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIoeWVhcikgPyAzNjYgOiAzNjU7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0b0ludChpbnB1dCkgKyAodG9JbnQoaW5wdXQpID4gNjggPyAxOTAwIDogMjAwMCk7XG4gICAgfTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRZZWFyID0gbWFrZUdldFNldCgnRnVsbFllYXInLCB0cnVlKTtcblxuICAgIGZ1bmN0aW9uIGdldElzTGVhcFllYXIoKSB7XG4gICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHRoaXMueWVhcigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlR2V0U2V0KHVuaXQsIGtlZXBUaW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0JDEodGhpcywgdW5pdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0KG1vbSwgdW5pdCkge1xuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZCA9IG1vbS5fZCxcbiAgICAgICAgICAgIGlzVVRDID0gbW9tLl9pc1VUQztcblxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ01pbGxpc2Vjb25kcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENNaWxsaXNlY29uZHMoKSA6IGQuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgICAgICAgICBjYXNlICdTZWNvbmRzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ1NlY29uZHMoKSA6IGQuZ2V0U2Vjb25kcygpO1xuICAgICAgICAgICAgY2FzZSAnTWludXRlcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENNaW51dGVzKCkgOiBkLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgIGNhc2UgJ0hvdXJzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0hvdXJzKCkgOiBkLmdldEhvdXJzKCk7XG4gICAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0RhdGUoKSA6IGQuZ2V0RGF0ZSgpO1xuICAgICAgICAgICAgY2FzZSAnRGF5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0RheSgpIDogZC5nZXREYXkoKTtcbiAgICAgICAgICAgIGNhc2UgJ01vbnRoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ01vbnRoKCkgOiBkLmdldE1vbnRoKCk7XG4gICAgICAgICAgICBjYXNlICdGdWxsWWVhcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENGdWxsWWVhcigpIDogZC5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gTmFOOyAvLyBKdXN0IGluIGNhc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCQxKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGQsIGlzVVRDLCB5ZWFyLCBtb250aCwgZGF0ZTtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkgfHwgaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkID0gbW9tLl9kO1xuICAgICAgICBpc1VUQyA9IG1vbS5faXNVVEM7XG5cbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdNaWxsaXNlY29uZHMnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChpc1VUQ1xuICAgICAgICAgICAgICAgICAgICA/IGQuc2V0VVRDTWlsbGlzZWNvbmRzKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA6IGQuc2V0TWlsbGlzZWNvbmRzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdTZWNvbmRzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ1NlY29uZHModmFsdWUpIDogZC5zZXRTZWNvbmRzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdNaW51dGVzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ01pbnV0ZXModmFsdWUpIDogZC5zZXRNaW51dGVzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdIb3Vycyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENIb3Vycyh2YWx1ZSkgOiBkLnNldEhvdXJzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ0RhdGUodmFsdWUpIDogZC5zZXREYXRlKHZhbHVlKSk7XG4gICAgICAgICAgICAvLyBjYXNlICdEYXknOiAvLyBOb3QgcmVhbFxuICAgICAgICAgICAgLy8gICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENEYXkodmFsdWUpIDogZC5zZXREYXkodmFsdWUpKTtcbiAgICAgICAgICAgIC8vIGNhc2UgJ01vbnRoJzogLy8gTm90IHVzZWQgYmVjYXVzZSB3ZSBuZWVkIHRvIHBhc3MgdHdvIHZhcmlhYmxlc1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDTW9udGgodmFsdWUpIDogZC5zZXRNb250aCh2YWx1ZSkpO1xuICAgICAgICAgICAgY2FzZSAnRnVsbFllYXInOlxuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBTZWUgYmVsb3cgLi4uXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSnVzdCBpbiBjYXNlXG4gICAgICAgIH1cblxuICAgICAgICB5ZWFyID0gdmFsdWU7XG4gICAgICAgIG1vbnRoID0gbW9tLm1vbnRoKCk7XG4gICAgICAgIGRhdGUgPSBtb20uZGF0ZSgpO1xuICAgICAgICBkYXRlID0gZGF0ZSA9PT0gMjkgJiYgbW9udGggPT09IDEgJiYgIWlzTGVhcFllYXIoeWVhcikgPyAyOCA6IGRhdGU7XG4gICAgICAgIHZvaWQgKGlzVVRDXG4gICAgICAgICAgICA/IGQuc2V0VVRDRnVsbFllYXIoeWVhciwgbW9udGgsIGRhdGUpXG4gICAgICAgICAgICA6IGQuc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIGRhdGUpKTtcbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzdHJpbmdHZXQodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RyaW5nU2V0KHVuaXRzLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVPYmplY3RVbml0cyh1bml0cyk7XG4gICAgICAgICAgICB2YXIgcHJpb3JpdGl6ZWQgPSBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzKSxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIHByaW9yaXRpemVkTGVuID0gcHJpb3JpdGl6ZWQubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHByaW9yaXRpemVkTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb2QobiwgeCkge1xuICAgICAgICByZXR1cm4gKChuICUgeCkgKyB4KSAlIHg7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4T2Y7XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgICAgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4T2YgPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgLy8gSSBrbm93XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1vZE1vbnRoID0gbW9kKG1vbnRoLCAxMik7XG4gICAgICAgIHllYXIgKz0gKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG4gICAgICAgIHJldHVybiBtb2RNb250aCA9PT0gMVxuICAgICAgICAgICAgPyBpc0xlYXBZZWFyKHllYXIpXG4gICAgICAgICAgICAgICAgPyAyOVxuICAgICAgICAgICAgICAgIDogMjhcbiAgICAgICAgICAgIDogMzEgLSAoKG1vZE1vbnRoICUgNykgJSAyKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignTScsIFsnTU0nLCAyXSwgJ01vJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ00nLCBtYXRjaDF0bzIsIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ00nLCAnTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSB0b0ludChpbnB1dCkgLSAxO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ01NTScsICdNTU1NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1vbnRoID0gY29uZmlnLl9sb2NhbGUubW9udGhzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgICAgICBpZiAobW9udGggIT0gbnVsbCkge1xuICAgICAgICAgICAgYXJyYXlbTU9OVEhdID0gbW9udGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNb250aHMgPVxuICAgICAgICAgICAgJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID1cbiAgICAgICAgICAgICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgTU9OVEhTX0lOX0ZPUk1BVCA9IC9EW29EXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0/LyxcbiAgICAgICAgZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXggPSBtYXRjaFdvcmQsXG4gICAgICAgIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRocyhtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHMpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocylcbiAgICAgICAgICAgID8gdGhpcy5fbW9udGhzW20ubW9udGgoKV1cbiAgICAgICAgICAgIDogdGhpcy5fbW9udGhzW1xuICAgICAgICAgICAgICAgICAgKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgICA/ICdmb3JtYXQnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnc3RhbmRhbG9uZSdcbiAgICAgICAgICAgICAgXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0KG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KVxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU2hvcnRcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1Nob3J0WydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzU2hvcnQpXG4gICAgICAgICAgICA/IHRoaXMuX21vbnRoc1Nob3J0W20ubW9udGgoKV1cbiAgICAgICAgICAgIDogdGhpcy5fbW9udGhzU2hvcnRbXG4gICAgICAgICAgICAgICAgICBNT05USFNfSU5fRk9STUFULnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF1bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgaWksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBsbGMgPSBtb250aE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgdXNlZFxuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHNTaG9ydChcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UuY2FsbCh0aGlzLCBtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IGFkZCBzb3J0aW5nXG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXJcbiAgICAgICAgLy8gc2VlIHNvcnRpbmcgaW4gY29tcHV0ZU1vbnRoc1BhcnNlXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdHJpY3QgJiYgIXRoaXMuX21vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKSArICd8XicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdNTU1NJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdNTU0nICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX21vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc2V0TW9udGgobW9tLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbW9udGggPSB2YWx1ZSxcbiAgICAgICAgICAgIGRhdGUgPSBtb20uZGF0ZSgpO1xuXG4gICAgICAgIGRhdGUgPSBkYXRlIDwgMjkgPyBkYXRlIDogTWF0aC5taW4oZGF0ZSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgbW9udGgpKTtcbiAgICAgICAgdm9pZCAobW9tLl9pc1VUQ1xuICAgICAgICAgICAgPyBtb20uX2Quc2V0VVRDTW9udGgobW9udGgsIGRhdGUpXG4gICAgICAgICAgICA6IG1vbS5fZC5zZXRNb250aChtb250aCwgZGF0ZSkpO1xuICAgICAgICByZXR1cm4gbW9tO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldE1vbnRoKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzZXRNb250aCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgJ01vbnRoJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXlzSW5Nb250aCgpIHtcbiAgICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1Nob3J0UmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSBkZWZhdWx0TW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gZGVmYXVsdE1vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlTW9udGhzUGFyc2UoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaG9ydFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbG9uZ1BpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBzaG9ydFAsXG4gICAgICAgICAgICBsb25nUDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBzaG9ydFAgPSByZWdleEVzY2FwZSh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgICAgIGxvbmdQID0gcmVnZXhFc2NhcGUodGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaChzaG9ydFApO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKGxvbmdQKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobG9uZ1ApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydFApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG5cbiAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpIHtcbiAgICAgICAgLy8gY2FuJ3QganVzdCBhcHBseSgpIHRvIGNyZWF0ZSBhIGRhdGU6XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8xODEzNDhcbiAgICAgICAgdmFyIGRhdGU7XG4gICAgICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoeSArIDQwMCwgbSwgZCwgaCwgTSwgcywgbXMpO1xuICAgICAgICAgICAgaWYgKGlzRmluaXRlKGRhdGUuZ2V0RnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVUQ0RhdGUoeSkge1xuICAgICAgICB2YXIgZGF0ZSwgYXJncztcbiAgICAgICAgLy8gdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIGFyZ3NbMF0gPSB5ICsgNDAwO1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3MpKTtcbiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpKSB7XG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0LW9mLWZpcnN0LXdlZWsgLSBzdGFydC1vZi15ZWFyXG4gICAgZnVuY3Rpb24gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciAvLyBmaXJzdC13ZWVrIGRheSAtLSB3aGljaCBqYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayAoNCBmb3IgaXNvLCAxIGZvciBvdGhlcilcbiAgICAgICAgICAgIGZ3ZCA9IDcgKyBkb3cgLSBkb3ksXG4gICAgICAgICAgICAvLyBmaXJzdC13ZWVrIGRheSBsb2NhbCB3ZWVrZGF5IC0tIHdoaWNoIGxvY2FsIHdlZWtkYXkgaXMgZndkXG4gICAgICAgICAgICBmd2RsdyA9ICg3ICsgY3JlYXRlVVRDRGF0ZSh5ZWFyLCAwLCBmd2QpLmdldFVUQ0RheSgpIC0gZG93KSAlIDc7XG5cbiAgICAgICAgcmV0dXJuIC1md2RsdyArIGZ3ZCAtIDE7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZSNDYWxjdWxhdGluZ19hX2RhdGVfZ2l2ZW5fdGhlX3llYXIuMkNfd2Vla19udW1iZXJfYW5kX3dlZWtkYXlcbiAgICBmdW5jdGlvbiBkYXlPZlllYXJGcm9tV2Vla3MoeWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGxvY2FsV2Vla2RheSA9ICg3ICsgd2Vla2RheSAtIGRvdykgJSA3LFxuICAgICAgICAgICAgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXlPZlllYXIgPSAxICsgNyAqICh3ZWVrIC0gMSkgKyBsb2NhbFdlZWtkYXkgKyB3ZWVrT2Zmc2V0LFxuICAgICAgICAgICAgcmVzWWVhcixcbiAgICAgICAgICAgIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrT2ZZZWFyKG1vbSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQobW9tLnllYXIoKSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2VlayA9IE1hdGguZmxvb3IoKG1vbS5kYXlPZlllYXIoKSAtIHdlZWtPZmZzZXQgLSAxKSAvIDcpICsgMSxcbiAgICAgICAgICAgIHJlc1dlZWssXG4gICAgICAgICAgICByZXNZZWFyO1xuXG4gICAgICAgIGlmICh3ZWVrIDwgMSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgLSAxO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgKyB3ZWVrc0luWWVhcihyZXNZZWFyLCBkb3csIGRveSk7XG4gICAgICAgIH0gZWxzZSBpZiAod2VlayA+IHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KSkge1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgLSB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSk7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdlZWs6IHJlc1dlZWssXG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigndycsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignd3cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignVycsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignV1cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihcbiAgICAgICAgWyd3JywgJ3d3JywgJ1cnLCAnV1cnXSxcbiAgICAgICAgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAxKV0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vlayhtb20pIHtcbiAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobW9tLCB0aGlzLl93ZWVrLmRvdywgdGhpcy5fd2Vlay5kb3kpLndlZWs7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrID0ge1xuICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZldlZWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG95O1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWsoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB0aGlzLmxvY2FsZURhdGEoKS53ZWVrKHRoaXMpO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2VlayhpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHdlZWtPZlllYXIodGhpcywgMSwgNCkud2VlaztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkJywgMCwgJ2RvJywgJ2RheScpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZScsIDAsIDAsICd3ZWVrZGF5Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ0UnLCAwLCAwLCAnaXNvV2Vla2RheScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignZCcsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZScsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignRScsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZGQnLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzTWluUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZCcsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNTaG9ydFJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdkZGRkJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZGQnLCAnZGRkJywgJ2RkZGQnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gY29uZmlnLl9sb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIHdlZWtkYXkgbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkXG4gICAgICAgIGlmICh3ZWVrZGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlZWsuZCA9IHdlZWtkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkV2Vla2RheSA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2QnLCAnZScsICdFJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpICUgNyB8fCA3O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc05hTihpbnB1dCkgPyBudWxsIDogaW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gTE9DQUxFU1xuICAgIGZ1bmN0aW9uIHNoaWZ0V2Vla2RheXMod3MsIG4pIHtcbiAgICAgICAgcmV0dXJuIHdzLnNsaWNlKG4sIDcpLmNvbmNhdCh3cy5zbGljZSgwLCBuKSk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5cyA9XG4gICAgICAgICAgICAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyksXG4gICAgICAgIGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0ID0gJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluID0gJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBkZWZhdWx0V2Vla2RheXNSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzTWluUmVnZXggPSBtYXRjaFdvcmQ7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5cyhtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIHdlZWtkYXlzID0gaXNBcnJheSh0aGlzLl93ZWVrZGF5cylcbiAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNcbiAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNbXG4gICAgICAgICAgICAgICAgICBtICYmIG0gIT09IHRydWUgJiYgdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChmb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgICAgPyAnZm9ybWF0J1xuICAgICAgICAgICAgICAgICAgICAgIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF07XG4gICAgICAgIHJldHVybiBtID09PSB0cnVlXG4gICAgICAgICAgICA/IHNoaWZ0V2Vla2RheXMod2Vla2RheXMsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICAgID8gd2Vla2RheXNbbS5kYXkoKV1cbiAgICAgICAgICAgICAgOiB3ZWVrZGF5cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1Nob3J0KG0pIHtcbiAgICAgICAgcmV0dXJuIG0gPT09IHRydWVcbiAgICAgICAgICAgID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c1Nob3J0LCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogbVxuICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV1cbiAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1Nob3J0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzTWluKG0pIHtcbiAgICAgICAgcmV0dXJuIG0gPT09IHRydWVcbiAgICAgICAgICAgID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c01pbiwgdGhpcy5fd2Vlay5kb3cpXG4gICAgICAgICAgICA6IG1cbiAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c01pblttLmRheSgpXVxuICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzTWluO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVN0cmljdFBhcnNlJDEod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgaWksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBsbGMgPSB3ZWVrZGF5TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzTWluKFxuICAgICAgICAgICAgICAgICAgICBtb20sXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNTaG9ydChcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlJDEuY2FsbCh0aGlzLCB3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcblxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAnXicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzKG1vbSwgJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ3xeJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSArXG4gICAgICAgICAgICAgICAgICAgICd8XicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ2RkZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdkZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXkgPSBnZXQodGhpcywgJ0RheScpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChpbnB1dCAtIGRheSwgJ2QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRMb2NhbGVEYXlPZldlZWsoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gKHRoaXMuZGF5KCkgKyA3IC0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93KSAlIDc7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2Vla2RheSA6IHRoaXMuYWRkKGlucHV0IC0gd2Vla2RheSwgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09EYXlPZldlZWsoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYmVoYXZlcyB0aGUgc2FtZSBhcyBtb21lbnQjZGF5IGV4Y2VwdFxuICAgICAgICAvLyBhcyBhIGdldHRlciwgcmV0dXJucyA3IGluc3RlYWQgb2YgMCAoMS03IHJhbmdlIGluc3RlYWQgb2YgMC02KVxuICAgICAgICAvLyBhcyBhIHNldHRlciwgc3VuZGF5IHNob3VsZCBiZWxvbmcgdG8gdGhlIHByZXZpb3VzIHdlZWsuXG5cbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciB3ZWVrZGF5ID0gcGFyc2VJc29XZWVrZGF5KGlucHV0LCB0aGlzLmxvY2FsZURhdGEoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkodGhpcy5kYXkoKSAlIDcgPyB3ZWVrZGF5IDogd2Vla2RheSAtIDcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgfHwgNztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUmVnZXggPSBkZWZhdWx0V2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla2RheXNTaG9ydFJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c01pblJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c01pblJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVXZWVrZGF5c1BhcnNlKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWluUGllY2VzID0gW10sXG4gICAgICAgICAgICBzaG9ydFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbG9uZ1BpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBtaW5wLFxuICAgICAgICAgICAgc2hvcnRwLFxuICAgICAgICAgICAgbG9uZ3A7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgbWlucCA9IHJlZ2V4RXNjYXBlKHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykpO1xuICAgICAgICAgICAgc2hvcnRwID0gcmVnZXhFc2NhcGUodGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgICAgIGxvbmdwID0gcmVnZXhFc2NhcGUodGhpcy53ZWVrZGF5cyhtb20sICcnKSk7XG4gICAgICAgICAgICBtaW5QaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSB3ZWVrZGF5IChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgbWluUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuXG4gICAgICAgIHRoaXMuX3dlZWtkYXlzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluUmVnZXggPSB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuXG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIG1pblBpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBoRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpICUgMTIgfHwgMTI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga0Zvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cnMoKSB8fCAyNDtcbiAgICB9XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSCcsIFsnSEgnLCAyXSwgMCwgJ2hvdXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignaCcsIFsnaGgnLCAyXSwgMCwgaEZvcm1hdCk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ2snLCBbJ2trJywgMl0sIDAsIGtGb3JtYXQpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgaEZvcm1hdC5hcHBseSh0aGlzKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdobW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICcnICtcbiAgICAgICAgICAgIGhGb3JtYXQuYXBwbHkodGhpcykgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0htbScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgJycgK1xuICAgICAgICAgICAgdGhpcy5ob3VycygpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLnNlY29uZHMoKSwgMilcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtKHRva2VuLCBsb3dlcmNhc2UpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tZXJpZGllbShcbiAgICAgICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICAgICAgbG93ZXJjYXNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBtZXJpZGllbSgnYScsIHRydWUpO1xuICAgIG1lcmlkaWVtKCdBJywgZmFsc2UpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgZnVuY3Rpb24gbWF0Y2hNZXJpZGllbShpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuX21lcmlkaWVtUGFyc2U7XG4gICAgfVxuXG4gICAgYWRkUmVnZXhUb2tlbignYScsIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0EnLCBtYXRjaE1lcmlkaWVtKTtcbiAgICBhZGRSZWdleFRva2VuKCdIJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJIYXNaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdoJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdrJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdISCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdoaCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdraycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbScsIG1hdGNoM3RvNCk7XG4gICAgYWRkUmVnZXhUb2tlbignaG1tc3MnLCBtYXRjaDV0bzYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbScsIG1hdGNoM3RvNCk7XG4gICAgYWRkUmVnZXhUb2tlbignSG1tc3MnLCBtYXRjaDV0bzYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0gnLCAnSEgnXSwgSE9VUik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2snLCAna2snXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBrSW5wdXQgPSB0b0ludChpbnB1dCk7XG4gICAgICAgIGFycmF5W0hPVVJdID0ga0lucHV0ID09PSAyNCA/IDAgOiBrSW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2EnLCAnQSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9pc1BtID0gY29uZmlnLl9sb2NhbGUuaXNQTShpbnB1dCk7XG4gICAgICAgIGNvbmZpZy5fbWVyaWRpZW0gPSBpbnB1dDtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnaCcsICdoaCddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ2htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ2htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MxID0gaW5wdXQubGVuZ3RoIC0gNCxcbiAgICAgICAgICAgIHBvczIgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMSwgMikpO1xuICAgICAgICBhcnJheVtTRUNPTkRdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczIpKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MpKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdIbW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQsXG4gICAgICAgICAgICBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgfSk7XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICBmdW5jdGlvbiBsb2NhbGVJc1BNKGlucHV0KSB7XG4gICAgICAgIC8vIElFOCBRdWlya3MgTW9kZSAmIElFNyBTdGFuZGFyZHMgTW9kZSBkbyBub3QgYWxsb3cgYWNjZXNzaW5nIHN0cmluZ3MgbGlrZSBhcnJheXNcbiAgICAgICAgLy8gVXNpbmcgY2hhckF0IHNob3VsZCBiZSBtb3JlIGNvbXBhdGlibGUuXG4gICAgICAgIHJldHVybiAoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICdwJztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1lcmlkaWVtUGFyc2UgPSAvW2FwXVxcLj9tP1xcLj8vaSxcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4gICAgICAgIC8vIHNwZWNpZmllZCB3aGljaCBob3VyIHRoZXkgd2FudC4gU28gdHJ5aW5nIHRvIG1haW50YWluIHRoZSBzYW1lIGhvdXIgKGluXG4gICAgICAgIC8vIGEgbmV3IHRpbWV6b25lKSBtYWtlcyBzZW5zZS4gQWRkaW5nL3N1YnRyYWN0aW5nIGhvdXJzIGRvZXMgbm90IGZvbGxvd1xuICAgICAgICAvLyB0aGlzIHJ1bGUuXG4gICAgICAgIGdldFNldEhvdXIgPSBtYWtlR2V0U2V0KCdIb3VycycsIHRydWUpO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlTWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3BtJyA6ICdQTSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdhbScgOiAnQU0nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJhc2VDb25maWcgPSB7XG4gICAgICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQsXG4gICAgICAgIGludmFsaWREYXRlOiBkZWZhdWx0SW52YWxpZERhdGUsXG4gICAgICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiBkZWZhdWx0UmVsYXRpdmVUaW1lLFxuXG4gICAgICAgIG1vbnRoczogZGVmYXVsdExvY2FsZU1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCxcblxuICAgICAgICB3ZWVrOiBkZWZhdWx0TG9jYWxlV2VlayxcblxuICAgICAgICB3ZWVrZGF5czogZGVmYXVsdExvY2FsZVdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZSxcbiAgICB9O1xuXG4gICAgLy8gaW50ZXJuYWwgc3RvcmFnZSBmb3IgbG9jYWxlIGNvbmZpZyBmaWxlc1xuICAgIHZhciBsb2NhbGVzID0ge30sXG4gICAgICAgIGxvY2FsZUZhbWlsaWVzID0ge30sXG4gICAgICAgIGdsb2JhbExvY2FsZTtcblxuICAgIGZ1bmN0aW9uIGNvbW1vblByZWZpeChhcnIxLCBhcnIyKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbWlubCA9IE1hdGgubWluKGFycjEubGVuZ3RoLCBhcnIyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtaW5sOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChhcnIxW2ldICE9PSBhcnIyW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbmw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICAgIGosXG4gICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgc3BsaXQ7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNwbGl0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2ldKS5zcGxpdCgnLScpO1xuICAgICAgICAgICAgaiA9IHNwbGl0Lmxlbmd0aDtcbiAgICAgICAgICAgIG5leHQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaSArIDFdKTtcbiAgICAgICAgICAgIG5leHQgPSBuZXh0ID8gbmV4dC5zcGxpdCgnLScpIDogbnVsbDtcbiAgICAgICAgICAgIHdoaWxlIChqID4gMCkge1xuICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoc3BsaXQuc2xpY2UoMCwgaikuam9pbignLScpKTtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbmV4dCAmJlxuICAgICAgICAgICAgICAgICAgICBuZXh0Lmxlbmd0aCA+PSBqICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vblByZWZpeChzcGxpdCwgbmV4dCkgPj0gaiAtIDFcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy90aGUgbmV4dCBhcnJheSBpdGVtIGlzIGJldHRlciB0aGFuIGEgc2hhbGxvd2VyIHN1YnN0cmluZyBvZiB0aGlzIG9uZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMb2NhbGVOYW1lU2FuZShuYW1lKSB7XG4gICAgICAgIC8vIFByZXZlbnQgbmFtZXMgdGhhdCBsb29rIGxpa2UgZmlsZXN5c3RlbSBwYXRocywgaS5lIGNvbnRhaW4gJy8nIG9yICdcXCdcbiAgICAgICAgLy8gRW5zdXJlIG5hbWUgaXMgYXZhaWxhYmxlIGFuZCBmdW5jdGlvbiByZXR1cm5zIGJvb2xlYW5cbiAgICAgICAgcmV0dXJuICEhKG5hbWUgJiYgbmFtZS5tYXRjaCgnXlteL1xcXFxcXFxcXSokJykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvYWRMb2NhbGUobmFtZSkge1xuICAgICAgICB2YXIgb2xkTG9jYWxlID0gbnVsbCxcbiAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlO1xuICAgICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byByZWdpc3RlciBhbmQgbG9hZCBhbGwgdGhlIGxvY2FsZXMgaW4gTm9kZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBtb2R1bGUgJiZcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzICYmXG4gICAgICAgICAgICBpc0xvY2FsZU5hbWVTYW5lKG5hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvbGRMb2NhbGUgPSBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyBub3QgZm91bmQgdG8gYXZvaWQgcmVwZWF0aW5nIGV4cGVuc2l2ZSBmaWxlIHJlcXVpcmUgY2FsbCBjYXVzaW5nIGhpZ2ggQ1BVXG4gICAgICAgICAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gZmluZCBlbi1VUywgZW5fVVMsIGVuLXVzIGZvciBldmVyeSBmb3JtYXQgY2FsbFxuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBudWxsOyAvLyBudWxsIG1lYW5zIG5vdCBmb3VuZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUoa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGdldExvY2FsZShrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGVmaW5lTG9jYWxlKGtleSwgdmFsdWVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBtb21lbnQuZHVyYXRpb24uX2xvY2FsZSA9IG1vbWVudC5fbG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgICAgICBnbG9iYWxMb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICdMb2NhbGUgJyArIGtleSArICcgbm90IGZvdW5kLiBEaWQgeW91IGZvcmdldCB0byBsb2FkIGl0PydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmluZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSxcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZShcbiAgICAgICAgICAgICAgICAgICAgJ2RlZmluZUxvY2FsZU92ZXJyaWRlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbmV3IExvY2FsZShtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpKTtcblxuICAgICAgICAgICAgaWYgKGxvY2FsZUZhbWlsaWVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVMb2NhbGUoeC5uYW1lLCB4LmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHNldCB0aGUgbG9jYWxlIEFGVEVSIGFsbCBjaGlsZCBsb2NhbGVzIGhhdmUgYmVlblxuICAgICAgICAgICAgLy8gY3JlYXRlZCwgc28gd2Ugd29uJ3QgZW5kIHVwIHdpdGggdGhlIGNoaWxkIGxvY2FsZSBzZXQuXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nXG4gICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlTG9jYWxlKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsXG4gICAgICAgICAgICAgICAgdG1wTG9jYWxlLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG5cbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwgJiYgbG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjaGlsZCBsb2NhbGUgaW4tcGxhY2UgdG8gYXZvaWQgbWVtb3J5LWxlYWtzXG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXS5zZXQobWVyZ2VDb25maWdzKGxvY2FsZXNbbmFtZV0uX2NvbmZpZywgY29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1FUkdFXG4gICAgICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gdG1wTG9jYWxlLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKHRtcExvY2FsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZUxvY2FsZSBpcyBjYWxsZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZVxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYWJiciBzbyBpdCB3aWxsIGhhdmUgYSBuYW1lIChnZXR0ZXJzIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQgb3RoZXJ3aXNlKS5cbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgbG9jYWxlLnBhcmVudExvY2FsZSA9IGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGdldFNldEdsb2JhbExvY2FsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZShrZXkpIHtcbiAgICAgICAgdmFyIGxvY2FsZTtcblxuICAgICAgICBpZiAoa2V5ICYmIGtleS5fbG9jYWxlICYmIGtleS5fbG9jYWxlLl9hYmJyKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgIC8vc2hvcnQtY2lyY3VpdCBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5ID0gW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hvb3NlTG9jYWxlKGtleSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdExvY2FsZXMoKSB7XG4gICAgICAgIHJldHVybiBrZXlzKGxvY2FsZXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3cobSkge1xuICAgICAgICB2YXIgb3ZlcmZsb3csXG4gICAgICAgICAgICBhID0gbS5fYTtcblxuICAgICAgICBpZiAoYSAmJiBnZXRQYXJzaW5nRmxhZ3MobSkub3ZlcmZsb3cgPT09IC0yKSB7XG4gICAgICAgICAgICBvdmVyZmxvdyA9XG4gICAgICAgICAgICAgICAgYVtNT05USF0gPCAwIHx8IGFbTU9OVEhdID4gMTFcbiAgICAgICAgICAgICAgICAgICAgPyBNT05USFxuICAgICAgICAgICAgICAgICAgICA6IGFbREFURV0gPCAxIHx8IGFbREFURV0gPiBkYXlzSW5Nb250aChhW1lFQVJdLCBhW01PTlRIXSlcbiAgICAgICAgICAgICAgICAgICAgICA/IERBVEVcbiAgICAgICAgICAgICAgICAgICAgICA6IGFbSE9VUl0gPCAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFbSE9VUl0gPiAyNCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoYVtIT1VSXSA9PT0gMjQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhW01JTlVURV0gIT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW1NFQ09ORF0gIT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW01JTExJU0VDT05EXSAhPT0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IEhPVVJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYVtNSU5VVEVdIDwgMCB8fCBhW01JTlVURV0gPiA1OVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1JTlVURVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFbU0VDT05EXSA8IDAgfHwgYVtTRUNPTkRdID4gNTlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ09ORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1JTExJU0VDT05EXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC0xO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd0RheU9mWWVhciAmJlxuICAgICAgICAgICAgICAgIChvdmVyZmxvdyA8IFlFQVIgfHwgb3ZlcmZsb3cgPiBEQVRFKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBEQVRFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrcyAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtkYXkgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLREFZO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkub3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIC8vIGlzbyA4NjAxIHJlZ2V4XG4gICAgLy8gMDAwMC0wMC0wMCAwMDAwLVcwMCBvciAwMDAwLVcwMC0wICsgVCArIDAwIG9yIDAwOjAwIG9yIDAwOjAwOjAwIG9yIDAwOjAwOjAwLjAwMCArICswMDowMCBvciArMDAwMCBvciArMDApXG4gICAgdmFyIGV4dGVuZGVkSXNvUmVnZXggPVxuICAgICAgICAgICAgL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoWystXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sXG4gICAgICAgIGJhc2ljSXNvUmVnZXggPVxuICAgICAgICAgICAgL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KSg/OlxcZFxcZFxcZFxcZHxXXFxkXFxkXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZHwpKSg/OihUfCApKFxcZFxcZCg/OlxcZFxcZCg/OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbKy1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLyxcbiAgICAgICAgdHpSZWdleCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/LyxcbiAgICAgICAgaXNvRGF0ZXMgPSBbXG4gICAgICAgICAgICBbJ1lZWVlZWS1NTS1ERCcsIC9bKy1dXFxkezZ9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgICAgIFsnWVlZWS1NTS1ERCcsIC9cXGR7NH0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICAgICAgWydHR0dHLVtXXVdXLUUnLCAvXFxkezR9LVdcXGRcXGQtXFxkL10sXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1cnLCAvXFxkezR9LVdcXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVktREREJywgL1xcZHs0fS1cXGR7M30vXSxcbiAgICAgICAgICAgIFsnWVlZWS1NTScsIC9cXGR7NH0tXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICAgICAgWydZWVlZWVlNTUREJywgL1srLV1cXGR7MTB9L10sXG4gICAgICAgICAgICBbJ1lZWVlNTUREJywgL1xcZHs4fS9dLFxuICAgICAgICAgICAgWydHR0dHW1ddV1dFJywgL1xcZHs0fVdcXGR7M30vXSxcbiAgICAgICAgICAgIFsnR0dHR1tXXVdXJywgL1xcZHs0fVdcXGR7Mn0vLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVlEREQnLCAvXFxkezd9L10sXG4gICAgICAgICAgICBbJ1lZWVlNTScsIC9cXGR7Nn0vLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVknLCAvXFxkezR9LywgZmFsc2VdLFxuICAgICAgICBdLFxuICAgICAgICAvLyBpc28gdGltZSBmb3JtYXRzIGFuZCByZWdleGVzXG4gICAgICAgIGlzb1RpbWVzID0gW1xuICAgICAgICAgICAgWydISDptbTpzcy5TU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICAgICAgWydISDptbTpzcyxTU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkLFxcZCsvXSxcbiAgICAgICAgICAgIFsnSEg6bW06c3MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEg6bW0nLCAvXFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICAgICAgWydISG1tc3MuU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgICAgICBbJ0hIbW1zcyxTU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZCxcXGQrL10sXG4gICAgICAgICAgICBbJ0hIbW1zcycsIC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEhtbScsIC9cXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEgnLCAvXFxkXFxkL10sXG4gICAgICAgIF0sXG4gICAgICAgIGFzcE5ldEpzb25SZWdleCA9IC9eXFwvP0RhdGVcXCgoLT9cXGQrKS9pLFxuICAgICAgICAvLyBSRkMgMjgyMiByZWdleDogRm9yIGRldGFpbHMgc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyI3NlY3Rpb24tMy4zXG4gICAgICAgIHJmYzI4MjIgPVxuICAgICAgICAgICAgL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSw/XFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfChbKy1dXFxkezR9KSkkLyxcbiAgICAgICAgb2JzT2Zmc2V0cyA9IHtcbiAgICAgICAgICAgIFVUOiAwLFxuICAgICAgICAgICAgR01UOiAwLFxuICAgICAgICAgICAgRURUOiAtNCAqIDYwLFxuICAgICAgICAgICAgRVNUOiAtNSAqIDYwLFxuICAgICAgICAgICAgQ0RUOiAtNSAqIDYwLFxuICAgICAgICAgICAgQ1NUOiAtNiAqIDYwLFxuICAgICAgICAgICAgTURUOiAtNiAqIDYwLFxuICAgICAgICAgICAgTVNUOiAtNyAqIDYwLFxuICAgICAgICAgICAgUERUOiAtNyAqIDYwLFxuICAgICAgICAgICAgUFNUOiAtOCAqIDYwLFxuICAgICAgICB9O1xuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSVNPKGNvbmZpZykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBzdHJpbmcgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBtYXRjaCA9IGV4dGVuZGVkSXNvUmVnZXguZXhlYyhzdHJpbmcpIHx8IGJhc2ljSXNvUmVnZXguZXhlYyhzdHJpbmcpLFxuICAgICAgICAgICAgYWxsb3dUaW1lLFxuICAgICAgICAgICAgZGF0ZUZvcm1hdCxcbiAgICAgICAgICAgIHRpbWVGb3JtYXQsXG4gICAgICAgICAgICB0ekZvcm1hdCxcbiAgICAgICAgICAgIGlzb0RhdGVzTGVuID0gaXNvRGF0ZXMubGVuZ3RoLFxuICAgICAgICAgICAgaXNvVGltZXNMZW4gPSBpc29UaW1lcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pc28gPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzTGVuOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzb0RhdGVzW2ldWzFdLmV4ZWMobWF0Y2hbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSBpc29EYXRlc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dUaW1lID0gaXNvRGF0ZXNbaV1bMl0gIT09IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb1RpbWVzTGVuOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc29UaW1lc1tpXVsxXS5leGVjKG1hdGNoWzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hbMl0gc2hvdWxkIGJlICdUJyBvciBzcGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZUZvcm1hdCA9IChtYXRjaFsyXSB8fCAnICcpICsgaXNvVGltZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGltZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhbGxvd1RpbWUgJiYgdGltZUZvcm1hdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR6UmVnZXguZXhlYyhtYXRjaFs0XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHpGb3JtYXQgPSAnWic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maWcuX2YgPSBkYXRlRm9ybWF0ICsgKHRpbWVGb3JtYXQgfHwgJycpICsgKHR6Rm9ybWF0IHx8ICcnKTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyhcbiAgICAgICAgeWVhclN0cixcbiAgICAgICAgbW9udGhTdHIsXG4gICAgICAgIGRheVN0cixcbiAgICAgICAgaG91clN0cixcbiAgICAgICAgbWludXRlU3RyLFxuICAgICAgICBzZWNvbmRTdHJcbiAgICApIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgICAgIHVudHJ1bmNhdGVZZWFyKHllYXJTdHIpLFxuICAgICAgICAgICAgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LmluZGV4T2YobW9udGhTdHIpLFxuICAgICAgICAgICAgcGFyc2VJbnQoZGF5U3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChob3VyU3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChtaW51dGVTdHIsIDEwKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoc2Vjb25kU3RyKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChwYXJzZUludChzZWNvbmRTdHIsIDEwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVudHJ1bmNhdGVZZWFyKHllYXJTdHIpIHtcbiAgICAgICAgdmFyIHllYXIgPSBwYXJzZUludCh5ZWFyU3RyLCAxMCk7XG4gICAgICAgIGlmICh5ZWFyIDw9IDQ5KSB7XG4gICAgICAgICAgICByZXR1cm4gMjAwMCArIHllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoeWVhciA8PSA5OTkpIHtcbiAgICAgICAgICAgIHJldHVybiAxOTAwICsgeWVhcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWVhcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVwcm9jZXNzUkZDMjgyMihzKSB7XG4gICAgICAgIC8vIFJlbW92ZSBjb21tZW50cyBhbmQgZm9sZGluZyB3aGl0ZXNwYWNlIGFuZCByZXBsYWNlIG11bHRpcGxlLXNwYWNlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG4gICAgICAgIHJldHVybiBzXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwoW14oKV0qXFwpfFtcXG5cXHRdL2csICcgJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15cXHNcXHMqLywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzXFxzKiQvLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tXZWVrZGF5KHdlZWtkYXlTdHIsIHBhcnNlZElucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlcGxhY2UgdGhlIHZhbmlsbGEgSlMgRGF0ZSBvYmplY3Qgd2l0aCBhbiBpbmRlcGVuZGVudCBkYXktb2Ytd2VlayBjaGVjay5cbiAgICAgICAgICAgIHZhciB3ZWVrZGF5UHJvdmlkZWQgPSBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpLFxuICAgICAgICAgICAgICAgIHdlZWtkYXlBY3R1YWwgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSW5wdXRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZElucHV0WzFdLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRJbnB1dFsyXVxuICAgICAgICAgICAgICAgICkuZ2V0RGF5KCk7XG4gICAgICAgICAgICBpZiAod2Vla2RheVByb3ZpZGVkICE9PSB3ZWVrZGF5QWN0dWFsKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlT2Zmc2V0KG9ic09mZnNldCwgbWlsaXRhcnlPZmZzZXQsIG51bU9mZnNldCkge1xuICAgICAgICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbGl0YXJ5T2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyB0aGUgb25seSBhbGxvd2VkIG1pbGl0YXJ5IHR6IGlzIFpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGhtID0gcGFyc2VJbnQobnVtT2Zmc2V0LCAxMCksXG4gICAgICAgICAgICAgICAgbSA9IGhtICUgMTAwLFxuICAgICAgICAgICAgICAgIGggPSAoaG0gLSBtKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBoICogNjAgKyBtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBhbmQgdGltZSBmcm9tIHJlZiAyODIyIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2ggPSByZmMyODIyLmV4ZWMocHJlcHJvY2Vzc1JGQzI4MjIoY29uZmlnLl9pKSksXG4gICAgICAgICAgICBwYXJzZWRBcnJheTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBwYXJzZWRBcnJheSA9IGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoXG4gICAgICAgICAgICAgICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbN11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWNoZWNrV2Vla2RheShtYXRjaFsxXSwgcGFyc2VkQXJyYXksIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IHBhcnNlZEFycmF5O1xuICAgICAgICAgICAgY29uZmlnLl90em0gPSBjYWxjdWxhdGVPZmZzZXQobWF0Y2hbOF0sIG1hdGNoWzldLCBtYXRjaFsxMF0pO1xuXG4gICAgICAgICAgICBjb25maWcuX2QgPSBjcmVhdGVVVENEYXRlLmFwcGx5KG51bGwsIGNvbmZpZy5fYSk7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5yZmMyODIyID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIDEpIEFTUC5ORVQsIDIpIElTTywgMykgUkZDIDI4MjIgZm9ybWF0cywgb3IgNCkgb3B0aW9uYWwgZmFsbGJhY2sgaWYgcGFyc2luZyBpc24ndCBzdHJpY3RcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2hlZCA9IGFzcE5ldEpzb25SZWdleC5leGVjKGNvbmZpZy5faSk7XG4gICAgICAgIGlmIChtYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9zdHJpY3QpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmluYWwgYXR0ZW1wdCwgdXNlIElucHV0IEZhbGxiYWNrXG4gICAgICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sgPSBkZXByZWNhdGUoXG4gICAgICAgICd2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIFJGQzI4MjIgb3IgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgJyArXG4gICAgICAgICAgICAnd2hpY2ggaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIHZlcnNpb25zLiBOb24gUkZDMjgyMi9JU08gZGF0ZSBmb3JtYXRzIGFyZSAnICtcbiAgICAgICAgICAgICdkaXNjb3VyYWdlZC4gUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvanMtZGF0ZS8gZm9yIG1vcmUgaW5mby4nLFxuICAgICAgICBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShjb25maWcuX2kgKyAoY29uZmlnLl91c2VVVEMgPyAnIFVUQycgOiAnJykpO1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIFBpY2sgdGhlIGZpcnN0IGRlZmluZWQgb2YgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5cbiAgICBmdW5jdGlvbiBkZWZhdWx0cyhhLCBiLCBjKSB7XG4gICAgICAgIGlmIChhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIC8vIGhvb2tzIGlzIGFjdHVhbGx5IHRoZSBleHBvcnRlZCBtb21lbnQgb2JqZWN0XG4gICAgICAgIHZhciBub3dWYWx1ZSA9IG5ldyBEYXRlKGhvb2tzLm5vdygpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIG5vd1ZhbHVlLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgICAgICAgICBub3dWYWx1ZS5nZXRVVENEYXRlKCksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0RnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0TW9udGgoKSwgbm93VmFsdWUuZ2V0RGF0ZSgpXTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFuIGFycmF5IHRvIGEgZGF0ZS5cbiAgICAvLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xuICAgIC8vIG5vdGU6IGFsbCB2YWx1ZXMgcGFzdCB0aGUgeWVhciBhcmUgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxuICAgIC8vIFt5ZWFyLCBtb250aCwgZGF5ICwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXVxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21BcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgaW5wdXQgPSBbXSxcbiAgICAgICAgICAgIGN1cnJlbnREYXRlLFxuICAgICAgICAgICAgZXhwZWN0ZWRXZWVrZGF5LFxuICAgICAgICAgICAgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpIHx8XG4gICAgICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd0RheU9mWWVhciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKHllYXJUb1VzZSwgMCwgY29uZmlnLl9kYXlPZlllYXIpO1xuICAgICAgICAgICAgY29uZmlnLl9hW01PTlRIXSA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtEQVRFXSA9IGRhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IGRhdGUuXG4gICAgICAgIC8vICogaWYgbm8geWVhciwgbW9udGgsIGRheSBvZiBtb250aCBhcmUgZ2l2ZW4sIGRlZmF1bHQgdG8gdG9kYXlcbiAgICAgICAgLy8gKiBpZiBkYXkgb2YgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgbW9udGggYW5kIHllYXJcbiAgICAgICAgLy8gKiBpZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBvbmx5IHllYXJcbiAgICAgICAgLy8gKiBpZiB5ZWFyIGlzIGdpdmVuLCBkb24ndCBkZWZhdWx0IGFueXRoaW5nXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzICYmIGNvbmZpZy5fYVtpXSA9PSBudWxsOyArK2kpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gY3VycmVudERhdGVbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBaZXJvIG91dCB3aGF0ZXZlciB3YXMgbm90IGRlZmF1bHRlZCwgaW5jbHVkaW5nIHRpbWVcbiAgICAgICAgZm9yICg7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID1cbiAgICAgICAgICAgICAgICBjb25maWcuX2FbaV0gPT0gbnVsbCA/IChpID09PSAyID8gMSA6IDApIDogY29uZmlnLl9hW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIDI0OjAwOjAwLjAwMFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICBjb25maWcuX2FbTUlOVVRFXSA9PT0gMCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW1NFQ09ORF0gPT09IDAgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25maWcuX25leHREYXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZy5fZCA9IChjb25maWcuX3VzZVVUQyA/IGNyZWF0ZVVUQ0RhdGUgOiBjcmVhdGVEYXRlKS5hcHBseShcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICApO1xuICAgICAgICBleHBlY3RlZFdlZWtkYXkgPSBjb25maWcuX3VzZVVUQ1xuICAgICAgICAgICAgPyBjb25maWcuX2QuZ2V0VVRDRGF5KClcbiAgICAgICAgICAgIDogY29uZmlnLl9kLmdldERheSgpO1xuXG4gICAgICAgIC8vIEFwcGx5IHRpbWV6b25lIG9mZnNldCBmcm9tIGlucHV0LiBUaGUgYWN0dWFsIHV0Y09mZnNldCBjYW4gYmUgY2hhbmdlZFxuICAgICAgICAvLyB3aXRoIHBhcnNlWm9uZS5cbiAgICAgICAgaWYgKGNvbmZpZy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGZvciBtaXNtYXRjaGluZyBkYXkgb2Ygd2Vla1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX3cgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25maWcuX3cuZCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fdy5kICE9PSBleHBlY3RlZFdlZWtkYXlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZykge1xuICAgICAgICB2YXIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3csIGN1cldlZWs7XG5cbiAgICAgICAgdyA9IGNvbmZpZy5fdztcbiAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZG93ID0gMTtcbiAgICAgICAgICAgIGRveSA9IDQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gdGFrZSB0aGUgY3VycmVudCBpc29XZWVrWWVhciwgYnV0IHRoYXQgZGVwZW5kcyBvblxuICAgICAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYSBub3cgdmVyc2lvbiBvZiBjdXJyZW50IGNvbmZpZyAodGFrZSBsb2NhbC91dGMvb2Zmc2V0IGZsYWdzLCBhbmRcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBub3cpLlxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyhcbiAgICAgICAgICAgICAgICB3LkdHLFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSxcbiAgICAgICAgICAgICAgICB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIDEsIDQpLnllYXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody5XLCAxKTtcbiAgICAgICAgICAgIHdlZWtkYXkgPSBkZWZhdWx0cyh3LkUsIDEpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvdyA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRvdztcbiAgICAgICAgICAgIGRveSA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRveTtcblxuICAgICAgICAgICAgY3VyV2VlayA9IHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgZG93LCBkb3kpO1xuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuZ2csIGNvbmZpZy5fYVtZRUFSXSwgY3VyV2Vlay55ZWFyKTtcblxuICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IHdlZWsuXG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody53LCBjdXJXZWVrLndlZWspO1xuXG4gICAgICAgICAgICBpZiAody5kICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZWVrZGF5IC0tIGxvdyBkYXkgbnVtYmVycyBhcmUgY29uc2lkZXJlZCBuZXh0IHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5kO1xuICAgICAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMCB8fCB3ZWVrZGF5ID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAody5lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2NhbCB3ZWVrZGF5IC0tIGNvdW50aW5nIHN0YXJ0cyBmcm9tIGJlZ2lubmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZSArIGRvdztcbiAgICAgICAgICAgICAgICBpZiAody5lIDwgMCB8fCB3LmUgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGJlZ2lubmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IGRvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2VlayA8IDEgfHwgd2VlayA+IHdlZWtzSW5ZZWFyKHdlZWtZZWFyLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrZGF5T3ZlcmZsb3cgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla2RheSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZW1wID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgICAgICBjb25maWcuX2FbWUVBUl0gPSB0ZW1wLnllYXI7XG4gICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRlbXAuZGF5T2ZZZWFyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIElTTyBzdGFuZGFyZFxuICAgIGhvb2tzLklTT184NjAxID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgUkZDIDI4MjIgZm9ybVxuICAgIGhvb2tzLlJGQ18yODIyID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgY3JlYXRpb24gZmxvdyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcHNcbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuSVNPXzg2MDEpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5SRkNfMjgyMikge1xuICAgICAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25maWcuX2EgPSBbXTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgYXJyYXkgaXMgdXNlZCB0byBtYWtlIGEgRGF0ZSwgZWl0aGVyIHdpdGggYG5ldyBEYXRlYCBvciBgRGF0ZS5VVENgXG4gICAgICAgIHZhciBzdHJpbmcgPSAnJyArIGNvbmZpZy5faSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwYXJzZWRJbnB1dCxcbiAgICAgICAgICAgIHRva2VucyxcbiAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgc2tpcHBlZCxcbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoID0gMCxcbiAgICAgICAgICAgIGVyYSxcbiAgICAgICAgICAgIHRva2VuTGVuO1xuXG4gICAgICAgIHRva2VucyA9XG4gICAgICAgICAgICBleHBhbmRGb3JtYXQoY29uZmlnLl9mLCBjb25maWcuX2xvY2FsZSkubWF0Y2goZm9ybWF0dGluZ1Rva2VucykgfHwgW107XG4gICAgICAgIHRva2VuTGVuID0gdG9rZW5zLmxlbmd0aDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2VuTGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICAgICAgcGFyc2VkSW5wdXQgPSAoc3RyaW5nLm1hdGNoKGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSkgfHxcbiAgICAgICAgICAgICAgICBbXSlbMF07XG4gICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xuICAgICAgICAgICAgICAgIGlmIChza2lwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChza2lwcGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkgKyBwYXJzZWRJbnB1dC5sZW5ndGhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggKz0gcGFyc2VkSW5wdXQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZG9uJ3QgcGFyc2UgaWYgaXQncyBub3QgYSBrbm93biB0b2tlblxuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIHBhcnNlZElucHV0LCBjb25maWcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuX3N0cmljdCAmJiAhcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgcmVtYWluaW5nIHVucGFyc2VkIGlucHV0IGxlbmd0aCB0byB0aGUgc3RyaW5nXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmNoYXJzTGVmdE92ZXIgPVxuICAgICAgICAgICAgc3RyaW5nTGVuZ3RoIC0gdG90YWxQYXJzZWRJbnB1dExlbmd0aDtcbiAgICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciBfMTJoIGZsYWcgaWYgaG91ciBpcyA8PSAxMlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPD0gMTIgJiZcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPT09IHRydWUgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucGFyc2VkRGF0ZVBhcnRzID0gY29uZmlnLl9hLnNsaWNlKDApO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5tZXJpZGllbSA9IGNvbmZpZy5fbWVyaWRpZW07XG4gICAgICAgIC8vIGhhbmRsZSBtZXJpZGllbVxuICAgICAgICBjb25maWcuX2FbSE9VUl0gPSBtZXJpZGllbUZpeFdyYXAoXG4gICAgICAgICAgICBjb25maWcuX2xvY2FsZSxcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSxcbiAgICAgICAgICAgIGNvbmZpZy5fbWVyaWRpZW1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBoYW5kbGUgZXJhXG4gICAgICAgIGVyYSA9IGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVyYTtcbiAgICAgICAgaWYgKGVyYSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gY29uZmlnLl9sb2NhbGUuZXJhc0NvbnZlcnRZZWFyKGVyYSwgY29uZmlnLl9hW1lFQVJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW1GaXhXcmFwKGxvY2FsZSwgaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgdmFyIGlzUG07XG5cbiAgICAgICAgaWYgKG1lcmlkaWVtID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUubWVyaWRpZW1Ib3VyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubWVyaWRpZW1Ib3VyKGhvdXIsIG1lcmlkaWVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbGUuaXNQTSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFja1xuICAgICAgICAgICAgaXNQbSA9IGxvY2FsZS5pc1BNKG1lcmlkaWVtKTtcbiAgICAgICAgICAgIGlmIChpc1BtICYmIGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG0gJiYgaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGFycmF5IG9mIGZvcm1hdCBzdHJpbmdzXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgdGVtcENvbmZpZyxcbiAgICAgICAgICAgIGJlc3RNb21lbnQsXG4gICAgICAgICAgICBzY29yZVRvQmVhdCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUsXG4gICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kLFxuICAgICAgICAgICAgYmVzdEZvcm1hdElzVmFsaWQgPSBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ2ZMZW4gPSBjb25maWcuX2YubGVuZ3RoO1xuXG4gICAgICAgIGlmIChjb25maWdmTGVuID09PSAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnZkxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgPSAwO1xuICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGVtcENvbmZpZyA9IGNvcHlDb25maWcoe30sIGNvbmZpZyk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbXBDb25maWcuX3VzZVVUQyA9IGNvbmZpZy5fdXNlVVRDO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQodGVtcENvbmZpZyk7XG5cbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKHRlbXBDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFueSBpbnB1dCB0aGF0IHdhcyBub3QgcGFyc2VkIGFkZCBhIHBlbmFsdHkgZm9yIHRoYXQgZm9ybWF0XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLmNoYXJzTGVmdE92ZXI7XG5cbiAgICAgICAgICAgIC8vb3IgdG9rZW5zXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnVudXNlZFRva2Vucy5sZW5ndGggKiAxMDtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnNjb3JlID0gY3VycmVudFNjb3JlO1xuXG4gICAgICAgICAgICBpZiAoIWJlc3RGb3JtYXRJc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTY29yZSA8IHNjb3JlVG9CZWF0IHx8XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkRm9ybWF0Rm91bmRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRGb3JtYXRGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdEZvcm1hdElzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV4dGVuZChjb25maWcsIGJlc3RNb21lbnQgfHwgdGVtcENvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbU9iamVjdChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBub3JtYWxpemVPYmplY3RVbml0cyhjb25maWcuX2kpLFxuICAgICAgICAgICAgZGF5T3JEYXRlID0gaS5kYXkgPT09IHVuZGVmaW5lZCA/IGkuZGF0ZSA6IGkuZGF5O1xuICAgICAgICBjb25maWcuX2EgPSBtYXAoXG4gICAgICAgICAgICBbaS55ZWFyLCBpLm1vbnRoLCBkYXlPckRhdGUsIGkuaG91ciwgaS5taW51dGUsIGkuc2Vjb25kLCBpLm1pbGxpc2Vjb25kXSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqICYmIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZyb21Db25maWcoY29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3cocHJlcGFyZUNvbmZpZyhjb25maWcpKSk7XG4gICAgICAgIGlmIChyZXMuX25leHREYXkpIHtcbiAgICAgICAgICAgIC8vIEFkZGluZyBpcyBzbWFydCBlbm91Z2ggYXJvdW5kIERTVFxuICAgICAgICAgICAgcmVzLmFkZCgxLCAnZCcpO1xuICAgICAgICAgICAgcmVzLl9uZXh0RGF5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVwYXJlQ29uZmlnKGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBmb3JtYXQgPSBjb25maWcuX2Y7XG5cbiAgICAgICAgY29uZmlnLl9sb2NhbGUgPSBjb25maWcuX2xvY2FsZSB8fCBnZXRMb2NhbGUoY29uZmlnLl9sKTtcblxuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgKGZvcm1hdCA9PT0gdW5kZWZpbmVkICYmIGlucHV0ID09PSAnJykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKHsgbnVsbElucHV0OiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faSA9IGlucHV0ID0gY29uZmlnLl9sb2NhbGUucHJlcGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTW9tZW50KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhpbnB1dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGlucHV0O1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZm9ybWF0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSW5wdXQoY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZChjb25maWcpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSW5wdXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0LnZhbHVlT2YoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZyhjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2EgPSBtYXAoaW5wdXQuc2xpY2UoMCksIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbU9iamVjdChjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgICAgICAgICAgLy8gZnJvbSBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBpc1VUQykge1xuICAgICAgICB2YXIgYyA9IHt9O1xuXG4gICAgICAgIGlmIChmb3JtYXQgPT09IHRydWUgfHwgZm9ybWF0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgc3RyaWN0ID0gZm9ybWF0O1xuICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvY2FsZSA9PT0gdHJ1ZSB8fCBsb2NhbGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBsb2NhbGU7XG4gICAgICAgICAgICBsb2NhbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoaXNPYmplY3QoaW5wdXQpICYmIGlzT2JqZWN0RW1wdHkoaW5wdXQpKSB8fFxuICAgICAgICAgICAgKGlzQXJyYXkoaW5wdXQpICYmIGlucHV0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgY29uc3RydWN0aW9uIG11c3QgYmUgZG9uZSB0aGlzIHdheS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE0MjNcbiAgICAgICAgYy5faXNBTW9tZW50T2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgYy5fdXNlVVRDID0gYy5faXNVVEMgPSBpc1VUQztcbiAgICAgICAgYy5fbCA9IGxvY2FsZTtcbiAgICAgICAgYy5faSA9IGlucHV0O1xuICAgICAgICBjLl9mID0gZm9ybWF0O1xuICAgICAgICBjLl9zdHJpY3QgPSBzdHJpY3Q7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21Db25maWcoYyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWwoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG90eXBlTWluID0gZGVwcmVjYXRlKFxuICAgICAgICAgICAgJ21vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyIDwgdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgcHJvdG90eXBlTWF4ID0gZGVwcmVjYXRlKFxuICAgICAgICAgICAgJ21vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyID4gdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgIC8vIFBpY2sgYSBtb21lbnQgbSBmcm9tIG1vbWVudHMgc28gdGhhdCBtW2ZuXShvdGhlcikgaXMgdHJ1ZSBmb3IgYWxsXG4gICAgLy8gb3RoZXIuIFRoaXMgcmVsaWVzIG9uIHRoZSBmdW5jdGlvbiBmbiB0byBiZSB0cmFuc2l0aXZlLlxuICAgIC8vXG4gICAgLy8gbW9tZW50cyBzaG91bGQgZWl0aGVyIGJlIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzIG9yIGFuIGFycmF5LCB3aG9zZVxuICAgIC8vIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMuXG4gICAgZnVuY3Rpb24gcGlja0J5KGZuLCBtb21lbnRzKSB7XG4gICAgICAgIHZhciByZXMsIGk7XG4gICAgICAgIGlmIChtb21lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KG1vbWVudHNbMF0pKSB7XG4gICAgICAgICAgICBtb21lbnRzID0gbW9tZW50c1swXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMgPSBtb21lbnRzWzBdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbW9tZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCFtb21lbnRzW2ldLmlzVmFsaWQoKSB8fCBtb21lbnRzW2ldW2ZuXShyZXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gbW9tZW50c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSBbXS5zb3J0IGluc3RlYWQ/XG4gICAgZnVuY3Rpb24gbWluKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0JlZm9yZScsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1heCgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNBZnRlcicsIGFyZ3MpO1xuICAgIH1cblxuICAgIHZhciBub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdyA/IERhdGUubm93KCkgOiArbmV3IERhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIG9yZGVyaW5nID0gW1xuICAgICAgICAneWVhcicsXG4gICAgICAgICdxdWFydGVyJyxcbiAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgJ3dlZWsnLFxuICAgICAgICAnZGF5JyxcbiAgICAgICAgJ2hvdXInLFxuICAgICAgICAnbWludXRlJyxcbiAgICAgICAgJ3NlY29uZCcsXG4gICAgICAgICdtaWxsaXNlY29uZCcsXG4gICAgXTtcblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb25WYWxpZChtKSB7XG4gICAgICAgIHZhciBrZXksXG4gICAgICAgICAgICB1bml0SGFzRGVjaW1hbCA9IGZhbHNlLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG9yZGVyTGVuID0gb3JkZXJpbmcubGVuZ3RoO1xuICAgICAgICBmb3IgKGtleSBpbiBtKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaGFzT3duUHJvcChtLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhPZi5jYWxsKG9yZGVyaW5nLCBrZXkpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAobVtrZXldID09IG51bGwgfHwgIWlzTmFOKG1ba2V5XSkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyTGVuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChtW29yZGVyaW5nW2ldXSkge1xuICAgICAgICAgICAgICAgIGlmICh1bml0SGFzRGVjaW1hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG9ubHkgYWxsb3cgbm9uLWludGVnZXJzIGZvciBzbWFsbGVzdCB1bml0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KG1bb3JkZXJpbmdbaV1dKSAhPT0gdG9JbnQobVtvcmRlcmluZ1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKE5hTik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGR1cmF0aW9uKSxcbiAgICAgICAgICAgIHllYXJzID0gbm9ybWFsaXplZElucHV0LnllYXIgfHwgMCxcbiAgICAgICAgICAgIHF1YXJ0ZXJzID0gbm9ybWFsaXplZElucHV0LnF1YXJ0ZXIgfHwgMCxcbiAgICAgICAgICAgIG1vbnRocyA9IG5vcm1hbGl6ZWRJbnB1dC5tb250aCB8fCAwLFxuICAgICAgICAgICAgd2Vla3MgPSBub3JtYWxpemVkSW5wdXQud2VlayB8fCBub3JtYWxpemVkSW5wdXQuaXNvV2VlayB8fCAwLFxuICAgICAgICAgICAgZGF5cyA9IG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgMCxcbiAgICAgICAgICAgIGhvdXJzID0gbm9ybWFsaXplZElucHV0LmhvdXIgfHwgMCxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBub3JtYWxpemVkSW5wdXQubWludXRlIHx8IDAsXG4gICAgICAgICAgICBzZWNvbmRzID0gbm9ybWFsaXplZElucHV0LnNlY29uZCB8fCAwLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gbm9ybWFsaXplZElucHV0Lm1pbGxpc2Vjb25kIHx8IDA7XG5cbiAgICAgICAgdGhpcy5faXNWYWxpZCA9IGlzRHVyYXRpb25WYWxpZChub3JtYWxpemVkSW5wdXQpO1xuXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9XG4gICAgICAgICAgICArbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXG4gICAgICAgICAgICBtaW51dGVzICogNmU0ICsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBob3VycyAqIDEwMDAgKiA2MCAqIDYwOyAvL3VzaW5nIDEwMDAgKiA2MCAqIDYwIGluc3RlYWQgb2YgMzZlNSB0byBhdm9pZCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnMgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzI5NzhcbiAgICAgICAgLy8gQmVjYXVzZSBvZiBkYXRlQWRkUmVtb3ZlIHRyZWF0cyAyNCBob3VycyBhcyBkaWZmZXJlbnQgZnJvbSBhXG4gICAgICAgIC8vIGRheSB3aGVuIHdvcmtpbmcgYXJvdW5kIERTVCwgd2UgbmVlZCB0byBzdG9yZSB0aGVtIHNlcGFyYXRlbHlcbiAgICAgICAgdGhpcy5fZGF5cyA9ICtkYXlzICsgd2Vla3MgKiA3O1xuICAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRvIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgICAgICAvLyB3aGljaCBtb250aHMgeW91IGFyZSBhcmUgdGFsa2luZyBhYm91dCwgc28gd2UgaGF2ZSB0byBzdG9yZVxuICAgICAgICAvLyBpdCBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICsgcXVhcnRlcnMgKiAzICsgeWVhcnMgKiAxMjtcblxuICAgICAgICB0aGlzLl9kYXRhID0ge307XG5cbiAgICAgICAgdGhpcy5fbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG5cbiAgICAgICAgdGhpcy5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIER1cmF0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic1JvdW5kKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoLTEgKiBudW1iZXIpICogLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29tcGFyZSB0d28gYXJyYXlzLCByZXR1cm4gdGhlIG51bWJlciBvZiBkaWZmZXJlbmNlc1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBcnJheXMoYXJyYXkxLCBhcnJheTIsIGRvbnRDb252ZXJ0KSB7XG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGxlbmd0aERpZmYgPSBNYXRoLmFicyhhcnJheTEubGVuZ3RoIC0gYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBkaWZmcyA9IDAsXG4gICAgICAgICAgICBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoZG9udENvbnZlcnQgJiYgYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHx8XG4gICAgICAgICAgICAgICAgKCFkb250Q29udmVydCAmJiB0b0ludChhcnJheTFbaV0pICE9PSB0b0ludChhcnJheTJbaV0pKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIG9mZnNldCh0b2tlbiwgc2VwYXJhdG9yKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy51dGNPZmZzZXQoKSxcbiAgICAgICAgICAgICAgICBzaWduID0gJysnO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHNpZ24gPSAnLSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHNpZ24gK1xuICAgICAgICAgICAgICAgIHplcm9GaWxsKH5+KG9mZnNldCAvIDYwKSwgMikgK1xuICAgICAgICAgICAgICAgIHNlcGFyYXRvciArXG4gICAgICAgICAgICAgICAgemVyb0ZpbGwofn5vZmZzZXQgJSA2MCwgMilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9mZnNldCgnWicsICc6Jyk7XG4gICAgb2Zmc2V0KCdaWicsICcnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1onLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRSZWdleFRva2VuKCdaWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydaJywgJ1paJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX3VzZVVUQyA9IHRydWU7XG4gICAgICAgIGNvbmZpZy5fdHptID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyB0aW1lem9uZSBjaHVua2VyXG4gICAgLy8gJysxMDowMCcgPiBbJzEwJywgICcwMCddXG4gICAgLy8gJy0xNTMwJyAgPiBbJy0xNScsICczMCddXG4gICAgdmFyIGNodW5rT2Zmc2V0ID0gLyhbXFwrXFwtXXxcXGRcXGQpL2dpO1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaGVyLCBzdHJpbmcpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSAoc3RyaW5nIHx8ICcnKS5tYXRjaChtYXRjaGVyKSxcbiAgICAgICAgICAgIGNodW5rLFxuICAgICAgICAgICAgcGFydHMsXG4gICAgICAgICAgICBtaW51dGVzO1xuXG4gICAgICAgIGlmIChtYXRjaGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNodW5rID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdIHx8IFtdO1xuICAgICAgICBwYXJ0cyA9IChjaHVuayArICcnKS5tYXRjaChjaHVua09mZnNldCkgfHwgWyctJywgMCwgMF07XG4gICAgICAgIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgICAgIHJldHVybiBtaW51dGVzID09PSAwID8gMCA6IHBhcnRzWzBdID09PSAnKycgPyBtaW51dGVzIDogLW1pbnV0ZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGEgbW9tZW50IGZyb20gaW5wdXQsIHRoYXQgaXMgbG9jYWwvdXRjL3pvbmUgZXF1aXZhbGVudCB0byBtb2RlbC5cbiAgICBmdW5jdGlvbiBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIG1vZGVsKSB7XG4gICAgICAgIHZhciByZXMsIGRpZmY7XG4gICAgICAgIGlmIChtb2RlbC5faXNVVEMpIHtcbiAgICAgICAgICAgIHJlcyA9IG1vZGVsLmNsb25lKCk7XG4gICAgICAgICAgICBkaWZmID1cbiAgICAgICAgICAgICAgICAoaXNNb21lbnQoaW5wdXQpIHx8IGlzRGF0ZShpbnB1dClcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC52YWx1ZU9mKClcbiAgICAgICAgICAgICAgICAgICAgOiBjcmVhdGVMb2NhbChpbnB1dCkudmFsdWVPZigpKSAtIHJlcy52YWx1ZU9mKCk7XG4gICAgICAgICAgICAvLyBVc2UgbG93LWxldmVsIGFwaSwgYmVjYXVzZSB0aGlzIGZuIGlzIGxvdy1sZXZlbCBhcGkuXG4gICAgICAgICAgICByZXMuX2Quc2V0VGltZShyZXMuX2QudmFsdWVPZigpICsgZGlmZik7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQocmVzLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0KS5sb2NhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF0ZU9mZnNldChtKSB7XG4gICAgICAgIC8vIE9uIEZpcmVmb3guMjQgRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L3B1bGwvMTg3MVxuICAgICAgICByZXR1cm4gLU1hdGgucm91bmQobS5fZC5nZXRUaW1lem9uZU9mZnNldCgpKTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG1vbWVudCBpcyBtdXRhdGVkLlxuICAgIC8vIEl0IGlzIGludGVuZGVkIHRvIGtlZXAgdGhlIG9mZnNldCBpbiBzeW5jIHdpdGggdGhlIHRpbWV6b25lLlxuICAgIGhvb2tzLnVwZGF0ZU9mZnNldCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8ga2VlcExvY2FsVGltZSA9IHRydWUgbWVhbnMgb25seSBjaGFuZ2UgdGhlIHRpbWV6b25lLCB3aXRob3V0XG4gICAgLy8gYWZmZWN0aW5nIHRoZSBsb2NhbCBob3VyLiBTbyA1OjMxOjI2ICswMzAwIC0tW3V0Y09mZnNldCgyLCB0cnVlKV0tLT5cbiAgICAvLyA1OjMxOjI2ICswMjAwIEl0IGlzIHBvc3NpYmxlIHRoYXQgNTozMToyNiBkb2Vzbid0IGV4aXN0IHdpdGggb2Zmc2V0XG4gICAgLy8gKzAyMDAsIHNvIHdlIGFkanVzdCB0aGUgdGltZSBhcyBuZWVkZWQsIHRvIGJlIHZhbGlkLlxuICAgIC8vXG4gICAgLy8gS2VlcGluZyB0aGUgdGltZSBhY3R1YWxseSBhZGRzL3N1YnRyYWN0cyAob25lIGhvdXIpXG4gICAgLy8gZnJvbSB0aGUgYWN0dWFsIHJlcHJlc2VudGVkIHRpbWUuIFRoYXQgaXMgd2h5IHdlIGNhbGwgdXBkYXRlT2Zmc2V0XG4gICAgLy8gYSBzZWNvbmQgdGltZS4gSW4gY2FzZSBpdCB3YW50cyB1cyB0byBjaGFuZ2UgdGhlIG9mZnNldCBhZ2FpblxuICAgIC8vIF9jaGFuZ2VJblByb2dyZXNzID09IHRydWUgY2FzZSwgdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCwgYmVjYXVzZVxuICAgIC8vIHRoZXJlIGlzIG5vIHN1Y2ggdGltZSBpbiB0aGUgZ2l2ZW4gdGltZXpvbmUuXG4gICAgZnVuY3Rpb24gZ2V0U2V0T2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lLCBrZWVwTWludXRlcykge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0IHx8IDAsXG4gICAgICAgICAgICBsb2NhbEFkanVzdDtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoaW5wdXQpIDwgMTYgJiYgIWtlZXBNaW51dGVzKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dCAqIDYwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1VUQyAmJiBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxBZGp1c3QgPSBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gaW5wdXQ7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IHRydWU7XG4gICAgICAgICAgICBpZiAobG9jYWxBZGp1c3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGxvY2FsQWRqdXN0LCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWtlZXBMb2NhbFRpbWUgfHwgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBhZGRTdWJ0cmFjdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEdXJhdGlvbihpbnB1dCAtIG9mZnNldCwgJ20nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBvZmZzZXQgOiBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0Wm9uZShpbnB1dCwga2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IC1pbnB1dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAtdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvVVRDKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvTG9jYWwoa2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAodGhpcy5faXNVVEMpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnRyYWN0KGdldERhdGVPZmZzZXQodGhpcyksICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodGhpcy5fdHptLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2kgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgdFpvbmUgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoT2Zmc2V0LCB0aGlzLl9pKTtcbiAgICAgICAgICAgIGlmICh0Wm9uZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodFpvbmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNBbGlnbmVkSG91ck9mZnNldChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSBpbnB1dCA/IGNyZWF0ZUxvY2FsKGlucHV0KS51dGNPZmZzZXQoKSA6IDA7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLnV0Y09mZnNldCgpIC0gaW5wdXQpICUgNjAgPT09IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWUoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkKCkge1xuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX2lzRFNUU2hpZnRlZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYyA9IHt9LFxuICAgICAgICAgICAgb3RoZXI7XG5cbiAgICAgICAgY29weUNvbmZpZyhjLCB0aGlzKTtcbiAgICAgICAgYyA9IHByZXBhcmVDb25maWcoYyk7XG5cbiAgICAgICAgaWYgKGMuX2EpIHtcbiAgICAgICAgICAgIG90aGVyID0gYy5faXNVVEMgPyBjcmVhdGVVVEMoYy5fYSkgOiBjcmVhdGVMb2NhbChjLl9hKTtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCkgJiYgY29tcGFyZUFycmF5cyhjLl9hLCBvdGhlci50b0FycmF5KCkpID4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xvY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyAhdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0Y09mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0YygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgJiYgdGhpcy5fb2Zmc2V0ID09PSAwIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQVNQLk5FVCBqc29uIGRhdGUgZm9ybWF0IHJlZ2V4XG4gICAgdmFyIGFzcE5ldFJlZ2V4ID0gL14oLXxcXCspPyg/OihcXGQqKVsuIF0pPyhcXGQrKTooXFxkKykoPzo6KFxcZCspKFxcLlxcZCopPyk/JC8sXG4gICAgICAgIC8vIGZyb20gaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9jbG9zdXJlX2dvb2dfZGF0ZV9kYXRlLmpzLnNvdXJjZS5odG1sXG4gICAgICAgIC8vIHNvbWV3aGF0IG1vcmUgaW4gbGluZSB3aXRoIDQuNC4zLjIgMjAwNCBzcGVjLCBidXQgYWxsb3dzIGRlY2ltYWwgYW55d2hlcmVcbiAgICAgICAgLy8gYW5kIGZ1cnRoZXIgbW9kaWZpZWQgdG8gYWxsb3cgZm9yIHN0cmluZ3MgY29udGFpbmluZyBib3RoIHdlZWsgYW5kIGRheVxuICAgICAgICBpc29SZWdleCA9XG4gICAgICAgICAgICAvXigtfFxcKyk/UCg/OihbLStdP1swLTksLl0qKVkpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVcpPyg/OihbLStdP1swLTksLl0qKUQpPyg/OlQoPzooWy0rXT9bMC05LC5dKilIKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilTKT8pPyQvO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRHVyYXRpb24oaW5wdXQsIGtleSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBpbnB1dCxcbiAgICAgICAgICAgIC8vIG1hdGNoaW5nIGFnYWluc3QgcmVnZXhwIGlzIGV4cGVuc2l2ZSwgZG8gaXQgb24gZGVtYW5kXG4gICAgICAgICAgICBtYXRjaCA9IG51bGwsXG4gICAgICAgICAgICBzaWduLFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgZGlmZlJlcztcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG1zOiBpbnB1dC5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgICAgIGQ6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgICAgIE06IGlucHV0Ll9tb250aHMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSB8fCAhaXNOYU4oK2lucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gK2lucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbi5taWxsaXNlY29uZHMgPSAraW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gbWF0Y2hbMV0gPT09ICctJyA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgZDogdG9JbnQobWF0Y2hbREFURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBoOiB0b0ludChtYXRjaFtIT1VSXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIG06IHRvSW50KG1hdGNoW01JTlVURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBzOiB0b0ludChtYXRjaFtTRUNPTkRdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbXM6IHRvSW50KGFic1JvdW5kKG1hdGNoW01JTExJU0VDT05EXSAqIDEwMDApKSAqIHNpZ24sIC8vIHRoZSBtaWxsaXNlY29uZCBkZWNpbWFsIHBvaW50IGlzIGluY2x1ZGVkIGluIHRoZSBtYXRjaFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICgobWF0Y2ggPSBpc29SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSBtYXRjaFsxXSA9PT0gJy0nID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeTogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE06IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgICAgICB3OiBwYXJzZUlzbyhtYXRjaFs0XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgZDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGg6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBtOiBwYXJzZUlzbyhtYXRjaFs3XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgczogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRpZmZSZXMgPSBtb21lbnRzRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbChkdXJhdGlvbi5mcm9tKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbChkdXJhdGlvbi50bylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgZHVyYXRpb24uTSA9IGRpZmZSZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19sb2NhbGUnKSkge1xuICAgICAgICAgICAgcmV0Ll9sb2NhbGUgPSBpbnB1dC5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfaXNWYWxpZCcpKSB7XG4gICAgICAgICAgICByZXQuX2lzVmFsaWQgPSBpbnB1dC5faXNWYWxpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvKGlucCwgc2lnbikge1xuICAgICAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgICAgICAvLyBjb252ZXJ0cyBmbG9hdHMgdG8gaW50cy5cbiAgICAgICAgLy8gaW5wIG1heSBiZSB1bmRlZmluZWQsIHNvIGNhcmVmdWwgY2FsbGluZyByZXBsYWNlIG9uIGl0LlxuICAgICAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAgICAgLy8gYXBwbHkgc2lnbiB3aGlsZSB3ZSdyZSBhdCBpdFxuICAgICAgICByZXR1cm4gKGlzTmFOKHJlcykgPyAwIDogcmVzKSAqIHNpZ247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzID0ge307XG5cbiAgICAgICAgcmVzLm1vbnRocyA9XG4gICAgICAgICAgICBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICsgKG90aGVyLnllYXIoKSAtIGJhc2UueWVhcigpKSAqIDEyO1xuICAgICAgICBpZiAoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpLmlzQWZ0ZXIob3RoZXIpKSB7XG4gICAgICAgICAgICAtLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gK290aGVyIC0gK2Jhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIGlmICghKGJhc2UuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlciA9IGNsb25lV2l0aE9mZnNldChvdGhlciwgYmFzZSk7XG4gICAgICAgIGlmIChiYXNlLmlzQmVmb3JlKG90aGVyKSkge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKG90aGVyLCBiYXNlKTtcbiAgICAgICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSAtcmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHJlcy5tb250aHMgPSAtcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlICduYW1lJyBhcmcgYWZ0ZXIgZGVwcmVjYXRpb24gaXMgcmVtb3ZlZFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFkZGVyKGRpcmVjdGlvbiwgbmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgZHVyLCB0bXA7XG4gICAgICAgICAgICAvL2ludmVydCB0aGUgYXJndW1lbnRzLCBidXQgY29tcGxhaW4gYWJvdXQgaXRcbiAgICAgICAgICAgIGlmIChwZXJpb2QgIT09IG51bGwgJiYgIWlzTmFOKCtwZXJpb2QpKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAnbW9tZW50KCkuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcobnVtYmVyLCBwZXJpb2QpLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9hZGQtaW52ZXJ0ZWQtcGFyYW0vIGZvciBtb3JlIGluZm8uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdG1wID0gdmFsO1xuICAgICAgICAgICAgICAgIHZhbCA9IHBlcmlvZDtcbiAgICAgICAgICAgICAgICBwZXJpb2QgPSB0bXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGR1ciA9IGNyZWF0ZUR1cmF0aW9uKHZhbCwgcGVyaW9kKTtcbiAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGR1ciwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0KG1vbSwgZHVyYXRpb24sIGlzQWRkaW5nLCB1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gYWJzUm91bmQoZHVyYXRpb24uX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzUm91bmQoZHVyYXRpb24uX21vbnRocyk7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlT2Zmc2V0ID0gdXBkYXRlT2Zmc2V0ID09IG51bGwgPyB0cnVlIDogdXBkYXRlT2Zmc2V0O1xuXG4gICAgICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG1vbSwgZ2V0KG1vbSwgJ01vbnRoJykgKyBtb250aHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgICAgIHNldCQxKG1vbSwgJ0RhdGUnLCBnZXQobW9tLCAnRGF0ZScpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICBtb20uX2Quc2V0VGltZShtb20uX2QudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChtb20sIGRheXMgfHwgbW9udGhzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhZGQgPSBjcmVhdGVBZGRlcigxLCAnYWRkJyksXG4gICAgICAgIHN1YnRyYWN0ID0gY3JlYXRlQWRkZXIoLTEsICdzdWJ0cmFjdCcpO1xuXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gdHlwZSBNb21lbnRJbnB1dCA9IE1vbWVudCB8IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgTW9tZW50SW5wdXRPYmplY3QgfCB2b2lkOyAvLyBudWxsIHwgdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaXNNb21lbnRJbnB1dChpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNNb21lbnQoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc0RhdGUoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc1N0cmluZyhpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzTnVtYmVyKGlucHV0KSB8fFxuICAgICAgICAgICAgaXNOdW1iZXJPclN0cmluZ0FycmF5KGlucHV0KSB8fFxuICAgICAgICAgICAgaXNNb21lbnRJbnB1dE9iamVjdChpbnB1dCkgfHxcbiAgICAgICAgICAgIGlucHV0ID09PSBudWxsIHx8XG4gICAgICAgICAgICBpbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNNb21lbnRJbnB1dE9iamVjdChpbnB1dCkge1xuICAgICAgICB2YXIgb2JqZWN0VGVzdCA9IGlzT2JqZWN0KGlucHV0KSAmJiAhaXNPYmplY3RFbXB0eShpbnB1dCksXG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAgICAgJ3llYXJzJyxcbiAgICAgICAgICAgICAgICAneWVhcicsXG4gICAgICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgICAgICdtb250aHMnLFxuICAgICAgICAgICAgICAgICdtb250aCcsXG4gICAgICAgICAgICAgICAgJ00nLFxuICAgICAgICAgICAgICAgICdkYXlzJyxcbiAgICAgICAgICAgICAgICAnZGF5JyxcbiAgICAgICAgICAgICAgICAnZCcsXG4gICAgICAgICAgICAgICAgJ2RhdGVzJyxcbiAgICAgICAgICAgICAgICAnZGF0ZScsXG4gICAgICAgICAgICAgICAgJ0QnLFxuICAgICAgICAgICAgICAgICdob3VycycsXG4gICAgICAgICAgICAgICAgJ2hvdXInLFxuICAgICAgICAgICAgICAgICdoJyxcbiAgICAgICAgICAgICAgICAnbWludXRlcycsXG4gICAgICAgICAgICAgICAgJ21pbnV0ZScsXG4gICAgICAgICAgICAgICAgJ20nLFxuICAgICAgICAgICAgICAgICdzZWNvbmRzJyxcbiAgICAgICAgICAgICAgICAnc2Vjb25kJyxcbiAgICAgICAgICAgICAgICAncycsXG4gICAgICAgICAgICAgICAgJ21pbGxpc2Vjb25kcycsXG4gICAgICAgICAgICAgICAgJ21pbGxpc2Vjb25kJyxcbiAgICAgICAgICAgICAgICAnbXMnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHByb3BlcnR5TGVuID0gcHJvcGVydGllcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHByb3BlcnR5TGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgIHByb3BlcnR5VGVzdCA9IHByb3BlcnR5VGVzdCB8fCBoYXNPd25Qcm9wKGlucHV0LCBwcm9wZXJ0eSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2JqZWN0VGVzdCAmJiBwcm9wZXJ0eVRlc3Q7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXJPclN0cmluZ0FycmF5KGlucHV0KSB7XG4gICAgICAgIHZhciBhcnJheVRlc3QgPSBpc0FycmF5KGlucHV0KSxcbiAgICAgICAgICAgIGRhdGFUeXBlVGVzdCA9IGZhbHNlO1xuICAgICAgICBpZiAoYXJyYXlUZXN0KSB7XG4gICAgICAgICAgICBkYXRhVHlwZVRlc3QgPVxuICAgICAgICAgICAgICAgIGlucHV0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTnVtYmVyKGl0ZW0pICYmIGlzU3RyaW5nKGlucHV0KTtcbiAgICAgICAgICAgICAgICB9KS5sZW5ndGggPT09IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5VGVzdCAmJiBkYXRhVHlwZVRlc3Q7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNDYWxlbmRhclNwZWMoaW5wdXQpIHtcbiAgICAgICAgdmFyIG9iamVjdFRlc3QgPSBpc09iamVjdChpbnB1dCkgJiYgIWlzT2JqZWN0RW1wdHkoaW5wdXQpLFxuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gZmFsc2UsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0gW1xuICAgICAgICAgICAgICAgICdzYW1lRGF5JyxcbiAgICAgICAgICAgICAgICAnbmV4dERheScsXG4gICAgICAgICAgICAgICAgJ2xhc3REYXknLFxuICAgICAgICAgICAgICAgICduZXh0V2VlaycsXG4gICAgICAgICAgICAgICAgJ2xhc3RXZWVrJyxcbiAgICAgICAgICAgICAgICAnc2FtZUVsc2UnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwcm9wZXJ0eTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gcHJvcGVydHlUZXN0IHx8IGhhc093blByb3AoaW5wdXQsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYmplY3RUZXN0ICYmIHByb3BlcnR5VGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDYWxlbmRhckZvcm1hdChteU1vbWVudCwgbm93KSB7XG4gICAgICAgIHZhciBkaWZmID0gbXlNb21lbnQuZGlmZihub3csICdkYXlzJywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBkaWZmIDwgLTZcbiAgICAgICAgICAgID8gJ3NhbWVFbHNlJ1xuICAgICAgICAgICAgOiBkaWZmIDwgLTFcbiAgICAgICAgICAgICAgPyAnbGFzdFdlZWsnXG4gICAgICAgICAgICAgIDogZGlmZiA8IDBcbiAgICAgICAgICAgICAgICA/ICdsYXN0RGF5J1xuICAgICAgICAgICAgICAgIDogZGlmZiA8IDFcbiAgICAgICAgICAgICAgICAgID8gJ3NhbWVEYXknXG4gICAgICAgICAgICAgICAgICA6IGRpZmYgPCAyXG4gICAgICAgICAgICAgICAgICAgID8gJ25leHREYXknXG4gICAgICAgICAgICAgICAgICAgIDogZGlmZiA8IDdcbiAgICAgICAgICAgICAgICAgICAgICA/ICduZXh0V2VlaydcbiAgICAgICAgICAgICAgICAgICAgICA6ICdzYW1lRWxzZSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIkMSh0aW1lLCBmb3JtYXRzKSB7XG4gICAgICAgIC8vIFN1cHBvcnQgZm9yIHNpbmdsZSBwYXJhbWV0ZXIsIGZvcm1hdHMgb25seSBvdmVybG9hZCB0byB0aGUgY2FsZW5kYXIgZnVuY3Rpb25cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmICghYXJndW1lbnRzWzBdKSB7XG4gICAgICAgICAgICAgICAgdGltZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3JtYXRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc01vbWVudElucHV0KGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQ2FsZW5kYXJTcGVjKGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgICAgICAgICBmb3JtYXRzID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIHRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2Ugd2FudCB0byBjb21wYXJlIHRoZSBzdGFydCBvZiB0b2RheSwgdnMgdGhpcy5cbiAgICAgICAgLy8gR2V0dGluZyBzdGFydC1vZi10b2RheSBkZXBlbmRzIG9uIHdoZXRoZXIgd2UncmUgbG9jYWwvdXRjL29mZnNldCBvciBub3QuXG4gICAgICAgIHZhciBub3cgPSB0aW1lIHx8IGNyZWF0ZUxvY2FsKCksXG4gICAgICAgICAgICBzb2QgPSBjbG9uZVdpdGhPZmZzZXQobm93LCB0aGlzKS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGhvb2tzLmNhbGVuZGFyRm9ybWF0KHRoaXMsIHNvZCkgfHwgJ3NhbWVFbHNlJyxcbiAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgZm9ybWF0cyAmJlxuICAgICAgICAgICAgICAgIChpc0Z1bmN0aW9uKGZvcm1hdHNbZm9ybWF0XSlcbiAgICAgICAgICAgICAgICAgICAgPyBmb3JtYXRzW2Zvcm1hdF0uY2FsbCh0aGlzLCBub3cpXG4gICAgICAgICAgICAgICAgICAgIDogZm9ybWF0c1tmb3JtYXRdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQoXG4gICAgICAgICAgICBvdXRwdXQgfHwgdGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZm9ybWF0LCB0aGlzLCBjcmVhdGVMb2NhbChub3cpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IE1vbWVudCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FmdGVyKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB8fCAnbWlsbGlzZWNvbmQnO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA+IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsSW5wdXQudmFsdWVPZigpIDwgdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmVmb3JlKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB8fCAnbWlsbGlzZWNvbmQnO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JldHdlZW4oZnJvbSwgdG8sIHVuaXRzLCBpbmNsdXNpdml0eSkge1xuICAgICAgICB2YXIgbG9jYWxGcm9tID0gaXNNb21lbnQoZnJvbSkgPyBmcm9tIDogY3JlYXRlTG9jYWwoZnJvbSksXG4gICAgICAgICAgICBsb2NhbFRvID0gaXNNb21lbnQodG8pID8gdG8gOiBjcmVhdGVMb2NhbCh0byk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsRnJvbS5pc1ZhbGlkKCkgJiYgbG9jYWxUby5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5jbHVzaXZpdHkgPSBpbmNsdXNpdml0eSB8fCAnKCknO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGluY2x1c2l2aXR5WzBdID09PSAnKCdcbiAgICAgICAgICAgICAgICA/IHRoaXMuaXNBZnRlcihsb2NhbEZyb20sIHVuaXRzKVxuICAgICAgICAgICAgICAgIDogIXRoaXMuaXNCZWZvcmUobG9jYWxGcm9tLCB1bml0cykpICYmXG4gICAgICAgICAgICAoaW5jbHVzaXZpdHlbMV0gPT09ICcpJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5pc0JlZm9yZShsb2NhbFRvLCB1bml0cylcbiAgICAgICAgICAgICAgICA6ICF0aGlzLmlzQWZ0ZXIobG9jYWxUbywgdW5pdHMpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZShpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KSxcbiAgICAgICAgICAgIGlucHV0TXM7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID09PSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0TXMgPSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKSA8PSBpbnB1dE1zICYmXG4gICAgICAgICAgICAgICAgaW5wdXRNcyA8PSB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZU9yQWZ0ZXIoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNBZnRlcihpbnB1dCwgdW5pdHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZU9yQmVmb3JlKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbWUoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQmVmb3JlKGlucHV0LCB1bml0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlmZihpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICAgICAgdmFyIHRoYXQsIHpvbmVEZWx0YSwgb3V0cHV0O1xuXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB0aGF0ID0gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCB0aGlzKTtcblxuICAgICAgICBpZiAoIXRoYXQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgem9uZURlbHRhID0gKHRoYXQudXRjT2Zmc2V0KCkgLSB0aGlzLnV0Y09mZnNldCgpKSAqIDZlNDtcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAxMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMWUzO1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDM2ZTU7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwXG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA4NjRlNTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCwgbmVnYXRlIGRzdFxuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0IC0gem9uZURlbHRhKSAvIDYwNDhlNTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gdGhpcyAtIHRoYXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic0Zsb29yKG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhEaWZmKGEsIGIpIHtcbiAgICAgICAgaWYgKGEuZGF0ZSgpIDwgYi5kYXRlKCkpIHtcbiAgICAgICAgICAgIC8vIGVuZC1vZi1tb250aCBjYWxjdWxhdGlvbnMgd29yayBjb3JyZWN0IHdoZW4gdGhlIHN0YXJ0IG1vbnRoIGhhcyBtb3JlXG4gICAgICAgICAgICAvLyBkYXlzIHRoYW4gdGhlIGVuZCBtb250aC5cbiAgICAgICAgICAgIHJldHVybiAtbW9udGhEaWZmKGIsIGEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gICAgICAgIHZhciB3aG9sZU1vbnRoRGlmZiA9IChiLnllYXIoKSAtIGEueWVhcigpKSAqIDEyICsgKGIubW9udGgoKSAtIGEubW9udGgoKSksXG4gICAgICAgICAgICAvLyBiIGlzIGluIChhbmNob3IgLSAxIG1vbnRoLCBhbmNob3IgKyAxIG1vbnRoKVxuICAgICAgICAgICAgYW5jaG9yID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiwgJ21vbnRocycpLFxuICAgICAgICAgICAgYW5jaG9yMixcbiAgICAgICAgICAgIGFkanVzdDtcblxuICAgICAgICBpZiAoYiAtIGFuY2hvciA8IDApIHtcbiAgICAgICAgICAgIGFuY2hvcjIgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmIC0gMSwgJ21vbnRocycpO1xuICAgICAgICAgICAgLy8gbGluZWFyIGFjcm9zcyB0aGUgbW9udGhcbiAgICAgICAgICAgIGFkanVzdCA9IChiIC0gYW5jaG9yKSAvIChhbmNob3IgLSBhbmNob3IyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFuY2hvcjIgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmICsgMSwgJ21vbnRocycpO1xuICAgICAgICAgICAgLy8gbGluZWFyIGFjcm9zcyB0aGUgbW9udGhcbiAgICAgICAgICAgIGFkanVzdCA9IChiIC0gYW5jaG9yKSAvIChhbmNob3IyIC0gYW5jaG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgZm9yIG5lZ2F0aXZlIHplcm8sIHJldHVybiB6ZXJvIGlmIG5lZ2F0aXZlIHplcm9cbiAgICAgICAgcmV0dXJuIC0od2hvbGVNb250aERpZmYgKyBhZGp1c3QpIHx8IDA7XG4gICAgfVxuXG4gICAgaG9va3MuZGVmYXVsdEZvcm1hdCA9ICdZWVlZLU1NLUREVEhIOm1tOnNzWic7XG4gICAgaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA9ICdZWVlZLU1NLUREVEhIOm1tOnNzW1pdJztcblxuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmcoa2VlcE9mZnNldCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRjID0ga2VlcE9mZnNldCAhPT0gdHJ1ZSxcbiAgICAgICAgICAgIG0gPSB1dGMgPyB0aGlzLmNsb25lKCkudXRjKCkgOiB0aGlzO1xuICAgICAgICBpZiAobS55ZWFyKCkgPCAwIHx8IG0ueWVhcigpID4gOTk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChcbiAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgIHV0Y1xuICAgICAgICAgICAgICAgICAgICA/ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nXG4gICAgICAgICAgICAgICAgICAgIDogJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1onXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKSkge1xuICAgICAgICAgICAgLy8gbmF0aXZlIGltcGxlbWVudGF0aW9uIGlzIH41MHggZmFzdGVyLCB1c2UgaXQgd2hlbiB3ZSBjYW5cbiAgICAgICAgICAgIGlmICh1dGMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b0RhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkgKyB0aGlzLnV0Y09mZnNldCgpICogNjAgKiAxMDAwKVxuICAgICAgICAgICAgICAgICAgICAudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnWicsIGZvcm1hdE1vbWVudChtLCAnWicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KFxuICAgICAgICAgICAgbSxcbiAgICAgICAgICAgIHV0YyA/ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBodW1hbiByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIG1vbWVudCB0aGF0IGNhblxuICAgICAqIGFsc28gYmUgZXZhbHVhdGVkIHRvIGdldCBhIG5ldyBtb21lbnQgd2hpY2ggaXMgdGhlIHNhbWVcbiAgICAgKlxuICAgICAqIEBsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9kaXN0L2xhdGVzdC9kb2NzL2FwaS91dGlsLmh0bWwjdXRpbF9jdXN0b21faW5zcGVjdF9mdW5jdGlvbl9vbl9vYmplY3RzXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuICdtb21lbnQuaW52YWxpZCgvKiAnICsgdGhpcy5faSArICcgKi8pJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnVuYyA9ICdtb21lbnQnLFxuICAgICAgICAgICAgem9uZSA9ICcnLFxuICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgeWVhcixcbiAgICAgICAgICAgIGRhdGV0aW1lLFxuICAgICAgICAgICAgc3VmZml4O1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2NhbCgpKSB7XG4gICAgICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgICAgIHpvbmUgPSAnWic7XG4gICAgICAgIH1cbiAgICAgICAgcHJlZml4ID0gJ1snICsgZnVuYyArICcoXCJdJztcbiAgICAgICAgeWVhciA9IDAgPD0gdGhpcy55ZWFyKCkgJiYgdGhpcy55ZWFyKCkgPD0gOTk5OSA/ICdZWVlZJyA6ICdZWVlZWVknO1xuICAgICAgICBkYXRldGltZSA9ICctTU0tRERbVF1ISDptbTpzcy5TU1MnO1xuICAgICAgICBzdWZmaXggPSB6b25lICsgJ1tcIildJztcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQocHJlZml4ICsgeWVhciArIGRhdGV0aW1lICsgc3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQoaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpbnB1dFN0cmluZykge1xuICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSB0aGlzLmlzVXRjKClcbiAgICAgICAgICAgICAgICA/IGhvb2tzLmRlZmF1bHRGb3JtYXRVdGNcbiAgICAgICAgICAgICAgICA6IGhvb2tzLmRlZmF1bHRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdE1vbWVudCh0aGlzLCBpbnB1dFN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbSh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fCBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgdG86IHRoaXMsIGZyb206IHRpbWUgfSlcbiAgICAgICAgICAgICAgICAubG9jYWxlKHRoaXMubG9jYWxlKCkpXG4gICAgICAgICAgICAgICAgLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbU5vdyh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb20oY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG8odGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHwgY3JlYXRlTG9jYWwodGltZSkuaXNWYWxpZCgpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7IGZyb206IHRoaXMsIHRvOiB0aW1lIH0pXG4gICAgICAgICAgICAgICAgLmxvY2FsZSh0aGlzLmxvY2FsZSgpKVxuICAgICAgICAgICAgICAgIC5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvTm93KHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG8oY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgLy8gSWYgcGFzc2VkIGEgbG9jYWxlIGtleSwgaXQgd2lsbCBzZXQgdGhlIGxvY2FsZSBmb3IgdGhpc1xuICAgIC8vIGluc3RhbmNlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHJldHVybiB0aGUgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbiAgICAvLyB2YXJpYWJsZXMgZm9yIHRoaXMgaW5zdGFuY2UuXG4gICAgZnVuY3Rpb24gbG9jYWxlKGtleSkge1xuICAgICAgICB2YXIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobmV3TG9jYWxlRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLicsXG4gICAgICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICB2YXIgTVNfUEVSX1NFQ09ORCA9IDEwMDAsXG4gICAgICAgIE1TX1BFUl9NSU5VVEUgPSA2MCAqIE1TX1BFUl9TRUNPTkQsXG4gICAgICAgIE1TX1BFUl9IT1VSID0gNjAgKiBNU19QRVJfTUlOVVRFLFxuICAgICAgICBNU19QRVJfNDAwX1lFQVJTID0gKDM2NSAqIDQwMCArIDk3KSAqIDI0ICogTVNfUEVSX0hPVVI7XG5cbiAgICAvLyBhY3R1YWwgbW9kdWxvIC0gaGFuZGxlcyBuZWdhdGl2ZSBudW1iZXJzIChmb3IgZGF0ZXMgYmVmb3JlIDE5NzApOlxuICAgIGZ1bmN0aW9uIG1vZCQxKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICAgIHJldHVybiAoKGRpdmlkZW5kICUgZGl2aXNvcikgKyBkaXZpc29yKSAlIGRpdmlzb3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxTdGFydE9mRGF0ZSh5LCBtLCBkKSB7XG4gICAgICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSArIDQwMCwgbSwgZCkgLSBNU19QRVJfNDAwX1lFQVJTO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHksIG0sIGQpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHV0Y1N0YXJ0T2ZEYXRlKHksIG0sIGQpIHtcbiAgICAgICAgLy8gRGF0ZS5VVEMgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIHJldHVybiBEYXRlLlVUQyh5ICsgNDAwLCBtLCBkKSAtIE1TX1BFUl80MDBfWUVBUlM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gRGF0ZS5VVEMoeSwgbSwgZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGFydE9mKHVuaXRzKSB7XG4gICAgICAgIHZhciB0aW1lLCBzdGFydE9mRGF0ZTtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnIHx8ICF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE9mRGF0ZSA9IHRoaXMuX2lzVVRDID8gdXRjU3RhcnRPZkRhdGUgOiBsb2NhbFN0YXJ0T2ZEYXRlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCkgLSAodGhpcy5tb250aCgpICUgMyksXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSB0aGlzLndlZWtkYXkoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gKHRoaXMuaXNvV2Vla2RheSgpIC0gMSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSAtPSBtb2QkMShcbiAgICAgICAgICAgICAgICAgICAgdGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksXG4gICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSwgTVNfUEVSX01JTlVURSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKHRpbWUsIE1TX1BFUl9TRUNPTkQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZC5zZXRUaW1lKHRpbWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZE9mKHVuaXRzKSB7XG4gICAgICAgIHZhciB0aW1lLCBzdGFydE9mRGF0ZTtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnIHx8ICF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE9mRGF0ZSA9IHRoaXMuX2lzVVRDID8gdXRjU3RhcnRPZkRhdGUgOiBsb2NhbFN0YXJ0T2ZEYXRlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSArIDEsIDAsIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpIC0gKHRoaXMubW9udGgoKSAlIDMpICsgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkgKyAxLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gdGhpcy53ZWVrZGF5KCkgKyA3XG4gICAgICAgICAgICAgICAgICAgICkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaXNvV2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpICsgN1xuICAgICAgICAgICAgICAgICAgICApIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkgKyAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPVxuICAgICAgICAgICAgICAgICAgICBNU19QRVJfSE9VUiAtXG4gICAgICAgICAgICAgICAgICAgIG1vZCQxKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksXG4gICAgICAgICAgICAgICAgICAgICAgICBNU19QRVJfSE9VUlxuICAgICAgICAgICAgICAgICAgICApIC1cbiAgICAgICAgICAgICAgICAgICAgMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgKz0gTVNfUEVSX01JTlVURSAtIG1vZCQxKHRpbWUsIE1TX1BFUl9NSU5VVEUpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgKz0gTVNfUEVSX1NFQ09ORCAtIG1vZCQxKHRpbWUsIE1TX1BFUl9TRUNPTkQpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Quc2V0VGltZSh0aW1lKTtcbiAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZC52YWx1ZU9mKCkgLSAodGhpcy5fb2Zmc2V0IHx8IDApICogNjAwMDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5peCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy52YWx1ZU9mKCkgLyAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0RhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbS55ZWFyKCksXG4gICAgICAgICAgICBtLm1vbnRoKCksXG4gICAgICAgICAgICBtLmRhdGUoKSxcbiAgICAgICAgICAgIG0uaG91cigpLFxuICAgICAgICAgICAgbS5taW51dGUoKSxcbiAgICAgICAgICAgIG0uc2Vjb25kKCksXG4gICAgICAgICAgICBtLm1pbGxpc2Vjb25kKCksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9PYmplY3QoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXJzOiBtLnllYXIoKSxcbiAgICAgICAgICAgIG1vbnRoczogbS5tb250aCgpLFxuICAgICAgICAgICAgZGF0ZTogbS5kYXRlKCksXG4gICAgICAgICAgICBob3VyczogbS5ob3VycygpLFxuICAgICAgICAgICAgbWludXRlczogbS5taW51dGVzKCksXG4gICAgICAgICAgICBzZWNvbmRzOiBtLnNlY29uZHMoKSxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kczogbS5taWxsaXNlY29uZHMoKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICAgIC8vIG5ldyBEYXRlKE5hTikudG9KU09OKCkgPT09IG51bGxcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy50b0lTT1N0cmluZygpIDogbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDIoKSB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkKHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNpbmdGbGFncygpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkQXQoKSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJzaW5nRmxhZ3ModGhpcykub3ZlcmZsb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRpb25EYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5wdXQ6IHRoaXMuX2ksXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuX2YsXG4gICAgICAgICAgICBsb2NhbGU6IHRoaXMuX2xvY2FsZSxcbiAgICAgICAgICAgIGlzVVRDOiB0aGlzLl9pc1VUQyxcbiAgICAgICAgICAgIHN0cmljdDogdGhpcy5fc3RyaWN0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdOJywgMCwgMCwgJ2VyYUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignTk4nLCAwLCAwLCAnZXJhQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTk4nLCAwLCAwLCAnZXJhQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTk5OJywgMCwgMCwgJ2VyYU5hbWUnKTtcbiAgICBhZGRGb3JtYXRUb2tlbignTk5OTk4nLCAwLCAwLCAnZXJhTmFycm93Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigneScsIFsneScsIDFdLCAneW8nLCAnZXJhWWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5eScsIDJdLCAwLCAnZXJhWWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5eXknLCAzXSwgMCwgJ2VyYVllYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneScsIFsneXl5eScsIDRdLCAwLCAnZXJhWWVhcicpO1xuXG4gICAgYWRkUmVnZXhUb2tlbignTicsIG1hdGNoRXJhQWJicik7XG4gICAgYWRkUmVnZXhUb2tlbignTk4nLCBtYXRjaEVyYUFiYnIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ05OTicsIG1hdGNoRXJhQWJicik7XG4gICAgYWRkUmVnZXhUb2tlbignTk5OTicsIG1hdGNoRXJhTmFtZSk7XG4gICAgYWRkUmVnZXhUb2tlbignTk5OTk4nLCBtYXRjaEVyYU5hcnJvdyk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFxuICAgICAgICBbJ04nLCAnTk4nLCAnTk5OJywgJ05OTk4nLCAnTk5OTk4nXSxcbiAgICAgICAgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICAgICAgdmFyIGVyYSA9IGNvbmZpZy5fbG9jYWxlLmVyYXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgICAgIGlmIChlcmEpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lcmEgPSBlcmE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRFcmEgPSBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBhZGRSZWdleFRva2VuKCd5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneXknLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5eXknLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5eXl5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneW8nLCBtYXRjaEVyYVllYXJPcmRpbmFsKTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWyd5JywgJ3l5JywgJ3l5eScsICd5eXl5J10sIFlFQVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWyd5byddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgaWYgKGNvbmZpZy5fbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4KSB7XG4gICAgICAgICAgICBtYXRjaCA9IGlucHV0Lm1hdGNoKGNvbmZpZy5fbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX2xvY2FsZS5lcmFZZWFyT3JkaW5hbFBhcnNlKSB7XG4gICAgICAgICAgICBhcnJheVtZRUFSXSA9IGNvbmZpZy5fbG9jYWxlLmVyYVllYXJPcmRpbmFsUGFyc2UoaW5wdXQsIG1hdGNoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRXJhcyhtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLl9lcmFzIHx8IGdldExvY2FsZSgnZW4nKS5fZXJhcztcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gaG9va3MoZXJhc1tpXS5zaW5jZSkuc3RhcnRPZignZGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0uc2luY2UgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLnVudGlsID0gK0luZmluaXR5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICAgICAgICAgIGRhdGUgPSBob29rcyhlcmFzW2ldLnVudGlsKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0udW50aWwgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVyYXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlRXJhc1BhcnNlKGVyYU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmVyYXMoKSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBhYmJyLFxuICAgICAgICAgICAgbmFycm93O1xuICAgICAgICBlcmFOYW1lID0gZXJhTmFtZS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgbmFtZSA9IGVyYXNbaV0ubmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgYWJiciA9IGVyYXNbaV0uYWJici50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgbmFycm93ID0gZXJhc1tpXS5uYXJyb3cudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ04nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OTic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJiciA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk5OTic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk5OTk4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hcnJvdyA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChbbmFtZSwgYWJiciwgbmFycm93XS5pbmRleE9mKGVyYU5hbWUpID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUVyYXNDb252ZXJ0WWVhcihlcmEsIHllYXIpIHtcbiAgICAgICAgdmFyIGRpciA9IGVyYS5zaW5jZSA8PSBlcmEudW50aWwgPyArMSA6IC0xO1xuICAgICAgICBpZiAoeWVhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaG9va3MoZXJhLnNpbmNlKS55ZWFyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaG9va3MoZXJhLnNpbmNlKS55ZWFyKCkgKyAoeWVhciAtIGVyYS5vZmZzZXQpICogZGlyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhTmFtZSgpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoZXJhc1tpXS5zaW5jZSA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFOYXJyb3coKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFycm93O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFycm93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYUFiYnIoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0uYWJicjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLmFiYnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhWWVhcigpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZGlyLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBkaXIgPSBlcmFzW2ldLnNpbmNlIDw9IGVyYXNbaV0udW50aWwgPyArMSA6IC0xO1xuXG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB8fFxuICAgICAgICAgICAgICAgIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnllYXIoKSAtIGhvb2tzKGVyYXNbaV0uc2luY2UpLnllYXIoKSkgKiBkaXIgK1xuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLm9mZnNldFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy55ZWFyKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJhc05hbWVSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19lcmFzTmFtZVJlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVFcmFzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyB0aGlzLl9lcmFzTmFtZVJlZ2V4IDogdGhpcy5fZXJhc1JlZ2V4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVyYXNBYmJyUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc0FiYnJSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlRXJhc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID8gdGhpcy5fZXJhc0FiYnJSZWdleCA6IHRoaXMuX2VyYXNSZWdleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcmFzTmFycm93UmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc05hcnJvd1JlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVFcmFzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyB0aGlzLl9lcmFzTmFycm93UmVnZXggOiB0aGlzLl9lcmFzUmVnZXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFBYmJyKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzQWJiclJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYU5hbWUoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmVyYXNOYW1lUmVnZXgoaXNTdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhTmFycm93KGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzTmFycm93UmVnZXgoaXNTdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhWWVhck9yZGluYWwoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4IHx8IG1hdGNoVW5zaWduZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZUVyYXNQYXJzZSgpIHtcbiAgICAgICAgdmFyIGFiYnJQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG5hbWVQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG5hcnJvd1BpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZXJhc05hbWUsXG4gICAgICAgICAgICBlcmFzQWJicixcbiAgICAgICAgICAgIGVyYXNOYXJyb3csXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5lcmFzKCk7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBlcmFzTmFtZSA9IHJlZ2V4RXNjYXBlKGVyYXNbaV0ubmFtZSk7XG4gICAgICAgICAgICBlcmFzQWJiciA9IHJlZ2V4RXNjYXBlKGVyYXNbaV0uYWJicik7XG4gICAgICAgICAgICBlcmFzTmFycm93ID0gcmVnZXhFc2NhcGUoZXJhc1tpXS5uYXJyb3cpO1xuXG4gICAgICAgICAgICBuYW1lUGllY2VzLnB1c2goZXJhc05hbWUpO1xuICAgICAgICAgICAgYWJiclBpZWNlcy5wdXNoKGVyYXNBYmJyKTtcbiAgICAgICAgICAgIG5hcnJvd1BpZWNlcy5wdXNoKGVyYXNOYXJyb3cpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChlcmFzTmFtZSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGVyYXNBYmJyKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goZXJhc05hcnJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lcmFzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX2VyYXNOYW1lUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBuYW1lUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fZXJhc0FiYnJSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGFiYnJQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9lcmFzTmFycm93UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIG5hcnJvd1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ2dnJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnR0cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1llYXJGb3JtYXRUb2tlbih0b2tlbiwgZ2V0dGVyKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKDAsIFt0b2tlbiwgdG9rZW4ubGVuZ3RoXSwgMCwgZ2V0dGVyKTtcbiAgICB9XG5cbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnJywgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZ2cnLCAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHR0cnLCAnaXNvV2Vla1llYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0cnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignZycsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdHRycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdnZycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2cnLCBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHR0cnLCBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZ2cnLCBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihcbiAgICAgICAgWydnZ2dnJywgJ2dnZ2dnJywgJ0dHR0cnLCAnR0dHR0cnXSxcbiAgICAgICAgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAyKV0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZycsICdHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHRoaXMud2VlaygpLFxuICAgICAgICAgICAgdGhpcy53ZWVrZGF5KCkgKyB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3lcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrWWVhcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHRoaXMuaXNvV2VlaygpLFxuICAgICAgICAgICAgdGhpcy5pc29XZWVrZGF5KCksXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgNFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElTT1dlZWtzSW5ZZWFyKCkge1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElTT1dlZWtzSW5JU09XZWVrWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMuaXNvV2Vla1llYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0V2Vla3NJblllYXIoKSB7XG4gICAgICAgIHZhciB3ZWVrSW5mbyA9IHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrO1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXZWVrc0luV2Vla1llYXIoKSB7XG4gICAgICAgIHZhciB3ZWVrSW5mbyA9IHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrO1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy53ZWVrWWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXJIZWxwZXIoaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrc1RhcmdldDtcbiAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKHRoaXMsIGRvdywgZG95KS55ZWFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2Vla3NUYXJnZXQgPSB3ZWVrc0luWWVhcihpbnB1dCwgZG93LCBkb3kpO1xuICAgICAgICAgICAgaWYgKHdlZWsgPiB3ZWVrc1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHdlZWsgPSB3ZWVrc1RhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZXRXZWVrQWxsLmNhbGwodGhpcywgaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFdlZWtBbGwod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXJEYXRhID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZShkYXlPZlllYXJEYXRhLnllYXIsIDAsIGRheU9mWWVhckRhdGEuZGF5T2ZZZWFyKTtcblxuICAgICAgICB0aGlzLnllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpKTtcbiAgICAgICAgdGhpcy5tb250aChkYXRlLmdldFVUQ01vbnRoKCkpO1xuICAgICAgICB0aGlzLmRhdGUoZGF0ZS5nZXRVVENEYXRlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUScsIDAsICdRbycsICdxdWFydGVyJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdRJywgbWF0Y2gxKTtcbiAgICBhZGRQYXJzZVRva2VuKCdRJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSAodG9JbnQoaW5wdXQpIC0gMSkgKiAzO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0UXVhcnRlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbFxuICAgICAgICAgICAgPyBNYXRoLmNlaWwoKHRoaXMubW9udGgoKSArIDEpIC8gMylcbiAgICAgICAgICAgIDogdGhpcy5tb250aCgoaW5wdXQgLSAxKSAqIDMgKyAodGhpcy5tb250aCgpICUgMykpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEJywgWydERCcsIDJdLCAnRG8nLCAnZGF0ZScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRCcsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignREQnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignRG8nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHJldHVybiBpc1N0cmljdFxuICAgICAgICAgICAgPyBsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2UgfHwgbG9jYWxlLl9vcmRpbmFsUGFyc2VcbiAgICAgICAgICAgIDogbG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudDtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydEJywgJ0REJ10sIERBVEUpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtEQVRFXSA9IHRvSW50KGlucHV0Lm1hdGNoKG1hdGNoMXRvMilbMF0pO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldERheU9mTW9udGggPSBtYWtlR2V0U2V0KCdEYXRlJywgdHJ1ZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignREREJywgWydEREREJywgM10sICdERERvJywgJ2RheU9mWWVhcicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignREREJywgbWF0Y2gxdG8zKTtcbiAgICBhZGRSZWdleFRva2VuKCdEREREJywgbWF0Y2gzKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnREREJywgJ0REREQnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZZZWFyKGlucHV0KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXIgPVxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAodGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpIC0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNVxuICAgICAgICAgICAgKSArIDE7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gZGF5T2ZZZWFyIDogdGhpcy5hZGQoaW5wdXQgLSBkYXlPZlllYXIsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ20nLCBbJ21tJywgMl0sIDAsICdtaW51dGUnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ20nLCBtYXRjaDF0bzIsIG1hdGNoMXRvMkhhc1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ21tJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydtJywgJ21tJ10sIE1JTlVURSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWludXRlID0gbWFrZUdldFNldCgnTWludXRlcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdzJywgWydzcycsIDJdLCAwLCAnc2Vjb25kJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdzJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJIYXNaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdzcycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsncycsICdzcyddLCBTRUNPTkQpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFNlY29uZCA9IG1ha2VHZXRTZXQoJ1NlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTJywgM10sIDAsICdtaWxsaXNlY29uZCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTUycsIDRdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTJywgNV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTUycsIDZdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTUycsIDddLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTJywgOF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTUycsIDldLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDAwO1xuICAgIH0pO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUycsIG1hdGNoMXRvMywgbWF0Y2gxKTtcbiAgICBhZGRSZWdleFRva2VuKCdTUycsIG1hdGNoMXRvMywgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdTU1MnLCBtYXRjaDF0bzMsIG1hdGNoMyk7XG5cbiAgICB2YXIgdG9rZW4sIGdldFNldE1pbGxpc2Vjb25kO1xuICAgIGZvciAodG9rZW4gPSAnU1NTUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUmVnZXhUb2tlbih0b2tlbiwgbWF0Y2hVbnNpZ25lZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VNcyhpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTUlMTElTRUNPTkRdID0gdG9JbnQoKCcwLicgKyBpbnB1dCkgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmb3IgKHRva2VuID0gJ1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIHBhcnNlTXMpO1xuICAgIH1cblxuICAgIGdldFNldE1pbGxpc2Vjb25kID0gbWFrZUdldFNldCgnTWlsbGlzZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3onLCAwLCAwLCAnem9uZUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignenonLCAwLCAwLCAnem9uZU5hbWUnKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFpvbmVBYmJyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFpvbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUnIDogJyc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gTW9tZW50LnByb3RvdHlwZTtcblxuICAgIHByb3RvLmFkZCA9IGFkZDtcbiAgICBwcm90by5jYWxlbmRhciA9IGNhbGVuZGFyJDE7XG4gICAgcHJvdG8uY2xvbmUgPSBjbG9uZTtcbiAgICBwcm90by5kaWZmID0gZGlmZjtcbiAgICBwcm90by5lbmRPZiA9IGVuZE9mO1xuICAgIHByb3RvLmZvcm1hdCA9IGZvcm1hdDtcbiAgICBwcm90by5mcm9tID0gZnJvbTtcbiAgICBwcm90by5mcm9tTm93ID0gZnJvbU5vdztcbiAgICBwcm90by50byA9IHRvO1xuICAgIHByb3RvLnRvTm93ID0gdG9Ob3c7XG4gICAgcHJvdG8uZ2V0ID0gc3RyaW5nR2V0O1xuICAgIHByb3RvLmludmFsaWRBdCA9IGludmFsaWRBdDtcbiAgICBwcm90by5pc0FmdGVyID0gaXNBZnRlcjtcbiAgICBwcm90by5pc0JlZm9yZSA9IGlzQmVmb3JlO1xuICAgIHByb3RvLmlzQmV0d2VlbiA9IGlzQmV0d2VlbjtcbiAgICBwcm90by5pc1NhbWUgPSBpc1NhbWU7XG4gICAgcHJvdG8uaXNTYW1lT3JBZnRlciA9IGlzU2FtZU9yQWZ0ZXI7XG4gICAgcHJvdG8uaXNTYW1lT3JCZWZvcmUgPSBpc1NhbWVPckJlZm9yZTtcbiAgICBwcm90by5pc1ZhbGlkID0gaXNWYWxpZCQyO1xuICAgIHByb3RvLmxhbmcgPSBsYW5nO1xuICAgIHByb3RvLmxvY2FsZSA9IGxvY2FsZTtcbiAgICBwcm90by5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcbiAgICBwcm90by5tYXggPSBwcm90b3R5cGVNYXg7XG4gICAgcHJvdG8ubWluID0gcHJvdG90eXBlTWluO1xuICAgIHByb3RvLnBhcnNpbmdGbGFncyA9IHBhcnNpbmdGbGFncztcbiAgICBwcm90by5zZXQgPSBzdHJpbmdTZXQ7XG4gICAgcHJvdG8uc3RhcnRPZiA9IHN0YXJ0T2Y7XG4gICAgcHJvdG8uc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBwcm90by50b0FycmF5ID0gdG9BcnJheTtcbiAgICBwcm90by50b09iamVjdCA9IHRvT2JqZWN0O1xuICAgIHByb3RvLnRvRGF0ZSA9IHRvRGF0ZTtcbiAgICBwcm90by50b0lTT1N0cmluZyA9IHRvSVNPU3RyaW5nO1xuICAgIHByb3RvLmluc3BlY3QgPSBpbnNwZWN0O1xuICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuZm9yICE9IG51bGwpIHtcbiAgICAgICAgcHJvdG9bU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ01vbWVudDwnICsgdGhpcy5mb3JtYXQoKSArICc+JztcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHJvdG8udG9KU09OID0gdG9KU09OO1xuICAgIHByb3RvLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgcHJvdG8udW5peCA9IHVuaXg7XG4gICAgcHJvdG8udmFsdWVPZiA9IHZhbHVlT2Y7XG4gICAgcHJvdG8uY3JlYXRpb25EYXRhID0gY3JlYXRpb25EYXRhO1xuICAgIHByb3RvLmVyYU5hbWUgPSBnZXRFcmFOYW1lO1xuICAgIHByb3RvLmVyYU5hcnJvdyA9IGdldEVyYU5hcnJvdztcbiAgICBwcm90by5lcmFBYmJyID0gZ2V0RXJhQWJicjtcbiAgICBwcm90by5lcmFZZWFyID0gZ2V0RXJhWWVhcjtcbiAgICBwcm90by55ZWFyID0gZ2V0U2V0WWVhcjtcbiAgICBwcm90by5pc0xlYXBZZWFyID0gZ2V0SXNMZWFwWWVhcjtcbiAgICBwcm90by53ZWVrWWVhciA9IGdldFNldFdlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtZZWFyID0gZ2V0U2V0SVNPV2Vla1llYXI7XG4gICAgcHJvdG8ucXVhcnRlciA9IHByb3RvLnF1YXJ0ZXJzID0gZ2V0U2V0UXVhcnRlcjtcbiAgICBwcm90by5tb250aCA9IGdldFNldE1vbnRoO1xuICAgIHByb3RvLmRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG4gICAgcHJvdG8ud2VlayA9IHByb3RvLndlZWtzID0gZ2V0U2V0V2VlaztcbiAgICBwcm90by5pc29XZWVrID0gcHJvdG8uaXNvV2Vla3MgPSBnZXRTZXRJU09XZWVrO1xuICAgIHByb3RvLndlZWtzSW5ZZWFyID0gZ2V0V2Vla3NJblllYXI7XG4gICAgcHJvdG8ud2Vla3NJbldlZWtZZWFyID0gZ2V0V2Vla3NJbldlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtzSW5ZZWFyID0gZ2V0SVNPV2Vla3NJblllYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJbklTT1dlZWtZZWFyID0gZ2V0SVNPV2Vla3NJbklTT1dlZWtZZWFyO1xuICAgIHByb3RvLmRhdGUgPSBnZXRTZXREYXlPZk1vbnRoO1xuICAgIHByb3RvLmRheSA9IHByb3RvLmRheXMgPSBnZXRTZXREYXlPZldlZWs7XG4gICAgcHJvdG8ud2Vla2RheSA9IGdldFNldExvY2FsZURheU9mV2VlaztcbiAgICBwcm90by5pc29XZWVrZGF5ID0gZ2V0U2V0SVNPRGF5T2ZXZWVrO1xuICAgIHByb3RvLmRheU9mWWVhciA9IGdldFNldERheU9mWWVhcjtcbiAgICBwcm90by5ob3VyID0gcHJvdG8uaG91cnMgPSBnZXRTZXRIb3VyO1xuICAgIHByb3RvLm1pbnV0ZSA9IHByb3RvLm1pbnV0ZXMgPSBnZXRTZXRNaW51dGU7XG4gICAgcHJvdG8uc2Vjb25kID0gcHJvdG8uc2Vjb25kcyA9IGdldFNldFNlY29uZDtcbiAgICBwcm90by5taWxsaXNlY29uZCA9IHByb3RvLm1pbGxpc2Vjb25kcyA9IGdldFNldE1pbGxpc2Vjb25kO1xuICAgIHByb3RvLnV0Y09mZnNldCA9IGdldFNldE9mZnNldDtcbiAgICBwcm90by51dGMgPSBzZXRPZmZzZXRUb1VUQztcbiAgICBwcm90by5sb2NhbCA9IHNldE9mZnNldFRvTG9jYWw7XG4gICAgcHJvdG8ucGFyc2Vab25lID0gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQ7XG4gICAgcHJvdG8uaGFzQWxpZ25lZEhvdXJPZmZzZXQgPSBoYXNBbGlnbmVkSG91ck9mZnNldDtcbiAgICBwcm90by5pc0RTVCA9IGlzRGF5bGlnaHRTYXZpbmdUaW1lO1xuICAgIHByb3RvLmlzTG9jYWwgPSBpc0xvY2FsO1xuICAgIHByb3RvLmlzVXRjT2Zmc2V0ID0gaXNVdGNPZmZzZXQ7XG4gICAgcHJvdG8uaXNVdGMgPSBpc1V0YztcbiAgICBwcm90by5pc1VUQyA9IGlzVXRjO1xuICAgIHByb3RvLnpvbmVBYmJyID0gZ2V0Wm9uZUFiYnI7XG4gICAgcHJvdG8uem9uZU5hbWUgPSBnZXRab25lTmFtZTtcbiAgICBwcm90by5kYXRlcyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ2RhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0U2V0RGF5T2ZNb250aFxuICAgICk7XG4gICAgcHJvdG8ubW9udGhzID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9udGhzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb250aCBpbnN0ZWFkJyxcbiAgICAgICAgZ2V0U2V0TW9udGhcbiAgICApO1xuICAgIHByb3RvLnllYXJzID0gZGVwcmVjYXRlKFxuICAgICAgICAneWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZCcsXG4gICAgICAgIGdldFNldFllYXJcbiAgICApO1xuICAgIHByb3RvLnpvbmUgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lLycsXG4gICAgICAgIGdldFNldFpvbmVcbiAgICApO1xuICAgIHByb3RvLmlzRFNUU2hpZnRlZCA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ2lzRFNUU2hpZnRlZCBpcyBkZXByZWNhdGVkLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kc3Qtc2hpZnRlZC8gZm9yIG1vcmUgaW5mb3JtYXRpb24nLFxuICAgICAgICBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWRcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlVW5peChpbnB1dCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJblpvbmUoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpLnBhcnNlWm9uZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZVBhcnNlUG9zdEZvcm1hdChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMSA9IExvY2FsZS5wcm90b3R5cGU7XG5cbiAgICBwcm90byQxLmNhbGVuZGFyID0gY2FsZW5kYXI7XG4gICAgcHJvdG8kMS5sb25nRGF0ZUZvcm1hdCA9IGxvbmdEYXRlRm9ybWF0O1xuICAgIHByb3RvJDEuaW52YWxpZERhdGUgPSBpbnZhbGlkRGF0ZTtcbiAgICBwcm90byQxLm9yZGluYWwgPSBvcmRpbmFsO1xuICAgIHByb3RvJDEucHJlcGFyc2UgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5wb3N0Zm9ybWF0ID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucmVsYXRpdmVUaW1lID0gcmVsYXRpdmVUaW1lO1xuICAgIHByb3RvJDEucGFzdEZ1dHVyZSA9IHBhc3RGdXR1cmU7XG4gICAgcHJvdG8kMS5zZXQgPSBzZXQ7XG4gICAgcHJvdG8kMS5lcmFzID0gbG9jYWxlRXJhcztcbiAgICBwcm90byQxLmVyYXNQYXJzZSA9IGxvY2FsZUVyYXNQYXJzZTtcbiAgICBwcm90byQxLmVyYXNDb252ZXJ0WWVhciA9IGxvY2FsZUVyYXNDb252ZXJ0WWVhcjtcbiAgICBwcm90byQxLmVyYXNBYmJyUmVnZXggPSBlcmFzQWJiclJlZ2V4O1xuICAgIHByb3RvJDEuZXJhc05hbWVSZWdleCA9IGVyYXNOYW1lUmVnZXg7XG4gICAgcHJvdG8kMS5lcmFzTmFycm93UmVnZXggPSBlcmFzTmFycm93UmVnZXg7XG5cbiAgICBwcm90byQxLm1vbnRocyA9IGxvY2FsZU1vbnRocztcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0ID0gbG9jYWxlTW9udGhzU2hvcnQ7XG4gICAgcHJvdG8kMS5tb250aHNQYXJzZSA9IGxvY2FsZU1vbnRoc1BhcnNlO1xuICAgIHByb3RvJDEubW9udGhzUmVnZXggPSBtb250aHNSZWdleDtcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0UmVnZXggPSBtb250aHNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2VlayA9IGxvY2FsZVdlZWs7XG4gICAgcHJvdG8kMS5maXJzdERheU9mWWVhciA9IGxvY2FsZUZpcnN0RGF5T2ZZZWFyO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZldlZWsgPSBsb2NhbGVGaXJzdERheU9mV2VlaztcblxuICAgIHByb3RvJDEud2Vla2RheXMgPSBsb2NhbGVXZWVrZGF5cztcbiAgICBwcm90byQxLndlZWtkYXlzTWluID0gbG9jYWxlV2Vla2RheXNNaW47XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0ID0gbG9jYWxlV2Vla2RheXNTaG9ydDtcbiAgICBwcm90byQxLndlZWtkYXlzUGFyc2UgPSBsb2NhbGVXZWVrZGF5c1BhcnNlO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5c1JlZ2V4ID0gd2Vla2RheXNSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnRSZWdleCA9IHdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzTWluUmVnZXggPSB3ZWVrZGF5c01pblJlZ2V4O1xuXG4gICAgcHJvdG8kMS5pc1BNID0gbG9jYWxlSXNQTTtcbiAgICBwcm90byQxLm1lcmlkaWVtID0gbG9jYWxlTWVyaWRpZW07XG5cbiAgICBmdW5jdGlvbiBnZXQkMShmb3JtYXQsIGluZGV4LCBmaWVsZCwgc2V0dGVyKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHV0YyA9IGNyZWF0ZVVUQygpLnNldChzZXR0ZXIsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGxvY2FsZVtmaWVsZF0odXRjLCBmb3JtYXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIGksIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIC8vICgpXG4gICAgLy8gKDUpXG4gICAgLy8gKGZtdCwgNSlcbiAgICAvLyAoZm10KVxuICAgIC8vICh0cnVlKVxuICAgIC8vICh0cnVlLCA1KVxuICAgIC8vICh0cnVlLCBmbXQsIDUpXG4gICAgLy8gKHRydWUsIGZtdClcbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGVTb3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGxvY2FsZVNvcnRlZDtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgbG9jYWxlU29ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9jYWxlID0gZ2V0TG9jYWxlKCksXG4gICAgICAgICAgICBzaGlmdCA9IGxvY2FsZVNvcnRlZCA/IGxvY2FsZS5fd2Vlay5kb3cgOiAwLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG91dCA9IFtdO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCAoaW5kZXggKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCAoaSArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzU2hvcnQoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRoc1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5cycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c1Nob3J0KGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzTWluKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c01pbicpO1xuICAgIH1cblxuICAgIGdldFNldEdsb2JhbExvY2FsZSgnZW4nLCB7XG4gICAgICAgIGVyYXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzAwMDEtMDEtMDEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiArSW5maW5pdHksXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdBbm5vIERvbWluaScsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQUQnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdBRCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMC0xMi0zMScsXG4gICAgICAgICAgICAgICAgdW50aWw6IC1JbmZpbml0eSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0JlZm9yZSBDaHJpc3QnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ0JDJyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnQkMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgdG9JbnQoKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuICAgIGhvb2tzLmxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLicsXG4gICAgICAgIGdldFNldEdsb2JhbExvY2FsZVxuICAgICk7XG4gICAgaG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQubGFuZ0RhdGEgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGVEYXRhIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0TG9jYWxlXG4gICAgKTtcblxuICAgIHZhciBtYXRoQWJzID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBhYnMoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSBtYXRoQWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgICAgIHRoaXMuX2RheXMgPSBtYXRoQWJzKHRoaXMuX2RheXMpO1xuICAgICAgICB0aGlzLl9tb250aHMgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtYXRoQWJzKGRhdGEubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzID0gbWF0aEFicyhkYXRhLnNlY29uZHMpO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgPSBtYXRoQWJzKGRhdGEubWludXRlcyk7XG4gICAgICAgIGRhdGEuaG91cnMgPSBtYXRoQWJzKGRhdGEuaG91cnMpO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1hdGhBYnMoZGF0YS5tb250aHMpO1xuICAgICAgICBkYXRhLnllYXJzID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCQxKGR1cmF0aW9uLCBpbnB1dCwgdmFsdWUsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgICAgIGR1cmF0aW9uLl9taWxsaXNlY29uZHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgZHVyYXRpb24uX2RheXMgKz0gZGlyZWN0aW9uICogb3RoZXIuX2RheXM7XG4gICAgICAgIGR1cmF0aW9uLl9tb250aHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21vbnRocztcblxuICAgICAgICByZXR1cm4gZHVyYXRpb24uX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBhZGQkMShpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAxKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBzdWJ0cmFjdCgxLCAncycpIG9yIHN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIHN1YnRyYWN0JDEoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgLTEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0NlaWwobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnViYmxlKCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMsXG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMsXG4gICAgICAgICAgICBkYXRhID0gdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHNlY29uZHMsXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICB5ZWFycyxcbiAgICAgICAgICAgIG1vbnRoc0Zyb21EYXlzO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAgICAgLy8gY2hlY2s6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yMTY2XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA+PSAwICYmIGRheXMgPj0gMCAmJiBtb250aHMgPj0gMCkgfHxcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzIDw9IDAgJiYgZGF5cyA8PSAwICYmIG1vbnRocyA8PSAwKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyArPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHMpICsgZGF5cykgKiA4NjRlNTtcbiAgICAgICAgICAgIGRheXMgPSAwO1xuICAgICAgICAgICAgbW9udGhzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBidWJibGVzIHVwIHZhbHVlcywgc2VlIHRoZSB0ZXN0cyBmb3JcbiAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XG5cbiAgICAgICAgc2Vjb25kcyA9IGFic0Zsb29yKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgICAgICBkYXRhLnNlY29uZHMgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgbWludXRlcyA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGRhdGEubWludXRlcyA9IG1pbnV0ZXMgJSA2MDtcblxuICAgICAgICBob3VycyA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIGRhdGEuaG91cnMgPSBob3VycyAlIDI0O1xuXG4gICAgICAgIGRheXMgKz0gYWJzRmxvb3IoaG91cnMgLyAyNCk7XG5cbiAgICAgICAgLy8gY29udmVydCBkYXlzIHRvIG1vbnRoc1xuICAgICAgICBtb250aHNGcm9tRGF5cyA9IGFic0Zsb29yKGRheXNUb01vbnRocyhkYXlzKSk7XG4gICAgICAgIG1vbnRocyArPSBtb250aHNGcm9tRGF5cztcbiAgICAgICAgZGF5cyAtPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHNGcm9tRGF5cykpO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuICAgICAgICBkYXRhLmRheXMgPSBkYXlzO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1vbnRocztcbiAgICAgICAgZGF0YS55ZWFycyA9IHllYXJzO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNUb01vbnRocyhkYXlzKSB7XG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDE0NjA5NyBkYXlzICh0YWtpbmcgaW50byBhY2NvdW50IGxlYXAgeWVhciBydWxlcylcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTIgbW9udGhzID09PSA0ODAwXG4gICAgICAgIHJldHVybiAoZGF5cyAqIDQ4MDApIC8gMTQ2MDk3O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1RvRGF5cyhtb250aHMpIHtcbiAgICAgICAgLy8gdGhlIHJldmVyc2Ugb2YgZGF5c1RvTW9udGhzXG4gICAgICAgIHJldHVybiAobW9udGhzICogMTQ2MDk3KSAvIDQ4MDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXModW5pdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5cyxcbiAgICAgICAgICAgIG1vbnRocyxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBpZiAodW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICdxdWFydGVyJyB8fCB1bml0cyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzICsgZGF5c1RvTW9udGhzKGRheXMpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocztcbiAgICAgICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocyAvIDM7XG4gICAgICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb250aHMgLyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBtaWxsaXNlY29uZHMgc2VwYXJhdGVseSBiZWNhdXNlIG9mIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChpc3N1ZSAjMTg2NylcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgTWF0aC5yb3VuZChtb250aHNUb0RheXModGhpcy5fbW9udGhzKSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzIC8gNyArIG1pbGxpc2Vjb25kcyAvIDYwNDhlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDI0ICsgbWlsbGlzZWNvbmRzIC8gMzZlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDE0NDAgKyBtaWxsaXNlY29uZHMgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgKiA4NjQwMCArIG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgICAgICAgICAgICAgLy8gTWF0aC5mbG9vciBwcmV2ZW50cyBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyBoZXJlXG4gICAgICAgICAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihkYXlzICogODY0ZTUpICsgbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB1bml0ICcgKyB1bml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlQXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFzKGFsaWFzKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgYXNNaWxsaXNlY29uZHMgPSBtYWtlQXMoJ21zJyksXG4gICAgICAgIGFzU2Vjb25kcyA9IG1ha2VBcygncycpLFxuICAgICAgICBhc01pbnV0ZXMgPSBtYWtlQXMoJ20nKSxcbiAgICAgICAgYXNIb3VycyA9IG1ha2VBcygnaCcpLFxuICAgICAgICBhc0RheXMgPSBtYWtlQXMoJ2QnKSxcbiAgICAgICAgYXNXZWVrcyA9IG1ha2VBcygndycpLFxuICAgICAgICBhc01vbnRocyA9IG1ha2VBcygnTScpLFxuICAgICAgICBhc1F1YXJ0ZXJzID0gbWFrZUFzKCdRJyksXG4gICAgICAgIGFzWWVhcnMgPSBtYWtlQXMoJ3knKSxcbiAgICAgICAgdmFsdWVPZiQxID0gYXNNaWxsaXNlY29uZHM7XG5cbiAgICBmdW5jdGlvbiBjbG9uZSQxKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXNbdW5pdHMgKyAncyddKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldHRlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9kYXRhW25hbWVdIDogTmFOO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtYWtlR2V0dGVyKCdtaWxsaXNlY29uZHMnKSxcbiAgICAgICAgc2Vjb25kcyA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKSxcbiAgICAgICAgbWludXRlcyA9IG1ha2VHZXR0ZXIoJ21pbnV0ZXMnKSxcbiAgICAgICAgaG91cnMgPSBtYWtlR2V0dGVyKCdob3VycycpLFxuICAgICAgICBkYXlzID0gbWFrZUdldHRlcignZGF5cycpLFxuICAgICAgICBtb250aHMgPSBtYWtlR2V0dGVyKCdtb250aHMnKSxcbiAgICAgICAgeWVhcnMgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MoKSB7XG4gICAgICAgIHJldHVybiBhYnNGbG9vcih0aGlzLmRheXMoKSAvIDcpO1xuICAgIH1cblxuICAgIHZhciByb3VuZCA9IE1hdGgucm91bmQsXG4gICAgICAgIHRocmVzaG9sZHMgPSB7XG4gICAgICAgICAgICBzczogNDQsIC8vIGEgZmV3IHNlY29uZHMgdG8gc2Vjb25kc1xuICAgICAgICAgICAgczogNDUsIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgICAgICAgICBtOiA0NSwgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgICAgICBoOiAyMiwgLy8gaG91cnMgdG8gZGF5XG4gICAgICAgICAgICBkOiAyNiwgLy8gZGF5cyB0byBtb250aC93ZWVrXG4gICAgICAgICAgICB3OiBudWxsLCAvLyB3ZWVrcyB0byBtb250aFxuICAgICAgICAgICAgTTogMTEsIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgICAgIH07XG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIG1vbWVudC5mbi5mcm9tLCBtb21lbnQuZm4uZnJvbU5vdywgYW5kIG1vbWVudC5kdXJhdGlvbi5mbi5odW1hbml6ZVxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGVUaW1lQWdvKHN0cmluZywgbnVtYmVyLCB3aXRob3V0U3VmZml4LCBpc0Z1dHVyZSwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUucmVsYXRpdmVUaW1lKG51bWJlciB8fCAxLCAhIXdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZSQxKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCB0aHJlc2hvbGRzLCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpLFxuICAgICAgICAgICAgc2Vjb25kcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdzJykpLFxuICAgICAgICAgICAgbWludXRlcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdtJykpLFxuICAgICAgICAgICAgaG91cnMgPSByb3VuZChkdXJhdGlvbi5hcygnaCcpKSxcbiAgICAgICAgICAgIGRheXMgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKSxcbiAgICAgICAgICAgIG1vbnRocyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdNJykpLFxuICAgICAgICAgICAgd2Vla3MgPSByb3VuZChkdXJhdGlvbi5hcygndycpKSxcbiAgICAgICAgICAgIHllYXJzID0gcm91bmQoZHVyYXRpb24uYXMoJ3knKSksXG4gICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICAoc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdKSB8fFxuICAgICAgICAgICAgICAgIChzZWNvbmRzIDwgdGhyZXNob2xkcy5zICYmIFsnc3MnLCBzZWNvbmRzXSkgfHxcbiAgICAgICAgICAgICAgICAobWludXRlcyA8PSAxICYmIFsnbSddKSB8fFxuICAgICAgICAgICAgICAgIChtaW51dGVzIDwgdGhyZXNob2xkcy5tICYmIFsnbW0nLCBtaW51dGVzXSkgfHxcbiAgICAgICAgICAgICAgICAoaG91cnMgPD0gMSAmJiBbJ2gnXSkgfHxcbiAgICAgICAgICAgICAgICAoaG91cnMgPCB0aHJlc2hvbGRzLmggJiYgWydoaCcsIGhvdXJzXSkgfHxcbiAgICAgICAgICAgICAgICAoZGF5cyA8PSAxICYmIFsnZCddKSB8fFxuICAgICAgICAgICAgICAgIChkYXlzIDwgdGhyZXNob2xkcy5kICYmIFsnZGQnLCBkYXlzXSk7XG5cbiAgICAgICAgaWYgKHRocmVzaG9sZHMudyAhPSBudWxsKSB7XG4gICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICBhIHx8XG4gICAgICAgICAgICAgICAgKHdlZWtzIDw9IDEgJiYgWyd3J10pIHx8XG4gICAgICAgICAgICAgICAgKHdlZWtzIDwgdGhyZXNob2xkcy53ICYmIFsnd3cnLCB3ZWVrc10pO1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhIHx8XG4gICAgICAgICAgICAobW9udGhzIDw9IDEgJiYgWydNJ10pIHx8XG4gICAgICAgICAgICAobW9udGhzIDwgdGhyZXNob2xkcy5NICYmIFsnTU0nLCBtb250aHNdKSB8fFxuICAgICAgICAgICAgKHllYXJzIDw9IDEgJiYgWyd5J10pIHx8IFsneXknLCB5ZWFyc107XG5cbiAgICAgICAgYVsyXSA9IHdpdGhvdXRTdWZmaXg7XG4gICAgICAgIGFbM10gPSArcG9zTmVnRHVyYXRpb24gPiAwO1xuICAgICAgICBhWzRdID0gbG9jYWxlO1xuICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZVRpbWVBZ28uYXBwbHkobnVsbCwgYSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCB0aGUgcm91bmRpbmcgZnVuY3Rpb24gZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygcm91bmRpbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcm91bmQgPSByb3VuZGluZ0Z1bmN0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZCh0aHJlc2hvbGQsIGxpbWl0KSB7XG4gICAgICAgIGlmICh0aHJlc2hvbGRzW3RocmVzaG9sZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyZXNob2xkc1t0aHJlc2hvbGRdO1xuICAgICAgICB9XG4gICAgICAgIHRocmVzaG9sZHNbdGhyZXNob2xkXSA9IGxpbWl0O1xuICAgICAgICBpZiAodGhyZXNob2xkID09PSAncycpIHtcbiAgICAgICAgICAgIHRocmVzaG9sZHMuc3MgPSBsaW1pdCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaHVtYW5pemUoYXJnV2l0aFN1ZmZpeCwgYXJnVGhyZXNob2xkcykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3aXRoU3VmZml4ID0gZmFsc2UsXG4gICAgICAgICAgICB0aCA9IHRocmVzaG9sZHMsXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdXaXRoU3VmZml4ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgYXJnVGhyZXNob2xkcyA9IGFyZ1dpdGhTdWZmaXg7XG4gICAgICAgICAgICBhcmdXaXRoU3VmZml4ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdXaXRoU3VmZml4ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHdpdGhTdWZmaXggPSBhcmdXaXRoU3VmZml4O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnVGhyZXNob2xkcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoID0gT2JqZWN0LmFzc2lnbih7fSwgdGhyZXNob2xkcywgYXJnVGhyZXNob2xkcyk7XG4gICAgICAgICAgICBpZiAoYXJnVGhyZXNob2xkcy5zICE9IG51bGwgJiYgYXJnVGhyZXNob2xkcy5zcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGguc3MgPSBhcmdUaHJlc2hvbGRzLnMgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxlID0gdGhpcy5sb2NhbGVEYXRhKCk7XG4gICAgICAgIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCB0aCwgbG9jYWxlKTtcblxuICAgICAgICBpZiAod2l0aFN1ZmZpeCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gbG9jYWxlLnBhc3RGdXR1cmUoK3RoaXMsIG91dHB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG9jYWxlLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgYWJzJDEgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIHNpZ24oeCkge1xuICAgICAgICByZXR1cm4gKHggPiAwKSAtICh4IDwgMCkgfHwgK3g7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmckMSgpIHtcbiAgICAgICAgLy8gZm9yIElTTyBzdHJpbmdzIHdlIGRvIG5vdCB1c2UgdGhlIG5vcm1hbCBidWJibGluZyBydWxlczpcbiAgICAgICAgLy8gICogbWlsbGlzZWNvbmRzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSBob3Vyc1xuICAgICAgICAvLyAgKiBkYXlzIGRvIG5vdCBidWJibGUgYXQgYWxsXG4gICAgICAgIC8vICAqIG1vbnRocyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgeWVhcnNcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRleHQtZnJlZSBjb252ZXJzaW9uIGJldHdlZW4gaG91cnMgYW5kIGRheXNcbiAgICAgICAgLy8gKHRoaW5rIG9mIGNsb2NrIGNoYW5nZXMpXG4gICAgICAgIC8vIGFuZCBhbHNvIG5vdCBiZXR3ZWVuIGRheXMgYW5kIG1vbnRocyAoMjgtMzEgZGF5cyBwZXIgbW9udGgpXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlY29uZHMgPSBhYnMkMSh0aGlzLl9taWxsaXNlY29uZHMpIC8gMTAwMCxcbiAgICAgICAgICAgIGRheXMgPSBhYnMkMSh0aGlzLl9kYXlzKSxcbiAgICAgICAgICAgIG1vbnRocyA9IGFicyQxKHRoaXMuX21vbnRocyksXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICB5ZWFycyxcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCksXG4gICAgICAgICAgICB0b3RhbFNpZ24sXG4gICAgICAgICAgICB5bVNpZ24sXG4gICAgICAgICAgICBkYXlzU2lnbixcbiAgICAgICAgICAgIGhtc1NpZ247XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBob3VycyA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIHNlY29uZHMgJT0gNjA7XG4gICAgICAgIG1pbnV0ZXMgJT0gNjA7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIC8vIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9kb3JkaWxsZS9tb21lbnQtaXNvZHVyYXRpb24vYmxvYi9tYXN0ZXIvbW9tZW50Lmlzb2R1cmF0aW9uLmpzXG4gICAgICAgIHMgPSBzZWNvbmRzID8gc2Vjb25kcy50b0ZpeGVkKDMpLnJlcGxhY2UoL1xcLj8wKyQvLCAnJykgOiAnJztcblxuICAgICAgICB0b3RhbFNpZ24gPSB0b3RhbCA8IDAgPyAnLScgOiAnJztcbiAgICAgICAgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICBkYXlzU2lnbiA9IHNpZ24odGhpcy5fZGF5cykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIGhtc1NpZ24gPSBzaWduKHRoaXMuX21pbGxpc2Vjb25kcykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRvdGFsU2lnbiArXG4gICAgICAgICAgICAnUCcgK1xuICAgICAgICAgICAgKHllYXJzID8geW1TaWduICsgeWVhcnMgKyAnWScgOiAnJykgK1xuICAgICAgICAgICAgKG1vbnRocyA/IHltU2lnbiArIG1vbnRocyArICdNJyA6ICcnKSArXG4gICAgICAgICAgICAoZGF5cyA/IGRheXNTaWduICsgZGF5cyArICdEJyA6ICcnKSArXG4gICAgICAgICAgICAoaG91cnMgfHwgbWludXRlcyB8fCBzZWNvbmRzID8gJ1QnIDogJycpICtcbiAgICAgICAgICAgIChob3VycyA/IGhtc1NpZ24gKyBob3VycyArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobWludXRlcyA/IGhtc1NpZ24gKyBtaW51dGVzICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzZWNvbmRzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMiA9IER1cmF0aW9uLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDIuaXNWYWxpZCA9IGlzVmFsaWQkMTtcbiAgICBwcm90byQyLmFicyA9IGFicztcbiAgICBwcm90byQyLmFkZCA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgPSBhc1NlY29uZHM7XG4gICAgcHJvdG8kMi5hc01pbnV0ZXMgPSBhc01pbnV0ZXM7XG4gICAgcHJvdG8kMi5hc0hvdXJzID0gYXNIb3VycztcbiAgICBwcm90byQyLmFzRGF5cyA9IGFzRGF5cztcbiAgICBwcm90byQyLmFzV2Vla3MgPSBhc1dlZWtzO1xuICAgIHByb3RvJDIuYXNNb250aHMgPSBhc01vbnRocztcbiAgICBwcm90byQyLmFzUXVhcnRlcnMgPSBhc1F1YXJ0ZXJzO1xuICAgIHByb3RvJDIuYXNZZWFycyA9IGFzWWVhcnM7XG4gICAgcHJvdG8kMi52YWx1ZU9mID0gdmFsdWVPZiQxO1xuICAgIHByb3RvJDIuX2J1YmJsZSA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCA9IGdldCQyO1xuICAgIHByb3RvJDIubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzO1xuICAgIHByb3RvJDIuc2Vjb25kcyA9IHNlY29uZHM7XG4gICAgcHJvdG8kMi5taW51dGVzID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzID0gZGF5cztcbiAgICBwcm90byQyLndlZWtzID0gd2Vla3M7XG4gICAgcHJvdG8kMi5tb250aHMgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiA9IHRvSVNPU3RyaW5nJDE7XG4gICAgcHJvdG8kMi5sb2NhbGUgPSBsb2NhbGU7XG4gICAgcHJvdG8kMi5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcblxuICAgIHByb3RvJDIudG9Jc29TdHJpbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICd0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKScsXG4gICAgICAgIHRvSVNPU3RyaW5nJDFcbiAgICApO1xuICAgIHByb3RvJDIubGFuZyA9IGxhbmc7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWCcsIDAsIDAsICd1bml4Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3gnLCAwLCAwLCAndmFsdWVPZicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigneCcsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdYJywgbWF0Y2hUaW1lc3RhbXApO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUocGFyc2VGbG9hdChpbnB1dCkgKiAxMDAwKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCd4JywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHRvSW50KGlucHV0KSk7XG4gICAgfSk7XG5cbiAgICAvLyEgbW9tZW50LmpzXG5cbiAgICBob29rcy52ZXJzaW9uID0gJzIuMzAuMSc7XG5cbiAgICBzZXRIb29rQ2FsbGJhY2soY3JlYXRlTG9jYWwpO1xuXG4gICAgaG9va3MuZm4gPSBwcm90bztcbiAgICBob29rcy5taW4gPSBtaW47XG4gICAgaG9va3MubWF4ID0gbWF4O1xuICAgIGhvb2tzLm5vdyA9IG5vdztcbiAgICBob29rcy51dGMgPSBjcmVhdGVVVEM7XG4gICAgaG9va3MudW5peCA9IGNyZWF0ZVVuaXg7XG4gICAgaG9va3MubW9udGhzID0gbGlzdE1vbnRocztcbiAgICBob29rcy5pc0RhdGUgPSBpc0RhdGU7XG4gICAgaG9va3MubG9jYWxlID0gZ2V0U2V0R2xvYmFsTG9jYWxlO1xuICAgIGhvb2tzLmludmFsaWQgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb247XG4gICAgaG9va3MuaXNNb21lbnQgPSBpc01vbWVudDtcbiAgICBob29rcy53ZWVrZGF5cyA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSA9IGdldExvY2FsZTtcbiAgICBob29rcy5pc0R1cmF0aW9uID0gaXNEdXJhdGlvbjtcbiAgICBob29rcy5tb250aHNTaG9ydCA9IGxpc3RNb250aHNTaG9ydDtcbiAgICBob29rcy53ZWVrZGF5c01pbiA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgPSBsaXN0TG9jYWxlcztcbiAgICBob29rcy53ZWVrZGF5c1Nob3J0ID0gbGlzdFdlZWtkYXlzU2hvcnQ7XG4gICAgaG9va3Mubm9ybWFsaXplVW5pdHMgPSBub3JtYWxpemVVbml0cztcbiAgICBob29rcy5yZWxhdGl2ZVRpbWVSb3VuZGluZyA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCA9IGdldENhbGVuZGFyRm9ybWF0O1xuICAgIGhvb2tzLnByb3RvdHlwZSA9IHByb3RvO1xuXG4gICAgLy8gY3VycmVudGx5IEhUTUw1IGlucHV0IHR5cGUgb25seSBzdXBwb3J0cyAyNC1ob3VyIGZvcm1hdHNcbiAgICBob29rcy5IVE1MNV9GTVQgPSB7XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMOiAnWVlZWS1NTS1ERFRISDptbScsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9TRUNPTkRTOiAnWVlZWS1NTS1ERFRISDptbTpzcycsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdGVwPVwiMVwiIC8+XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMX01TOiAnWVlZWS1NTS1ERFRISDptbTpzcy5TU1MnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgREFURTogJ1lZWVktTU0tREQnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGVcIiAvPlxuICAgICAgICBUSU1FOiAnSEg6bW0nLCAvLyA8aW5wdXQgdHlwZT1cInRpbWVcIiAvPlxuICAgICAgICBUSU1FX1NFQ09ORFM6ICdISDptbTpzcycsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIFdFRUs6ICdHR0dHLVtXXVdXJywgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJywgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgIHJldHVybiBob29rcztcblxufSkpKTtcbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCIvLyBUb3AgbGV2ZWwgZmlsZSBpcyBqdXN0IGEgbWl4aW4gb2Ygc3VibW9kdWxlcyAmIGNvbnN0YW50c1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzaWduICAgID0gcmVxdWlyZSgnLi9saWIvdXRpbHMvY29tbW9uJykuYXNzaWduO1xuXG52YXIgZGVmbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvZGVmbGF0ZScpO1xudmFyIGluZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2luZmxhdGUnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuL2xpYi96bGliL2NvbnN0YW50cycpO1xuXG52YXIgcGFrbyA9IHt9O1xuXG5hc3NpZ24ocGFrbywgZGVmbGF0ZSwgaW5mbGF0ZSwgY29uc3RhbnRzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYWtvO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2RlZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvZGVmbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgbXNnICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL21lc3NhZ2VzJyk7XG52YXIgWlN0cmVhbSAgICAgID0gcmVxdWlyZSgnLi96bGliL3pzdHJlYW0nKTtcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfRklOSVNIICAgICAgICA9IDQ7XG5cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcblxudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxudmFyIFpfREVGTEFURUQgID0gODtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vKipcbiAqIGNsYXNzIERlZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tkZWZsYXRlXV0sXG4gKiBbW2RlZmxhdGVSYXddXSBhbmQgW1tnemlwXV0uXG4gKiovXG5cbi8qIGludGVybmFsXG4gKiBEZWZsYXRlLmNodW5rcyAtPiBBcnJheVxuICpcbiAqIENodW5rcyBvZiBvdXRwdXQgZGF0YSwgaWYgW1tEZWZsYXRlI29uRGF0YV1dIG5vdCBvdmVycmlkZGVuLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXlcbiAqXG4gKiBDb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tEZWZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogWW91IHdpbGwgbm90IG5lZWQgaXQgaW4gcmVhbCBsaWZlLCBiZWNhdXNlIGRlZmxhdGUgZXJyb3JzXG4gKiBhcmUgcG9zc2libGUgb25seSBvbiB3cm9uZyBvcHRpb25zIG9yIGJhZCBgb25EYXRhYCAvIGBvbkVuZGBcbiAqIGN1c3RvbSBoYW5kbGVycy5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IERlZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgZGVmbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGBsZXZlbGBcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBtZW1MZXZlbGBcbiAqIC0gYHN0cmF0ZWd5YFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBsZXZlbDogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICAgIG1ldGhvZDogWl9ERUZMQVRFRCxcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDE1LFxuICAgIG1lbUxldmVsOiA4LFxuICAgIHN0cmF0ZWd5OiBaX0RFRkFVTFRfU1RSQVRFR1ksXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKG9wdC5nemlwICYmIChvcHQud2luZG93Qml0cyA+IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC5sZXZlbCxcbiAgICBvcHQubWV0aG9kLFxuICAgIG9wdC53aW5kb3dCaXRzLFxuICAgIG9wdC5tZW1MZXZlbCxcbiAgICBvcHQuc3RyYXRlZ3lcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIGlmIChvcHQuaGVhZGVyKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLCBvcHQuaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIHZhciBkaWN0O1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zIFpfRklOSVNILlxuICpcbiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gZGVmbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtbRGVmbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoXG4gKiBuZXcgY29tcHJlc3NlZCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0RlZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0RlZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBhcnJheSBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuXG4gIGlmICh0aGlzLmVuZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IFpfRklOSVNIIDogWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRhdGEpO1xuICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICBzdHJtLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgc3RybS5pbnB1dCA9IGRhdGE7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7XG5cbiAgZG8ge1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpO1xuICAgICAgc3RybS5uZXh0X291dCA9IDA7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTtcbiAgICB9XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGUoc3RybSwgX21vZGUpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovXG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IChzdHJtLmF2YWlsX2luID09PSAwICYmIChfbW9kZSA9PT0gWl9GSU5JU0ggfHwgX21vZGUgPT09IFpfU1lOQ19GTFVTSCkpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLm9uRGF0YShzdHJpbmdzLmJ1ZjJiaW5zdHJpbmcodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EKTtcblxuICAvLyBGaW5hbGl6ZSBvbiB0aGUgbGFzdCBjaHVuay5cbiAgaWYgKF9tb2RlID09PSBaX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IFpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IFpfU1lOQ19GTFVTSCkge1xuICAgIHRoaXMub25FbmQoWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3V0cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBaX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0aG0gYW5kIGBvcHRpb25zYC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSBsZXZlbFxuICogLSB3aW5kb3dCaXRzXG4gKiAtIG1lbUxldmVsXG4gKiAtIHN0cmF0ZWd5XG4gKiAtIGRpY3Rpb25hcnlcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnIHx8IG1zZ1tkZWZsYXRvci5lcnJdOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2luZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvaW5mbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgYyAgICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL2NvbnN0YW50cycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG52YXIgR1poZWFkZXIgICAgID0gcmVxdWlyZSgnLi96bGliL2d6aGVhZGVyJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogY2xhc3MgSW5mbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2luZmxhdGVdXVxuICogYW5kIFtbaW5mbGF0ZVJhd11dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogaW5mbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbSW5mbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGRlbi5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICpcbiAqIFVuY29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbSW5mbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbSW5mbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBpbmZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBJbmZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGluZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGluZmxhdGVcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICogQnkgZGVmYXVsdCwgd2hlbiBubyBvcHRpb25zIHNldCwgYXV0b2RldGVjdCBkZWZsYXRlL2d6aXAgZGF0YSBmb3JtYXQgdmlhXG4gKiB3cmFwcGVyIGhlYWRlci5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGluZmxhdGUgPSBuZXcgcGFrby5JbmZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBpbmZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBpbmZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChpbmZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoaW5mbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coaW5mbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBJbmZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKSByZXR1cm4gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDAsXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgLy8gRm9yY2Ugd2luZG93IHNpemUgZm9yIGByYXdgIGRhdGEsIGlmIG5vdCBzZXQgZGlyZWN0bHksXG4gIC8vIGJlY2F1c2Ugd2UgaGF2ZSBubyBoZWFkZXIgZm9yIGF1dG9kZXRlY3QuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsgb3B0LndpbmRvd0JpdHMgPSAtMTU7IH1cbiAgfVxuXG4gIC8vIElmIGB3aW5kb3dCaXRzYCBub3QgZGVmaW5lZCAoYW5kIG1vZGUgbm90IHJhdykgLSBzZXQgYXV0b2RldGVjdCBmbGFnIGZvciBnemlwL2RlZmxhdGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikgJiZcbiAgICAgICEob3B0aW9ucyAmJiBvcHRpb25zLndpbmRvd0JpdHMpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7XG4gIH1cblxuICAvLyBHemlwIGhlYWRlciBoYXMgbm8gaW5mbyBhYm91dCB3aW5kb3dzIHNpemUsIHdlIGNhbiBkbyBhdXRvZGV0ZWN0IG9ubHlcbiAgLy8gZm9yIGRlZmxhdGUuIFNvLCBpZiB3aW5kb3cgc2l6ZSBub3Qgc2V0LCBmb3JjZSBpdCB0byBtYXggd2hlbiBnemlwIHBvc3NpYmxlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPiAxNSkgJiYgKG9wdC53aW5kb3dCaXRzIDwgNDgpKSB7XG4gICAgLy8gYml0IDMgKDE2KSAtPiBnemlwcGVkIGRhdGFcbiAgICAvLyBiaXQgNCAoMzIpIC0+IGF1dG9kZXRlY3QgZ3ppcC9kZWZsYXRlXG4gICAgaWYgKChvcHQud2luZG93Qml0cyAmIDE1KSA9PT0gMCkge1xuICAgICAgb3B0LndpbmRvd0JpdHMgfD0gMTU7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtICAgPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzICA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC53aW5kb3dCaXRzXG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIHRoaXMuaGVhZGVyID0gbmV3IEdaaGVhZGVyKCk7XG5cbiAgemxpYl9pbmZsYXRlLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLCB0aGlzLmhlYWRlcik7XG5cbiAgLy8gU2V0dXAgZGljdGlvbmFyeVxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdC5kaWN0aW9uYXJ5ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBvcHQuZGljdGlvbmFyeSA9IG5ldyBVaW50OEFycmF5KG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9XG4gICAgaWYgKG9wdC5yYXcpIHsgLy9JbiByYXcgbW9kZSB3ZSBuZWVkIHRvIHNldCB0aGUgZGljdGlvbmFyeSBlYXJseVxuICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgb3B0LmRpY3Rpb25hcnkpO1xuICAgICAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW5mbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGFcbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFucyBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGluZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0luZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IG91dHB1dCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0luZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbSW5mbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIGRpY3Rpb25hcnkgPSB0aGlzLm9wdGlvbnMuZGljdGlvbmFyeTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG4gIHZhciBuZXh0X291dF91dGY4LCB0YWlsLCB1dGY4c3RyO1xuXG4gIC8vIEZsYWcgdG8gcHJvcGVybHkgcHJvY2VzcyBaX0JVRl9FUlJPUiBvbiB0ZXN0aW5nIGluZmxhdGUgY2FsbFxuICAvLyB3aGVuIHdlIGNoZWNrIHRoYXQgYWxsIG91dHB1dCBkYXRhIHdhcyBmbHVzaGVkLlxuICB2YXIgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLmVuZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuICBfbW9kZSA9IChtb2RlID09PSB+fm1vZGUpID8gbW9kZSA6ICgobW9kZSA9PT0gdHJ1ZSkgPyBjLlpfRklOSVNIIDogYy5aX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBPbmx5IGJpbmFyeSBzdHJpbmdzIGNhbiBiZSBkZWNvbXByZXNzZWQgb24gcHJhY3RpY2VcbiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5iaW5zdHJpbmcyYnVmKGRhdGEpO1xuICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICBzdHJtLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgc3RybS5pbnB1dCA9IGRhdGE7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7XG5cbiAgZG8ge1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpO1xuICAgICAgc3RybS5uZXh0X291dCA9IDA7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZShzdHJtLCBjLlpfTk9fRkxVU0gpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovXG5cbiAgICBpZiAoc3RhdHVzID09PSBjLlpfTkVFRF9ESUNUICYmIGRpY3Rpb25hcnkpIHtcbiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3Rpb25hcnkpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9CVUZfRVJST1IgJiYgYWxsb3dCdWZFcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdHVzID0gYy5aX09LO1xuICAgICAgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RybS5uZXh0X291dCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBjLlpfRklOSVNIIHx8IF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkpKSB7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgICAgIG5leHRfb3V0X3V0ZjggPSBzdHJpbmdzLnV0Zjhib3JkZXIoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpO1xuXG4gICAgICAgICAgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4O1xuICAgICAgICAgIHV0ZjhzdHIgPSBzdHJpbmdzLmJ1ZjJzdHJpbmcoc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgpO1xuXG4gICAgICAgICAgLy8gbW92ZSB0YWlsXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHRhaWw7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemUgLSB0YWlsO1xuICAgICAgICAgIGlmICh0YWlsKSB7IHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCwgdGFpbCwgMCk7IH1cblxuICAgICAgICAgIHRoaXMub25EYXRhKHV0ZjhzdHIpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXaGVuIG5vIG1vcmUgaW5wdXQgZGF0YSwgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaW50ZXJuYWwgaW5mbGF0ZSBidWZmZXJzXG4gICAgLy8gYXJlIGZsdXNoZWQuIFRoZSBvbmx5IHdheSB0byBkbyBpdCB3aGVuIGF2YWlsX291dCA9IDAgLSBydW4gb25lIG1vcmVcbiAgICAvLyBpbmZsYXRlIHBhc3MuIEJ1dCBpZiBvdXRwdXQgZGF0YSBub3QgZXhpc3RzLCBpbmZsYXRlIHJldHVybiBaX0JVRl9FUlJPUi5cbiAgICAvLyBIZXJlIHdlIHNldCBmbGFnIHRvIHByb2Nlc3MgdGhpcyBlcnJvciBwcm9wZXJseS5cbiAgICAvL1xuICAgIC8vIE5PVEUuIERlZmxhdGUgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSBhbmQgZG9lcyBub3QgbmVlZHMgc3VjaFxuICAgIC8vIGxvZ2ljLlxuICAgIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gdHJ1ZTtcbiAgICB9XG5cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EKTtcblxuICBpZiAoc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCkge1xuICAgIF9tb2RlID0gYy5aX0ZJTklTSDtcbiAgfVxuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IGMuWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBjLlpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChjLlpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91dHB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkVuZChzdGF0dXMpIC0+IFZvaWRcbiAqIC0gc3RhdHVzIChOdW1iZXIpOiBpbmZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcyxcbiAqICAgb3RoZXIgaWYgbm90LlxuICpcbiAqIENhbGxlZCBlaXRoZXIgYWZ0ZXIgeW91IHRlbGwgaW5mbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBjLlpfT0spIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gR2x1ZSAmIGNvbnZlcnQgaGVyZSwgdW50aWwgd2UgdGVhY2ggcGFrbyB0byBzZW5kXG4gICAgICAvLyB1dGY4IGFsaWduZWQgc3RyaW5ncyB0byBvbkRhdGFcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogaW5mbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBEZWNvbXByZXNzIGBkYXRhYCB3aXRoIGluZmxhdGUvdW5nemlwIGFuZCBgb3B0aW9uc2AuIEF1dG9kZXRlY3RcbiAqIGZvcm1hdCB2aWEgd3JhcHBlciBoZWFkZXIgYnkgZGVmYXVsdC4gVGhhdCdzIHdoeSB3ZSBkb24ndCBwcm92aWRlXG4gKiBzZXBhcmF0ZSBgdW5nemlwYCBtZXRob2QuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gd2luZG93Qml0c1xuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBpbnB1dCA9IHBha28uZGVmbGF0ZShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIG91dHB1dDtcbiAqXG4gKiB0cnkge1xuICogICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpO1xuICogfSBjYXRjaCAoZXJyKVxuICogICBjb25zb2xlLmxvZyhlcnIpO1xuICogfVxuICogYGBgXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIGluZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChpbmZsYXRvci5lcnIpIHsgdGhyb3cgaW5mbGF0b3IubXNnIHx8IG1zZ1tpbmZsYXRvci5lcnJdOyB9XG5cbiAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGluZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tpbmZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogdW5nemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIEp1c3Qgc2hvcnRjdXQgdG8gW1tpbmZsYXRlXV0sIGJlY2F1c2UgaXQgYXV0b2RldGVjdHMgZm9ybWF0XG4gKiBieSBoZWFkZXIuY29udGVudC4gRG9uZSBmb3IgY29udmVuaWVuY2UuXG4gKiovXG5cblxuZXhwb3J0cy5JbmZsYXRlID0gSW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVSYXcgPSBpbmZsYXRlUmF3O1xuZXhwb3J0cy51bmd6aXAgID0gaW5mbGF0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgVFlQRURfT0sgPSAgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxuZnVuY3Rpb24gX2hhcyhvYmosIGtleSkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cblxuZXhwb3J0cy5hc3NpZ24gPSBmdW5jdGlvbiAob2JqIC8qZnJvbTEsIGZyb20yLCBmcm9tMywgLi4uKi8pIHtcbiAgdmFyIHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB3aGlsZSAoc291cmNlcy5sZW5ndGgpIHtcbiAgICB2YXIgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICAgIGlmICghc291cmNlKSB7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc291cmNlICsgJ211c3QgYmUgbm9uLW9iamVjdCcpO1xuICAgIH1cblxuICAgIGZvciAodmFyIHAgaW4gc291cmNlKSB7XG4gICAgICBpZiAoX2hhcyhzb3VyY2UsIHApKSB7XG4gICAgICAgIG9ialtwXSA9IHNvdXJjZVtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuXG4vLyByZWR1Y2UgYnVmZmVyIHNpemUsIGF2b2lkaW5nIG1lbSBjb3B5XG5leHBvcnRzLnNocmlua0J1ZiA9IGZ1bmN0aW9uIChidWYsIHNpemUpIHtcbiAgaWYgKGJ1Zi5sZW5ndGggPT09IHNpemUpIHsgcmV0dXJuIGJ1ZjsgfVxuICBpZiAoYnVmLnN1YmFycmF5KSB7IHJldHVybiBidWYuc3ViYXJyYXkoMCwgc2l6ZSk7IH1cbiAgYnVmLmxlbmd0aCA9IHNpemU7XG4gIHJldHVybiBidWY7XG59O1xuXG5cbnZhciBmblR5cGVkID0ge1xuICBhcnJheVNldDogZnVuY3Rpb24gKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbiwgZGVzdF9vZmZzKSB7XG4gICAgaWYgKHNyYy5zdWJhcnJheSAmJiBkZXN0LnN1YmFycmF5KSB7XG4gICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjX29mZnMsIHNyY19vZmZzICsgbGVuKSwgZGVzdF9vZmZzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gb3JkaW5hcnkgYXJyYXlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICB2YXIgaSwgbCwgbGVuLCBwb3MsIGNodW5rLCByZXN1bHQ7XG5cbiAgICAvLyBjYWxjdWxhdGUgZGF0YSBsZW5ndGhcbiAgICBsZW4gPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBsZW4gKz0gY2h1bmtzW2ldLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBqb2luIGNodW5rc1xuICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgcG9zID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY2h1bmsgPSBjaHVua3NbaV07XG4gICAgICByZXN1bHQuc2V0KGNodW5rLCBwb3MpO1xuICAgICAgcG9zICs9IGNodW5rLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG52YXIgZm5VbnR5cGVkID0ge1xuICBhcnJheVNldDogZnVuY3Rpb24gKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbiwgZGVzdF9vZmZzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgY2h1bmtzKTtcbiAgfVxufTtcblxuXG4vLyBFbmFibGUvRGlzYWJsZSB0eXBlZCBhcnJheXMgdXNlLCBmb3IgdGVzdGluZ1xuLy9cbmV4cG9ydHMuc2V0VHlwZWQgPSBmdW5jdGlvbiAob24pIHtcbiAgaWYgKG9uKSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IFVpbnQ4QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IFVpbnQxNkFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBJbnQzMkFycmF5O1xuICAgIGV4cG9ydHMuYXNzaWduKGV4cG9ydHMsIGZuVHlwZWQpO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEFycmF5O1xuICAgIGV4cG9ydHMuYXNzaWduKGV4cG9ydHMsIGZuVW50eXBlZCk7XG4gIH1cbn07XG5cbmV4cG9ydHMuc2V0VHlwZWQoVFlQRURfT0spO1xuIiwiLy8gU3RyaW5nIGVuY29kZS9kZWNvZGUgaGVscGVyc1xuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuLy8gUXVpY2sgY2hlY2sgaWYgd2UgY2FuIHVzZSBmYXN0IGFycmF5IHRvIGJpbiBzdHJpbmcgY29udmVyc2lvblxuLy9cbi8vIC0gYXBwbHkoQXJyYXkpIGNhbiBmYWlsIG9uIEFuZHJvaWQgMi4yXG4vLyAtIGFwcGx5KFVpbnQ4QXJyYXkpIGNhbiBmYWlsIG9uIGlPUyA1LjEgU2FmYXJpXG4vL1xudmFyIFNUUl9BUFBMWV9PSyA9IHRydWU7XG52YXIgU1RSX0FQUExZX1VJQV9PSyA9IHRydWU7XG5cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgWyAwIF0pOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfT0sgPSBmYWxzZTsgfVxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9VSUFfT0sgPSBmYWxzZTsgfVxuXG5cbi8vIFRhYmxlIHdpdGggdXRmOCBsZW5ndGhzIChjYWxjdWxhdGVkIGJ5IGZpcnN0IGJ5dGUgb2Ygc2VxdWVuY2UpXG4vLyBOb3RlLCB0aGF0IDUgJiA2LWJ5dGUgdmFsdWVzIGFuZCBzb21lIDQtYnl0ZSB2YWx1ZXMgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBpbiBKUyxcbi8vIGJlY2F1c2UgbWF4IHBvc3NpYmxlIGNvZGVwb2ludCBpcyAweDEwZmZmZlxudmFyIF91dGY4bGVuID0gbmV3IHV0aWxzLkJ1ZjgoMjU2KTtcbmZvciAodmFyIHEgPSAwOyBxIDwgMjU2OyBxKyspIHtcbiAgX3V0ZjhsZW5bcV0gPSAocSA+PSAyNTIgPyA2IDogcSA+PSAyNDggPyA1IDogcSA+PSAyNDAgPyA0IDogcSA+PSAyMjQgPyAzIDogcSA+PSAxOTIgPyAyIDogMSk7XG59XG5fdXRmOGxlblsyNTRdID0gX3V0ZjhsZW5bMjU0XSA9IDE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuXG4vLyBjb252ZXJ0IHN0cmluZyB0byBhcnJheSAodHlwZWQsIHdoZW4gcG9zc2libGUpXG5leHBvcnRzLnN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBidWYsIGMsIGMyLCBtX3BvcywgaSwgc3RyX2xlbiA9IHN0ci5sZW5ndGgsIGJ1Zl9sZW4gPSAwO1xuXG4gIC8vIGNvdW50IGJpbmFyeSBzaXplXG4gIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGJ1Zl9sZW4gKz0gYyA8IDB4ODAgPyAxIDogYyA8IDB4ODAwID8gMiA6IGMgPCAweDEwMDAwID8gMyA6IDQ7XG4gIH1cblxuICAvLyBhbGxvY2F0ZSBidWZmZXJcbiAgYnVmID0gbmV3IHV0aWxzLkJ1ZjgoYnVmX2xlbik7XG5cbiAgLy8gY29udmVydFxuICBmb3IgKGkgPSAwLCBtX3BvcyA9IDA7IGkgPCBidWZfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgIC8qIG9uZSBieXRlICovXG4gICAgICBidWZbaSsrXSA9IGM7XG4gICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2UgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweEUwIHwgKGMgPj4+IDEyKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBmb3VyIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4ZjAgfCAoYyA+Pj4gMTgpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDEyICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmO1xufTtcblxuLy8gSGVscGVyICh1c2VkIGluIDIgcGxhY2VzKVxuZnVuY3Rpb24gYnVmMmJpbnN0cmluZyhidWYsIGxlbikge1xuICAvLyBPbiBDaHJvbWUsIHRoZSBhcmd1bWVudHMgaW4gYSBmdW5jdGlvbiBjYWxsIHRoYXQgYXJlIGFsbG93ZWQgaXMgYDY1NTM0YC5cbiAgLy8gSWYgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbiB0aGF0LCB3ZSBjYW4gdXNlIHRoaXMgb3B0aW1pemF0aW9uLFxuICAvLyBvdGhlcndpc2Ugd2Ugd2lsbCB0YWtlIGEgc2xvd2VyIHBhdGguXG4gIGlmIChsZW4gPCA2NTUzNCkge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIFZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgYnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGlzbid0IHdvcnRoIGl0IHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGFzIGluIG9yaWdpbmFsLlxuLy8gU21hbGwgc2l6ZSBpcyBwcmVmZXJhYmxlLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuICBaX05PX0ZMVVNIOiAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSDogICAgMSxcbiAgWl9TWU5DX0ZMVVNIOiAgICAgICAyLFxuICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsXG4gIFpfRklOSVNIOiAgICAgICAgICAgNCxcbiAgWl9CTE9DSzogICAgICAgICAgICA1LFxuICBaX1RSRUVTOiAgICAgICAgICAgIDYsXG5cbiAgLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAgKi9cbiAgWl9PSzogICAgICAgICAgICAgICAwLFxuICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsXG4gIFpfTkVFRF9ESUNUOiAgICAgICAgMixcbiAgWl9FUlJOTzogICAgICAgICAgIC0xLFxuICBaX1NUUkVBTV9FUlJPUjogICAgLTIsXG4gIFpfREFUQV9FUlJPUjogICAgICAtMyxcbiAgLy9aX01FTV9FUlJPUjogICAgIC00LFxuICBaX0JVRl9FUlJPUjogICAgICAgLTUsXG4gIC8vWl9WRVJTSU9OX0VSUk9SOiAtNixcblxuICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbiAgWl9OT19DT01QUkVTU0lPTjogICAgICAgICAwLFxuICBaX0JFU1RfU1BFRUQ6ICAgICAgICAgICAgIDEsXG4gIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSxcbiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAgIC0xLFxuXG5cbiAgWl9GSUxURVJFRDogICAgICAgICAgICAgICAxLFxuICBaX0hVRkZNQU5fT05MWTogICAgICAgICAgIDIsXG4gIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMyxcbiAgWl9GSVhFRDogICAgICAgICAgICAgICAgICA0LFxuICBaX0RFRkFVTFRfU1RSQVRFR1k6ICAgICAgIDAsXG5cbiAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuICBaX0JJTkFSWTogICAgICAgICAgICAgICAgIDAsXG4gIFpfVEVYVDogICAgICAgICAgICAgICAgICAgMSxcbiAgLy9aX0FTQ0lJOiAgICAgICAgICAgICAgICAxLCAvLyA9IFpfVEVYVCAoZGVwcmVjYXRlZClcbiAgWl9VTktOT1dOOiAgICAgICAgICAgICAgICAyLFxuXG4gIC8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xuICBaX0RFRkxBVEVEOiAgICAgICAgICAgICAgIDhcbiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiB3ZSBjYW4ndCBnZXQgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QgaGVyZS5cbi8vIFNvIHdyaXRlIGNvZGUgdG8gbWluaW1pemUgc2l6ZSAtIG5vIHByZWdlbmVyYXRlZCB0YWJsZXNcbi8vIGFuZCBhcnJheSB0b29scyBkZXBlbmRlbmNpZXMuXG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCAyNTY7IG4rKykge1xuICAgIGMgPSBuO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgODsgaysrKSB7XG4gICAgICBjID0gKChjICYgMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgIH1cbiAgICB0YWJsZVtuXSA9IGM7XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHQgPSBjcmNUYWJsZSxcbiAgICAgIGVuZCA9IHBvcyArIGxlbjtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrKSB7XG4gICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gIH1cblxuICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyYzMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbnZhciB1dGlscyAgID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG52YXIgdHJlZXMgICA9IHJlcXVpcmUoJy4vdHJlZXMnKTtcbnZhciBhZGxlcjMyID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBtc2cgICAgID0gcmVxdWlyZSgnLi9tZXNzYWdlcycpO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovXG52YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbnZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbnZhciBaX0ZVTExfRkxVU0ggICAgPSAzO1xudmFyIFpfRklOSVNIICAgICAgICA9IDQ7XG52YXIgWl9CTE9DSyAgICAgICAgID0gNTtcbi8vdmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xuLy92YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xuLy92YXIgWl9NRU1fRVJST1IgICAgID0gLTQ7XG52YXIgWl9CVUZfRVJST1IgICAgID0gLTU7XG4vL3ZhciBaX1ZFUlNJT05fRVJST1IgPSAtNjtcblxuXG4vKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbi8vdmFyIFpfTk9fQ09NUFJFU1NJT04gICAgICA9IDA7XG4vL3ZhciBaX0JFU1RfU1BFRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9CRVNUX0NPTVBSRVNTSU9OICAgID0gOTtcbnZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTtcblxuXG52YXIgWl9GSUxURVJFRCAgICAgICAgICAgID0gMTtcbnZhciBaX0hVRkZNQU5fT05MWSAgICAgICAgPSAyO1xudmFyIFpfUkxFICAgICAgICAgICAgICAgICA9IDM7XG52YXIgWl9GSVhFRCAgICAgICAgICAgICAgID0gNDtcbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG4vKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovXG4vL3ZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xuLy92YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgICA9IDE7IC8vID0gWl9URVhUXG52YXIgWl9VTktOT1dOICAgICAgICAgICAgID0gMjtcblxuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyIE1BWF9NRU1fTEVWRUwgPSA5O1xuLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfTUVNX0xFVkVMID0gODtcblxuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG52YXIgTElURVJBTFMgICAgICA9IDI1Njtcbi8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqL1xudmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cbnZhciBCTF9DT0RFUyAgICAgID0gMTk7XG4vKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi9cbnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cbnZhciBNQVhfQklUUyAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgTUlOX01BVENIID0gMztcbnZhciBNQVhfTUFUQ0ggPSAyNTg7XG52YXIgTUlOX0xPT0tBSEVBRCA9IChNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKTtcblxudmFyIFBSRVNFVF9ESUNUID0gMHgyMDtcblxudmFyIElOSVRfU1RBVEUgPSA0MjtcbnZhciBFWFRSQV9TVEFURSA9IDY5O1xudmFyIE5BTUVfU1RBVEUgPSA3MztcbnZhciBDT01NRU5UX1NUQVRFID0gOTE7XG52YXIgSENSQ19TVEFURSA9IDEwMztcbnZhciBCVVNZX1NUQVRFID0gMTEzO1xudmFyIEZJTklTSF9TVEFURSA9IDY2NjtcblxudmFyIEJTX05FRURfTU9SRSAgICAgID0gMTsgLyogYmxvY2sgbm90IGNvbXBsZXRlZCwgbmVlZCBtb3JlIGlucHV0IG9yIG1vcmUgb3V0cHV0ICovXG52YXIgQlNfQkxPQ0tfRE9ORSAgICAgPSAyOyAvKiBibG9jayBmbHVzaCBwZXJmb3JtZWQgKi9cbnZhciBCU19GSU5JU0hfU1RBUlRFRCA9IDM7IC8qIGZpbmlzaCBzdGFydGVkLCBuZWVkIG9ubHkgbW9yZSBvdXRwdXQgYXQgbmV4dCBkZWZsYXRlICovXG52YXIgQlNfRklOSVNIX0RPTkUgICAgPSA0OyAvKiBmaW5pc2ggZG9uZSwgYWNjZXB0IG5vIG1vcmUgaW5wdXQgb3Igb3V0cHV0ICovXG5cbnZhciBPU19DT0RFID0gMHgwMzsgLy8gVW5peCA6KSAuIERvbid0IGRldGVjdCwgdXNlIHRoaXMgZGVmYXVsdC5cblxuZnVuY3Rpb24gZXJyKHN0cm0sIGVycm9yQ29kZSkge1xuICBzdHJtLm1zZyA9IG1zZ1tlcnJvckNvZGVdO1xuICByZXR1cm4gZXJyb3JDb2RlO1xufVxuXG5mdW5jdGlvbiByYW5rKGYpIHtcbiAgcmV0dXJuICgoZikgPDwgMSkgLSAoKGYpID4gNCA/IDkgOiAwKTtcbn1cblxuZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZS4gQWxsIGRlZmxhdGUoKSBvdXRwdXQgZ29lc1xuICogdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdFxuICogdG8gYXZvaWQgYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPm91dHB1dCBidWZmZXIgYW5kIGNvcHlpbmcgaW50byBpdC5cbiAqIChTZWUgYWxzbyByZWFkX2J1ZigpKS5cbiAqL1xuZnVuY3Rpb24gZmx1c2hfcGVuZGluZyhzdHJtKSB7XG4gIHZhciBzID0gc3RybS5zdGF0ZTtcblxuICAvL190cl9mbHVzaF9iaXRzKHMpO1xuICB2YXIgbGVuID0gcy5wZW5kaW5nO1xuICBpZiAobGVuID4gc3RybS5hdmFpbF9vdXQpIHtcbiAgICBsZW4gPSBzdHJtLmF2YWlsX291dDtcbiAgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybjsgfVxuXG4gIHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmdfb3V0LCBsZW4sIHN0cm0ubmV4dF9vdXQpO1xuICBzdHJtLm5leHRfb3V0ICs9IGxlbjtcbiAgcy5wZW5kaW5nX291dCArPSBsZW47XG4gIHN0cm0udG90YWxfb3V0ICs9IGxlbjtcbiAgc3RybS5hdmFpbF9vdXQgLT0gbGVuO1xuICBzLnBlbmRpbmcgLT0gbGVuO1xuICBpZiAocy5wZW5kaW5nID09PSAwKSB7XG4gICAgcy5wZW5kaW5nX291dCA9IDA7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBmbHVzaF9ibG9ja19vbmx5KHMsIGxhc3QpIHtcbiAgdHJlZXMuX3RyX2ZsdXNoX2Jsb2NrKHMsIChzLmJsb2NrX3N0YXJ0ID49IDAgPyBzLmJsb2NrX3N0YXJ0IDogLTEpLCBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCwgbGFzdCk7XG4gIHMuYmxvY2tfc3RhcnQgPSBzLnN0cnN0YXJ0O1xuICBmbHVzaF9wZW5kaW5nKHMuc3RybSk7XG59XG5cblxuZnVuY3Rpb24gcHV0X2J5dGUocywgYikge1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGI7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUHV0IGEgc2hvcnQgaW4gdGhlIHBlbmRpbmcgYnVmZmVyLiBUaGUgMTYtYml0IHZhbHVlIGlzIHB1dCBpbiBNU0Igb3JkZXIuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gc3RhdGUgaXMgY29ycmVjdCBhbmQgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW5cbiAqIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBwdXRTaG9ydE1TQihzLCBiKSB7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgPj4gOCkpO1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiICYgMHhmZikpO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IChiID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYiAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgdXBkYXRlIHRoZSBhZGxlcjMyXG4gKiBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaFxuICogdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQgdG8gYXZvaWRcbiAqIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5pbnB1dCBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC5cbiAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLlxuICovXG5mdW5jdGlvbiByZWFkX2J1ZihzdHJtLCBidWYsIHN0YXJ0LCBzaXplKSB7XG4gIHZhciBsZW4gPSBzdHJtLmF2YWlsX2luO1xuXG4gIGlmIChsZW4gPiBzaXplKSB7IGxlbiA9IHNpemU7IH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm4gMDsgfVxuXG4gIHN0cm0uYXZhaWxfaW4gLT0gbGVuO1xuXG4gIC8vIHptZW1jcHkoYnVmLCBzdHJtLT5uZXh0X2luLCBsZW4pO1xuICB1dGlscy5hcnJheVNldChidWYsIHN0cm0uaW5wdXQsIHN0cm0ubmV4dF9pbiwgbGVuLCBzdGFydCk7XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDEpIHtcbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgZWxzZSBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAyKSB7XG4gICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gKz0gbGVuO1xuICBzdHJtLnRvdGFsX2luICs9IGxlbjtcblxuICByZXR1cm4gbGVuO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kXG4gKiByZXR1cm4gaXRzIGxlbmd0aC4gTWF0Y2hlcyBzaG9ydGVyIG9yIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFyZSBkaXNjYXJkZWQsXG4gKiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzXG4gKiBnYXJiYWdlLlxuICogSU4gYXNzZXJ0aW9uczogY3VyX21hdGNoIGlzIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluIGZvciB0aGUgY3VycmVudFxuICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMVxuICogT1VUIGFzc2VydGlvbjogdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QgZ3JlYXRlciB0aGFuIHMtPmxvb2thaGVhZC5cbiAqL1xuZnVuY3Rpb24gbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpIHtcbiAgdmFyIGNoYWluX2xlbmd0aCA9IHMubWF4X2NoYWluX2xlbmd0aDsgICAgICAvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi9cbiAgdmFyIHNjYW4gPSBzLnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqL1xuICB2YXIgbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovXG4gIHZhciBiZXN0X2xlbiA9IHMucHJldl9sZW5ndGg7ICAgICAgICAgICAgICAvKiBiZXN0IG1hdGNoIGxlbmd0aCBzbyBmYXIgKi9cbiAgdmFyIG5pY2VfbWF0Y2ggPSBzLm5pY2VfbWF0Y2g7ICAgICAgICAgICAgIC8qIHN0b3AgaWYgbWF0Y2ggbG9uZyBlbm91Z2ggKi9cbiAgdmFyIGxpbWl0ID0gKHMuc3Ryc3RhcnQgPiAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkgP1xuICAgICAgcy5zdHJzdGFydCAtIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIDogMC8qTklMKi87XG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdzsgLy8gc2hvcnRjdXRcblxuICB2YXIgd21hc2sgPSBzLndfbWFzaztcbiAgdmFyIHByZXYgID0gcy5wcmV2O1xuXG4gIC8qIFN0b3Agd2hlbiBjdXJfbWF0Y2ggYmVjb21lcyA8PSBsaW1pdC4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsXG4gICAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuXG4gICAqL1xuXG4gIHZhciBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICB2YXIgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gIHZhciBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuXG4gIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LlxuICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LlxuICAgKi9cbiAgLy8gQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsIFwiQ29kZSB0b28gY2xldmVyXCIpO1xuXG4gIC8qIERvIG5vdCB3YXN0ZSB0b28gbXVjaCB0aW1lIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGdvb2QgbWF0Y2g6ICovXG4gIGlmIChzLnByZXZfbGVuZ3RoID49IHMuZ29vZF9tYXRjaCkge1xuICAgIGNoYWluX2xlbmd0aCA+Pj0gMjtcbiAgfVxuICAvKiBEbyBub3QgbG9vayBmb3IgbWF0Y2hlcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuIFRoaXMgaXMgbmVjZXNzYXJ5XG4gICAqIHRvIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgaWYgKG5pY2VfbWF0Y2ggPiBzLmxvb2thaGVhZCkgeyBuaWNlX21hdGNoID0gcy5sb29rYWhlYWQ7IH1cblxuICAvLyBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFELCBcIm5lZWQgbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICAvLyBBc3NlcnQoY3VyX21hdGNoIDwgcy0+c3Ryc3RhcnQsIFwibm8gZnV0dXJlXCIpO1xuICAgIG1hdGNoID0gY3VyX21hdGNoO1xuXG4gICAgLyogU2tpcCB0byBuZXh0IG1hdGNoIGlmIHRoZSBtYXRjaCBsZW5ndGggY2Fubm90IGluY3JlYXNlXG4gICAgICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMi4gIE5vdGUgdGhhdCB0aGUgY2hlY2tzIGJlbG93XG4gICAgICogZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBvY2N1ciBvY2Nhc2lvbmFsbHkgZm9yIHBlcmZvcm1hbmNlXG4gICAgICogcmVhc29ucy4gIFRoZXJlZm9yZSB1bmluaXRpYWxpemVkIG1lbW9yeSB3aWxsIGJlIGFjY2Vzc2VkLCBhbmRcbiAgICAgKiBjb25kaXRpb25hbCBqdW1wcyB3aWxsIGJlIG1hZGUgdGhhdCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzLlxuICAgICAqIEhvd2V2ZXIgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbGltaXRlZCB0byB0aGUgbG9va2FoZWFkLCBzb1xuICAgICAqIHRoZSBvdXRwdXQgb2YgZGVmbGF0ZSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLlxuICAgICAqL1xuXG4gICAgaWYgKF93aW5bbWF0Y2ggKyBiZXN0X2xlbl0gICAgICE9PSBzY2FuX2VuZCAgfHxcbiAgICAgICAgX3dpblttYXRjaCArIGJlc3RfbGVuIC0gMV0gIT09IHNjYW5fZW5kMSB8fFxuICAgICAgICBfd2luW21hdGNoXSAgICAgICAgICAgICAgICAhPT0gX3dpbltzY2FuXSB8fFxuICAgICAgICBfd2luWysrbWF0Y2hdICAgICAgICAgICAgICAhPT0gX3dpbltzY2FuICsgMV0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlXG4gICAgICogYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEgd2luLilcbiAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleVxuICAgICAqIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXRcbiAgICAgKiB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC5cbiAgICAgKi9cbiAgICBzY2FuICs9IDI7XG4gICAgbWF0Y2grKztcbiAgICAvLyBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCBcIm1hdGNoWzJdP1wiKTtcblxuICAgIC8qIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgZXZlcnkgOHRoIGNvbXBhcmlzb247XG4gICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguXG4gICAgICovXG4gICAgZG8ge1xuICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgfSB3aGlsZSAoX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuXG4gICAgLy8gQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuXG4gICAgbGVuID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgIHNjYW4gPSBzdHJlbmQgLSBNQVhfTUFUQ0g7XG5cbiAgICBpZiAobGVuID4gYmVzdF9sZW4pIHtcbiAgICAgIHMubWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7XG4gICAgICBiZXN0X2xlbiA9IGxlbjtcbiAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICAgICAgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcbiAgICB9XG4gIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdCAmJiAtLWNoYWluX2xlbmd0aCAhPT0gMCk7XG5cbiAgaWYgKGJlc3RfbGVuIDw9IHMubG9va2FoZWFkKSB7XG4gICAgcmV0dXJuIGJlc3RfbGVuO1xuICB9XG4gIHJldHVybiBzLmxvb2thaGVhZDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZpbGwgdGhlIHdpbmRvdyB3aGVuIHRoZSBsb29rYWhlYWQgYmVjb21lcyBpbnN1ZmZpY2llbnQuXG4gKiBVcGRhdGVzIHN0cnN0YXJ0IGFuZCBsb29rYWhlYWQuXG4gKlxuICogSU4gYXNzZXJ0aW9uOiBsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEXG4gKiBPVVQgYXNzZXJ0aW9uczogc3Ryc3RhcnQgPD0gd2luZG93X3NpemUtTUlOX0xPT0tBSEVBRFxuICogICAgQXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGJlZW4gcmVhZCwgb3IgYXZhaWxfaW4gPT0gMDsgcmVhZHMgYXJlXG4gKiAgICBwZXJmb3JtZWQgZm9yIGF0IGxlYXN0IHR3byBieXRlcyAocmVxdWlyZWQgZm9yIHRoZSB6aXAgdHJhbnNsYXRlX2VvbFxuICogICAgb3B0aW9uIC0tIG5vdCBzdXBwb3J0ZWQgaGVyZSkuXG4gKi9cbmZ1bmN0aW9uIGZpbGxfd2luZG93KHMpIHtcbiAgdmFyIF93X3NpemUgPSBzLndfc2l6ZTtcbiAgdmFyIHAsIG4sIG0sIG1vcmUsIHN0cjtcblxuICAvL0Fzc2VydChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFELCBcImFscmVhZHkgZW5vdWdoIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgbW9yZSA9IHMud2luZG93X3NpemUgLSBzLmxvb2thaGVhZCAtIHMuc3Ryc3RhcnQ7XG5cbiAgICAvLyBKUyBpbnRzIGhhdmUgMzIgYml0LCBibG9jayBiZWxvdyBub3QgbmVlZGVkXG4gICAgLyogRGVhbCB3aXRoICFAIyQlIDY0SyBsaW1pdDogKi9cbiAgICAvL2lmIChzaXplb2YoaW50KSA8PSAyKSB7XG4gICAgLy8gICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7XG4gICAgLy8gICAgICAgIG1vcmUgPSB3c2l6ZTtcbiAgICAvL1xuICAgIC8vICB9IGVsc2UgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSgtMSkpIHtcbiAgICAvLyAgICAgICAgLyogVmVyeSB1bmxpa2VseSwgYnV0IHBvc3NpYmxlIG9uIDE2IGJpdCBtYWNoaW5lIGlmXG4gICAgLy8gICAgICAgICAqIHN0cnN0YXJ0ID09IDAgJiYgbG9va2FoZWFkID09IDEgKGlucHV0IGRvbmUgYSBieXRlIGF0IHRpbWUpXG4gICAgLy8gICAgICAgICAqL1xuICAgIC8vICAgICAgICBtb3JlLS07XG4gICAgLy8gICAgfVxuICAgIC8vfVxuXG5cbiAgICAvKiBJZiB0aGUgd2luZG93IGlzIGFsbW9zdCBmdWxsIGFuZCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLFxuICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgPj0gX3dfc2l6ZSArIChfd19zaXplIC0gTUlOX0xPT0tBSEVBRCkpIHtcblxuICAgICAgdXRpbHMuYXJyYXlTZXQocy53aW5kb3csIHMud2luZG93LCBfd19zaXplLCBfd19zaXplLCAwKTtcbiAgICAgIHMubWF0Y2hfc3RhcnQgLT0gX3dfc2l6ZTtcbiAgICAgIHMuc3Ryc3RhcnQgLT0gX3dfc2l6ZTtcbiAgICAgIC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUICovXG4gICAgICBzLmJsb2NrX3N0YXJ0IC09IF93X3NpemU7XG5cbiAgICAgIC8qIFNsaWRlIHRoZSBoYXNoIHRhYmxlIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzIgYml0IHZhbHVlc1xuICAgICAgIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZSkuIFdlIHNsaWRlIGV2ZW4gd2hlbiBsZXZlbCA9PSAwXG4gICAgICAgdG8ga2VlcCB0aGUgaGFzaCB0YWJsZSBjb25zaXN0ZW50IGlmIHdlIHN3aXRjaCBiYWNrIHRvIGxldmVsID4gMFxuICAgICAgIGxhdGVyLiAoVXNpbmcgbGV2ZWwgMCBwZXJtYW5lbnRseSBpcyBub3QgYW4gb3B0aW1hbCB1c2FnZSBvZlxuICAgICAgIHpsaWIsIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBwYXRob2xvZ2ljYWwgY2FzZS4pXG4gICAgICAgKi9cblxuICAgICAgbiA9IHMuaGFzaF9zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLmhlYWRbLS1wXTtcbiAgICAgICAgcy5oZWFkW3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBuID0gX3dfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5wcmV2Wy0tcF07XG4gICAgICAgIHMucHJldltwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgICAvKiBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dFxuICAgICAgICAgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLlxuICAgICAgICAgKi9cbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG1vcmUgKz0gX3dfc2l6ZTtcbiAgICB9XG4gICAgaWYgKHMuc3RybS5hdmFpbF9pbiA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLyogSWYgdGhlcmUgd2FzIG5vIHNsaWRpbmc6XG4gICAgICogICAgc3Ryc3RhcnQgPD0gV1NJWkUrTUFYX0RJU1QtMSAmJiBsb29rYWhlYWQgPD0gTUlOX0xPT0tBSEVBRCAtIDEgJiZcbiAgICAgKiAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnRcbiAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gKE1JTl9MT09LQUhFQUQtMSArIFdTSVpFICsgTUFYX0RJU1QtMSlcbiAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gMipXU0laRSArIDJcbiAgICAgKiBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVkKSxcbiAgICAgKiAgIHdpbmRvd19zaXplID09IGlucHV0X3NpemUgKyBNSU5fTE9PS0FIRUFEICAmJlxuICAgICAqICAgc3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgPD0gaW5wdXRfc2l6ZSA9PiBtb3JlID49IE1JTl9MT09LQUhFQUQuXG4gICAgICogT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi5cbiAgICAgKiBJZiB0aGVyZSB3YXMgc2xpZGluZywgbW9yZSA+PSBXU0laRS4gU28gaW4gYWxsIGNhc2VzLCBtb3JlID49IDIuXG4gICAgICovXG4gICAgLy9Bc3NlcnQobW9yZSA+PSAyLCBcIm1vcmUgPCAyXCIpO1xuICAgIG4gPSByZWFkX2J1ZihzLnN0cm0sIHMud2luZG93LCBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQsIG1vcmUpO1xuICAgIHMubG9va2FoZWFkICs9IG47XG5cbiAgICAvKiBJbml0aWFsaXplIHRoZSBoYXNoIHZhbHVlIG5vdyB0aGF0IHdlIGhhdmUgc29tZSBpbnB1dDogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIHN0ciA9IHMuc3Ryc3RhcnQgLSBzLmluc2VydDtcbiAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzdHJdO1xuXG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIDFdKTsgKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIDFdKSAmIHMuaGFzaF9tYXNrO1xuLy8jaWYgTUlOX01BVENIICE9IDNcbi8vICAgICAgICBDYWxsIHVwZGF0ZV9oYXNoKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgIHdoaWxlIChzLmluc2VydCkge1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4gICAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgICAgc3RyKys7XG4gICAgICAgIHMuaW5zZXJ0LS07XG4gICAgICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0IDwgTUlOX01BVENIKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLyogSWYgdGhlIHdob2xlIGlucHV0IGhhcyBsZXNzIHRoYW4gTUlOX01BVENIIGJ5dGVzLCBpbnNfaCBpcyBnYXJiYWdlLFxuICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC5cbiAgICAgKi9cblxuICB9IHdoaWxlIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy5zdHJtLmF2YWlsX2luICE9PSAwKTtcblxuICAvKiBJZiB0aGUgV0lOX0lOSVQgYnl0ZXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBkYXRhIGhhdmUgbmV2ZXIgYmVlblxuICAgKiB3cml0dGVuLCB0aGVuIHplcm8gdGhvc2UgYnl0ZXMgaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHJlcG9ydHMgb2ZcbiAgICogdGhlIHVzZSBvZiB1bmluaXRpYWxpemVkIChvciB1bmluaXRpYWxpc2VkIGFzIEp1bGlhbiB3cml0ZXMpIGJ5dGVzIGJ5XG4gICAqIHRoZSBsb25nZXN0IG1hdGNoIHJvdXRpbmVzLiAgVXBkYXRlIHRoZSBoaWdoIHdhdGVyIG1hcmsgZm9yIHRoZSBuZXh0XG4gICAqIHRpbWUgdGhyb3VnaCBoZXJlLiAgV0lOX0lOSVQgaXMgc2V0IHRvIE1BWF9NQVRDSCBzaW5jZSB0aGUgbG9uZ2VzdCBtYXRjaFxuICAgKiByb3V0aW5lcyBhbGxvdyBzY2FubmluZyB0byBzdHJzdGFydCArIE1BWF9NQVRDSCwgaWdub3JpbmcgbG9va2FoZWFkLlxuICAgKi9cbi8vICBpZiAocy5oaWdoX3dhdGVyIDwgcy53aW5kb3dfc2l6ZSkge1xuLy8gICAgdmFyIGN1cnIgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQ7XG4vLyAgICB2YXIgaW5pdCA9IDA7XG4vL1xuLy8gICAgaWYgKHMuaGlnaF93YXRlciA8IGN1cnIpIHtcbi8vICAgICAgLyogUHJldmlvdXMgaGlnaCB3YXRlciBtYXJrIGJlbG93IGN1cnJlbnQgZGF0YSAtLSB6ZXJvIFdJTl9JTklUXG4vLyAgICAgICAqIGJ5dGVzIG9yIHVwIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9IHMud2luZG93X3NpemUgLSBjdXJyO1xuLy8gICAgICBpZiAoaW5pdCA+IFdJTl9JTklUKVxuLy8gICAgICAgIGluaXQgPSBXSU5fSU5JVDtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgY3VyciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyID0gY3VyciArIGluaXQ7XG4vLyAgICB9XG4vLyAgICBlbHNlIGlmIChzLT5oaWdoX3dhdGVyIDwgKHVsZyljdXJyICsgV0lOX0lOSVQpIHtcbi8vICAgICAgLyogSGlnaCB3YXRlciBtYXJrIGF0IG9yIGFib3ZlIGN1cnJlbnQgZGF0YSwgYnV0IGJlbG93IGN1cnJlbnQgZGF0YVxuLy8gICAgICAgKiBwbHVzIFdJTl9JTklUIC0tIHplcm8gb3V0IHRvIGN1cnJlbnQgZGF0YSBwbHVzIFdJTl9JTklULCBvciB1cFxuLy8gICAgICAgKiB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSAodWxnKWN1cnIgKyBXSU5fSU5JVCAtIHMtPmhpZ2hfd2F0ZXI7XG4vLyAgICAgIGlmIChpbml0ID4gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyKVxuLy8gICAgICAgIGluaXQgPSBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXI7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIHMtPmhpZ2hfd2F0ZXIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciArPSBpbml0O1xuLy8gICAgfVxuLy8gIH1cbi8vXG4vLyAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUgLSBNSU5fTE9PS0FIRUFELFxuLy8gICAgXCJub3QgZW5vdWdoIHJvb20gZm9yIHNlYXJjaFwiKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IHdpdGhvdXQgY29tcHJlc3Npb24gYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVyblxuICogdGhlIGN1cnJlbnQgYmxvY2sgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZVxuICogdW5jb21wcmVzc2libGUgZGF0YSBpcyBwcm9iYWJseSBub3QgdXNlZnVsLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWRcbiAqIG9ubHkgZm9yIHRoZSBsZXZlbD0wIGNvbXByZXNzaW9uIG9wdGlvbi5cbiAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb21cbiAqIHdpbmRvdyB0byBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zdG9yZWQocywgZmx1c2gpIHtcbiAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmdfYnVmIGlzIGxpbWl0ZWRcbiAgICogdG8gcGVuZGluZ19idWZfc2l6ZSwgYW5kIGVhY2ggc3RvcmVkIGJsb2NrIGhhcyBhIDUgYnl0ZSBoZWFkZXI6XG4gICAqL1xuICB2YXIgbWF4X2Jsb2NrX3NpemUgPSAweGZmZmY7XG5cbiAgaWYgKG1heF9ibG9ja19zaXplID4gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNSkge1xuICAgIG1heF9ibG9ja19zaXplID0gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNTtcbiAgfVxuXG4gIC8qIENvcHkgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIGlucHV0IHRvIG91dHB1dDogKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIEZpbGwgdGhlIHdpbmRvdyBhcyBtdWNoIGFzIHBvc3NpYmxlOiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSAxKSB7XG5cbiAgICAgIC8vQXNzZXJ0KHMtPnN0cnN0YXJ0IDwgcy0+d19zaXplK01BWF9ESVNUKHMpIHx8XG4gICAgICAvLyAgcy0+YmxvY2tfc3RhcnQgPj0gKGxvbmcpcy0+d19zaXplLCBcInNsaWRlIHRvbyBsYXRlXCIpO1xuLy8gICAgICBpZiAoIShzLnN0cnN0YXJ0IDwgcy53X3NpemUgKyAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSB8fFxuLy8gICAgICAgIHMuYmxvY2tfc3RhcnQgPj0gcy53X3NpemUpKSB7XG4vLyAgICAgICAgdGhyb3cgIG5ldyBFcnJvcihcInNsaWRlIHRvbyBsYXRlXCIpO1xuLy8gICAgICB9XG5cbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuICAgIC8vQXNzZXJ0KHMtPmJsb2NrX3N0YXJ0ID49IDBMLCBcImJsb2NrIGdvbmVcIik7XG4vLyAgICBpZiAocy5ibG9ja19zdGFydCA8IDApIHRocm93IG5ldyBFcnJvcihcImJsb2NrIGdvbmVcIik7XG5cbiAgICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICAgIHMubG9va2FoZWFkID0gMDtcblxuICAgIC8qIEVtaXQgYSBzdG9yZWQgYmxvY2sgaWYgcGVuZGluZ19idWYgd2lsbCBiZSBmdWxsOiAqL1xuICAgIHZhciBtYXhfc3RhcnQgPSBzLmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7XG5cbiAgICBpZiAocy5zdHJzdGFydCA9PT0gMCB8fCBzLnN0cnN0YXJ0ID49IG1heF9zdGFydCkge1xuICAgICAgLyogc3Ryc3RhcnQgPT0gMCBpcyBwb3NzaWJsZSB3aGVuIHdyYXBhcm91bmQgb24gMTYtYml0IG1hY2hpbmUgKi9cbiAgICAgIHMubG9va2FoZWFkID0gcy5zdHJzdGFydCAtIG1heF9zdGFydDtcbiAgICAgIHMuc3Ryc3RhcnQgPSBtYXhfc3RhcnQ7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuXG5cbiAgICB9XG4gICAgLyogRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lXG4gICAgICogbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZTpcbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQgPj0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG5cbiAgcy5pbnNlcnQgPSAwO1xuXG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuXG4gIGlmIChzLnN0cnN0YXJ0ID4gcy5ibG9ja19zdGFydCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuXG4gIHJldHVybiBCU19ORUVEX01PUkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHJlc3MgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybiB0aGUgY3VycmVudFxuICogYmxvY2sgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgYW5kIGluc2VydHNcbiAqIG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IG9ubHkgZm9yIHVubWF0Y2hlZCBzdHJpbmdzIG9yIGZvciBzaG9ydFxuICogbWF0Y2hlcy4gSXQgaXMgdXNlZCBvbmx5IGZvciB0aGUgZmFzdCBjb21wcmVzc2lvbiBvcHRpb25zLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX2Zhc3QocywgZmx1c2gpIHtcbiAgdmFyIGhhc2hfaGVhZDsgICAgICAgIC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFsd2F5cyBtYXRjaF9sZW5ndGggPCBNSU5fTUFUQ0hcbiAgICAgKi9cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiAoKHMuc3Ryc3RhcnQgLSBoYXNoX2hlYWQpIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSkge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG4gICAgfVxuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vIGNoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMubWF0Y2hfc3RhcnQsIHMubWF0Y2hfbGVuZ3RoKTsgLy8gZm9yIGRlYnVnIG9ubHlcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG5cbiAgICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGhcbiAgICAgICAqIGlzIG5vdCB0b28gbGFyZ2UuIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uXG4gICAgICAgKi9cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSBzLm1heF9sYXp5X21hdGNoLyptYXhfaW5zZXJ0X2xlbmd0aCovICYmIHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgICBzLm1hdGNoX2xlbmd0aC0tOyAvKiBzdHJpbmcgYXQgc3Ryc3RhcnQgYWxyZWFkeSBpbiB0YWJsZSAqL1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAgICAgLyoqKi9cbiAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlXG4gICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgfSB3aGlsZSAoLS1zLm1hdGNoX2xlbmd0aCAhPT0gMCk7XG4gICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIH0gZWxzZVxuICAgICAge1xuICAgICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzLnN0cnN0YXJ0XTtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy5pbnNfaCwgcy53aW5kb3dbcy5zdHJzdGFydCsxXSk7ICovXG4gICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyAxXSkgJiBzLmhhc2hfbWFzaztcblxuLy8jaWYgTUlOX01BVENIICE9IDNcbi8vICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdFxuICAgICAgICAgKiBtYXR0ZXIgc2luY2UgaXQgd2lsbCBiZSByZWNvbXB1dGVkIGF0IG5leHQgZGVmbGF0ZSBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pO1xuXG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgIH1cbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9ICgocy5zdHJzdGFydCA8IChNSU5fTUFUQ0ggLSAxKSkgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMSk7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYW1lIGFzIGFib3ZlLCBidXQgYWNoaWV2ZXMgYmV0dGVyIGNvbXByZXNzaW9uLiBXZSB1c2UgYSBsYXp5XG4gKiBldmFsdWF0aW9uIGZvciBtYXRjaGVzOiBhIG1hdGNoIGlzIGZpbmFsbHkgYWRvcHRlZCBvbmx5IGlmIHRoZXJlIGlzXG4gKiBubyBiZXR0ZXIgbWF0Y2ggYXQgdGhlIG5leHQgd2luZG93IHBvc2l0aW9uLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3Nsb3cocywgZmx1c2gpIHtcbiAgdmFyIGhhc2hfaGVhZDsgICAgICAgICAgLyogaGVhZCBvZiBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICB2YXIgbWF4X2luc2VydDtcblxuICAvKiBQcm9jZXNzIHRoZSBpbnB1dCBibG9jay4gKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgeyBicmVhazsgfSAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqL1xuICAgIHMucHJldl9sZW5ndGggPSBzLm1hdGNoX2xlbmd0aDtcbiAgICBzLnByZXZfbWF0Y2ggPSBzLm1hdGNoX3N0YXJ0O1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcblxuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmIHMucHJldl9sZW5ndGggPCBzLm1heF9sYXp5X21hdGNoICYmXG4gICAgICAgIHMuc3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkvKk1BWF9ESVNUKHMpKi8pIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gNSAmJlxuICAgICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfRklMVEVSRUQgfHwgKHMubWF0Y2hfbGVuZ3RoID09PSBNSU5fTUFUQ0ggJiYgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQgPiA0MDk2LypUT09fRkFSKi8pKSkge1xuXG4gICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2VcbiAgICAgICAgICogYnV0IHdlIHdpbGwgaWdub3JlIHRoZSBjdXJyZW50IG1hdGNoIGFueXdheS5cbiAgICAgICAgICovXG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHN0ZXAgYW5kIHRoZSBjdXJyZW50XG4gICAgICogbWF0Y2ggaXMgbm90IGJldHRlciwgb3V0cHV0IHRoZSBwcmV2aW91cyBtYXRjaDpcbiAgICAgKi9cbiAgICBpZiAocy5wcmV2X2xlbmd0aCA+PSBNSU5fTUFUQ0ggJiYgcy5tYXRjaF9sZW5ndGggPD0gcy5wcmV2X2xlbmd0aCkge1xuICAgICAgbWF4X2luc2VydCA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCAtIE1JTl9NQVRDSDtcbiAgICAgIC8qIERvIG5vdCBpbnNlcnQgc3RyaW5ncyBpbiBoYXNoIHRhYmxlIGJleW9uZCB0aGlzLiAqL1xuXG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQtMSwgcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoKTtcblxuICAgICAgLyoqKl90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLFxuICAgICAgICAgICAgICAgICAgICAgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuICAgICAgLyogSW5zZXJ0IGluIGhhc2ggdGFibGUgYWxsIHN0cmluZ3MgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2guXG4gICAgICAgKiBzdHJzdGFydC0xIGFuZCBzdHJzdGFydCBhcmUgYWxyZWFkeSBpbnNlcnRlZC4gSWYgdGhlcmUgaXMgbm90XG4gICAgICAgKiBlbm91Z2ggbG9va2FoZWFkLCB0aGUgbGFzdCB0d28gc3RyaW5ncyBhcmUgbm90IGluc2VydGVkIGluXG4gICAgICAgKiB0aGUgaGFzaCB0YWJsZS5cbiAgICAgICAqL1xuICAgICAgcy5sb29rYWhlYWQgLT0gcy5wcmV2X2xlbmd0aCAtIDE7XG4gICAgICBzLnByZXZfbGVuZ3RoIC09IDI7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICgrK3Muc3Ryc3RhcnQgPD0gbWF4X2luc2VydCkge1xuICAgICAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAgICAgLyoqKi9cbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoLS1zLnByZXZfbGVuZ3RoICE9PSAwKTtcbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqKi9cbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBtYXRjaCBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb24sIG91dHB1dCBhXG4gICAgICAgKiBzaW5nbGUgbGl0ZXJhbC4gSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYnV0IHRoZSBjdXJyZW50IG1hdGNoXG4gICAgICAgKiBpcyBsb25nZXIsIHRydW5jYXRlIHRoZSBwcmV2aW91cyBtYXRjaCB0byBhIHNpbmdsZSBsaXRlcmFsLlxuICAgICAgICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0tfT05MWShzLCAwKSAqKiovXG4gICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgICAvKioqL1xuICAgICAgfVxuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3JcbiAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgXCJubyBmbHVzaD9cIik7XG4gIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0sIGJmbHVzaCk7ICoqKi9cbiAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgfVxuICBzLmluc2VydCA9IHMuc3Ryc3RhcnQgPCBNSU5fTUFUQ0ggLSAxID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDE7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuXG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfUkxFLCBzaW1wbHkgbG9vayBmb3IgcnVucyBvZiBieXRlcywgZ2VuZXJhdGUgbWF0Y2hlcyBvbmx5IG9mIGRpc3RhbmNlXG4gKiBvbmUuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLiAgKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2ZcbiAqIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIFpfUkxFLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9ybGUocywgZmx1c2gpIHtcbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cbiAgdmFyIHByZXY7ICAgICAgICAgICAgICAvKiBieXRlIGF0IGRpc3RhbmNlIG9uZSB0byBtYXRjaCAqL1xuICB2YXIgc2Nhbiwgc3RyZW5kOyAgICAgIC8qIHNjYW4gZ29lcyB1cCB0byBzdHJlbmQgZm9yIGxlbmd0aCBvZiBydW4gKi9cblxuICB2YXIgX3dpbiA9IHMud2luZG93O1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbG9uZ2VzdCBydW4sIHBsdXMgb25lIGZvciB0aGUgdW5yb2xsZWQgbG9vcC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0ggJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgeyBicmVhazsgfSAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cblxuICAgIC8qIFNlZSBob3cgbWFueSB0aW1lcyB0aGUgcHJldmlvdXMgYnl0ZSByZXBlYXRzICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0ggJiYgcy5zdHJzdGFydCA+IDApIHtcbiAgICAgIHNjYW4gPSBzLnN0cnN0YXJ0IC0gMTtcbiAgICAgIHByZXYgPSBfd2luW3NjYW5dO1xuICAgICAgaWYgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dKSB7XG4gICAgICAgIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICAgICAgfSB3aGlsZSAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+IHMubG9va2FoZWFkKSB7XG4gICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBzLmxvb2thaGVhZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVJbnQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcbiAgICB9XG5cbiAgICAvKiBFbWl0IG1hdGNoIGlmIGhhdmUgcnVuIG9mIE1JTl9NQVRDSCBvciBsb25nZXIsIGVsc2UgZW1pdCBsaXRlcmFsICovXG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLnN0cnN0YXJ0IC0gMSwgcy5tYXRjaF9sZW5ndGgpO1xuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pO1xuXG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgIH1cbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9IVUZGTUFOX09OTFksIGRvIG5vdCBsb29rIGZvciBtYXRjaGVzLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS5cbiAqIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIEh1ZmZtYW4uKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX2h1ZmYocywgZmx1c2gpIHtcbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSBsaXRlcmFsIHRvIHdyaXRlLiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICBicmVhazsgICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIE91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pO1xuICAgIHMubG9va2FoZWFkLS07XG4gICAgcy5zdHJzdGFydCsrO1xuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiBWYWx1ZXMgZm9yIG1heF9sYXp5X21hdGNoLCBnb29kX21hdGNoIGFuZCBtYXhfY2hhaW5fbGVuZ3RoLCBkZXBlbmRpbmcgb25cbiAqIHRoZSBkZXNpcmVkIHBhY2sgbGV2ZWwgKDAuLjkpLiBUaGUgdmFsdWVzIGdpdmVuIGJlbG93IGhhdmUgYmVlbiB0dW5lZCB0b1xuICogZXhjbHVkZSB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIGZvciBwYXRob2xvZ2ljYWwgZmlsZXMuIEJldHRlciB2YWx1ZXMgbWF5IGJlXG4gKiBmb3VuZCBmb3Igc3BlY2lmaWMgZmlsZXMuXG4gKi9cbmZ1bmN0aW9uIENvbmZpZyhnb29kX2xlbmd0aCwgbWF4X2xhenksIG5pY2VfbGVuZ3RoLCBtYXhfY2hhaW4sIGZ1bmMpIHtcbiAgdGhpcy5nb29kX2xlbmd0aCA9IGdvb2RfbGVuZ3RoO1xuICB0aGlzLm1heF9sYXp5ID0gbWF4X2xhenk7XG4gIHRoaXMubmljZV9sZW5ndGggPSBuaWNlX2xlbmd0aDtcbiAgdGhpcy5tYXhfY2hhaW4gPSBtYXhfY2hhaW47XG4gIHRoaXMuZnVuYyA9IGZ1bmM7XG59XG5cbnZhciBjb25maWd1cmF0aW9uX3RhYmxlO1xuXG5jb25maWd1cmF0aW9uX3RhYmxlID0gW1xuICAvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovXG4gIG5ldyBDb25maWcoMCwgMCwgMCwgMCwgZGVmbGF0ZV9zdG9yZWQpLCAgICAgICAgICAvKiAwIHN0b3JlIG9ubHkgKi9cbiAgbmV3IENvbmZpZyg0LCA0LCA4LCA0LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgIC8qIDEgbWF4IHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi9cbiAgbmV3IENvbmZpZyg0LCA1LCAxNiwgOCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgIC8qIDIgKi9cbiAgbmV3IENvbmZpZyg0LCA2LCAzMiwgMzIsIGRlZmxhdGVfZmFzdCksICAgICAgICAgIC8qIDMgKi9cblxuICBuZXcgQ29uZmlnKDQsIDQsIDE2LCAxNiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAgLyogNCBsYXp5IG1hdGNoZXMgKi9cbiAgbmV3IENvbmZpZyg4LCAxNiwgMzIsIDMyLCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgIC8qIDUgKi9cbiAgbmV3IENvbmZpZyg4LCAxNiwgMTI4LCAxMjgsIGRlZmxhdGVfc2xvdyksICAgICAgIC8qIDYgKi9cbiAgbmV3IENvbmZpZyg4LCAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvdyksICAgICAgIC8qIDcgKi9cbiAgbmV3IENvbmZpZygzMiwgMTI4LCAyNTgsIDEwMjQsIGRlZmxhdGVfc2xvdyksICAgIC8qIDggKi9cbiAgbmV3IENvbmZpZygzMiwgMjU4LCAyNTgsIDQwOTYsIGRlZmxhdGVfc2xvdykgICAgIC8qIDkgbWF4IGNvbXByZXNzaW9uICovXG5dO1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgXCJsb25nZXN0IG1hdGNoXCIgcm91dGluZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtXG4gKi9cbmZ1bmN0aW9uIGxtX2luaXQocykge1xuICBzLndpbmRvd19zaXplID0gMiAqIHMud19zaXplO1xuXG4gIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqL1xuICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAgICovXG4gIHMubWF4X2xhenlfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9sYXp5O1xuICBzLmdvb2RfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmdvb2RfbGVuZ3RoO1xuICBzLm5pY2VfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm5pY2VfbGVuZ3RoO1xuICBzLm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9jaGFpbjtcblxuICBzLnN0cnN0YXJ0ID0gMDtcbiAgcy5ibG9ja19zdGFydCA9IDA7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5pbnNlcnQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHMuaW5zX2ggPSAwO1xufVxuXG5cbmZ1bmN0aW9uIERlZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5zdHJtID0gbnVsbDsgICAgICAgICAgICAvKiBwb2ludGVyIGJhY2sgdG8gdGhpcyB6bGliIHN0cmVhbSAqL1xuICB0aGlzLnN0YXR1cyA9IDA7ICAgICAgICAgICAgLyogYXMgdGhlIG5hbWUgaW1wbGllcyAqL1xuICB0aGlzLnBlbmRpbmdfYnVmID0gbnVsbDsgICAgICAvKiBvdXRwdXQgc3RpbGwgcGVuZGluZyAqL1xuICB0aGlzLnBlbmRpbmdfYnVmX3NpemUgPSAwOyAgLyogc2l6ZSBvZiBwZW5kaW5nX2J1ZiAqL1xuICB0aGlzLnBlbmRpbmdfb3V0ID0gMDsgICAgICAgLyogbmV4dCBwZW5kaW5nIGJ5dGUgdG8gb3V0cHV0IHRvIHRoZSBzdHJlYW0gKi9cbiAgdGhpcy5wZW5kaW5nID0gMDsgICAgICAgICAgIC8qIG5iIG9mIGJ5dGVzIGluIHRoZSBwZW5kaW5nIGJ1ZmZlciAqL1xuICB0aGlzLndyYXAgPSAwOyAgICAgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqL1xuICB0aGlzLmd6aGVhZCA9IG51bGw7ICAgICAgICAgLyogZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gdG8gd3JpdGUgKi9cbiAgdGhpcy5nemluZGV4ID0gMDsgICAgICAgICAgIC8qIHdoZXJlIGluIGV4dHJhLCBuYW1lLCBvciBjb21tZW50ICovXG4gIHRoaXMubWV0aG9kID0gWl9ERUZMQVRFRDsgLyogY2FuIG9ubHkgYmUgREVGTEFURUQgKi9cbiAgdGhpcy5sYXN0X2ZsdXNoID0gLTE7ICAgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqL1xuXG4gIHRoaXMud19zaXplID0gMDsgIC8qIExaNzcgd2luZG93IHNpemUgKDMySyBieSBkZWZhdWx0KSAqL1xuICB0aGlzLndfYml0cyA9IDA7ICAvKiBsb2cyKHdfc2l6ZSkgICg4Li4xNikgKi9cbiAgdGhpcy53X21hc2sgPSAwOyAgLyogd19zaXplIC0gMSAqL1xuXG4gIHRoaXMud2luZG93ID0gbnVsbDtcbiAgLyogU2xpZGluZyB3aW5kb3cuIElucHV0IGJ5dGVzIGFyZSByZWFkIGludG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3aW5kb3csXG4gICAqIGFuZCBtb3ZlIHRvIHRoZSBmaXJzdCBoYWxmIGxhdGVyIHRvIGtlZXAgYSBkaWN0aW9uYXJ5IG9mIGF0IGxlYXN0IHdTaXplXG4gICAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2ZcbiAgICogd1NpemUtTUFYX01BVENIIGJ5dGVzLCBidXQgdGhpcyBlbnN1cmVzIHRoYXQgSU8gaXMgYWx3YXlzXG4gICAqIHBlcmZvcm1lZCB3aXRoIGEgbGVuZ3RoIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLlxuICAgKi9cblxuICB0aGlzLndpbmRvd19zaXplID0gMDtcbiAgLyogQWN0dWFsIHNpemUgb2Ygd2luZG93OiAyKndTaXplLCBleGNlcHQgd2hlbiB0aGUgdXNlciBpbnB1dCBidWZmZXJcbiAgICogaXMgZGlyZWN0bHkgdXNlZCBhcyBzbGlkaW5nIHdpbmRvdy5cbiAgICovXG5cbiAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXNcbiAgICogYXJyYXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy5cbiAgICogQW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyB0aHVzIGEgd2luZG93IGluZGV4IG1vZHVsbyAzMksuXG4gICAqL1xuXG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgLyogSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIE5JTC4gKi9cblxuICB0aGlzLmluc19oID0gMDsgICAgICAgLyogaGFzaCBpbmRleCBvZiBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWQgKi9cbiAgdGhpcy5oYXNoX3NpemUgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBoYXNoIHRhYmxlICovXG4gIHRoaXMuaGFzaF9iaXRzID0gMDsgICAvKiBsb2cyKGhhc2hfc2l6ZSkgKi9cbiAgdGhpcy5oYXNoX21hc2sgPSAwOyAgIC8qIGhhc2hfc2l6ZS0xICovXG5cbiAgdGhpcy5oYXNoX3NoaWZ0ID0gMDtcbiAgLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggbXVzdCBiZSBzaGlmdGVkIGF0IGVhY2ggaW5wdXRcbiAgICogc3RlcC4gSXQgbXVzdCBiZSBzdWNoIHRoYXQgYWZ0ZXIgTUlOX01BVENIIHN0ZXBzLCB0aGUgb2xkZXN0XG4gICAqIGJ5dGUgbm8gbG9uZ2VyIHRha2VzIHBhcnQgaW4gdGhlIGhhc2gga2V5LCB0aGF0IGlzOlxuICAgKiAgIGhhc2hfc2hpZnQgKiBNSU5fTUFUQ0ggPj0gaGFzaF9iaXRzXG4gICAqL1xuXG4gIHRoaXMuYmxvY2tfc3RhcnQgPSAwO1xuICAvKiBXaW5kb3cgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBvdXRwdXQgYmxvY2suIEdldHNcbiAgICogbmVnYXRpdmUgd2hlbiB0aGUgd2luZG93IGlzIG1vdmVkIGJhY2t3YXJkcy5cbiAgICovXG5cbiAgdGhpcy5tYXRjaF9sZW5ndGggPSAwOyAgICAgIC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovXG4gIHRoaXMucHJldl9tYXRjaCA9IDA7ICAgICAgICAvKiBwcmV2aW91cyBtYXRjaCAqL1xuICB0aGlzLm1hdGNoX2F2YWlsYWJsZSA9IDA7ICAgLyogc2V0IGlmIHByZXZpb3VzIG1hdGNoIGV4aXN0cyAqL1xuICB0aGlzLnN0cnN0YXJ0ID0gMDsgICAgICAgICAgLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqL1xuICB0aGlzLm1hdGNoX3N0YXJ0ID0gMDsgICAgICAgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovXG4gIHRoaXMubG9va2FoZWFkID0gMDsgICAgICAgICAvKiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWhlYWQgaW4gd2luZG93ICovXG5cbiAgdGhpcy5wcmV2X2xlbmd0aCA9IDA7XG4gIC8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpc1xuICAgKiBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi5cbiAgICovXG5cbiAgdGhpcy5tYXhfY2hhaW5fbGVuZ3RoID0gMDtcbiAgLyogVG8gc3BlZWQgdXAgZGVmbGF0aW9uLCBoYXNoIGNoYWlucyBhcmUgbmV2ZXIgc2VhcmNoZWQgYmV5b25kIHRoaXNcbiAgICogbGVuZ3RoLiAgQSBoaWdoZXIgbGltaXQgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8gYnV0IGRlZ3JhZGVzIHRoZVxuICAgKiBzcGVlZC5cbiAgICovXG5cbiAgdGhpcy5tYXhfbGF6eV9tYXRjaCA9IDA7XG4gIC8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHlcbiAgICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb25cbiAgICogbGV2ZWxzID49IDQuXG4gICAqL1xuICAvLyBUaGF0J3MgYWxpYXMgdG8gbWF4X2xhenlfbWF0Y2gsIGRvbid0IHVzZSBkaXJlY3RseVxuICAvL3RoaXMubWF4X2luc2VydF9sZW5ndGggPSAwO1xuICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdFxuICAgKiBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uXG4gICAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuXG4gICAqL1xuXG4gIHRoaXMubGV2ZWwgPSAwOyAgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKDEuLjkpICovXG4gIHRoaXMuc3RyYXRlZ3kgPSAwOyAgLyogZmF2b3Igb3IgZm9yY2UgSHVmZm1hbiBjb2RpbmcqL1xuXG4gIHRoaXMuZ29vZF9tYXRjaCA9IDA7XG4gIC8qIFVzZSBhIGZhc3RlciBzZWFyY2ggd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhpcyAqL1xuXG4gIHRoaXMubmljZV9tYXRjaCA9IDA7IC8qIFN0b3Agc2VhcmNoaW5nIHdoZW4gY3VycmVudCBtYXRjaCBleGNlZWRzIHRoaXMgKi9cblxuICAgICAgICAgICAgICAvKiB1c2VkIGJ5IHRyZWVzLmM6ICovXG5cbiAgLyogRGlkbid0IHVzZSBjdF9kYXRhIHR5cGVkZWYgYmVsb3cgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZyAqL1xuXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2x0cmVlW0hFQVBfU0laRV07ICAgLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgYmxfdHJlZVsyKkJMX0NPREVTKzFdOyAgLyogSHVmZm1hbiB0cmVlIGZvciBiaXQgbGVuZ3RocyAqL1xuXG4gIC8vIFVzZSBmbGF0IGFycmF5IG9mIERPVUJMRSBzaXplLCB3aXRoIGludGVybGVhdmVkIGZhdGEsXG4gIC8vIGJlY2F1c2UgSlMgZG9lcyBub3Qgc3VwcG9ydCBlZmZlY3RpdmVcbiAgdGhpcy5keW5fbHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KEhFQVBfU0laRSAqIDIpO1xuICB0aGlzLmR5bl9kdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBEX0NPREVTICsgMSkgKiAyKTtcbiAgdGhpcy5ibF90cmVlICAgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogQkxfQ09ERVMgKyAxKSAqIDIpO1xuICB6ZXJvKHRoaXMuZHluX2x0cmVlKTtcbiAgemVybyh0aGlzLmR5bl9kdHJlZSk7XG4gIHplcm8odGhpcy5ibF90cmVlKTtcblxuICB0aGlzLmxfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgbGl0ZXJhbCB0cmVlICovXG4gIHRoaXMuZF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBkaXN0YW5jZSB0cmVlICovXG4gIHRoaXMuYmxfZGVzYyAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBiaXQgbGVuZ3RoIHRyZWUgKi9cblxuICAvL3VzaCBibF9jb3VudFtNQVhfQklUUysxXTtcbiAgdGhpcy5ibF9jb3VudCA9IG5ldyB1dGlscy5CdWYxNihNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvL2ludCBoZWFwWzIqTF9DT0RFUysxXTsgICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi9cbiAgdGhpcy5oZWFwID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7ICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi9cbiAgemVybyh0aGlzLmhlYXApO1xuXG4gIHRoaXMuaGVhcF9sZW4gPSAwOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGVhcCAqL1xuICB0aGlzLmhlYXBfbWF4ID0gMDsgICAgICAgICAgICAgICAvKiBlbGVtZW50IG9mIGxhcmdlc3QgZnJlcXVlbmN5ICovXG4gIC8qIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uIGhlYXBbMF0gaXMgbm90IHVzZWQuXG4gICAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuXG4gICAqL1xuXG4gIHRoaXMuZGVwdGggPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgLy91Y2ggZGVwdGhbMipMX0NPREVTKzFdO1xuICB6ZXJvKHRoaXMuZGVwdGgpO1xuICAvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5XG4gICAqL1xuXG4gIHRoaXMubF9idWYgPSAwOyAgICAgICAgICAvKiBidWZmZXIgaW5kZXggZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMgKi9cblxuICB0aGlzLmxpdF9idWZzaXplID0gMDtcbiAgLyogU2l6ZSBvZiBtYXRjaCBidWZmZXIgZm9yIGxpdGVyYWxzL2xlbmd0aHMuICBUaGVyZSBhcmUgNCByZWFzb25zIGZvclxuICAgKiBsaW1pdGluZyBsaXRfYnVmc2l6ZSB0byA2NEs6XG4gICAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnNcbiAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciB0aGUgZmlyc3QgYmxvY2ssIGFsbCBpbnB1dFxuICAgKiAgICAgZGF0YSBpcyBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW5cbiAgICogICAgIHdoZW4gaW5wdXQgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yXG4gICAqICAgICBhbGwgYmxvY2tzIGlmIGxpdF9idWZzaXplIGlzIG5vdCBncmVhdGVyIHRoYW4gMzJLLilcbiAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuXG4gICAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuXG4gICAqICAgICBUaGlzIGlzIGFwcGxpY2FibGUgb25seSBmb3IgemlwIChub3QgZ3ppcCBvciB6bGliKS5cbiAgICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdFxuICAgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvclxuICAgKiAgICAgZXhhbXBsZSBhIGJpbmFyeSBmaWxlIHdpdGggcG9vcmx5IGNvbXByZXNzaWJsZSBjb2RlIGZvbGxvd2VkIGJ5XG4gICAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZVxuICAgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nXG4gICAqICAgICB0cmVlcyBtb3JlIGZyZXF1ZW50bHkuXG4gICAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDRcbiAgICovXG5cbiAgdGhpcy5sYXN0X2xpdCA9IDA7ICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuXG4gIHRoaXMuZF9idWYgPSAwO1xuICAvKiBCdWZmZXIgaW5kZXggZm9yIGRpc3RhbmNlcy4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsIGRfYnVmIGFuZCBsX2J1ZiBoYXZlXG4gICAqIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy4gVG8gdXNlIGRpZmZlcmVudCBsZW5ndGhzLCBhbiBleHRyYSBmbGFnXG4gICAqIGFycmF5IHdvdWxkIGJlIG5lY2Vzc2FyeS5cbiAgICovXG5cbiAgdGhpcy5vcHRfbGVuID0gMDsgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggb3B0aW1hbCB0cmVlcyAqL1xuICB0aGlzLnN0YXRpY19sZW4gPSAwOyAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi9cbiAgdGhpcy5tYXRjaGVzID0gMDsgICAgICAgLyogbnVtYmVyIG9mIHN0cmluZyBtYXRjaGVzIGluIGN1cnJlbnQgYmxvY2sgKi9cbiAgdGhpcy5pbnNlcnQgPSAwOyAgICAgICAgLyogYnl0ZXMgYXQgZW5kIG9mIHdpbmRvdyBsZWZ0IHRvIGluc2VydCAqL1xuXG5cbiAgdGhpcy5iaV9idWYgPSAwO1xuICAvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdFxuICAgKiBzaWduaWZpY2FudCBiaXRzKS5cbiAgICovXG4gIHRoaXMuYmlfdmFsaWQgPSAwO1xuICAvKiBOdW1iZXIgb2YgdmFsaWQgYml0cyBpbiBiaV9idWYuICBBbGwgYml0cyBhYm92ZSB0aGUgbGFzdCB2YWxpZCBiaXRcbiAgICogYXJlIGFsd2F5cyB6ZXJvLlxuICAgKi9cblxuICAvLyBVc2VkIGZvciB3aW5kb3cgbWVtb3J5IGluaXQuIFdlIHNhZmVseSBpZ25vcmUgaXQgZm9yIEpTLiBUaGF0IG1ha2VzXG4gIC8vIHNlbnNlIG9ubHkgZm9yIHBvaW50ZXJzIGFuZCBtZW1vcnkgY2hlY2sgdG9vbHMuXG4gIC8vdGhpcy5oaWdoX3dhdGVyID0gMDtcbiAgLyogSGlnaCB3YXRlciBtYXJrIG9mZnNldCBpbiB3aW5kb3cgZm9yIGluaXRpYWxpemVkIGJ5dGVzIC0tIGJ5dGVzIGFib3ZlXG4gICAqIHRoaXMgYXJlIHNldCB0byB6ZXJvIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayB3YXJuaW5ncyB3aGVuXG4gICAqIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMgYWNjZXNzIGJ5dGVzIHBhc3QgdGhlIGlucHV0LiAgVGhpcyBpcyB0aGVuXG4gICAqIHVwZGF0ZWQgdG8gdGhlIG5ldyBoaWdoIHdhdGVyIG1hcmsuXG4gICAqL1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldEtlZXAoc3RybSkge1xuICB2YXIgcztcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG4gIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IDA7XG4gIHN0cm0uZGF0YV90eXBlID0gWl9VTktOT1dOO1xuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICBzLnBlbmRpbmcgPSAwO1xuICBzLnBlbmRpbmdfb3V0ID0gMDtcblxuICBpZiAocy53cmFwIDwgMCkge1xuICAgIHMud3JhcCA9IC1zLndyYXA7XG4gICAgLyogd2FzIG1hZGUgbmVnYXRpdmUgYnkgZGVmbGF0ZSguLi4sIFpfRklOSVNIKTsgKi9cbiAgfVxuICBzLnN0YXR1cyA9IChzLndyYXAgPyBJTklUX1NUQVRFIDogQlVTWV9TVEFURSk7XG4gIHN0cm0uYWRsZXIgPSAocy53cmFwID09PSAyKSA/XG4gICAgMCAgLy8gY3JjMzIoMCwgWl9OVUxMLCAwKVxuICA6XG4gICAgMTsgLy8gYWRsZXIzMigwLCBaX05VTEwsIDApXG4gIHMubGFzdF9mbHVzaCA9IFpfTk9fRkxVU0g7XG4gIHRyZWVzLl90cl9pbml0KHMpO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgcmV0ID0gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKTtcbiAgaWYgKHJldCA9PT0gWl9PSykge1xuICAgIGxtX2luaXQoc3RybS5zdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlU2V0SGVhZGVyKHN0cm0sIGhlYWQpIHtcbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBpZiAoc3RybS5zdGF0ZS53cmFwICE9PSAyKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdHJtLnN0YXRlLmd6aGVhZCA9IGhlYWQ7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpIHtcbiAgaWYgKCFzdHJtKSB7IC8vID09PSBaX05VTExcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cbiAgdmFyIHdyYXAgPSAxO1xuXG4gIGlmIChsZXZlbCA9PT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSB7XG4gICAgbGV2ZWwgPSA2O1xuICB9XG5cbiAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7IC8qIHN1cHByZXNzIHpsaWIgd3JhcHBlciAqL1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKHdpbmRvd0JpdHMgPiAxNSkge1xuICAgIHdyYXAgPSAyOyAgICAgICAgICAgLyogd3JpdGUgZ3ppcCB3cmFwcGVyIGluc3RlYWQgKi9cbiAgICB3aW5kb3dCaXRzIC09IDE2O1xuICB9XG5cblxuICBpZiAobWVtTGV2ZWwgPCAxIHx8IG1lbUxldmVsID4gTUFYX01FTV9MRVZFTCB8fCBtZXRob2QgIT09IFpfREVGTEFURUQgfHxcbiAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fFxuICAgIHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfRklYRUQpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG5cbiAgaWYgKHdpbmRvd0JpdHMgPT09IDgpIHtcbiAgICB3aW5kb3dCaXRzID0gOTtcbiAgfVxuICAvKiB1bnRpbCAyNTYtYnl0ZSB3aW5kb3cgYnVnIGZpeGVkICovXG5cbiAgdmFyIHMgPSBuZXcgRGVmbGF0ZVN0YXRlKCk7XG5cbiAgc3RybS5zdGF0ZSA9IHM7XG4gIHMuc3RybSA9IHN0cm07XG5cbiAgcy53cmFwID0gd3JhcDtcbiAgcy5nemhlYWQgPSBudWxsO1xuICBzLndfYml0cyA9IHdpbmRvd0JpdHM7XG4gIHMud19zaXplID0gMSA8PCBzLndfYml0cztcbiAgcy53X21hc2sgPSBzLndfc2l6ZSAtIDE7XG5cbiAgcy5oYXNoX2JpdHMgPSBtZW1MZXZlbCArIDc7XG4gIHMuaGFzaF9zaXplID0gMSA8PCBzLmhhc2hfYml0cztcbiAgcy5oYXNoX21hc2sgPSBzLmhhc2hfc2l6ZSAtIDE7XG4gIHMuaGFzaF9zaGlmdCA9IH5+KChzLmhhc2hfYml0cyArIE1JTl9NQVRDSCAtIDEpIC8gTUlOX01BVENIKTtcblxuICBzLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplICogMik7XG4gIHMuaGVhZCA9IG5ldyB1dGlscy5CdWYxNihzLmhhc2hfc2l6ZSk7XG4gIHMucHJldiA9IG5ldyB1dGlscy5CdWYxNihzLndfc2l6ZSk7XG5cbiAgLy8gRG9uJ3QgbmVlZCBtZW0gaW5pdCBtYWdpYyBmb3IgSlMuXG4gIC8vcy5oaWdoX3dhdGVyID0gMDsgIC8qIG5vdGhpbmcgd3JpdHRlbiB0byBzLT53aW5kb3cgeWV0ICovXG5cbiAgcy5saXRfYnVmc2l6ZSA9IDEgPDwgKG1lbUxldmVsICsgNik7IC8qIDE2SyBlbGVtZW50cyBieSBkZWZhdWx0ICovXG5cbiAgcy5wZW5kaW5nX2J1Zl9zaXplID0gcy5saXRfYnVmc2l6ZSAqIDQ7XG5cbiAgLy9vdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKHN0cm0sIHMtPmxpdF9idWZzaXplLCBzaXplb2YodXNoKSsyKTtcbiAgLy9zLT5wZW5kaW5nX2J1ZiA9ICh1Y2hmICopIG92ZXJsYXk7XG4gIHMucGVuZGluZ19idWYgPSBuZXcgdXRpbHMuQnVmOChzLnBlbmRpbmdfYnVmX3NpemUpO1xuXG4gIC8vIEl0IGlzIG9mZnNldCBmcm9tIGBzLnBlbmRpbmdfYnVmYCAoc2l6ZSBpcyBgcy5saXRfYnVmc2l6ZSAqIDJgKVxuICAvL3MtPmRfYnVmID0gb3ZlcmxheSArIHMtPmxpdF9idWZzaXplL3NpemVvZih1c2gpO1xuICBzLmRfYnVmID0gMSAqIHMubGl0X2J1ZnNpemU7XG5cbiAgLy9zLT5sX2J1ZiA9IHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKnMtPmxpdF9idWZzaXplO1xuICBzLmxfYnVmID0gKDEgKyAyKSAqIHMubGl0X2J1ZnNpemU7XG5cbiAgcy5sZXZlbCA9IGxldmVsO1xuICBzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gIHMubWV0aG9kID0gbWV0aG9kO1xuXG4gIHJldHVybiBkZWZsYXRlUmVzZXQoc3RybSk7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVJbml0KHN0cm0sIGxldmVsKSB7XG4gIHJldHVybiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIE1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZKTtcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBvbGRfZmx1c2gsIHM7XG4gIHZhciBiZWcsIHZhbDsgLy8gZm9yIGd6aXAgaGVhZGVyIHdyaXRlIG9ubHlcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHxcbiAgICBmbHVzaCA+IFpfQkxPQ0sgfHwgZmx1c2ggPCAwKSB7XG4gICAgcmV0dXJuIHN0cm0gPyBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpIDogWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcblxuICBpZiAoIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkgfHxcbiAgICAgIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIGZsdXNoICE9PSBaX0ZJTklTSCkpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIChzdHJtLmF2YWlsX291dCA9PT0gMCkgPyBaX0JVRl9FUlJPUiA6IFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG4gIHMuc3RybSA9IHN0cm07IC8qIGp1c3QgaW4gY2FzZSAqL1xuICBvbGRfZmx1c2ggPSBzLmxhc3RfZmx1c2g7XG4gIHMubGFzdF9mbHVzaCA9IGZsdXNoO1xuXG4gIC8qIFdyaXRlIHRoZSBoZWFkZXIgKi9cbiAgaWYgKHMuc3RhdHVzID09PSBJTklUX1NUQVRFKSB7XG5cbiAgICBpZiAocy53cmFwID09PSAyKSB7IC8vIEdaSVAgaGVhZGVyXG4gICAgICBzdHJtLmFkbGVyID0gMDsgIC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICBwdXRfYnl0ZShzLCAzMSk7XG4gICAgICBwdXRfYnl0ZShzLCAxMzkpO1xuICAgICAgcHV0X2J5dGUocywgOCk7XG4gICAgICBpZiAoIXMuZ3poZWFkKSB7IC8vIHMtPmd6aGVhZCA9PSBaX05VTExcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIE9TX0NPREUpO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRleHQgPyAxIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAocy5nemhlYWQuaGNyYyA/IDIgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuZXh0cmEgPyAwIDogNCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLm5hbWUgPyAwIDogOCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmNvbW1lbnQgPyAwIDogMTYpXG4gICAgICAgICk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMTYpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLm9zICYgMHhmZik7XG4gICAgICAgIGlmIChzLmd6aGVhZC5leHRyYSAmJiBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmKTtcbiAgICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQuZXh0cmEubGVuZ3RoID4+IDgpICYgMHhmZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IEVYVFJBX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIC8vIERFRkxBVEUgaGVhZGVyXG4gICAge1xuICAgICAgdmFyIGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLndfYml0cyAtIDgpIDw8IDQpKSA8PCA4O1xuICAgICAgdmFyIGxldmVsX2ZsYWdzID0gLTE7XG5cbiAgICAgIGlmIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyKSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsID09PSA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMztcbiAgICAgIH1cbiAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7XG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgeyBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7IH1cbiAgICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7XG5cbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7XG5cbiAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqL1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSAxOyAvLyBhZGxlcjMyKDBMLCBaX05VTEwsIDApO1xuICAgIH1cbiAgfVxuXG4vLyNpZmRlZiBHWklQXG4gIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuZXh0cmEvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuXG4gICAgICB3aGlsZSAocy5nemluZGV4IDwgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmZmZikpIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYVtzLmd6aW5kZXhdICYgMHhmZik7XG4gICAgICAgIHMuZ3ppbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAocy5nemluZGV4ID09PSBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLm5hbWUvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IENPTU1FTlRfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuY29tbWVudC8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSENSQ19TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgfVxuICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgc3RybS5hZGxlciA9IDA7IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgfVxuICB9XG4vLyNlbmRpZlxuXG4gIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi9cbiAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoXG4gICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZFxuICAgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sXG4gICAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOlxuICAgICAgICovXG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZVxuICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwXG4gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLlxuICAgICAqL1xuICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmXG4gICAgZmx1c2ggIT09IFpfRklOSVNIKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqL1xuICBpZiAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fFxuICAgIChmbHVzaCAhPT0gWl9OT19GTFVTSCAmJiBzLnN0YXR1cyAhPT0gRklOSVNIX1NUQVRFKSkge1xuICAgIHZhciBic3RhdGUgPSAocy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAocy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOlxuICAgICAgICBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LO1xuICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbFxuICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmVcbiAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhblxuICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc29cbiAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdFxuICAgICAgICogb25lIGVtcHR5IGJsb2NrLlxuICAgICAgICovXG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9QQVJUSUFMX0ZMVVNIKSB7XG4gICAgICAgIHRyZWVzLl90cl9hbGlnbihzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZsdXNoICE9PSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqL1xuXG4gICAgICAgIHRyZWVzLl90cl9zdG9yZWRfYmxvY2socywgMCwgMCwgZmFsc2UpO1xuICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZFxuICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0ZVTExfRkxVU0gpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi8gICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsIFwiYnVnMlwiKTtcbiAgLy9pZiAoc3RybS5hdmFpbF9vdXQgPD0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJidWcyXCIpO31cblxuICBpZiAoZmx1c2ggIT09IFpfRklOSVNIKSB7IHJldHVybiBaX09LOyB9XG4gIGlmIChzLndyYXAgPD0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRU5EOyB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkgeyBzLndyYXAgPSAtcy53cmFwOyB9XG4gIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi9cbiAgcmV0dXJuIHMucGVuZGluZyAhPT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkge1xuICB2YXIgc3RhdHVzO1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdHVzID0gc3RybS5zdGF0ZS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBOQU1FX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBCVVNZX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEVcbiAgKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnN0YXRlID0gbnVsbDtcblxuICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUikgOiBaX09LO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGVcbiAqIHNlcXVlbmNlIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzO1xuICB2YXIgc3RyLCBuO1xuICB2YXIgd3JhcDtcbiAgdmFyIGF2YWlsO1xuICB2YXIgbmV4dDtcbiAgdmFyIGlucHV0O1xuICB2YXIgdG1wRGljdDtcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICB3cmFwID0gcy53cmFwO1xuXG4gIGlmICh3cmFwID09PSAyIHx8ICh3cmFwID09PSAxICYmIHMuc3RhdHVzICE9PSBJTklUX1NUQVRFKSB8fCBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIHdoZW4gdXNpbmcgemxpYiB3cmFwcGVycywgY29tcHV0ZSBBZGxlci0zMiBmb3IgcHJvdmlkZWQgZGljdGlvbmFyeSAqL1xuICBpZiAod3JhcCA9PT0gMSkge1xuICAgIC8qIGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICB9XG5cbiAgcy53cmFwID0gMDsgICAvKiBhdm9pZCBjb21wdXRpbmcgQWRsZXItMzIgaW4gcmVhZF9idWYgKi9cblxuICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi9cbiAgaWYgKGRpY3RMZW5ndGggPj0gcy53X3NpemUpIHtcbiAgICBpZiAod3JhcCA9PT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovXG4gICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcbiAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICBzLmluc2VydCA9IDA7XG4gICAgfVxuICAgIC8qIHVzZSB0aGUgdGFpbCAqL1xuICAgIC8vIGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5LnNsaWNlKGRpY3RMZW5ndGggLSBzLndfc2l6ZSk7XG4gICAgdG1wRGljdCA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplKTtcbiAgICB1dGlscy5hcnJheVNldCh0bXBEaWN0LCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoIC0gcy53X3NpemUsIHMud19zaXplLCAwKTtcbiAgICBkaWN0aW9uYXJ5ID0gdG1wRGljdDtcbiAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7XG4gIH1cbiAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi9cbiAgYXZhaWwgPSBzdHJtLmF2YWlsX2luO1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBkaWN0TGVuZ3RoO1xuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmlucHV0ID0gZGljdGlvbmFyeTtcbiAgZmlsbF93aW5kb3cocyk7XG4gIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICBzdHIgPSBzLnN0cnN0YXJ0O1xuICAgIG4gPSBzLmxvb2thaGVhZCAtIChNSU5fTUFUQ0ggLSAxKTtcbiAgICBkbyB7XG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcblxuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgc3RyKys7XG4gICAgfSB3aGlsZSAoLS1uKTtcbiAgICBzLnN0cnN0YXJ0ID0gc3RyO1xuICAgIHMubG9va2FoZWFkID0gTUlOX01BVENIIC0gMTtcbiAgICBmaWxsX3dpbmRvdyhzKTtcbiAgfVxuICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGF2YWlsO1xuICBzLndyYXAgPSB3cmFwO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5leHBvcnRzLmRlZmxhdGVJbml0ID0gZGVmbGF0ZUluaXQ7XG5leHBvcnRzLmRlZmxhdGVJbml0MiA9IGRlZmxhdGVJbml0MjtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0ID0gZGVmbGF0ZVJlc2V0O1xuZXhwb3J0cy5kZWZsYXRlUmVzZXRLZWVwID0gZGVmbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuZGVmbGF0ZVNldEhlYWRlciA9IGRlZmxhdGVTZXRIZWFkZXI7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDtcbmV4cG9ydHMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuZGVmbGF0ZUluZm8gPSAncGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5kZWZsYXRlQm91bmQgPSBkZWZsYXRlQm91bmQ7XG5leHBvcnRzLmRlZmxhdGVDb3B5ID0gZGVmbGF0ZUNvcHk7XG5leHBvcnRzLmRlZmxhdGVQYXJhbXMgPSBkZWZsYXRlUGFyYW1zO1xuZXhwb3J0cy5kZWZsYXRlUGVuZGluZyA9IGRlZmxhdGVQZW5kaW5nO1xuZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZsYXRlUHJpbWU7XG5leHBvcnRzLmRlZmxhdGVUdW5lID0gZGVmbGF0ZVR1bmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIEdaaGVhZGVyKCkge1xuICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovXG4gIHRoaXMudGV4dCAgICAgICA9IDA7XG4gIC8qIG1vZGlmaWNhdGlvbiB0aW1lICovXG4gIHRoaXMudGltZSAgICAgICA9IDA7XG4gIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMueGZsYWdzICAgICA9IDA7XG4gIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi9cbiAgdGhpcy5vcyAgICAgICAgID0gMDtcbiAgLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqL1xuICB0aGlzLmV4dHJhICAgICAgPSBudWxsO1xuICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi9cbiAgdGhpcy5leHRyYV9sZW4gID0gMDsgLy8gQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgaXQgaW4gSlMsXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSBmb3IgZmV3IGNvZGUgbW9kaWZpY2F0aW9uc1xuXG4gIC8vXG4gIC8vIFNldHVwIGxpbWl0cyBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnlcbiAgLy8gZm9yIGluZmxhdGUgdXNlIGNvbnN0YW50IGxpbWl0IGluIDY1NTM2IGJ5dGVzXG4gIC8vXG5cbiAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5leHRyYV9tYXggID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqL1xuICB0aGlzLm5hbWUgICAgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLm5hbWVfbWF4ICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqL1xuICB0aGlzLmNvbW1lbnQgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmNvbW1fbWF4ICAgPSAwO1xuICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqL1xuICB0aGlzLmhjcmMgICAgICAgPSAwO1xuICAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMuZG9uZSAgICAgICA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdaaGVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFNlZSBzdGF0ZSBkZWZzIGZyb20gaW5mbGF0ZS5qc1xudmFyIEJBRCA9IDMwOyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cblxuLypcbiAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmdcbiAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpc1xuICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3JcbiAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGVcbiAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLlxuXG4gICBFbnRyeSBhc3N1bXB0aW9uczpcblxuICAgICAgICBzdGF0ZS5tb2RlID09PSBMRU5cbiAgICAgICAgc3RybS5hdmFpbF9pbiA+PSA2XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID49IDI1OFxuICAgICAgICBzdGFydCA+PSBzdHJtLmF2YWlsX291dFxuICAgICAgICBzdGF0ZS5iaXRzIDwgOFxuXG4gICBPbiByZXR1cm4sIHN0YXRlLm1vZGUgaXMgb25lIG9mOlxuXG4gICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dFxuICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9ja1xuICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YVxuXG4gICBOb3RlczpcblxuICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlXG4gICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSxcbiAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuXG4gICAgICBUaGVyZWZvcmUgaWYgc3RybS5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZFxuICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy5cblxuICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OFxuICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpXG4gICAgICByZXF1aXJlcyBzdHJtLmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3JcbiAgICAgIG91dHB1dCBzcGFjZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgX2luOyAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5pbnB1dCAqL1xuICB2YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogaGF2ZSBlbm91Z2ggaW5wdXQgd2hpbGUgaW4gPCBsYXN0ICovXG4gIHZhciBfb3V0OyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgYmVnOyAgICAgICAgICAgICAgICAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovXG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICB2YXIgZG1heDsgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovXG4vLyNlbmRpZlxuICB2YXIgd3NpemU7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHZhciB3aGF2ZTsgICAgICAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHZhciB3bmV4dDsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgLy8gVXNlIGBzX3dpbmRvd2AgaW5zdGVhZCBgd2luZG93YCwgYXZvaWQgY29uZmxpY3Qgd2l0aCBpbnN0cnVtZW50YXRpb24gdG9vbHNcbiAgdmFyIHNfd2luZG93OyAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5ob2xkICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmJpdHMgKi9cbiAgdmFyIGxjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ubGVuY29kZSAqL1xuICB2YXIgZGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5kaXN0Y29kZSAqL1xuICB2YXIgbG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovXG4gIHZhciBkbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuICB2YXIgaGVyZTsgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovXG4gIHZhciBvcDsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB3aW5kb3cgcG9zaXRpb24sIHdpbmRvdyBieXRlcyB0byBjb3B5ICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqL1xuICB2YXIgZGlzdDsgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG5cblxuICB2YXIgaW5wdXQsIG91dHB1dDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuXG4gIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovXG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgLy9oZXJlID0gc3RhdGUuaGVyZTtcbiAgX2luID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGxhc3QgPSBfaW4gKyAoc3RybS5hdmFpbF9pbiAtIDUpO1xuICBfb3V0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGJlZyA9IF9vdXQgLSAoc3RhcnQgLSBzdHJtLmF2YWlsX291dCk7XG4gIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgZG1heCA9IHN0YXRlLmRtYXg7XG4vLyNlbmRpZlxuICB3c2l6ZSA9IHN0YXRlLndzaXplO1xuICB3aGF2ZSA9IHN0YXRlLndoYXZlO1xuICB3bmV4dCA9IHN0YXRlLnduZXh0O1xuICBzX3dpbmRvdyA9IHN0YXRlLndpbmRvdztcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICBsY29kZSA9IHN0YXRlLmxlbmNvZGU7XG4gIGRjb2RlID0gc3RhdGUuZGlzdGNvZGU7XG4gIGxtYXNrID0gKDEgPDwgc3RhdGUubGVuYml0cykgLSAxO1xuICBkbWFzayA9ICgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDE7XG5cblxuICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2hcbiAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgKi9cblxuICB0b3A6XG4gIGRvIHtcbiAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICB9XG5cbiAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTtcblxuICAgIGRvbGVuOlxuICAgIGZvciAoOzspIHsgLy8gR290byBlbXVsYXRpb25cbiAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgYml0cyAtPSBvcDtcbiAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcbiAgICAgIGlmIChvcCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICBvdXRwdXRbX291dCsrXSA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi9cbiAgICAgICAgbGVuID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgaWYgKG9wKSB7XG4gICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgbGVuKSk7XG4gICAgICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTtcblxuICAgICAgICBkb2Rpc3Q6XG4gICAgICAgIGZvciAoOzspIHsgLy8gZ290byBlbXVsYXRpb25cbiAgICAgICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG5cbiAgICAgICAgICBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYXNlICovXG4gICAgICAgICAgICBkaXN0ID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgZGlzdCkpO1xuICAgICAgICAgICAgb3AgPSBfb3V0IC0gYmVnOyAgICAgICAgICAgICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovXG4gICAgICAgICAgICBpZiAoZGlzdCA+IG9wKSB7ICAgICAgICAgICAgICAgIC8qIHNlZSBpZiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgIG9wID0gZGlzdCAtIG9wOyAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICAgICAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTtcbi8vICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCA+IHdoYXZlKTtcbi8vICAgICAgICAgICAgICAgIGlmIChvcCA9PT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZnJvbSA9IDA7IC8vIHdpbmRvdyBpbmRleFxuICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93O1xuICAgICAgICAgICAgICBpZiAod25leHQgPT09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgb3AgLT0gd25leHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gMDtcbiAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0O1xuICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi9cbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgICAgIGhlcmUgPSBkY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICAgICAgY29udGludWUgZG9kaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGhlcmUgPSBsY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICBjb250aW51ZSBkb2xlbjtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICB9XG4gIH0gd2hpbGUgKF9pbiA8IGxhc3QgJiYgX291dCA8IGVuZCk7XG5cbiAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovXG4gIGxlbiA9IGJpdHMgPj4gMztcbiAgX2luIC09IGxlbjtcbiAgYml0cyAtPSBsZW4gPDwgMztcbiAgaG9sZCAmPSAoMSA8PCBiaXRzKSAtIDE7XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi9cbiAgc3RybS5uZXh0X2luID0gX2luO1xuICBzdHJtLm5leHRfb3V0ID0gX291dDtcbiAgc3RybS5hdmFpbF9pbiA9IChfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCkpO1xuICBzdHJtLmF2YWlsX291dCA9IChfb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIF9vdXQpIDogMjU3IC0gKF9vdXQgLSBlbmQpKTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICByZXR1cm47XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbnZhciB1dGlscyAgICAgICAgID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG52YXIgYWRsZXIzMiAgICAgICA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgICAgICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgaW5mbGF0ZV9mYXN0ICA9IHJlcXVpcmUoJy4vaW5mZmFzdCcpO1xudmFyIGluZmxhdGVfdGFibGUgPSByZXF1aXJlKCcuL2luZnRyZWVzJyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovXG4vL3ZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xuLy92YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG4vL3ZhciBaX0ZVTExfRkxVU0ggICAgPSAzO1xudmFyIFpfRklOSVNIICAgICAgICA9IDQ7XG52YXIgWl9CTE9DSyAgICAgICAgID0gNTtcbnZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbnZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG52YXIgWl9NRU1fRVJST1IgICAgID0gLTQ7XG52YXIgWl9CVUZfRVJST1IgICAgID0gLTU7XG4vL3ZhciBaX1ZFUlNJT05fRVJST1IgPSAtNjtcblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG5cbi8qIFNUQVRFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciAgICBIRUFEID0gMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbWFnaWMgaGVhZGVyICovXG52YXIgICAgRkxBR1MgPSAyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1ldGhvZCBhbmQgZmxhZ3MgKGd6aXApICovXG52YXIgICAgVElNRSA9IDM7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1vZGlmaWNhdGlvbiB0aW1lIChnemlwKSAqL1xudmFyICAgIE9TID0gNDsgICAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBmbGFncyBhbmQgb3BlcmF0aW5nIHN5c3RlbSAoZ3ppcCkgKi9cbnZhciAgICBFWExFTiA9IDU7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgbGVuZ3RoIChnemlwKSAqL1xudmFyICAgIEVYVFJBID0gNjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBieXRlcyAoZ3ppcCkgKi9cbnZhciAgICBOQU1FID0gNzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGZpbGUgbmFtZSAoZ3ppcCkgKi9cbnZhciAgICBDT01NRU5UID0gODsgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGNvbW1lbnQgKGd6aXApICovXG52YXIgICAgSENSQyA9IDk7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGhlYWRlciBjcmMgKGd6aXApICovXG52YXIgICAgRElDVElEID0gMTA7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpY3Rpb25hcnkgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBESUNUID0gMTE7ICAgICAgLyogd2FpdGluZyBmb3IgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsICovXG52YXIgICAgICAgIFRZUEUgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG52YXIgICAgICAgIFRZUEVETyA9IDEzOyAgICAvKiBpOiBzYW1lLCBidXQgc2tpcCBjaGVjayB0byBleGl0IGluZmxhdGUgb24gbmV3IGJsb2NrICovXG52YXIgICAgICAgIFNUT1JFRCA9IDE0OyAgICAvKiBpOiB3YWl0aW5nIGZvciBzdG9yZWQgc2l6ZSAobGVuZ3RoIGFuZCBjb21wbGVtZW50KSAqL1xudmFyICAgICAgICBDT1BZXyA9IDE1OyAgICAgLyogaS9vOiBzYW1lIGFzIENPUFkgYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi9cbnZhciAgICAgICAgQ09QWSA9IDE2OyAgICAgIC8qIGkvbzogd2FpdGluZyBmb3IgaW5wdXQgb3Igb3V0cHV0IHRvIGNvcHkgc3RvcmVkIGJsb2NrICovXG52YXIgICAgICAgIFRBQkxFID0gMTc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciBkeW5hbWljIGJsb2NrIHRhYmxlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgTEVOTEVOUyA9IDE4OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBDT0RFTEVOUyA9IDE5OyAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgICAgICBMRU5fID0gMjA7ICAgICAgLyogaTogc2FtZSBhcyBMRU4gYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi9cbnZhciAgICAgICAgICAgIExFTiA9IDIxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0L2VvYiBjb2RlICovXG52YXIgICAgICAgICAgICBMRU5FWFQgPSAyMjsgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIERJU1QgPSAyMzsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBjb2RlICovXG52YXIgICAgICAgICAgICBESVNURVhUID0gMjQ7ICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgTUFUQ0ggPSAyNTsgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byBjb3B5IHN0cmluZyAqL1xudmFyICAgICAgICAgICAgTElUID0gMjY7ICAgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byB3cml0ZSBsaXRlcmFsICovXG52YXIgICAgQ0hFQ0sgPSAyNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBjaGVjayB2YWx1ZSAqL1xudmFyICAgIExFTkdUSCA9IDI4OyAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgbGVuZ3RoIChnemlwKSAqL1xudmFyICAgIERPTkUgPSAyOTsgICAgICAvKiBmaW5pc2hlZCBjaGVjaywgZG9uZSAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIEJBRCA9IDMwOyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgTUVNID0gMzE7ICAgICAgIC8qIGdvdCBhbiBpbmZsYXRlKCkgbWVtb3J5IGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgU1lOQyA9IDMyOyAgICAgIC8qIGxvb2tpbmcgZm9yIHN5bmNocm9uaXphdGlvbiBieXRlcyB0byByZXN0YXJ0IGluZmxhdGUoKSAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cblxudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9ICAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKTtcblxudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX1dCSVRTID0gTUFYX1dCSVRTO1xuXG5cbmZ1bmN0aW9uIHpzd2FwMzIocSkge1xuICByZXR1cm4gICgoKHEgPj4+IDI0KSAmIDB4ZmYpICtcbiAgICAgICAgICAoKHEgPj4+IDgpICYgMHhmZjAwKSArXG4gICAgICAgICAgKChxICYgMHhmZjAwKSA8PCA4KSArXG4gICAgICAgICAgKChxICYgMHhmZikgPDwgMjQpKTtcbn1cblxuXG5mdW5jdGlvbiBJbmZsYXRlU3RhdGUoKSB7XG4gIHRoaXMubW9kZSA9IDA7ICAgICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovXG4gIHRoaXMubGFzdCA9IGZhbHNlOyAgICAgICAgICAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgbGFzdCBibG9jayAqL1xuICB0aGlzLndyYXAgPSAwOyAgICAgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqL1xuICB0aGlzLmhhdmVkaWN0ID0gZmFsc2U7ICAgICAgLyogdHJ1ZSBpZiBkaWN0aW9uYXJ5IHByb3ZpZGVkICovXG4gIHRoaXMuZmxhZ3MgPSAwOyAgICAgICAgICAgICAvKiBnemlwIGhlYWRlciBtZXRob2QgYW5kIGZsYWdzICgwIGlmIHpsaWIpICovXG4gIHRoaXMuZG1heCA9IDA7ICAgICAgICAgICAgICAvKiB6bGliIGhlYWRlciBtYXggZGlzdGFuY2UgKElORkxBVEVfU1RSSUNUKSAqL1xuICB0aGlzLmNoZWNrID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2YgY2hlY2sgdmFsdWUgKi9cbiAgdGhpcy50b3RhbCA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIG91dHB1dCBjb3VudCAqL1xuICAvLyBUT0RPOiBtYXkgYmUge31cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAgICAgICAgIC8qIHdoZXJlIHRvIHNhdmUgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gKi9cblxuICAvKiBzbGlkaW5nIHdpbmRvdyAqL1xuICB0aGlzLndiaXRzID0gMDsgICAgICAgICAgICAgLyogbG9nIGJhc2UgMiBvZiByZXF1ZXN0ZWQgd2luZG93IHNpemUgKi9cbiAgdGhpcy53c2l6ZSA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB0aGlzLndoYXZlID0gMDsgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB0aGlzLnduZXh0ID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIHRoaXMud2luZG93ID0gbnVsbDsgICAgICAgICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIG5lZWRlZCAqL1xuXG4gIC8qIGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmhvbGQgPSAwOyAgICAgICAgICAgICAgLyogaW5wdXQgYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuYml0cyA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBcImluXCIgKi9cblxuICAvKiBmb3Igc3RyaW5nIGFuZCBzdG9yZWQgYmxvY2sgY29weWluZyAqL1xuICB0aGlzLmxlbmd0aCA9IDA7ICAgICAgICAgICAgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovXG4gIHRoaXMub2Zmc2V0ID0gMDsgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgc3RyaW5nIGZyb20gKi9cblxuICAvKiBmb3IgdGFibGUgYW5kIGNvZGUgZGVjb2RpbmcgKi9cbiAgdGhpcy5leHRyYSA9IDA7ICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgbmVlZGVkICovXG5cbiAgLyogZml4ZWQgYW5kIGR5bmFtaWMgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5jb2RlID0gbnVsbDsgICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzICovXG4gIHRoaXMuZGlzdGNvZGUgPSBudWxsOyAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAqL1xuICB0aGlzLmxlbmJpdHMgPSAwOyAgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgbGVuY29kZSAqL1xuICB0aGlzLmRpc3RiaXRzID0gMDsgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgZGlzdGNvZGUgKi9cblxuICAvKiBkeW5hbWljIHRhYmxlIGJ1aWxkaW5nICovXG4gIHRoaXMubmNvZGUgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmxlbiA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5kaXN0ID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLmhhdmUgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBpbiBsZW5zW10gKi9cbiAgdGhpcy5uZXh0ID0gbnVsbDsgICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIGNvZGVzW10gKi9cblxuICB0aGlzLmxlbnMgPSBuZXcgdXRpbHMuQnVmMTYoMzIwKTsgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLndvcmsgPSBuZXcgdXRpbHMuQnVmMTYoMjg4KTsgLyogd29yayBhcmVhIGZvciBjb2RlIHRhYmxlIGJ1aWxkaW5nICovXG5cbiAgLypcbiAgIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBwb2ludGVycyBpbiBqcywgd2UgdXNlIGxlbmNvZGUgYW5kIGRpc3Rjb2RlIGRpcmVjdGx5XG4gICBhcyBidWZmZXJzIHNvIHdlIGRvbid0IG5lZWQgY29kZXNcbiAgKi9cbiAgLy90aGlzLmNvZGVzID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSCk7ICAgICAgIC8qIHNwYWNlIGZvciBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmR5biA9IG51bGw7ICAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuZGlzdGR5biA9IG51bGw7ICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5zYW5lID0gMDsgICAgICAgICAgICAgICAgICAgLyogaWYgZmFsc2UsIGFsbG93IGludmFsaWQgZGlzdGFuY2UgdG9vIGZhciAqL1xuICB0aGlzLmJhY2sgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGJhY2sgb2YgbGFzdCB1bnByb2Nlc3NlZCBsZW5ndGgvbGl0ICovXG4gIHRoaXMud2FzID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWwgbGVuZ3RoIG9mIG1hdGNoICovXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldEtlZXAoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IHN0YXRlLnRvdGFsID0gMDtcbiAgc3RybS5tc2cgPSAnJzsgLypaX05VTEwqL1xuICBpZiAoc3RhdGUud3JhcCkgeyAgICAgICAvKiB0byBzdXBwb3J0IGlsbC1jb25jZWl2ZWQgSmF2YSB0ZXN0IHN1aXRlICovXG4gICAgc3RybS5hZGxlciA9IHN0YXRlLndyYXAgJiAxO1xuICB9XG4gIHN0YXRlLm1vZGUgPSBIRUFEO1xuICBzdGF0ZS5sYXN0ID0gMDtcbiAgc3RhdGUuaGF2ZWRpY3QgPSAwO1xuICBzdGF0ZS5kbWF4ID0gMzI3Njg7XG4gIHN0YXRlLmhlYWQgPSBudWxsLypaX05VTEwqLztcbiAgc3RhdGUuaG9sZCA9IDA7XG4gIHN0YXRlLmJpdHMgPSAwO1xuICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQgPSBzdGF0ZS5jb2RlcztcbiAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5biA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0hfTEVOUyk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5biA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0hfRElTVFMpO1xuXG4gIHN0YXRlLnNhbmUgPSAxO1xuICBzdGF0ZS5iYWNrID0gLTE7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogcmVzZXRcXG5cIikpO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdGF0ZS53c2l6ZSA9IDA7XG4gIHN0YXRlLndoYXZlID0gMDtcbiAgc3RhdGUud25leHQgPSAwO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKTtcblxufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHdyYXA7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBnZXQgdGhlIHN0YXRlICovXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIC8qIGV4dHJhY3Qgd3JhcCByZXF1ZXN0IGZyb20gd2luZG93Qml0cyBwYXJhbWV0ZXIgKi9cbiAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7XG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG4gIGVsc2Uge1xuICAgIHdyYXAgPSAod2luZG93Qml0cyA+PiA0KSArIDE7XG4gICAgaWYgKHdpbmRvd0JpdHMgPCA0OCkge1xuICAgICAgd2luZG93Qml0cyAmPSAxNTtcbiAgICB9XG4gIH1cblxuICAvKiBzZXQgbnVtYmVyIG9mIHdpbmRvdyBiaXRzLCBmcmVlIHdpbmRvdyBpZiBkaWZmZXJlbnQgKi9cbiAgaWYgKHdpbmRvd0JpdHMgJiYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cbiAgaWYgKHN0YXRlLndpbmRvdyAhPT0gbnVsbCAmJiBzdGF0ZS53Yml0cyAhPT0gd2luZG93Qml0cykge1xuICAgIHN0YXRlLndpbmRvdyA9IG51bGw7XG4gIH1cblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJlc2V0IHRoZSByZXN0IG9mIGl0ICovXG4gIHN0YXRlLndyYXAgPSB3cmFwO1xuICBzdGF0ZS53Yml0cyA9IHdpbmRvd0JpdHM7XG4gIHJldHVybiBpbmZsYXRlUmVzZXQoc3RybSk7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVJbml0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciByZXQ7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIC8vc3RybS5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqL1xuXG4gIHN0YXRlID0gbmV3IEluZmxhdGVTdGF0ZSgpO1xuXG4gIC8vaWYgKHN0YXRlID09PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiBhbGxvY2F0ZWRcXG5cIikpO1xuICBzdHJtLnN0YXRlID0gc3RhdGU7XG4gIHN0YXRlLndpbmRvdyA9IG51bGwvKlpfTlVMTCovO1xuICByZXQgPSBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0JpdHMpO1xuICBpZiAocmV0ICE9PSBaX09LKSB7XG4gICAgc3RybS5zdGF0ZSA9IG51bGwvKlpfTlVMTCovO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVJbml0KHN0cm0pIHtcbiAgcmV0dXJuIGluZmxhdGVJbml0MihzdHJtLCBERUZfV0JJVFMpO1xufVxuXG5cbi8qXG4gUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0b1xuIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC5cbiBJZiBCVUlMREZJWEVEIGlzIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGlzIHJvdXRpbmUgYnVpbGRzIHRoZSB0YWJsZXMgdGhlXG4gZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZFxuIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluXG4gZXhjaGFuZ2UgZm9yIGEgbGl0dGxlIGV4ZWN1dGlvbiB0aW1lLiAgSG93ZXZlciwgQlVJTERGSVhFRCBzaG91bGQgbm90IGJlXG4gdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpblxuIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuXG4gKi9cbnZhciB2aXJnaW4gPSB0cnVlO1xuXG52YXIgbGVuZml4LCBkaXN0Zml4OyAvLyBXZSBoYXZlIG5vIHBvaW50ZXJzIGluIEpTLCBzbyBrZWVwIHRhYmxlcyBzZXBhcmF0ZVxuXG5mdW5jdGlvbiBmaXhlZHRhYmxlcyhzdGF0ZSkge1xuICAvKiBidWlsZCBmaXhlZCBodWZmbWFuIHRhYmxlcyBpZiBmaXJzdCBjYWxsIChtYXkgbm90IGJlIHRocmVhZCBzYWZlKSAqL1xuICBpZiAodmlyZ2luKSB7XG4gICAgdmFyIHN5bTtcblxuICAgIGxlbmZpeCA9IG5ldyB1dGlscy5CdWYzMig1MTIpO1xuICAgIGRpc3RmaXggPSBuZXcgdXRpbHMuQnVmMzIoMzIpO1xuXG4gICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAxNDQpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA4OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI1NikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDk7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjgwKSB7IHN0YXRlLmxlbnNbc3ltKytdID0gNzsgfVxuICAgIHdoaWxlIChzeW0gPCAyODgpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA4OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKExFTlMsICBzdGF0ZS5sZW5zLCAwLCAyODgsIGxlbmZpeCwgICAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDkgfSk7XG5cbiAgICAvKiBkaXN0YW5jZSB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDMyKSB7IHN0YXRlLmxlbnNbc3ltKytdID0gNTsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgMCwgMzIsICAgZGlzdGZpeCwgMCwgc3RhdGUud29yaywgeyBiaXRzOiA1IH0pO1xuXG4gICAgLyogZG8gdGhpcyBqdXN0IG9uY2UgKi9cbiAgICB2aXJnaW4gPSBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmxlbmNvZGUgPSBsZW5maXg7XG4gIHN0YXRlLmxlbmJpdHMgPSA5O1xuICBzdGF0ZS5kaXN0Y29kZSA9IGRpc3RmaXg7XG4gIHN0YXRlLmRpc3RiaXRzID0gNTtcbn1cblxuXG4vKlxuIFVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3Qgd3NpemUgKG5vcm1hbGx5IDMySykgYnl0ZXMgd3JpdHRlbiBiZWZvcmVcbiByZXR1cm5pbmcuICBJZiB3aW5kb3cgZG9lcyBub3QgZXhpc3QgeWV0LCBjcmVhdGUgaXQuICBUaGlzIGlzIG9ubHkgY2FsbGVkXG4gd2hlbiBhIHdpbmRvdyBpcyBhbHJlYWR5IGluIHVzZSwgb3Igd2hlbiBvdXRwdXQgaGFzIGJlZW4gd3JpdHRlbiBkdXJpbmcgdGhpc1xuIGluZmxhdGUgY2FsbCwgYnV0IHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgc3RyZWFtIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC5cbiBJdCBpcyBhbHNvIGNhbGxlZCB0byBjcmVhdGUgYSB3aW5kb3cgZm9yIGRpY3Rpb25hcnkgZGF0YSB3aGVuIGEgZGljdGlvbmFyeVxuIGlzIGxvYWRlZC5cblxuIFByb3ZpZGluZyBvdXRwdXQgYnVmZmVycyBsYXJnZXIgdGhhbiAzMksgdG8gaW5mbGF0ZSgpIHNob3VsZCBwcm92aWRlIGEgc3BlZWRcbiBhZHZhbnRhZ2UsIHNpbmNlIG9ubHkgdGhlIGxhc3QgMzJLIG9mIG91dHB1dCBpcyBjb3BpZWQgdG8gdGhlIHNsaWRpbmcgd2luZG93XG4gdXBvbiByZXR1cm4gZnJvbSBpbmZsYXRlKCksIGFuZCBzaW5jZSBhbGwgZGlzdGFuY2VzIGFmdGVyIHRoZSBmaXJzdCAzMksgb2ZcbiBvdXRwdXQgd2lsbCBmYWxsIGluIHRoZSBvdXRwdXQgZGF0YSwgbWFraW5nIG1hdGNoIGNvcGllcyBzaW1wbGVyIGFuZCBmYXN0ZXIuXG4gVGhlIGFkdmFudGFnZSBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZSBwcm9jZXNzb3IncyBkYXRhIGNhY2hlcy5cbiAqL1xuZnVuY3Rpb24gdXBkYXRld2luZG93KHN0cm0sIHNyYywgZW5kLCBjb3B5KSB7XG4gIHZhciBkaXN0O1xuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIC8qIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeSwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB3aW5kb3cgKi9cbiAgaWYgKHN0YXRlLndpbmRvdyA9PT0gbnVsbCkge1xuICAgIHN0YXRlLndzaXplID0gMSA8PCBzdGF0ZS53Yml0cztcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSAwO1xuXG4gICAgc3RhdGUud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgoc3RhdGUud3NpemUpO1xuICB9XG5cbiAgLyogY29weSBzdGF0ZS0+d3NpemUgb3IgbGVzcyBvdXRwdXQgYnl0ZXMgaW50byB0aGUgY2lyY3VsYXIgd2luZG93ICovXG4gIGlmIChjb3B5ID49IHN0YXRlLndzaXplKSB7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIHN0YXRlLndzaXplLCBzdGF0ZS53c2l6ZSwgMCk7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gIH1cbiAgZWxzZSB7XG4gICAgZGlzdCA9IHN0YXRlLndzaXplIC0gc3RhdGUud25leHQ7XG4gICAgaWYgKGRpc3QgPiBjb3B5KSB7XG4gICAgICBkaXN0ID0gY29weTtcbiAgICB9XG4gICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d25leHQsIGVuZCAtIGNvcHksIGRpc3QpO1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBkaXN0LCBzdGF0ZS53bmV4dCk7XG4gICAgY29weSAtPSBkaXN0O1xuICAgIGlmIChjb3B5KSB7XG4gICAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdywgZW5kIC0gY29weSwgY29weSk7XG4gICAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgY29weSwgMCk7XG4gICAgICBzdGF0ZS53bmV4dCA9IGNvcHk7XG4gICAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN0YXRlLnduZXh0ICs9IGRpc3Q7XG4gICAgICBpZiAoc3RhdGUud25leHQgPT09IHN0YXRlLndzaXplKSB7IHN0YXRlLnduZXh0ID0gMDsgfVxuICAgICAgaWYgKHN0YXRlLndoYXZlIDwgc3RhdGUud3NpemUpIHsgc3RhdGUud2hhdmUgKz0gZGlzdDsgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBpbnB1dCwgb3V0cHV0OyAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgYnVmZmVyc1xuICB2YXIgbmV4dDsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBpbnB1dCBJTkRFWCAqL1xuICB2YXIgcHV0OyAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBvdXRwdXQgSU5ERVggKi9cbiAgdmFyIGhhdmUsIGxlZnQ7ICAgICAgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi9cbiAgdmFyIF9pbiwgX291dDsgICAgICAgICAgICAgIC8qIHNhdmUgc3RhcnRpbmcgYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGNvcHk7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcbiAgdmFyIGhlcmUgPSAwOyAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi9cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7IC8vIHBha2VkIFwiaGVyZVwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIC8vdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YWJsZSBlbnRyeSAqL1xuICB2YXIgbGFzdF9iaXRzLCBsYXN0X29wLCBsYXN0X3ZhbDsgLy8gcGFrZWQgXCJsYXN0XCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi9cbiAgdmFyIHJldDsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovXG4gIHZhciBoYnVmID0gbmV3IHV0aWxzLkJ1ZjgoNCk7ICAgIC8qIGJ1ZmZlciBmb3IgZ3ppcCBoZWFkZXIgY3JjIGNhbGN1bGF0aW9uICovXG4gIHZhciBvcHRzO1xuXG4gIHZhciBuOyAvLyB0ZW1wb3JhcnkgdmFyIGZvciBORUVEX0JJVFNcblxuICB2YXIgb3JkZXIgPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi9cbiAgICBbIDE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTUgXTtcblxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fCAhc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHsgc3RhdGUubW9kZSA9IFRZUEVETzsgfSAgICAvKiBza2lwIGNoZWNrICovXG5cblxuICAvLy0tLSBMT0FEKCkgLS0tXG4gIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gIG5leHQgPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgLy8tLS1cblxuICBfaW4gPSBoYXZlO1xuICBfb3V0ID0gbGVmdDtcbiAgcmV0ID0gWl9PSztcblxuICBpbmZfbGVhdmU6IC8vIGdvdG8gZW11bGF0aW9uXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKHN0YXRlLm1vZGUpIHtcbiAgICAgIGNhc2UgSEVBRDpcbiAgICAgICAgaWYgKHN0YXRlLndyYXAgPT09IDApIHtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRURPO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoKHN0YXRlLndyYXAgJiAyKSAmJiBob2xkID09PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovXG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSAwLypjcmMzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG5cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5tb2RlID0gRkxBR1M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZmxhZ3MgPSAwOyAgICAgICAgICAgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5kb25lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8ICAgLyogY2hlY2sgaWYgemxpYiBoZWFkZXIgYWxsb3dlZCAqL1xuICAgICAgICAgICgoKGhvbGQgJiAweGZmKS8qQklUUyg4KSovIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgaGVhZGVyIGNoZWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNDtcbiAgICAgICAgYml0cyAtPSA0O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGxlbiA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDg7XG4gICAgICAgIGlmIChzdGF0ZS53Yml0cyA9PT0gMCkge1xuICAgICAgICAgIHN0YXRlLndiaXRzID0gbGVuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxlbiA+IHN0YXRlLndiaXRzKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCB3aW5kb3cgc2l6ZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5kbWF4ID0gMSA8PCBsZW47XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICB6bGliIGhlYWRlciBva1xcblwiKSk7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgc3RhdGUubW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRkxBR1M6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5mbGFncyA9IGhvbGQ7XG4gICAgICAgIGlmICgoc3RhdGUuZmxhZ3MgJiAweGZmKSAhPT0gWl9ERUZMQVRFRCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4ZTAwMCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gaGVhZGVyIGZsYWdzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQudGV4dCA9ICgoaG9sZCA+PiA4KSAmIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBUSU1FO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIFRJTUU6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQudGltZSA9IGhvbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gQ1JDNChzdGF0ZS5jaGVjaywgaG9sZClcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsyXSA9IChob2xkID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhidWZbM10gPSAoaG9sZCA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCA0LCAwKTtcbiAgICAgICAgICAvLz09PVxuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gT1M7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgT1M6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQueGZsYWdzID0gKGhvbGQgJiAweGZmKTtcbiAgICAgICAgICBzdGF0ZS5oZWFkLm9zID0gKGhvbGQgPj4gOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IEVYTEVOO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIEVYTEVOOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA0MDApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7XG4gICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbC8qWl9OVUxMKi87XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IEVYVFJBO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIEVYVFJBOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA0MDApIHtcbiAgICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS5oZWFkLmV4dHJhX2xlbiAtIHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5oZWFkLmV4dHJhKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHVudHlwZWQgYXJyYXkgZm9yIG1vcmUgY29udmVuaWVudCBwcm9jZXNzaW5nIGxhdGVyXG4gICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG5ldyBBcnJheShzdGF0ZS5oZWFkLmV4dHJhX2xlbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdXRpbHMuYXJyYXlTZXQoXG4gICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSxcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGlzIGxpbWl0ZWQgdG8gNjU1MzYgYnl0ZXNcbiAgICAgICAgICAgICAgICAvLyAtIG5vIG5lZWQgZm9yIGFkZGl0aW9uYWwgc2l6ZSBjaGVja1xuICAgICAgICAgICAgICAgIGNvcHksXG4gICAgICAgICAgICAgICAgLypsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gPyBzdGF0ZS5oZWFkLmV4dHJhX21heCA6IGNvcHksKi9cbiAgICAgICAgICAgICAgICBsZW5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy96bWVtY3B5KHN0YXRlLmhlYWQuZXh0cmEgKyBsZW4sIG5leHQsXG4gICAgICAgICAgICAgIC8vICAgICAgICBsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggP1xuICAgICAgICAgICAgICAvLyAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTkFNRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBOQU1FOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA4MDApIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBjb3B5ID0gMDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAvLyBUT0RPOiAyIG9yIDEgYnl0ZXM/XG4gICAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLm5hbWVfbWF4Ki8pKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGlmIChsZW4pIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IENPTU1FTlQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgxMDAwKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgY29weSA9IDA7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5jb21tX21heCovKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gSENSQztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBIQ1JDOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUuY2hlY2sgJiAweGZmZmYpKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmhjcmMgPSAoKHN0YXRlLmZsYWdzID4+IDkpICYgMSk7XG4gICAgICAgICAgc3RhdGUuaGVhZC5kb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJQ1RJRDpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElDVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESUNUOlxuICAgICAgICBpZiAoc3RhdGUuaGF2ZWRpY3QgPT09IDApIHtcbiAgICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgICAvLy0tLVxuICAgICAgICAgIHJldHVybiBaX05FRURfRElDVDtcbiAgICAgICAgfVxuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIFRZUEU6XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUWVBFRE86XG4gICAgICAgIGlmIChzdGF0ZS5sYXN0KSB7XG4gICAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQ0hFQ0s7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sYXN0ID0gKGhvbGQgJiAweDAxKS8qQklUUygxKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUygxKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMTtcbiAgICAgICAgYml0cyAtPSAxO1xuICAgICAgICAvLy0tLS8vXG5cbiAgICAgICAgc3dpdGNoICgoaG9sZCAmIDB4MDMpLypCSVRTKDIpKi8pIHtcbiAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZWQgYmxvY2sgKi9cbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXFxuXCIsXG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IFNUT1JFRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovXG4gICAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7XG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTl87ICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqL1xuICAgICAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqL1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IFRBQkxFO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBibG9jayB0eXBlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU1RPUkVEOlxuICAgICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi9cbiAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9PSAoKGhvbGQgPj4+IDE2KSBeIDB4ZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQgJiAweGZmZmY7XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWV87XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT1BZXzpcbiAgICAgICAgc3RhdGUubW9kZSA9IENPUFk7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09QWTpcbiAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgICBpZiAoY29weSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAvLy0tLSB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7IC0tLVxuICAgICAgICAgIHV0aWxzLmFycmF5U2V0KG91dHB1dCwgaW5wdXQsIG5leHQsIGNvcHksIHB1dCk7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgICAgIHB1dCArPSBjb3B5O1xuICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVEFCTEU6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE0KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5ubGVuID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMjU3O1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNTtcbiAgICAgICAgYml0cyAtPSA1O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm5kaXN0ID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMTtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDU7XG4gICAgICAgIGJpdHMgLT0gNTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5uY29kZSA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDQ7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgICBiaXRzIC09IDQ7XG4gICAgICAgIC8vLS0tLy9cbi8vI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORFxuICAgICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkxFTlM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOTEVOUzpcbiAgICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5uY29kZSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCAxOSkge1xuICAgICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICAgICAgICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuICAgICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IDc7XG5cbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUubGVuYml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS5sZW5zLCAwLCAxOSwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSBsZW5ndGhzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09ERUxFTlM6XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsvKkJJVFMoc3RhdGUubGVuYml0cykqL1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGVyZV92YWwgPCAxNikge1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAyKTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDI7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUgLSAxXTtcbiAgICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDMpOy8vQklUUygyKTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDMpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMztcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgbGVuID0gMDtcbiAgICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDcpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgNztcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgbGVuID0gMDtcbiAgICAgICAgICAgICAgY29weSA9IDExICsgKGhvbGQgJiAweDdmKTsvL0JJVFMoNyk7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSA3O1xuICAgICAgICAgICAgICBiaXRzIC09IDc7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoY29weS0tKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBCQUQpIHsgYnJlYWs7IH1cblxuICAgICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi9cbiAgICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHNcbiAgICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgICAgICAgICBjb25jZXJuaW5nIHRoZSBFTk9VR0ggY29uc3RhbnRzLCB3aGljaCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzICovXG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSA5O1xuXG4gICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS5sZW5zLCAwLCBzdGF0ZS5ubGVuLCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAgIC8vIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7XG4gICAgICAgIC8vc3RhdGUuZGlzdGNvZGUuY29weShzdGF0ZS5jb2Rlcyk7XG4gICAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47XG4gICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmRpc3RiaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIHN0YXRlLm5sZW4sIHN0YXRlLm5kaXN0LCBzdGF0ZS5kaXN0Y29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgICBzdGF0ZS5kaXN0Yml0cyA9IG9wdHMuYml0cztcbiAgICAgICAgLy8gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlcyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgJ2luZmxhdGU6ICAgICAgIGNvZGVzIG9rXFxuJykpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXztcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTl86XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOOlxuICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7XG4gICAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gICAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgICAgLy8tLS1cbiAgICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgX291dCk7XG4gICAgICAgICAgLy8tLS0gTE9BRCgpIC0tLVxuICAgICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gICAgICAgICAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gICAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICAgICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47XG4gICAgICAgICAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICAgICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICAgICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICAgICAgICAgIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAgICAgICAgIC8vLS0tXG5cbiAgICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgICAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5iYWNrID0gMDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07ICAvKkJJVFMoc3RhdGUubGVuYml0cykqL1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiYgKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgICBpZiAoaGVyZV9vcCA9PT0gMCkge1xuICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiAzMikge1xuICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5leHRyYSA9IGhlcmVfb3AgJiAxNTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5FWFQ6XG4gICAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgc3RhdGUubW9kZSA9IERJU1Q7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElTVDpcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDEpXTsvKkJJVFMoc3RhdGUuZGlzdGJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDtcbiAgICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgICAgc3RhdGUubW9kZSA9IERJU1RFWFQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElTVEVYVDpcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5vZmZzZXQgKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgfVxuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBzdGF0ZS5vZmZzZXQpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IE1BVENIO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE1BVENIOlxuICAgICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IF9vdXQgLSBsZWZ0O1xuICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICBjb3B5ID0gc3RhdGUub2Zmc2V0IC0gY29weTtcbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLndoYXZlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhdWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgVHJhY2UoKHN0ZGVyciwgXCJpbmZsYXRlLmMgdG9vIGZhclxcblwiKSk7XG4vLyAgICAgICAgICBjb3B5IC09IHN0YXRlLndoYXZlO1xuLy8gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuLy8gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4vLyAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4vLyAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbi8vICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IDA7XG4vLyAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuLy8gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4vLyAgICAgICAgICBicmVhaztcbi8vI2VuZGlmXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud25leHQpIHtcbiAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUud25leHQ7XG4gICAgICAgICAgICBmcm9tID0gc3RhdGUud3NpemUgLSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53bmV4dCAtIGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbiAgICAgICAgICBmcm9tX3NvdXJjZSA9IHN0YXRlLndpbmRvdztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDtcbiAgICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4gICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTElUOlxuICAgICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgbGVmdC0tO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ0hFQ0s6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgLy8gVXNlICd8JyBpbnN0ZWFkIG9mICcrJyB0byBtYWtlIHN1cmUgdGhhdCByZXN1bHQgaXMgc2lnbmVkXG4gICAgICAgICAgICBob2xkIHw9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIF9vdXQgLT0gbGVmdDtcbiAgICAgICAgICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICAgICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gICAgICAgICAgaWYgKF9vdXQpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9XG4gICAgICAgICAgICAgICAgLypVUERBVEUoc3RhdGUuY2hlY2ssIHB1dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAgICAgICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpKTtcblxuICAgICAgICAgIH1cbiAgICAgICAgICBfb3V0ID0gbGVmdDtcbiAgICAgICAgICAvLyBOQjogY3JjMzIgc3RvcmVkIGFzIHNpZ25lZCAzMi1iaXQgaW50LCB6c3dhcDMyIHJldHVybnMgc2lnbmVkIHRvb1xuICAgICAgICAgIGlmICgoc3RhdGUuZmxhZ3MgPyBob2xkIDogenN3YXAzMihob2xkKSkgIT09IHN0YXRlLmNoZWNrKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgZGF0YSBjaGVjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBjaGVjayBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5HVEg7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOR1RIOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS50b3RhbCAmIDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBET05FO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERPTkU6XG4gICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDtcbiAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgY2FzZSBCQUQ6XG4gICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjtcbiAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgY2FzZSBNRU06XG4gICAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICAgIGNhc2UgU1lOQzpcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICAgIH1cbiAgfVxuXG4gIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlzIHJlYWwgcGxhY2UgZm9yIFwiZ290byBpbmZfbGVhdmVcIiwgZW11bGF0ZWQgdmlhIFwiYnJlYWsgaW5mX2xlYXZlXCJcblxuICAvKlxuICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS5cbiAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlclxuICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS5cbiAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLlxuICAgKi9cblxuICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgLy8tLS1cblxuICBpZiAoc3RhdGUud3NpemUgfHwgKF9vdXQgIT09IHN0cm0uYXZhaWxfb3V0ICYmIHN0YXRlLm1vZGUgPCBCQUQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCkpKSB7XG4gICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkge1xuICAgICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgX2luIC09IHN0cm0uYXZhaWxfaW47XG4gIF9vdXQgLT0gc3RybS5hdmFpbF9vdXQ7XG4gIHN0cm0udG90YWxfaW4gKz0gX2luO1xuICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICBpZiAoc3RhdGUud3JhcCAmJiBfb3V0KSB7XG4gICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEUoc3RhdGUuY2hlY2ssIHN0cm0ubmV4dF9vdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkpO1xuICB9XG4gIHN0cm0uZGF0YV90eXBlID0gc3RhdGUuYml0cyArIChzdGF0ZS5sYXN0ID8gNjQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gTEVOXyB8fCBzdGF0ZS5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApO1xuICBpZiAoKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCkgfHwgZmx1c2ggPT09IFpfRklOSVNIKSAmJiByZXQgPT09IFpfT0spIHtcbiAgICByZXQgPSBaX0JVRl9FUlJPUjtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlRW5kKHN0cm0pIHtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgLyp8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTAqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS53aW5kb3cpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG5cbiAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovXG4gIHN0YXRlLmhlYWQgPSBoZWFkO1xuICBoZWFkLmRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgc3RhdGU7XG4gIHZhciBkaWN0aWQ7XG4gIHZhciByZXQ7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIC8qID09IFpfTlVMTCAqLyB8fCAhc3RybS5zdGF0ZSAvKiA9PSBaX05VTEwgKi8pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICBpZiAoc3RhdGUud3JhcCAhPT0gMCAmJiBzdGF0ZS5tb2RlICE9PSBESUNUKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZGVudGlmaWVyICovXG4gIGlmIChzdGF0ZS5tb2RlID09PSBESUNUKSB7XG4gICAgZGljdGlkID0gMTsgLyogYWRsZXIzMigwLCBudWxsLCAwKSovXG4gICAgLyogZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgICBpZiAoZGljdGlkICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGVcbiAgIGV4aXN0aW5nIGRpY3Rpb25hcnkgaWYgYXBwcm9wcmlhdGUgKi9cbiAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpO1xuICBpZiAocmV0KSB7XG4gICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gIH1cbiAgc3RhdGUuaGF2ZWRpY3QgPSAxO1xuICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmV4cG9ydHMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0O1xuZXhwb3J0cy5pbmZsYXRlUmVzZXQyID0gaW5mbGF0ZVJlc2V0MjtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7XG5leHBvcnRzLmluZmxhdGVJbml0MiA9IGluZmxhdGVJbml0MjtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kO1xuZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyID0gaW5mbGF0ZUdldEhlYWRlcjtcbmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZUluZm8gPSAncGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5pbmZsYXRlQ29weSA9IGluZmxhdGVDb3B5O1xuZXhwb3J0cy5pbmZsYXRlR2V0RGljdGlvbmFyeSA9IGluZmxhdGVHZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlTWFyayA9IGluZmxhdGVNYXJrO1xuZXhwb3J0cy5pbmZsYXRlUHJpbWUgPSBpbmZsYXRlUHJpbWU7XG5leHBvcnRzLmluZmxhdGVTeW5jID0gaW5mbGF0ZVN5bmM7XG5leHBvcnRzLmluZmxhdGVTeW5jUG9pbnQgPSBpbmZsYXRlU3luY1BvaW50O1xuZXhwb3J0cy5pbmZsYXRlVW5kZXJtaW5lID0gaW5mbGF0ZVVuZGVybWluZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG52YXIgbGJhc2UgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dO1xuXG52YXIgbGV4dCA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4XG5dO1xuXG52YXIgZGJhc2UgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi9cbiAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLFxuICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsXG4gIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDBcbl07XG5cbnZhciBkZXh0ID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMixcbiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsXG4gIDI4LCAyOCwgMjksIDI5LCA2NCwgNjRcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKVxue1xuICB2YXIgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgdmFyIHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIHZhciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgdmFyIHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICB2YXIgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbi8vICB2YXIgc2hvZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgdmFyIG9mZnMgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cbiAgdmFyIGV4dHJhID0gbnVsbDtcbiAgdmFyIGV4dHJhX2luZGV4ID0gMDtcblxuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDtcblxuICAvKlxuICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZVxuICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlXG4gICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZVxuICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXJcbiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHNcbiAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyXG4gICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aFxuICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkc1xuICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXNcbiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuXG5cbiAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluXG4gICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLlxuICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXRcbiAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuXG5cbiAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCxcbiAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZVxuICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkXG4gICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnlcbiAgIHRoZSBjYWxsZXIuXG5cbiAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmdcbiAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueVxuICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWRcbiAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzLlxuICAgKi9cblxuICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi9cbiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBjb3VudFtsZW5dID0gMDtcbiAgfVxuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7XG4gIH1cblxuICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqL1xuICByb290ID0gYml0cztcbiAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHtcbiAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290ID4gbWF4KSB7XG4gICAgcm9vdCA9IG1heDtcbiAgfVxuICBpZiAobWF4ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqL1xuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDsgIC8vaGVyZS5vcCA9ICh2YXIgY2hhcik2NDsgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7ICAgLy9oZXJlLmJpdHMgPSAodmFyIGNoYXIpMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDsgICAvL2hlcmUudmFsID0gKHZhciBzaG9ydCkwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cblxuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDtcbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cbiAgICBvcHRzLmJpdHMgPSAxO1xuICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqL1xuICB9XG4gIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykge1xuICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPCBtaW4pIHtcbiAgICByb290ID0gbWluO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovXG4gIGxlZnQgPSAxO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGxlZnQgPDw9IDE7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqL1xuICB9XG4gIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PT0gQ09ERVMgfHwgbWF4ICE9PSAxKSkge1xuICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi9cbiAgfVxuXG4gIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovXG4gIG9mZnNbMV0gPSAwO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07XG4gIH1cblxuICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovXG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHtcbiAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nXG4gICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZlxuICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wXG4gICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsXG4gICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvXG4gICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy5cblxuICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkc1xuICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXhcbiAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhXG4gICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXNcbiAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC5cblxuICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGVcbiAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoXG4gICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZVxuICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLlxuXG4gICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZVxuICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCBmb3IgTEVOUyBhbmQgRElTVCB0YWJsZXMgYWdhaW5zdFxuICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpblxuICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW5cbiAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXNcbiAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHNcbiAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy5cbiAgICovXG5cbiAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi9cbiAgLy8gcG9vciBtYW4gb3B0aW1pemF0aW9uIC0gdXNlIGlmLWVsc2UgaW5zdGVhZCBvZiBzd2l0Y2gsXG4gIC8vIHRvIGF2b2lkIGRlb3B0cyBpbiBvbGQgdjhcbiAgaWYgKHR5cGUgPT09IENPREVTKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgZW5kID0gMTk7XG5cbiAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TKSB7XG4gICAgYmFzZSA9IGxiYXNlO1xuICAgIGJhc2VfaW5kZXggLT0gMjU3O1xuICAgIGV4dHJhID0gbGV4dDtcbiAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgZW5kID0gMjU2O1xuXG4gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBESVNUUyAqL1xuICAgIGJhc2UgPSBkYmFzZTtcbiAgICBleHRyYSA9IGRleHQ7XG4gICAgZW5kID0gLTE7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi9cbiAgICBoZXJlX2JpdHMgPSBsZW4gLSBkcm9wO1xuICAgIGlmICh3b3JrW3N5bV0gPCBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSAwO1xuICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi9cbiAgICAgIGhlcmVfdmFsID0gMDtcbiAgICB9XG5cbiAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSBkcm9wKTtcbiAgICBmaWxsID0gMSA8PCBjdXJyO1xuICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwwO1xuICAgIH0gd2hpbGUgKGZpbGwgIT09IDApO1xuXG4gICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gMSk7XG4gICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7XG4gICAgICBpbmNyID4+PSAxO1xuICAgIH1cbiAgICBpZiAoaW5jciAhPT0gMCkge1xuICAgICAgaHVmZiAmPSBpbmNyIC0gMTtcbiAgICAgIGh1ZmYgKz0gaW5jcjtcbiAgICB9IGVsc2Uge1xuICAgICAgaHVmZiA9IDA7XG4gICAgfVxuXG4gICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovXG4gICAgc3ltKys7XG4gICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkge1xuICAgICAgaWYgKGxlbiA9PT0gbWF4KSB7IGJyZWFrOyB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovXG4gICAgICBsb3cgPSBodWZmICYgbWFzaztcbiAgICAgIC8qdGFibGUub3BbbG93XSA9IGN1cnI7XG4gICAgICB0YWJsZS5iaXRzW2xvd10gPSByb290O1xuICAgICAgdGFibGUudmFsW2xvd10gPSBuZXh0IC0gb3B0cy50YWJsZV9pbmRleDsqL1xuICAgICAgdGFibGVbbG93XSA9IChyb290IDw8IDI0KSB8IChjdXJyIDw8IDE2KSB8IChuZXh0IC0gdGFibGVfaW5kZXgpIHwwO1xuICAgIH1cbiAgfVxuXG4gIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlXG4gICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZVxuICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqL1xuICBpZiAoaHVmZiAhPT0gMCkge1xuICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tuZXh0ICsgaHVmZl0gPSBsZW4gLSBkcm9wO1xuICAgIC8vdGFibGUudmFsW25leHQgKyBodWZmXSA9IDA7XG4gICAgdGFibGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwwO1xuICB9XG5cbiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovXG4gIC8vb3B0cy50YWJsZV9pbmRleCArPSB1c2VkO1xuICBvcHRzLmJpdHMgPSByb290O1xuICByZXR1cm4gMDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIDI6ICAgICAgJ25lZWQgZGljdGlvbmFyeScsICAgICAvKiBaX05FRURfRElDVCAgICAgICAyICAqL1xuICAxOiAgICAgICdzdHJlYW0gZW5kJywgICAgICAgICAgLyogWl9TVFJFQU1fRU5EICAgICAgMSAgKi9cbiAgMDogICAgICAnJywgICAgICAgICAgICAgICAgICAgIC8qIFpfT0sgICAgICAgICAgICAgIDAgICovXG4gICctMSc6ICAgJ2ZpbGUgZXJyb3InLCAgICAgICAgICAvKiBaX0VSUk5PICAgICAgICAgKC0xKSAqL1xuICAnLTInOiAgICdzdHJlYW0gZXJyb3InLCAgICAgICAgLyogWl9TVFJFQU1fRVJST1IgICgtMikgKi9cbiAgJy0zJzogICAnZGF0YSBlcnJvcicsICAgICAgICAgIC8qIFpfREFUQV9FUlJPUiAgICAoLTMpICovXG4gICctNCc6ICAgJ2luc3VmZmljaWVudCBtZW1vcnknLCAvKiBaX01FTV9FUlJPUiAgICAgKC00KSAqL1xuICAnLTUnOiAgICdidWZmZXIgZXJyb3InLCAgICAgICAgLyogWl9CVUZfRVJST1IgICAgICgtNSkgKi9cbiAgJy02JzogICAnaW5jb21wYXRpYmxlIHZlcnNpb24nIC8qIFpfVkVSU0lPTl9FUlJPUiAoLTYpICovXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8qIGVzbGludC1kaXNhYmxlIHNwYWNlLXVuYXJ5LW9wcyAqL1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLy92YXIgWl9GSUxURVJFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0hVRkZNQU5fT05MWSAgICAgID0gMjtcbi8vdmFyIFpfUkxFICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG4vL3ZhciBaX0RFRkFVTFRfU1RSQVRFR1kgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xudmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG52YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9XG5cbi8vIEZyb20genV0aWwuaFxuXG52YXIgU1RPUkVEX0JMT0NLID0gMDtcbnZhciBTVEFUSUNfVFJFRVMgPSAxO1xudmFyIERZTl9UUkVFUyAgICA9IDI7XG4vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqL1xuXG52YXIgTUlOX01BVENIICAgID0gMztcbnZhciBNQVhfTUFUQ0ggICAgPSAyNTg7XG4vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovXG5cbi8vIEZyb20gZGVmbGF0ZS5oXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLlxuICovXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cblxudmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG5cbnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cblxudmFyIE1BWF9CSVRTICAgICAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgQnVmX3NpemUgICAgICA9IDE2O1xuLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqL1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RhbnRzXG4gKi9cblxudmFyIE1BWF9CTF9CSVRTID0gNztcbi8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi9cblxudmFyIEVORF9CTE9DSyAgID0gMjU2O1xuLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqL1xuXG52YXIgUkVQXzNfNiAgICAgPSAxNjtcbi8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfM18xMCAgID0gMTc7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfMTFfMTM4ID0gMTg7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xudmFyIGV4dHJhX2xiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdO1xuXG52YXIgZXh0cmFfZGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqL1xuICBbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM107XG5cbnZhciBleHRyYV9ibGJpdHMgPSAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddO1xuXG52YXIgYmxfb3JkZXIgPVxuICBbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07XG4vKiBlc2xpbnQtZW5hYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG5cbi8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmdcbiAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLlxuICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS5cbiAqL1xuXG4vLyBXZSBwcmUtZmlsbCBhcnJheXMgd2l0aCAwIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZ2Fwc1xuXG52YXIgRElTVF9DT0RFX0xFTiA9IDUxMjsgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovXG5cbi8vICEhISEgVXNlIGZsYXQgYXJyYXkgaW5zdGVhZCBvZiBzdHJ1Y3R1cmUsIEZyZXEgPSBpKjIsIExlbiA9IGkqMisxXG52YXIgc3RhdGljX2x0cmVlICA9IG5ldyBBcnJheSgoTF9DT0RFUyArIDIpICogMik7XG56ZXJvKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbnZhciBzdGF0aWNfZHRyZWUgID0gbmV3IEFycmF5KERfQ09ERVMgKiAyKTtcbnplcm8oc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxudmFyIF9kaXN0X2NvZGUgICAgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7XG56ZXJvKF9kaXN0X2NvZGUpO1xuLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlc1xuICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZlxuICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuXG4gKi9cblxudmFyIF9sZW5ndGhfY29kZSAgPSBuZXcgQXJyYXkoTUFYX01BVENIIC0gTUlOX01BVENIICsgMSk7XG56ZXJvKF9sZW5ndGhfY29kZSk7XG4vKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2xlbmd0aCAgID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyk7XG56ZXJvKGJhc2VfbGVuZ3RoKTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2Rpc3QgICAgID0gbmV3IEFycmF5KERfQ09ERVMpO1xuemVybyhiYXNlX2Rpc3QpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi9cblxuXG5mdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlICA9IHN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlICAgPSBleHRyYV9iYXNlOyAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi9cbiAgdGhpcy5lbGVtcyAgICAgICAgPSBlbGVtczsgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi9cblxuICAvLyBzaG93IGlmIGBzdGF0aWNfdHJlZWAgaGFzIGRhdGEgb3IgZHVtbXkgLSBuZWVkZWQgZm9yIG1vbm9tb3JwaGljIG9iamVjdHNcbiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7XG59XG5cblxudmFyIHN0YXRpY19sX2Rlc2M7XG52YXIgc3RhdGljX2RfZGVzYztcbnZhciBzdGF0aWNfYmxfZGVzYztcblxuXG5mdW5jdGlvbiBUcmVlRGVzYyhkeW5fdHJlZSwgc3RhdF9kZXNjKSB7XG4gIHRoaXMuZHluX3RyZWUgPSBkeW5fdHJlZTsgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi9cbiAgdGhpcy5tYXhfY29kZSA9IDA7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHRoaXMuc3RhdF9kZXNjID0gc3RhdF9kZXNjOyAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovXG59XG5cblxuXG5mdW5jdGlvbiBkX2NvZGUoZGlzdCkge1xuICByZXR1cm4gZGlzdCA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NiArIChkaXN0ID4+PiA3KV07XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS5cbiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLlxuICovXG5mdW5jdGlvbiBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkge1xuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHtcbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdLyouQ29kZSovLCB0cmVlW2MgKiAyICsgMV0vKi5MZW4qLyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlclxuICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKVxuICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNVxuICovXG5mdW5jdGlvbiBiaV9yZXZlcnNlKGNvZGUsIGxlbikge1xuICB2YXIgcmVzID0gMDtcbiAgZG8ge1xuICAgIHJlcyB8PSBjb2RlICYgMTtcbiAgICBjb2RlID4+Pj0gMTtcbiAgICByZXMgPDw9IDE7XG4gIH0gd2hpbGUgKC0tbGVuID4gMCk7XG4gIHJldHVybiByZXMgPj4+IDE7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC5cbiAqL1xuZnVuY3Rpb24gYmlfZmx1c2gocykge1xuICBpZiAocy5iaV92YWxpZCA9PT0gMTYpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gMDtcbiAgICBzLmJpX3ZhbGlkID0gMDtcblxuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkge1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWYgJiAweGZmO1xuICAgIHMuYmlfYnVmID4+PSA4O1xuICAgIHMuYmlfdmFsaWQgLT0gODtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGhcbiAqIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kXG4gKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZVxuICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLlxuICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpc1xuICogICAgIG5vdCBudWxsLlxuICovXG5mdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICAgICAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgbWF4X2NvZGUgICAgICAgID0gZGVzYy5tYXhfY29kZTtcbiAgdmFyIHN0cmVlICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZXh0cmEgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYml0cztcbiAgdmFyIGJhc2UgICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7XG4gIHZhciBtYXhfbGVuZ3RoICAgICAgPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoO1xuICB2YXIgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi9cbiAgdmFyIG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovXG4gIHZhciB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqL1xuICB2YXIgZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqL1xuICB2YXIgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovXG5cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heVxuICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS5cbiAgICovXG4gIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykge1xuICAgIG4gPSBzLmhlYXBbaF07XG4gICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdLyouRGFkKi8gKiAyICsgMV0vKi5MZW4qLyArIDE7XG4gICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSB7XG4gICAgICBiaXRzID0gbWF4X2xlbmd0aDtcbiAgICAgIG92ZXJmbG93Kys7XG4gICAgfVxuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqL1xuXG4gICAgaWYgKG4gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfSAvKiBub3QgYSBsZWFmIG5vZGUgKi9cblxuICAgIHMuYmxfY291bnRbYml0c10rKztcbiAgICB4Yml0cyA9IDA7XG4gICAgaWYgKG4gPj0gYmFzZSkge1xuICAgICAgeGJpdHMgPSBleHRyYVtuIC0gYmFzZV07XG4gICAgfVxuICAgIGYgPSB0cmVlW24gKiAyXS8qLkZyZXEqLztcbiAgICBzLm9wdF9sZW4gKz0gZiAqIChiaXRzICsgeGJpdHMpO1xuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24gKiAyICsgMV0vKi5MZW4qLyArIHhiaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKG92ZXJmbG93ID09PSAwKSB7IHJldHVybjsgfVxuXG4gIC8vIFRyYWNlKChzdGRlcnIsXCJcXG5iaXQgbGVuZ3RoIG92ZXJmbG93XFxuXCIpKTtcbiAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi9cblxuICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqL1xuICBkbyB7XG4gICAgYml0cyA9IG1heF9sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7IGJpdHMtLTsgfVxuICAgIHMuYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi9cbiAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfVxuICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovICE9PSBiaXRzKSB7XG4gICAgICAgIC8vIFRyYWNlKChzdGRlcnIsXCJjb2RlICVkIGJpdHMgJWQtPiVkXFxuXCIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7XG4gICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAtIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovKSAqIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgICAgICB0cmVlW20gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgICB9XG4gICAgICBuLS07XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmVcbiAqIG9wdGltYWwpLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3JcbiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vblxuICogICAgIHplcm8gY29kZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpXG4vLyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4vLyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovXG57XG4gIHZhciBuZXh0X2NvZGUgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi9cbiAgdmFyIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqL1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovXG5cbiAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzXG4gICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLlxuICAgKi9cbiAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cyAtIDFdKSA8PCAxO1xuICB9XG4gIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGVcbiAgICogbXVzdCBiZSBhbGwgb25lcy5cbiAgICovXG4gIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLFxuICAvLyAgICAgICAgXCJpbmNvbnNpc3RlbnQgYml0IGNvdW50c1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgXCIsIG1heF9jb2RlKSk7XG5cbiAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIHZhciBsZW4gPSB0cmVlW24gKiAyICsgMV0vKi5MZW4qLztcbiAgICBpZiAobGVuID09PSAwKSB7IGNvbnRpbnVlOyB9XG4gICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi9cbiAgICB0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTtcblxuICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVycixcIlxcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgXCIsXG4gICAgLy8gICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkge1xuICB2YXIgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovXG4gIHZhciBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovXG4gIHZhciBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqL1xuICB2YXIgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovXG4gIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvLyBkbyBjaGVjayBpbiBfdHJfaW5pdCgpXG4gIC8vaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjtcblxuICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovXG4vKiNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSU1xuICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlO1xuICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0cztcbiAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTtcbiAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7XG4gIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7XG4jZW5kaWYqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi9cbiAgbGVuZ3RoID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyAtIDE7IGNvZGUrKykge1xuICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoO1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChsZW5ndGggPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2XCIpO1xuICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZFxuICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZVxuICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6XG4gICAqL1xuICBfbGVuZ3RoX2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqL1xuICBkaXN0ID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NlwiKTtcbiAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovXG4gIGZvciAoOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCAoZXh0cmFfZGJpdHNbY29kZV0gLSA3KSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTJcIik7XG5cbiAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqL1xuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjU1KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDk7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzldKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjc5KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZVxuICAgKiBhbGwgb25lcylcbiAgICovXG4gIGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsIExfQ09ERVMgKyAxLCBibF9jb3VudCk7XG5cbiAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovXG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNTtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuLCA1KTtcbiAgfVxuXG4gIC8vIE5vdyBkYXRhIHJlYWR5IGFuZCB3ZSBjYW4gaW5pdCBzdGF0aWMgdHJlZXNcbiAgc3RhdGljX2xfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUyArIDEsIExfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2RfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfZHRyZWUsIGV4dHJhX2RiaXRzLCAwLCAgICAgICAgICBEX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19ibF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKG5ldyBBcnJheSgwKSwgZXh0cmFfYmxiaXRzLCAwLCAgICAgICAgIEJMX0NPREVTLCBNQVhfQkxfQklUUyk7XG5cbiAgLy9zdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGluaXRfYmxvY2socykge1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovXG4gIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSB7IHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHsgcy5keW5fZHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgeyBzLmJsX3RyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuXG4gIHMuZHluX2x0cmVlW0VORF9CTE9DSyAqIDJdLyouRnJlcSovID0gMTtcbiAgcy5vcHRfbGVuID0gcy5zdGF0aWNfbGVuID0gMDtcbiAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gYmlfd2luZHVwKHMpXG57XG4gIGlmIChzLmJpX3ZhbGlkID4gOCkge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHtcbiAgICAvL3B1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjtcbiAgfVxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzXG4gKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovXG4vL3Vuc2lnbmVkIGxlbjsgICAgIC8qIGl0cyBsZW5ndGggKi9cbi8vaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovXG57XG4gIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi9cblxuICBpZiAoaGVhZGVyKSB7XG4gICAgcHV0X3Nob3J0KHMsIGxlbik7XG4gICAgcHV0X3Nob3J0KHMsIH5sZW4pO1xuICB9XG4vLyAgd2hpbGUgKGxlbi0tKSB7XG4vLyAgICBwdXRfYnl0ZShzLCAqYnVmKyspO1xuLy8gIH1cbiAgdXRpbHMuYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuLCBzLnBlbmRpbmcpO1xuICBzLnBlbmRpbmcgKz0gbGVuO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuXG4gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkge1xuICB2YXIgX24yID0gbiAqIDI7XG4gIHZhciBfbTIgPSBtICogMjtcbiAgcmV0dXJuICh0cmVlW19uMl0vKi5GcmVxKi8gPCB0cmVlW19tMl0vKi5GcmVxKi8gfHxcbiAgICAgICAgICh0cmVlW19uMl0vKi5GcmVxKi8gPT09IHRyZWVbX20yXS8qLkZyZXEqLyAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLFxuICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmdcbiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHNcbiAqIHR3byBzb25zKS5cbiAqL1xuZnVuY3Rpb24gcHFkb3duaGVhcChzLCB0cmVlLCBrKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovXG4vLyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqL1xue1xuICB2YXIgdiA9IHMuaGVhcFtrXTtcbiAgdmFyIGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovXG4gIHdoaWxlIChqIDw9IHMuaGVhcF9sZW4pIHtcbiAgICAvKiBTZXQgaiB0byB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBzb25zOiAqL1xuICAgIGlmIChqIDwgcy5oZWFwX2xlbiAmJlxuICAgICAgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7XG4gICAgICBqKys7XG4gICAgfVxuICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovXG4gICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy5oZWFwW2pdLCBzLmRlcHRoKSkgeyBicmVhazsgfVxuXG4gICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi9cbiAgICBzLmhlYXBba10gPSBzLmhlYXBbal07XG4gICAgayA9IGo7XG5cbiAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovXG4gICAgaiA8PD0gMTtcbiAgfVxuICBzLmhlYXBba10gPSB2O1xufVxuXG5cbi8vIGlubGluZWQgbWFudWFsbHlcbi8vIHZhciBTTUFMTEVTVCA9IDE7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzX2Jsb2NrKHMsIGx0cmVlLCBkdHJlZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjb25zdCBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovXG4vLyAgICBjb25zdCBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqL1xue1xuICB2YXIgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovXG4gIHZhciBseCA9IDA7ICAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuICB2YXIgY29kZTsgICAgICAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi9cbiAgdmFyIGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovXG5cbiAgaWYgKHMubGFzdF9saXQgIT09IDApIHtcbiAgICBkbyB7XG4gICAgICBkaXN0ID0gKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV0pO1xuICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07XG4gICAgICBseCsrO1xuXG4gICAgICBpZiAoZGlzdCA9PT0gMCkge1xuICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsXCIgJyVjJyBcIiwgbGMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107XG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMgKyAxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqL1xuICAgICAgICB9XG4gICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpO1xuICAgICAgICAvL0Fzc2VydCAoY29kZSA8IERfQ09ERVMsIFwiYmFkIGRfY29kZVwiKTtcblxuICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqL1xuICAgICAgICB9XG4gICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovXG5cbiAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovXG4gICAgICAvL0Fzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsXG4gICAgICAvLyAgICAgICBcInBlbmRpbmdCdWYgb3ZlcmZsb3dcIik7XG5cbiAgICB9IHdoaWxlIChseCA8IHMubGFzdF9saXQpO1xuICB9XG5cbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5mdW5jdGlvbiBidWlsZF90cmVlKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBzdHJlZSAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgdmFyIG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIHZhciBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdmFyIG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7XG5cbiAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHtcbiAgICBpZiAodHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuO1xuICAgICAgcy5kZXB0aFtuXSA9IDA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsXG4gICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZVxuICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdFxuICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LlxuICAgKi9cbiAgd2hpbGUgKHMuaGVhcF9sZW4gPCAyKSB7XG4gICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTtcbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IDE7XG4gICAgcy5kZXB0aFtub2RlXSA9IDA7XG4gICAgcy5vcHRfbGVuLS07XG5cbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZSAqIDIgKyAxXS8qLkxlbiovO1xuICAgIH1cbiAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi9cbiAgfVxuICBkZXNjLm1heF9jb2RlID0gbWF4X2NvZGU7XG5cbiAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLFxuICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczpcbiAgICovXG4gIGZvciAobiA9IChzLmhlYXBfbGVuID4+IDEvKmludCAvMiovKTsgbiA+PSAxOyBuLS0pIHsgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsgfVxuXG4gIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d29cbiAgICogZnJlcXVlbnQgbm9kZXMuXG4gICAqL1xuICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi9cbiAgZG8ge1xuICAgIC8vcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi9cbiAgICAvKioqIHBxcmVtb3ZlICoqKi9cbiAgICBuID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IHMuaGVhcFtzLmhlYXBfbGVuLS1dO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG4gICAgLyoqKi9cblxuICAgIG0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovXG5cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi9cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07XG5cbiAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqL1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gdHJlZVtuICogMl0vKi5GcmVxKi8gKyB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICBzLmRlcHRoW25vZGVdID0gKHMuZGVwdGhbbl0gPj0gcy5kZXB0aFttXSA/IHMuZGVwdGhbbl0gOiBzLmRlcHRoW21dKSArIDE7XG4gICAgdHJlZVtuICogMiArIDFdLyouRGFkKi8gPSB0cmVlW20gKiAyICsgMV0vKi5EYWQqLyA9IG5vZGU7XG5cbiAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqL1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IG5vZGUrKztcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuXG4gIH0gd2hpbGUgKHMuaGVhcF9sZW4gPj0gMik7XG5cbiAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG5cbiAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vd1xuICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuXG4gICAqL1xuICBnZW5fYml0bGVuKHMsIGRlc2MpO1xuXG4gIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi9cbiAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXNcbiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHNjYW5fdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cbiAgdHJlZVsobWF4X2NvZGUgKyAxKSAqIDIgKyAxXS8qLkxlbiovID0gMHhmZmZmOyAvKiBndWFyZCAqL1xuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLyArPSBjb3VudDtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG5cbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHsgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovKys7IH1cbiAgICAgIHMuYmxfdHJlZVtSRVBfM182ICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzNfMTAgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzExXzEzOCAqIDJdLyouRnJlcSovKys7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG5cbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW5cbiAqIGJsX3RyZWUuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi9cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluXG4gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7XG4gIHZhciBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyAtIDE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHtcbiAgICBpZiAocy5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XSAqIDIgKyAxXS8qLkxlbiovICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi9cbiAgcy5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkXCIsXG4gIC8vICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgcmV0dXJuIG1heF9ibGluZGV4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqL1xue1xuICB2YXIgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovXG5cbiAgLy9Bc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCBcIm5vdCBlbm91Z2ggY29kZXNcIik7XG4gIC8vQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLFxuICAvLyAgICAgICAgXCJ0b28gbWFueSBjb2Rlc1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb3VudHM6IFwiKSk7XG4gIHNlbmRfYml0cyhzLCBsY29kZXMgLSAyNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgc2VuZF9iaXRzKHMsIGRjb2RlcyAtIDEsICAgNSk7XG4gIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHtcbiAgICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvZGUgJTJkIFwiLCBibF9vcmRlcltyYW5rXSkpO1xuICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10gKiAyICsgMV0vKi5MZW4qLywgMyk7XG4gIH1cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fbHRyZWUsIGxjb2RlcyAtIDEpOyAvKiBsaXRlcmFsIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2R0cmVlLCBkY29kZXMgLSAxKTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDpcbiAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYmxhY2sgbGlzdFwiICgwLi42LCAxNC4uMjUsIDI4Li4zMSkuXG4gKiAgICBiKSBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgcHJpbnRhYmxlIGNoYXJhY3RlciBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcIndoaXRlIGxpc3RcIiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuXG4gKiAtIEJJTkFSWSBvdGhlcndpc2UuXG4gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGFcbiAqICAgXCJncmF5IGxpc3RcIiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOlxuICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdF9kYXRhX3R5cGUocykge1xuICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXNcbiAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxXG4gICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTFcbiAgICovXG4gIHZhciBibGFja19tYXNrID0gMHhmM2ZmYzA3ZjtcbiAgdmFyIG47XG5cbiAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsIChcImJsYWNrLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkge1xuICAgIGlmICgoYmxhY2tfbWFzayAmIDEpICYmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApKSB7XG4gICAgICByZXR1cm4gWl9CSU5BUlk7XG4gICAgfVxuICB9XG5cbiAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKFwid2hpdGUtbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBpZiAocy5keW5fbHRyZWVbOSAqIDJdLyouRnJlcSovICE9PSAwIHx8IHMuZHluX2x0cmVlWzEwICogMl0vKi5GcmVxKi8gIT09IDAgfHxcbiAgICAgIHMuZHluX2x0cmVlWzEzICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICByZXR1cm4gWl9URVhUO1xuICB9XG4gIGZvciAobiA9IDMyOyBuIDwgTElURVJBTFM7IG4rKykge1xuICAgIGlmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHJldHVybiBaX1RFWFQ7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlcmUgYXJlIG5vIFwiYmxhY2stbGlzdGVkXCIgb3IgXCJ3aGl0ZS1saXN0ZWRcIiBieXRlczpcbiAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKFwiZ3JheS1saXN0ZWRcIikgYnl0ZXMgb25seS5cbiAgICovXG4gIHJldHVybiBaX0JJTkFSWTtcbn1cblxuXG52YXIgc3RhdGljX2luaXRfZG9uZSA9IGZhbHNlO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gX3RyX2luaXQocylcbntcblxuICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHtcbiAgICB0cl9zdGF0aWNfaW5pdCgpO1xuICAgIHN0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xuICB9XG5cbiAgcy5sX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2x0cmVlLCBzdGF0aWNfbF9kZXNjKTtcbiAgcy5kX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2R0cmVlLCBzdGF0aWNfZF9kZXNjKTtcbiAgcy5ibF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuYmxfdHJlZSwgc3RhdGljX2JsX2Rlc2MpO1xuXG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovXG4gIGluaXRfYmxvY2socyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgc3RvcmVkIGJsb2NrXG4gKi9cbmZ1bmN0aW9uIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi9cbiAgY29weV9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIHRydWUpOyAvKiB3aXRoIGhlYWRlciAqL1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS5cbiAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBfdHJfYWxpZ24ocykge1xuICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTIDw8IDEsIDMpO1xuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpO1xuICBiaV9mbHVzaChzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpY1xuICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLlxuICovXG5mdW5jdGlvbiBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgdmFyIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi9cbiAgdmFyIG1heF9ibGluZGV4ID0gMDsgICAgICAgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovXG4gIGlmIChzLmxldmVsID4gMCkge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi9cbiAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOKSB7XG4gICAgICBzLnN0cm0uZGF0YV90eXBlID0gZGV0ZWN0X2RhdGFfdHlwZShzKTtcbiAgICB9XG5cbiAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gICAgYnVpbGRfdHJlZShzLCBzLmxfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcblxuICAgIGJ1aWxkX3RyZWUocywgcy5kX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZlxuICAgICAqIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuXG4gICAgICovXG5cbiAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleFxuICAgICAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICAgICAqL1xuICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTtcblxuICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSB0aGUgYmxvY2sgbGVuZ3RocyBpbiBieXRlcy4gKi9cbiAgICBvcHRfbGVuYiA9IChzLm9wdF9sZW4gKyAzICsgNykgPj4+IDM7XG4gICAgc3RhdGljX2xlbmIgPSAocy5zdGF0aWNfbGVuICsgMyArIDcpID4+PiAzO1xuXG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgXCIsXG4gICAgLy8gICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbixcbiAgICAvLyAgICAgICAgcy0+bGFzdF9saXQpKTtcblxuICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgeyBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOyB9XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBBc3NlcnQoYnVmICE9IChjaGFyKikwLCBcImxvc3QgYnVmXCIpO1xuICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi9cbiAgfVxuXG4gIGlmICgoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkge1xuICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi9cblxuICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuXG4gICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZVxuICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0b1xuICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suXG4gICAgICovXG4gICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpO1xuXG4gIH0gZWxzZSBpZiAocy5zdHJhdGVneSA9PT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHtcblxuICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTtcblxuICB9IGVsc2Uge1xuICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMubF9kZXNjLm1heF9jb2RlICsgMSwgcy5kX2Rlc2MubWF4X2NvZGUgKyAxLCBtYXhfYmxpbmRleCArIDEpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHMuZHluX2x0cmVlLCBzLmR5bl9kdHJlZSk7XG4gIH1cbiAgLy8gQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsIFwiYmFkIGNvbXByZXNzZWQgc2l6ZVwiKTtcbiAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUJcbiAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuXG4gICAqL1xuICBpbml0X2Jsb2NrKHMpO1xuXG4gIGlmIChsYXN0KSB7XG4gICAgYmlfd2luZHVwKHMpO1xuICB9XG4gIC8vIFRyYWNldigoc3RkZXJyLFwiXFxuY29tcHJsZW4gJWx1KCVsdSkgXCIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLFxuICAvLyAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWZcbiAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gX3RyX3RhbGx5KHMsIGRpc3QsIGxjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuLy8gICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovXG57XG4gIC8vdmFyIG91dF9sZW5ndGgsIGluX2xlbmd0aCwgZGNvZGU7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdICAgICA9IChkaXN0ID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMHhmZjtcblxuICBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBzLmxhc3RfbGl0XSA9IGxjICYgMHhmZjtcbiAgcy5sYXN0X2xpdCsrO1xuXG4gIGlmIChkaXN0ID09PSAwKSB7XG4gICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovXG4gICAgcy5keW5fbHRyZWVbbGMgKiAyXS8qLkZyZXEqLysrO1xuICB9IGVsc2Uge1xuICAgIHMubWF0Y2hlcysrO1xuICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICBkaXN0LS07ICAgICAgICAgICAgIC8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAvL0Fzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmXG4gICAgLy8gICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJlxuICAgIC8vICAgICAgICh1c2gpZF9jb2RlKGRpc3QpIDwgKHVzaClEX0NPREVTLCAgXCJfdHJfdGFsbHk6IGJhZCBtYXRjaFwiKTtcblxuICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMgKyAxKSAqIDJdLyouRnJlcSovKys7XG4gICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0vKi5GcmVxKi8rKztcbiAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuXG4vLyNpZmRlZiBUUlVOQ0FURV9CTE9DS1xuLy8gIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqL1xuLy8gIGlmICgocy5sYXN0X2xpdCAmIDB4MWZmZikgPT09IDAgJiYgcy5sZXZlbCA+IDIpIHtcbi8vICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqL1xuLy8gICAgb3V0X2xlbmd0aCA9IHMubGFzdF9saXQqODtcbi8vICAgIGluX2xlbmd0aCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0O1xuLy9cbi8vICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHtcbi8vICAgICAgb3V0X2xlbmd0aCArPSBzLmR5bl9kdHJlZVtkY29kZSoyXS8qLkZyZXEqLyAqICg1ICsgZXh0cmFfZGJpdHNbZGNvZGVdKTtcbi8vICAgIH1cbi8vICAgIG91dF9sZW5ndGggPj4+PSAzO1xuLy8gICAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSBcIixcbi8vICAgIC8vICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsXG4vLyAgICAvLyAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpO1xuLy8gICAgaWYgKHMubWF0Y2hlcyA8IChzLmxhc3RfbGl0Pj4xKS8qaW50IC8yKi8gJiYgb3V0X2xlbmd0aCA8IChpbl9sZW5ndGg+PjEpLyppbnQgLzIqLykge1xuLy8gICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgIH1cbi8vICB9XG4vLyNlbmRpZlxuXG4gIHJldHVybiAocy5sYXN0X2xpdCA9PT0gcy5saXRfYnVmc2l6ZSAtIDEpO1xuICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEtcbiAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG9cbiAgICogNjRLLTEgYnl0ZXMuXG4gICAqL1xufVxuXG5leHBvcnRzLl90cl9pbml0ICA9IF90cl9pbml0O1xuZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrID0gX3RyX3N0b3JlZF9ibG9jaztcbmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrICA9IF90cl9mbHVzaF9ibG9jaztcbmV4cG9ydHMuX3RyX3RhbGx5ID0gX3RyX3RhbGx5O1xuZXhwb3J0cy5fdHJfYWxpZ24gPSBfdHJfYWxpZ247XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBaU3RyZWFtO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9icm93c2VyL1BhcnNlLmpzJyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy50cmFjayA9IHRyYWNrO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuLyoqXG4gKiBQYXJzZS5BbmFseXRpY3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIFBhcnNlJ3MgbG9nZ2luZyBhbmQgYW5hbHl0aWNzXG4gKiBiYWNrZW5kLlxuICpcbiAqIEBjbGFzcyBQYXJzZS5BbmFseXRpY3NcbiAqIEBzdGF0aWNcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuXG4vKipcbiAqIFRyYWNrcyB0aGUgb2NjdXJyZW5jZSBvZiBhIGN1c3RvbSBldmVudCB3aXRoIGFkZGl0aW9uYWwgZGltZW5zaW9ucy5cbiAqIFBhcnNlIHdpbGwgc3RvcmUgYSBkYXRhIHBvaW50IGF0IHRoZSB0aW1lIG9mIGludm9jYXRpb24gd2l0aCB0aGUgZ2l2ZW5cbiAqIGV2ZW50IG5hbWUuXG4gKlxuICogRGltZW5zaW9ucyB3aWxsIGFsbG93IHNlZ21lbnRhdGlvbiBvZiB0aGUgb2NjdXJyZW5jZXMgb2YgdGhpcyBjdXN0b21cbiAqIGV2ZW50LiBLZXlzIGFuZCB2YWx1ZXMgc2hvdWxkIGJlIHtAY29kZSBTdHJpbmd9cywgYW5kIHdpbGwgdGhyb3dcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBUbyB0cmFjayBhIHVzZXIgc2lnbnVwIGFsb25nIHdpdGggYWRkaXRpb25hbCBtZXRhZGF0YSwgY29uc2lkZXIgdGhlXG4gKiBmb2xsb3dpbmc6XG4gKiA8cHJlPlxuICogdmFyIGRpbWVuc2lvbnMgPSB7XG4gKiAgZ2VuZGVyOiAnbScsXG4gKiAgc291cmNlOiAnd2ViJyxcbiAqICBkYXlUeXBlOiAnd2Vla2VuZCdcbiAqIH07XG4gKiBQYXJzZS5BbmFseXRpY3MudHJhY2soJ3NpZ251cCcsIGRpbWVuc2lvbnMpO1xuICogPC9wcmU+XG4gKlxuICogVGhlcmUgaXMgYSBkZWZhdWx0IGxpbWl0IG9mIDggZGltZW5zaW9ucyBwZXIgZXZlbnQgdHJhY2tlZC5cbiAqXG4gKiBAZnVuY3Rpb24gdHJhY2tcbiAqIEBuYW1lIFBhcnNlLkFuYWx5dGljcy50cmFja1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBldmVudCB0byByZXBvcnQgdG8gUGFyc2UgYXNcbiAqIGhhdmluZyBoYXBwZW5lZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBkaW1lbnNpb25zIFRoZSBkaWN0aW9uYXJ5IG9mIGluZm9ybWF0aW9uIGJ5IHdoaWNoIHRvXG4gKiBzZWdtZW50IHRoaXMgZXZlbnQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgcm91bmQtdHJpcFxuICogdG8gdGhlIHNlcnZlciBjb21wbGV0ZXMuXG4gKi9cbmZ1bmN0aW9uIHRyYWNrKG5hbWUsIGRpbWVuc2lvbnMpIHtcbiAgbmFtZSA9IG5hbWUgfHwgJyc7XG4gIG5hbWUgPSBuYW1lLnJlcGxhY2UoL15cXHMqLywgJycpO1xuICBuYW1lID0gbmFtZS5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbiAgaWYgKG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBuYW1lIGZvciB0aGUgY3VzdG9tIGV2ZW50IG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBkaW1lbnNpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkaW1lbnNpb25zW2tleV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0cmFjaygpIGRpbWVuc2lvbnMgZXhwZWN0cyBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBcInN0cmluZ1wiLicpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QW5hbHl0aWNzQ29udHJvbGxlcigpLnRyYWNrKG5hbWUsIGRpbWVuc2lvbnMpO1xufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIHRyYWNrKG5hbWUsIGRpbWVuc2lvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnZXZlbnRzLycgKyBuYW1lLCB7XG4gICAgICBkaW1lbnNpb25zXG4gICAgfSk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRBbmFseXRpY3NDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9QYXJzZVVzZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlVXNlclwiKSk7XG52YXIgX3V1aWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V1aWRcIikpO1xubGV0IHJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBQcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIEFub255bW91c2x5IGxvZ2dlZC1pbiB1c2Vycy4gPGJyIC8+XG4gKiBBbm9ueW1vdXMgdXNlcnMgaGF2ZSBzb21lIHVuaXF1ZSBjaGFyYWN0ZXJpc3RpY3M6XG4gKiA8dWw+XG4gKiAgPGxpPkFub255bW91cyB1c2VycyBkb24ndCBuZWVkIGEgdXNlciBuYW1lIG9yIHBhc3N3b3JkLjwvbGk+XG4gKiAgPHVsPlxuICogICAgPGxpPk9uY2UgbG9nZ2VkIG91dCwgYW4gYW5vbnltb3VzIHVzZXIgY2Fubm90IGJlIHJlY292ZXJlZC48L2xpPlxuICogIDwvdWw+XG4gKiAgPGxpPnNpZ25VcCBjb252ZXJ0cyBhbiBhbm9ueW1vdXMgdXNlciB0byBhIHN0YW5kYXJkIHVzZXIgd2l0aCB0aGUgZ2l2ZW4gdXNlcm5hbWUgYW5kIHBhc3N3b3JkLjwvbGk+XG4gKiAgPHVsPlxuICogICAgPGxpPkRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbm9ueW1vdXMgdXNlciBpcyByZXRhaW5lZC48L2xpPlxuICogIDwvdWw+XG4gKiAgPGxpPmxvZ0luIHN3aXRjaGVzIHVzZXJzIHdpdGhvdXQgY29udmVydGluZyB0aGUgYW5vbnltb3VzIHVzZXIuPC9saT5cbiAqICA8dWw+XG4gKiAgICA8bGk+RGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFub255bW91cyB1c2VyIHdpbGwgYmUgbG9zdC48L2xpPlxuICogIDwvdWw+XG4gKiAgPGxpPlNlcnZpY2UgbG9nSW4gKGUuZy4gRmFjZWJvb2ssIFR3aXR0ZXIpIHdpbGwgYXR0ZW1wdCB0byBjb252ZXJ0XG4gKiAgdGhlIGFub255bW91cyB1c2VyIGludG8gYSBzdGFuZGFyZCB1c2VyIGJ5IGxpbmtpbmcgaXQgdG8gdGhlIHNlcnZpY2UuPC9saT5cbiAqICA8dWw+XG4gKiAgICA8bGk+SWYgYSB1c2VyIGFscmVhZHkgZXhpc3RzIHRoYXQgaXMgbGlua2VkIHRvIHRoZSBzZXJ2aWNlLCBpdCB3aWxsIGluc3RlYWQgc3dpdGNoIHRvIHRoZSBleGlzdGluZyB1c2VyLjwvbGk+XG4gKiAgPC91bD5cbiAqICA8bGk+U2VydmljZSBsaW5raW5nIChlLmcuIEZhY2Vib29rLCBUd2l0dGVyKSB3aWxsIGNvbnZlcnQgdGhlIGFub255bW91cyB1c2VyXG4gKiAgaW50byBhIHN0YW5kYXJkIHVzZXIgYnkgbGlua2luZyBpdCB0byB0aGUgc2VydmljZS48L2xpPlxuICogPC91bD5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuQW5vbnltb3VzVXRpbHNcbiAqIEBzdGF0aWNcbiAqL1xuY29uc3QgQW5vbnltb3VzVXRpbHMgPSB7XG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZWlyIGFjY291bnQgbGlua2VkIHRvIGFub255bW91cyB1c2VyLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gaXNMaW5rZWRcbiAgICogQG5hbWUgUGFyc2UuQW5vbnltb3VzVXRpbHMuaXNMaW5rZWRcbiAgICogQHBhcmFtIHtQYXJzZS5Vc2VyfSB1c2VyIFVzZXIgdG8gY2hlY2sgZm9yLlxuICAgKiAgICAgVGhlIHVzZXIgbXVzdCBiZSBsb2dnZWQgaW4gb24gdGhpcyBkZXZpY2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBoYXMgdGhlaXIgYWNjb3VudFxuICAgKiAgICAgbGlua2VkIHRvIGFuIGFub255bW91cyB1c2VyLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBpc0xpbmtlZCh1c2VyKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLl9nZXRBdXRoUHJvdmlkZXIoKTtcbiAgICByZXR1cm4gdXNlci5faXNMaW5rZWQocHJvdmlkZXIuZ2V0QXV0aFR5cGUoKSk7XG4gIH0sXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciBBbm9ueW1vdXNseS5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGxvZ0luXG4gICAqIEBuYW1lIFBhcnNlLkFub255bW91c1V0aWxzLmxvZ0luXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE1hc3RlcktleSAvIFNlc3Npb25Ub2tlbi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IExvZ2dlZCBpbiB1c2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGxvZ0luKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuX2dldEF1dGhQcm92aWRlcigpO1xuICAgIHJldHVybiBfUGFyc2VVc2VyLmRlZmF1bHQubG9nSW5XaXRoKHByb3ZpZGVyLmdldEF1dGhUeXBlKCksIHByb3ZpZGVyLmdldEF1dGhEYXRhKCksIG9wdGlvbnMpO1xuICB9LFxuICAvKipcbiAgICogTGlua3MgQW5vbnltb3VzIFVzZXIgdG8gYW4gZXhpc3RpbmcgUEZVc2VyLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbGlua1xuICAgKiBAbmFtZSBQYXJzZS5Bbm9ueW1vdXNVdGlscy5saW5rXG4gICAqIEBwYXJhbSB7UGFyc2UuVXNlcn0gdXNlciBVc2VyIHRvIGxpbmsuIFRoaXMgbXVzdCBiZSB0aGUgY3VycmVudCB1c2VyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBNYXN0ZXJLZXkgLyBTZXNzaW9uVG9rZW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBMaW5rZWQgd2l0aCBVc2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGxpbmsodXNlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5fZ2V0QXV0aFByb3ZpZGVyKCk7XG4gICAgcmV0dXJuIHVzZXIubGlua1dpdGgocHJvdmlkZXIuZ2V0QXV0aFR5cGUoKSwgcHJvdmlkZXIuZ2V0QXV0aERhdGEoKSwgb3B0aW9ucyk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgQXV0aGVudGljYXRpb24gUHJvdmlkZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCBmb3IgdXNlLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gaXNSZWdpc3RlcmVkXG4gICAqIEBuYW1lIFBhcnNlLkFub255bW91c1V0aWxzLmlzUmVnaXN0ZXJlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgaXNSZWdpc3RlcmVkKCkge1xuICAgIHJldHVybiByZWdpc3RlcmVkO1xuICB9LFxuICBfZ2V0QXV0aFByb3ZpZGVyKCkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0ge1xuICAgICAgcmVzdG9yZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBnZXRBdXRoVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuICdhbm9ueW1vdXMnO1xuICAgICAgfSxcbiAgICAgIGdldEF1dGhEYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGF1dGhEYXRhOiB7XG4gICAgICAgICAgICBpZDogKDAsIF91dWlkLmRlZmF1bHQpKClcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoIXJlZ2lzdGVyZWQpIHtcbiAgICAgIF9QYXJzZVVzZXIuZGVmYXVsdC5fcmVnaXN0ZXJBdXRoZW50aWNhdGlvblByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICAgIHJlZ2lzdGVyZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcHJvdmlkZXI7XG4gIH1cbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBBbm9ueW1vdXNVdGlsczsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRKb2JTdGF0dXMgPSBnZXRKb2JTdGF0dXM7XG5leHBvcnRzLmdldEpvYnNEYXRhID0gZ2V0Sm9ic0RhdGE7XG5leHBvcnRzLnJ1biA9IHJ1bjtcbmV4cG9ydHMuc3RhcnRKb2IgPSBzdGFydEpvYjtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVF1ZXJ5XCIpKTtcbi8qKlxuICogQ29udGFpbnMgZnVuY3Rpb25zIGZvciBjYWxsaW5nIGFuZCBkZWNsYXJpbmdcbiAqIDxhIGhyZWY9XCIvZG9jcy9jbG91ZF9jb2RlX2d1aWRlI2Z1bmN0aW9uc1wiPmNsb3VkIGZ1bmN0aW9uczwvYT4uXG4gKiA8cD48c3Ryb25nPjxlbT5cbiAqICAgU29tZSBmdW5jdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGZyb20gQ2xvdWQgQ29kZS5cbiAqIDwvZW0+PC9zdHJvbmc+PC9wPlxuICpcbiAqIEBjbGFzcyBQYXJzZS5DbG91ZFxuICogQHN0YXRpY1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICovXG5cbi8qKlxuICogTWFrZXMgYSBjYWxsIHRvIGEgY2xvdWQgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIHJ1blxuICogQG5hbWUgUGFyc2UuQ2xvdWQucnVuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVuY3Rpb24gbmFtZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIFRoZSBwYXJhbWV0ZXJzIHRvIHNlbmQgdG8gdGhlIGNsb3VkIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdFxuICogb2YgdGhlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBydW4obmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nsb3VkIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgfVxuICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHt9O1xuICBpZiAob3B0aW9ucy51c2VNYXN0ZXJLZXkpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgfVxuICBpZiAob3B0aW9ucy5zZXNzaW9uVG9rZW4pIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgfVxuICBpZiAob3B0aW9ucy5pbnN0YWxsYXRpb25JZCkge1xuICAgIHJlcXVlc3RPcHRpb25zLmluc3RhbGxhdGlvbklkID0gb3B0aW9ucy5pbnN0YWxsYXRpb25JZDtcbiAgfVxuICBpZiAob3B0aW9ucy5jb250ZXh0ICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgfVxuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q2xvdWRDb250cm9sbGVyKCkucnVuKG5hbWUsIGRhdGEsIHJlcXVlc3RPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBHZXRzIGRhdGEgZm9yIHRoZSBjdXJyZW50IHNldCBvZiBjbG91ZCBqb2JzLlxuICpcbiAqIEBmdW5jdGlvbiBnZXRKb2JzRGF0YVxuICogQG5hbWUgUGFyc2UuQ2xvdWQuZ2V0Sm9ic0RhdGFcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdFxuICogb2YgdGhlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBnZXRKb2JzRGF0YSgpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENsb3VkQ29udHJvbGxlcigpLmdldEpvYnNEYXRhKHtcbiAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogU3RhcnRzIGEgZ2l2ZW4gY2xvdWQgam9iLCB3aGljaCB3aWxsIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQGZ1bmN0aW9uIHN0YXJ0Sm9iXG4gKiBAbmFtZSBQYXJzZS5DbG91ZC5zdGFydEpvYlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIGZ1bmN0aW9uIG5hbWUuXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSBUaGUgcGFyYW1ldGVycyB0byBzZW5kIHRvIHRoZSBjbG91ZCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIGpvYlN0YXR1c0lkXG4gKiBvZiB0aGUgam9iLlxuICovXG5mdW5jdGlvbiBzdGFydEpvYihuYW1lLCBkYXRhKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDbG91ZCBqb2IgbmFtZSBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICB9XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDbG91ZENvbnRyb2xsZXIoKS5zdGFydEpvYihuYW1lLCBkYXRhLCB7XG4gICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldHMgam9iIHN0YXR1cyBieSBJZFxuICpcbiAqIEBmdW5jdGlvbiBnZXRKb2JTdGF0dXNcbiAqIEBuYW1lIFBhcnNlLkNsb3VkLmdldEpvYlN0YXR1c1xuICogQHBhcmFtIHtzdHJpbmd9IGpvYlN0YXR1c0lkIFRoZSBJZCBvZiBKb2IgU3RhdHVzLlxuICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gU3RhdHVzIG9mIEpvYi5cbiAqL1xuZnVuY3Rpb24gZ2V0Sm9iU3RhdHVzKGpvYlN0YXR1c0lkKSB7XG4gIGNvbnN0IHF1ZXJ5ID0gbmV3IF9QYXJzZVF1ZXJ5LmRlZmF1bHQoJ19Kb2JTdGF0dXMnKTtcbiAgcmV0dXJuIHF1ZXJ5LmdldChqb2JTdGF0dXNJZCwge1xuICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICB9KTtcbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBydW4obmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXlsb2FkID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkoZGF0YSwgdHJ1ZSk7XG4gICAgY29uc3QgcmVxdWVzdCA9IFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnZnVuY3Rpb25zLycgKyBuYW1lLCBwYXlsb2FkLCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmVxdWVzdC50aGVuKHJlcyA9PiB7XG4gICAgICBpZiAodHlwZW9mIHJlcyA9PT0gJ29iamVjdCcgJiYgKDAsIF9rZXlzLmRlZmF1bHQpKHJlcykubGVuZ3RoID4gMCAmJiAhcmVzLmhhc093blByb3BlcnR5KCdyZXN1bHQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfSlNPTiwgJ1RoZSBzZXJ2ZXIgcmV0dXJuZWQgYW4gaW52YWxpZCByZXNwb25zZS4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY29kZWQgPSAoMCwgX2RlY29kZS5kZWZhdWx0KShyZXMpO1xuICAgICAgaWYgKGRlY29kZWQgJiYgZGVjb2RlZC5oYXNPd25Qcm9wZXJ0eSgncmVzdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShkZWNvZGVkLnJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH0sXG4gIGdldEpvYnNEYXRhKG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdjbG91ZF9jb2RlL2pvYnMvZGF0YScsIG51bGwsIG9wdGlvbnMpO1xuICB9LFxuICBhc3luYyBzdGFydEpvYihuYW1lLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBheWxvYWQgPSAoMCwgX2VuY29kZS5kZWZhdWx0KShkYXRhLCB0cnVlKTtcbiAgICBvcHRpb25zLnJldHVyblN0YXR1cyA9IHRydWU7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2pvYnMvJyArIG5hbWUsIHBheWxvYWQsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXNwb25zZS5faGVhZGVycz8uWydYLVBhcnNlLUpvYi1TdGF0dXMtSWQnXTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldENsb3VkQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xuLyoqIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1uYXRpdmUtYXN5bmMtc3RvcmFnZS9hc3luYy1zdG9yYWdlL2Jsb2IvbWFpbi9wYWNrYWdlcy9kZWZhdWx0LXN0b3JhZ2UtYmFja2VuZC9zcmMvdHlwZXMudHMgKi9cblxuY29uc3QgY29uZmlnID0ge1xuICBJU19OT0RFOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgISFwcm9jZXNzLnZlcnNpb25zICYmICEhcHJvY2Vzcy52ZXJzaW9ucy5ub2RlICYmICFwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uLFxuICBSRVFVRVNUX0FUVEVNUFRfTElNSVQ6IDUsXG4gIFJFUVVFU1RfQkFUQ0hfU0laRTogMjAsXG4gIFJFUVVFU1RfSEVBREVSUzoge30sXG4gIFNFUlZFUl9VUkw6ICdodHRwczovL2FwaS5wYXJzZS5jb20vMScsXG4gIFNFUlZFUl9BVVRIX1RZUEU6IG51bGwsXG4gIFNFUlZFUl9BVVRIX1RPS0VOOiBudWxsLFxuICBMSVZFUVVFUllfU0VSVkVSX1VSTDogbnVsbCxcbiAgRU5DUllQVEVEX0tFWTogbnVsbCxcbiAgVkVSU0lPTjogJ2pzJyArIFwiNS4zLjBcIixcbiAgQVBQTElDQVRJT05fSUQ6IG51bGwsXG4gIEpBVkFTQ1JJUFRfS0VZOiBudWxsLFxuICBNQVNURVJfS0VZOiBudWxsLFxuICBVU0VfTUFTVEVSX0tFWTogZmFsc2UsXG4gIFBFUkZPUk1fVVNFUl9SRVdSSVRFOiB0cnVlLFxuICBGT1JDRV9SRVZPQ0FCTEVfU0VTU0lPTjogZmFsc2UsXG4gIEVOQ1JZUFRFRF9VU0VSOiBmYWxzZSxcbiAgSURFTVBPVEVOQ1k6IGZhbHNlLFxuICBBTExPV19DVVNUT01fT0JKRUNUX0lEOiBmYWxzZSxcbiAgUEFSU0VfRVJST1JTOiBbXVxufTtcbmZ1bmN0aW9uIHJlcXVpcmVNZXRob2RzKG5hbWUsIG1ldGhvZHMsIGNvbnRyb2xsZXIpIHtcbiAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKG1ldGhvZHMpLmNhbGwobWV0aG9kcywgZnVuYyA9PiB7XG4gICAgaWYgKHR5cGVvZiBjb250cm9sbGVyW2Z1bmNdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX0gbXVzdCBpbXBsZW1lbnQgJHtmdW5jfSgpYCk7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IENvcmVNYW5hZ2VyID0ge1xuICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHJldHVybiBjb25maWdba2V5XTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb25maWd1cmF0aW9uIGtleSBub3QgZm91bmQ6ICcgKyBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgY29uZmlnW2tleV0gPSB2YWx1ZTtcbiAgfSxcbiAgc2V0SWZOZWVkZWQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgaWYgKCFjb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgY29uZmlnW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZ1trZXldO1xuICB9LFxuICAvKiBTcGVjaWFsaXplZCBDb250cm9sbGVyIFNldHRlcnMvR2V0dGVycyAqL1xuXG4gIHNldEFuYWx5dGljc0NvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdBbmFseXRpY3NDb250cm9sbGVyJywgWyd0cmFjayddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0FuYWx5dGljc0NvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldEFuYWx5dGljc0NvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snQW5hbHl0aWNzQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRDbG91ZENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdDbG91ZENvbnRyb2xsZXInLCBbJ3J1bicsICdnZXRKb2JzRGF0YScsICdzdGFydEpvYiddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0Nsb3VkQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0Q2xvdWRDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0Nsb3VkQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRDb25maWdDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnQ29uZmlnQ29udHJvbGxlcicsIFsnY3VycmVudCcsICdnZXQnLCAnc2F2ZSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0NvbmZpZ0NvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldENvbmZpZ0NvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snQ29uZmlnQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRDcnlwdG9Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnQ3J5cHRvQ29udHJvbGxlcicsIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snQ3J5cHRvQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0Q3J5cHRvQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydDcnlwdG9Db250cm9sbGVyJ107XG4gIH0sXG4gIHNldEV2ZW50RW1pdHRlcihldmVudEVtaXR0ZXIpIHtcbiAgICBjb25maWdbJ0V2ZW50RW1pdHRlciddID0gZXZlbnRFbWl0dGVyO1xuICB9LFxuICBnZXRFdmVudEVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snRXZlbnRFbWl0dGVyJ107XG4gIH0sXG4gIHNldEZpbGVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnRmlsZUNvbnRyb2xsZXInLCBbJ3NhdmVGaWxlJywgJ3NhdmVCYXNlNjQnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydGaWxlQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgc2V0RXZlbnR1YWxseVF1ZXVlKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnRXZlbnR1YWxseVF1ZXVlJywgWydwb2xsJywgJ3NhdmUnLCAnZGVzdHJveSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0V2ZW50dWFsbHlRdWV1ZSddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0RXZlbnR1YWxseVF1ZXVlKCkge1xuICAgIHJldHVybiBjb25maWdbJ0V2ZW50dWFsbHlRdWV1ZSddO1xuICB9LFxuICBnZXRGaWxlQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydGaWxlQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnSW5zdGFsbGF0aW9uQ29udHJvbGxlcicsIFsnY3VycmVudEluc3RhbGxhdGlvbklkJywgJ2N1cnJlbnRJbnN0YWxsYXRpb24nLCAndXBkYXRlSW5zdGFsbGF0aW9uT25EaXNrJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snSW5zdGFsbGF0aW9uQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydJbnN0YWxsYXRpb25Db250cm9sbGVyJ107XG4gIH0sXG4gIHNldExpdmVRdWVyeShsaXZlUXVlcnkpIHtcbiAgICBjb25maWdbJ0xpdmVRdWVyeSddID0gbGl2ZVF1ZXJ5O1xuICB9LFxuICBnZXRMaXZlUXVlcnkoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snTGl2ZVF1ZXJ5J107XG4gIH0sXG4gIHNldE9iamVjdENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdPYmplY3RDb250cm9sbGVyJywgWydzYXZlJywgJ2ZldGNoJywgJ2Rlc3Ryb3knXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydPYmplY3RDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRPYmplY3RDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ09iamVjdENvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnT2JqZWN0U3RhdGVDb250cm9sbGVyJywgWydnZXRTdGF0ZScsICdpbml0aWFsaXplU3RhdGUnLCAncmVtb3ZlU3RhdGUnLCAnZ2V0U2VydmVyRGF0YScsICdzZXRTZXJ2ZXJEYXRhJywgJ2dldFBlbmRpbmdPcHMnLCAnc2V0UGVuZGluZ09wJywgJ3B1c2hQZW5kaW5nU3RhdGUnLCAncG9wUGVuZGluZ1N0YXRlJywgJ21lcmdlRmlyc3RQZW5kaW5nU3RhdGUnLCAnZ2V0T2JqZWN0Q2FjaGUnLCAnZXN0aW1hdGVBdHRyaWJ1dGUnLCAnZXN0aW1hdGVBdHRyaWJ1dGVzJywgJ2NvbW1pdFNlcnZlckNoYW5nZXMnLCAnZW5xdWV1ZVRhc2snLCAnY2xlYXJBbGxTdGF0ZSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ09iamVjdFN0YXRlQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ09iamVjdFN0YXRlQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRQdXNoQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1B1c2hDb250cm9sbGVyJywgWydzZW5kJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snUHVzaENvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFB1c2hDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1B1c2hDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFF1ZXJ5Q29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1F1ZXJ5Q29udHJvbGxlcicsIFsnZmluZCcsICdhZ2dyZWdhdGUnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydRdWVyeUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFF1ZXJ5Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydRdWVyeUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0UkVTVENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdSRVNUQ29udHJvbGxlcicsIFsncmVxdWVzdCcsICdhamF4J10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snUkVTVENvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFJFU1RDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1JFU1RDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFNjaGVtYUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdTY2hlbWFDb250cm9sbGVyJywgWydnZXQnLCAnY3JlYXRlJywgJ3VwZGF0ZScsICdkZWxldGUnLCAnc2VuZCcsICdwdXJnZSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ1NjaGVtYUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFNjaGVtYUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snU2NoZW1hQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRTZXNzaW9uQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1Nlc3Npb25Db250cm9sbGVyJywgWydnZXRTZXNzaW9uJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snU2Vzc2lvbkNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFNlc3Npb25Db250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1Nlc3Npb25Db250cm9sbGVyJ107XG4gIH0sXG4gIHNldFN0b3JhZ2VDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYykge1xuICAgICAgcmVxdWlyZU1ldGhvZHMoJ0FuIGFzeW5jIFN0b3JhZ2VDb250cm9sbGVyJywgWydnZXRJdGVtQXN5bmMnLCAnc2V0SXRlbUFzeW5jJywgJ3JlbW92ZUl0ZW1Bc3luYycsICdnZXRBbGxLZXlzQXN5bmMnXSwgY29udHJvbGxlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVpcmVNZXRob2RzKCdBIHN5bmNocm9ub3VzIFN0b3JhZ2VDb250cm9sbGVyJywgWydnZXRJdGVtJywgJ3NldEl0ZW0nLCAncmVtb3ZlSXRlbScsICdnZXRBbGxLZXlzJ10sIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBjb25maWdbJ1N0b3JhZ2VDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBzZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXInLCBbJ3BpbldpdGhOYW1lJywgJ2Zyb21QaW5XaXRoTmFtZScsICd1blBpbldpdGhOYW1lJywgJ2dldEFsbENvbnRlbnRzJywgJ2NsZWFyJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldExvY2FsRGF0YXN0b3JlKHN0b3JlKSB7XG4gICAgY29uZmlnWydMb2NhbERhdGFzdG9yZSddID0gc3RvcmU7XG4gIH0sXG4gIGdldExvY2FsRGF0YXN0b3JlKCkge1xuICAgIHJldHVybiBjb25maWdbJ0xvY2FsRGF0YXN0b3JlJ107XG4gIH0sXG4gIGdldFN0b3JhZ2VDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1N0b3JhZ2VDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldEFzeW5jU3RvcmFnZShzdG9yYWdlKSB7XG4gICAgY29uZmlnWydBc3luY1N0b3JhZ2UnXSA9IHN0b3JhZ2U7XG4gIH0sXG4gIGdldEFzeW5jU3RvcmFnZSgpIHtcbiAgICByZXR1cm4gY29uZmlnWydBc3luY1N0b3JhZ2UnXTtcbiAgfSxcbiAgc2V0V2ViU29ja2V0Q29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgY29uZmlnWydXZWJTb2NrZXRDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRXZWJTb2NrZXRDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1dlYlNvY2tldENvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0VXNlckNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdVc2VyQ29udHJvbGxlcicsIFsnc2V0Q3VycmVudFVzZXInLCAnY3VycmVudFVzZXInLCAnY3VycmVudFVzZXJBc3luYycsICdzaWduVXAnLCAnbG9nSW4nLCAnYmVjb21lJywgJ2xvZ091dCcsICdtZScsICdyZXF1ZXN0UGFzc3dvcmRSZXNldCcsICd1cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uJywgJ3JlcXVlc3RFbWFpbFZlcmlmaWNhdGlvbicsICd2ZXJpZnlQYXNzd29yZCcsICdsaW5rV2l0aCddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ1VzZXJDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRVc2VyQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydVc2VyQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRMaXZlUXVlcnlDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnTGl2ZVF1ZXJ5Q29udHJvbGxlcicsIFsnc2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudCcsICdnZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50JywgJ19jbGVhckNhY2hlZERlZmF1bHRDbGllbnQnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydMaXZlUXVlcnlDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRMaXZlUXVlcnlDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0xpdmVRdWVyeUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0SG9va3NDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnSG9va3NDb250cm9sbGVyJywgWydjcmVhdGUnLCAnZ2V0JywgJ3VwZGF0ZScsICdyZW1vdmUnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydIb29rc0NvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldEhvb2tzQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydIb29rc0NvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0UGFyc2VPcChvcCkge1xuICAgIGNvbmZpZ1snUGFyc2VPcCddID0gb3A7XG4gIH0sXG4gIGdldFBhcnNlT3AoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUGFyc2VPcCddO1xuICB9LFxuICBzZXRQYXJzZU9iamVjdChvYmplY3QpIHtcbiAgICBjb25maWdbJ1BhcnNlT2JqZWN0J10gPSBvYmplY3Q7XG4gIH0sXG4gIGdldFBhcnNlT2JqZWN0KCkge1xuICAgIHJldHVybiBjb25maWdbJ1BhcnNlT2JqZWN0J107XG4gIH0sXG4gIHNldFBhcnNlUXVlcnkocXVlcnkpIHtcbiAgICBjb25maWdbJ1BhcnNlUXVlcnknXSA9IHF1ZXJ5O1xuICB9LFxuICBnZXRQYXJzZVF1ZXJ5KCkge1xuICAgIHJldHVybiBjb25maWdbJ1BhcnNlUXVlcnknXTtcbiAgfSxcbiAgc2V0UGFyc2VSb2xlKHJvbGUpIHtcbiAgICBjb25maWdbJ1BhcnNlUm9sZSddID0gcm9sZTtcbiAgfSxcbiAgZ2V0UGFyc2VSb2xlKCkge1xuICAgIHJldHVybiBjb25maWdbJ1BhcnNlUm9sZSddO1xuICB9LFxuICBzZXRQYXJzZVVzZXIodXNlcikge1xuICAgIGNvbmZpZ1snUGFyc2VVc2VyJ10gPSB1c2VyO1xuICB9LFxuICBnZXRQYXJzZVVzZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUGFyc2VVc2VyJ107XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IENvcmVNYW5hZ2VyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gQ29yZU1hbmFnZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG5sZXQgQUVTO1xubGV0IEVOQztcbkFFUyA9IHJlcXVpcmUoJ2NyeXB0by1qcy9hZXMnKTtcbkVOQyA9IHJlcXVpcmUoJ2NyeXB0by1qcy9lbmMtdXRmOCcpO1xuY29uc3QgQ3J5cHRvQ29udHJvbGxlciA9IHtcbiAgZW5jcnlwdChvYmosIHNlY3JldEtleSkge1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IEFFUy5lbmNyeXB0KCgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKG9iaiksIHNlY3JldEtleSk7XG4gICAgcmV0dXJuIGVuY3J5cHRlZC50b1N0cmluZygpO1xuICB9LFxuICBkZWNyeXB0KGVuY3J5cHRlZFRleHQsIHNlY3JldEtleSkge1xuICAgIGNvbnN0IGRlY3J5cHRlZFN0ciA9IEFFUy5kZWNyeXB0KGVuY3J5cHRlZFRleHQsIHNlY3JldEtleSkudG9TdHJpbmcoRU5DKTtcbiAgICByZXR1cm4gZGVjcnlwdGVkU3RyO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDcnlwdG9Db250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gQ3J5cHRvQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vKipcbiAqIFRoaXMgaXMgYSBzaW1wbGUgd3JhcHBlciB0byB1bmlmeSBFdmVudEVtaXR0ZXIgaW1wbGVtZW50YXRpb25zIGFjcm9zcyBwbGF0Zm9ybXMuXG4gKi9cblxubGV0IEV2ZW50RW1pdHRlcjtcbnRyeSB7XG4gIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbn0gY2F0Y2ggKF8pIHtcbiAgLy8gRXZlbnRFbWl0dGVyIHVuYXZhaWxhYmxlXG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEV2ZW50RW1pdHRlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfc3BsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zcGxpY2VcIikpO1xudmFyIF9maW5kSW5kZXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmQtaW5kZXhcIikpO1xudmFyIF9zZXRJbnRlcnZhbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC1pbnRlcnZhbFwiKSk7XG52YXIgX2ZpbmQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmRcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBfUGFyc2VRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VRdWVyeVwiKSk7XG52YXIgX1N0b3JhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VcIikpO1xuY29uc3QgUVVFVUVfS0VZID0gJ1BhcnNlL0V2ZW50dWFsbHkvUXVldWUnO1xubGV0IHF1ZXVlQ2FjaGUgPSBbXTtcbmxldCBkaXJ0eUNhY2hlID0gdHJ1ZTtcbmxldCBwb2xsaW5nID0gdW5kZWZpbmVkO1xuXG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIHF1ZXVlIG9iamVjdHMgdGhhdCB3aWxsIGJlXG4gKiBzYXZlZCB0byB0aGUgc2VydmVyIGF0IGEgbGF0ZXIgZGF0ZS5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuRXZlbnR1YWxseVF1ZXVlXG4gKiBAc3RhdGljXG4gKi9cbmNvbnN0IEV2ZW50dWFsbHlRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIEFkZCBvYmplY3QgdG8gcXVldWUgd2l0aCBzYXZlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGZ1bmN0aW9uIHNhdmVcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLnNhdmVcbiAgICogQHBhcmFtIHtQYXJzZU9iamVjdH0gb2JqZWN0IFBhcnNlLk9iamVjdCB0byBiZSBzYXZlZCBldmVudHVhbGx5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbc2VydmVyT3B0aW9uc10gU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLk9iamVjdC5odG1sI3NhdmUgUGFyc2UuT2JqZWN0LnNhdmV9IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgaWYgb2JqZWN0IGlzIGFkZGVkIHRvIHF1ZXVlLlxuICAgKiBAc3RhdGljXG4gICAqIEBzZWUgUGFyc2UuT2JqZWN0I3NhdmVFdmVudHVhbGx5XG4gICAqL1xuICBzYXZlKG9iamVjdCkge1xuICAgIGxldCBzZXJ2ZXJPcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlKCdzYXZlJywgb2JqZWN0LCBzZXJ2ZXJPcHRpb25zKTtcbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBvYmplY3QgdG8gcXVldWUgd2l0aCBzYXZlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGRlc3Ryb3lcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLmRlc3Ryb3lcbiAgICogQHBhcmFtIHtQYXJzZU9iamVjdH0gb2JqZWN0IFBhcnNlLk9iamVjdCB0byBiZSBkZXN0cm95ZWQgZXZlbnR1YWxseVxuICAgKiBAcGFyYW0ge29iamVjdH0gW3NlcnZlck9wdGlvbnNdIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5PYmplY3QuaHRtbCNkZXN0cm95IFBhcnNlLk9iamVjdC5kZXN0cm95fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgaWYgb2JqZWN0IGlzIGFkZGVkIHRvIHF1ZXVlLlxuICAgKiBAc3RhdGljXG4gICAqIEBzZWUgUGFyc2UuT2JqZWN0I2Rlc3Ryb3lFdmVudHVhbGx5XG4gICAqL1xuICBkZXN0cm95KG9iamVjdCkge1xuICAgIGxldCBzZXJ2ZXJPcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlKCdkZXN0cm95Jywgb2JqZWN0LCBzZXJ2ZXJPcHRpb25zKTtcbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlIHVuaXF1ZSBpZGVudGlmaWVyIHRvIGF2b2lkIGR1cGxpY2F0ZXMgYW5kIG1haW50YWluIHByZXZpb3VzIHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIHNhdmUgLyBkZXN0cm95XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgUGFyc2UuT2JqZWN0IHRvIGJlIHF1ZXVlZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdlbmVyYXRlUXVldWVJZChhY3Rpb24sIG9iamVjdCkge1xuICAgIG9iamVjdC5fZ2V0SWQoKTtcbiAgICBjb25zdCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICBpZCxcbiAgICAgIF9sb2NhbElkXG4gICAgfSA9IG9iamVjdDtcbiAgICBjb25zdCB1bmlxdWVJZCA9IG9iamVjdC5nZXQoJ2hhc2gnKSB8fCBfbG9jYWxJZDtcbiAgICByZXR1cm4gW2FjdGlvbiwgY2xhc3NOYW1lLCBpZCwgdW5pcXVlSWRdLmpvaW4oJ18nKTtcbiAgfSxcbiAgLyoqXG4gICAqIEJ1aWxkIHF1ZXVlIG9iamVjdCBhbmQgYWRkIHRvIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIHNhdmUgLyBkZXN0cm95XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgUGFyc2UuT2JqZWN0IHRvIGJlIHF1ZXVlZFxuICAgKiBAcGFyYW0ge29iamVjdH0gW3NlcnZlck9wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgaWYgb2JqZWN0IGlzIGFkZGVkIHRvIHF1ZXVlLlxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGFzeW5jIGVucXVldWUoYWN0aW9uLCBvYmplY3QsIHNlcnZlck9wdGlvbnMpIHtcbiAgICBjb25zdCBxdWV1ZURhdGEgPSBhd2FpdCB0aGlzLmdldFF1ZXVlKCk7XG4gICAgY29uc3QgcXVldWVJZCA9IHRoaXMuZ2VuZXJhdGVRdWV1ZUlkKGFjdGlvbiwgb2JqZWN0KTtcbiAgICBsZXQgaW5kZXggPSB0aGlzLnF1ZXVlSXRlbUV4aXN0cyhxdWV1ZURhdGEsIHF1ZXVlSWQpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAvLyBBZGQgY2FjaGVkIHZhbHVlcyB0byBuZXcgb2JqZWN0IGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBxdWV1ZURhdGFbaW5kZXhdLm9iamVjdCkge1xuICAgICAgICBpZiAodHlwZW9mIG9iamVjdC5nZXQocHJvcCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgb2JqZWN0LnNldChwcm9wLCBxdWV1ZURhdGFbaW5kZXhdLm9iamVjdFtwcm9wXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXggPSBxdWV1ZURhdGEubGVuZ3RoO1xuICAgIH1cbiAgICBxdWV1ZURhdGFbaW5kZXhdID0ge1xuICAgICAgcXVldWVJZCxcbiAgICAgIGFjdGlvbixcbiAgICAgIG9iamVjdDogb2JqZWN0LnRvSlNPTigpLFxuICAgICAgc2VydmVyT3B0aW9ucyxcbiAgICAgIGlkOiBvYmplY3QuaWQsXG4gICAgICBjbGFzc05hbWU6IG9iamVjdC5jbGFzc05hbWUsXG4gICAgICBoYXNoOiBvYmplY3QuZ2V0KCdoYXNoJyksXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKClcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNldFF1ZXVlKHF1ZXVlRGF0YSk7XG4gIH0sXG4gIHN0b3JlKGRhdGEpIHtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMoUVVFVUVfS0VZLCAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShkYXRhKSk7XG4gIH0sXG4gIGxvYWQoKSB7XG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKFFVRVVFX0tFWSk7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbi1tZW1vcnkgcXVldWUgZnJvbSBsb2NhbCBzdG9yYWdlIGFuZCByZXR1cm5zLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0UXVldWVcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLmdldFF1ZXVlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFF1ZXVlT2JqZWN0W10+fVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBhc3luYyBnZXRRdWV1ZSgpIHtcbiAgICBpZiAoZGlydHlDYWNoZSkge1xuICAgICAgcXVldWVDYWNoZSA9IEpTT04ucGFyc2UoKGF3YWl0IHRoaXMubG9hZCgpKSB8fCAnW10nKTtcbiAgICAgIGRpcnR5Q2FjaGUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXVlQ2FjaGU7XG4gIH0sXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgcXVldWUgdG8gbG9jYWwgc3RvcmFnZVxuICAgKlxuICAgKiBAcGFyYW0ge1F1ZXVlfSBxdWV1ZSBRdWV1ZSBjb250YWluaW5nIFBhcnNlLk9iamVjdCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gcXVldWUgaXMgc3RvcmVkLlxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHNldFF1ZXVlKHF1ZXVlKSB7XG4gICAgcXVldWVDYWNoZSA9IHF1ZXVlO1xuICAgIHJldHVybiB0aGlzLnN0b3JlKHF1ZXVlQ2FjaGUpO1xuICB9LFxuICAvKipcbiAgICogUmVtb3ZlcyBQYXJzZS5PYmplY3QgZGF0YSBmcm9tIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVldWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgUGFyc2UuT2JqZWN0IGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBxdWV1ZSBpcyBzdG9yZWQuXG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlKHF1ZXVlSWQpIHtcbiAgICBjb25zdCBxdWV1ZURhdGEgPSBhd2FpdCB0aGlzLmdldFF1ZXVlKCk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnF1ZXVlSXRlbUV4aXN0cyhxdWV1ZURhdGEsIHF1ZXVlSWQpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAoMCwgX3NwbGljZS5kZWZhdWx0KShxdWV1ZURhdGEpLmNhbGwocXVldWVEYXRhLCBpbmRleCwgMSk7XG4gICAgICBhd2FpdCB0aGlzLnNldFF1ZXVlKHF1ZXVlRGF0YSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIHF1ZXVlLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gY2xlYXJcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLmNsZWFyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBxdWV1ZSBpcyBjbGVhcmVkLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBxdWV1ZUNhY2hlID0gW107XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUoW10pO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbmRleCBvZiBhIHF1ZXVlSWQgaW4gdGhlIHF1ZXVlLiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC5cbiAgICpcbiAgICogQHBhcmFtIHtRdWV1ZX0gcXVldWUgUXVldWUgY29udGFpbmluZyBQYXJzZS5PYmplY3QgZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIFBhcnNlLk9iamVjdCBkYXRhLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHF1ZXVlSXRlbUV4aXN0cyhxdWV1ZSwgcXVldWVJZCkge1xuICAgIHJldHVybiAoMCwgX2ZpbmRJbmRleC5kZWZhdWx0KShxdWV1ZSkuY2FsbChxdWV1ZSwgZGF0YSA9PiBkYXRhLnF1ZXVlSWQgPT09IHF1ZXVlSWQpO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgcXVldWUuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBsZW5ndGhcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLmxlbmd0aFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBhc3luYyBsZW5ndGgoKSB7XG4gICAgY29uc3QgcXVldWVEYXRhID0gYXdhaXQgdGhpcy5nZXRRdWV1ZSgpO1xuICAgIHJldHVybiBxdWV1ZURhdGEubGVuZ3RoO1xuICB9LFxuICAvKipcbiAgICogU2VuZHMgdGhlIHF1ZXVlIHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBzZW5kUXVldWVcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLnNlbmRRdWV1ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gUmV0dXJucyB0cnVlIGlmIHF1ZXVlIHdhcyBzZW50IHN1Y2Nlc3NmdWxseS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgYXN5bmMgc2VuZFF1ZXVlKCkge1xuICAgIGNvbnN0IHF1ZXVlID0gYXdhaXQgdGhpcy5nZXRRdWV1ZSgpO1xuICAgIGNvbnN0IHF1ZXVlRGF0YSA9IFsuLi5xdWV1ZV07XG4gICAgaWYgKHF1ZXVlRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZURhdGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHF1ZXVlT2JqZWN0ID0gcXVldWVEYXRhW2ldO1xuICAgICAgY29uc3Qge1xuICAgICAgICBpZCxcbiAgICAgICAgaGFzaCxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICB9ID0gcXVldWVPYmplY3Q7XG4gICAgICBjb25zdCBPYmplY3RUeXBlID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZXh0ZW5kKGNsYXNzTmFtZSk7XG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzLmJ5SWQoT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpO1xuICAgICAgfSBlbHNlIGlmIChoYXNoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzcy5ieUhhc2goT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzLmNyZWF0ZShPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogQnVpbGQgcXVldWUgb2JqZWN0IGFuZCBhZGQgdG8gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2VPYmplY3R9IG9iamVjdCBQYXJzZS5PYmplY3QgdG8gYmUgcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7UXVldWVPYmplY3R9IHF1ZXVlT2JqZWN0IFBhcnNlLk9iamVjdCBkYXRhIGZyb20gdGhlIHF1ZXVlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLlxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGFzeW5jIHNlbmRRdWV1ZUNhbGxiYWNrKG9iamVjdCwgcXVldWVPYmplY3QpIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHF1ZXVlT2JqZWN0LmFjdGlvbikge1xuICAgICAgY2FzZSAnc2F2ZSc6XG4gICAgICAgIC8vIFF1ZXVlZCB1cGRhdGUgd2FzIG92ZXJ3cml0dGVuIGJ5IG90aGVyIHJlcXVlc3QuIERvIG5vdCBzYXZlXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0LnVwZGF0ZWRBdCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqZWN0LnVwZGF0ZWRBdCA+IG5ldyBEYXRlKHF1ZXVlT2JqZWN0Lm9iamVjdC5jcmVhdGVkQXQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb2JqZWN0LnNhdmUocXVldWVPYmplY3Qub2JqZWN0LCBxdWV1ZU9iamVjdC5zZXJ2ZXJPcHRpb25zKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZShxdWV1ZU9iamVjdC5xdWV1ZUlkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlLmNvZGUgIT09IF9QYXJzZUVycm9yLmRlZmF1bHQuQ09OTkVDVElPTl9GQUlMRUQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rlc3Ryb3knOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9iamVjdC5kZXN0cm95KHF1ZXVlT2JqZWN0LnNlcnZlck9wdGlvbnMpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUuY29kZSAhPT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5DT05ORUNUSU9OX0ZBSUxFRCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFN0YXJ0IHBvbGxpbmcgc2VydmVyIGZvciBuZXR3b3JrIGNvbm5lY3Rpb24uXG4gICAqIFdpbGwgc2VuZCBxdWV1ZSBpZiBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gcG9sbFxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUucG9sbFxuICAgKiBAcGFyYW0gW21zXSBNaWxsaXNlY29uZHMgdG8gcGluZyB0aGUgc2VydmVyLiBEZWZhdWx0IDIwMDBtc1xuICAgKiBAc3RhdGljXG4gICAqL1xuICBwb2xsKCkge1xuICAgIGxldCBtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMjAwMDtcbiAgICBpZiAocG9sbGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwb2xsaW5nID0gKDAsIF9zZXRJbnRlcnZhbDIuZGVmYXVsdCkoKCkgPT4ge1xuICAgICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgICAgUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2hlYWx0aCcpLnRoZW4oX3JlZiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgc3RhdHVzXG4gICAgICAgIH0gPSBfcmVmO1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnb2snKSB7XG4gICAgICAgICAgdGhpcy5zdG9wUG9sbCgpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICB9KS5jYXRjaChlID0+IGUpO1xuICAgIH0sIG1zKTtcbiAgfSxcbiAgLyoqXG4gICAqIFR1cm5zIG9mZiBwb2xsaW5nLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gc3RvcFBvbGxcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLnN0b3BQb2xsXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0b3BQb2xsKCkge1xuICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZyk7XG4gICAgcG9sbGluZyA9IHVuZGVmaW5lZDtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybiB0cnVlIGlmIHBpbmdpbmcgdGhlIHNlcnZlci5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGlzUG9sbGluZ1xuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuaXNQb2xsaW5nXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBpc1BvbGxpbmcoKSB7XG4gICAgcmV0dXJuICEhcG9sbGluZztcbiAgfSxcbiAgX3NldFBvbGxpbmcoZmxhZykge1xuICAgIHBvbGxpbmcgPSBmbGFnO1xuICB9LFxuICBwcm9jZXNzOiB7XG4gICAgY3JlYXRlKE9iamVjdFR5cGUsIHF1ZXVlT2JqZWN0KSB7XG4gICAgICBjb25zdCBvYmplY3QgPSBuZXcgT2JqZWN0VHlwZSgpO1xuICAgICAgcmV0dXJuIEV2ZW50dWFsbHlRdWV1ZS5zZW5kUXVldWVDYWxsYmFjayhvYmplY3QsIHF1ZXVlT2JqZWN0KTtcbiAgICB9LFxuICAgIGFzeW5jIGJ5SWQoT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2Vzc2lvblRva2VuXG4gICAgICB9ID0gcXVldWVPYmplY3Quc2VydmVyT3B0aW9ucztcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IF9QYXJzZVF1ZXJ5LmRlZmF1bHQoT2JqZWN0VHlwZSk7XG4gICAgICBxdWVyeS5lcXVhbFRvKCdvYmplY3RJZCcsIHF1ZXVlT2JqZWN0LmlkKTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCAoMCwgX2ZpbmQuZGVmYXVsdCkocXVlcnkpLmNhbGwocXVlcnksIHtcbiAgICAgICAgc2Vzc2lvblRva2VuXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBFdmVudHVhbGx5UXVldWUuc2VuZFF1ZXVlQ2FsbGJhY2socmVzdWx0c1swXSwgcXVldWVPYmplY3QpO1xuICAgIH0sXG4gICAgYXN5bmMgYnlIYXNoKE9iamVjdFR5cGUsIHF1ZXVlT2JqZWN0KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNlc3Npb25Ub2tlblxuICAgICAgfSA9IHF1ZXVlT2JqZWN0LnNlcnZlck9wdGlvbnM7XG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBfUGFyc2VRdWVyeS5kZWZhdWx0KE9iamVjdFR5cGUpO1xuICAgICAgcXVlcnkuZXF1YWxUbygnaGFzaCcsIHF1ZXVlT2JqZWN0Lmhhc2gpO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0ICgwLCBfZmluZC5kZWZhdWx0KShxdWVyeSkuY2FsbChxdWVyeSwge1xuICAgICAgICBzZXNzaW9uVG9rZW5cbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gRXZlbnR1YWxseVF1ZXVlLnNlbmRRdWV1ZUNhbGxiYWNrKHJlc3VsdHNbMF0sIHF1ZXVlT2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBFdmVudHVhbGx5UXVldWUucHJvY2Vzcy5jcmVhdGUoT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpO1xuICAgIH1cbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gRXZlbnR1YWxseVF1ZXVlO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gRXZlbnR1YWxseVF1ZXVlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX1BhcnNlVXNlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VVc2VyXCIpKTtcbi8qIGdsb2JhbCBGQiAqL1xuXG5sZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbmxldCByZXF1ZXN0ZWRQZXJtaXNzaW9ucztcbmxldCBpbml0T3B0aW9ucztcbmNvbnN0IHByb3ZpZGVyID0ge1xuICBhdXRoZW50aWNhdGUob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgRkIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRpb25zLmVycm9yKHRoaXMsICdGYWNlYm9vayBTREsgbm90IGZvdW5kLicpO1xuICAgIH1cbiAgICBGQi5sb2dpbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UuYXV0aFJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBvcHRpb25zLnN1Y2Nlc3ModGhpcywge1xuICAgICAgICAgICAgaWQ6IHJlc3BvbnNlLmF1dGhSZXNwb25zZS51c2VySUQsXG4gICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHJlc3BvbnNlLmF1dGhSZXNwb25zZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIGV4cGlyYXRpb25fZGF0ZTogbmV3IERhdGUocmVzcG9uc2UuYXV0aFJlc3BvbnNlLmV4cGlyZXNJbiAqIDEwMDAgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSkudG9KU09OKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3IpIHtcbiAgICAgICAgICBvcHRpb25zLmVycm9yKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIHNjb3BlOiByZXF1ZXN0ZWRQZXJtaXNzaW9uc1xuICAgIH0pO1xuICB9LFxuICByZXN0b3JlQXV0aGVudGljYXRpb24oYXV0aERhdGEpIHtcbiAgICBpZiAoYXV0aERhdGEpIHtcbiAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7fTtcbiAgICAgIGlmIChpbml0T3B0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBpbml0T3B0aW9ucykge1xuICAgICAgICAgIG5ld09wdGlvbnNba2V5XSA9IGluaXRPcHRpb25zW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFN1cHByZXNzIGNoZWNrcyBmb3IgbG9naW4gc3RhdHVzIGZyb20gdGhlIGJyb3dzZXIuXG4gICAgICBuZXdPcHRpb25zLnN0YXR1cyA9IGZhbHNlO1xuXG4gICAgICAvLyBJZiB0aGUgdXNlciBkb2Vzbid0IG1hdGNoIHRoZSBvbmUga25vd24gYnkgdGhlIEZCIFNESywgbG9nIG91dC5cbiAgICAgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSB1c2VycyB3aWxsIG1hdGNoIC0tIGl0J3Mgb25seSBpbiBjYXNlcyB3aGVyZVxuICAgICAgLy8gdGhlIEZCIFNESyBrbm93cyBvZiBhIGRpZmZlcmVudCB1c2VyIHRoYW4gdGhlIG9uZSBiZWluZyByZXN0b3JlZFxuICAgICAgLy8gZnJvbSBhIFBhcnNlIFVzZXIgdGhhdCBsb2dnZWQgaW4gd2l0aCB1c2VybmFtZS9wYXNzd29yZC5cbiAgICAgIGNvbnN0IGV4aXN0aW5nUmVzcG9uc2UgPSBGQi5nZXRBdXRoUmVzcG9uc2UoKTtcbiAgICAgIGlmIChleGlzdGluZ1Jlc3BvbnNlICYmIGV4aXN0aW5nUmVzcG9uc2UudXNlcklEICE9PSBhdXRoRGF0YS5pZCkge1xuICAgICAgICBGQi5sb2dvdXQoKTtcbiAgICAgIH1cbiAgICAgIEZCLmluaXQobmV3T3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBnZXRBdXRoVHlwZSgpIHtcbiAgICByZXR1cm4gJ2ZhY2Vib29rJztcbiAgfSxcbiAgZGVhdXRoZW50aWNhdGUoKSB7XG4gICAgdGhpcy5yZXN0b3JlQXV0aGVudGljYXRpb24obnVsbCk7XG4gIH1cbn07XG5cbi8qKlxuICogUHJvdmlkZXMgYSBzZXQgb2YgdXRpbGl0aWVzIGZvciB1c2luZyBQYXJzZSB3aXRoIEZhY2Vib29rLlxuICpcbiAqIEBjbGFzcyBQYXJzZS5GYWNlYm9va1V0aWxzXG4gKiBAc3RhdGljXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cbmNvbnN0IEZhY2Vib29rVXRpbHMgPSB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBQYXJzZSBGYWNlYm9vayBpbnRlZ3JhdGlvbi4gIENhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciB5b3VcbiAgICogaGF2ZSBsb2FkZWQgdGhlIEZhY2Vib29rIEphdmFzY3JpcHQgU0RLIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVyc1xuICAgKiBhcyB5b3Ugd291bGQgcGFzcyB0bzxjb2RlPlxuICAgKiA8YSBocmVmPVxuICAgKiBcImh0dHBzOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9GQi5pbml0L1wiPlxuICAgKiBGQi5pbml0KCk8L2E+PC9jb2RlPi4gIFBhcnNlLkZhY2Vib29rVXRpbHMgd2lsbCBpbnZva2UgRkIuaW5pdCgpIGZvciB5b3VcbiAgICogd2l0aCB0aGVzZSBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBpbml0XG4gICAqIEBuYW1lIFBhcnNlLkZhY2Vib29rVXRpbHMuaW5pdFxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBGYWNlYm9vayBvcHRpb25zIGFyZ3VtZW50IGFzIGRlc2NyaWJlZCBoZXJlOlxuICAgKiAgIDxhIGhyZWY9XG4gICAqICAgXCJodHRwczovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvRkIuaW5pdC9cIj5cbiAgICogICBGQi5pbml0KCk8L2E+LiBUaGUgc3RhdHVzIGZsYWcgd2lsbCBiZSBjb2VyY2VkIHRvICdmYWxzZScgYmVjYXVzZSBpdFxuICAgKiAgIGludGVyZmVyZXMgd2l0aCBQYXJzZSBGYWNlYm9vayBpbnRlZ3JhdGlvbi4gQ2FsbCBGQi5nZXRMb2dpblN0YXR1cygpXG4gICAqICAgZXhwbGljaXRseSBpZiB0aGlzIGJlaGF2aW9yIGlzIHJlcXVpcmVkIGJ5IHlvdXIgYXBwbGljYXRpb24uXG4gICAqL1xuICBpbml0KG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIEZCID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgRmFjZWJvb2sgSmF2YVNjcmlwdCBTREsgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIGNhbGxpbmcgaW5pdC4nKTtcbiAgICB9XG4gICAgaW5pdE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgICBpbml0T3B0aW9uc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5pdE9wdGlvbnMuc3RhdHVzICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3Qgd2FybiA9IGNvbnNvbGUud2FybiB8fCBjb25zb2xlLmxvZyB8fCBmdW5jdGlvbiAoKSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICB3YXJuLmNhbGwoY29uc29sZSwgJ1RoZSBcInN0YXR1c1wiIGZsYWcgcGFzc2VkIGludG8nICsgJyBGQi5pbml0LCB3aGVuIHNldCB0byB0cnVlLCBjYW4gaW50ZXJmZXJlIHdpdGggUGFyc2UgRmFjZWJvb2snICsgJyBpbnRlZ3JhdGlvbiwgc28gaXQgaGFzIGJlZW4gc3VwcHJlc3NlZC4gUGxlYXNlIGNhbGwnICsgJyBGQi5nZXRMb2dpblN0YXR1cygpIGV4cGxpY2l0bHkgaWYgeW91IHJlcXVpcmUgdGhpcyBiZWhhdmlvci4nKTtcbiAgICB9XG4gICAgaW5pdE9wdGlvbnMuc3RhdHVzID0gZmFsc2U7XG4gICAgRkIuaW5pdChpbml0T3B0aW9ucyk7XG4gICAgX1BhcnNlVXNlci5kZWZhdWx0Ll9yZWdpc3RlckF1dGhlbnRpY2F0aW9uUHJvdmlkZXIocHJvdmlkZXIpO1xuICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgdXNlciBoYXMgdGhlaXIgYWNjb3VudCBsaW5rZWQgdG8gRmFjZWJvb2suXG4gICAqXG4gICAqIEBmdW5jdGlvbiBpc0xpbmtlZFxuICAgKiBAbmFtZSBQYXJzZS5GYWNlYm9va1V0aWxzLmlzTGlua2VkXG4gICAqIEBwYXJhbSB7UGFyc2UuVXNlcn0gdXNlciBVc2VyIHRvIGNoZWNrIGZvciBhIGZhY2Vib29rIGxpbmsuXG4gICAqICAgICBUaGUgdXNlciBtdXN0IGJlIGxvZ2dlZCBpbiBvbiB0aGlzIGRldmljZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIGhhcyB0aGVpciBhY2NvdW50XG4gICAqICAgICBsaW5rZWQgdG8gRmFjZWJvb2suXG4gICAqL1xuICBpc0xpbmtlZCh1c2VyKSB7XG4gICAgcmV0dXJuIHVzZXIuX2lzTGlua2VkKCdmYWNlYm9vaycpO1xuICB9LFxuICAvKipcbiAgICogTG9ncyBpbiBhIHVzZXIgdXNpbmcgRmFjZWJvb2suIFRoaXMgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGUgRmFjZWJvb2tcbiAgICogU0RLIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciwgYW5kIHRoZW4gYXV0b21hdGljYWxseSBsb2dzIGluIChvclxuICAgKiBjcmVhdGVzLCBpbiB0aGUgY2FzZSB3aGVyZSBpdCBpcyBhIG5ldyB1c2VyKSBhIFBhcnNlLlVzZXIuXG4gICAqXG4gICAqIFN0YW5kYXJkIEFQSTpcbiAgICpcbiAgICogPGNvZGU+bG9nSW4ocGVybWlzc2lvbjogc3RyaW5nLCBhdXRoRGF0YTogT2JqZWN0KTs8L2NvZGU+XG4gICAqXG4gICAqIEFkdmFuY2VkIEFQSTogVXNlZCBmb3IgaGFuZGxpbmcgeW91ciBvd24gb0F1dGggdG9rZW5zXG4gICAqIHtAbGluayBodHRwczovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvcmVzdC9ndWlkZS8jbGlua2luZy11c2Vyc31cbiAgICpcbiAgICogPGNvZGU+bG9nSW4oYXV0aERhdGE6IE9iamVjdCwgb3B0aW9ucz86IE9iamVjdCk7PC9jb2RlPlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbG9nSW5cbiAgICogQG5hbWUgUGFyc2UuRmFjZWJvb2tVdGlscy5sb2dJblxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBvYmplY3QpfSBwZXJtaXNzaW9ucyBUaGUgcGVybWlzc2lvbnMgcmVxdWlyZWQgZm9yIEZhY2Vib29rXG4gICAqICAgIGxvZyBpbi4gIFRoaXMgaXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIG9mIHBlcm1pc3Npb25zLlxuICAgKiAgICBBbHRlcm5hdGl2ZWx5LCBzdXBwbHkgYSBGYWNlYm9vayBhdXRoRGF0YSBvYmplY3QgYXMgZGVzY3JpYmVkIGluIG91clxuICAgKiAgICBSRVNUIEFQSSBkb2NzIGlmIHlvdSB3YW50IHRvIGhhbmRsZSBnZXR0aW5nIGZhY2Vib29rIGF1dGggdG9rZW5zXG4gICAqICAgIHlvdXJzZWxmLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBNYXN0ZXJLZXkgLyBTZXNzaW9uVG9rZW4uIEFsdGVybmF0aXZlbHkgY2FuIGJlIHVzZWQgZm9yIGF1dGhEYXRhIGlmIHBlcm1pc3Npb25zIGlzIGEgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgbG9nSW4ocGVybWlzc2lvbnMsIG9wdGlvbnMpIHtcbiAgICBpZiAoIXBlcm1pc3Npb25zIHx8IHR5cGVvZiBwZXJtaXNzaW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBpbml0aWFsaXplIEZhY2Vib29rVXRpbHMgYmVmb3JlIGNhbGxpbmcgbG9nSW4uJyk7XG4gICAgICB9XG4gICAgICByZXF1ZXN0ZWRQZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xuICAgICAgcmV0dXJuIF9QYXJzZVVzZXIuZGVmYXVsdC5sb2dJbldpdGgoJ2ZhY2Vib29rJywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBfUGFyc2VVc2VyLmRlZmF1bHQubG9nSW5XaXRoKCdmYWNlYm9vaycsIHtcbiAgICAgIGF1dGhEYXRhOiBwZXJtaXNzaW9uc1xuICAgIH0sIG9wdGlvbnMpO1xuICB9LFxuICAvKipcbiAgICogTGlua3MgRmFjZWJvb2sgdG8gYW4gZXhpc3RpbmcgUEZVc2VyLiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlXG4gICAqIEZhY2Vib29rIFNESyB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIsIGFuZCB0aGVuIGF1dG9tYXRpY2FsbHkgbGlua3NcbiAgICogdGhlIGFjY291bnQgdG8gdGhlIFBhcnNlLlVzZXIuXG4gICAqXG4gICAqIFN0YW5kYXJkIEFQSTpcbiAgICpcbiAgICogPGNvZGU+bGluayh1c2VyOiBQYXJzZS5Vc2VyLCBwZXJtaXNzaW9uOiBzdHJpbmcsIGF1dGhEYXRhPzogT2JqZWN0KTs8L2NvZGU+XG4gICAqXG4gICAqIEFkdmFuY2VkIEFQSTogVXNlZCBmb3IgaGFuZGxpbmcgeW91ciBvd24gb0F1dGggdG9rZW5zXG4gICAqIHtAbGluayBodHRwczovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvcmVzdC9ndWlkZS8jbGlua2luZy11c2Vyc31cbiAgICpcbiAgICogPGNvZGU+bGluayh1c2VyOiBQYXJzZS5Vc2VyLCBhdXRoRGF0YTogT2JqZWN0LCBvcHRpb25zPzogRnVsbE9wdGlvbnMpOzwvY29kZT5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGxpbmtcbiAgICogQG5hbWUgUGFyc2UuRmFjZWJvb2tVdGlscy5saW5rXG4gICAqIEBwYXJhbSB7UGFyc2UuVXNlcn0gdXNlciBVc2VyIHRvIGxpbmsgdG8gRmFjZWJvb2suIFRoaXMgbXVzdCBiZSB0aGVcbiAgICogICAgIGN1cnJlbnQgdXNlci5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgb2JqZWN0KX0gcGVybWlzc2lvbnMgVGhlIHBlcm1pc3Npb25zIHJlcXVpcmVkIGZvciBGYWNlYm9va1xuICAgKiAgICBsb2cgaW4uICBUaGlzIGlzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyBvZiBwZXJtaXNzaW9ucy5cbiAgICogICAgQWx0ZXJuYXRpdmVseSwgc3VwcGx5IGEgRmFjZWJvb2sgYXV0aERhdGEgb2JqZWN0IGFzIGRlc2NyaWJlZCBpbiBvdXJcbiAgICogICAgUkVTVCBBUEkgZG9jcyBpZiB5b3Ugd2FudCB0byBoYW5kbGUgZ2V0dGluZyBmYWNlYm9vayBhdXRoIHRva2Vuc1xuICAgKiAgICB5b3Vyc2VsZi5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgTWFzdGVyS2V5IC8gU2Vzc2lvblRva2VuLiBBbHRlcm5hdGl2ZWx5IGNhbiBiZSB1c2VkIGZvciBhdXRoRGF0YSBpZiBwZXJtaXNzaW9ucyBpcyBhIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIGxpbmsodXNlciwgcGVybWlzc2lvbnMsIG9wdGlvbnMpIHtcbiAgICBpZiAoIXBlcm1pc3Npb25zIHx8IHR5cGVvZiBwZXJtaXNzaW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBpbml0aWFsaXplIEZhY2Vib29rVXRpbHMgYmVmb3JlIGNhbGxpbmcgbGluay4nKTtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3RlZFBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7XG4gICAgICByZXR1cm4gdXNlci5saW5rV2l0aCgnZmFjZWJvb2snLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXIubGlua1dpdGgoJ2ZhY2Vib29rJywge1xuICAgICAgYXV0aERhdGE6IHBlcm1pc3Npb25zXG4gICAgfSwgb3B0aW9ucyk7XG4gIH0sXG4gIC8qKlxuICAgKiBVbmxpbmtzIHRoZSBQYXJzZS5Vc2VyIGZyb20gYSBGYWNlYm9vayBhY2NvdW50LlxuICAgKlxuICAgKiBAZnVuY3Rpb24gdW5saW5rXG4gICAqIEBuYW1lIFBhcnNlLkZhY2Vib29rVXRpbHMudW5saW5rXG4gICAqIEBwYXJhbSB7UGFyc2UuVXNlcn0gdXNlciBVc2VyIHRvIHVubGluayBmcm9tIEZhY2Vib29rLiBUaGlzIG11c3QgYmUgdGhlXG4gICAqICAgICBjdXJyZW50IHVzZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFN0YW5kYXJkIG9wdGlvbnMgb2JqZWN0IHdpdGggc3VjY2VzcyBhbmQgZXJyb3JcbiAgICogICAgY2FsbGJhY2tzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHVubGluazogZnVuY3Rpb24gKHVzZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAoIWluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IGluaXRpYWxpemUgRmFjZWJvb2tVdGlscyBiZWZvcmUgY2FsbGluZyB1bmxpbmsuJyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyLl91bmxpbmtGcm9tKCdmYWNlYm9vaycsIG9wdGlvbnMpO1xuICB9LFxuICAvLyBVc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzXG4gIF9nZXRBdXRoUHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHByb3ZpZGVyO1xuICB9XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gRmFjZWJvb2tVdGlsczsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9rZXlzSW5zdGFuY2VQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2tleXNcIik7XG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaWRiS2V5dmFsID0gcmVxdWlyZShcImlkYi1rZXl2YWxcIik7XG4vKiBnbG9iYWwgd2luZG93ICovXG5cbmxldCBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlcjtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaW5kZXhlZERCKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgUGFyc2VTdG9yZSA9ICgwLCBfaWRiS2V5dmFsLmNyZWF0ZVN0b3JlKSgncGFyc2VEQicsICdwYXJzZVN0b3JlJyk7XG4gICAgSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIgPSB7XG4gICAgICBhc3luYzogMSxcbiAgICAgIGdldEl0ZW1Bc3luYyhwYXRoKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2lkYktleXZhbC5nZXQpKHBhdGgsIFBhcnNlU3RvcmUpO1xuICAgICAgfSxcbiAgICAgIHNldEl0ZW1Bc3luYyhwYXRoLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKDAsIF9pZGJLZXl2YWwuc2V0KShwYXRoLCB2YWx1ZSwgUGFyc2VTdG9yZSk7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlSXRlbUFzeW5jKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaWRiS2V5dmFsLmRlbCkocGF0aCwgUGFyc2VTdG9yZSk7XG4gICAgICB9LFxuICAgICAgZ2V0QWxsS2V5c0FzeW5jKCkge1xuICAgICAgICByZXR1cm4gKDAsIF9rZXlzSW5zdGFuY2VQcm9wZXJ0eShfaWRiS2V5dmFsKSkoUGFyc2VTdG9yZSk7XG4gICAgICB9LFxuICAgICAgY2xlYXIoKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2lkYktleXZhbC5jbGVhcikoUGFyc2VTdG9yZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSBjYXRjaCAoXykge1xuICAgIC8vIEluZGV4ZWREQiBub3QgYWNjZXNzaWJsZVxuICAgIEluZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyID0gdW5kZWZpbmVkO1xuICB9XG59IGVsc2Uge1xuICAvLyBJbmRleGVkREIgbm90IHN1cHBvcnRlZFxuICBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG52YXIgX1BhcnNlSW5zdGFsbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUluc3RhbGxhdGlvblwiKSk7XG52YXIgX3V1aWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V1aWRcIikpO1xuY29uc3QgQ1VSUkVOVF9JTlNUQUxMQVRJT05fS0VZID0gJ2N1cnJlbnRJbnN0YWxsYXRpb24nO1xuY29uc3QgQ1VSUkVOVF9JTlNUQUxMQVRJT05fSURfS0VZID0gJ2N1cnJlbnRJbnN0YWxsYXRpb25JZCc7XG5sZXQgaWlkQ2FjaGUgPSBudWxsO1xubGV0IGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZSA9IG51bGw7XG5sZXQgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlTWF0Y2hlc0Rpc2sgPSBmYWxzZTtcbmNvbnN0IEluc3RhbGxhdGlvbkNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jIHVwZGF0ZUluc3RhbGxhdGlvbk9uRGlzayhpbnN0YWxsYXRpb24pIHtcbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9JTlNUQUxMQVRJT05fS0VZKTtcbiAgICBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhwYXRoLCAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShpbnN0YWxsYXRpb24udG9KU09OKCkpKTtcbiAgICB0aGlzLl9zZXRDdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUoaW5zdGFsbGF0aW9uKTtcbiAgfSxcbiAgYXN5bmMgY3VycmVudEluc3RhbGxhdGlvbklkKCkge1xuICAgIGlmICh0eXBlb2YgaWlkQ2FjaGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gaWlkQ2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX0lOU1RBTExBVElPTl9JRF9LRVkpO1xuICAgIGxldCBpaWQgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhwYXRoKTtcbiAgICBpZiAoIWlpZCkge1xuICAgICAgaWlkID0gKDAsIF91dWlkLmRlZmF1bHQpKCk7XG4gICAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMocGF0aCwgaWlkKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWlkQ2FjaGUgPSBpaWQ7XG4gICAgICAgIHJldHVybiBpaWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWlkQ2FjaGUgPSBpaWQ7XG4gICAgcmV0dXJuIGlpZDtcbiAgfSxcbiAgYXN5bmMgY3VycmVudEluc3RhbGxhdGlvbigpIHtcbiAgICBpZiAoY3VycmVudEluc3RhbGxhdGlvbkNhY2hlKSB7XG4gICAgICByZXR1cm4gY3VycmVudEluc3RhbGxhdGlvbkNhY2hlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEluc3RhbGxhdGlvbkNhY2hlTWF0Y2hlc0Rpc2spIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9JTlNUQUxMQVRJT05fS0VZKTtcbiAgICBsZXQgaW5zdGFsbGF0aW9uRGF0YSA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKHBhdGgpO1xuICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZU1hdGNoZXNEaXNrID0gdHJ1ZTtcbiAgICBpZiAoaW5zdGFsbGF0aW9uRGF0YSkge1xuICAgICAgaW5zdGFsbGF0aW9uRGF0YSA9IEpTT04ucGFyc2UoaW5zdGFsbGF0aW9uRGF0YSk7XG4gICAgICBpbnN0YWxsYXRpb25EYXRhLmNsYXNzTmFtZSA9ICdfSW5zdGFsbGF0aW9uJztcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBfUGFyc2VJbnN0YWxsYXRpb24uZGVmYXVsdC5mcm9tSlNPTihpbnN0YWxsYXRpb25EYXRhKTtcbiAgICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZSA9IGN1cnJlbnQ7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFsbGF0aW9uSWQgPSBhd2FpdCB0aGlzLmN1cnJlbnRJbnN0YWxsYXRpb25JZCgpO1xuICAgIGNvbnN0IGluc3RhbGxhdGlvbiA9IG5ldyBfUGFyc2VJbnN0YWxsYXRpb24uZGVmYXVsdCgpO1xuICAgIGluc3RhbGxhdGlvbi5zZXQoJ2RldmljZVR5cGUnLCBfUGFyc2VJbnN0YWxsYXRpb24uZGVmYXVsdC5ERVZJQ0VfVFlQRVMuV0VCKTtcbiAgICBpbnN0YWxsYXRpb24uc2V0KCdpbnN0YWxsYXRpb25JZCcsIGluc3RhbGxhdGlvbklkKTtcbiAgICBpbnN0YWxsYXRpb24uc2V0KCdwYXJzZVZlcnNpb24nLCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1ZFUlNJT04nKSk7XG4gICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlID0gaW5zdGFsbGF0aW9uO1xuICAgIGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuc2V0SXRlbUFzeW5jKHBhdGgsICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGluc3RhbGxhdGlvbi50b0pTT04oKSkpO1xuICAgIHJldHVybiBpbnN0YWxsYXRpb247XG4gIH0sXG4gIF9jbGVhckNhY2hlKCkge1xuICAgIGlpZENhY2hlID0gbnVsbDtcbiAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUgPSBudWxsO1xuICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZU1hdGNoZXNEaXNrID0gZmFsc2U7XG4gIH0sXG4gIF9zZXRJbnN0YWxsYXRpb25JZENhY2hlKGlpZCkge1xuICAgIGlpZENhY2hlID0gaWlkO1xuICB9LFxuICBfc2V0Q3VycmVudEluc3RhbGxhdGlvbkNhY2hlKGluc3RhbGxhdGlvbikge1xuICAgIGxldCBtYXRjaGVzRGlzayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUgPSBpbnN0YWxsYXRpb247XG4gICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlTWF0Y2hlc0Rpc2sgPSBtYXRjaGVzRGlzaztcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gSW5zdGFsbGF0aW9uQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEluc3RhbGxhdGlvbkNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL21hcFwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2tleXNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF92YWx1ZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3ZhbHVlc1wiKSk7XG52YXIgX3NldFRpbWVvdXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXQtdGltZW91dFwiKSk7XG52YXIgX2JpbmQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2JpbmRcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xudmFyIF9MaXZlUXVlcnlTdWJzY3JpcHRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xpdmVRdWVyeVN1YnNjcmlwdGlvblwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG4vLyBUaGUgTGl2ZVF1ZXJ5IGNsaWVudCBpbm5lciBzdGF0ZVxuY29uc3QgQ0xJRU5UX1NUQVRFID0ge1xuICBJTklUSUFMSVpFRDogJ2luaXRpYWxpemVkJyxcbiAgQ09OTkVDVElORzogJ2Nvbm5lY3RpbmcnLFxuICBDT05ORUNURUQ6ICdjb25uZWN0ZWQnLFxuICBDTE9TRUQ6ICdjbG9zZWQnLFxuICBSRUNPTk5FQ1RJTkc6ICdyZWNvbm5lY3RpbmcnLFxuICBESVNDT05ORUNURUQ6ICdkaXNjb25uZWN0ZWQnXG59O1xuXG4vLyBUaGUgZXZlbnQgdHlwZSB0aGUgTGl2ZVF1ZXJ5IGNsaWVudCBzaG91bGQgc2VudCB0byBzZXJ2ZXJcbmNvbnN0IE9QX1RZUEVTID0ge1xuICBDT05ORUNUOiAnY29ubmVjdCcsXG4gIFNVQlNDUklCRTogJ3N1YnNjcmliZScsXG4gIFVOU1VCU0NSSUJFOiAndW5zdWJzY3JpYmUnLFxuICBFUlJPUjogJ2Vycm9yJ1xufTtcblxuLy8gVGhlIGV2ZW50IHdlIGdldCBiYWNrIGZyb20gTGl2ZVF1ZXJ5IHNlcnZlclxuY29uc3QgT1BfRVZFTlRTID0ge1xuICBDT05ORUNURUQ6ICdjb25uZWN0ZWQnLFxuICBTVUJTQ1JJQkVEOiAnc3Vic2NyaWJlZCcsXG4gIFVOU1VCU0NSSUJFRDogJ3Vuc3Vic2NyaWJlZCcsXG4gIEVSUk9SOiAnZXJyb3InLFxuICBDUkVBVEU6ICdjcmVhdGUnLFxuICBVUERBVEU6ICd1cGRhdGUnLFxuICBFTlRFUjogJ2VudGVyJyxcbiAgTEVBVkU6ICdsZWF2ZScsXG4gIERFTEVURTogJ2RlbGV0ZSdcbn07XG5cbi8vIFRoZSBldmVudCB0aGUgTGl2ZVF1ZXJ5IGNsaWVudCBzaG91bGQgZW1pdFxuY29uc3QgQ0xJRU5UX0VNTUlURVJfVFlQRVMgPSB7XG4gIENMT1NFOiAnY2xvc2UnLFxuICBFUlJPUjogJ2Vycm9yJyxcbiAgT1BFTjogJ29wZW4nXG59O1xuXG4vLyBUaGUgZXZlbnQgdGhlIExpdmVRdWVyeSBzdWJzY3JpcHRpb24gc2hvdWxkIGVtaXRcbmNvbnN0IFNVQlNDUklQVElPTl9FTU1JVEVSX1RZUEVTID0ge1xuICBPUEVOOiAnb3BlbicsXG4gIENMT1NFOiAnY2xvc2UnLFxuICBFUlJPUjogJ2Vycm9yJyxcbiAgQ1JFQVRFOiAnY3JlYXRlJyxcbiAgVVBEQVRFOiAndXBkYXRlJyxcbiAgRU5URVI6ICdlbnRlcicsXG4gIExFQVZFOiAnbGVhdmUnLFxuICBERUxFVEU6ICdkZWxldGUnXG59O1xuXG4vLyBFeHBvbmVudGlhbGx5LWdyb3dpbmcgcmFuZG9tIGRlbGF5XG5jb25zdCBnZW5lcmF0ZUludGVydmFsID0gayA9PiB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogTWF0aC5taW4oMzAsIE1hdGgucG93KDIsIGspIC0gMSkgKiAxMDAwO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IExpdmVRdWVyeUNsaWVudC5cbiAqIDxhIGhyZWY9XCJodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19jbGFzc19ldmVudGVtaXR0ZXJcIj5jbG91ZCBmdW5jdGlvbnM8L2E+LlxuICpcbiAqIEEgd3JhcHBlciBvZiBhIHN0YW5kYXJkIFdlYlNvY2tldCBjbGllbnQuIFdlIGFkZCBzZXZlcmFsIHVzZWZ1bCBtZXRob2RzIHRvXG4gKiBoZWxwIHlvdSBjb25uZWN0L2Rpc2Nvbm5lY3QgdG8gTGl2ZVF1ZXJ5U2VydmVyLCBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgYSBQYXJzZVF1ZXJ5IGVhc2lseS5cbiAqXG4gKiBqYXZhc2NyaXB0S2V5IGFuZCBtYXN0ZXJLZXkgYXJlIHVzZWQgZm9yIHZlcmlmeWluZyB0aGUgTGl2ZVF1ZXJ5Q2xpZW50IHdoZW4gaXQgdHJpZXNcbiAqIHRvIGNvbm5lY3QgdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXJcbiAqXG4gKiBXZSBleHBvc2UgdGhyZWUgZXZlbnRzIHRvIGhlbHAgeW91IG1vbml0b3IgdGhlIHN0YXR1cyBvZiB0aGUgTGl2ZVF1ZXJ5Q2xpZW50LlxuICpcbiAqIDxwcmU+XG4gKiBjb25zdCBMaXZlUXVlcnlDbGllbnQgPSBQYXJzZS5MaXZlUXVlcnlDbGllbnQ7XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgTGl2ZVF1ZXJ5Q2xpZW50KHtcbiAqICAgYXBwbGljYXRpb25JZDogJycsXG4gKiAgIHNlcnZlclVSTDogJycsXG4gKiAgIGphdmFzY3JpcHRLZXk6ICcnLFxuICogICBtYXN0ZXJLZXk6ICcnXG4gKiAgfSk7XG4gKiA8L3ByZT5cbiAqXG4gKiBPcGVuIC0gV2hlbiB3ZSBlc3RhYmxpc2ggdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuXG4gKiA8cHJlPlxuICogY2xpZW50Lm9uKCdvcGVuJywgKCkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPlxuICpcbiAqIENsb3NlIC0gV2hlbiB3ZSBsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICogPHByZT5cbiAqIGNsaWVudC5vbignY2xvc2UnLCAoKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+XG4gKlxuICogRXJyb3IgLSBXaGVuIHNvbWUgbmV0d29yayBlcnJvciBvciBMaXZlUXVlcnkgc2VydmVyIGVycm9yIGhhcHBlbnMsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqIDxwcmU+XG4gKiBjbGllbnQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+XG4gKlxuICogQGFsaWFzIFBhcnNlLkxpdmVRdWVyeUNsaWVudFxuICovXG5jbGFzcyBMaXZlUXVlcnlDbGllbnQge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuYXBwbGljYXRpb25JZCAtIGFwcGxpY2F0aW9uSWQgb2YgeW91ciBQYXJzZSBhcHBcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc2VydmVyVVJMIC0gPGI+dGhlIFVSTCBvZiB5b3VyIExpdmVRdWVyeSBzZXJ2ZXI8L2I+XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmphdmFzY3JpcHRLZXkgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5tYXN0ZXJLZXkgKG9wdGlvbmFsKSBZb3VyIFBhcnNlIE1hc3RlciBLZXkuIChOb2RlLmpzIG9ubHkhKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zZXNzaW9uVG9rZW4gKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5pbnN0YWxsYXRpb25JZCAob3B0aW9uYWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfcmVmKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBsZXQge1xuICAgICAgYXBwbGljYXRpb25JZCxcbiAgICAgIHNlcnZlclVSTCxcbiAgICAgIGphdmFzY3JpcHRLZXksXG4gICAgICBtYXN0ZXJLZXksXG4gICAgICBzZXNzaW9uVG9rZW4sXG4gICAgICBpbnN0YWxsYXRpb25JZFxuICAgIH0gPSBfcmVmO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiYXR0ZW1wdHNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImlkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZXF1ZXN0SWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImFwcGxpY2F0aW9uSWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInNlcnZlclVSTFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiamF2YXNjcmlwdEtleVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwibWFzdGVyS2V5XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzZXNzaW9uVG9rZW5cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImluc3RhbGxhdGlvbklkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiY29ubmVjdFByb21pc2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInN1YnNjcmlwdGlvbnNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInNvY2tldFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic3RhdGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlY29ubmVjdEhhbmRsZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdHRlclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImVtaXRcIiwgdm9pZCAwKTtcbiAgICBpZiAoIXNlcnZlclVSTCB8fCAoMCwgX2luZGV4T2YuZGVmYXVsdCkoc2VydmVyVVJMKS5jYWxsKHNlcnZlclVSTCwgJ3dzJykgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc2V0IGEgcHJvcGVyIFBhcnNlIExpdmVRdWVyeSBzZXJ2ZXIgdXJsIGJlZm9yZSB1c2luZyBMaXZlUXVlcnlDbGllbnQnKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RIYW5kbGUgPSBudWxsO1xuICAgIHRoaXMuYXR0ZW1wdHMgPSAxO1xuICAgIHRoaXMuaWQgPSAwO1xuICAgIHRoaXMucmVxdWVzdElkID0gMTtcbiAgICB0aGlzLnNlcnZlclVSTCA9IHNlcnZlclVSTDtcbiAgICB0aGlzLmFwcGxpY2F0aW9uSWQgPSBhcHBsaWNhdGlvbklkO1xuICAgIHRoaXMuamF2YXNjcmlwdEtleSA9IGphdmFzY3JpcHRLZXkgfHwgdW5kZWZpbmVkO1xuICAgIHRoaXMubWFzdGVyS2V5ID0gbWFzdGVyS2V5IHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlc3Npb25Ub2tlbiA9IHNlc3Npb25Ub2tlbiB8fCB1bmRlZmluZWQ7XG4gICAgdGhpcy5pbnN0YWxsYXRpb25JZCA9IGluc3RhbGxhdGlvbklkIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZTtcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgX21hcC5kZWZhdWx0KCk7XG4gICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5JTklUSUFMSVpFRDtcbiAgICBjb25zdCBFdmVudEVtaXR0ZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5vbiA9IChldmVudE5hbWUsIGxpc3RlbmVyKSA9PiB0aGlzLmVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpcy5lbWl0dGVyLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTtcbiAgICB9O1xuICAgIC8vIGFkZGluZyBsaXN0ZW5lciBzbyBwcm9jZXNzIGRvZXMgbm90IGNyYXNoXG4gICAgLy8gYmVzdCBwcmFjdGljZSBpcyBmb3IgZGV2ZWxvcGVyIHRvIHJlZ2lzdGVyIHRoZWlyIG93biBsaXN0ZW5lclxuICAgIHRoaXMub24oJ2Vycm9yJywgKCkgPT4ge30pO1xuICB9XG4gIHNob3VsZE9wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5JTklUSUFMSVpFRCB8fCB0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gYSBQYXJzZVF1ZXJ5XG4gICAqXG4gICAqIElmIHlvdSBwcm92aWRlIHRoZSBzZXNzaW9uVG9rZW4sIHdoZW4gdGhlIExpdmVRdWVyeSBzZXJ2ZXIgZ2V0cyBQYXJzZU9iamVjdCdzXG4gICAqIHVwZGF0ZXMgZnJvbSBwYXJzZSBzZXJ2ZXIsIGl0J2xsIHRyeSB0byBjaGVjayB3aGV0aGVyIHRoZSBzZXNzaW9uVG9rZW4gZnVsZmlsbHNcbiAgICogdGhlIFBhcnNlT2JqZWN0J3MgQUNMLiBUaGUgTGl2ZVF1ZXJ5IHNlcnZlciB3aWxsIG9ubHkgc2VuZCB1cGRhdGVzIHRvIGNsaWVudHMgd2hvc2VcbiAgICogc2Vzc2lvblRva2VuIGlzIGZpdCBmb3IgdGhlIFBhcnNlT2JqZWN0J3MgQUNMLiBZb3UgY2FuIGNoZWNrIHRoZSBMaXZlUXVlcnkgcHJvdG9jb2xcbiAgICogPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9wYXJzZS1jb21tdW5pdHkvcGFyc2Utc2VydmVyL3dpa2kvUGFyc2UtTGl2ZVF1ZXJ5LVByb3RvY29sLVNwZWNpZmljYXRpb25cIj5oZXJlPC9hPiBmb3IgbW9yZSBkZXRhaWxzLiBUaGUgc3Vic2NyaXB0aW9uIHlvdSBnZXQgaXMgdGhlIHNhbWUgc3Vic2NyaXB0aW9uIHlvdSBnZXRcbiAgICogZnJvbSBvdXIgU3RhbmRhcmQgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlUXVlcnl9IHF1ZXJ5IC0gdGhlIFBhcnNlUXVlcnkgeW91IHdhbnQgdG8gc3Vic2NyaWJlIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uVG9rZW4gKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyB7TGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgc3Vic2NyaWJlKHF1ZXJ5LCBzZXNzaW9uVG9rZW4pIHtcbiAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICBjb25zdCBxdWVyeUpTT04gPSBxdWVyeS50b0pTT04oKTtcbiAgICBjb25zdCB3aGVyZSA9IHF1ZXJ5SlNPTi53aGVyZTtcbiAgICBjb25zdCBrZXlzID0gKDAsIF9rZXlzLmRlZmF1bHQpKHF1ZXJ5SlNPTik/LnNwbGl0KCcsJyk7XG4gICAgY29uc3Qgd2F0Y2ggPSBxdWVyeUpTT04ud2F0Y2g/LnNwbGl0KCcsJyk7XG4gICAgY29uc3Qgc3Vic2NyaWJlUmVxdWVzdCA9IHtcbiAgICAgIG9wOiBPUF9UWVBFUy5TVUJTQ1JJQkUsXG4gICAgICByZXF1ZXN0SWQ6IHRoaXMucmVxdWVzdElkLFxuICAgICAgcXVlcnk6IHtcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICB3aGVyZSxcbiAgICAgICAga2V5cyxcbiAgICAgICAgd2F0Y2hcbiAgICAgIH0sXG4gICAgICBzZXNzaW9uVG9rZW46IHVuZGVmaW5lZFxuICAgIH07XG4gICAgaWYgKHNlc3Npb25Ub2tlbikge1xuICAgICAgc3Vic2NyaWJlUmVxdWVzdC5zZXNzaW9uVG9rZW4gPSBzZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG5ldyBfTGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uLmRlZmF1bHQodGhpcy5yZXF1ZXN0SWQsIHF1ZXJ5LCBzZXNzaW9uVG9rZW4pO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5zZXQodGhpcy5yZXF1ZXN0SWQsIHN1YnNjcmlwdGlvbik7XG4gICAgdGhpcy5yZXF1ZXN0SWQgKz0gMTtcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZCgoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShzdWJzY3JpYmVSZXF1ZXN0KSk7XG4gICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnN1YnNjcmliZVByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEFmdGVyIGNhbGxpbmcgdW5zdWJzY3JpYmUgeW91J2xsIHN0b3AgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIHRoZSBzdWJzY3JpcHRpb24gb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gc3Vic2NyaXB0aW9uIC0gc3Vic2NyaXB0aW9uIHlvdSB3b3VsZCBsaWtlIHRvIHVuc3Vic2NyaWJlIGZyb20uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgYXN5bmMgdW5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uKSB7XG4gICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdW5zdWJzY3JpYmVSZXF1ZXN0ID0ge1xuICAgICAgb3A6IE9QX1RZUEVTLlVOU1VCU0NSSUJFLFxuICAgICAgcmVxdWVzdElkOiBzdWJzY3JpcHRpb24uaWRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3RQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuc29ja2V0LnNlbmQoKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkodW5zdWJzY3JpYmVSZXF1ZXN0KSk7XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlUHJvbWlzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZnRlciBvcGVuIGlzIGNhbGxlZCwgdGhlIExpdmVRdWVyeUNsaWVudCB3aWxsIHRyeSB0byBzZW5kIGEgY29ubmVjdCByZXF1ZXN0XG4gICAqIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLlxuICAgKlxuICAgKi9cbiAgb3BlbigpIHtcbiAgICBjb25zdCBXZWJTb2NrZXRJbXBsZW1lbnRhdGlvbiA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFdlYlNvY2tldENvbnRyb2xsZXIoKTtcbiAgICBpZiAoIVdlYlNvY2tldEltcGxlbWVudGF0aW9uKSB7XG4gICAgICB0aGlzLmVtaXQoQ0xJRU5UX0VNTUlURVJfVFlQRVMuRVJST1IsICdDYW4gbm90IGZpbmQgV2ViU29ja2V0IGltcGxlbWVudGF0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlICE9PSBDTElFTlRfU1RBVEUuUkVDT05ORUNUSU5HKSB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLkNPTk5FQ1RJTkc7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldEltcGxlbWVudGF0aW9uKHRoaXMuc2VydmVyVVJMKTtcbiAgICB0aGlzLnNvY2tldC5jbG9zaW5nUHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG5cbiAgICAvLyBCaW5kIFdlYlNvY2tldCBjYWxsYmFja3NcbiAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRPcGVuKCk7XG4gICAgfTtcbiAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSBldmVudCA9PiB7XG4gICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRNZXNzYWdlKGV2ZW50KTtcbiAgICB9O1xuICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSBldmVudCA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5jbG9zaW5nUHJvbWlzZT8ucmVzb2x2ZShldmVudCk7XG4gICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRDbG9zZSgpO1xuICAgIH07XG4gICAgdGhpcy5zb2NrZXQub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgIHRoaXMuX2hhbmRsZVdlYlNvY2tldEVycm9yKGVycm9yKTtcbiAgICB9O1xuICB9XG4gIHJlc3Vic2NyaWJlKCkge1xuICAgIHZhciBfY29udGV4dDtcbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQgPSB0aGlzLnN1YnNjcmlwdGlvbnMpLmNhbGwoX2NvbnRleHQsIChzdWJzY3JpcHRpb24sIHJlcXVlc3RJZCkgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSBzdWJzY3JpcHRpb24ucXVlcnk7XG4gICAgICBjb25zdCBxdWVyeUpTT04gPSBxdWVyeS50b0pTT04oKTtcbiAgICAgIGNvbnN0IHdoZXJlID0gcXVlcnlKU09OLndoZXJlO1xuICAgICAgY29uc3Qga2V5cyA9ICgwLCBfa2V5cy5kZWZhdWx0KShxdWVyeUpTT04pPy5zcGxpdCgnLCcpO1xuICAgICAgY29uc3Qgd2F0Y2ggPSBxdWVyeUpTT04ud2F0Y2g/LnNwbGl0KCcsJyk7XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBxdWVyeS5jbGFzc05hbWU7XG4gICAgICBjb25zdCBzZXNzaW9uVG9rZW4gPSBzdWJzY3JpcHRpb24uc2Vzc2lvblRva2VuO1xuICAgICAgY29uc3Qgc3Vic2NyaWJlUmVxdWVzdCA9IHtcbiAgICAgICAgb3A6IE9QX1RZUEVTLlNVQlNDUklCRSxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBxdWVyeToge1xuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICB3aGVyZSxcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIHdhdGNoXG4gICAgICAgIH0sXG4gICAgICAgIHNlc3Npb25Ub2tlbjogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgICAgaWYgKHNlc3Npb25Ub2tlbikge1xuICAgICAgICBzdWJzY3JpYmVSZXF1ZXN0LnNlc3Npb25Ub2tlbiA9IHNlc3Npb25Ub2tlbjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29ubmVjdFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQoKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoc3Vic2NyaWJlUmVxdWVzdCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBjbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhpcyBMaXZlUXVlcnlDbGllbnQsXG4gICAqIGNhbmNlbCB0aGUgYXV0byByZWNvbm5lY3QgYW5kIHVuc3Vic2NyaWJlIGFsbCBzdWJzY3JpcHRpb25zIGJhc2VkIG9uIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZSB8IHVuZGVmaW5lZH0gQ2xvc2VFdmVudCB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYlNvY2tldC9jbG9zZV9ldmVudH1cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuSU5JVElBTElaRUQgfHwgdGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLkRJU0NPTk5FQ1RFRDtcbiAgICB0aGlzLnNvY2tldD8uY2xvc2UoKTtcbiAgICAvLyBOb3RpZnkgZWFjaCBzdWJzY3JpcHRpb24gYWJvdXQgdGhlIGNsb3NlXG4gICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgKDAsIF92YWx1ZXMuZGVmYXVsdCkoX2NvbnRleHQyID0gdGhpcy5zdWJzY3JpcHRpb25zKS5jYWxsKF9jb250ZXh0MikpIHtcbiAgICAgIHZhciBfY29udGV4dDI7XG4gICAgICBzdWJzY3JpcHRpb24uc3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgc3Vic2NyaXB0aW9uLmVtaXQoU1VCU0NSSVBUSU9OX0VNTUlURVJfVFlQRVMuQ0xPU0UpO1xuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVSZXNldCgpO1xuICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5DTE9TRSk7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5jbG9zaW5nUHJvbWlzZTtcbiAgfVxuXG4gIC8vIGVuc3VyZSB3ZSBzdGFydCB3aXRoIHZhbGlkIHN0YXRlIGlmIGNvbm5lY3QgaXMgY2FsbGVkIGFnYWluIGFmdGVyIGNsb3NlXG4gIF9oYW5kbGVSZXNldCgpIHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMTtcbiAgICB0aGlzLmlkID0gMDtcbiAgICB0aGlzLnJlcXVlc3RJZCA9IDE7XG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gbmV3IF9tYXAuZGVmYXVsdCgpO1xuICB9XG4gIF9oYW5kbGVXZWJTb2NrZXRPcGVuKCkge1xuICAgIGNvbnN0IGNvbm5lY3RSZXF1ZXN0ID0ge1xuICAgICAgb3A6IE9QX1RZUEVTLkNPTk5FQ1QsXG4gICAgICBhcHBsaWNhdGlvbklkOiB0aGlzLmFwcGxpY2F0aW9uSWQsXG4gICAgICBqYXZhc2NyaXB0S2V5OiB0aGlzLmphdmFzY3JpcHRLZXksXG4gICAgICBtYXN0ZXJLZXk6IHRoaXMubWFzdGVyS2V5LFxuICAgICAgc2Vzc2lvblRva2VuOiB0aGlzLnNlc3Npb25Ub2tlbixcbiAgICAgIGluc3RhbGxhdGlvbklkOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIGlmICh0aGlzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKSB7XG4gICAgICBjb25uZWN0UmVxdWVzdC5pbnN0YWxsYXRpb25JZCA9IHRoaXMuaW5zdGFsbGF0aW9uSWQ7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0LnNlbmQoKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoY29ubmVjdFJlcXVlc3QpKTtcbiAgfVxuICBfaGFuZGxlV2ViU29ja2V0TWVzc2FnZShldmVudCkge1xuICAgIGxldCBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICB9XG4gICAgbGV0IHN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgaWYgKGRhdGEucmVxdWVzdElkKSB7XG4gICAgICBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGRhdGEucmVxdWVzdElkKSB8fCBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgIGNsaWVudElkOiBkYXRhLmNsaWVudElkLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IGRhdGEuaW5zdGFsbGF0aW9uSWRcbiAgICB9O1xuICAgIHN3aXRjaCAoZGF0YS5vcCkge1xuICAgICAgY2FzZSBPUF9FVkVOVFMuQ09OTkVDVEVEOlxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLlJFQ09OTkVDVElORykge1xuICAgICAgICAgIHRoaXMucmVzdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoQ0xJRU5UX0VNTUlURVJfVFlQRVMuT1BFTik7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmNsaWVudElkO1xuICAgICAgICB0aGlzLmNvbm5lY3RQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5DT05ORUNURUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPUF9FVkVOVFMuU1VCU0NSSUJFRDpcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgIHRoaXMuYXR0ZW1wdHMgPSAxO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgICBzdWJzY3JpcHRpb24uc3Vic2NyaWJlUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgKDAsIF9zZXRUaW1lb3V0Mi5kZWZhdWx0KSgoKSA9PiBzdWJzY3JpcHRpb24uZW1pdChTVUJTQ1JJUFRJT05fRU1NSVRFUl9UWVBFUy5PUEVOLCByZXNwb25zZSksIDIwMCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9QX0VWRU5UUy5FUlJPUjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHBhcnNlRXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChkYXRhLmNvZGUsIGRhdGEuZXJyb3IpO1xuICAgICAgICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZS5yZWplY3QocGFyc2VFcnJvcik7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLkRJU0NPTk5FQ1RFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRhdGEucmVxdWVzdElkKSB7XG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVQcm9taXNlLnJlamVjdChwYXJzZUVycm9yKTtcbiAgICAgICAgICAgICAgKDAsIF9zZXRUaW1lb3V0Mi5kZWZhdWx0KSgoKSA9PiBzdWJzY3JpcHRpb24uZW1pdChTVUJTQ1JJUFRJT05fRU1NSVRFUl9UWVBFUy5FUlJPUiwgZGF0YS5lcnJvciksIDIwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5FUlJPUiwgZGF0YS5lcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLmVycm9yID09PSAnQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG5vdCBhbGxvd2VkJykge1xuICAgICAgICAgICAgdGhpcy5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGF0YS5yZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVJlY29ubmVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSBPUF9FVkVOVFMuVU5TVUJTQ1JJQkVEOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShkYXRhLnJlcXVlc3RJZCk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uc3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gY3JlYXRlLCB1cGRhdGUsIGVudGVyLCBsZWF2ZSwgZGVsZXRlIGNhc2VzXG4gICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgb3ZlcnJpZGUgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoZGF0YS5vcmlnaW5hbCkge1xuICAgICAgICAgICAgb3ZlcnJpZGUgPSB0cnVlO1xuICAgICAgICAgICAgZGVsZXRlIGRhdGEub3JpZ2luYWwuX190eXBlO1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHJlbW92ZWQgZmllbGRzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIGRhdGEub3JpZ2luYWwpIHtcbiAgICAgICAgICAgICAgaWYgKCEoZmllbGQgaW4gZGF0YS5vYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5vYmplY3RbZmllbGRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLm9yaWdpbmFsID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04oZGF0YS5vcmlnaW5hbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgZGF0YS5vYmplY3QuX190eXBlO1xuICAgICAgICAgIGNvbnN0IHBhcnNlT2JqZWN0ID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04oZGF0YS5vYmplY3QsICEoc3Vic2NyaXB0aW9uLnF1ZXJ5ICYmIHN1YnNjcmlwdGlvbi5xdWVyeS5fc2VsZWN0KSA/IG92ZXJyaWRlIDogZmFsc2UpO1xuICAgICAgICAgIGlmIChkYXRhLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uZW1pdChkYXRhLm9wLCBwYXJzZU9iamVjdCwgZGF0YS5vcmlnaW5hbCwgcmVzcG9uc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uZW1pdChkYXRhLm9wLCBwYXJzZU9iamVjdCwgcmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgICAgICAgaWYgKG92ZXJyaWRlICYmIGxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgICAgICAgbG9jYWxEYXRhc3RvcmUuX3VwZGF0ZU9iamVjdElmUGlubmVkKHBhcnNlT2JqZWN0KS50aGVuKCgpID0+IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2hhbmRsZVdlYlNvY2tldENsb3NlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuQ0xPU0VEO1xuICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5DTE9TRSk7XG4gICAgLy8gTm90aWZ5IGVhY2ggc3Vic2NyaXB0aW9uIGFib3V0IHRoZSBjbG9zZVxuICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mICgwLCBfdmFsdWVzLmRlZmF1bHQpKF9jb250ZXh0MyA9IHRoaXMuc3Vic2NyaXB0aW9ucykuY2FsbChfY29udGV4dDMpKSB7XG4gICAgICB2YXIgX2NvbnRleHQzO1xuICAgICAgc3Vic2NyaXB0aW9uLmVtaXQoU1VCU0NSSVBUSU9OX0VNTUlURVJfVFlQRVMuQ0xPU0UpO1xuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVSZWNvbm5lY3QoKTtcbiAgfVxuICBfaGFuZGxlV2ViU29ja2V0RXJyb3IoZXJyb3IpIHtcbiAgICB0aGlzLmVtaXQoQ0xJRU5UX0VNTUlURVJfVFlQRVMuRVJST1IsIGVycm9yKTtcbiAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiAoMCwgX3ZhbHVlcy5kZWZhdWx0KShfY29udGV4dDQgPSB0aGlzLnN1YnNjcmlwdGlvbnMpLmNhbGwoX2NvbnRleHQ0KSkge1xuICAgICAgdmFyIF9jb250ZXh0NDtcbiAgICAgIHN1YnNjcmlwdGlvbi5lbWl0KFNVQlNDUklQVElPTl9FTU1JVEVSX1RZUEVTLkVSUk9SLCBlcnJvcik7XG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVJlY29ubmVjdCgpO1xuICB9XG4gIF9oYW5kbGVSZWNvbm5lY3QoKSB7XG4gICAgdmFyIF9jb250ZXh0NTtcbiAgICAvLyBpZiBjbG9zZWQgb3IgY3VycmVudGx5IHJlY29ubmVjdGluZyB3ZSBzdG9wIGF0dGVtcHRpbmcgdG8gcmVjb25uZWN0XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5ESVNDT05ORUNURUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5SRUNPTk5FQ1RJTkc7XG4gICAgY29uc3QgdGltZSA9IGdlbmVyYXRlSW50ZXJ2YWwodGhpcy5hdHRlbXB0cyk7XG5cbiAgICAvLyBoYW5kbGUgY2FzZSB3aGVuIGJvdGggY2xvc2UvZXJyb3Igb2NjdXIgYXQgZnJlcXVlbnQgcmF0ZXMgd2UgZW5zdXJlIHdlIGRvIG5vdCByZWNvbm5lY3QgdW5uZWNlc3NhcmlseS5cbiAgICAvLyB3ZSdyZSB1bmFibGUgdG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGJldHdlZW4gY2xvc2UvZXJyb3Igd2hlbiB3ZSdyZSB1bmFibGUgdG8gcmVjb25uZWN0IHRoZXJlZm9yZVxuICAgIC8vIHdlIHRyeSB0byByZWNvbm5lY3QgaW4gYm90aCBjYXNlc1xuICAgIC8vIHNlcnZlciBzaWRlIHdzIGFuZCBicm93c2VyIFdlYlNvY2tldCBiZWhhdmUgZGlmZmVyZW50bHkgaW4gd2hlbiBjbG9zZS9lcnJvciBnZXQgdHJpZ2dlcmVkXG4gICAgaWYgKHRoaXMucmVjb25uZWN0SGFuZGxlKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RIYW5kbGUpO1xuICAgIH1cbiAgICB0aGlzLnJlY29ubmVjdEhhbmRsZSA9ICgwLCBfc2V0VGltZW91dDIuZGVmYXVsdCkoKDAsIF9iaW5kLmRlZmF1bHQpKF9jb250ZXh0NSA9ICgpID0+IHtcbiAgICAgIHRoaXMuYXR0ZW1wdHMrKztcbiAgICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfSkuY2FsbChfY29udGV4dDUsIHRoaXMpLCB0aW1lKTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gTGl2ZVF1ZXJ5Q2xpZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBMaXZlUXVlcnkgU3Vic2NyaXB0aW9uLlxuICogPGEgaHJlZj1cImh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZXZlbnRzLmh0bWwjZXZlbnRzX2NsYXNzX2V2ZW50ZW1pdHRlclwiPmNsb3VkIGZ1bmN0aW9uczwvYT4uXG4gKlxuICogPHA+UmVzcG9uc2UgT2JqZWN0IC0gQ29udGFpbnMgZGF0YSBmcm9tIHRoZSBjbGllbnQgdGhhdCBtYWRlIHRoZSByZXF1ZXN0XG4gKiA8dWw+XG4gKiA8bGk+Y2xpZW50SWQ8L2xpPlxuICogPGxpPmluc3RhbGxhdGlvbklkIC0gcmVxdWlyZXMgUGFyc2UgU2VydmVyIDQuMC4wKzwvbGk+XG4gKiA8L3VsPlxuICogPC9wPlxuICpcbiAqIDxwPk9wZW4gRXZlbnQgLSBXaGVuIHlvdSBjYWxsIHF1ZXJ5LnN1YnNjcmliZSgpLCB3ZSBzZW5kIGEgc3Vic2NyaWJlIHJlcXVlc3QgdG9cbiAqIHRoZSBMaXZlUXVlcnkgc2VydmVyLCB3aGVuIHdlIGdldCB0aGUgY29uZmlybWF0aW9uIGZyb20gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsXG4gKiB0aGlzIGV2ZW50IHdpbGwgYmUgZW1pdHRlZC4gV2hlbiB0aGUgY2xpZW50IGxvc2VzIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZVxuICogTGl2ZVF1ZXJ5IHNlcnZlciwgd2Ugd2lsbCB0cnkgdG8gYXV0byByZWNvbm5lY3QgdGhlIExpdmVRdWVyeSBzZXJ2ZXIuIElmIHdlXG4gKiByZWNvbm5lY3QgdGhlIExpdmVRdWVyeSBzZXJ2ZXIgYW5kIHN1Y2Nlc3NmdWxseSByZXN1YnNjcmliZSB0aGUgUGFyc2VRdWVyeSxcbiAqIHlvdSdsbCBhbHNvIGdldCB0aGlzIGV2ZW50LlxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ29wZW4nLCAocmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+Q3JlYXRlIEV2ZW50IC0gV2hlbiBhIG5ldyBQYXJzZU9iamVjdCBpcyBjcmVhdGVkIGFuZCBpdCBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSB5b3Ugc3Vic2NyaWJlLFxuICogeW91J2xsIGdldCB0aGlzIGV2ZW50LiBUaGUgb2JqZWN0IGlzIHRoZSBQYXJzZU9iamVjdCB3aGljaCBpcyBjcmVhdGVkLlxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ2NyZWF0ZScsIChvYmplY3QsIHJlc3BvbnNlKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPlVwZGF0ZSBFdmVudCAtIFdoZW4gYW4gZXhpc3RpbmcgUGFyc2VPYmplY3QgKG9yaWdpbmFsKSB3aGljaCBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSB5b3Ugc3Vic2NyaWJlXG4gKiBpcyB1cGRhdGVkIChUaGUgUGFyc2VPYmplY3QgZnVsZmlsbHMgdGhlIFBhcnNlUXVlcnkgYmVmb3JlIGFuZCBhZnRlciBjaGFuZ2VzKSxcbiAqIHlvdSdsbCBnZXQgdGhpcyBldmVudC4gVGhlIG9iamVjdCBpcyB0aGUgUGFyc2VPYmplY3Qgd2hpY2ggaXMgdXBkYXRlZC5cbiAqIEl0cyBjb250ZW50IGlzIHRoZSBsYXRlc3QgdmFsdWUgb2YgdGhlIFBhcnNlT2JqZWN0LlxuICpcbiAqIFBhcnNlLVNlcnZlciAzLjEuMysgUmVxdWlyZWQgZm9yIG9yaWdpbmFsIG9iamVjdCBwYXJhbWV0ZXJcbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCd1cGRhdGUnLCAob2JqZWN0LCBvcmlnaW5hbCwgcmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+RW50ZXIgRXZlbnQgLSBXaGVuIGFuIGV4aXN0aW5nIFBhcnNlT2JqZWN0J3MgKG9yaWdpbmFsKSBvbGQgdmFsdWUgZG9lc24ndCBmdWxmaWxsIHRoZSBQYXJzZVF1ZXJ5XG4gKiBidXQgaXRzIG5ldyB2YWx1ZSBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSwgeW91J2xsIGdldCB0aGlzIGV2ZW50LiBUaGUgb2JqZWN0IGlzIHRoZVxuICogUGFyc2VPYmplY3Qgd2hpY2ggZW50ZXJzIHRoZSBQYXJzZVF1ZXJ5LiBJdHMgY29udGVudCBpcyB0aGUgbGF0ZXN0IHZhbHVlIG9mIHRoZSBQYXJzZU9iamVjdC5cbiAqXG4gKiBQYXJzZS1TZXJ2ZXIgMy4xLjMrIFJlcXVpcmVkIGZvciBvcmlnaW5hbCBvYmplY3QgcGFyYW1ldGVyXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignZW50ZXInLCAob2JqZWN0LCBvcmlnaW5hbCwgcmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICpcbiAqIDxwPlVwZGF0ZSBFdmVudCAtIFdoZW4gYW4gZXhpc3RpbmcgUGFyc2VPYmplY3QncyBvbGQgdmFsdWUgZnVsZmlsbHMgdGhlIFBhcnNlUXVlcnkgYnV0IGl0cyBuZXcgdmFsdWVcbiAqIGRvZXNuJ3QgZnVsZmlsbCB0aGUgUGFyc2VRdWVyeSwgeW91J2xsIGdldCB0aGlzIGV2ZW50LiBUaGUgb2JqZWN0IGlzIHRoZSBQYXJzZU9iamVjdFxuICogd2hpY2ggbGVhdmVzIHRoZSBQYXJzZVF1ZXJ5LiBJdHMgY29udGVudCBpcyB0aGUgbGF0ZXN0IHZhbHVlIG9mIHRoZSBQYXJzZU9iamVjdC5cbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCdsZWF2ZScsIChvYmplY3QsIHJlc3BvbnNlKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqXG4gKiA8cD5EZWxldGUgRXZlbnQgLSBXaGVuIGFuIGV4aXN0aW5nIFBhcnNlT2JqZWN0IHdoaWNoIGZ1bGZpbGxzIHRoZSBQYXJzZVF1ZXJ5IGlzIGRlbGV0ZWQsIHlvdSdsbFxuICogZ2V0IHRoaXMgZXZlbnQuIFRoZSBvYmplY3QgaXMgdGhlIFBhcnNlT2JqZWN0IHdoaWNoIGlzIGRlbGV0ZWQuXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignZGVsZXRlJywgKG9iamVjdCwgcmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICpcbiAqIDxwPkNsb3NlIEV2ZW50IC0gV2hlbiB0aGUgY2xpZW50IGxvc2VzIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5XG4gKiBzZXJ2ZXIgYW5kIHdlIHN0b3AgcmVjZWl2aW5nIGV2ZW50cywgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqL1xuY2xhc3MgU3Vic2NyaXB0aW9uIHtcbiAgLypcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gc3Vic2NyaXB0aW9uIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSAtIHF1ZXJ5IHRvIHN1YnNjcmliZSB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblRva2VuIC0gb3B0aW9uYWwgc2Vzc2lvbiB0b2tlblxuICAgKi9cbiAgY29uc3RydWN0b3IoaWQsIHF1ZXJ5LCBzZXNzaW9uVG9rZW4pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiaWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInF1ZXJ5XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzZXNzaW9uVG9rZW5cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInN1YnNjcmliZVByb21pc2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInVuc3Vic2NyaWJlUHJvbWlzZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic3Vic2NyaWJlZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdHRlclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImVtaXRcIiwgdm9pZCAwKTtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMuc2Vzc2lvblRva2VuID0gc2Vzc2lvblRva2VuO1xuICAgIHRoaXMuc3Vic2NyaWJlUHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZVByb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgIHRoaXMuc3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgIGNvbnN0IEV2ZW50RW1pdHRlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLm9uID0gKGV2ZW50TmFtZSwgbGlzdGVuZXIpID0+IHRoaXMuZW1pdHRlci5vbihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90aGlzLmVtaXR0ZXIuZW1pdChldmVudE5hbWUsIC4uLmFyZ3MpO1xuICAgIH07XG4gICAgLy8gYWRkaW5nIGxpc3RlbmVyIHNvIHByb2Nlc3MgZG9lcyBub3QgY3Jhc2hcbiAgICAvLyBiZXN0IHByYWN0aWNlIGlzIGZvciBkZXZlbG9wZXIgdG8gcmVnaXN0ZXIgdGhlaXIgb3duIGxpc3RlbmVyXG4gICAgdGhpcy5vbignZXJyb3InLCAoKSA9PiB7fSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHN1YnNjcmlwdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHVuc3Vic2NyaWJlKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMaXZlUXVlcnlDb250cm9sbGVyKCkuZ2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudCgpLnRoZW4obGl2ZVF1ZXJ5Q2xpZW50ID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgICAgIHJldHVybiBsaXZlUXVlcnlDbGllbnQudW5zdWJzY3JpYmUodGhpcyk7XG4gICAgfSk7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN1YnNjcmlwdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfc2V0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXRcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX2ZpbHRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmlsdGVyXCIpKTtcbnZhciBfaW5jbHVkZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpKTtcbnZhciBfc3RhcnRzV2l0aCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGhcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfY29uY2F0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXRcIikpO1xudmFyIF9mcm9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9mcm9tXCIpKTtcbnZhciBfZmluZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyXCIpKTtcbnZhciBfUGFyc2VRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VRdWVyeVwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlVXRpbHMgPSByZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVV0aWxzXCIpO1xuLyoqXG4gKiBQcm92aWRlcyBhIGxvY2FsIGRhdGFzdG9yZSB3aGljaCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi4gPGJyIC8+XG4gKiBUbyBlbmFibGUgdGhpcyBmdW5jdGlvbmFsaXR5LCBjYWxsIDxjb2RlPlBhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+LlxuICpcbiAqIFBpbiBvYmplY3QgdG8gYWRkIHRvIGxvY2FsIGRhdGFzdG9yZVxuICpcbiAqIDxwcmU+YXdhaXQgb2JqZWN0LnBpbigpOzwvcHJlPlxuICogPHByZT5hd2FpdCBvYmplY3QucGluV2l0aE5hbWUoJ3Bpbk5hbWUnKTs8L3ByZT5cbiAqXG4gKiBRdWVyeSBwaW5uZWQgb2JqZWN0c1xuICpcbiAqIDxwcmU+cXVlcnkuZnJvbUxvY2FsRGF0YXN0b3JlKCk7PC9wcmU+XG4gKiA8cHJlPnF1ZXJ5LmZyb21QaW4oKTs8L3ByZT5cbiAqIDxwcmU+cXVlcnkuZnJvbVBpbldpdGhOYW1lKCk7PC9wcmU+XG4gKlxuICogPHByZT5jb25zdCBsb2NhbE9iamVjdHMgPSBhd2FpdCBxdWVyeS5maW5kKCk7PC9wcmU+XG4gKlxuICogQGNsYXNzIFBhcnNlLkxvY2FsRGF0YXN0b3JlXG4gKiBAc3RhdGljXG4gKi9cbmNvbnN0IExvY2FsRGF0YXN0b3JlID0ge1xuICBpc0VuYWJsZWQ6IGZhbHNlLFxuICBpc1N5bmNpbmc6IGZhbHNlLFxuICBmcm9tUGluV2l0aE5hbWUobmFtZSkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5mcm9tUGluV2l0aE5hbWUobmFtZSk7XG4gIH0sXG4gIGFzeW5jIHBpbldpdGhOYW1lKG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnBpbldpdGhOYW1lKG5hbWUsIHZhbHVlKTtcbiAgfSxcbiAgYXN5bmMgdW5QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnVuUGluV2l0aE5hbWUobmFtZSk7XG4gIH0sXG4gIF9nZXRBbGxDb250ZW50cygpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0QWxsQ29udGVudHMoKTtcbiAgfSxcbiAgLy8gVXNlIGZvciB0ZXN0aW5nXG4gIGFzeW5jIF9nZXRSYXdTdG9yYWdlKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5nZXRSYXdTdG9yYWdlKCk7XG4gIH0sXG4gIGFzeW5jIF9jbGVhcigpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuY2xlYXIoKTtcbiAgfSxcbiAgLy8gUGluIHRoZSBvYmplY3QgYW5kIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5XG4gIC8vIFNhdmVzIHRoZSBvYmplY3QgYW5kIGNoaWxkcmVuIGtleSB0byBQaW4gTmFtZVxuICBhc3luYyBfaGFuZGxlUGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cykge1xuICAgIGNvbnN0IHBpbk5hbWUgPSB0aGlzLmdldFBpbk5hbWUobmFtZSk7XG4gICAgY29uc3QgdG9QaW5Qcm9taXNlcyA9IFtdO1xuICAgIGNvbnN0IG9iamVjdEtleXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBvYmplY3RzKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldENoaWxkcmVuKHBhcmVudCk7XG4gICAgICBjb25zdCBwYXJlbnRLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChwYXJlbnQpO1xuICAgICAgY29uc3QganNvbiA9IHBhcmVudC5fdG9GdWxsSlNPTih1bmRlZmluZWQsIHRydWUpO1xuICAgICAgaWYgKHBhcmVudC5fbG9jYWxJZCkge1xuICAgICAgICBqc29uLl9sb2NhbElkID0gcGFyZW50Ll9sb2NhbElkO1xuICAgICAgfVxuICAgICAgY2hpbGRyZW5bcGFyZW50S2V5XSA9IGpzb247XG4gICAgICBmb3IgKGNvbnN0IG9iamVjdEtleSBpbiBjaGlsZHJlbikge1xuICAgICAgICBvYmplY3RLZXlzLnB1c2gob2JqZWN0S2V5KTtcbiAgICAgICAgdG9QaW5Qcm9taXNlcy5wdXNoKHRoaXMucGluV2l0aE5hbWUob2JqZWN0S2V5LCBbY2hpbGRyZW5bb2JqZWN0S2V5XV0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZnJvbVBpblByb21pc2UgPSB0aGlzLmZyb21QaW5XaXRoTmFtZShwaW5OYW1lKTtcbiAgICBjb25zdCBbcGlubmVkXSA9IGF3YWl0IF9wcm9taXNlLmRlZmF1bHQuYWxsKFtmcm9tUGluUHJvbWlzZSwgdG9QaW5Qcm9taXNlc10pO1xuICAgIGNvbnN0IHRvUGluID0gWy4uLm5ldyBfc2V0LmRlZmF1bHQoWy4uLihwaW5uZWQgfHwgW10pLCAuLi5vYmplY3RLZXlzXSldO1xuICAgIHJldHVybiB0aGlzLnBpbldpdGhOYW1lKHBpbk5hbWUsIHRvUGluKTtcbiAgfSxcbiAgLy8gUmVtb3ZlcyBvYmplY3QgYW5kIGNoaWxkcmVuIGtleXMgZnJvbSBwaW4gbmFtZVxuICAvLyBLZWVwcyB0aGUgb2JqZWN0IGFuZCBjaGlsZHJlbiBwaW5uZWRcbiAgYXN5bmMgX2hhbmRsZVVuUGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gYXdhaXQgdGhpcy5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICBjb25zdCBwaW5OYW1lID0gdGhpcy5nZXRQaW5OYW1lKG5hbWUpO1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgbGV0IG9iamVjdEtleXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBvYmplY3RzKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldENoaWxkcmVuKHBhcmVudCk7XG4gICAgICBjb25zdCBwYXJlbnRLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChwYXJlbnQpO1xuICAgICAgb2JqZWN0S2V5cy5wdXNoKHBhcmVudEtleSwgLi4uKDAsIF9rZXlzLmRlZmF1bHQpKGNoaWxkcmVuKSk7XG4gICAgfVxuICAgIG9iamVjdEtleXMgPSBbLi4ubmV3IF9zZXQuZGVmYXVsdChvYmplY3RLZXlzKV07XG4gICAgbGV0IHBpbm5lZCA9IGxvY2FsRGF0YXN0b3JlW3Bpbk5hbWVdIHx8IFtdO1xuICAgIHBpbm5lZCA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKHBpbm5lZCkuY2FsbChwaW5uZWQsIGl0ZW0gPT4gISgwLCBfaW5jbHVkZXMuZGVmYXVsdCkob2JqZWN0S2V5cykuY2FsbChvYmplY3RLZXlzLCBpdGVtKSk7XG4gICAgaWYgKHBpbm5lZC5sZW5ndGggPT0gMCkge1xuICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnVuUGluV2l0aE5hbWUocGluTmFtZSkpO1xuICAgICAgZGVsZXRlIGxvY2FsRGF0YXN0b3JlW3Bpbk5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHRoaXMucGluV2l0aE5hbWUocGluTmFtZSwgcGlubmVkKSk7XG4gICAgICBsb2NhbERhdGFzdG9yZVtwaW5OYW1lXSA9IHBpbm5lZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvYmplY3RLZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgICAgbGV0IGhhc1JlZmVyZW5jZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4gfHwgKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIF9Mb2NhbERhdGFzdG9yZVV0aWxzLlBJTl9QUkVGSVgpKSB7XG4gICAgICAgICAgY29uc3QgcGlubmVkT2JqZWN0cyA9IGxvY2FsRGF0YXN0b3JlW2tleV0gfHwgW107XG4gICAgICAgICAgaWYgKCgwLCBfaW5jbHVkZXMuZGVmYXVsdCkocGlubmVkT2JqZWN0cykuY2FsbChwaW5uZWRPYmplY3RzLCBvYmplY3RLZXkpKSB7XG4gICAgICAgICAgICBoYXNSZWZlcmVuY2UgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWhhc1JlZmVyZW5jZSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMudW5QaW5XaXRoTmFtZShvYmplY3RLZXkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQuYWxsKHByb21pc2VzKTtcbiAgfSxcbiAgLy8gUmV0cmlldmUgYWxsIHBvaW50ZXIgZmllbGRzIGZyb20gb2JqZWN0IHJlY3Vyc2l2ZWx5XG4gIF9nZXRDaGlsZHJlbihvYmplY3QpIHtcbiAgICBjb25zdCBlbmNvdW50ZXJlZCA9IHt9O1xuICAgIGNvbnN0IGpzb24gPSBvYmplY3QuX3RvRnVsbEpTT04odW5kZWZpbmVkLCB0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICBpZiAoanNvbltrZXldICYmIGpzb25ba2V5XS5fX3R5cGUgJiYganNvbltrZXldLl9fdHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICAgICAgdGhpcy5fdHJhdmVyc2UoanNvbltrZXldLCBlbmNvdW50ZXJlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbmNvdW50ZXJlZDtcbiAgfSxcbiAgX3RyYXZlcnNlKG9iamVjdCwgZW5jb3VudGVyZWQpIHtcbiAgICBpZiAoIW9iamVjdC5vYmplY3RJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChvYmplY3QpO1xuICAgICAgaWYgKGVuY291bnRlcmVkW29iamVjdEtleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZW5jb3VudGVyZWRbb2JqZWN0S2V5XSA9IG9iamVjdDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBsZXQganNvbiA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKCFvYmplY3Rba2V5XSkge1xuICAgICAgICBqc29uID0gb2JqZWN0O1xuICAgICAgfVxuICAgICAgaWYgKGpzb24uX190eXBlICYmIGpzb24uX190eXBlID09PSAnT2JqZWN0Jykge1xuICAgICAgICB0aGlzLl90cmF2ZXJzZShqc29uLCBlbmNvdW50ZXJlZCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyBUcmFuc2Zvcm0ga2V5cyBpbiBwaW4gbmFtZSB0byBvYmplY3RzXG4gIGFzeW5jIF9zZXJpYWxpemVPYmplY3RzRnJvbVBpbk5hbWUobmFtZSkge1xuICAgIHZhciBfY29udGV4dDtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgY29uc3QgYWxsT2JqZWN0cyA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsRGF0YXN0b3JlKSB7XG4gICAgICBpZiAoKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIF9Mb2NhbERhdGFzdG9yZVV0aWxzLk9CSkVDVF9QUkVGSVgpKSB7XG4gICAgICAgIGFsbE9iamVjdHMucHVzaChsb2NhbERhdGFzdG9yZVtrZXldWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm4gYWxsT2JqZWN0cztcbiAgICB9XG4gICAgY29uc3QgcGluTmFtZSA9IHRoaXMuZ2V0UGluTmFtZShuYW1lKTtcbiAgICBjb25zdCBwaW5uZWQgPSBsb2NhbERhdGFzdG9yZVtwaW5OYW1lXTtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShwaW5uZWQpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VzID0gKDAsIF9tYXAuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgb2JqZWN0S2V5ID0+IHRoaXMuZnJvbVBpbldpdGhOYW1lKG9iamVjdEtleSkpO1xuICAgIGxldCBvYmplY3RzID0gYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuICAgIG9iamVjdHMgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dCA9IFtdKS5jYWxsKF9jb250ZXh0LCAuLi5vYmplY3RzKTtcbiAgICByZXR1cm4gKDAsIF9maWx0ZXIuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCBvYmplY3QgPT4gb2JqZWN0ICE9IG51bGwpO1xuICB9LFxuICAvLyBSZXBsYWNlcyBvYmplY3QgcG9pbnRlcnMgd2l0aCBwaW5uZWQgcG9pbnRlcnNcbiAgLy8gVGhlIG9iamVjdCBwb2ludGVycyBtYXkgY29udGFpbiBvbGQgZGF0YVxuICAvLyBVc2VzIEJyZWFkdGggRmlyc3QgU2VhcmNoIEFsZ29yaXRobVxuICBhc3luYyBfc2VyaWFsaXplT2JqZWN0KG9iamVjdEtleSwgbG9jYWxEYXRhc3RvcmUpIHtcbiAgICBsZXQgTERTID0gbG9jYWxEYXRhc3RvcmU7XG4gICAgaWYgKCFMRFMpIHtcbiAgICAgIExEUyA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgfVxuICAgIGlmICghTERTW29iamVjdEtleV0gfHwgTERTW29iamVjdEtleV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgcm9vdCA9IExEU1tvYmplY3RLZXldWzBdO1xuICAgIGNvbnN0IHF1ZXVlID0gW107XG4gICAgY29uc3QgbWV0YSA9IHt9O1xuICAgIGxldCB1bmlxdWVJZCA9IDA7XG4gICAgbWV0YVt1bmlxdWVJZF0gPSByb290O1xuICAgIHF1ZXVlLnB1c2godW5pcXVlSWQpO1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IG5vZGVJZCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICBjb25zdCBzdWJUcmVlUm9vdCA9IG1ldGFbbm9kZUlkXTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gc3ViVHJlZVJvb3QpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdWJUcmVlUm9vdFtmaWVsZF07XG4gICAgICAgIGlmICh2YWx1ZS5fX3R5cGUgJiYgdmFsdWUuX190eXBlID09PSAnT2JqZWN0Jykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICBpZiAoTERTW2tleV0gJiYgTERTW2tleV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRlciA9IExEU1trZXldWzBdO1xuICAgICAgICAgICAgdW5pcXVlSWQrKztcbiAgICAgICAgICAgIG1ldGFbdW5pcXVlSWRdID0gcG9pbnRlcjtcbiAgICAgICAgICAgIHN1YlRyZWVSb290W2ZpZWxkXSA9IHBvaW50ZXI7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKHVuaXF1ZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0sXG4gIC8vIENhbGxlZCB3aGVuIGFuIG9iamVjdCBpcyBzYXZlIC8gZmV0Y2hlZFxuICAvLyBVcGRhdGUgb2JqZWN0IHBpbiB2YWx1ZVxuICBhc3luYyBfdXBkYXRlT2JqZWN0SWZQaW5uZWQob2JqZWN0KSB7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChvYmplY3QpO1xuICAgIGNvbnN0IHBpbm5lZCA9IGF3YWl0IHRoaXMuZnJvbVBpbldpdGhOYW1lKG9iamVjdEtleSk7XG4gICAgaWYgKCFwaW5uZWQgfHwgcGlubmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5waW5XaXRoTmFtZShvYmplY3RLZXksIFtvYmplY3QuX3RvRnVsbEpTT04oKV0pO1xuICB9LFxuICAvLyBDYWxsZWQgd2hlbiBvYmplY3QgaXMgZGVzdHJveWVkXG4gIC8vIFVucGluIG9iamVjdCBhbmQgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIGZyb20gcGluIG5hbWVzXG4gIC8vIFRPRE86IERlc3Ryb3kgY2hpbGRyZW4/XG4gIGFzeW5jIF9kZXN0cm95T2JqZWN0SWZQaW5uZWQob2JqZWN0KSB7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0KTtcbiAgICBjb25zdCBwaW4gPSBsb2NhbERhdGFzdG9yZVtvYmplY3RLZXldO1xuICAgIGlmICghcGluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VzID0gW3RoaXMudW5QaW5XaXRoTmFtZShvYmplY3RLZXkpXTtcbiAgICBkZWxldGUgbG9jYWxEYXRhc3RvcmVbb2JqZWN0S2V5XTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbERhdGFzdG9yZSkge1xuICAgICAgaWYgKGtleSA9PT0gX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4gfHwgKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIF9Mb2NhbERhdGFzdG9yZVV0aWxzLlBJTl9QUkVGSVgpKSB7XG4gICAgICAgIGxldCBwaW5uZWQgPSBsb2NhbERhdGFzdG9yZVtrZXldIHx8IFtdO1xuICAgICAgICBpZiAoKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShwaW5uZWQpLmNhbGwocGlubmVkLCBvYmplY3RLZXkpKSB7XG4gICAgICAgICAgcGlubmVkID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgaXRlbSA9PiBpdGVtICE9PSBvYmplY3RLZXkpO1xuICAgICAgICAgIGlmIChwaW5uZWQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy51blBpbldpdGhOYW1lKGtleSkpO1xuICAgICAgICAgICAgZGVsZXRlIGxvY2FsRGF0YXN0b3JlW2tleV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5waW5XaXRoTmFtZShrZXksIHBpbm5lZCkpO1xuICAgICAgICAgICAgbG9jYWxEYXRhc3RvcmVba2V5XSA9IHBpbm5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQuYWxsKHByb21pc2VzKTtcbiAgfSxcbiAgLy8gVXBkYXRlIHBpbiBhbmQgcmVmZXJlbmNlcyBvZiB0aGUgdW5zYXZlZCBvYmplY3RcbiAgYXN5bmMgX3VwZGF0ZUxvY2FsSWRGb3JPYmplY3QobG9jYWxJZCwgb2JqZWN0KSB7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2NhbEtleSA9IGAke19Mb2NhbERhdGFzdG9yZVV0aWxzLk9CSkVDVF9QUkVGSVh9JHtvYmplY3QuY2xhc3NOYW1lfV8ke2xvY2FsSWR9YDtcbiAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChvYmplY3QpO1xuICAgIGNvbnN0IHVuc2F2ZWQgPSBhd2FpdCB0aGlzLmZyb21QaW5XaXRoTmFtZShsb2NhbEtleSk7XG4gICAgaWYgKCF1bnNhdmVkIHx8IHVuc2F2ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VzID0gW3RoaXMudW5QaW5XaXRoTmFtZShsb2NhbEtleSksIHRoaXMucGluV2l0aE5hbWUob2JqZWN0S2V5LCB1bnNhdmVkKV07XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBhd2FpdCB0aGlzLl9nZXRBbGxDb250ZW50cygpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsRGF0YXN0b3JlKSB7XG4gICAgICBpZiAoa2V5ID09PSBfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiB8fCAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuUElOX1BSRUZJWCkpIHtcbiAgICAgICAgbGV0IHBpbm5lZCA9IGxvY2FsRGF0YXN0b3JlW2tleV0gfHwgW107XG4gICAgICAgIGlmICgoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKHBpbm5lZCkuY2FsbChwaW5uZWQsIGxvY2FsS2V5KSkge1xuICAgICAgICAgIHBpbm5lZCA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKHBpbm5lZCkuY2FsbChwaW5uZWQsIGl0ZW0gPT4gaXRlbSAhPT0gbG9jYWxLZXkpO1xuICAgICAgICAgIHBpbm5lZC5wdXNoKG9iamVjdEtleSk7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnBpbldpdGhOYW1lKGtleSwgcGlubmVkKSk7XG4gICAgICAgICAgbG9jYWxEYXRhc3RvcmVba2V5XSA9IHBpbm5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuICB9LFxuICAvKipcbiAgICogVXBkYXRlcyBMb2NhbCBEYXRhc3RvcmUgZnJvbSBTZXJ2ZXJcbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuTG9jYWxEYXRhc3RvcmUudXBkYXRlRnJvbVNlcnZlcigpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQGZ1bmN0aW9uIHVwZGF0ZUZyb21TZXJ2ZXJcbiAgICogQG5hbWUgUGFyc2UuTG9jYWxEYXRhc3RvcmUudXBkYXRlRnJvbVNlcnZlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICBhc3luYyB1cGRhdGVGcm9tU2VydmVyKCkge1xuICAgIHZhciBfY29udGV4dDI7XG4gICAgaWYgKCF0aGlzLmNoZWNrSWZFbmFibGVkKCkgfHwgdGhpcy5pc1N5bmNpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBhd2FpdCB0aGlzLl9nZXRBbGxDb250ZW50cygpO1xuICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbERhdGFzdG9yZSkge1xuICAgICAgaWYgKCgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCBfTG9jYWxEYXRhc3RvcmVVdGlscy5PQkpFQ1RfUFJFRklYKSkge1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNTeW5jaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwb2ludGVyc0hhc2ggPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAvLyBJZ25vcmUgdGhlIE9CSkVDVF9QUkVGSVhcbiAgICAgIGxldCBbLCwgY2xhc3NOYW1lLCBvYmplY3RJZF0gPSBrZXkuc3BsaXQoJ18nKTtcblxuICAgICAgLy8gVXNlciBrZXkgaXMgc3BsaXQgaW50byBbICdQYXJzZScsICdMRFMnLCAnJywgJ1VzZXInLCAnb2JqZWN0SWQnIF1cbiAgICAgIGlmIChrZXkuc3BsaXQoJ18nKS5sZW5ndGggPT09IDUgJiYga2V5LnNwbGl0KCdfJylbM10gPT09ICdVc2VyJykge1xuICAgICAgICBjbGFzc05hbWUgPSAnX1VzZXInO1xuICAgICAgICBvYmplY3RJZCA9IGtleS5zcGxpdCgnXycpWzRdO1xuICAgICAgfVxuICAgICAgaWYgKCgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShvYmplY3RJZCkuY2FsbChvYmplY3RJZCwgJ2xvY2FsJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIShjbGFzc05hbWUgaW4gcG9pbnRlcnNIYXNoKSkge1xuICAgICAgICBwb2ludGVyc0hhc2hbY2xhc3NOYW1lXSA9IG5ldyBfc2V0LmRlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIHBvaW50ZXJzSGFzaFtjbGFzc05hbWVdLmFkZChvYmplY3RJZCk7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5UHJvbWlzZXMgPSAoMCwgX21hcC5kZWZhdWx0KShfY29udGV4dDIgPSAoMCwgX2tleXMuZGVmYXVsdCkocG9pbnRlcnNIYXNoKSkuY2FsbChfY29udGV4dDIsIGNsYXNzTmFtZSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RJZHMgPSAoMCwgX2Zyb20uZGVmYXVsdCkocG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0pO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgX1BhcnNlUXVlcnkuZGVmYXVsdChjbGFzc05hbWUpO1xuICAgICAgcXVlcnkubGltaXQob2JqZWN0SWRzLmxlbmd0aCk7XG4gICAgICBpZiAob2JqZWN0SWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBxdWVyeS5lcXVhbFRvKCdvYmplY3RJZCcsIG9iamVjdElkc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS5jb250YWluZWRJbignb2JqZWN0SWQnLCBvYmplY3RJZHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICgwLCBfZmluZC5kZWZhdWx0KShxdWVyeSkuY2FsbChxdWVyeSk7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IF9wcm9taXNlLmRlZmF1bHQuYWxsKHF1ZXJ5UHJvbWlzZXMpO1xuICAgICAgY29uc3Qgb2JqZWN0cyA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKFtdKS5hcHBseShbXSwgcmVzcG9uc2VzKTtcbiAgICAgIGNvbnN0IHBpblByb21pc2VzID0gKDAsIF9tYXAuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCBvYmplY3QgPT4ge1xuICAgICAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChvYmplY3QpO1xuICAgICAgICByZXR1cm4gdGhpcy5waW5XaXRoTmFtZShvYmplY3RLZXksIG9iamVjdC5fdG9GdWxsSlNPTigpKTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwocGluUHJvbWlzZXMpO1xuICAgICAgdGhpcy5pc1N5bmNpbmcgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3luY2luZyBMb2NhbERhdGFzdG9yZTogJywgZXJyb3IpO1xuICAgICAgdGhpcy5pc1N5bmNpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIGdldEtleUZvck9iamVjdChvYmplY3QpIHtcbiAgICBjb25zdCBvYmplY3RJZCA9IG9iamVjdC5vYmplY3RJZCB8fCBvYmplY3QuX2dldElkKCk7XG4gICAgcmV0dXJuIGAke19Mb2NhbERhdGFzdG9yZVV0aWxzLk9CSkVDVF9QUkVGSVh9JHtvYmplY3QuY2xhc3NOYW1lfV8ke29iamVjdElkfWA7XG4gIH0sXG4gIGdldFBpbk5hbWUocGluTmFtZSkge1xuICAgIGlmICghcGluTmFtZSB8fCBwaW5OYW1lID09PSBfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTikge1xuICAgICAgcmV0dXJuIF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOO1xuICAgIH1cbiAgICByZXR1cm4gX0xvY2FsRGF0YXN0b3JlVXRpbHMuUElOX1BSRUZJWCArIHBpbk5hbWU7XG4gIH0sXG4gIGNoZWNrSWZFbmFibGVkKCkge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNFbmFibGVkO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBMb2NhbERhdGFzdG9yZTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IExvY2FsRGF0YXN0b3JlO1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKF9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIuZGVmYXVsdCk7XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRMb2NhbERhdGFzdG9yZShMb2NhbERhdGFzdG9yZSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX3JlZHVjZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvcmVkdWNlXCIpKTtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVVdGlscyA9IHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlVXRpbHNcIik7XG52YXIgX1N0b3JhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VcIikpO1xuY29uc3QgTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyID0ge1xuICBhc3luYyBmcm9tUGluV2l0aE5hbWUobmFtZSkge1xuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKG5hbWUpO1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdHMgPSBKU09OLnBhcnNlKHZhbHVlcyk7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH0sXG4gIHBpbldpdGhOYW1lKG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3QgdmFsdWVzID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkodmFsdWUpO1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhuYW1lLCB2YWx1ZXMpO1xuICB9LFxuICB1blBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5yZW1vdmVJdGVtQXN5bmMobmFtZSk7XG4gIH0sXG4gIGFzeW5jIGdldEFsbENvbnRlbnRzKCkge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIHJldHVybiAoMCwgX3JlZHVjZS5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGFzeW5jIChwcmV2aW91c1Byb21pc2UsIGtleSkgPT4ge1xuICAgICAgY29uc3QgTERTID0gYXdhaXQgcHJldmlvdXNQcm9taXNlO1xuICAgICAgaWYgKCgwLCBfTG9jYWxEYXRhc3RvcmVVdGlscy5pc0xvY2FsRGF0YXN0b3JlS2V5KShrZXkpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMoa2V5KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBMRFNba2V5XSA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdldEFsbENvbnRlbnRzOiAnLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBMRFM7XG4gICAgfSwgX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHt9KSk7XG4gIH0sXG4gIC8vIFVzZWQgZm9yIHRlc3RpbmdcbiAgYXN5bmMgZ2V0UmF3U3RvcmFnZSgpIHtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICByZXR1cm4gKDAsIF9yZWR1Y2UuZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBhc3luYyAocHJldmlvdXNQcm9taXNlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IExEUyA9IGF3YWl0IHByZXZpb3VzUHJvbWlzZTtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMoa2V5KTtcbiAgICAgIExEU1trZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gTERTO1xuICAgIH0sIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh7fSkpO1xuICB9LFxuICBhc3luYyBjbGVhcigpIHtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmICgoMCwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuaXNMb2NhbERhdGFzdG9yZUtleSkoa2V5KSkge1xuICAgICAgICB0b1JlbW92ZS5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VzID0gKDAsIF9tYXAuZGVmYXVsdCkodG9SZW1vdmUpLmNhbGwodG9SZW1vdmUsIHRoaXMudW5QaW5XaXRoTmFtZSk7XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQuYWxsKHByb21pc2VzKTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyLnJlYWN0LW5hdGl2ZVwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5kZWZhdWx0XCIpKTtcbmxldCBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIgPSBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyMi5kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMgPSBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9Mb2NhbERhdGFzdG9yZVV0aWxzID0gcmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVVdGlsc1wiKTtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VDb250cm9sbGVyLnJlYWN0LW5hdGl2ZVwiKSk7XG5jb25zdCBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jIGZyb21QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKG5hbWUpO1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdHMgPSBKU09OLnBhcnNlKHZhbHVlcyk7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH0sXG4gIGFzeW5jIHBpbldpdGhOYW1lKG5hbWUsIHZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHZhbHVlKTtcbiAgICAgIGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LnNldEl0ZW1Bc3luYyhuYW1lLCB2YWx1ZXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFF1b3RhIGV4Y2VlZGVkLCBwb3NzaWJseSBkdWUgdG8gU2FmYXJpIFByaXZhdGUgQnJvd3NpbmcgbW9kZVxuICAgICAgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfSxcbiAgdW5QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LnJlbW92ZUl0ZW1Bc3luYyhuYW1lKTtcbiAgfSxcbiAgYXN5bmMgZ2V0QWxsQ29udGVudHMoKSB7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIGNvbnN0IGJhdGNoID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKCgwLCBfTG9jYWxEYXRhc3RvcmVVdGlscy5pc0xvY2FsRGF0YXN0b3JlS2V5KShrZXkpKSB7XG4gICAgICAgIGJhdGNoLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgTERTID0ge307XG4gICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0cyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0Lm11bHRpR2V0KGJhdGNoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0QWxsQ29udGVudHM6ICcsIGVycm9yKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHJlc3VsdHMpLmNhbGwocmVzdWx0cywgcGFpciA9PiB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYWlyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgTERTW2tleV0gPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIExEU1trZXldID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gTERTO1xuICB9LFxuICAvLyBVc2VkIGZvciB0ZXN0aW5nXG4gIGFzeW5jIGdldFJhd1N0b3JhZ2UoKSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICBjb25zdCBzdG9yYWdlID0ge307XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0Lm11bHRpR2V0KGtleXMpO1xuICAgICgwLCBfbWFwLmRlZmF1bHQpKF9jb250ZXh0ID0gcmVzdWx0cykuY2FsbChfY29udGV4dCwgcGFpciA9PiB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYWlyO1xuICAgICAgc3RvcmFnZVtrZXldID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0b3JhZ2U7XG4gIH0sXG4gIGFzeW5jIGNsZWFyKCkge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICBjb25zdCBiYXRjaCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmICgoMCwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuaXNMb2NhbERhdGFzdG9yZUtleSkoa2V5KSkge1xuICAgICAgICBiYXRjaC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0Lm11bHRpUmVtb3ZlKGJhdGNoKS5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKCdFcnJvciBjbGVhcmluZyBsb2NhbCBkYXRhc3RvcmU6ICcsIGVycm9yKSk7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5QSU5fUFJFRklYID0gZXhwb3J0cy5PQkpFQ1RfUFJFRklYID0gZXhwb3J0cy5ERUZBVUxUX1BJTiA9IHZvaWQgMDtcbmV4cG9ydHMuaXNMb2NhbERhdGFzdG9yZUtleSA9IGlzTG9jYWxEYXRhc3RvcmVLZXk7XG52YXIgX3N0YXJ0c1dpdGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3N0YXJ0cy13aXRoXCIpKTtcbmNvbnN0IERFRkFVTFRfUElOID0gZXhwb3J0cy5ERUZBVUxUX1BJTiA9ICdfZGVmYXVsdCc7XG5jb25zdCBQSU5fUFJFRklYID0gZXhwb3J0cy5QSU5fUFJFRklYID0gJ3BhcnNlUGluXyc7XG5jb25zdCBPQkpFQ1RfUFJFRklYID0gZXhwb3J0cy5PQkpFQ1RfUFJFRklYID0gJ1BhcnNlX0xEU18nO1xuZnVuY3Rpb24gaXNMb2NhbERhdGFzdG9yZUtleShrZXkpIHtcbiAgcmV0dXJuICEhKGtleSAmJiAoa2V5ID09PSBERUZBVUxUX1BJTiB8fCAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgUElOX1BSRUZJWCkgfHwgKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIE9CSkVDVF9QUkVGSVgpKSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY29tbWl0U2VydmVyQ2hhbmdlcyA9IGNvbW1pdFNlcnZlckNoYW5nZXM7XG5leHBvcnRzLmRlZmF1bHRTdGF0ZSA9IGRlZmF1bHRTdGF0ZTtcbmV4cG9ydHMuZXN0aW1hdGVBdHRyaWJ1dGUgPSBlc3RpbWF0ZUF0dHJpYnV0ZTtcbmV4cG9ydHMuZXN0aW1hdGVBdHRyaWJ1dGVzID0gZXN0aW1hdGVBdHRyaWJ1dGVzO1xuZXhwb3J0cy5tZXJnZUZpcnN0UGVuZGluZ1N0YXRlID0gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucG9wUGVuZGluZ1N0YXRlID0gcG9wUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wdXNoUGVuZGluZ1N0YXRlID0gcHVzaFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMuc2V0UGVuZGluZ09wID0gc2V0UGVuZGluZ09wO1xuZXhwb3J0cy5zZXRTZXJ2ZXJEYXRhID0gc2V0U2VydmVyRGF0YTtcbnZhciBfaW5jbHVkZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfZW5jb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbmNvZGVcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xudmFyIF9UYXNrUXVldWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1Rhc2tRdWV1ZVwiKSk7XG52YXIgX1BhcnNlT3AgPSByZXF1aXJlKFwiLi9QYXJzZU9wXCIpO1xuZnVuY3Rpb24gZGVmYXVsdFN0YXRlKCkge1xuICByZXR1cm4ge1xuICAgIHNlcnZlckRhdGE6IHt9LFxuICAgIHBlbmRpbmdPcHM6IFt7fV0sXG4gICAgb2JqZWN0Q2FjaGU6IHt9LFxuICAgIHRhc2tzOiBuZXcgX1Rhc2tRdWV1ZS5kZWZhdWx0KCksXG4gICAgZXhpc3RlZDogZmFsc2VcbiAgfTtcbn1cbmZ1bmN0aW9uIHNldFNlcnZlckRhdGEoc2VydmVyRGF0YSwgYXR0cmlidXRlcykge1xuICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlc1thdHRyXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHNlcnZlckRhdGFbYXR0cl0gPSBhdHRyaWJ1dGVzW2F0dHJdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc2VydmVyRGF0YVthdHRyXTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFBlbmRpbmdPcChwZW5kaW5nT3BzLCBhdHRyLCBvcCkge1xuICBjb25zdCBsYXN0ID0gcGVuZGluZ09wcy5sZW5ndGggLSAxO1xuICBpZiAob3ApIHtcbiAgICBwZW5kaW5nT3BzW2xhc3RdW2F0dHJdID0gb3A7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIHBlbmRpbmdPcHNbbGFzdF1bYXR0cl07XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQZW5kaW5nU3RhdGUocGVuZGluZ09wcykge1xuICBwZW5kaW5nT3BzLnB1c2goe30pO1xufVxuZnVuY3Rpb24gcG9wUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpIHtcbiAgY29uc3QgZmlyc3QgPSBwZW5kaW5nT3BzLnNoaWZ0KCk7XG4gIGlmICghcGVuZGluZ09wcy5sZW5ndGgpIHtcbiAgICBwZW5kaW5nT3BzWzBdID0ge307XG4gIH1cbiAgcmV0dXJuIGZpcnN0O1xufVxuZnVuY3Rpb24gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKSB7XG4gIGNvbnN0IGZpcnN0ID0gcG9wUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xuICBjb25zdCBuZXh0ID0gcGVuZGluZ09wc1swXTtcbiAgZm9yIChjb25zdCBhdHRyIGluIGZpcnN0KSB7XG4gICAgaWYgKG5leHRbYXR0cl0gJiYgZmlyc3RbYXR0cl0pIHtcbiAgICAgIGNvbnN0IG1lcmdlZCA9IG5leHRbYXR0cl0ubWVyZ2VXaXRoKGZpcnN0W2F0dHJdKTtcbiAgICAgIGlmIChtZXJnZWQpIHtcbiAgICAgICAgbmV4dFthdHRyXSA9IG1lcmdlZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFthdHRyXSA9IGZpcnN0W2F0dHJdO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXN0aW1hdGVBdHRyaWJ1dGUoc2VydmVyRGF0YSwgcGVuZGluZ09wcywgb2JqZWN0LCBhdHRyKSB7XG4gIGxldCB2YWx1ZSA9IHNlcnZlckRhdGFbYXR0cl07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZ09wcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChwZW5kaW5nT3BzW2ldW2F0dHJdKSB7XG4gICAgICBpZiAocGVuZGluZ09wc1tpXVthdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlJlbGF0aW9uT3ApIHtcbiAgICAgICAgaWYgKG9iamVjdC5pZCkge1xuICAgICAgICAgIHZhbHVlID0gcGVuZGluZ09wc1tpXVthdHRyXS5hcHBseVRvKHZhbHVlLCBvYmplY3QsIGF0dHIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHBlbmRpbmdPcHNbaV1bYXR0cl0uYXBwbHlUbyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGVzdGltYXRlQXR0cmlidXRlcyhzZXJ2ZXJEYXRhLCBwZW5kaW5nT3BzLCBvYmplY3QpIHtcbiAgY29uc3QgZGF0YSA9IHt9O1xuICBmb3IgKHZhciBhdHRyIGluIHNlcnZlckRhdGEpIHtcbiAgICBkYXRhW2F0dHJdID0gc2VydmVyRGF0YVthdHRyXTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmdPcHMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGF0dHIgaW4gcGVuZGluZ09wc1tpXSkge1xuICAgICAgaWYgKHBlbmRpbmdPcHNbaV1bYXR0cl0gaW5zdGFuY2VvZiBfUGFyc2VPcC5SZWxhdGlvbk9wKSB7XG4gICAgICAgIGlmIChvYmplY3QuaWQpIHtcbiAgICAgICAgICBkYXRhW2F0dHJdID0gcGVuZGluZ09wc1tpXVthdHRyXS5hcHBseVRvKGRhdGFbYXR0cl0sIG9iamVjdCwgYXR0cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKGF0dHIpLmNhbGwoYXR0ciwgJy4nKSkge1xuICAgICAgICAgIC8vIHNpbWlsYXIgdG8gbmVzdGVkU2V0IGZ1bmN0aW9uXG4gICAgICAgICAgY29uc3QgZmllbGRzID0gYXR0ci5zcGxpdCgnLicpO1xuICAgICAgICAgIGNvbnN0IGxhc3QgPSBmaWVsZHNbZmllbGRzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGxldCBvYmplY3QgPSBkYXRhO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgaWYgKCEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV4dEtleSA9IGZpZWxkc1tpICsgMV07XG4gICAgICAgICAgICAgIGlmICghaXNOYU4obmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IFtdO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0ge307XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqZWN0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBbLi4ub2JqZWN0W2tleV1dO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0ge1xuICAgICAgICAgICAgICAgICAgLi4ub2JqZWN0W2tleV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0W2xhc3RdID0gcGVuZGluZ09wc1tpXVthdHRyXS5hcHBseVRvKG9iamVjdFtsYXN0XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YVthdHRyXSA9IHBlbmRpbmdPcHNbaV1bYXR0cl0uYXBwbHlUbyhkYXRhW2F0dHJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBBbGxvd3Mgc2V0dGluZyBwcm9wZXJ0aWVzL3ZhcmlhYmxlcyBkZWVwIGluIGFuIG9iamVjdC5cbiAqIENvbnZlcnRzIGEuYiBpbnRvIHsgYTogeyBiOiB2YWx1ZSB9IH0gZm9yIGRvdCBub3RhdGlvbiBvbiBPYmplY3RzXG4gKiBDb252ZXJ0cyBhLjAuYiBpbnRvIHsgYTogW3sgYjogdmFsdWUgfV0gfSBmb3IgZG90IG5vdGF0aW9uIG9uIEFycmF5c1xuICpcbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBhc3NpZ24gdGhlIHZhbHVlIHRvXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gYXNzaWduLiBJZiBpdCdzIGluIGEgZGVlcGVyIHBhdGgsIHRoZW4gdXNlIGRvdCBub3RhdGlvbiAoYHByb3AxLnByb3AyLnByb3AzYClcbiAqIE5vdGUgdGhhdCBpbnRlcm1lZGlhdGUgb2JqZWN0KHMpIGluIHRoZSBuZXN0ZWQgcGF0aCBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGlmIHRoZXkgZG9uJ3QgZXhpc3QuXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi4gSWYgaXQncyBhbiBgdW5kZWZpbmVkYCB0aGVuIHRoZSBrZXkgaXMgZGVsZXRlZC5cbiAqL1xuZnVuY3Rpb24gbmVzdGVkU2V0KG9iaiwga2V5LCB2YWx1ZSkge1xuICBjb25zdCBwYXRocyA9IGtleS5zcGxpdCgnLicpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHBhdGggPSBwYXRoc1tpXTtcbiAgICBpZiAoIShwYXRoIGluIG9iaikpIHtcbiAgICAgIGNvbnN0IG5leHRQYXRoID0gcGF0aHNbaSArIDFdO1xuICAgICAgaWYgKCFpc05hTihuZXh0UGF0aCkpIHtcbiAgICAgICAgb2JqW3BhdGhdID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpbcGF0aF0gPSB7fTtcbiAgICAgIH1cbiAgICB9XG4gICAgb2JqID0gb2JqW3BhdGhdO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGVsZXRlIG9ialtwYXRoc1twYXRocy5sZW5ndGggLSAxXV07XG4gIH0gZWxzZSB7XG4gICAgb2JqW3BhdGhzW3BhdGhzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjb21taXRTZXJ2ZXJDaGFuZ2VzKHNlcnZlckRhdGEsIG9iamVjdENhY2hlLCBjaGFuZ2VzKSB7XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgZm9yIChjb25zdCBhdHRyIGluIGNoYW5nZXMpIHtcbiAgICBjb25zdCB2YWwgPSBjaGFuZ2VzW2F0dHJdO1xuICAgIG5lc3RlZFNldChzZXJ2ZXJEYXRhLCBhdHRyLCB2YWwpO1xuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgISh2YWwgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkgJiYgISh2YWwgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQpICYmICEodmFsIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkpIHtcbiAgICAgIGNvbnN0IGpzb24gPSAoMCwgX2VuY29kZS5kZWZhdWx0KSh2YWwsIGZhbHNlLCB0cnVlKTtcbiAgICAgIG9iamVjdENhY2hlW2F0dHJdID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoanNvbik7XG4gICAgfVxuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2ZpbHRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmlsdGVyXCIpKTtcbnZhciBfc2xpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NsaWNlXCIpKTtcbnZhciBfaXNJbnRlZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9udW1iZXIvaXMtaW50ZWdlclwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX2VxdWFscyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZXF1YWxzXCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VQb2x5Z29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVBvbHlnb25cIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbi8qKlxuICogY29udGFpbnMgLS0gRGV0ZXJtaW5lcyBpZiBhbiBvYmplY3QgaXMgY29udGFpbmVkIGluIGEgbGlzdCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFBhcnNlIHBvaW50ZXJzLlxuICpcbiAqIEBwYXJhbSBoYXlzdGFja1xuICogQHBhcmFtIG5lZWRsZVxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjb250YWlucyhoYXlzdGFjaywgbmVlZGxlKSB7XG4gIGlmIChuZWVkbGUgJiYgbmVlZGxlLl9fdHlwZSAmJiAobmVlZGxlLl9fdHlwZSA9PT0gJ1BvaW50ZXInIHx8IG5lZWRsZS5fX3R5cGUgPT09ICdPYmplY3QnKSkge1xuICAgIGZvciAoY29uc3QgaSBpbiBoYXlzdGFjaykge1xuICAgICAgY29uc3QgcHRyID0gaGF5c3RhY2tbaV07XG4gICAgICBpZiAodHlwZW9mIHB0ciA9PT0gJ3N0cmluZycgJiYgcHRyID09PSBuZWVkbGUub2JqZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHRyLmNsYXNzTmFtZSA9PT0gbmVlZGxlLmNsYXNzTmFtZSAmJiBwdHIub2JqZWN0SWQgPT09IG5lZWRsZS5vYmplY3RJZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkobmVlZGxlKSkge1xuICAgIGZvciAoY29uc3QgbmVlZCBvZiBuZWVkbGUpIHtcbiAgICAgIGlmIChjb250YWlucyhoYXlzdGFjaywgbmVlZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAoMCwgX2luZGV4T2YuZGVmYXVsdCkoaGF5c3RhY2spLmNhbGwoaGF5c3RhY2ssIG5lZWRsZSkgPiAtMTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybU9iamVjdChvYmplY3QpIHtcbiAgaWYgKG9iamVjdC5fdG9GdWxsSlNPTikge1xuICAgIHJldHVybiBvYmplY3QuX3RvRnVsbEpTT04oKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG4vKipcbiAqIG1hdGNoZXNRdWVyeSAtLSBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCB3b3VsZCBiZSByZXR1cm5lZCBieSBhIFBhcnNlIFF1ZXJ5XG4gKiBJdCdzIGEgbGlnaHR3ZWlnaHQsIHdoZXJlLWNsYXVzZSBvbmx5IGltcGxlbWVudGF0aW9uIG9mIGEgZnVsbCBxdWVyeSBlbmdpbmUuXG4gKiBTaW5jZSB3ZSBmaW5kIHF1ZXJpZXMgdGhhdCBtYXRjaCBvYmplY3RzLCByYXRoZXIgdGhhbiBvYmplY3RzIHRoYXQgbWF0Y2hcbiAqIHF1ZXJpZXMsIHdlIGNhbiBhdm9pZCBidWlsZGluZyBhIGZ1bGwtYmxvd24gcXVlcnkgdG9vbC5cbiAqXG4gKiBAcGFyYW0gY2xhc3NOYW1lXG4gKiBAcGFyYW0gb2JqZWN0XG4gKiBAcGFyYW0gb2JqZWN0c1xuICogQHBhcmFtIHF1ZXJ5XG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNRdWVyeShjbGFzc05hbWUsIG9iamVjdCwgb2JqZWN0cywgcXVlcnkpIHtcbiAgaWYgKG9iamVjdC5jbGFzc05hbWUgIT09IGNsYXNzTmFtZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsZXQgb2JqID0gb2JqZWN0O1xuICBsZXQgcSA9IHF1ZXJ5O1xuICBpZiAob2JqZWN0LnRvSlNPTikge1xuICAgIG9iaiA9IG9iamVjdC50b0pTT04oKTtcbiAgfVxuICBpZiAocXVlcnkudG9KU09OKSB7XG4gICAgcSA9IHF1ZXJ5LnRvSlNPTigpLndoZXJlO1xuICB9XG4gIG9iai5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gIGZvciAoY29uc3QgZmllbGQgaW4gcSkge1xuICAgIGlmICghbWF0Y2hlc0tleUNvbnN0cmFpbnRzKGNsYXNzTmFtZSwgb2JqLCBvYmplY3RzLCBmaWVsZCwgcVtmaWVsZF0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZXF1YWxPYmplY3RzR2VuZXJpYyhvYmosIGNvbXBhcmVUbywgZXFsRm4pIHtcbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvYmopKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlcWxGbihvYmpbaV0sIGNvbXBhcmVUbykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZXFsRm4ob2JqLCBjb21wYXJlVG8pO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIFJlbGF0aXZlVGltZVRvRGF0ZVJlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0YXR1cyBUaGUgY29udmVyc2lvbiBzdGF0dXMsIGBlcnJvcmAgaWYgY29udmVyc2lvbiBmYWlsZWQgb3JcbiAqIGBzdWNjZXNzYCBpZiBjb252ZXJzaW9uIHN1Y2NlZWRlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbmZvIFRoZSBlcnJvciBtZXNzYWdlIGlmIGNvbnZlcnNpb24gZmFpbGVkLCBvciB0aGUgcmVsYXRpdmVcbiAqIHRpbWUgaW5kaWNhdGlvbiAoYHBhc3RgLCBgcHJlc2VudGAsIGBmdXR1cmVgKSBpZiBjb252ZXJzaW9uIHN1Y2NlZWRlZC5cbiAqIEBwcm9wZXJ0eSB7RGF0ZXx1bmRlZmluZWR9IHJlc3VsdCBUaGUgY29udmVydGVkIGRhdGUsIG9yIGB1bmRlZmluZWRgIGlmIGNvbnZlcnNpb25cbiAqIGZhaWxlZC5cbiAqL1xuLyoqXG4gKiBDb252ZXJ0cyBodW1hbiByZWFkYWJsZSByZWxhdGl2ZSBkYXRlIHN0cmluZywgZm9yIGV4YW1wbGUsICdpbiAxMCBkYXlzJyB0byBhIGRhdGVcbiAqIHJlbGF0aXZlIHRvIG5vdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUaGUgdGV4dCB0byBjb252ZXJ0LlxuICogQHBhcmFtIHtEYXRlfSBbbm93XSBUaGUgZGF0ZSBmcm9tIHdoaWNoIGFkZCBvciBzdWJ0cmFjdC4gRGVmYXVsdCBpcyBub3cuXG4gKiBAcmV0dXJucyB7UmVsYXRpdmVUaW1lVG9EYXRlUmVzdWx0fVxuICovXG5mdW5jdGlvbiByZWxhdGl2ZVRpbWVUb0RhdGUodGV4dCkge1xuICBsZXQgbm93ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBuZXcgRGF0ZSgpO1xuICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBsZXQgcGFydHMgPSB0ZXh0LnNwbGl0KCcgJyk7XG5cbiAgLy8gRmlsdGVyIG91dCB3aGl0ZXNwYWNlXG4gIHBhcnRzID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkocGFydHMpLmNhbGwocGFydHMsIHBhcnQgPT4gcGFydCAhPT0gJycpO1xuICBjb25zdCBmdXR1cmUgPSBwYXJ0c1swXSA9PT0gJ2luJztcbiAgY29uc3QgcGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID09PSAnYWdvJztcbiAgaWYgKCFmdXR1cmUgJiYgIXBhc3QgJiYgdGV4dCAhPT0gJ25vdycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgaW5mbzogXCJUaW1lIHNob3VsZCBlaXRoZXIgc3RhcnQgd2l0aCAnaW4nIG9yIGVuZCB3aXRoICdhZ28nXCJcbiAgICB9O1xuICB9XG4gIGlmIChmdXR1cmUgJiYgcGFzdCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBpbmZvOiBcIlRpbWUgY2Fubm90IGhhdmUgYm90aCAnaW4nIGFuZCAnYWdvJ1wiXG4gICAgfTtcbiAgfVxuXG4gIC8vIHN0cmlwIHRoZSAnYWdvJyBvciAnaW4nXG4gIGlmIChmdXR1cmUpIHtcbiAgICBwYXJ0cyA9ICgwLCBfc2xpY2UuZGVmYXVsdCkocGFydHMpLmNhbGwocGFydHMsIDEpO1xuICB9IGVsc2Uge1xuICAgIC8vIHBhc3RcbiAgICBwYXJ0cyA9ICgwLCBfc2xpY2UuZGVmYXVsdCkocGFydHMpLmNhbGwocGFydHMsIDAsIHBhcnRzLmxlbmd0aCAtIDEpO1xuICB9XG4gIGlmIChwYXJ0cy5sZW5ndGggJSAyICE9PSAwICYmIHRleHQgIT09ICdub3cnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIGluZm86ICdJbnZhbGlkIHRpbWUgc3RyaW5nLiBEYW5nbGluZyB1bml0IG9yIG51bWJlci4nXG4gICAgfTtcbiAgfVxuICBjb25zdCBwYWlycyA9IFtdO1xuICB3aGlsZSAocGFydHMubGVuZ3RoKSB7XG4gICAgcGFpcnMucHVzaChbcGFydHMuc2hpZnQoKSwgcGFydHMuc2hpZnQoKV0pO1xuICB9XG4gIGxldCBzZWNvbmRzID0gMDtcbiAgZm9yIChjb25zdCBbbnVtLCBpbnRlcnZhbF0gb2YgcGFpcnMpIHtcbiAgICBjb25zdCB2YWwgPSBOdW1iZXIobnVtKTtcbiAgICBpZiAoISgwLCBfaXNJbnRlZ2VyLmRlZmF1bHQpKHZhbCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgaW5mbzogYCcke251bX0nIGlzIG5vdCBhbiBpbnRlZ2VyLmBcbiAgICAgIH07XG4gICAgfVxuICAgIHN3aXRjaCAoaW50ZXJ2YWwpIHtcbiAgICAgIGNhc2UgJ3lyJzpcbiAgICAgIGNhc2UgJ3lycyc6XG4gICAgICBjYXNlICd5ZWFyJzpcbiAgICAgIGNhc2UgJ3llYXJzJzpcbiAgICAgICAgc2Vjb25kcyArPSB2YWwgKiAzMTUzNjAwMDsgLy8gMzY1ICogMjQgKiA2MCAqIDYwXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2snOlxuICAgICAgY2FzZSAnd2tzJzpcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDYwNDgwMDsgLy8gNyAqIDI0ICogNjAgKiA2MFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2QnOlxuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDg2NDAwOyAvLyAyNCAqIDYwICogNjBcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdocic6XG4gICAgICBjYXNlICdocnMnOlxuICAgICAgY2FzZSAnaG91cic6XG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIHNlY29uZHMgKz0gdmFsICogMzYwMDsgLy8gNjAgKiA2MFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbic6XG4gICAgICBjYXNlICdtaW5zJzpcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgc2Vjb25kcyArPSB2YWwgKiA2MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWMnOlxuICAgICAgY2FzZSAnc2Vjcyc6XG4gICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIHNlY29uZHMgKz0gdmFsO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgIGluZm86IGBJbnZhbGlkIGludGVydmFsOiAnJHtpbnRlcnZhbH0nYFxuICAgICAgICB9O1xuICAgIH1cbiAgfVxuICBjb25zdCBtaWxsaXNlY29uZHMgPSBzZWNvbmRzICogMTAwMDtcbiAgaWYgKGZ1dHVyZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgIGluZm86ICdmdXR1cmUnLFxuICAgICAgcmVzdWx0OiBuZXcgRGF0ZShub3cudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzKVxuICAgIH07XG4gIH0gZWxzZSBpZiAocGFzdCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgIGluZm86ICdwYXN0JyxcbiAgICAgIHJlc3VsdDogbmV3IERhdGUobm93LnZhbHVlT2YoKSAtIG1pbGxpc2Vjb25kcylcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgIGluZm86ICdwcmVzZW50JyxcbiAgICAgIHJlc3VsdDogbmV3IERhdGUobm93LnZhbHVlT2YoKSlcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9iamVjdCBtYXRjaGVzIGEgc2luZ2xlIGtleSdzIGNvbnN0cmFpbnRzXG4gKlxuICogQHBhcmFtIGNsYXNzTmFtZVxuICogQHBhcmFtIG9iamVjdFxuICogQHBhcmFtIG9iamVjdHNcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBjb25zdHJhaW50c1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBtYXRjaGVzS2V5Q29uc3RyYWludHMoY2xhc3NOYW1lLCBvYmplY3QsIG9iamVjdHMsIGtleSwgY29uc3RyYWludHMpIHtcbiAgaWYgKGNvbnN0cmFpbnRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgJy4nKSA+PSAwKSB7XG4gICAgLy8gS2V5IHJlZmVyZW5jZXMgYSBzdWJvYmplY3RcbiAgICBjb25zdCBrZXlDb21wb25lbnRzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgY29uc3Qgc3ViT2JqZWN0S2V5ID0ga2V5Q29tcG9uZW50c1swXTtcbiAgICBjb25zdCBrZXlSZW1haW5kZXIgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKGtleUNvbXBvbmVudHMpLmNhbGwoa2V5Q29tcG9uZW50cywgMSkuam9pbignLicpO1xuICAgIHJldHVybiBtYXRjaGVzS2V5Q29uc3RyYWludHMoY2xhc3NOYW1lLCBvYmplY3Rbc3ViT2JqZWN0S2V5XSB8fCB7fSwgb2JqZWN0cywga2V5UmVtYWluZGVyLCBjb25zdHJhaW50cyk7XG4gIH1cbiAgbGV0IGk7XG4gIGlmIChrZXkgPT09ICckb3InKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobWF0Y2hlc1F1ZXJ5KGNsYXNzTmFtZSwgb2JqZWN0LCBvYmplY3RzLCBjb25zdHJhaW50c1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSAnJGFuZCcpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghbWF0Y2hlc1F1ZXJ5KGNsYXNzTmFtZSwgb2JqZWN0LCBvYmplY3RzLCBjb25zdHJhaW50c1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoa2V5ID09PSAnJG5vcicpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChtYXRjaGVzUXVlcnkoY2xhc3NOYW1lLCBvYmplY3QsIG9iamVjdHMsIGNvbnN0cmFpbnRzW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChrZXkgPT09ICckcmVsYXRlZFRvJykge1xuICAgIC8vIEJhaWwhIFdlIGNhbid0IGhhbmRsZSByZWxhdGlvbmFsIHF1ZXJpZXMgbG9jYWxseVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIS9eW0EtWmEtel1bMC05QS1aYS16X10qJC8udGVzdChrZXkpKSB7XG4gICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0tFWV9OQU1FLCBgSW52YWxpZCBLZXk6ICR7a2V5fWApO1xuICB9XG4gIC8vIEVxdWFsaXR5IChvciBBcnJheSBjb250YWlucykgY2FzZXNcbiAgaWYgKHR5cGVvZiBjb25zdHJhaW50cyAhPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9iamVjdFtrZXldKSkge1xuICAgICAgdmFyIF9jb250ZXh0O1xuICAgICAgcmV0dXJuICgwLCBfaW5kZXhPZi5kZWZhdWx0KShfY29udGV4dCA9IG9iamVjdFtrZXldKS5jYWxsKF9jb250ZXh0LCBjb25zdHJhaW50cykgPiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBjb25zdHJhaW50cztcbiAgfVxuICBsZXQgY29tcGFyZVRvO1xuICBpZiAoY29uc3RyYWludHMuX190eXBlKSB7XG4gICAgaWYgKGNvbnN0cmFpbnRzLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICByZXR1cm4gZXF1YWxPYmplY3RzR2VuZXJpYyhvYmplY3Rba2V5XSwgY29uc3RyYWludHMsIGZ1bmN0aW9uIChvYmosIHB0cikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiAhPT0gJ3VuZGVmaW5lZCcgJiYgcHRyLmNsYXNzTmFtZSA9PT0gb2JqLmNsYXNzTmFtZSAmJiBwdHIub2JqZWN0SWQgPT09IG9iai5vYmplY3RJZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZXF1YWxPYmplY3RzR2VuZXJpYygoMCwgX2RlY29kZS5kZWZhdWx0KShvYmplY3Rba2V5XSksICgwLCBfZGVjb2RlLmRlZmF1bHQpKGNvbnN0cmFpbnRzKSwgX2VxdWFscy5kZWZhdWx0KTtcbiAgfVxuICAvLyBNb3JlIGNvbXBsZXggY2FzZXNcbiAgZm9yIChjb25zdCBjb25kaXRpb24gaW4gY29uc3RyYWludHMpIHtcbiAgICBjb21wYXJlVG8gPSBjb25zdHJhaW50c1tjb25kaXRpb25dO1xuICAgIGlmIChjb21wYXJlVG8/Ll9fdHlwZSkge1xuICAgICAgY29tcGFyZVRvID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkoY29tcGFyZVRvKTtcbiAgICB9XG4gICAgLy8gaXMgaXQgYSAkcmVsYXRpdmVUaW1lPyBjb252ZXJ0IHRvIGRhdGVcbiAgICBpZiAoY29tcGFyZVRvPy5bJyRyZWxhdGl2ZVRpbWUnXSkge1xuICAgICAgY29uc3QgcGFyc2VyUmVzdWx0ID0gcmVsYXRpdmVUaW1lVG9EYXRlKGNvbXBhcmVUb1snJHJlbGF0aXZlVGltZSddKTtcbiAgICAgIGlmIChwYXJzZXJSZXN1bHQuc3RhdHVzICE9PSAnc3VjY2VzcycpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0pTT04sIGBiYWQgJHJlbGF0aXZlVGltZSAoJHtrZXl9KSB2YWx1ZS4gJHtwYXJzZXJSZXN1bHQuaW5mb31gKTtcbiAgICAgIH1cbiAgICAgIGNvbXBhcmVUbyA9IHBhcnNlclJlc3VsdC5yZXN1bHQ7XG4gICAgfVxuICAgIC8vIENvbXBhcmUgRGF0ZSBPYmplY3Qgb3IgRGF0ZSBTdHJpbmdcbiAgICBpZiAodG9TdHJpbmcuY2FsbChjb21wYXJlVG8pID09PSAnW29iamVjdCBEYXRlXScgfHwgdHlwZW9mIGNvbXBhcmVUbyA9PT0gJ3N0cmluZycgJiZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbmV3IERhdGUoY29tcGFyZVRvKSAhPT0gJ0ludmFsaWQgRGF0ZScgJiZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgIWlzTmFOKG5ldyBEYXRlKGNvbXBhcmVUbykpKSB7XG4gICAgICBvYmplY3Rba2V5XSA9IG5ldyBEYXRlKG9iamVjdFtrZXldLmlzbyA/IG9iamVjdFtrZXldLmlzbyA6IG9iamVjdFtrZXldKTtcbiAgICB9XG4gICAgc3dpdGNoIChjb25kaXRpb24pIHtcbiAgICAgIGNhc2UgJyRsdCc6XG4gICAgICAgIGlmIChvYmplY3Rba2V5XSA+PSBjb21wYXJlVG8pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckbHRlJzpcbiAgICAgICAgaWYgKG9iamVjdFtrZXldID4gY29tcGFyZVRvKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGd0JzpcbiAgICAgICAgaWYgKG9iamVjdFtrZXldIDw9IGNvbXBhcmVUbykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRndGUnOlxuICAgICAgICBpZiAob2JqZWN0W2tleV0gPCBjb21wYXJlVG8pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckbmUnOlxuICAgICAgICBpZiAoKDAsIF9lcXVhbHMuZGVmYXVsdCkob2JqZWN0W2tleV0sIGNvbXBhcmVUbykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckaW4nOlxuICAgICAgICBpZiAoIWNvbnRhaW5zKGNvbXBhcmVUbywgb2JqZWN0W2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJG5pbic6XG4gICAgICAgIGlmIChjb250YWlucyhjb21wYXJlVG8sIG9iamVjdFtrZXldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRhbGwnOlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcGFyZVRvLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9jb250ZXh0MjtcbiAgICAgICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKF9jb250ZXh0MiA9IG9iamVjdFtrZXldKS5jYWxsKF9jb250ZXh0MiwgY29tcGFyZVRvW2ldKSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckZXhpc3RzJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5RXhpc3RzID0gdHlwZW9mIG9iamVjdFtrZXldICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgICBjb25zdCBleGlzdGVuY2VJc1JlcXVpcmVkID0gY29uc3RyYWludHNbJyRleGlzdHMnXTtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbnN0cmFpbnRzWyckZXhpc3RzJ10gIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgLy8gVGhlIFNESyB3aWxsIG5ldmVyIHN1Ym1pdCBhIG5vbi1ib29sZWFuIGZvciAkZXhpc3RzLCBidXQgaWYgc29tZW9uZVxuICAgICAgICAgICAgLy8gdHJpZXMgdG8gc3VibWl0IGEgbm9uLWJvb2xlYW4gZm9yICRleGl0cyBvdXRzaWRlIHRoZSBTREtzLCBqdXN0IGlnbm9yZSBpdC5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXByb3BlcnR5RXhpc3RzICYmIGV4aXN0ZW5jZUlzUmVxdWlyZWQgfHwgcHJvcGVydHlFeGlzdHMgJiYgIWV4aXN0ZW5jZUlzUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRyZWdleCc6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbXBhcmVUbyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlVG8udGVzdChvYmplY3Rba2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEpTIGRvZXNuJ3Qgc3VwcG9ydCBwZXJsLXN0eWxlIGVzY2FwaW5nXG4gICAgICAgICAgbGV0IGV4cFN0cmluZyA9ICcnO1xuICAgICAgICAgIGxldCBlc2NhcGVFbmQgPSAtMjtcbiAgICAgICAgICBsZXQgZXNjYXBlU3RhcnQgPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkoY29tcGFyZVRvKS5jYWxsKGNvbXBhcmVUbywgJ1xcXFxRJyk7XG4gICAgICAgICAgd2hpbGUgKGVzY2FwZVN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIEFkZCB0aGUgdW5lc2NhcGVkIHBvcnRpb25cbiAgICAgICAgICAgIGV4cFN0cmluZyArPSBjb21wYXJlVG8uc3Vic3RyaW5nKGVzY2FwZUVuZCArIDIsIGVzY2FwZVN0YXJ0KTtcbiAgICAgICAgICAgIGVzY2FwZUVuZCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShjb21wYXJlVG8pLmNhbGwoY29tcGFyZVRvLCAnXFxcXEUnLCBlc2NhcGVTdGFydCk7XG4gICAgICAgICAgICBpZiAoZXNjYXBlRW5kID4gLTEpIHtcbiAgICAgICAgICAgICAgZXhwU3RyaW5nICs9IGNvbXBhcmVUby5zdWJzdHJpbmcoZXNjYXBlU3RhcnQgKyAyLCBlc2NhcGVFbmQpLnJlcGxhY2UoL1xcXFxcXFxcXFxcXFxcXFxFL2csICdcXFxcRScpLnJlcGxhY2UoL1xcVy9nLCAnXFxcXCQmJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlc2NhcGVTdGFydCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShjb21wYXJlVG8pLmNhbGwoY29tcGFyZVRvLCAnXFxcXFEnLCBlc2NhcGVFbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBleHBTdHJpbmcgKz0gY29tcGFyZVRvLnN1YnN0cmluZyhNYXRoLm1heChlc2NhcGVTdGFydCwgZXNjYXBlRW5kICsgMikpO1xuICAgICAgICAgIGxldCBtb2RpZmllcnMgPSBjb25zdHJhaW50cy4kb3B0aW9ucyB8fCAnJztcbiAgICAgICAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMucmVwbGFjZSgneCcsICcnKS5yZXBsYWNlKCdzJywgJycpO1xuICAgICAgICAgIC8vIFBhcnNlIFNlcnZlciAvIE1vbmdvIHN1cHBvcnQgeCBhbmQgcyBtb2RpZmllcnMgYnV0IEpTIFJlZ0V4cCBkb2Vzbid0XG4gICAgICAgICAgY29uc3QgZXhwID0gbmV3IFJlZ0V4cChleHBTdHJpbmcsIG1vZGlmaWVycyk7XG4gICAgICAgICAgaWYgKCFleHAudGVzdChvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRuZWFyU3BoZXJlJzpcbiAgICAgICAge1xuICAgICAgICAgIGlmICghY29tcGFyZVRvIHx8ICFvYmplY3Rba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGNvbXBhcmVUby5yYWRpYW5zVG8ob2JqZWN0W2tleV0pO1xuICAgICAgICAgIGNvbnN0IG1heCA9IGNvbnN0cmFpbnRzLiRtYXhEaXN0YW5jZSB8fCBJbmZpbml0eTtcbiAgICAgICAgICByZXR1cm4gZGlzdGFuY2UgPD0gbWF4O1xuICAgICAgICB9XG4gICAgICBjYXNlICckd2l0aGluJzpcbiAgICAgICAge1xuICAgICAgICAgIGlmICghY29tcGFyZVRvIHx8ICFvYmplY3Rba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzb3V0aFdlc3QgPSBjb21wYXJlVG8uJGJveFswXTtcbiAgICAgICAgICBjb25zdCBub3J0aEVhc3QgPSBjb21wYXJlVG8uJGJveFsxXTtcbiAgICAgICAgICBpZiAoc291dGhXZXN0LmxhdGl0dWRlID4gbm9ydGhFYXN0LmxhdGl0dWRlIHx8IHNvdXRoV2VzdC5sb25naXR1ZGUgPiBub3J0aEVhc3QubG9uZ2l0dWRlKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGJveCwgY3Jvc3NlcyB0aGUgZGF0ZSBsaW5lXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvYmplY3Rba2V5XS5sYXRpdHVkZSA+IHNvdXRoV2VzdC5sYXRpdHVkZSAmJiBvYmplY3Rba2V5XS5sYXRpdHVkZSA8IG5vcnRoRWFzdC5sYXRpdHVkZSAmJiBvYmplY3Rba2V5XS5sb25naXR1ZGUgPiBzb3V0aFdlc3QubG9uZ2l0dWRlICYmIG9iamVjdFtrZXldLmxvbmdpdHVkZSA8IG5vcnRoRWFzdC5sb25naXR1ZGU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRvcHRpb25zJzpcbiAgICAgICAgLy8gTm90IGEgcXVlcnkgdHlwZSwgYnV0IGEgd2F5IHRvIGFkZCBvcHRpb25zIHRvICRyZWdleC4gSWdub3JlIGFuZFxuICAgICAgICAvLyBhdm9pZCB0aGUgZGVmYXVsdFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRtYXhEaXN0YW5jZSc6XG4gICAgICAgIC8vIE5vdCBhIHF1ZXJ5IHR5cGUsIGJ1dCBhIHdheSB0byBhZGQgYSBjYXAgdG8gJG5lYXJTcGhlcmUuIElnbm9yZSBhbmRcbiAgICAgICAgLy8gYXZvaWQgdGhlIGRlZmF1bHRcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckc2VsZWN0JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHN1YlF1ZXJ5T2JqZWN0cyA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgKG9iaiwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNRdWVyeShjb21wYXJlVG8ucXVlcnkuY2xhc3NOYW1lLCBvYmosIGFyciwgY29tcGFyZVRvLnF1ZXJ5LndoZXJlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YlF1ZXJ5T2JqZWN0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViT2JqZWN0ID0gdHJhbnNmb3JtT2JqZWN0KHN1YlF1ZXJ5T2JqZWN0c1tpXSk7XG4gICAgICAgICAgICByZXR1cm4gKDAsIF9lcXVhbHMuZGVmYXVsdCkob2JqZWN0W2tleV0sIHN1Yk9iamVjdFtjb21wYXJlVG8ua2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJGRvbnRTZWxlY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgc3ViUXVlcnlPYmplY3RzID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCAob2JqLCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1F1ZXJ5KGNvbXBhcmVUby5xdWVyeS5jbGFzc05hbWUsIG9iaiwgYXJyLCBjb21wYXJlVG8ucXVlcnkud2hlcmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUXVlcnlPYmplY3RzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJPYmplY3QgPSB0cmFuc2Zvcm1PYmplY3Qoc3ViUXVlcnlPYmplY3RzW2ldKTtcbiAgICAgICAgICAgIHJldHVybiAhKDAsIF9lcXVhbHMuZGVmYXVsdCkob2JqZWN0W2tleV0sIHN1Yk9iamVjdFtjb21wYXJlVG8ua2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJGluUXVlcnknOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgc3ViUXVlcnlPYmplY3RzID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCAob2JqLCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1F1ZXJ5KGNvbXBhcmVUby5jbGFzc05hbWUsIG9iaiwgYXJyLCBjb21wYXJlVG8ud2hlcmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUXVlcnlPYmplY3RzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJPYmplY3QgPSB0cmFuc2Zvcm1PYmplY3Qoc3ViUXVlcnlPYmplY3RzW2ldKTtcbiAgICAgICAgICAgIGlmIChvYmplY3Rba2V5XS5jbGFzc05hbWUgPT09IHN1Yk9iamVjdC5jbGFzc05hbWUgJiYgb2JqZWN0W2tleV0ub2JqZWN0SWQgPT09IHN1Yk9iamVjdC5vYmplY3RJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckbm90SW5RdWVyeSc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBzdWJRdWVyeU9iamVjdHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIChvYmosIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzUXVlcnkoY29tcGFyZVRvLmNsYXNzTmFtZSwgb2JqLCBhcnIsIGNvbXBhcmVUby53aGVyZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJRdWVyeU9iamVjdHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Yk9iamVjdCA9IHRyYW5zZm9ybU9iamVjdChzdWJRdWVyeU9iamVjdHNbaV0pO1xuICAgICAgICAgICAgaWYgKG9iamVjdFtrZXldLmNsYXNzTmFtZSA9PT0gc3ViT2JqZWN0LmNsYXNzTmFtZSAmJiBvYmplY3Rba2V5XS5vYmplY3RJZCA9PT0gc3ViT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRjb250YWluZWRCeSc6XG4gICAgICAgIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zKGNvbXBhcmVUbywgdmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRnZW9XaXRoaW4nOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVUby4kcG9seWdvbikge1xuICAgICAgICAgICAgdmFyIF9jb250ZXh0MztcbiAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9ICgwLCBfbWFwLmRlZmF1bHQpKF9jb250ZXh0MyA9IGNvbXBhcmVUby4kcG9seWdvbikuY2FsbChfY29udGV4dDMsIGdlb1BvaW50ID0+IFtnZW9Qb2ludC5sYXRpdHVkZSwgZ2VvUG9pbnQubG9uZ2l0dWRlXSk7XG4gICAgICAgICAgICBjb25zdCBwb2x5Z29uID0gbmV3IF9QYXJzZVBvbHlnb24uZGVmYXVsdChwb2ludHMpO1xuICAgICAgICAgICAgcmV0dXJuIHBvbHlnb24uY29udGFpbnNQb2ludChvYmplY3Rba2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb21wYXJlVG8uJGNlbnRlclNwaGVyZSkge1xuICAgICAgICAgICAgY29uc3QgW1dHUzg0UG9pbnQsIG1heERpc3RhbmNlXSA9IGNvbXBhcmVUby4kY2VudGVyU3BoZXJlO1xuICAgICAgICAgICAgY29uc3QgY2VudGVyUG9pbnQgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCh7XG4gICAgICAgICAgICAgIGxhdGl0dWRlOiBXR1M4NFBvaW50WzFdLFxuICAgICAgICAgICAgICBsb25naXR1ZGU6IFdHUzg0UG9pbnRbMF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHBvaW50LnJhZGlhbnNUbyhjZW50ZXJQb2ludCk7XG4gICAgICAgICAgICByZXR1cm4gZGlzdGFuY2UgPD0gbWF4RGlzdGFuY2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJGdlb0ludGVyc2VjdHMnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcG9seWdvbiA9IG5ldyBfUGFyc2VQb2x5Z29uLmRlZmF1bHQob2JqZWN0W2tleV0uY29vcmRpbmF0ZXMpO1xuICAgICAgICAgIGNvbnN0IHBvaW50ID0gbmV3IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQoY29tcGFyZVRvLiRwb2ludCk7XG4gICAgICAgICAgcmV0dXJuIHBvbHlnb24uY29udGFpbnNQb2ludChwb2ludCk7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVF1ZXJ5KHF1ZXJ5KSB7XG4gIHZhciBfY29udGV4dDQ7XG4gIGxldCBxID0gcXVlcnk7XG4gIGlmIChxdWVyeS50b0pTT04pIHtcbiAgICBxID0gcXVlcnkudG9KU09OKCkud2hlcmU7XG4gIH1cbiAgY29uc3Qgc3BlY2lhbFF1ZXJ5a2V5cyA9IFsnJGFuZCcsICckb3InLCAnJG5vcicsICdfcnBlcm0nLCAnX3dwZXJtJywgJ19wZXJpc2hhYmxlX3Rva2VuJywgJ19lbWFpbF92ZXJpZnlfdG9rZW4nLCAnX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0JywgJ19hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdCcsICdfZmFpbGVkX2xvZ2luX2NvdW50J107XG4gICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDQgPSAoMCwgX2tleXMuZGVmYXVsdCkocSkpLmNhbGwoX2NvbnRleHQ0LCBrZXkgPT4ge1xuICAgIGlmIChxICYmIHFba2V5XSAmJiBxW2tleV0uJHJlZ2V4KSB7XG4gICAgICBpZiAodHlwZW9mIHFba2V5XS4kb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKCFxW2tleV0uJG9wdGlvbnMubWF0Y2goL15baW14c10rJC8pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX1FVRVJZLCBgQmFkICRvcHRpb25zIHZhbHVlIGZvciBxdWVyeTogJHtxW2tleV0uJG9wdGlvbnN9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShzcGVjaWFsUXVlcnlrZXlzKS5jYWxsKHNwZWNpYWxRdWVyeWtleXMsIGtleSkgPCAwICYmICFrZXkubWF0Y2goL15bYS16QS1aXVthLXpBLVowLTlfXFwuXSokLykpIHtcbiAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9LRVlfTkFNRSwgYEludmFsaWQga2V5IG5hbWU6ICR7a2V5fWApO1xuICAgIH1cbiAgfSk7XG59XG5jb25zdCBPZmZsaW5lUXVlcnkgPSB7XG4gIG1hdGNoZXNRdWVyeTogbWF0Y2hlc1F1ZXJ5LFxuICB2YWxpZGF0ZVF1ZXJ5OiB2YWxpZGF0ZVF1ZXJ5XG59O1xubW9kdWxlLmV4cG9ydHMgPSBPZmZsaW5lUXVlcnk7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBPZmZsaW5lUXVlcnk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfV2Vha01hcCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3dlYWstbWFwXCIpO1xudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2RlY29kZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX2VuY29kZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX0NyeXB0b0NvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NyeXB0b0NvbnRyb2xsZXJcIikpO1xudmFyIF9FdmVudHVhbGx5UXVldWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0V2ZW50dWFsbHlRdWV1ZVwiKSk7XG52YXIgX0luZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9JbmRleGVkREJTdG9yYWdlQ29udHJvbGxlclwiKSk7XG52YXIgX0luc3RhbGxhdGlvbkNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0luc3RhbGxhdGlvbkNvbnRyb2xsZXJcIikpO1xudmFyIFBhcnNlT3AgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9QYXJzZU9wXCIpKTtcbnZhciBfUkVTVENvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1JFU1RDb250cm9sbGVyXCIpKTtcbnZhciBfUGFyc2VBQ0wgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQUNMXCIpKTtcbnZhciBBbmFseXRpY3MgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9BbmFseXRpY3NcIikpO1xudmFyIF9Bbm9ueW1vdXNVdGlscyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQW5vbnltb3VzVXRpbHNcIikpO1xudmFyIENsb3VkID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vQ2xvdWRcIikpO1xudmFyIF9QYXJzZUNMUCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VDTFBcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9FdmVudEVtaXR0ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0V2ZW50RW1pdHRlclwiKSk7XG52YXIgX1BhcnNlQ29uZmlnID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUNvbmZpZ1wiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9GYWNlYm9va1V0aWxzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9GYWNlYm9va1V0aWxzXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIEhvb2tzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vUGFyc2VIb29rc1wiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xudmFyIF9QYXJzZVBvbHlnb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUG9seWdvblwiKSk7XG52YXIgX1BhcnNlSW5zdGFsbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUluc3RhbGxhdGlvblwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgUHVzaCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL1B1c2hcIikpO1xudmFyIF9QYXJzZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVF1ZXJ5XCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG52YXIgX1BhcnNlUm9sZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSb2xlXCIpKTtcbnZhciBfUGFyc2VTY2hlbWEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlU2NoZW1hXCIpKTtcbnZhciBfUGFyc2VTZXNzaW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVNlc3Npb25cIikpO1xudmFyIF9TdG9yYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlXCIpKTtcbnZhciBfUGFyc2VVc2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVVzZXJcIikpO1xudmFyIF9QYXJzZUxpdmVRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VMaXZlUXVlcnlcIikpO1xudmFyIF9MaXZlUXVlcnlDbGllbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xpdmVRdWVyeUNsaWVudFwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyXCIpKTtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VDb250cm9sbGVyXCIpKTtcbnZhciBfV2ViU29ja2V0Q29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vV2ViU29ja2V0Q29udHJvbGxlclwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoZSkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBfV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gIHZhciByID0gbmV3IF9XZWFrTWFwKCksXG4gICAgdCA9IG5ldyBfV2Vha01hcCgpO1xuICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGUgPyB0IDogcjtcbiAgfSkoZSk7XG59XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChlLCByKSB7XG4gIGlmICghciAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgIGRlZmF1bHQ6IGVcbiAgfTtcbiAgdmFyIHQgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUocik7XG4gIGlmICh0ICYmIHQuaGFzKGUpKSByZXR1cm4gdC5nZXQoZSk7XG4gIHZhciBuID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbFxuICB9O1xuICBmb3IgKHZhciB1IGluIGUpIGlmIChcImRlZmF1bHRcIiAhPT0gdSAmJiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHUpKSB7XG4gICAgdmFyIGkgPSBfT2JqZWN0JGRlZmluZVByb3BlcnR5ICYmIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID8gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdSkgOiBudWxsO1xuICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IF9PYmplY3QkZGVmaW5lUHJvcGVydHkobiwgdSwgaSkgOiBuW3VdID0gZVt1XTtcbiAgfVxuICByZXR1cm4gbi5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCBuKSwgbjtcbn1cbi8qKlxuICogQ29udGFpbnMgYWxsIFBhcnNlIEFQSSBjbGFzc2VzIGFuZCBmdW5jdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQGdsb2JhbFxuICogQGNsYXNzXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cblxuY29uc3QgUGFyc2UgPSB7XG4gIEFDTDogX1BhcnNlQUNMLmRlZmF1bHQsXG4gIEFuYWx5dGljczogQW5hbHl0aWNzLFxuICBBbm9ueW1vdXNVdGlsczogX0Fub255bW91c1V0aWxzLmRlZmF1bHQsXG4gIENsb3VkOiBDbG91ZCxcbiAgQ0xQOiBfUGFyc2VDTFAuZGVmYXVsdCxcbiAgQ29yZU1hbmFnZXI6IF9Db3JlTWFuYWdlci5kZWZhdWx0LFxuICBDb25maWc6IF9QYXJzZUNvbmZpZy5kZWZhdWx0LFxuICBFcnJvcjogX1BhcnNlRXJyb3IuZGVmYXVsdCxcbiAgRmFjZWJvb2tVdGlsczogX0ZhY2Vib29rVXRpbHMuZGVmYXVsdCxcbiAgRmlsZTogX1BhcnNlRmlsZS5kZWZhdWx0LFxuICBHZW9Qb2ludDogX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCxcbiAgUG9seWdvbjogX1BhcnNlUG9seWdvbi5kZWZhdWx0LFxuICBJbnN0YWxsYXRpb246IF9QYXJzZUluc3RhbGxhdGlvbi5kZWZhdWx0LFxuICBMb2NhbERhdGFzdG9yZTogX0xvY2FsRGF0YXN0b3JlLmRlZmF1bHQsXG4gIE9iamVjdDogX1BhcnNlT2JqZWN0LmRlZmF1bHQsXG4gIE9wOiB7XG4gICAgU2V0OiBQYXJzZU9wLlNldE9wLFxuICAgIFVuc2V0OiBQYXJzZU9wLlVuc2V0T3AsXG4gICAgSW5jcmVtZW50OiBQYXJzZU9wLkluY3JlbWVudE9wLFxuICAgIEFkZDogUGFyc2VPcC5BZGRPcCxcbiAgICBSZW1vdmU6IFBhcnNlT3AuUmVtb3ZlT3AsXG4gICAgQWRkVW5pcXVlOiBQYXJzZU9wLkFkZFVuaXF1ZU9wLFxuICAgIFJlbGF0aW9uOiBQYXJzZU9wLlJlbGF0aW9uT3BcbiAgfSxcbiAgUHVzaDogUHVzaCxcbiAgUXVlcnk6IF9QYXJzZVF1ZXJ5LmRlZmF1bHQsXG4gIFJlbGF0aW9uOiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0LFxuICBSb2xlOiBfUGFyc2VSb2xlLmRlZmF1bHQsXG4gIFNjaGVtYTogX1BhcnNlU2NoZW1hLmRlZmF1bHQsXG4gIFNlc3Npb246IF9QYXJzZVNlc3Npb24uZGVmYXVsdCxcbiAgU3RvcmFnZTogX1N0b3JhZ2UuZGVmYXVsdCxcbiAgVXNlcjogX1BhcnNlVXNlci5kZWZhdWx0LFxuICBMaXZlUXVlcnlDbGllbnQ6IF9MaXZlUXVlcnlDbGllbnQuZGVmYXVsdCxcbiAgSW5kZXhlZERCOiB1bmRlZmluZWQsXG4gIEhvb2tzOiB1bmRlZmluZWQsXG4gIFBhcnNlOiB1bmRlZmluZWQsXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtFdmVudHVhbGx5UXVldWV9IFBhcnNlLkV2ZW50dWFsbHlRdWV1ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgRXZlbnR1YWxseVF1ZXVlKHF1ZXVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0RXZlbnR1YWxseVF1ZXVlKHF1ZXVlKTtcbiAgfSxcbiAgZ2V0IEV2ZW50dWFsbHlRdWV1ZSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnR1YWxseVF1ZXVlKCk7XG4gIH0sXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgbWV0aG9kIGZpcnN0IHRvIHNldCB1cCB5b3VyIGF1dGhlbnRpY2F0aW9uIHRva2VucyBmb3IgUGFyc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBsaWNhdGlvbklkIFlvdXIgUGFyc2UgQXBwbGljYXRpb24gSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbamF2YVNjcmlwdEtleV0gWW91ciBQYXJzZSBKYXZhU2NyaXB0IEtleSAoTm90IG5lZWRlZCBmb3IgcGFyc2Utc2VydmVyKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21hc3RlcktleV0gWW91ciBQYXJzZSBNYXN0ZXIgS2V5LiAoTm9kZS5qcyBvbmx5ISlcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgaW5pdGlhbGl6ZShhcHBsaWNhdGlvbklkLCBqYXZhU2NyaXB0S2V5KSB7XG4gICAgaWYgKFwiYnJvd3NlclwiID09PSAnYnJvd3NlcicgJiYgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJU19OT0RFJykgJiYgIXByb2Nlc3MuZW52LlNFUlZFUl9SRU5ERVJJTkcpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAgIGNvbnNvbGUubG9nKFwiSXQgbG9va3MgbGlrZSB5b3UncmUgdXNpbmcgdGhlIGJyb3dzZXIgdmVyc2lvbiBvZiB0aGUgU0RLIGluIGEgXCIgKyBcIm5vZGUuanMgZW52aXJvbm1lbnQuIFlvdSBzaG91bGQgcmVxdWlyZSgncGFyc2Uvbm9kZScpIGluc3RlYWQuXCIpO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gICAgfVxuICAgIFBhcnNlLl9pbml0aWFsaXplKGFwcGxpY2F0aW9uSWQsIGphdmFTY3JpcHRLZXkpO1xuICB9LFxuICBfaW5pdGlhbGl6ZShhcHBsaWNhdGlvbklkLCBqYXZhU2NyaXB0S2V5LCBtYXN0ZXJLZXkpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0FQUExJQ0FUSU9OX0lEJywgYXBwbGljYXRpb25JZCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdKQVZBU0NSSVBUX0tFWScsIGphdmFTY3JpcHRLZXkpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnTUFTVEVSX0tFWScsIG1hc3RlcktleSk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdVU0VfTUFTVEVSX0tFWScsIGZhbHNlKTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnRXZlbnRFbWl0dGVyJywgX0V2ZW50RW1pdHRlci5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnTGl2ZVF1ZXJ5JywgbmV3IF9QYXJzZUxpdmVRdWVyeS5kZWZhdWx0KCkpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdDcnlwdG9Db250cm9sbGVyJywgX0NyeXB0b0NvbnRyb2xsZXIuZGVmYXVsdCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ0V2ZW50dWFsbHlRdWV1ZScsIF9FdmVudHVhbGx5UXVldWUuZGVmYXVsdCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ0luc3RhbGxhdGlvbkNvbnRyb2xsZXInLCBfSW5zdGFsbGF0aW9uQ29udHJvbGxlci5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyJywgX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnU3RvcmFnZUNvbnRyb2xsZXInLCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ1dlYlNvY2tldENvbnRyb2xsZXInLCBfV2ViU29ja2V0Q29udHJvbGxlci5kZWZhdWx0KTtcbiAgICBQYXJzZS5JbmRleGVkREIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXInLCBfSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdCk7XG4gIH0sXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIHNldCB5b3VyIEFzeW5jU3RvcmFnZSBlbmdpbmVcbiAgICogU3RhcnRpbmcgUGFyc2VAMS4xMSwgdGhlIFBhcnNlU0RLIGRvIG5vdCBwcm92aWRlIGEgUmVhY3QgQXN5bmNTdG9yYWdlIGFzIHRoZSBSZWFjdE5hdGl2ZSBtb2R1bGVcbiAgICogaXMgbm90IHByb3ZpZGVkIGF0IGEgc3RhYmxlIHBhdGggYW5kIGNoYW5nZXMgb3ZlciB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtBc3luY1N0b3JhZ2V9IHN0b3JhZ2UgYSByZWFjdCBuYXRpdmUgYXN5bmMgc3RvcmFnZS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0QXN5bmNTdG9yYWdlKHN0b3JhZ2UpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRBc3luY1N0b3JhZ2Uoc3RvcmFnZSk7XG4gIH0sXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIHNldCB5b3VyIExvY2FsRGF0YXN0b3JlU3RvcmFnZSBlbmdpbmVcbiAgICogSWYgdXNpbmcgUmVhY3QtTmF0aXZlIHVzZSB7QGxpbmsgUGFyc2Uuc2V0QXN5bmNTdG9yYWdlIFBhcnNlLnNldEFzeW5jU3RvcmFnZSgpfVxuICAgKlxuICAgKiBAcGFyYW0ge0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlcn0gY29udHJvbGxlciBhIGRhdGEgc3RvcmFnZS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoY29udHJvbGxlcik7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgY3VycmVudCBzZXJ2ZXIncyBoZWFsdGhcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGdldFNlcnZlckhlYWx0aCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5yZXF1ZXN0KCdHRVQnLCAnaGVhbHRoJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLmFwcGxpY2F0aW9uSWRcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGFwcGxpY2F0aW9uSWQodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0FQUExJQ0FUSU9OX0lEJywgdmFsdWUpO1xuICB9LFxuICBnZXQgYXBwbGljYXRpb25JZCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBUFBMSUNBVElPTl9JRCcpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5qYXZhU2NyaXB0S2V5XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBqYXZhU2NyaXB0S2V5KHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdKQVZBU0NSSVBUX0tFWScsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IGphdmFTY3JpcHRLZXkoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSkFWQVNDUklQVF9LRVknKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2UubWFzdGVyS2V5XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBtYXN0ZXJLZXkodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ01BU1RFUl9LRVknLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBtYXN0ZXJLZXkoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTUFTVEVSX0tFWScpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5zZXJ2ZXJVUkxcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IHNlcnZlclVSTCh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnU0VSVkVSX1VSTCcsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IHNlcnZlclVSTCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfVVJMJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLnNlcnZlckF1dGhUb2tlblxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgc2VydmVyQXV0aFRva2VuKHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdTRVJWRVJfQVVUSF9UT0tFTicsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckF1dGhUb2tlbigpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfQVVUSF9UT0tFTicpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5zZXJ2ZXJBdXRoVHlwZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgc2VydmVyQXV0aFR5cGUodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ1NFUlZFUl9BVVRIX1RZUEUnLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBzZXJ2ZXJBdXRoVHlwZSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfQVVUSF9UWVBFJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtQYXJzZUxpdmVRdWVyeX0gUGFyc2UuTGl2ZVF1ZXJ5XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBMaXZlUXVlcnkobGl2ZVF1ZXJ5KSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0TGl2ZVF1ZXJ5KGxpdmVRdWVyeSk7XG4gIH0sXG4gIGdldCBMaXZlUXVlcnkoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExpdmVRdWVyeSgpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5saXZlUXVlcnlTZXJ2ZXJVUkxcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGxpdmVRdWVyeVNlcnZlclVSTCh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnTElWRVFVRVJZX1NFUlZFUl9VUkwnLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBsaXZlUXVlcnlTZXJ2ZXJVUkwoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTElWRVFVRVJZX1NFUlZFUl9VUkwnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge2Jvb2xlYW59IFBhcnNlLmVuY3J5cHRlZFVzZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGVuY3J5cHRlZFVzZXIodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0VOQ1JZUFRFRF9VU0VSJywgdmFsdWUpO1xuICB9LFxuICBnZXQgZW5jcnlwdGVkVXNlcigpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfVVNFUicpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5zZWNyZXRcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IHNlY3JldCh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnRU5DUllQVEVEX0tFWScsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IHNlY3JldCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfS0VZJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtib29sZWFufSBQYXJzZS5pZGVtcG90ZW5jeVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgaWRlbXBvdGVuY3kodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0lERU1QT1RFTkNZJywgdmFsdWUpO1xuICB9LFxuICBnZXQgaWRlbXBvdGVuY3koKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSURFTVBPVEVOQ1knKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge2Jvb2xlYW59IFBhcnNlLmFsbG93Q3VzdG9tT2JqZWN0SWRcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGFsbG93Q3VzdG9tT2JqZWN0SWQodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0FMTE9XX0NVU1RPTV9PQkpFQ1RfSUQnLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBhbGxvd0N1c3RvbU9iamVjdElkKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FMTE9XX0NVU1RPTV9PQkpFQ1RfSUQnKTtcbiAgfSxcbiAgX3JlcXVlc3QoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5yZXF1ZXN0LmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9LFxuICBfYWpheCgpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkuYWpheC5hcHBseShudWxsLCBhcmdzKTtcbiAgfSxcbiAgLy8gV2UgYXR0ZW1wdCB0byBtYXRjaCB0aGUgc2lnbmF0dXJlcyBvZiB0aGUgbGVnYWN5IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHNcbiAgX2RlY29kZShfLCB2YWx1ZSkge1xuICAgIHJldHVybiAoMCwgX2RlY29kZTIuZGVmYXVsdCkodmFsdWUpO1xuICB9LFxuICBfZW5jb2RlKHZhbHVlLCBfLCBkaXNhbGxvd09iamVjdHMpIHtcbiAgICByZXR1cm4gKDAsIF9lbmNvZGUyLmRlZmF1bHQpKHZhbHVlLCBkaXNhbGxvd09iamVjdHMpO1xuICB9LFxuICBfZ2V0SW5zdGFsbGF0aW9uSWQoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKS5jdXJyZW50SW5zdGFsbGF0aW9uSWQoKTtcbiAgfSxcbiAgLyoqXG4gICAqIEVuYWJsZSBwaW5uaW5nIGluIHlvdXIgYXBwbGljYXRpb24uXG4gICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYFBhcnNlLmluaXRpYWxpemVgIGluIHlvdXIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBbcG9sbGluZ10gQWxsb3cgcGluZ2luZyB0aGUgc2VydmVyIC9oZWFsdGggZW5kcG9pbnQuIERlZmF1bHQgdHJ1ZVxuICAgKiBAcGFyYW0gW21zXSBNaWxsaXNlY29uZHMgdG8gcGluZyB0aGUgc2VydmVyLiBEZWZhdWx0IDIwMDBtc1xuICAgKiBAc3RhdGljXG4gICAqL1xuICBlbmFibGVMb2NhbERhdGFzdG9yZSgpIHtcbiAgICBsZXQgcG9sbGluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgICBsZXQgbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDIwMDA7XG4gICAgaWYgKCF0aGlzLmFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiJ2VuYWJsZUxvY2FsRGF0YVN0b3JlJyBtdXN0IGJlIGNhbGxlZCBhZnRlciAnaW5pdGlhbGl6ZSdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5Mb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuTG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgIGlmIChwb2xsaW5nKSB7XG4gICAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpLnBvbGwobXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBMb2NhbCBEYXRhc3RvcmUgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzTG9jYWxEYXRhc3RvcmVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLkxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZDtcbiAgfSxcbiAgLyoqXG4gICAqIEdldHMgYWxsIGNvbnRlbnRzIGZyb20gTG9jYWwgRGF0YXN0b3JlXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLmR1bXBMb2NhbERhdGFzdG9yZSgpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgZHVtcExvY2FsRGF0YXN0b3JlKCkge1xuICAgIGlmICghdGhpcy5Mb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQYXJzZS5Mb2NhbERhdGFzdG9yZS5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBFbmFibGUgdGhlIGN1cnJlbnQgdXNlciBlbmNyeXB0aW9uLlxuICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBsb2dpbiBhbnkgdXNlci5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgZW5hYmxlRW5jcnlwdGVkVXNlcigpIHtcbiAgICB0aGlzLmVuY3J5cHRlZFVzZXIgPSB0cnVlO1xuICB9LFxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIEVuY3J5cHRlZCBVc2VyIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0VuY3J5cHRlZFVzZXJFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmVuY3J5cHRlZFVzZXI7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRSRVNUQ29udHJvbGxlcihfUkVTVENvbnRyb2xsZXIuZGVmYXVsdCk7XG4vLyBGb3IgbGVnYWN5IHJlcXVpcmVzLCBvZiB0aGUgZm9ybSBgdmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2UnKS5QYXJzZWBcblBhcnNlLlBhcnNlID0gUGFyc2U7XG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2U7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuY29uc3QgUFVCTElDX0tFWSA9ICcqJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEFDTC5cbiAqIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgQUNMIGhhcyBubyBwZXJtaXNzaW9ucyBmb3IgYW55b25lLlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgUGFyc2UuVXNlciwgdGhlIEFDTCB3aWxsIGhhdmUgcmVhZCBhbmQgd3JpdGVcbiAqICAgcGVybWlzc2lvbiBmb3Igb25seSB0aGF0IHVzZXIuXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW55IG90aGVyIEpTT04gb2JqZWN0LCB0aGF0IG9iamVjdCB3aWxsIGJlIGludGVycHJldHRlZFxuICogICBhcyBhIHNlcmlhbGl6ZWQgQUNMIGNyZWF0ZWQgd2l0aCB0b0pTT04oKS5cbiAqXG4gKiA8cD5BbiBBQ0wsIG9yIEFjY2VzcyBDb250cm9sIExpc3QgY2FuIGJlIGFkZGVkIHRvIGFueVxuICogPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPiB0byByZXN0cmljdCBhY2Nlc3MgdG8gb25seSBhIHN1YnNldCBvZiB1c2Vyc1xuICogb2YgeW91ciBhcHBsaWNhdGlvbi48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLkFDTFxuICovXG5jbGFzcyBQYXJzZUFDTCB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyhQYXJzZS5Vc2VyIHwgb2JqZWN0KX0gYXJnMSBUaGUgdXNlciB0byBpbml0aWFsaXplIHRoZSBBQ0wgZm9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhcmcxKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJwZXJtaXNzaW9uc0J5SWRcIiwgdm9pZCAwKTtcbiAgICB0aGlzLnBlcm1pc3Npb25zQnlJZCA9IHt9O1xuICAgIGlmIChhcmcxICYmIHR5cGVvZiBhcmcxID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgUGFyc2VVc2VyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VVc2VyKCk7XG4gICAgICBpZiAoYXJnMSBpbnN0YW5jZW9mIFBhcnNlVXNlcikge1xuICAgICAgICB0aGlzLnNldFJlYWRBY2Nlc3MoYXJnMSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3MoYXJnMSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiBhcmcxKSB7XG4gICAgICAgICAgY29uc3QgYWNjZXNzTGlzdCA9IGFyZzFbdXNlcklkXTtcbiAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIGluIGFjY2Vzc0xpc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSBhY2Nlc3NMaXN0W3Blcm1pc3Npb25dO1xuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24gIT09ICdyZWFkJyAmJiBwZXJtaXNzaW9uICE9PSAnd3JpdGUnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIGNyZWF0ZSBhbiBBQ0wgd2l0aCBhbiBpbnZhbGlkIHBlcm1pc3Npb24gdHlwZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWxsb3dlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIGNyZWF0ZSBhbiBBQ0wgd2l0aCBhbiBpbnZhbGlkIHBlcm1pc3Npb24gdmFsdWUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdW3Blcm1pc3Npb25dID0gYWxsb3dlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcxID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXJzZUFDTCBjb25zdHJ1Y3RlZCB3aXRoIGEgZnVuY3Rpb24uIERpZCB5b3UgZm9yZ2V0ICgpPycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTi1lbmNvZGVkIHZlcnNpb24gb2YgdGhlIEFDTC5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHt9O1xuICAgIGZvciAoY29uc3QgcCBpbiB0aGlzLnBlcm1pc3Npb25zQnlJZCkge1xuICAgICAgcGVybWlzc2lvbnNbcF0gPSB0aGlzLnBlcm1pc3Npb25zQnlJZFtwXTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEFDTCBpcyBlcXVhbCB0byBhbm90aGVyIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlQUNMfSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0J3MgQUNMIHRvIGNvbXBhcmUgdG9cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFBhcnNlQUNMKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB1c2VycyA9ICgwLCBfa2V5cy5kZWZhdWx0KSh0aGlzLnBlcm1pc3Npb25zQnlJZCk7XG4gICAgY29uc3Qgb3RoZXJVc2VycyA9ICgwLCBfa2V5cy5kZWZhdWx0KShvdGhlci5wZXJtaXNzaW9uc0J5SWQpO1xuICAgIGlmICh1c2Vycy5sZW5ndGggIT09IG90aGVyVXNlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdSBpbiB0aGlzLnBlcm1pc3Npb25zQnlJZCkge1xuICAgICAgaWYgKCFvdGhlci5wZXJtaXNzaW9uc0J5SWRbdV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGVybWlzc2lvbnNCeUlkW3VdLnJlYWQgIT09IG90aGVyLnBlcm1pc3Npb25zQnlJZFt1XS5yZWFkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25zQnlJZFt1XS53cml0ZSAhPT0gb3RoZXIucGVybWlzc2lvbnNCeUlkW3VdLndyaXRlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgX3NldEFjY2VzcyhhY2Nlc3NUeXBlLCB1c2VySWQsIGFsbG93ZWQpIHtcbiAgICBjb25zdCBQYXJzZVJvbGUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVJvbGUoKTtcbiAgICBjb25zdCBQYXJzZVVzZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVVzZXIoKTtcbiAgICBpZiAodXNlcklkIGluc3RhbmNlb2YgUGFyc2VVc2VyKSB7XG4gICAgICB1c2VySWQgPSB1c2VySWQuaWQ7XG4gICAgfSBlbHNlIGlmICh1c2VySWQgaW5zdGFuY2VvZiBQYXJzZVJvbGUpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB1c2VySWQuZ2V0TmFtZSgpO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JvbGUgbXVzdCBoYXZlIGEgbmFtZScpO1xuICAgICAgfVxuICAgICAgdXNlcklkID0gJ3JvbGU6JyArIG5hbWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndXNlcklkIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWxsb3dlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhbGxvd2VkIG11c3QgYmUgZWl0aGVyIHRydWUgb3IgZmFsc2UuJyk7XG4gICAgfVxuICAgIGxldCBwZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF07XG4gICAgaWYgKCFwZXJtaXNzaW9ucykge1xuICAgICAgaWYgKCFhbGxvd2VkKSB7XG4gICAgICAgIC8vIFRoZSB1c2VyIGFscmVhZHkgZG9lc24ndCBoYXZlIHRoaXMgcGVybWlzc2lvbiwgc28gbm8gYWN0aW9uIGlzIG5lZWRlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXJtaXNzaW9ucyA9IHt9O1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdID0gcGVybWlzc2lvbnM7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxvd2VkKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdW2FjY2Vzc1R5cGVdID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHBlcm1pc3Npb25zW2FjY2Vzc1R5cGVdO1xuICAgICAgaWYgKCgwLCBfa2V5cy5kZWZhdWx0KShwZXJtaXNzaW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfZ2V0QWNjZXNzKGFjY2Vzc1R5cGUsIHVzZXJJZCkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGNvbnN0IFBhcnNlVXNlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlVXNlcigpO1xuICAgIGlmICh1c2VySWQgaW5zdGFuY2VvZiBQYXJzZVVzZXIpIHtcbiAgICAgIHVzZXJJZCA9IHVzZXJJZC5pZDtcbiAgICAgIGlmICghdXNlcklkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBhY2Nlc3MgZm9yIGEgUGFyc2VVc2VyIHdpdGhvdXQgYW4gSUQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIFBhcnNlUm9sZSkge1xuICAgICAgY29uc3QgbmFtZSA9IHVzZXJJZC5nZXROYW1lKCk7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUm9sZSBtdXN0IGhhdmUgYSBuYW1lJyk7XG4gICAgICB9XG4gICAgICB1c2VySWQgPSAncm9sZTonICsgbmFtZTtcbiAgICB9XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdO1xuICAgIGlmICghcGVybWlzc2lvbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhcGVybWlzc2lvbnNbYWNjZXNzVHlwZV07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlzIGFsbG93ZWQgdG8gcmVhZCB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhhdCB1c2VyIHNob3VsZCBoYXZlIHJlYWQgYWNjZXNzLlxuICAgKi9cbiAgc2V0UmVhZEFjY2Vzcyh1c2VySWQsIGFsbG93ZWQpIHtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ3JlYWQnLCB1c2VySWQsIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlkIGlzICpleHBsaWNpdGx5KiBhbGxvd2VkIHRvIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgdXNlciBtYXkgc3RpbGwgYmUgYWJsZSB0byBhY2Nlc3MgaXQgaWZcbiAgICogZ2V0UHVibGljUmVhZEFjY2VzcyByZXR1cm5zIHRydWUgb3IgYSByb2xlIHRoYXQgdGhlIHVzZXIgYmVsb25ncyB0byBoYXNcbiAgICogd3JpdGUgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0UmVhZEFjY2Vzcyh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKCdyZWFkJywgdXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaWQgaXMgYWxsb3dlZCB0byB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZCwgb3IgYSBQYXJzZS5Sb2xlLi5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhhdCB1c2VyIHNob3VsZCBoYXZlIHdyaXRlIGFjY2Vzcy5cbiAgICovXG4gIHNldFdyaXRlQWNjZXNzKHVzZXJJZCwgYWxsb3dlZCkge1xuICAgIHRoaXMuX3NldEFjY2Vzcygnd3JpdGUnLCB1c2VySWQsIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpZCBpcyAqZXhwbGljaXRseSogYWxsb3dlZCB0byB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICogRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB1c2VyIG1heSBzdGlsbCBiZSBhYmxlIHRvIHdyaXRlIGl0IGlmXG4gICAqIGdldFB1YmxpY1dyaXRlQWNjZXNzIHJldHVybnMgdHJ1ZSBvciBhIHJvbGUgdGhhdCB0aGUgdXNlciBiZWxvbmdzIHRvIGhhc1xuICAgKiB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRXcml0ZUFjY2Vzcyh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKCd3cml0ZScsIHVzZXJJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byByZWFkIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWRcbiAgICovXG4gIHNldFB1YmxpY1JlYWRBY2Nlc3MoYWxsb3dlZCkge1xuICAgIHRoaXMuc2V0UmVhZEFjY2VzcyhQVUJMSUNfS0VZLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0UHVibGljUmVhZEFjY2VzcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZWFkQWNjZXNzKFBVQkxJQ19LRVkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZFxuICAgKi9cbiAgc2V0UHVibGljV3JpdGVBY2Nlc3MoYWxsb3dlZCkge1xuICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3MoUFVCTElDX0tFWSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRQdWJsaWNXcml0ZUFjY2VzcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRXcml0ZUFjY2VzcyhQVUJMSUNfS0VZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHJlYWQgdGhpcyBvYmplY3QuIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm9sZSBtYXlcbiAgICogc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZiBhIHBhcmVudCByb2xlIGhhcyByZWFkIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSByb2xlIGhhcyByZWFkIGFjY2Vzcy4gZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9sZVJlYWRBY2Nlc3Mocm9sZSkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGlmIChyb2xlIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICAvLyBOb3JtYWxpemUgdG8gdGhlIFN0cmluZyBuYW1lXG4gICAgICByb2xlID0gcm9sZS5nZXROYW1lKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygcm9sZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JvbGUgbXVzdCBiZSBhIFBhcnNlUm9sZSBvciBhIFN0cmluZycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRSZWFkQWNjZXNzKCdyb2xlOicgKyByb2xlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHdyaXRlIHRoaXMgb2JqZWN0LiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvbGUgbWF5XG4gICAqIHN0aWxsIGJlIGFibGUgdG8gd3JpdGUgaXQgaWYgYSBwYXJlbnQgcm9sZSBoYXMgd3JpdGUgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJvbGUgaGFzIHdyaXRlIGFjY2Vzcy4gZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9sZVdyaXRlQWNjZXNzKHJvbGUpIHtcbiAgICBjb25zdCBQYXJzZVJvbGUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVJvbGUoKTtcbiAgICBpZiAocm9sZSBpbnN0YW5jZW9mIFBhcnNlUm9sZSkge1xuICAgICAgLy8gTm9ybWFsaXplIHRvIHRoZSBTdHJpbmcgbmFtZVxuICAgICAgcm9sZSA9IHJvbGUuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJvbGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyb2xlIG11c3QgYmUgYSBQYXJzZVJvbGUgb3IgYSBTdHJpbmcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0V3JpdGVBY2Nlc3MoJ3JvbGU6JyArIHJvbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gcmVhZCB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoZSBnaXZlbiByb2xlIGNhbiByZWFkIHRoaXMgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgc2V0Um9sZVJlYWRBY2Nlc3Mocm9sZSwgYWxsb3dlZCkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGlmIChyb2xlIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICAvLyBOb3JtYWxpemUgdG8gdGhlIFN0cmluZyBuYW1lXG4gICAgICByb2xlID0gcm9sZS5nZXROYW1lKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygcm9sZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JvbGUgbXVzdCBiZSBhIFBhcnNlUm9sZSBvciBhIFN0cmluZycpO1xuICAgIH1cbiAgICB0aGlzLnNldFJlYWRBY2Nlc3MoJ3JvbGU6JyArIHJvbGUsIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGUgZ2l2ZW4gcm9sZSBjYW4gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBzZXRSb2xlV3JpdGVBY2Nlc3Mocm9sZSwgYWxsb3dlZCkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGlmIChyb2xlIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICAvLyBOb3JtYWxpemUgdG8gdGhlIFN0cmluZyBuYW1lXG4gICAgICByb2xlID0gcm9sZS5nZXROYW1lKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygcm9sZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JvbGUgbXVzdCBiZSBhIFBhcnNlUm9sZSBvciBhIFN0cmluZycpO1xuICAgIH1cbiAgICB0aGlzLnNldFdyaXRlQWNjZXNzKCdyb2xlOicgKyByb2xlLCBhbGxvd2VkKTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VBQ0w7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9tYXBcIikpO1xudmFyIF9lbnRyaWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9lbnRyaWVzXCIpKTtcbnZhciBfYXNzaWduID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvYXNzaWduXCIpKTtcbnZhciBfc2xpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NsaWNlXCIpKTtcbnZhciBfaW5jbHVkZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpKTtcbnZhciBfZXZlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2V2ZXJ5XCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX1BhcnNlUm9sZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSb2xlXCIpKTtcbnZhciBfUGFyc2VVc2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVVzZXJcIikpO1xuY29uc3QgUFVCTElDX0tFWSA9ICcqJztcbmNvbnN0IFZBTElEX1BFUk1JU1NJT05TID0gbmV3IF9tYXAuZGVmYXVsdCgpO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCdnZXQnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2ZpbmQnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2NvdW50Jywge30pO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCdjcmVhdGUnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ3VwZGF0ZScsIHt9KTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgnZGVsZXRlJywge30pO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCdhZGRGaWVsZCcsIHt9KTtcbmNvbnN0IFZBTElEX1BFUk1JU1NJT05TX0VYVEVOREVEID0gbmV3IF9tYXAuZGVmYXVsdCgpO1xuVkFMSURfUEVSTUlTU0lPTlNfRVhURU5ERUQuc2V0KCdwcm90ZWN0ZWRGaWVsZHMnLCB7fSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBDTFAuXG4gKiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIENMUCBoYXMgbm8gcGVybWlzc2lvbnMgZm9yIGFueW9uZS5cbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIFBhcnNlLlVzZXIgb3IgUGFyc2UuUm9sZSwgdGhlIENMUCB3aWxsIGhhdmUgcmVhZCBhbmQgd3JpdGVcbiAqICAgcGVybWlzc2lvbiBmb3Igb25seSB0aGF0IHVzZXIgb3Igcm9sZS5cbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbnkgb3RoZXIgSlNPTiBvYmplY3QsIHRoYXQgb2JqZWN0IHdpbGwgYmUgaW50ZXJwcmV0dGVkXG4gKiAgIGFzIGEgc2VyaWFsaXplZCBDTFAgY3JlYXRlZCB3aXRoIHRvSlNPTigpLlxuICpcbiAqIDxwPkEgQ0xQLCBvciBDbGFzcyBMZXZlbCBQZXJtaXNzaW9ucyBjYW4gYmUgYWRkZWQgdG8gYW55XG4gKiA8Y29kZT5QYXJzZS5TY2hlbWE8L2NvZGU+IHRvIHJlc3RyaWN0IGFjY2VzcyB0byBvbmx5IGEgc3Vic2V0IG9mIHVzZXJzXG4gKiBvZiB5b3VyIGFwcGxpY2F0aW9uLjwvcD5cbiAqXG4gKiA8cD5cbiAqIEZvciBnZXQvY291bnQvZmluZC9jcmVhdGUvdXBkYXRlL2RlbGV0ZS9hZGRGaWVsZCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczpcbiAqXG4gKiBFbnRpdHkgaXMgdHlwZSBQYXJzZS5Vc2VyIG9yIFBhcnNlLlJvbGUgb3Igc3RyaW5nXG4gKiBSb2xlIGlzIHR5cGUgUGFyc2UuUm9sZSBvciBOYW1lIG9mIFBhcnNlLlJvbGVcbiAqXG4gKiBnZXRHZXRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldEdldFJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldEdldFBvaW50ZXJGaWVsZHMoKVxuICogc2V0R2V0UG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldEdldEFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldEdldEFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY0dldEFjY2VzcygpXG4gKiBzZXRQdWJsaWNHZXRBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVHZXRBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVHZXRBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldEZpbmRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldEZpbmRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRGaW5kUG9pbnRlckZpZWxkcygpXG4gKiBzZXRGaW5kUG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldEZpbmRBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXRGaW5kQWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljRmluZEFjY2VzcygpXG4gKiBzZXRQdWJsaWNGaW5kQWNjZXNzKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRSb2xlRmluZEFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZUZpbmRBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldENvdW50UmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXRDb3VudFJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldENvdW50UG9pbnRlckZpZWxkcygpXG4gKiBzZXRDb3VudFBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXRDb3VudEFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldENvdW50QWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljQ291bnRBY2Nlc3MoKVxuICogc2V0UHVibGljQ291bnRBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVDb3VudEFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZUNvdW50QWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRDcmVhdGVSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldENyZWF0ZVJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldENyZWF0ZVBvaW50ZXJGaWVsZHMoKVxuICogc2V0Q3JlYXRlUG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldENyZWF0ZUFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldENyZWF0ZUFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY0NyZWF0ZUFjY2VzcygpXG4gKiBzZXRQdWJsaWNDcmVhdGVBY2Nlc3MoYWxsb3dlZDogQm9vbGVhbilcbiAqIGdldFJvbGVDcmVhdGVBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVDcmVhdGVBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFVwZGF0ZVJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0VXBkYXRlUmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0VXBkYXRlUG9pbnRlckZpZWxkcygpXG4gKiBzZXRVcGRhdGVQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0VXBkYXRlQWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0VXBkYXRlQWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljVXBkYXRlQWNjZXNzKClcbiAqIHNldFB1YmxpY1VwZGF0ZUFjY2VzcyhhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Um9sZVVwZGF0ZUFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZVVwZGF0ZUFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0RGVsZXRlUmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXREZWxldGVSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXREZWxldGVQb2ludGVyRmllbGRzKClcbiAqIHNldERlbGV0ZVBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXREZWxldGVBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXREZWxldGVBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNEZWxldGVBY2Nlc3MoKVxuICogc2V0UHVibGljRGVsZXRlQWNjZXNzKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRSb2xlRGVsZXRlQWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlRGVsZXRlQWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRBZGRGaWVsZFJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0QWRkRmllbGRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRBZGRGaWVsZFBvaW50ZXJGaWVsZHMoKVxuICogc2V0QWRkRmllbGRQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0QWRkRmllbGRBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXRBZGRGaWVsZEFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY0FkZEZpZWxkQWNjZXNzKClcbiAqIHNldFB1YmxpY0FkZEZpZWxkQWNjZXNzKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRSb2xlQWRkRmllbGRBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVBZGRGaWVsZEFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5DTFBcbiAqL1xuY2xhc3MgUGFyc2VDTFAge1xuICAvKipcbiAgICogQHBhcmFtIHsoUGFyc2UuVXNlciB8IFBhcnNlLlJvbGUgfCBvYmplY3QpfSB1c2VySWQgVGhlIHVzZXIgdG8gaW5pdGlhbGl6ZSB0aGUgQ0xQIGZvclxuICAgKi9cbiAgY29uc3RydWN0b3IodXNlcklkKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJwZXJtaXNzaW9uc01hcFwiLCB2b2lkIDApO1xuICAgIHRoaXMucGVybWlzc2lvbnNNYXAgPSB7fTtcbiAgICAvLyBJbml0aWFsaXplIHBlcm1pc3Npb25zIE1hcCB3aXRoIGRlZmF1bHQgcGVybWlzc2lvbnNcbiAgICBmb3IgKGNvbnN0IFtvcGVyYXRpb24sIGdyb3VwXSBvZiAoMCwgX2VudHJpZXMuZGVmYXVsdCkoVkFMSURfUEVSTUlTU0lPTlMpLmNhbGwoVkFMSURfUEVSTUlTU0lPTlMpKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl0gPSAoMCwgX2Fzc2lnbi5kZWZhdWx0KSh7fSwgZ3JvdXApO1xuICAgICAgY29uc3QgYWN0aW9uID0gb3BlcmF0aW9uLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgKDAsIF9zbGljZS5kZWZhdWx0KShvcGVyYXRpb24pLmNhbGwob3BlcmF0aW9uLCAxKTtcbiAgICAgIHRoaXNbYGdldCR7YWN0aW9ufVJlcXVpcmVzQXV0aGVudGljYXRpb25gXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcyhvcGVyYXRpb24sICdyZXF1aXJlc0F1dGhlbnRpY2F0aW9uJyk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgc2V0JHthY3Rpb259UmVxdWlyZXNBdXRoZW50aWNhdGlvbmBdID0gZnVuY3Rpb24gKGFsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5fc2V0QWNjZXNzKG9wZXJhdGlvbiwgJ3JlcXVpcmVzQXV0aGVudGljYXRpb24nLCBhbGxvd2VkKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BnZXQke2FjdGlvbn1Qb2ludGVyRmllbGRzYF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3Mob3BlcmF0aW9uLCAncG9pbnRlckZpZWxkcycsIGZhbHNlKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BzZXQke2FjdGlvbn1Qb2ludGVyRmllbGRzYF0gPSBmdW5jdGlvbiAocG9pbnRlckZpZWxkcykge1xuICAgICAgICB0aGlzLl9zZXRBcnJheUFjY2VzcyhvcGVyYXRpb24sICdwb2ludGVyRmllbGRzJywgcG9pbnRlckZpZWxkcyk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgZ2V0JHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3Mob3BlcmF0aW9uLCBlbnRpdHkpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYHNldCR7YWN0aW9ufUFjY2Vzc2BdID0gZnVuY3Rpb24gKGVudGl0eSwgYWxsb3dlZCkge1xuICAgICAgICB0aGlzLl9zZXRBY2Nlc3Mob3BlcmF0aW9uLCBlbnRpdHksIGFsbG93ZWQpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYGdldFB1YmxpYyR7YWN0aW9ufUFjY2Vzc2BdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tgZ2V0JHthY3Rpb259QWNjZXNzYF0oUFVCTElDX0tFWSk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgc2V0UHVibGljJHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAoYWxsb3dlZCkge1xuICAgICAgICB0aGlzW2BzZXQke2FjdGlvbn1BY2Nlc3NgXShQVUJMSUNfS0VZLCBhbGxvd2VkKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BnZXRSb2xlJHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAocm9sZSkge1xuICAgICAgICByZXR1cm4gdGhpc1tgZ2V0JHthY3Rpb259QWNjZXNzYF0odGhpcy5fZ2V0Um9sZU5hbWUocm9sZSkpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYHNldFJvbGUke2FjdGlvbn1BY2Nlc3NgXSA9IGZ1bmN0aW9uIChyb2xlLCBhbGxvd2VkKSB7XG4gICAgICAgIHRoaXNbYHNldCR7YWN0aW9ufUFjY2Vzc2BdKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpLCBhbGxvd2VkKTtcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgcGVybWlzc2lvbnMgTWFwIHdpdGggZGVmYXVsdCBleHRlbmRlZCBwZXJtaXNzaW9uc1xuICAgIGZvciAoY29uc3QgW29wZXJhdGlvbiwgZ3JvdXBdIG9mICgwLCBfZW50cmllcy5kZWZhdWx0KShWQUxJRF9QRVJNSVNTSU9OU19FWFRFTkRFRCkuY2FsbChWQUxJRF9QRVJNSVNTSU9OU19FWFRFTkRFRCkpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXSA9ICgwLCBfYXNzaWduLmRlZmF1bHQpKHt9LCBncm91cCk7XG4gICAgfVxuICAgIGlmICh1c2VySWQgJiYgdHlwZW9mIHVzZXJJZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh1c2VySWQgaW5zdGFuY2VvZiBfUGFyc2VVc2VyLmRlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5zZXRSZWFkQWNjZXNzKHVzZXJJZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3ModXNlcklkLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAodXNlcklkIGluc3RhbmNlb2YgX1BhcnNlUm9sZS5kZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuc2V0Um9sZVJlYWRBY2Nlc3ModXNlcklkLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRSb2xlV3JpdGVBY2Nlc3ModXNlcklkLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBpbiB1c2VySWQpIHtcbiAgICAgICAgICB2YXIgX2NvbnRleHQ7XG4gICAgICAgICAgY29uc3QgdXNlcnMgPSB1c2VySWRbcGVybWlzc2lvbl07XG4gICAgICAgICAgY29uc3QgaXNWYWxpZFBlcm1pc3Npb24gPSAhIVZBTElEX1BFUk1JU1NJT05TLmdldChwZXJtaXNzaW9uKTtcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkUGVybWlzc2lvbkV4dGVuZGVkID0gISFWQUxJRF9QRVJNSVNTSU9OU19FWFRFTkRFRC5nZXQocGVybWlzc2lvbik7XG4gICAgICAgICAgY29uc3QgaXNWYWxpZEdyb3VwUGVybWlzc2lvbiA9ICgwLCBfaW5jbHVkZXMuZGVmYXVsdCkoX2NvbnRleHQgPSBbJ3JlYWRVc2VyRmllbGRzJywgJ3dyaXRlVXNlckZpZWxkcyddKS5jYWxsKF9jb250ZXh0LCBwZXJtaXNzaW9uKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBlcm1pc3Npb24gIT09ICdzdHJpbmcnIHx8ICEoaXNWYWxpZFBlcm1pc3Npb24gfHwgaXNWYWxpZFBlcm1pc3Npb25FeHRlbmRlZCB8fCBpc1ZhbGlkR3JvdXBQZXJtaXNzaW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gY3JlYXRlIGFuIENMUCB3aXRoIGFuIGludmFsaWQgcGVybWlzc2lvbiB0eXBlLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNWYWxpZEdyb3VwUGVybWlzc2lvbikge1xuICAgICAgICAgICAgaWYgKCgwLCBfZXZlcnkuZGVmYXVsdCkodXNlcnMpLmNhbGwodXNlcnMsIHBvaW50ZXIgPT4gdHlwZW9mIHBvaW50ZXIgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dID0gdXNlcnM7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gY3JlYXRlIGFuIENMUCB3aXRoIGFuIGludmFsaWQgcGVybWlzc2lvbiB2YWx1ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCB1c2VyIGluIHVzZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkID0gdXNlcnNbdXNlcl07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFsbG93ZWQgIT09ICdib29sZWFuJyAmJiAhaXNWYWxpZFBlcm1pc3Npb25FeHRlbmRlZCAmJiB1c2VyICE9PSAncG9pbnRlckZpZWxkcycpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gY3JlYXRlIGFuIENMUCB3aXRoIGFuIGludmFsaWQgcGVybWlzc2lvbiB2YWx1ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcl0gPSBhbGxvd2VkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGFyc2VDTFAgY29uc3RydWN0ZWQgd2l0aCBhIGZ1bmN0aW9uLiBEaWQgeW91IGZvcmdldCAoKT8nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04tZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBDTFAuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMucGVybWlzc2lvbnNNYXBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIENMUCBpcyBlcXVhbCB0byBhbm90aGVyIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlIHRvXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBQYXJzZUNMUCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSAoMCwgX2tleXMuZGVmYXVsdCkodGhpcy5wZXJtaXNzaW9uc01hcCk7XG4gICAgY29uc3Qgb3RoZXJQZXJtaXNzaW9ucyA9ICgwLCBfa2V5cy5kZWZhdWx0KShvdGhlci5wZXJtaXNzaW9uc01hcCk7XG4gICAgaWYgKHBlcm1pc3Npb25zLmxlbmd0aCAhPT0gb3RoZXJQZXJtaXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIGluIHRoaXMucGVybWlzc2lvbnNNYXApIHtcbiAgICAgIGlmICghb3RoZXIucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlcnMgPSAoMCwgX2tleXMuZGVmYXVsdCkodGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXSk7XG4gICAgICBjb25zdCBvdGhlclVzZXJzID0gKDAsIF9rZXlzLmRlZmF1bHQpKG90aGVyLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dKTtcbiAgICAgIGlmICh1c2Vycy5sZW5ndGggIT09IG90aGVyVXNlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdXNlciBpbiB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dKSB7XG4gICAgICAgIGlmICghb3RoZXIucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcl0pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcl0gIT09IG90aGVyLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJdKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIF9nZXRSb2xlTmFtZShyb2xlKSB7XG4gICAgbGV0IG5hbWUgPSByb2xlO1xuICAgIGlmIChyb2xlIGluc3RhbmNlb2YgX1BhcnNlUm9sZS5kZWZhdWx0KSB7XG4gICAgICAvLyBOb3JtYWxpemUgdG8gdGhlIFN0cmluZyBuYW1lXG4gICAgICBuYW1lID0gcm9sZS5nZXROYW1lKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JvbGUgbXVzdCBiZSBhIFBhcnNlLlJvbGUgb3IgYSBTdHJpbmcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGByb2xlOiR7bmFtZX1gO1xuICB9XG4gIF9wYXJzZUVudGl0eShlbnRpdHkpIHtcbiAgICBsZXQgdXNlcklkID0gZW50aXR5O1xuICAgIGlmICh1c2VySWQgaW5zdGFuY2VvZiBfUGFyc2VVc2VyLmRlZmF1bHQpIHtcbiAgICAgIHVzZXJJZCA9IHVzZXJJZC5pZDtcbiAgICAgIGlmICghdXNlcklkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBhY2Nlc3MgZm9yIGEgUGFyc2UuVXNlciB3aXRob3V0IGFuIGlkLicpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodXNlcklkIGluc3RhbmNlb2YgX1BhcnNlUm9sZS5kZWZhdWx0KSB7XG4gICAgICB1c2VySWQgPSB0aGlzLl9nZXRSb2xlTmFtZSh1c2VySWQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHVzZXJJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VzZXJJZCBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlcklkO1xuICB9XG4gIF9zZXRBY2Nlc3MocGVybWlzc2lvbiwgdXNlcklkLCBhbGxvd2VkKSB7XG4gICAgdXNlcklkID0gdGhpcy5fcGFyc2VFbnRpdHkodXNlcklkKTtcbiAgICBpZiAodHlwZW9mIGFsbG93ZWQgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYWxsb3dlZCBtdXN0IGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlLicpO1xuICAgIH1cbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICBpZiAoIXBlcm1pc3Npb25zKSB7XG4gICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgLy8gVGhlIHVzZXIgYWxyZWFkeSBkb2Vzbid0IGhhdmUgdGhpcyBwZXJtaXNzaW9uLCBzbyBubyBhY3Rpb24gaXMgbmVlZGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXSA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsb3dlZCkge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICB9XG4gIH1cbiAgX2dldEFjY2VzcyhwZXJtaXNzaW9uLCB1c2VySWQpIHtcbiAgICBsZXQgcmV0dXJuQm9vbGVhbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgICB1c2VySWQgPSB0aGlzLl9wYXJzZUVudGl0eSh1c2VySWQpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdO1xuICAgIGlmIChyZXR1cm5Cb29sZWFuKSB7XG4gICAgICBpZiAoIXBlcm1pc3Npb25zKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIXRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG4gIF9zZXRBcnJheUFjY2VzcyhwZXJtaXNzaW9uLCB1c2VySWQsIGZpZWxkcykge1xuICAgIHVzZXJJZCA9IHRoaXMuX3BhcnNlRW50aXR5KHVzZXJJZCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF07XG4gICAgaWYgKCFwZXJtaXNzaW9ucykge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdID0gW107XG4gICAgfVxuICAgIGlmICghZmllbGRzIHx8ICgwLCBfaXNBcnJheS5kZWZhdWx0KShmaWVsZHMpICYmIGZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF07XG4gICAgfSBlbHNlIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoZmllbGRzKSAmJiAoMCwgX2V2ZXJ5LmRlZmF1bHQpKGZpZWxkcykuY2FsbChmaWVsZHMsIGZpZWxkID0+IHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF0gPSBmaWVsZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpZWxkcyBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3Mgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgfVxuICBfc2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbihvcGVyYXRpb24sIHBvaW50ZXJGaWVsZHMpIHtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl07XG4gICAgaWYgKCFmaWVsZHMpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXBvaW50ZXJGaWVsZHMgfHwgKDAsIF9pc0FycmF5LmRlZmF1bHQpKHBvaW50ZXJGaWVsZHMpICYmIHBvaW50ZXJGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dO1xuICAgIH0gZWxzZSBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHBvaW50ZXJGaWVsZHMpICYmICgwLCBfZXZlcnkuZGVmYXVsdCkocG9pbnRlckZpZWxkcykuY2FsbChwb2ludGVyRmllbGRzLCBmaWVsZCA9PiB0eXBlb2YgZmllbGQgPT09ICdzdHJpbmcnKSkge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dID0gcG9pbnRlckZpZWxkcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtvcGVyYXRpb259LnBvaW50ZXJGaWVsZHMgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIG9yIHVuZGVmaW5lZC5gKTtcbiAgICB9XG4gIH1cbiAgX2dldEdyb3VwUG9pbnRlclBlcm1pc3Npb25zKG9wZXJhdGlvbikge1xuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl0gfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1c2VyIHBvaW50ZXIgZmllbGRzIHRvIGFsbG93IHBlcm1pc3Npb24gZm9yIGdldC9jb3VudC9maW5kIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBvaW50ZXJGaWVsZHMgVXNlciBwb2ludGVyIGZpZWxkc1xuICAgKi9cbiAgc2V0UmVhZFVzZXJGaWVsZHMocG9pbnRlckZpZWxkcykge1xuICAgIHRoaXMuX3NldEdyb3VwUG9pbnRlclBlcm1pc3Npb24oJ3JlYWRVc2VyRmllbGRzJywgcG9pbnRlckZpZWxkcyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBVc2VyIHBvaW50ZXIgZmllbGRzXG4gICAqL1xuICBnZXRSZWFkVXNlckZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbnMoJ3JlYWRVc2VyRmllbGRzJykgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1c2VyIHBvaW50ZXIgZmllbGRzIHRvIGFsbG93IHBlcm1pc3Npb24gZm9yIGNyZWF0ZS9kZWxldGUvdXBkYXRlL2FkZEZpZWxkIG9wZXJhdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcG9pbnRlckZpZWxkcyBVc2VyIHBvaW50ZXIgZmllbGRzXG4gICAqL1xuICBzZXRXcml0ZVVzZXJGaWVsZHMocG9pbnRlckZpZWxkcykge1xuICAgIHRoaXMuX3NldEdyb3VwUG9pbnRlclBlcm1pc3Npb24oJ3dyaXRlVXNlckZpZWxkcycsIHBvaW50ZXJGaWVsZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVXNlciBwb2ludGVyIGZpZWxkc1xuICAgKi9cbiAgZ2V0V3JpdGVVc2VyRmllbGRzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRHcm91cFBvaW50ZXJQZXJtaXNzaW9ucygnd3JpdGVVc2VyRmllbGRzJykgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlzIGFsbG93ZWQgdG8gcmV0cmlldmUgZmllbGRzIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gZmllbGRzIGZpZWxkcyB0byBiZSBwcm90ZWN0ZWRcbiAgICovXG4gIHNldFByb3RlY3RlZEZpZWxkcyh1c2VySWQsIGZpZWxkcykge1xuICAgIHRoaXMuX3NldEFycmF5QWNjZXNzKCdwcm90ZWN0ZWRGaWVsZHMnLCB1c2VySWQsIGZpZWxkcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhcnJheSBvZiBmaWVsZHMgYXJlIGFjY2Vzc2FibGUgdG8gdGhpcyB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGdldFByb3RlY3RlZEZpZWxkcyh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKCdwcm90ZWN0ZWRGaWVsZHMnLCB1c2VySWQsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaXMgYWxsb3dlZCB0byByZWFkIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIHdoZXRoZXIgdGhhdCB1c2VyIHNob3VsZCBoYXZlIHJlYWQgYWNjZXNzLlxuICAgKi9cbiAgc2V0UmVhZEFjY2Vzcyh1c2VySWQsIGFsbG93ZWQpIHtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2ZpbmQnLCB1c2VySWQsIGFsbG93ZWQpO1xuICAgIHRoaXMuX3NldEFjY2VzcygnZ2V0JywgdXNlcklkLCBhbGxvd2VkKTtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2NvdW50JywgdXNlcklkLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpZCBpcyAqZXhwbGljaXRseSogYWxsb3dlZCB0byByZWFkIGZyb20gdGhpcyBjbGFzcy5cbiAgICogRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB1c2VyIG1heSBzdGlsbCBiZSBhYmxlIHRvIGFjY2VzcyBpdCBpZlxuICAgKiBnZXRQdWJsaWNSZWFkQWNjZXNzIHJldHVybnMgdHJ1ZSBvciBhIHJvbGUgdGhhdCB0aGUgdXNlciBiZWxvbmdzIHRvIGhhc1xuICAgKiB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRSZWFkQWNjZXNzKHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3MoJ2ZpbmQnLCB1c2VySWQpICYmIHRoaXMuX2dldEFjY2VzcygnZ2V0JywgdXNlcklkKSAmJiB0aGlzLl9nZXRBY2Nlc3MoJ2NvdW50JywgdXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaWQgaXMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGF0IHVzZXIgc2hvdWxkIGhhdmUgd3JpdGUgYWNjZXNzLlxuICAgKi9cbiAgc2V0V3JpdGVBY2Nlc3ModXNlcklkLCBhbGxvd2VkKSB7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCdjcmVhdGUnLCB1c2VySWQsIGFsbG93ZWQpO1xuICAgIHRoaXMuX3NldEFjY2VzcygndXBkYXRlJywgdXNlcklkLCBhbGxvd2VkKTtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2RlbGV0ZScsIHVzZXJJZCwgYWxsb3dlZCk7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCdhZGRGaWVsZCcsIHVzZXJJZCwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlkIGlzICpleHBsaWNpdGx5KiBhbGxvd2VkIHRvIHdyaXRlIHRvIHRoaXMgY2xhc3MuXG4gICAqIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgdXNlciBtYXkgc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZlxuICAgKiBnZXRQdWJsaWNXcml0ZUFjY2VzcyByZXR1cm5zIHRydWUgb3IgYSByb2xlIHRoYXQgdGhlIHVzZXIgYmVsb25ncyB0byBoYXNcbiAgICogd3JpdGUgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0V3JpdGVBY2Nlc3ModXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcygnY3JlYXRlJywgdXNlcklkKSAmJiB0aGlzLl9nZXRBY2Nlc3MoJ3VwZGF0ZScsIHVzZXJJZCkgJiYgdGhpcy5fZ2V0QWNjZXNzKCdkZWxldGUnLCB1c2VySWQpICYmIHRoaXMuX2dldEFjY2VzcygnYWRkRmllbGQnLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gcmVhZCBmcm9tIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZFxuICAgKi9cbiAgc2V0UHVibGljUmVhZEFjY2VzcyhhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRSZWFkQWNjZXNzKFBVQkxJQ19LRVksIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gcmVhZCBmcm9tIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0UHVibGljUmVhZEFjY2VzcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZWFkQWNjZXNzKFBVQkxJQ19LRVkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gd3JpdGUgdG8gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkXG4gICAqL1xuICBzZXRQdWJsaWNXcml0ZUFjY2VzcyhhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRXcml0ZUFjY2VzcyhQVUJMSUNfS0VZLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHdyaXRlIHRvIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0UHVibGljV3JpdGVBY2Nlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V3JpdGVBY2Nlc3MoUFVCTElDX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byBwcm90ZWN0IGZpZWxkcyBpbiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmaWVsZHNcbiAgICovXG4gIHNldFB1YmxpY1Byb3RlY3RlZEZpZWxkcyhmaWVsZHMpIHtcbiAgICB0aGlzLnNldFByb3RlY3RlZEZpZWxkcyhQVUJMSUNfS0VZLCBmaWVsZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gcmVhZCBmaWVsZHMgZnJvbSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBnZXRQdWJsaWNQcm90ZWN0ZWRGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvdGVjdGVkRmllbGRzKFBVQkxJQ19LRVkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gcmVhZCBmcm9tIHRoaXMgY2xhc3MuIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm9sZSBtYXlcbiAgICogc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZiBhIHBhcmVudCByb2xlIGhhcyByZWFkIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSByb2xlIGhhcyByZWFkIGFjY2Vzcy4gZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9sZVJlYWRBY2Nlc3Mocm9sZSkge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRBY2Nlc3ModGhpcy5fZ2V0Um9sZU5hbWUocm9sZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gd3JpdGUgdG8gdGhpcyB1c2VyLiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvbGUgbWF5XG4gICAqIHN0aWxsIGJlIGFibGUgdG8gd3JpdGUgaXQgaWYgYSBwYXJlbnQgcm9sZSBoYXMgd3JpdGUgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJvbGUgaGFzIHdyaXRlIGFjY2Vzcy4gZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9sZVdyaXRlQWNjZXNzKHJvbGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRXcml0ZUFjY2Vzcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byByZWFkIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoZSBnaXZlbiByb2xlIGNhbiByZWFkIHRoaXMgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgc2V0Um9sZVJlYWRBY2Nlc3Mocm9sZSwgYWxsb3dlZCkge1xuICAgIHRoaXMuc2V0UmVhZEFjY2Vzcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byB3cml0ZSB0byB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhlIGdpdmVuIHJvbGUgY2FuIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgc2V0Um9sZVdyaXRlQWNjZXNzKHJvbGUsIGFsbG93ZWQpIHtcbiAgICB0aGlzLnNldFdyaXRlQWNjZXNzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIGNvdW50IHRvIHRoaXMgdXNlci4gRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSByb2xlIG1heVxuICAgKiBzdGlsbCBiZSBhYmxlIHRvIGNvdW50IGl0IGlmIGEgcGFyZW50IHJvbGUgaGFzIGNvdW50IGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIGdldFJvbGVQcm90ZWN0ZWRGaWVsZHMocm9sZSkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3RlY3RlZEZpZWxkcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byBzZXQgYWNjZXNzIGZpZWxkIGluIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmaWVsZHMgRmllbGRzIHRvIGJlIHByb3RlY3RlZCBieSBSb2xlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgc2V0Um9sZVByb3RlY3RlZEZpZWxkcyhyb2xlLCBmaWVsZHMpIHtcbiAgICB0aGlzLnNldFByb3RlY3RlZEZpZWxkcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSwgZmllbGRzKTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VDTFA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfZXNjYXBlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lc2NhcGVcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG4vKipcbiAqIFBhcnNlLkNvbmZpZyBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGNvbmZpZ3VyYXRpb24gZGF0YSB0aGF0XG4gKiBjYW4gYmUgc2V0IGZyb20gdGhlIFBhcnNlIGRhc2hib2FyZC5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuQ29uZmlnXG4gKi9cbmNsYXNzIFBhcnNlQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJhdHRyaWJ1dGVzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfZXNjYXBlZEF0dHJpYnV0ZXNcIiwgdm9pZCAwKTtcbiAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICB0aGlzLl9lc2NhcGVkQXR0cmlidXRlcyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGdldChhdHRyKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlc1thdHRyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBIVE1MLWVzY2FwZWQgdmFsdWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlc2NhcGUoYXR0cikge1xuICAgIGNvbnN0IGh0bWwgPSB0aGlzLl9lc2NhcGVkQXR0cmlidXRlc1thdHRyXTtcbiAgICBpZiAoaHRtbCkge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IHRoaXMuYXR0cmlidXRlc1thdHRyXTtcbiAgICBsZXQgZXNjYXBlZCA9ICcnO1xuICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgZXNjYXBlZCA9ICgwLCBfZXNjYXBlLmRlZmF1bHQpKHZhbC50b1N0cmluZygpKTtcbiAgICB9XG4gICAgdGhpcy5fZXNjYXBlZEF0dHJpYnV0ZXNbYXR0cl0gPSBlc2NhcGVkO1xuICAgIHJldHVybiBlc2NhcGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbW9zdCByZWNlbnRseS1mZXRjaGVkIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBlaXRoZXIgZnJvbVxuICAgKiBtZW1vcnkgb3IgZnJvbSBsb2NhbCBzdG9yYWdlIGlmIG5lY2Vzc2FyeS5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuQ29uZmlnfSBUaGUgbW9zdCByZWNlbnRseS1mZXRjaGVkIFBhcnNlLkNvbmZpZyBpZiBpdFxuICAgKiAgICAgZXhpc3RzLCBlbHNlIGFuIGVtcHR5IFBhcnNlLkNvbmZpZy5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDb25maWdDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuY3VycmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBuZXcgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhIG5ld2x5LWNyZWF0ZWRcbiAgICogICAgIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdoZW4gdGhlIGdldCBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgZ2V0KCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q29uZmlnQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmdldChvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHZhbHVlIGtleXMgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cnMgVGhlIGNvbmZpZyBwYXJhbWV0ZXJzIGFuZCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtYXN0ZXJLZXlPbmx5RmxhZ3MgVGhlIGZsYWdzIHRoYXQgZGVmaW5lIHdoZXRoZXIgY29uZmlnIHBhcmFtZXRlcnMgbGlzdGVkXG4gICAqIGluIGBhdHRyc2Agc2hvdWxkIGJlIHJldHJpZXZhYmxlIG9ubHkgYnkgdXNpbmcgdGhlIG1hc3RlciBrZXkuXG4gICAqIEZvciBleGFtcGxlOiBgcGFyYW0xOiB0cnVlYCBtYWtlcyBgcGFyYW0xYCBvbmx5IHJldHJpZXZhYmxlIGJ5IHVzaW5nIHRoZSBtYXN0ZXIga2V5LlxuICAgKiBJZiBhIHBhcmFtZXRlciBpcyBub3QgcHJvdmlkZWQgb3Igc2V0IHRvIGBmYWxzZWAsIGl0IGNhbiBiZSByZXRyaWV2ZWQgd2l0aG91dFxuICAgKiB1c2luZyB0aGUgbWFzdGVyIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYSBuZXdseS1jcmVhdGVkXG4gICAqICAgICBjb25maWd1cmF0aW9uIG9iamVjdCBvciB3aXRoIHRoZSBjdXJyZW50IHdpdGggdGhlIHVwZGF0ZS5cbiAgICovXG4gIHN0YXRpYyBzYXZlKGF0dHJzLCBtYXN0ZXJLZXlPbmx5RmxhZ3MpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q29uZmlnQ29udHJvbGxlcigpO1xuICAgIC8vVG8gYXZvaWQgYSBtaXNtYXRjaCB3aXRoIHRoZSBsb2NhbCBhbmQgdGhlIGNsb3VkIGNvbmZpZyB3ZSBnZXQgYSBuZXcgdmVyc2lvblxuICAgIHJldHVybiBjb250cm9sbGVyLnNhdmUoYXR0cnMsIG1hc3RlcktleU9ubHlGbGFncykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5nZXQoe1xuICAgICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICAgIH0pO1xuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBmb3IgdGVzdGluZ1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIF9jbGVhckNhY2hlKCkge1xuICAgIGN1cnJlbnRDb25maWcgPSBudWxsO1xuICB9XG59XG5sZXQgY3VycmVudENvbmZpZyA9IG51bGw7XG5jb25zdCBDVVJSRU5UX0NPTkZJR19LRVkgPSAnY3VycmVudENvbmZpZyc7XG5mdW5jdGlvbiBkZWNvZGVQYXlsb2FkKGRhdGEpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICBpZiAoanNvbiAmJiB0eXBlb2YganNvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiAoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGN1cnJlbnQoKSB7XG4gICAgaWYgKGN1cnJlbnRDb25maWcpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Q29uZmlnO1xuICAgIH1cbiAgICBjb25zdCBjb25maWcgPSBuZXcgUGFyc2VDb25maWcoKTtcbiAgICBjb25zdCBzdG9yYWdlUGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfQ09ORklHX0tFWSk7XG4gICAgaWYgKCFfU3RvcmFnZS5kZWZhdWx0LmFzeW5jKCkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ0RhdGEgPSBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW0oc3RvcmFnZVBhdGgpO1xuICAgICAgaWYgKGNvbmZpZ0RhdGEpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGRlY29kZVBheWxvYWQoY29uZmlnRGF0YSk7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgY29uZmlnLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgICAgIGN1cnJlbnRDb25maWcgPSBjb25maWc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIC8vIFJldHVybiBhIHByb21pc2UgZm9yIGFzeW5jIHN0b3JhZ2UgY29udHJvbGxlcnNcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMoc3RvcmFnZVBhdGgpLnRoZW4oY29uZmlnRGF0YSA9PiB7XG4gICAgICBpZiAoY29uZmlnRGF0YSkge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGVjb2RlUGF5bG9hZChjb25maWdEYXRhKTtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBjb25maWcuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgICAgY3VycmVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9KTtcbiAgfSxcbiAgZ2V0KCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdjb25maWcnLCB7fSwgb3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5wYXJhbXMpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfSlNPTiwgJ0NvbmZpZyBKU09OIHJlc3BvbnNlIGludmFsaWQuJyk7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgICBjb25zdCBjb25maWcgPSBuZXcgUGFyc2VDb25maWcoKTtcbiAgICAgIGNvbmZpZy5hdHRyaWJ1dGVzID0ge307XG4gICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gcmVzcG9uc2UucGFyYW1zKSB7XG4gICAgICAgIGNvbmZpZy5hdHRyaWJ1dGVzW2F0dHJdID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkocmVzcG9uc2UucGFyYW1zW2F0dHJdKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRDb25maWcgPSBjb25maWc7XG4gICAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMoX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9DT05GSUdfS0VZKSwgKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkocmVzcG9uc2UucGFyYW1zKSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgc2F2ZShhdHRycywgbWFzdGVyS2V5T25seUZsYWdzKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IGVuY29kZWRBdHRycyA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgICBlbmNvZGVkQXR0cnNba2V5XSA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKGF0dHJzW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUFVUJywgJ2NvbmZpZycsIHtcbiAgICAgIHBhcmFtczogZW5jb2RlZEF0dHJzLFxuICAgICAgbWFzdGVyS2V5T25seTogbWFzdGVyS2V5T25seUZsYWdzXG4gICAgfSwge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlRFUk5BTF9TRVJWRVJfRVJST1IsICdFcnJvciBvY2N1cmVkIHVwZGF0aW5nIENvbmZpZy4nKTtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldENvbmZpZ0NvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VDb25maWc7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5MiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgUGFyc2UuRXJyb3Igb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNvZGUgYW5kIG1lc3NhZ2UuXG4gKlxuICogUGFyc2UuQ29yZU1hbmFnZXIuc2V0KCdQQVJTRV9FUlJPUlMnLCBbeyBjb2RlLCBtZXNzYWdlIH1dKSBjYW4gYmUgdXNlIHRvIG92ZXJyaWRlIGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIEBhbGlhcyBQYXJzZS5FcnJvclxuICovXG5jbGFzcyBQYXJzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGUgQW4gZXJyb3IgY29kZSBjb25zdGFudCBmcm9tIDxjb2RlPlBhcnNlLkVycm9yPC9jb2RlPi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgQSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb2RlLCBtZXNzYWdlKSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKHRoaXMsIFwiY29kZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKHRoaXMsIFwibWVzc2FnZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKHRoaXMsIFwib2JqZWN0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkodGhpcywgXCJlcnJvcnNcIiwgdm9pZCAwKTtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIGxldCBjdXN0b21NZXNzYWdlID0gbWVzc2FnZTtcbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1BBUlNFX0VSUk9SUycpKS5jYWxsKF9jb250ZXh0LCBlcnJvciA9PiB7XG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gY29kZSAmJiBlcnJvci5jb2RlKSB7XG4gICAgICAgIGN1c3RvbU1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgfVxuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsICdtZXNzYWdlJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBjdXN0b21NZXNzYWdlXG4gICAgfSk7XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICdQYXJzZUVycm9yOiAnICsgdGhpcy5jb2RlICsgJyAnICsgdGhpcy5tZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBzb21lIGVycm9yIG90aGVyIHRoYW4gdGhvc2UgZW51bWVyYXRlZCBoZXJlLlxuICAgKlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gT1RIRVJfQ0FVU0VcbiAgICogQHN0YXRpY1xuICAgKi9cbn1cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiT1RIRVJfQ0FVU0VcIiwgLTEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBzb21ldGhpbmcgaGFzIGdvbmUgd3Jvbmcgd2l0aCB0aGUgc2VydmVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlRFUk5BTF9TRVJWRVJfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlRFUk5BTF9TRVJWRVJfRVJST1JcIiwgMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGUgY29ubmVjdGlvbiB0byB0aGUgUGFyc2Ugc2VydmVycyBmYWlsZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IENPTk5FQ1RJT05fRkFJTEVEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiQ09OTkVDVElPTl9GQUlMRURcIiwgMTAwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGRvZXNuJ3QgZXhpc3QuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE9CSkVDVF9OT1RfRk9VTkRcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJPQkpFQ1RfTk9UX0ZPVU5EXCIsIDEwMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB5b3UgdHJpZWQgdG8gcXVlcnkgd2l0aCBhIGRhdGF0eXBlIHRoYXQgZG9lc24ndFxuICogc3VwcG9ydCBpdCwgbGlrZSBleGFjdCBtYXRjaGluZyBhbiBhcnJheSBvciBvYmplY3QuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfUVVFUllcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1FVRVJZXCIsIDEwMik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhIG1pc3Npbmcgb3IgaW52YWxpZCBjbGFzc25hbWUuIENsYXNzbmFtZXMgYXJlXG4gKiBjYXNlLXNlbnNpdGl2ZS4gVGhleSBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGFuZCBhLXpBLVowLTlfIGFyZSB0aGVcbiAqIG9ubHkgdmFsaWQgY2hhcmFjdGVycy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9DTEFTU19OQU1FXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9DTEFTU19OQU1FXCIsIDEwMyk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiB1bnNwZWNpZmllZCBvYmplY3QgaWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1JU1NJTkdfT0JKRUNUX0lEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTUlTU0lOR19PQkpFQ1RfSURcIiwgMTA0KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQga2V5IG5hbWUuIEtleXMgYXJlIGNhc2Utc2Vuc2l0aXZlLiBUaGV5XG4gKiBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGFuZCBhLXpBLVowLTlfIGFyZSB0aGUgb25seSB2YWxpZCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0tFWV9OQU1FXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9LRVlfTkFNRVwiLCAxMDUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYSBtYWxmb3JtZWQgcG9pbnRlci4gWW91IHNob3VsZCBub3Qgc2VlIHRoaXMgdW5sZXNzXG4gKiB5b3UgaGF2ZSBiZWVuIG11Y2tpbmcgYWJvdXQgY2hhbmdpbmcgaW50ZXJuYWwgUGFyc2UgY29kZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9QT0lOVEVSXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9QT0lOVEVSXCIsIDEwNik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGJhZGx5IGZvcm1lZCBKU09OIHdhcyByZWNlaXZlZCB1cHN0cmVhbS4gVGhpc1xuICogZWl0aGVyIGluZGljYXRlcyB5b3UgaGF2ZSBkb25lIHNvbWV0aGluZyB1bnVzdWFsIHdpdGggbW9kaWZ5aW5nIGhvd1xuICogdGhpbmdzIGVuY29kZSB0byBKU09OLCBvciB0aGUgbmV0d29yayBpcyBmYWlsaW5nIGJhZGx5LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0pTT05cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0pTT05cIiwgMTA3KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGZlYXR1cmUgeW91IHRyaWVkIHRvIGFjY2VzcyBpcyBvbmx5XG4gKiBhdmFpbGFibGUgaW50ZXJuYWxseSBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gQ09NTUFORF9VTkFWQUlMQUJMRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkNPTU1BTkRfVU5BVkFJTEFCTEVcIiwgMTA4KTtcbi8qKlxuICogWW91IG11c3QgY2FsbCBQYXJzZS5pbml0aWFsaXplIGJlZm9yZSB1c2luZyB0aGUgUGFyc2UgbGlicmFyeS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTk9UX0lOSVRJQUxJWkVEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTk9UX0lOSVRJQUxJWkVEXCIsIDEwOSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgZmllbGQgd2FzIHNldCB0byBhbiBpbmNvbnNpc3RlbnQgdHlwZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5DT1JSRUNUX1RZUEVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTkNPUlJFQ1RfVFlQRVwiLCAxMTEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBjaGFubmVsIG5hbWUuIEEgY2hhbm5lbCBuYW1lIGlzIGVpdGhlclxuICogYW4gZW1wdHkgc3RyaW5nICh0aGUgYnJvYWRjYXN0IGNoYW5uZWwpIG9yIGNvbnRhaW5zIG9ubHkgYS16QS1aMC05X1xuICogY2hhcmFjdGVycyBhbmQgc3RhcnRzIHdpdGggYSBsZXR0ZXIuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfQ0hBTk5FTF9OQU1FXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9DSEFOTkVMX05BTUVcIiwgMTEyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgcHVzaCBpcyBtaXNjb25maWd1cmVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBQVVNIX01JU0NPTkZJR1VSRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJQVVNIX01JU0NPTkZJR1VSRURcIiwgMTE1KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIG9iamVjdCBpcyB0b28gbGFyZ2UuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE9CSkVDVF9UT09fTEFSR0VcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJPQkpFQ1RfVE9PX0xBUkdFXCIsIDExNik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBvcGVyYXRpb24gaXNuJ3QgYWxsb3dlZCBmb3IgY2xpZW50cy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gT1BFUkFUSU9OX0ZPUkJJRERFTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk9QRVJBVElPTl9GT1JCSURERU5cIiwgMTE5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSByZXN1bHQgd2FzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IENBQ0hFX01JU1NcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJDQUNIRV9NSVNTXCIsIDEyMCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGFuIGludmFsaWQga2V5IHdhcyB1c2VkIGluIGEgbmVzdGVkXG4gKiBKU09OT2JqZWN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX05FU1RFRF9LRVlcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX05FU1RFRF9LRVlcIiwgMTIxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYW4gaW52YWxpZCBmaWxlbmFtZSB3YXMgdXNlZCBmb3IgUGFyc2VGaWxlLlxuICogQSB2YWxpZCBmaWxlIG5hbWUgY29udGFpbnMgb25seSBhLXpBLVowLTlfLiBjaGFyYWN0ZXJzIGFuZCBpcyBiZXR3ZWVuIDFcbiAqIGFuZCAxMjggY2hhcmFjdGVycy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9GSUxFX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0ZJTEVfTkFNRVwiLCAxMjIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBBQ0wgd2FzIHByb3ZpZGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0FDTFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfQUNMXCIsIDEyMyk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IHRpbWVkIG91dCBvbiB0aGUgc2VydmVyLiBUeXBpY2FsbHlcbiAqIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3QgaXMgdG9vIGV4cGVuc2l2ZSB0byBydW4uXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFRJTUVPVVRcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJUSU1FT1VUXCIsIDEyNCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBlbWFpbCBhZGRyZXNzIHdhcyBpbnZhbGlkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0VNQUlMX0FERFJFU1NcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0VNQUlMX0FERFJFU1NcIiwgMTI1KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgbWlzc2luZyBjb250ZW50IHR5cGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1JU1NJTkdfQ09OVEVOVF9UWVBFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTUlTU0lOR19DT05URU5UX1RZUEVcIiwgMTI2KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgbWlzc2luZyBjb250ZW50IGxlbmd0aC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUlTU0lOR19DT05URU5UX0xFTkdUSFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk1JU1NJTkdfQ09OVEVOVF9MRU5HVEhcIiwgMTI3KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQgY29udGVudCBsZW5ndGguXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfQ09OVEVOVF9MRU5HVEhcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0NPTlRFTlRfTEVOR1RIXCIsIDEyOCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhIGZpbGUgdGhhdCB3YXMgdG9vIGxhcmdlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGSUxFX1RPT19MQVJHRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkZJTEVfVE9PX0xBUkdFXCIsIDEyOSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBlcnJvciBzYXZpbmcgYSBmaWxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGSUxFX1NBVkVfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJGSUxFX1NBVkVfRVJST1JcIiwgMTMwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1bmlxdWUgZmllbGQgd2FzIGdpdmVuIGEgdmFsdWUgdGhhdCBpc1xuICogYWxyZWFkeSB0YWtlbi5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRFVQTElDQVRFX1ZBTFVFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRFVQTElDQVRFX1ZBTFVFXCIsIDEzNyk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgcm9sZSdzIG5hbWUgaXMgaW52YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9ST0xFX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1JPTEVfTkFNRVwiLCAxMzkpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiBhcHBsaWNhdGlvbiBxdW90YSB3YXMgZXhjZWVkZWQuICBVcGdyYWRlIHRvXG4gKiByZXNvbHZlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBFWENFRURFRF9RVU9UQVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkVYQ0VFREVEX1FVT1RBXCIsIDE0MCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgQ2xvdWQgQ29kZSBzY3JpcHQgZmFpbGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBTQ1JJUFRfRkFJTEVEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiU0NSSVBUX0ZBSUxFRFwiLCAxNDEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIENsb3VkIENvZGUgdmFsaWRhdGlvbiBmYWlsZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFZBTElEQVRJT05fRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJWQUxJREFUSU9OX0VSUk9SXCIsIDE0Mik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGludmFsaWQgaW1hZ2UgZGF0YSB3YXMgcHJvdmlkZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfSU1BR0VfREFUQVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfSU1BR0VfREFUQVwiLCAxNDMpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gdW5zYXZlZCBmaWxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBVTlNBVkVEX0ZJTEVfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJVTlNBVkVEX0ZJTEVfRVJST1JcIiwgMTUxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQgcHVzaCB0aW1lLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1BVU0hfVElNRV9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfUFVTSF9USU1FX0VSUk9SXCIsIDE1Mik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBlcnJvciBkZWxldGluZyBhIGZpbGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZJTEVfREVMRVRFX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRklMRV9ERUxFVEVfRVJST1JcIiwgMTUzKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIGRlbGV0aW5nIGFuIHVubmFtZWQgZmlsZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRklMRV9ERUxFVEVfVU5OQU1FRF9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkZJTEVfREVMRVRFX1VOTkFNRURfRVJST1JcIiwgMTYxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGhhcyBleGNlZWRlZCBpdHMgcmVxdWVzdFxuICogbGltaXQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFJFUVVFU1RfTElNSVRfRVhDRUVERURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJSRVFVRVNUX0xJTUlUX0VYQ0VFREVEXCIsIDE1NSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IHdhcyBhIGR1cGxpY2F0ZSBhbmQgaGFzIGJlZW4gZGlzY2FyZGVkIGR1ZSB0b1xuICogaWRlbXBvdGVuY3kgcnVsZXMuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IERVUExJQ0FURV9SRVFVRVNUXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRFVQTElDQVRFX1JFUVVFU1RcIiwgMTU5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9FVkVOVF9OQU1FXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9FVkVOVF9OQU1FXCIsIDE2MCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgZmllbGQgaGFkIGFuIGludmFsaWQgdmFsdWUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfVkFMVUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1ZBTFVFXCIsIDE2Mik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VybmFtZSBpcyBtaXNzaW5nIG9yIGVtcHR5LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBVU0VSTkFNRV9NSVNTSU5HXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiVVNFUk5BTUVfTUlTU0lOR1wiLCAyMDApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgcGFzc3dvcmQgaXMgbWlzc2luZyBvciBlbXB0eS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gUEFTU1dPUkRfTUlTU0lOR1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlBBU1NXT1JEX01JU1NJTkdcIiwgMjAxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXJuYW1lIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4uXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFVTRVJOQU1FX1RBS0VOXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiVVNFUk5BTUVfVEFLRU5cIiwgMjAyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGVtYWlsIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4uXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEVNQUlMX1RBS0VOXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRU1BSUxfVEFLRU5cIiwgMjAzKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGVtYWlsIGlzIG1pc3NpbmcsIGJ1dCBtdXN0IGJlIHNwZWNpZmllZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRU1BSUxfTUlTU0lOR1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkVNQUlMX01JU1NJTkdcIiwgMjA0KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIHdpdGggdGhlIHNwZWNpZmllZCBlbWFpbCB3YXMgbm90IGZvdW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBFTUFJTF9OT1RfRk9VTkRcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJFTUFJTF9OT1RfRk9VTkRcIiwgMjA1KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIG9iamVjdCB3aXRob3V0IGEgdmFsaWQgc2Vzc2lvbiBjb3VsZFxuICogbm90IGJlIGFsdGVyZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNFU1NJT05fTUlTU0lOR1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlNFU1NJT05fTUlTU0lOR1wiLCAyMDYpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHVzZXIgY2FuIG9ubHkgYmUgY3JlYXRlZCB0aHJvdWdoIHNpZ251cC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTVVTVF9DUkVBVEVfVVNFUl9USFJPVUdIX1NJR05VUFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk1VU1RfQ1JFQVRFX1VTRVJfVEhST1VHSF9TSUdOVVBcIiwgMjA3KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYW4gYW4gYWNjb3VudCBiZWluZyBsaW5rZWQgaXMgYWxyZWFkeSBsaW5rZWRcbiAqIHRvIGFub3RoZXIgdXNlci5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gQUNDT1VOVF9BTFJFQURZX0xJTktFRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkFDQ09VTlRfQUxSRUFEWV9MSU5LRURcIiwgMjA4KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiB0b2tlbiBpcyBpbnZhbGlkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1NFU1NJT05fVE9LRU5cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1NFU1NJT05fVE9LRU5cIiwgMjA5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIGVuYWJsaW5nIG9yIHZlcmlmeWluZyBNRkFcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUZBX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTUZBX0VSUk9SXCIsIDIxMCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdmFsaWQgTUZBIHRva2VuIG11c3QgYmUgcHJvdmlkZWRcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUZBX1RPS0VOX1JFUVVJUkVEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTUZBX1RPS0VOX1JFUVVJUkVEXCIsIDIxMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdXNlciBjYW5ub3QgYmUgbGlua2VkIHRvIGFuIGFjY291bnQgYmVjYXVzZVxuICogdGhhdCBhY2NvdW50J3MgaWQgY291bGQgbm90IGJlIGZvdW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBMSU5LRURfSURfTUlTU0lOR1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkxJTktFRF9JRF9NSVNTSU5HXCIsIDI1MCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdXNlciB3aXRoIGEgbGlua2VkIChlLmcuIEZhY2Vib29rKSBhY2NvdW50XG4gKiBoYXMgYW4gaW52YWxpZCBzZXNzaW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0xJTktFRF9TRVNTSU9OXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9MSU5LRURfU0VTU0lPTlwiLCAyNTEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZpY2UgYmVpbmcgbGlua2VkIChlLmcuIEZhY2Vib29rIG9yXG4gKiBUd2l0dGVyKSBpcyB1bnN1cHBvcnRlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gVU5TVVBQT1JURURfU0VSVklDRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlVOU1VQUE9SVEVEX1NFUlZJQ0VcIiwgMjUyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQgb3BlcmF0aW9uIG9jY3VyZWQgb24gc2NoZW1hXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfU0NIRU1BX09QRVJBVElPTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfU0NIRU1BX09QRVJBVElPTlwiLCAyNTUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGVyZSB3ZXJlIG11bHRpcGxlIGVycm9ycy4gQWdncmVnYXRlIGVycm9yc1xuICogaGF2ZSBhbiBcImVycm9yc1wiIHByb3BlcnR5LCB3aGljaCBpcyBhbiBhcnJheSBvZiBlcnJvciBvYmplY3RzIHdpdGggbW9yZVxuICogZGV0YWlsIGFib3V0IGVhY2ggZXJyb3IgdGhhdCBvY2N1cnJlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gQUdHUkVHQVRFX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiQUdHUkVHQVRFX0VSUk9SXCIsIDYwMCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGUgY2xpZW50IHdhcyB1bmFibGUgdG8gcmVhZCBhbiBpbnB1dCBmaWxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGSUxFX1JFQURfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJGSUxFX1JFQURfRVJST1JcIiwgNjAxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgcmVhbCBlcnJvciBjb2RlIGlzIHVuYXZhaWxhYmxlIGJlY2F1c2VcbiAqIHdlIGhhZCB0byB1c2UgYW4gWERvbWFpblJlcXVlc3Qgb2JqZWN0IHRvIGFsbG93IENPUlMgcmVxdWVzdHMgaW5cbiAqIEludGVybmV0IEV4cGxvcmVyLCB3aGljaCBzdHJpcHMgdGhlIGJvZHkgZnJvbSBIVFRQIHJlc3BvbnNlcyB0aGF0IGhhdmVcbiAqIGEgbm9uLTJYWCBzdGF0dXMgY29kZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gWF9ET01BSU5fUkVRVUVTVFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlhfRE9NQUlOX1JFUVVFU1RcIiwgNjAyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlRXJyb3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9zbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1hociA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vWGhyLndlYXBwXCIpKTtcbi8qIGdsb2JhbCBYTUxIdHRwUmVxdWVzdCwgQmxvYiAqL1xuXG5sZXQgWEhSID0gbnVsbDtcbmlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gIFhIUiA9IFhNTEh0dHBSZXF1ZXN0O1xufVxuZnVuY3Rpb24gYjY0RGlnaXQobnVtYmVyKSB7XG4gIGlmIChudW1iZXIgPCAyNikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgbnVtYmVyKTtcbiAgfVxuICBpZiAobnVtYmVyIDwgNTIpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIChudW1iZXIgLSAyNikpO1xuICB9XG4gIGlmIChudW1iZXIgPCA2Mikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDQ4ICsgKG51bWJlciAtIDUyKSk7XG4gIH1cbiAgaWYgKG51bWJlciA9PT0gNjIpIHtcbiAgICByZXR1cm4gJysnO1xuICB9XG4gIGlmIChudW1iZXIgPT09IDYzKSB7XG4gICAgcmV0dXJuICcvJztcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBlbmNvZGUgbGFyZ2UgZGlnaXQgJyArIG51bWJlciArICcgaW4gYmFzZTY0LicpO1xufVxuXG4vKipcbiAqIEEgUGFyc2UuRmlsZSBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSB0aGF0IGlzIHNhdmVkIHRvIHRoZSBQYXJzZVxuICogY2xvdWQuXG4gKlxuICogQGFsaWFzIFBhcnNlLkZpbGVcbiAqL1xuY2xhc3MgUGFyc2VGaWxlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBuYW1lIHtTdHJpbmd9IFRoZSBmaWxlJ3MgbmFtZS4gVGhpcyB3aWxsIGJlIHByZWZpeGVkIGJ5IGEgdW5pcXVlXG4gICAqICAgICB2YWx1ZSBvbmNlIHRoZSBmaWxlIGhhcyBmaW5pc2hlZCBzYXZpbmcuIFRoZSBmaWxlIG5hbWUgbXVzdCBiZWdpbiB3aXRoXG4gICAqICAgICBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyLCBhbmQgY29uc2lzdCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyxcbiAgICogICAgIHBlcmlvZHMsIHNwYWNlcywgdW5kZXJzY29yZXMsIG9yIGRhc2hlcy5cbiAgICogQHBhcmFtIGRhdGEge0FycmF5fSBUaGUgZGF0YSBmb3IgdGhlIGZpbGUsIGFzIGVpdGhlcjpcbiAgICogICAgIDEuIGFuIEFycmF5IG9mIGJ5dGUgdmFsdWUgTnVtYmVycywgb3JcbiAgICogICAgIDIuIGFuIE9iamVjdCBsaWtlIHsgYmFzZTY0OiBcIi4uLlwiIH0gd2l0aCBhIGJhc2U2NC1lbmNvZGVkIFN0cmluZy5cbiAgICogICAgIDMuIGFuIE9iamVjdCBsaWtlIHsgdXJpOiBcIi4uLlwiIH0gd2l0aCBhIHVyaSBTdHJpbmcuXG4gICAqICAgICA0LiBhIEZpbGUgb2JqZWN0IHNlbGVjdGVkIHdpdGggYSBmaWxlIHVwbG9hZCBjb250cm9sLiAoMykgb25seSB3b3Jrc1xuICAgKiAgICAgICAgaW4gRmlyZWZveCAzLjYrLCBTYWZhcmkgNi4wLjIrLCBDaHJvbWUgNyssIGFuZCBJRSAxMCsuXG4gICAqICAgICAgICBGb3IgZXhhbXBsZTpcbiAgICogPHByZT5cbiAgICogdmFyIGZpbGVVcGxvYWRDb250cm9sID0gJChcIiNwcm9maWxlUGhvdG9GaWxlVXBsb2FkXCIpWzBdO1xuICAgKiBpZiAoZmlsZVVwbG9hZENvbnRyb2wuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgKiAgIHZhciBmaWxlID0gZmlsZVVwbG9hZENvbnRyb2wuZmlsZXNbMF07XG4gICAqICAgdmFyIG5hbWUgPSBcInBob3RvLmpwZ1wiO1xuICAgKiAgIHZhciBwYXJzZUZpbGUgPSBuZXcgUGFyc2UuRmlsZShuYW1lLCBmaWxlKTtcbiAgICogICBwYXJzZUZpbGUuc2F2ZSgpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAqICAgICAvLyBUaGUgZmlsZSBoYXMgYmVlbiBzYXZlZCB0byBQYXJzZS5cbiAgICogICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgKiAgICAgLy8gVGhlIGZpbGUgZWl0aGVyIGNvdWxkIG5vdCBiZSByZWFkLCBvciBjb3VsZCBub3QgYmUgc2F2ZWQgdG8gUGFyc2UuXG4gICAqICAgfSk7XG4gICAqIH08L3ByZT5cbiAgICogQHBhcmFtIHR5cGUge1N0cmluZ30gT3B0aW9uYWwgQ29udGVudC1UeXBlIGhlYWRlciB0byB1c2UgZm9yIHRoZSBmaWxlLiBJZlxuICAgKiAgICAgdGhpcyBpcyBvbWl0dGVkLCB0aGUgY29udGVudCB0eXBlIHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgbmFtZSdzXG4gICAqICAgICBleHRlbnNpb24uXG4gICAqIEBwYXJhbSBtZXRhZGF0YSB7b2JqZWN0fSBPcHRpb25hbCBrZXkgdmFsdWUgcGFpcnMgdG8gYmUgc3RvcmVkIHdpdGggZmlsZSBvYmplY3RcbiAgICogQHBhcmFtIHRhZ3Mge29iamVjdH0gT3B0aW9uYWwga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHN0b3JlZCB3aXRoIGZpbGUgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBkYXRhLCB0eXBlLCBtZXRhZGF0YSwgdGFncykge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX25hbWVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl91cmxcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9zb3VyY2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9wcmV2aW91c1NhdmVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9kYXRhXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfcmVxdWVzdFRhc2tcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9tZXRhZGF0YVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3RhZ3NcIiwgdm9pZCAwKTtcbiAgICBjb25zdCBzcGVjaWZpZWRUeXBlID0gdHlwZSB8fCAnJztcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgICB0aGlzLl9tZXRhZGF0YSA9IG1ldGFkYXRhIHx8IHt9O1xuICAgIHRoaXMuX3RhZ3MgPSB0YWdzIHx8IHt9O1xuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoZGF0YSkpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IFBhcnNlRmlsZS5lbmNvZGVCYXNlNjQoZGF0YSk7XG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHtcbiAgICAgICAgICBmb3JtYXQ6ICdiYXNlNjQnLFxuICAgICAgICAgIGJhc2U2NDogdGhpcy5fZGF0YSxcbiAgICAgICAgICB0eXBlOiBzcGVjaWZpZWRUeXBlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICB0aGlzLl9zb3VyY2UgPSB7XG4gICAgICAgICAgZm9ybWF0OiAnZmlsZScsXG4gICAgICAgICAgZmlsZTogZGF0YSxcbiAgICAgICAgICB0eXBlOiBzcGVjaWZpZWRUeXBlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEudXJpID09PSAnc3RyaW5nJyAmJiBkYXRhLnVyaSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHtcbiAgICAgICAgICBmb3JtYXQ6ICd1cmknLFxuICAgICAgICAgIHVyaTogZGF0YS51cmksXG4gICAgICAgICAgdHlwZTogc3BlY2lmaWVkVHlwZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhLmJhc2U2NCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0LCBfY29udGV4dDIsIF9jb250ZXh0MztcbiAgICAgICAgY29uc3QgYmFzZTY0ID0gKDAsIF9zbGljZS5kZWZhdWx0KShfY29udGV4dCA9IGRhdGEuYmFzZTY0LnNwbGl0KCcsJykpLmNhbGwoX2NvbnRleHQsIC0xKVswXTtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSBzcGVjaWZpZWRUeXBlIHx8ICgwLCBfc2xpY2UuZGVmYXVsdCkoX2NvbnRleHQyID0gKDAsIF9zbGljZS5kZWZhdWx0KShfY29udGV4dDMgPSBkYXRhLmJhc2U2NC5zcGxpdCgnOycpKS5jYWxsKF9jb250ZXh0MywgMCwgMSlbMF0uc3BsaXQoJzonKSkuY2FsbChfY29udGV4dDIsIDEsIDIpWzBdIHx8ICd0ZXh0L3BsYWluJztcbiAgICAgICAgdGhpcy5fZGF0YSA9IGJhc2U2NDtcbiAgICAgICAgdGhpcy5fc291cmNlID0ge1xuICAgICAgICAgIGZvcm1hdDogJ2Jhc2U2NCcsXG4gICAgICAgICAgYmFzZTY0LFxuICAgICAgICAgIHR5cGU6IGRhdGFUeXBlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY3JlYXRlIGEgUGFyc2UuRmlsZSB3aXRoIHRoYXQgZGF0YS4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgZmlsZSwgZG93bmxvYWRpbmcgaXQgaWYgbm90IGFscmVhZHkgcHJlc2VudC5cbiAgICogRGF0YSBpcyBwcmVzZW50IGlmIGluaXRpYWxpemVkIHdpdGggQnl0ZSBBcnJheSwgQmFzZTY0IG9yIFNhdmVkIHdpdGggVXJpLlxuICAgKiBEYXRhIGlzIGNsZWFyZWQgaWYgc2F2ZWQgd2l0aCBGaWxlIG9iamVjdCBzZWxlY3RlZCB3aXRoIGEgZmlsZSB1cGxvYWQgY29udHJvbFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmUgd2l0aCBiYXNlNjQgZGF0YVxuICAgKi9cbiAgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIGlmICghdGhpcy5fdXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBkYXRhIGZvciB1bnNhdmVkIFBhcnNlRmlsZS4nKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEZpbGVDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udHJvbGxlci5kb3dubG9hZCh0aGlzLl91cmwsIHtcbiAgICAgIHJlcXVlc3RUYXNrOiB0YXNrID0+IHRoaXMuX3JlcXVlc3RUYXNrID0gdGFza1xuICAgIH0pO1xuICAgIHRoaXMuX2RhdGEgPSByZXN1bHQuYmFzZTY0O1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuIEJlZm9yZSBzYXZlIGlzIGNhbGxlZCwgdGhpcyBpcyB0aGUgZmlsZW5hbWVcbiAgICogZ2l2ZW4gYnkgdGhlIHVzZXIuIEFmdGVyIHNhdmUgaXMgY2FsbGVkLCB0aGF0IG5hbWUgZ2V0cyBwcmVmaXhlZCB3aXRoIGFcbiAgICogdW5pcXVlIGlkZW50aWZpZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVybCBvZiB0aGUgZmlsZS4gSXQgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgeW91IHNhdmUgdGhlIGZpbGUgb3JcbiAgICogYWZ0ZXIgeW91IGdldCB0aGUgZmlsZSBmcm9tIGEgUGFyc2UuT2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBBbiBvYmplY3QgdG8gc3BlY2lmeSB1cmwgb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvcmNlU2VjdXJlXSBmb3JjZSB0aGUgdXJsIHRvIGJlIHNlY3VyZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgdXJsKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIXRoaXMuX3VybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5mb3JjZVNlY3VyZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3VybC5yZXBsYWNlKC9eaHR0cDpcXC9cXC8vaSwgJ2h0dHBzOi8vJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl91cmw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG1ldGFkYXRhIG9mIHRoZSBmaWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRhZ3Mgb2YgdGhlIGZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICB0YWdzKCkge1xuICAgIHJldHVybiB0aGlzLl90YWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBmaWxlIHRvIHRoZSBQYXJzZSBjbG91ZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5wcm9ncmVzczogSW4gQnJvd3NlciBvbmx5LCBjYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzLiBGb3IgZXhhbXBsZTpcbiAgICogPHByZT5cbiAgICogbGV0IHBhcnNlRmlsZSA9IG5ldyBQYXJzZS5GaWxlKG5hbWUsIGZpbGUpO1xuICAgKiBwYXJzZUZpbGUuc2F2ZSh7XG4gICAqICAgcHJvZ3Jlc3M6IChwcm9ncmVzc1ZhbHVlLCBsb2FkZWQsIHRvdGFsLCB7IHR5cGUgfSkgPT4ge1xuICAgKiAgICAgaWYgKHR5cGUgPT09IFwidXBsb2FkXCIgJiYgcHJvZ3Jlc3NWYWx1ZSAhPT0gbnVsbCkge1xuICAgKiAgICAgICAvLyBVcGRhdGUgdGhlIFVJIHVzaW5nIHByb2dyZXNzVmFsdWVcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqIH0pO1xuICAgKiA8L3ByZT5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2UgfCB1bmRlZmluZWR9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBzYXZlIGZpbmlzaGVzLlxuICAgKi9cbiAgc2F2ZShvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5yZXF1ZXN0VGFzayA9IHRhc2sgPT4gdGhpcy5fcmVxdWVzdFRhc2sgPSB0YXNrO1xuICAgIG9wdGlvbnMubWV0YWRhdGEgPSB0aGlzLl9tZXRhZGF0YTtcbiAgICBvcHRpb25zLnRhZ3MgPSB0aGlzLl90YWdzO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRGaWxlQ29udHJvbGxlcigpO1xuICAgIGlmICghdGhpcy5fcHJldmlvdXNTYXZlKSB7XG4gICAgICBpZiAodGhpcy5fc291cmNlLmZvcm1hdCA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU2F2ZSA9IGNvbnRyb2xsZXIuc2F2ZUZpbGUodGhpcy5fbmFtZSwgdGhpcy5fc291cmNlLCBvcHRpb25zKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5fbmFtZSA9IHJlcy5uYW1lO1xuICAgICAgICAgIHRoaXMuX3VybCA9IHJlcy51cmw7XG4gICAgICAgICAgdGhpcy5fZGF0YSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc291cmNlLmZvcm1hdCA9PT0gJ3VyaScpIHtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTYXZlID0gY29udHJvbGxlci5kb3dubG9hZCh0aGlzLl9zb3VyY2UudXJpLCBvcHRpb25zKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKCEocmVzdWx0ICYmIHJlc3VsdC5iYXNlNjQpKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG5ld1NvdXJjZSA9IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ2Jhc2U2NCcsXG4gICAgICAgICAgICBiYXNlNjQ6IHJlc3VsdC5iYXNlNjQsXG4gICAgICAgICAgICB0eXBlOiByZXN1bHQuY29udGVudFR5cGVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX2RhdGEgPSByZXN1bHQuYmFzZTY0O1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gY29udHJvbGxlci5zYXZlQmFzZTY0KHRoaXMuX25hbWUsIG5ld1NvdXJjZSwgb3B0aW9ucyk7XG4gICAgICAgIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLl9uYW1lID0gcmVzLm5hbWU7XG4gICAgICAgICAgdGhpcy5fdXJsID0gcmVzLnVybDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTYXZlID0gY29udHJvbGxlci5zYXZlQmFzZTY0KHRoaXMuX25hbWUsIHRoaXMuX3NvdXJjZSwgb3B0aW9ucykudGhlbihyZXMgPT4ge1xuICAgICAgICAgIHRoaXMuX25hbWUgPSByZXMubmFtZTtcbiAgICAgICAgICB0aGlzLl91cmwgPSByZXMudXJsO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9wcmV2aW91c1NhdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcmV2aW91c1NhdmU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0cyB0aGUgcmVxdWVzdCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHNlbnQuXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMuX3JlcXVlc3RUYXNrICYmIHR5cGVvZiB0aGlzLl9yZXF1ZXN0VGFzay5hYm9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fcmVxdWVzdFRhc2suX2Fib3J0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fcmVxdWVzdFRhc2suYWJvcnQoKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGZpbGUgZnJvbSB0aGUgUGFyc2UgY2xvdWQuXG4gICAqIEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSB3aXRoIE1hc3RlciBLZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiA8cHJlPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIGRlbGV0ZSBmaW5pc2hlcy5cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGlmICghdGhpcy5fbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5GSUxFX0RFTEVURV9VTk5BTUVEX0VSUk9SLCAnQ2Fubm90IGRlbGV0ZSBhbiB1bm5hbWVkIGZpbGUuJyk7XG4gICAgfVxuICAgIGNvbnN0IGRlc3Ryb3lPcHRpb25zID0ge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLnVzZU1hc3RlcktleSA9ICEhb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRGaWxlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmRlbGV0ZUZpbGUodGhpcy5fbmFtZSwgZGVzdHJveU9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0pO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnRmlsZScsXG4gICAgICBuYW1lOiB0aGlzLl9uYW1lLFxuICAgICAgdXJsOiB0aGlzLl91cmxcbiAgICB9O1xuICB9XG4gIGVxdWFscyhvdGhlcikge1xuICAgIGlmICh0aGlzID09PSBvdGhlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIFVuc2F2ZWQgRmlsZXMgYXJlIG5ldmVyIGVxdWFsLCBzaW5jZSB0aGV5IHdpbGwgYmUgc2F2ZWQgdG8gZGlmZmVyZW50IFVSTHNcbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBQYXJzZUZpbGUgJiYgdGhpcy5uYW1lKCkgPT09IG90aGVyLm5hbWUoKSAmJiB0aGlzLnVybCgpID09PSBvdGhlci51cmwoKSAmJiB0eXBlb2YgdGhpcy51cmwoKSAhPT0gJ3VuZGVmaW5lZCc7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBtZXRhZGF0YSB0byBiZSBzYXZlZCB3aXRoIGZpbGUgb2JqZWN0LiBPdmVyd3JpdGVzIGV4aXN0aW5nIG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhZGF0YSBLZXkgdmFsdWUgcGFpcnMgdG8gYmUgc3RvcmVkIHdpdGggZmlsZSBvYmplY3RcbiAgICovXG4gIHNldE1ldGFkYXRhKG1ldGFkYXRhKSB7XG4gICAgaWYgKG1ldGFkYXRhICYmIHR5cGVvZiBtZXRhZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBfY29udGV4dDQ7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ0ID0gKDAsIF9rZXlzLmRlZmF1bHQpKG1ldGFkYXRhKSkuY2FsbChfY29udGV4dDQsIGtleSA9PiB7XG4gICAgICAgIHRoaXMuYWRkTWV0YWRhdGEoa2V5LCBtZXRhZGF0YVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIG1ldGFkYXRhIHRvIGJlIHNhdmVkIHdpdGggZmlsZSBvYmplY3QuIEFkZHMgdG8gZXhpc3RpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkga2V5IHRvIHN0b3JlIHRoZSBtZXRhZGF0YVxuICAgKiBAcGFyYW0geyp9IHZhbHVlIG1ldGFkYXRhXG4gICAqL1xuICBhZGRNZXRhZGF0YShrZXksIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9tZXRhZGF0YVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGFncyB0byBiZSBzYXZlZCB3aXRoIGZpbGUgb2JqZWN0LiBPdmVyd3JpdGVzIGV4aXN0aW5nIHRhZ3NcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHRhZ3MgS2V5IHZhbHVlIHBhaXJzIHRvIGJlIHN0b3JlZCB3aXRoIGZpbGUgb2JqZWN0XG4gICAqL1xuICBzZXRUYWdzKHRhZ3MpIHtcbiAgICBpZiAodGFncyAmJiB0eXBlb2YgdGFncyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBfY29udGV4dDU7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ1ID0gKDAsIF9rZXlzLmRlZmF1bHQpKHRhZ3MpKS5jYWxsKF9jb250ZXh0NSwga2V5ID0+IHtcbiAgICAgICAgdGhpcy5hZGRUYWcoa2V5LCB0YWdzW2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGFncyB0byBiZSBzYXZlZCB3aXRoIGZpbGUgb2JqZWN0LiBBZGRzIHRvIGV4aXN0aW5nIHRhZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkga2V5IHRvIHN0b3JlIHRhZ3NcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSB0YWdcbiAgICovXG4gIGFkZFRhZyhrZXksIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl90YWdzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGZyb21KU09OKG9iaikge1xuICAgIGlmIChvYmouX190eXBlICE9PSAnRmlsZScpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0pTT04gb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhIFBhcnNlRmlsZScpO1xuICAgIH1cbiAgICBjb25zdCBmaWxlID0gbmV3IFBhcnNlRmlsZShvYmoubmFtZSk7XG4gICAgZmlsZS5fdXJsID0gb2JqLnVybDtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuICBzdGF0aWMgZW5jb2RlQmFzZTY0KGJ5dGVzKSB7XG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgY2h1bmtzLmxlbmd0aCA9IE1hdGguY2VpbChieXRlcy5sZW5ndGggLyAzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYjEgPSBieXRlc1tpICogM107XG4gICAgICBjb25zdCBiMiA9IGJ5dGVzW2kgKiAzICsgMV0gfHwgMDtcbiAgICAgIGNvbnN0IGIzID0gYnl0ZXNbaSAqIDMgKyAyXSB8fCAwO1xuICAgICAgY29uc3QgaGFzMiA9IGkgKiAzICsgMSA8IGJ5dGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGhhczMgPSBpICogMyArIDIgPCBieXRlcy5sZW5ndGg7XG4gICAgICBjaHVua3NbaV0gPSBbYjY0RGlnaXQoYjEgPj4gMiAmIDB4M2YpLCBiNjREaWdpdChiMSA8PCA0ICYgMHgzMCB8IGIyID4+IDQgJiAweDBmKSwgaGFzMiA/IGI2NERpZ2l0KGIyIDw8IDIgJiAweDNjIHwgYjMgPj4gNiAmIDB4MDMpIDogJz0nLCBoYXMzID8gYjY0RGlnaXQoYjMgJiAweDNmKSA6ICc9J10uam9pbignJyk7XG4gICAgfVxuICAgIHJldHVybiBjaHVua3Muam9pbignJyk7XG4gIH1cbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBzYXZlRmlsZTogYXN5bmMgZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIGlmIChzb3VyY2UuZm9ybWF0ICE9PSAnZmlsZScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2F2ZUZpbGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZpbGUtdHlwZSBzb3VyY2VzLicpO1xuICAgIH1cbiAgICBjb25zdCBiYXNlNjREYXRhID0gYXdhaXQgbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlcywgcmVqKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4gcmVzKHJlYWRlci5yZXN1bHQpO1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWooZXJyb3IpO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoc291cmNlLmZpbGUpO1xuICAgIH0pO1xuICAgIC8vIHdlIG9ubHkgd2FudCB0aGUgZGF0YSBhZnRlciB0aGUgY29tbWFcbiAgICAvLyBGb3IgZXhhbXBsZTogXCJkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsSlZCRVJpMHhMalFLSi4uLlwiIHdlIHdvdWxkIG9ubHkgd2FudCBcIkpWQkVSaTB4TGpRS0ouLi5cIlxuICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IGJhc2U2NERhdGEuc3BsaXQoJywnKTtcbiAgICAvLyBpbiB0aGUgZXZlbnQgdGhlcmUgaXMgbm8gJ2RhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCwnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJhc2U2NCBzdHJpbmdcbiAgICAvLyB1c2UgdGhlIGVudGlyZSBzdHJpbmcgaW5zdGVhZFxuICAgIGNvbnN0IGRhdGEgPSBzZWNvbmQgPyBzZWNvbmQgOiBmaXJzdDtcbiAgICBjb25zdCBuZXdTb3VyY2UgPSB7XG4gICAgICBmb3JtYXQ6ICdiYXNlNjQnLFxuICAgICAgYmFzZTY0OiBkYXRhLFxuICAgICAgdHlwZTogc291cmNlLnR5cGUgfHwgKHNvdXJjZS5maWxlID8gc291cmNlLmZpbGUudHlwZSA6IHVuZGVmaW5lZClcbiAgICB9O1xuICAgIHJldHVybiBhd2FpdCBEZWZhdWx0Q29udHJvbGxlci5zYXZlQmFzZTY0KG5hbWUsIG5ld1NvdXJjZSwgb3B0aW9ucyk7XG4gIH0sXG4gIHNhdmVCYXNlNjQ6IGZ1bmN0aW9uIChuYW1lLCBzb3VyY2UpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgaWYgKHNvdXJjZS5mb3JtYXQgIT09ICdiYXNlNjQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NhdmVCYXNlNjQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhc2U2NC10eXBlIHNvdXJjZXMuJyk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBiYXNlNjQ6IHNvdXJjZS5iYXNlNjQsXG4gICAgICBmaWxlRGF0YToge1xuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIC4uLm9wdGlvbnMubWV0YWRhdGFcbiAgICAgICAgfSxcbiAgICAgICAgdGFnczoge1xuICAgICAgICAgIC4uLm9wdGlvbnMudGFnc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBkZWxldGUgb3B0aW9ucy5tZXRhZGF0YTtcbiAgICBkZWxldGUgb3B0aW9ucy50YWdzO1xuICAgIGlmIChzb3VyY2UudHlwZSkge1xuICAgICAgZGF0YS5fQ29udGVudFR5cGUgPSBzb3VyY2UudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkucmVxdWVzdCgnUE9TVCcsICdmaWxlcy8nICsgbmFtZSwgZGF0YSwgb3B0aW9ucyk7XG4gIH0sXG4gIGRvd25sb2FkOiBmdW5jdGlvbiAodXJpLCBvcHRpb25zKSB7XG4gICAgaWYgKFhIUikge1xuICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRBamF4KHVyaSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnQ2Fubm90IG1ha2UgYSByZXF1ZXN0OiBObyBkZWZpbml0aW9uIG9mIFhNTEh0dHBSZXF1ZXN0IHdhcyBmb3VuZC4nKTtcbiAgICB9XG4gIH0sXG4gIGRvd25sb2FkQWpheDogZnVuY3Rpb24gKHVyaSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB4aHIgPSBuZXcgWEhSKCk7XG4gICAgICB4aHIub3BlbignR0VUJywgdXJpLCB0cnVlKTtcbiAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9O1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSB4aHIuRE9ORSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgYmFzZTY0OiBQYXJzZUZpbGUuZW5jb2RlQmFzZTY0KGJ5dGVzKSxcbiAgICAgICAgICBjb250ZW50VHlwZTogeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdjb250ZW50LXR5cGUnKVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBvcHRpb25zLnJlcXVlc3RUYXNrKHhocik7XG4gICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xuICB9LFxuICBkZWxldGVGaWxlOiBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnWC1QYXJzZS1BcHBsaWNhdGlvbi1JRCc6IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMudXNlTWFzdGVyS2V5KSB7XG4gICAgICBoZWFkZXJzWydYLVBhcnNlLU1hc3Rlci1LZXknXSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTUFTVEVSX0tFWScpO1xuICAgIH1cbiAgICBsZXQgdXJsID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfVVJMJyk7XG4gICAgaWYgKHVybFt1cmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xuICAgICAgdXJsICs9ICcvJztcbiAgICB9XG4gICAgdXJsICs9ICdmaWxlcy8nICsgbmFtZTtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5hamF4KCdERUxFVEUnLCB1cmwsICcnLCBoZWFkZXJzKS5jYXRjaChyZXNwb25zZSA9PiB7XG4gICAgICAvLyBUT0RPOiByZXR1cm4gSlNPTiBvYmplY3QgaW4gc2VydmVyXG4gICAgICBpZiAoIXJlc3BvbnNlIHx8IHJlc3BvbnNlID09PSAnU3ludGF4RXJyb3I6IFVuZXhwZWN0ZWQgZW5kIG9mIEpTT04gaW5wdXQnKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLmhhbmRsZUVycm9yKHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgX3NldFhIUih4aHIpIHtcbiAgICBYSFIgPSB4aHI7XG4gIH0sXG4gIF9nZXRYSFIoKSB7XG4gICAgcmV0dXJuIFhIUjtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldEZpbGVDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlRmlsZTtcbmV4cG9ydHMuYjY0RGlnaXQgPSBiNjREaWdpdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEdlb1BvaW50IHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6PGJyPlxuICogICA8cHJlPlxuICogICBuZXcgR2VvUG9pbnQob3RoZXJHZW9Qb2ludClcbiAqICAgbmV3IEdlb1BvaW50KDMwLCAzMClcbiAqICAgbmV3IEdlb1BvaW50KFszMCwgMzBdKVxuICogICBuZXcgR2VvUG9pbnQoe2xhdGl0dWRlOiAzMCwgbG9uZ2l0dWRlOiAzMH0pXG4gKiAgIG5ldyBHZW9Qb2ludCgpICAvLyBkZWZhdWx0cyB0byAoMCwgMClcbiAqICAgPC9wcmU+XG4gKiA8cD5SZXByZXNlbnRzIGEgbGF0aXR1ZGUgLyBsb25naXR1ZGUgcG9pbnQgdGhhdCBtYXkgYmUgYXNzb2NpYXRlZFxuICogd2l0aCBhIGtleSBpbiBhIFBhcnNlT2JqZWN0IG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgcG9pbnQgZm9yIGdlbyBxdWVyaWVzLlxuICogVGhpcyBhbGxvd3MgcHJveGltaXR5LWJhc2VkIHF1ZXJpZXMgb24gdGhlIGtleS48L3A+XG4gKlxuICogPHA+T25seSBvbmUga2V5IGluIGEgY2xhc3MgbWF5IGNvbnRhaW4gYSBHZW9Qb2ludC48L3A+XG4gKlxuICogPHA+RXhhbXBsZTo8cHJlPlxuICogICB2YXIgcG9pbnQgPSBuZXcgUGFyc2UuR2VvUG9pbnQoMzAuMCwgLTIwLjApO1xuICogICB2YXIgb2JqZWN0ID0gbmV3IFBhcnNlLk9iamVjdChcIlBsYWNlT2JqZWN0XCIpO1xuICogICBvYmplY3Quc2V0KFwibG9jYXRpb25cIiwgcG9pbnQpO1xuICogICBvYmplY3Quc2F2ZSgpOzwvcHJlPjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuR2VvUG9pbnRcbiAqL1xuLyogZ2xvYmFsIG5hdmlnYXRvciAqL1xuY2xhc3MgUGFyc2VHZW9Qb2ludCB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyhudW1iZXJbXSB8IG9iamVjdCB8IG51bWJlcil9IGFyZzEgRWl0aGVyIGEgbGlzdCBvZiBjb29yZGluYXRlIHBhaXJzLCBhbiBvYmplY3Qgd2l0aCBgbGF0aXR1ZGVgLCBgbG9uZ2l0dWRlYCwgb3IgdGhlIGxhdGl0dWRlIG9yIHRoZSBwb2ludC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZzIgVGhlIGxvbmdpdHVkZSBvZiB0aGUgR2VvUG9pbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZzEsIGFyZzIpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9sYXRpdHVkZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2xvbmdpdHVkZVwiLCB2b2lkIDApO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYXJnMSkpIHtcbiAgICAgIFBhcnNlR2VvUG9pbnQuX3ZhbGlkYXRlKGFyZzFbMF0sIGFyZzFbMV0pO1xuICAgICAgdGhpcy5fbGF0aXR1ZGUgPSBhcmcxWzBdO1xuICAgICAgdGhpcy5fbG9uZ2l0dWRlID0gYXJnMVsxXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcxID09PSAnb2JqZWN0Jykge1xuICAgICAgUGFyc2VHZW9Qb2ludC5fdmFsaWRhdGUoYXJnMS5sYXRpdHVkZSwgYXJnMS5sb25naXR1ZGUpO1xuICAgICAgdGhpcy5fbGF0aXR1ZGUgPSBhcmcxLmxhdGl0dWRlO1xuICAgICAgdGhpcy5fbG9uZ2l0dWRlID0gYXJnMS5sb25naXR1ZGU7XG4gICAgfSBlbHNlIGlmIChhcmcxICE9PSB1bmRlZmluZWQgJiYgYXJnMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZShhcmcxLCBhcmcyKTtcbiAgICAgIHRoaXMuX2xhdGl0dWRlID0gYXJnMTtcbiAgICAgIHRoaXMuX2xvbmdpdHVkZSA9IGFyZzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xhdGl0dWRlID0gMDtcbiAgICAgIHRoaXMuX2xvbmdpdHVkZSA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcnRoLXNvdXRoIHBvcnRpb24gb2YgdGhlIGNvb3JkaW5hdGUsIGluIHJhbmdlIFstOTAsIDkwXS5cbiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBzZXQgb3V0IG9mIHJhbmdlIGluIGEgbW9kZXJuIGJyb3dzZXIuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsYXRpdHVkZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGxhdGl0dWRlKCkge1xuICAgIHJldHVybiB0aGlzLl9sYXRpdHVkZTtcbiAgfVxuICBzZXQgbGF0aXR1ZGUodmFsKSB7XG4gICAgUGFyc2VHZW9Qb2ludC5fdmFsaWRhdGUodmFsLCB0aGlzLmxvbmdpdHVkZSk7XG4gICAgdGhpcy5fbGF0aXR1ZGUgPSB2YWw7XG4gIH1cblxuICAvKipcbiAgICogRWFzdC13ZXN0IHBvcnRpb24gb2YgdGhlIGNvb3JkaW5hdGUsIGluIHJhbmdlIFstMTgwLCAxODBdLlxuICAgKiBUaHJvd3MgaWYgc2V0IG91dCBvZiByYW5nZSBpbiBhIG1vZGVybiBicm93c2VyLlxuICAgKlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gbG9uZ2l0dWRlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbG9uZ2l0dWRlKCkge1xuICAgIHJldHVybiB0aGlzLl9sb25naXR1ZGU7XG4gIH1cbiAgc2V0IGxvbmdpdHVkZSh2YWwpIHtcbiAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZSh0aGlzLmxhdGl0dWRlLCB2YWwpO1xuICAgIHRoaXMuX2xvbmdpdHVkZSA9IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgR2VvUG9pbnQsIHN1aXRhYmxlIGZvciBQYXJzZS5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZSh0aGlzLl9sYXRpdHVkZSwgdGhpcy5fbG9uZ2l0dWRlKTtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnR2VvUG9pbnQnLFxuICAgICAgbGF0aXR1ZGU6IHRoaXMuX2xhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlOiB0aGlzLl9sb25naXR1ZGVcbiAgICB9O1xuICB9XG4gIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFBhcnNlR2VvUG9pbnQgJiYgdGhpcy5sYXRpdHVkZSA9PT0gb3RoZXIubGF0aXR1ZGUgJiYgdGhpcy5sb25naXR1ZGUgPT09IG90aGVyLmxvbmdpdHVkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgR2VvUG9pbnQgdG8gYW5vdGhlciBpbiByYWRpYW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCB0aGUgb3RoZXIgUGFyc2UuR2VvUG9pbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICByYWRpYW5zVG8ocG9pbnQpIHtcbiAgICBjb25zdCBkMnIgPSBNYXRoLlBJIC8gMTgwLjA7XG4gICAgY29uc3QgbGF0MXJhZCA9IHRoaXMubGF0aXR1ZGUgKiBkMnI7XG4gICAgY29uc3QgbG9uZzFyYWQgPSB0aGlzLmxvbmdpdHVkZSAqIGQycjtcbiAgICBjb25zdCBsYXQycmFkID0gcG9pbnQubGF0aXR1ZGUgKiBkMnI7XG4gICAgY29uc3QgbG9uZzJyYWQgPSBwb2ludC5sb25naXR1ZGUgKiBkMnI7XG4gICAgY29uc3Qgc2luRGVsdGFMYXREaXYyID0gTWF0aC5zaW4oKGxhdDFyYWQgLSBsYXQycmFkKSAvIDIpO1xuICAgIGNvbnN0IHNpbkRlbHRhTG9uZ0RpdjIgPSBNYXRoLnNpbigobG9uZzFyYWQgLSBsb25nMnJhZCkgLyAyKTtcbiAgICAvLyBTcXVhcmUgb2YgaGFsZiB0aGUgc3RyYWlnaHQgbGluZSBjaG9yZCBkaXN0YW5jZSBiZXR3ZWVuIGJvdGggcG9pbnRzLlxuICAgIGxldCBhID0gc2luRGVsdGFMYXREaXYyICogc2luRGVsdGFMYXREaXYyICsgTWF0aC5jb3MobGF0MXJhZCkgKiBNYXRoLmNvcyhsYXQycmFkKSAqIHNpbkRlbHRhTG9uZ0RpdjIgKiBzaW5EZWx0YUxvbmdEaXYyO1xuICAgIGEgPSBNYXRoLm1pbigxLjAsIGEpO1xuICAgIHJldHVybiAyICogTWF0aC5hc2luKE1hdGguc3FydChhKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIEdlb1BvaW50IHRvIGFub3RoZXIgaW4ga2lsb21ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgdGhlIG90aGVyIFBhcnNlLkdlb1BvaW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAga2lsb21ldGVyc1RvKHBvaW50KSB7XG4gICAgcmV0dXJuIHRoaXMucmFkaWFuc1RvKHBvaW50KSAqIDYzNzEuMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgR2VvUG9pbnQgdG8gYW5vdGhlciBpbiBtaWxlcy5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgdGhlIG90aGVyIFBhcnNlLkdlb1BvaW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgbWlsZXNUbyhwb2ludCkge1xuICAgIHJldHVybiB0aGlzLnJhZGlhbnNUbyhwb2ludCkgKiAzOTU4Ljg7XG4gIH1cblxuICAvKlxuICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBsYXQtbG9uZyBpcyBvdXQgb2YgYm91bmRzLlxuICAgKi9cbiAgc3RhdGljIF92YWxpZGF0ZShsYXRpdHVkZSwgbG9uZ2l0dWRlKSB7XG4gICAgaWYgKGlzTmFOKGxhdGl0dWRlKSB8fCBpc05hTihsb25naXR1ZGUpIHx8IHR5cGVvZiBsYXRpdHVkZSAhPT0gJ251bWJlcicgfHwgdHlwZW9mIGxvbmdpdHVkZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlb1BvaW50IGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgbXVzdCBiZSB2YWxpZCBudW1iZXJzJyk7XG4gICAgfVxuICAgIGlmIChsYXRpdHVkZSA8IC05MC4wKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW9Qb2ludCBsYXRpdHVkZSBvdXQgb2YgYm91bmRzOiAnICsgbGF0aXR1ZGUgKyAnIDwgLTkwLjAuJyk7XG4gICAgfVxuICAgIGlmIChsYXRpdHVkZSA+IDkwLjApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlb1BvaW50IGxhdGl0dWRlIG91dCBvZiBib3VuZHM6ICcgKyBsYXRpdHVkZSArICcgPiA5MC4wLicpO1xuICAgIH1cbiAgICBpZiAobG9uZ2l0dWRlIDwgLTE4MC4wKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW9Qb2ludCBsb25naXR1ZGUgb3V0IG9mIGJvdW5kczogJyArIGxvbmdpdHVkZSArICcgPCAtMTgwLjAuJyk7XG4gICAgfVxuICAgIGlmIChsb25naXR1ZGUgPiAxODAuMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VvUG9pbnQgbG9uZ2l0dWRlIG91dCBvZiBib3VuZHM6ICcgKyBsb25naXR1ZGUgKyAnID4gMTgwLjAuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBHZW9Qb2ludCB3aXRoIHRoZSB1c2VyJ3MgY3VycmVudCBsb2NhdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5lbmFibGVIaWdoQWNjdXJhY3ldIEEgYm9vbGVhbiB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgYXBwbGljYXRpb24gd291bGQgbGlrZSB0byByZWNlaXZlIHRoZSBiZXN0IHBvc3NpYmxlIHJlc3VsdHMuXG4gICAqICBJZiB0cnVlIGFuZCBpZiB0aGUgZGV2aWNlIGlzIGFibGUgdG8gcHJvdmlkZSBhIG1vcmUgYWNjdXJhdGUgcG9zaXRpb24sIGl0IHdpbGwgZG8gc28uXG4gICAqICBOb3RlIHRoYXQgdGhpcyBjYW4gcmVzdWx0IGluIHNsb3dlciByZXNwb25zZSB0aW1lcyBvciBpbmNyZWFzZWQgcG93ZXIgY29uc3VtcHRpb24gKHdpdGggYSBHUFMgY2hpcCBvbiBhIG1vYmlsZSBkZXZpY2UgZm9yIGV4YW1wbGUpLlxuICAgKiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIGZhbHNlLCB0aGUgZGV2aWNlIGNhbiB0YWtlIHRoZSBsaWJlcnR5IHRvIHNhdmUgcmVzb3VyY2VzIGJ5IHJlc3BvbmRpbmcgbW9yZSBxdWlja2x5IGFuZC9vciB1c2luZyBsZXNzIHBvd2VyLiBEZWZhdWx0OiBmYWxzZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnRpbWVvdXRdIEEgcG9zaXRpdmUgbG9uZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlIGRldmljZSBpcyBhbGxvd2VkIHRvIHRha2UgaW4gb3JkZXIgdG8gcmV0dXJuIGEgcG9zaXRpb24uXG4gICAqICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBJbmZpbml0eSwgbWVhbmluZyB0aGF0IGdldEN1cnJlbnRQb3NpdGlvbigpIHdvbid0IHJldHVybiB1bnRpbCB0aGUgcG9zaXRpb24gaXMgYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4aW11bUFnZV0gQSBwb3NpdGl2ZSBsb25nIHZhbHVlIGluZGljYXRpbmcgdGhlIG1heGltdW0gYWdlIGluIG1pbGxpc2Vjb25kcyBvZiBhIHBvc3NpYmxlIGNhY2hlZCBwb3NpdGlvbiB0aGF0IGlzIGFjY2VwdGFibGUgdG8gcmV0dXJuLlxuICAgKiAgSWYgc2V0IHRvIDAsIGl0IG1lYW5zIHRoYXQgdGhlIGRldmljZSBjYW5ub3QgdXNlIGEgY2FjaGVkIHBvc2l0aW9uIGFuZCBtdXN0IGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIHJlYWwgY3VycmVudCBwb3NpdGlvbi5cbiAgICogIElmIHNldCB0byBJbmZpbml0eSB0aGUgZGV2aWNlIG11c3QgcmV0dXJuIGEgY2FjaGVkIHBvc2l0aW9uIHJlZ2FyZGxlc3Mgb2YgaXRzIGFnZS4gRGVmYXVsdDogMC5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQYXJzZS5HZW9Qb2ludD59IFVzZXIncyBjdXJyZW50IGxvY2F0aW9uXG4gICAqL1xuICBzdGF0aWMgY3VycmVudChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obG9jYXRpb24gPT4ge1xuICAgICAgICByZXNvbHZlKG5ldyBQYXJzZUdlb1BvaW50KGxvY2F0aW9uLmNvb3Jkcy5sYXRpdHVkZSwgbG9jYXRpb24uY29vcmRzLmxvbmdpdHVkZSkpO1xuICAgICAgfSwgcmVqZWN0LCBvcHRpb25zKTtcbiAgICB9KTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VHZW9Qb2ludDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jcmVhdGUgPSBjcmVhdGU7XG5leHBvcnRzLmNyZWF0ZUZ1bmN0aW9uID0gY3JlYXRlRnVuY3Rpb247XG5leHBvcnRzLmNyZWF0ZVRyaWdnZXIgPSBjcmVhdGVUcmlnZ2VyO1xuZXhwb3J0cy5nZXRGdW5jdGlvbiA9IGdldEZ1bmN0aW9uO1xuZXhwb3J0cy5nZXRGdW5jdGlvbnMgPSBnZXRGdW5jdGlvbnM7XG5leHBvcnRzLmdldFRyaWdnZXIgPSBnZXRUcmlnZ2VyO1xuZXhwb3J0cy5nZXRUcmlnZ2VycyA9IGdldFRyaWdnZXJzO1xuZXhwb3J0cy5yZW1vdmUgPSByZW1vdmU7XG5leHBvcnRzLnJlbW92ZUZ1bmN0aW9uID0gcmVtb3ZlRnVuY3Rpb247XG5leHBvcnRzLnJlbW92ZVRyaWdnZXIgPSByZW1vdmVUcmlnZ2VyO1xuZXhwb3J0cy51cGRhdGUgPSB1cGRhdGU7XG5leHBvcnRzLnVwZGF0ZUZ1bmN0aW9uID0gdXBkYXRlRnVuY3Rpb247XG5leHBvcnRzLnVwZGF0ZVRyaWdnZXIgPSB1cGRhdGVUcmlnZ2VyO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbmZ1bmN0aW9uIGdldEZ1bmN0aW9ucygpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLmdldCgnZnVuY3Rpb25zJyk7XG59XG5mdW5jdGlvbiBnZXRUcmlnZ2VycygpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLmdldCgndHJpZ2dlcnMnKTtcbn1cbmZ1bmN0aW9uIGdldEZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLmdldCgnZnVuY3Rpb25zJywgbmFtZSk7XG59XG5mdW5jdGlvbiBnZXRUcmlnZ2VyKGNsYXNzTmFtZSwgdHJpZ2dlck5hbWUpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLmdldCgndHJpZ2dlcnMnLCBjbGFzc05hbWUsIHRyaWdnZXJOYW1lKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSwgdXJsKSB7XG4gIHJldHVybiBjcmVhdGUoe1xuICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgIHVybDogdXJsXG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlVHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJOYW1lLCB1cmwpIHtcbiAgcmV0dXJuIGNyZWF0ZSh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lLFxuICAgIHVybDogdXJsXG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlKGhvb2spIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLmNyZWF0ZShob29rKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSwgdXJsKSB7XG4gIHJldHVybiB1cGRhdGUoe1xuICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgIHVybDogdXJsXG4gIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlVHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJOYW1lLCB1cmwpIHtcbiAgcmV0dXJuIHVwZGF0ZSh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lLFxuICAgIHVybDogdXJsXG4gIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlKGhvb2spIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLnVwZGF0ZShob29rKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSkge1xuICByZXR1cm4gcmVtb3ZlKHtcbiAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZVxuICB9KTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyaWdnZXIoY2xhc3NOYW1lLCB0cmlnZ2VyTmFtZSkge1xuICByZXR1cm4gcmVtb3ZlKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWVcbiAgfSk7XG59XG5mdW5jdGlvbiByZW1vdmUoaG9vaykge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkucmVtb3ZlKGhvb2spO1xufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGdldCh0eXBlLCBmdW5jdGlvbk5hbWUsIHRyaWdnZXJOYW1lKSB7XG4gICAgbGV0IHVybCA9ICcvaG9va3MvJyArIHR5cGU7XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSkge1xuICAgICAgdXJsICs9ICcvJyArIGZ1bmN0aW9uTmFtZTtcbiAgICAgIGlmICh0cmlnZ2VyTmFtZSkge1xuICAgICAgICB1cmwgKz0gJy8nICsgdHJpZ2dlck5hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KCdHRVQnLCB1cmwpO1xuICB9LFxuICBjcmVhdGUoaG9vaykge1xuICAgIGxldCB1cmw7XG4gICAgaWYgKGhvb2suZnVuY3Rpb25OYW1lICYmIGhvb2sudXJsKSB7XG4gICAgICB1cmwgPSAnL2hvb2tzL2Z1bmN0aW9ucyc7XG4gICAgfSBlbHNlIGlmIChob29rLmNsYXNzTmFtZSAmJiBob29rLnRyaWdnZXJOYW1lICYmIGhvb2sudXJsKSB7XG4gICAgICB1cmwgPSAnL2hvb2tzL3RyaWdnZXJzJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KHtcbiAgICAgICAgZXJyb3I6ICdpbnZhbGlkIGhvb2sgZGVjbGFyYXRpb24nLFxuICAgICAgICBjb2RlOiAxNDNcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdCgnUE9TVCcsIHVybCwgaG9vayk7XG4gIH0sXG4gIHJlbW92ZShob29rKSB7XG4gICAgbGV0IHVybDtcbiAgICBpZiAoaG9vay5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvZnVuY3Rpb25zLycgKyBob29rLmZ1bmN0aW9uTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLmZ1bmN0aW9uTmFtZTtcbiAgICB9IGVsc2UgaWYgKGhvb2suY2xhc3NOYW1lICYmIGhvb2sudHJpZ2dlck5hbWUpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvdHJpZ2dlcnMvJyArIGhvb2suY2xhc3NOYW1lICsgJy8nICsgaG9vay50cmlnZ2VyTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLmNsYXNzTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLnRyaWdnZXJOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3Qoe1xuICAgICAgICBlcnJvcjogJ2ludmFsaWQgaG9vayBkZWNsYXJhdGlvbicsXG4gICAgICAgIGNvZGU6IDE0M1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KCdQVVQnLCB1cmwsIHtcbiAgICAgIF9fb3A6ICdEZWxldGUnXG4gICAgfSk7XG4gIH0sXG4gIHVwZGF0ZShob29rKSB7XG4gICAgbGV0IHVybDtcbiAgICBpZiAoaG9vay5mdW5jdGlvbk5hbWUgJiYgaG9vay51cmwpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvZnVuY3Rpb25zLycgKyBob29rLmZ1bmN0aW9uTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLmZ1bmN0aW9uTmFtZTtcbiAgICB9IGVsc2UgaWYgKGhvb2suY2xhc3NOYW1lICYmIGhvb2sudHJpZ2dlck5hbWUgJiYgaG9vay51cmwpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvdHJpZ2dlcnMvJyArIGhvb2suY2xhc3NOYW1lICsgJy8nICsgaG9vay50cmlnZ2VyTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLmNsYXNzTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLnRyaWdnZXJOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3Qoe1xuICAgICAgICBlcnJvcjogJ2ludmFsaWQgaG9vayBkZWNsYXJhdGlvbicsXG4gICAgICAgIGNvZGU6IDE0M1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KCdQVVQnLCB1cmwsIGhvb2spO1xuICB9LFxuICBzZW5kUmVxdWVzdChtZXRob2QsIHVybCwgYm9keSkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLnJlcXVlc3QobWV0aG9kLCB1cmwsIGJvZHksIHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSAoMCwgX2RlY29kZS5kZWZhdWx0KShyZXMpO1xuICAgICAgaWYgKGRlY29kZWQpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShkZWNvZGVkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfSlNPTiwgJ1RoZSBzZXJ2ZXIgcmV0dXJuZWQgYW4gaW52YWxpZCByZXNwb25zZS4nKSk7XG4gICAgfSk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRIb29rc0NvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2VudHJpZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9lbnRyaWVzXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG5jb25zdCBERVZJQ0VfVFlQRVMgPSB7XG4gIElPUzogJ2lvcycsXG4gIE1BQ09TOiAnbWFjb3MnLFxuICBUVk9TOiAndHZvcycsXG4gIEZDTTogJ2ZjbScsXG4gIEFORFJPSUQ6ICdhbmRyb2lkJyxcbiAgV0VCOiAnd2ViJ1xufTtcblxuLyoqXG4gKiBQYXJzZS5JbnN0YWxsYXRpb24gaXMgYSBsb2NhbCByZXByZXNlbnRhdGlvbiBvZiBpbnN0YWxsYXRpb24gZGF0YSB0aGF0IGNhbiBiZSBzYXZlZCBhbmQgcmV0cmlldmVkIGZyb20gdGhlIFBhcnNlIGNsb3VkLlxuICogVGhpcyBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIGEgUGFyc2UuT2JqZWN0LCBhbmQgcmV0YWlucyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IG9mIGEgUGFyc2UuT2JqZWN0LCBidXQgYWxzbyBleHRlbmRzIGl0IHdpdGggaW5zdGFsbGF0aW9uLXNwZWNpZmljIGZlYXR1cmVzLlxuICpcbiAqIDxwPkEgdmFsaWQgUGFyc2UuSW5zdGFsbGF0aW9uIGNhbiBvbmx5IGJlIGluc3RhbnRpYXRlZCB2aWEgPGNvZGU+UGFyc2UuSW5zdGFsbGF0aW9uLmN1cnJlbnRJbnN0YWxsYXRpb24oKTwvY29kZT5cbiAqXG4gKiBQYXJzZS5JbnN0YWxsYXRpb24gb2JqZWN0cyB3aGljaCBoYXZlIGEgdmFsaWQgPGNvZGU+ZGV2aWNlVG9rZW48L2NvZGU+IGFuZCBhcmUgc2F2ZWQgdG8gdGhlIFBhcnNlIGNsb3VkIGNhbiBiZSB1c2VkIHRvIHRhcmdldCBwdXNoIG5vdGlmaWNhdGlvbnMuXG4gKiA8L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLkluc3RhbGxhdGlvblxuICovXG5jbGFzcyBQYXJzZUluc3RhbGxhdGlvbiBleHRlbmRzIF9QYXJzZU9iamVjdC5kZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIFRoZSBpbml0aWFsIHNldCBvZiBkYXRhIHRvIHN0b3JlIGluIHRoZSBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7XG4gICAgc3VwZXIoJ19JbnN0YWxsYXRpb24nKTtcbiAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghdGhpcy5zZXQoYXR0cmlidXRlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGFuIGludmFsaWQgSW5zdGFsbGF0aW9uXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbGxhdGlvbuKAmXMgY2xpZW50IGFwcGxpY2F0aW9uLiBJbiBpT1MsIHRoaXMgaXMgdGhlIEJ1bmRsZSBJZGVudGlmaWVyLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXBwSWRlbnRpZmllclxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgYXBwSWRlbnRpZmllcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2FwcElkZW50aWZpZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB0byB3aGljaCB0aGlzIGluc3RhbGxhdGlvbiBiZWxvbmdzLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXBwVmVyc2lvblxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgYXBwVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2FwcFZlcnNpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjbGllbnQgYXBwbGljYXRpb24gdG8gd2hpY2ggdGhpcyBpbnN0YWxsYXRpb24gYmVsb25ncy5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcE5hbWVcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGFwcE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdhcHBOYW1lJyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGljb24gYmFkZ2UgZm9yIGlPUyBhcHBzLlxuICAgKiBDaGFuZ2VzIHRvIHRoaXMgdmFsdWUgb24gdGhlIHNlcnZlciB3aWxsIGJlIHVzZWRcbiAgICogZm9yIGZ1dHVyZSBiYWRnZS1pbmNyZW1lbnQgcHVzaCBub3RpZmljYXRpb25zLlxuICAgKlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gYmFkZ2VcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGJhZGdlKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnYmFkZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiB0aGUgY2hhbm5lbHMgdG8gd2hpY2ggYSBkZXZpY2UgaXMgY3VycmVudGx5IHN1YnNjcmliZWQuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNoYW5uZWxzXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnY2hhbm5lbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2tlbiB1c2VkIHRvIGRlbGl2ZXIgcHVzaCBub3RpZmljYXRpb25zIHRvIHRoZSBkZXZpY2UuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXZpY2VUb2tlblxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGV2aWNlVG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdkZXZpY2VUb2tlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGRldmljZSwg4oCcaW9z4oCdLCDigJxhbmRyb2lk4oCdLCDigJx3ZWLigJ0sIGV0Yy5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGRldmljZVR5cGVcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGRldmljZVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdkZXZpY2VUeXBlJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgR0NNIHNlbmRlciBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbGxhdGlvblxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gR0NNU2VuZGVySWRcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IEdDTVNlbmRlcklkKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnR0NNU2VuZGVySWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoVVVJRCkgZm9yIHRoZSBkZXZpY2UgdXNlZCBieSBQYXJzZS4gSXQgbXVzdCBiZSB1bmlxdWUgYWNyb3NzIGFsbCBvZiBhbiBhcHDigJlzIGluc3RhbGxhdGlvbnMuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsYXRpb25JZFxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW5zdGFsbGF0aW9uSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdpbnN0YWxsYXRpb25JZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxvY2FsIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFsbGF0aW9uXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsb2NhbGVJZGVudGlmaWVyXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBsb2NhbGVJZGVudGlmaWVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnbG9jYWxlSWRlbnRpZmllcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBhcnNlIHNlcnZlciB2ZXJzaW9uIGZvciB0aGlzIGluc3RhbGxhdGlvblxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcGFyc2VWZXJzaW9uXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBwYXJzZVZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdwYXJzZVZlcnNpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGZvciBkaXJlY3RpbmcgUGFyc2UgdG8gdGhlIHB1c2ggZGVsaXZlcnkgbmV0d29yayB0byBiZSB1c2VkLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcHVzaFR5cGVcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHB1c2hUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgncHVzaFR5cGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgZm9yIHRoaXMgaW5zdGFsbGF0aW9uXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lWm9uZVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZVpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCd0aW1lWm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRldmljZSB0eXBlcyBmb3IgdXNlZCBmb3IgUHVzaCBOb3RpZmljYXRpb25zLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLklPU1xuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLk1BQ09TXG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuVFZPU1xuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLkZDTVxuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLkFORFJPSURcbiAgICogUGFyc2UuSW5zdGFsbGF0aW9uLkRFVklDRV9UWVBFUy5XRUJcbiAgICogPC9wcmVcbiAgICpcbiAgICogQHByb3BlcnR5IHtvYmplY3R9IERFVklDRV9UWVBFU1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERFVklDRV9UWVBFUygpIHtcbiAgICByZXR1cm4gREVWSUNFX1RZUEVTO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgZmV0Y2ggYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRvIHVwZGF0ZSBsb2NhbCBzdG9yYWdlLlxuICAgKiBJZiB0aGUgaW5zdGFsbGF0aW9uIGlzIGRlbGV0ZWQgb24gdGhlIHNlcnZlciwgcmV0cnkgdGhlIGZldGNoIGFzIGEgc2F2ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgYXN5bmMgZmV0Y2goKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuZmV0Y2guYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSAhPT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5zdGFsbGF0aW9uIHdhcyBkZWxldGVkIGZyb20gdGhlIHNlcnZlci5cbiAgICAgIC8vIFdlIGFsd2F5cyB3YW50IGZldGNoIHRvIHN1Y2NlZWQuXG4gICAgICBkZWxldGUgdGhpcy5pZDtcbiAgICAgIHRoaXMuX2dldElkKCk7IC8vIEdlbmVyYXRlIGxvY2FsSWRcbiAgICAgIHRoaXMuX21hcmtBbGxGaWVsZHNEaXJ0eSgpO1xuICAgICAgYXdhaXQgc3VwZXIuc2F2ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpLnVwZGF0ZUluc3RhbGxhdGlvbk9uRGlzayh0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBkZWZhdWx0IHNhdmUgYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRvIHVwZGF0ZSB0aGUgbG9jYWwgc3RvcmFnZS5cbiAgICogSWYgdGhlIGluc3RhbGxhdGlvbiBpcyBkZWxldGVkIG9uIHRoZSBzZXJ2ZXIsIHJldHJ5IHNhdmluZyBhIG5ldyBpbnN0YWxsYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLnNhdmUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSAhPT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5zdGFsbGF0aW9uIHdhcyBkZWxldGVkIGZyb20gdGhlIHNlcnZlci5cbiAgICAgIC8vIFdlIGFsd2F5cyB3YW50IHNhdmUgdG8gc3VjY2VlZC5cbiAgICAgIGRlbGV0ZSB0aGlzLmlkO1xuICAgICAgdGhpcy5fZ2V0SWQoKTsgLy8gR2VuZXJhdGUgbG9jYWxJZFxuICAgICAgdGhpcy5fbWFya0FsbEZpZWxkc0RpcnR5KCk7XG4gICAgICBhd2FpdCBzdXBlci5zYXZlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkudXBkYXRlSW5zdGFsbGF0aW9uT25EaXNrKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIF9tYXJrQWxsRmllbGRzRGlydHkoKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgKDAsIF9lbnRyaWVzLmRlZmF1bHQpKHRoaXMuYXR0cmlidXRlcykpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgUGFyc2UuSW5zdGFsbGF0aW9uIGZyb20gZGlzay4gSWYgZG9lc24ndCBleGlzdHMsIGNyZWF0ZSBhbiBuZXcgaW5zdGFsbGF0aW9uLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBjb25zdCBpbnN0YWxsYXRpb24gPSBhd2FpdCBQYXJzZS5JbnN0YWxsYXRpb24uY3VycmVudEluc3RhbGxhdGlvbigpO1xuICAgKiBpbnN0YWxsYXRpb24uc2V0KCdkZXZpY2VUb2tlbicsICcxMjMnKTtcbiAgICogYXdhaXQgaW5zdGFsbGF0aW9uLnNhdmUoKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uIG9iamVjdC5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50SW5zdGFsbGF0aW9uKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkuY3VycmVudEluc3RhbGxhdGlvbigpO1xuICB9XG59XG5fUGFyc2VPYmplY3QuZGVmYXVsdC5yZWdpc3RlclN1YmNsYXNzKCdfSW5zdGFsbGF0aW9uJywgUGFyc2VJbnN0YWxsYXRpb24pO1xubW9kdWxlLmV4cG9ydHMgPSBQYXJzZUluc3RhbGxhdGlvbjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlSW5zdGFsbGF0aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0xpdmVRdWVyeUNsaWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTGl2ZVF1ZXJ5Q2xpZW50XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbmZ1bmN0aW9uIGdldExpdmVRdWVyeUNsaWVudCgpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExpdmVRdWVyeUNvbnRyb2xsZXIoKS5nZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50KCk7XG59XG5cbi8qKlxuICogV2UgZXhwb3NlIHRocmVlIGV2ZW50cyB0byBoZWxwIHlvdSBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uOlxuICpcbiAqIDxwPk9wZW4gLSBXaGVuIHdlIGVzdGFibGlzaCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqXG4gKiA8cHJlPlxuICogUGFyc2UuTGl2ZVF1ZXJ5Lm9uKCdvcGVuJywgKCkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5DbG9zZSAtIFdoZW4gd2UgbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqXG4gKiA8cHJlPlxuICogUGFyc2UuTGl2ZVF1ZXJ5Lm9uKCdjbG9zZScsICgpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+RXJyb3IgLSBXaGVuIHNvbWUgbmV0d29yayBlcnJvciBvciBMaXZlUXVlcnkgc2VydmVyIGVycm9yIGhhcHBlbnMsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqXG4gKiA8cHJlPlxuICogUGFyc2UuTGl2ZVF1ZXJ5Lm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuTGl2ZVF1ZXJ5XG4gKiBAc3RhdGljXG4gKi9cbmNsYXNzIExpdmVRdWVyeSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJlbWl0dGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdFwiLCB2b2lkIDApO1xuICAgIGNvbnN0IEV2ZW50RW1pdHRlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLm9uID0gKGV2ZW50TmFtZSwgbGlzdGVuZXIpID0+IHRoaXMuZW1pdHRlci5vbihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90aGlzLmVtaXR0ZXIuZW1pdChldmVudE5hbWUsIC4uLmFyZ3MpO1xuICAgIH07XG4gICAgLy8gYWRkaW5nIGxpc3RlbmVyIHNvIHByb2Nlc3MgZG9lcyBub3QgY3Jhc2hcbiAgICAvLyBiZXN0IHByYWN0aWNlIGlzIGZvciBkZXZlbG9wZXIgdG8gcmVnaXN0ZXIgdGhlaXIgb3duIGxpc3RlbmVyXG4gICAgdGhpcy5vbignZXJyb3InLCAoKSA9PiB7fSk7XG4gIH1cblxuICAvKipcbiAgICogQWZ0ZXIgb3BlbiBpcyBjYWxsZWQsIHRoZSBMaXZlUXVlcnkgd2lsbCB0cnkgdG8gc2VuZCBhIGNvbm5lY3QgcmVxdWVzdFxuICAgKiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlci5cbiAgICovXG4gIGFzeW5jIG9wZW4oKSB7XG4gICAgY29uc3QgbGl2ZVF1ZXJ5Q2xpZW50ID0gYXdhaXQgZ2V0TGl2ZVF1ZXJ5Q2xpZW50KCk7XG4gICAgbGl2ZVF1ZXJ5Q2xpZW50Lm9wZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHlvdSdyZSBkb25lIHVzaW5nIExpdmVRdWVyeSwgeW91IGNhbiBjYWxsIFBhcnNlLkxpdmVRdWVyeS5jbG9zZSgpLlxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLFxuICAgKiBjYW5jZWwgdGhlIGF1dG8gcmVjb25uZWN0LCBhbmQgdW5zdWJzY3JpYmUgYWxsIHN1YnNjcmlwdGlvbnMgYmFzZWQgb24gaXQuXG4gICAqIElmIHlvdSBjYWxsIHF1ZXJ5LnN1YnNjcmliZSgpIGFmdGVyIHRoaXMsIHdlJ2xsIGNyZWF0ZSBhIG5ldyBXZWJTb2NrZXRcbiAgICogY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlci5cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGNvbnN0IGxpdmVRdWVyeUNsaWVudCA9IGF3YWl0IGdldExpdmVRdWVyeUNsaWVudCgpO1xuICAgIGxpdmVRdWVyeUNsaWVudC5jbG9zZSgpO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBMaXZlUXVlcnk7XG5sZXQgZGVmYXVsdExpdmVRdWVyeUNsaWVudDtcbmNvbnN0IERlZmF1bHRMaXZlUXVlcnlDb250cm9sbGVyID0ge1xuICBzZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50KGxpdmVRdWVyeUNsaWVudCkge1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQgPSBsaXZlUXVlcnlDbGllbnQ7XG4gIH0sXG4gIGFzeW5jIGdldERlZmF1bHRMaXZlUXVlcnlDbGllbnQoKSB7XG4gICAgaWYgKGRlZmF1bHRMaXZlUXVlcnlDbGllbnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50O1xuICAgIH1cbiAgICBjb25zdCBbY3VycmVudFVzZXIsIGluc3RhbGxhdGlvbklkXSA9IGF3YWl0IF9wcm9taXNlLmRlZmF1bHQuYWxsKFtfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpLmN1cnJlbnRVc2VyQXN5bmMoKSwgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpLmN1cnJlbnRJbnN0YWxsYXRpb25JZCgpXSk7XG4gICAgY29uc3Qgc2Vzc2lvblRva2VuID0gY3VycmVudFVzZXIgPyBjdXJyZW50VXNlci5nZXRTZXNzaW9uVG9rZW4oKSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgbGl2ZVF1ZXJ5U2VydmVyVVJMID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdMSVZFUVVFUllfU0VSVkVSX1VSTCcpO1xuICAgIGlmIChsaXZlUXVlcnlTZXJ2ZXJVUkwgJiYgKDAsIF9pbmRleE9mLmRlZmF1bHQpKGxpdmVRdWVyeVNlcnZlclVSTCkuY2FsbChsaXZlUXVlcnlTZXJ2ZXJVUkwsICd3cycpICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHNldCBhIHByb3BlciBQYXJzZSBMaXZlUXVlcnkgc2VydmVyIHVybCBiZWZvcmUgdXNpbmcgTGl2ZVF1ZXJ5Q2xpZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgY2FuIG5vdCBmaW5kIFBhcnNlLmxpdmVRdWVyeVNlcnZlclVSTCwgd2UgdHJ5IHRvIGV4dHJhY3QgaXQgZnJvbSBQYXJzZS5zZXJ2ZXJVUkxcbiAgICBpZiAoIWxpdmVRdWVyeVNlcnZlclVSTCkge1xuICAgICAgY29uc3Qgc2VydmVyVVJMID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfVVJMJyk7XG4gICAgICBjb25zdCBwcm90b2NvbCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShzZXJ2ZXJVUkwpLmNhbGwoc2VydmVyVVJMLCAnaHR0cHMnKSA9PT0gMCA/ICd3c3M6Ly8nIDogJ3dzOi8vJztcbiAgICAgIGNvbnN0IGhvc3QgPSBzZXJ2ZXJVUkwucmVwbGFjZSgvXmh0dHBzPzpcXC9cXC8vLCAnJyk7XG4gICAgICBsaXZlUXVlcnlTZXJ2ZXJVUkwgPSBwcm90b2NvbCArIGhvc3Q7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0xJVkVRVUVSWV9TRVJWRVJfVVJMJywgbGl2ZVF1ZXJ5U2VydmVyVVJMKTtcbiAgICB9XG4gICAgY29uc3QgYXBwbGljYXRpb25JZCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKTtcbiAgICBjb25zdCBqYXZhc2NyaXB0S2V5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdKQVZBU0NSSVBUX0tFWScpO1xuICAgIGNvbnN0IG1hc3RlcktleSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTUFTVEVSX0tFWScpO1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQgPSBuZXcgX0xpdmVRdWVyeUNsaWVudC5kZWZhdWx0KHtcbiAgICAgIGFwcGxpY2F0aW9uSWQsXG4gICAgICBzZXJ2ZXJVUkw6IGxpdmVRdWVyeVNlcnZlclVSTCxcbiAgICAgIGphdmFzY3JpcHRLZXksXG4gICAgICBtYXN0ZXJLZXksXG4gICAgICBzZXNzaW9uVG9rZW4sXG4gICAgICBpbnN0YWxsYXRpb25JZFxuICAgIH0pO1xuICAgIGNvbnN0IExpdmVRdWVyeSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExpdmVRdWVyeSgpO1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xuICAgICAgTGl2ZVF1ZXJ5LmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgIH0pO1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQub24oJ29wZW4nLCAoKSA9PiB7XG4gICAgICBMaXZlUXVlcnkuZW1pdCgnb3BlbicpO1xuICAgIH0pO1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgTGl2ZVF1ZXJ5LmVtaXQoJ2Nsb3NlJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQ7XG4gIH0sXG4gIF9jbGVhckNhY2hlZERlZmF1bHRDbGllbnQoKSB7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudCA9IG51bGw7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRMaXZlUXVlcnlDb250cm9sbGVyKERlZmF1bHRMaXZlUXVlcnlDb250cm9sbGVyKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9XZWFrTWFwID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXBcIik7XG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5MihleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfZnJlZXplID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZnJlZXplXCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9nZXRQcm90b3R5cGVPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1wcm90b3R5cGUtb2ZcIikpO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2NyZWF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2NyZWF0ZVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSk7XG52YXIgX2ZpbmQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmRcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2NhbkJlU2VyaWFsaXplZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY2FuQmVTZXJpYWxpemVkXCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX2VzY2FwZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZXNjYXBlXCIpKTtcbnZhciBfUGFyc2VBQ0wgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQUNMXCIpKTtcbnZhciBfcGFyc2VEYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZURhdGVcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9wcm9taXNlVXRpbHMgPSByZXF1aXJlKFwiLi9wcm9taXNlVXRpbHNcIik7XG52YXIgX0xvY2FsRGF0YXN0b3JlVXRpbHMgPSByZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVV0aWxzXCIpO1xudmFyIF91dWlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dWlkXCIpKTtcbnZhciBfUGFyc2VPcCA9IHJlcXVpcmUoXCIuL1BhcnNlT3BcIik7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xudmFyIFNpbmdsZUluc3RhbmNlU3RhdGVDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vU2luZ2xlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXJcIikpO1xudmFyIF91bmlxdWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VuaXF1ZVwiKSk7XG52YXIgVW5pcXVlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9VbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlclwiKSk7XG52YXIgX3Vuc2F2ZWRDaGlsZHJlbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdW5zYXZlZENoaWxkcmVuXCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIF9XZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHIgPSBuZXcgX1dlYWtNYXAoKSxcbiAgICB0ID0gbmV3IF9XZWFrTWFwKCk7XG4gIHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZSA/IHQgOiByO1xuICB9KShlKTtcbn1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKGUsIHIpIHtcbiAgaWYgKCFyICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgZGVmYXVsdDogZVxuICB9O1xuICB2YXIgdCA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShyKTtcbiAgaWYgKHQgJiYgdC5oYXMoZSkpIHJldHVybiB0LmdldChlKTtcbiAgdmFyIG4gPSB7XG4gICAgX19wcm90b19fOiBudWxsXG4gIH07XG4gIGZvciAodmFyIHUgaW4gZSkgaWYgKFwiZGVmYXVsdFwiICE9PSB1ICYmIHt9Lmhhc093blByb3BlcnR5LmNhbGwoZSwgdSkpIHtcbiAgICB2YXIgaSA9IF9PYmplY3QkZGVmaW5lUHJvcGVydHkyICYmIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID8gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdSkgOiBudWxsO1xuICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IF9PYmplY3QkZGVmaW5lUHJvcGVydHkyKG4sIHUsIGkpIDogblt1XSA9IGVbdV07XG4gIH1cbiAgcmV0dXJuIG4uZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgbiksIG47XG59XG4vLyBNYXBwaW5nIG9mIGNsYXNzIG5hbWVzIHRvIGNvbnN0cnVjdG9ycywgc28gd2UgY2FuIHBvcHVsYXRlIG9iamVjdHMgZnJvbSB0aGVcbi8vIHNlcnZlciB3aXRoIGFwcHJvcHJpYXRlIHN1YmNsYXNzZXMgb2YgUGFyc2VPYmplY3RcbmNvbnN0IGNsYXNzTWFwID0ge307XG5cbi8vIEdsb2JhbCBjb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBJZHMgZm9yIG5vbi1zaW5nbGUtaW5zdGFuY2Ugb2JqZWN0c1xubGV0IG9iamVjdENvdW50ID0gMDtcbi8vIE9uIHdlYiBjbGllbnRzLCBvYmplY3RzIGFyZSBzaW5nbGUtaW5zdGFuY2U6IGFueSB0d28gb2JqZWN0cyB3aXRoIHRoZSBzYW1lIElkXG4vLyB3aWxsIGhhdmUgdGhlIHNhbWUgYXR0cmlidXRlcy4gSG93ZXZlciwgdGhpcyBtYXkgYmUgZGFuZ2Vyb3VzIGRlZmF1bHRcbi8vIGJlaGF2aW9yIGluIGEgc2VydmVyIHNjZW5hcmlvXG5sZXQgc2luZ2xlSW5zdGFuY2UgPSAhX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJU19OT0RFJyk7XG5pZiAoc2luZ2xlSW5zdGFuY2UpIHtcbiAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKFNpbmdsZUluc3RhbmNlU3RhdGVDb250cm9sbGVyKTtcbn0gZWxzZSB7XG4gIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldE9iamVjdFN0YXRlQ29udHJvbGxlcihVbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlcik7XG59XG5mdW5jdGlvbiBnZXRTZXJ2ZXJVcmxQYXRoKCkge1xuICBsZXQgc2VydmVyVXJsID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfVVJMJyk7XG4gIGlmIChzZXJ2ZXJVcmxbc2VydmVyVXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICBzZXJ2ZXJVcmwgKz0gJy8nO1xuICB9XG4gIGNvbnN0IHVybCA9IHNlcnZlclVybC5yZXBsYWNlKC9odHRwcz86XFwvXFwvLywgJycpO1xuICByZXR1cm4gdXJsLnN1YnN0cigoMCwgX2luZGV4T2YuZGVmYXVsdCkodXJsKS5jYWxsKHVybCwgJy8nKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtb2RlbCB3aXRoIGRlZmluZWQgYXR0cmlidXRlcy5cbiAqXG4gKiA8cD5Zb3Ugd29uJ3Qgbm9ybWFsbHkgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXRcbiAqIHlvdSB1c2UgYSBzdWJjbGFzcyBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+IGluc3RlYWQsIGNyZWF0ZWQgYnkgY2FsbGluZ1xuICogPGNvZGU+ZXh0ZW5kPC9jb2RlPi48L3A+XG4gKlxuICogPHA+SG93ZXZlciwgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIGEgc3ViY2xhc3MsIG9yIGFyZW4ndCBzdXJlIHdoaWNoXG4gKiBzdWJjbGFzcyBpcyBhcHByb3ByaWF0ZSwgeW91IGNhbiB1c2UgdGhpcyBmb3JtOjxwcmU+XG4gKiAgICAgdmFyIG9iamVjdCA9IG5ldyBQYXJzZS5PYmplY3QoXCJDbGFzc05hbWVcIik7XG4gKiA8L3ByZT5cbiAqIFRoYXQgaXMgYmFzaWNhbGx5IGVxdWl2YWxlbnQgdG86PHByZT5cbiAqICAgICB2YXIgTXlDbGFzcyA9IFBhcnNlLk9iamVjdC5leHRlbmQoXCJDbGFzc05hbWVcIik7XG4gKiAgICAgdmFyIG9iamVjdCA9IG5ldyBNeUNsYXNzKCk7XG4gKiA8L3ByZT48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLk9iamVjdFxuICovXG5jbGFzcyBQYXJzZU9iamVjdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lIGZvciB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIFRoZSBpbml0aWFsIHNldCBvZiBkYXRhIHRvIHN0b3JlIGluIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciB0aGlzIG9iamVjdCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pZ25vcmVWYWxpZGF0aW9uXSBTZXQgdG8gYHRydWVgIGlnbm9yZSBhbnkgYXR0cmlidXRlIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY2xhc3NOYW1lLCBhdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoaXMgb2JqZWN0LCB1bmlxdWUgd2l0aGluIGl0cyBjbGFzcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZFxuICAgICAqL1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiaWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9sb2NhbElkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfb2JqQ291bnRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImNsYXNzTmFtZVwiLCB2b2lkIDApO1xuICAgIC8vIEVuYWJsZSBsZWdhY3kgaW5pdGlhbGl6ZXJzXG4gICAgaWYgKHR5cGVvZiB0aGlzLmluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBsZXQgdG9TZXQgPSBudWxsO1xuICAgIHRoaXMuX29iakNvdW50ID0gb2JqZWN0Q291bnQrKztcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRvU2V0ID0gYXR0cmlidXRlcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSAmJiB0eXBlb2YgY2xhc3NOYW1lID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWUuY2xhc3NOYW1lO1xuICAgICAgdG9TZXQgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBjbGFzc05hbWUpIHtcbiAgICAgICAgaWYgKGF0dHIgIT09ICdjbGFzc05hbWUnKSB7XG4gICAgICAgICAgdG9TZXRbYXR0cl0gPSBjbGFzc05hbWVbYXR0cl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRpb25zID0gYXR0cmlidXRlcztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRvU2V0ICYmICF0aGlzLnNldCh0b1NldCwgb3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBhbiBpbnZhbGlkIFBhcnNlIE9iamVjdFwiKTtcbiAgICB9XG4gIH1cbiAgLyogUHJvdG90eXBlIGdldHRlcnMgLyBzZXR0ZXJzICovXG5cbiAgZ2V0IGF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuICgwLCBfZnJlZXplLmRlZmF1bHQpKHN0YXRlQ29udHJvbGxlci5lc3RpbWF0ZUF0dHJpYnV0ZXModGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgdGltZSB0aGlzIG9iamVjdCB3YXMgc2F2ZWQgb24gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHByb3BlcnR5IHtEYXRlfSBjcmVhdGVkQXRcbiAgICogQHJldHVybnMge0RhdGV9XG4gICAqL1xuICBnZXQgY3JlYXRlZEF0KCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRTZXJ2ZXJEYXRhKCkuY3JlYXRlZEF0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IHRpbWUgdGhpcyBvYmplY3Qgd2FzIHVwZGF0ZWQgb24gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHByb3BlcnR5IHtEYXRlfSB1cGRhdGVkQXRcbiAgICogQHJldHVybnMge0RhdGV9XG4gICAqL1xuICBnZXQgdXBkYXRlZEF0KCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRTZXJ2ZXJEYXRhKCkudXBkYXRlZEF0O1xuICB9XG5cbiAgLyogUHJpdmF0ZSBtZXRob2RzICovXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsb2NhbCBvciBzZXJ2ZXIgSWQgdXNlZCB1bmlxdWVseSBpZGVudGlmeSB0aGlzIG9iamVjdFxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgX2dldElkKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5pZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMuX2xvY2FsSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbG9jYWxJZDtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxJZCA9ICdsb2NhbCcgKyAoMCwgX3V1aWQuZGVmYXVsdCkoKTtcbiAgICB0aGlzLl9sb2NhbElkID0gbG9jYWxJZDtcbiAgICByZXR1cm4gbG9jYWxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgdXNlZCB0byBwdWxsIGRhdGEgZnJvbSB0aGUgU3RhdGUgQ29udHJvbGxlci5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdHxvYmplY3R9XG4gICAqL1xuICBfZ2V0U3RhdGVJZGVudGlmaWVyKCkge1xuICAgIGlmIChzaW5nbGVJbnN0YW5jZSkge1xuICAgICAgbGV0IGlkID0gdGhpcy5pZDtcbiAgICAgIGlmICghaWQpIHtcbiAgICAgICAgaWQgPSB0aGlzLl9nZXRJZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cbiAgX2dldFNlcnZlckRhdGEoKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIHN0YXRlQ29udHJvbGxlci5nZXRTZXJ2ZXJEYXRhKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgfVxuICBfY2xlYXJTZXJ2ZXJEYXRhKCkge1xuICAgIGNvbnN0IHNlcnZlckRhdGEgPSB0aGlzLl9nZXRTZXJ2ZXJEYXRhKCk7XG4gICAgY29uc3QgdW5zZXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gc2VydmVyRGF0YSkge1xuICAgICAgdW5zZXRbYXR0cl0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIHN0YXRlQ29udHJvbGxlci5zZXRTZXJ2ZXJEYXRhKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpLCB1bnNldCk7XG4gIH1cbiAgX2dldFBlbmRpbmdPcHMoKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIHN0YXRlQ29udHJvbGxlci5nZXRQZW5kaW5nT3BzKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtrZXlzVG9DbGVhcl0gLSBpZiBzcGVjaWZpZWQsIG9ubHkgb3BzIG1hdGNoaW5nXG4gICAqIHRoZXNlIGZpZWxkcyB3aWxsIGJlIGNsZWFyZWRcbiAgICovXG4gIF9jbGVhclBlbmRpbmdPcHMoa2V5c1RvQ2xlYXIpIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGNvbnN0IGxhdGVzdCA9IHBlbmRpbmdbcGVuZGluZy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBrZXlzID0ga2V5c1RvQ2xlYXIgfHwgKDAsIF9rZXlzLmRlZmF1bHQpKGxhdGVzdCk7XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIGRlbGV0ZSBsYXRlc3Rba2V5XTtcbiAgICB9KTtcbiAgfVxuICBfZ2V0RGlydHlPYmplY3RBdHRyaWJ1dGVzKCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgb2JqZWN0Q2FjaGUgPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0T2JqZWN0Q2FjaGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIGNvbnN0IGRpcnR5ID0ge307XG4gICAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IGF0dHJpYnV0ZXNbYXR0cl07XG4gICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICEodmFsIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpICYmICEodmFsIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0KSAmJiAhKHZhbCBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpKSB7XG4gICAgICAgIC8vIER1ZSB0byB0aGUgd2F5IGJyb3dzZXJzIGNvbnN0cnVjdCBtYXBzLCB0aGUga2V5IG9yZGVyIHdpbGwgbm90IGNoYW5nZVxuICAgICAgICAvLyB1bmxlc3MgdGhlIG9iamVjdCBpcyBjaGFuZ2VkXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QganNvbiA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHZhbCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoanNvbik7XG4gICAgICAgICAgaWYgKG9iamVjdENhY2hlW2F0dHJdICE9PSBzdHJpbmdpZmllZCkge1xuICAgICAgICAgICAgZGlydHlbYXR0cl0gPSB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gRXJyb3Igb2NjdXJyZWQsIHBvc3NpYmx5IGJ5IGEgbmVzdGVkIHVuc2F2ZWQgcG9pbnRlciBpbiBhIG11dGFibGUgY29udGFpbmVyXG4gICAgICAgICAgLy8gTm8gbWF0dGVyIGhvdyBpdCBoYXBwZW5lZCwgaXQgaW5kaWNhdGVzIGEgY2hhbmdlIGluIHRoZSBhdHRyaWJ1dGVcbiAgICAgICAgICBkaXJ0eVthdHRyXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlydHk7XG4gIH1cbiAgX3RvRnVsbEpTT04oc2Vlbiwgb2ZmbGluZSkge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTihzZWVuLCBvZmZsaW5lKTtcbiAgICBqc29uLl9fdHlwZSA9ICdPYmplY3QnO1xuICAgIGpzb24uY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgX2dldFNhdmVKU09OKCkge1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgY29uc3QgZGlydHlPYmplY3RzID0gdGhpcy5fZ2V0RGlydHlPYmplY3RBdHRyaWJ1dGVzKCk7XG4gICAgY29uc3QganNvbiA9IHt9O1xuICAgIGZvciAodmFyIGF0dHIgaW4gZGlydHlPYmplY3RzKSB7XG4gICAgICBsZXQgaXNEb3ROb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZW5kaW5nLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gcGVuZGluZ1tpXSkge1xuICAgICAgICAgIC8vIERvdCBub3RhdGlvbiBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGxhdGVyXG4gICAgICAgICAgaWYgKCgwLCBfaW5jbHVkZXMuZGVmYXVsdCkoZmllbGQpLmNhbGwoZmllbGQsICcuJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGZpZWxkLnNwbGl0KCcuJylbMF07XG4gICAgICAgICAgICBpZiAoZmllbGROYW1lID09PSBhdHRyKSB7XG4gICAgICAgICAgICAgIGlzRG90Tm90YXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNEb3ROb3RhdGlvbikge1xuICAgICAgICBqc29uW2F0dHJdID0gbmV3IF9QYXJzZU9wLlNldE9wKGRpcnR5T2JqZWN0c1thdHRyXSkudG9KU09OKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoYXR0ciBpbiBwZW5kaW5nWzBdKSB7XG4gICAgICBqc29uW2F0dHJdID0gcGVuZGluZ1swXVthdHRyXS50b0pTT04oKTtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgX2dldFNhdmVQYXJhbXMoKSB7XG4gICAgbGV0IG1ldGhvZCA9IHRoaXMuaWQgPyAnUFVUJyA6ICdQT1NUJztcbiAgICBjb25zdCBib2R5ID0gdGhpcy5fZ2V0U2F2ZUpTT04oKTtcbiAgICBsZXQgcGF0aCA9ICdjbGFzc2VzLycgKyB0aGlzLmNsYXNzTmFtZTtcbiAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBTExPV19DVVNUT01fT0JKRUNUX0lEJykpIHtcbiAgICAgIGlmICghdGhpcy5jcmVhdGVkQXQpIHtcbiAgICAgICAgbWV0aG9kID0gJ1BPU1QnO1xuICAgICAgICBib2R5Lm9iamVjdElkID0gdGhpcy5pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGhvZCA9ICdQVVQnO1xuICAgICAgICBwYXRoICs9ICcvJyArIHRoaXMuaWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlkKSB7XG4gICAgICBwYXRoICs9ICcvJyArIHRoaXMuaWQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgcGF0aCA9ICd1c2Vycyc7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBtZXRob2QsXG4gICAgICBib2R5LFxuICAgICAgcGF0aFxuICAgIH07XG4gIH1cbiAgX2ZpbmlzaEZldGNoKHNlcnZlckRhdGEpIHtcbiAgICBpZiAoIXRoaXMuaWQgJiYgc2VydmVyRGF0YS5vYmplY3RJZCkge1xuICAgICAgdGhpcy5pZCA9IHNlcnZlckRhdGEub2JqZWN0SWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIHN0YXRlQ29udHJvbGxlci5pbml0aWFsaXplU3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIGNvbnN0IGRlY29kZWQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gc2VydmVyRGF0YSkge1xuICAgICAgaWYgKGF0dHIgPT09ICdBQ0wnKSB7XG4gICAgICAgIGRlY29kZWRbYXR0cl0gPSBuZXcgX1BhcnNlQUNMLmRlZmF1bHQoc2VydmVyRGF0YVthdHRyXSk7XG4gICAgICB9IGVsc2UgaWYgKGF0dHIgIT09ICdvYmplY3RJZCcpIHtcbiAgICAgICAgZGVjb2RlZFthdHRyXSA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKHNlcnZlckRhdGFbYXR0cl0pO1xuICAgICAgICBpZiAoZGVjb2RlZFthdHRyXSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICAgICAgICBkZWNvZGVkW2F0dHJdLl9lbnN1cmVQYXJlbnRBbmRLZXkodGhpcywgYXR0cik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlY29kZWQuY3JlYXRlZEF0ICYmIHR5cGVvZiBkZWNvZGVkLmNyZWF0ZWRBdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRlY29kZWQuY3JlYXRlZEF0ID0gKDAsIF9wYXJzZURhdGUuZGVmYXVsdCkoZGVjb2RlZC5jcmVhdGVkQXQpO1xuICAgIH1cbiAgICBpZiAoZGVjb2RlZC51cGRhdGVkQXQgJiYgdHlwZW9mIGRlY29kZWQudXBkYXRlZEF0ID09PSAnc3RyaW5nJykge1xuICAgICAgZGVjb2RlZC51cGRhdGVkQXQgPSAoMCwgX3BhcnNlRGF0ZS5kZWZhdWx0KShkZWNvZGVkLnVwZGF0ZWRBdCk7XG4gICAgfVxuICAgIGlmICghZGVjb2RlZC51cGRhdGVkQXQgJiYgZGVjb2RlZC5jcmVhdGVkQXQpIHtcbiAgICAgIGRlY29kZWQudXBkYXRlZEF0ID0gZGVjb2RlZC5jcmVhdGVkQXQ7XG4gICAgfVxuICAgIHN0YXRlQ29udHJvbGxlci5jb21taXRTZXJ2ZXJDaGFuZ2VzKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpLCBkZWNvZGVkKTtcbiAgfVxuICBfc2V0RXhpc3RlZChleGlzdGVkKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgc3RhdGUgPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgc3RhdGUuZXhpc3RlZCA9IGV4aXN0ZWQ7XG4gICAgfVxuICB9XG4gIF9taWdyYXRlSWQoc2VydmVySWQpIHtcbiAgICBpZiAodGhpcy5fbG9jYWxJZCAmJiBzZXJ2ZXJJZCkge1xuICAgICAgaWYgKHNpbmdsZUluc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgICAgICBjb25zdCBvbGRTdGF0ZSA9IHN0YXRlQ29udHJvbGxlci5yZW1vdmVTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgICAgIHRoaXMuaWQgPSBzZXJ2ZXJJZDtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xvY2FsSWQ7XG4gICAgICAgIGlmIChvbGRTdGF0ZSkge1xuICAgICAgICAgIHN0YXRlQ29udHJvbGxlci5pbml0aWFsaXplU3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIG9sZFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pZCA9IHNlcnZlcklkO1xuICAgICAgICBkZWxldGUgdGhpcy5fbG9jYWxJZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2hhbmRsZVNhdmVSZXNwb25zZShyZXNwb25zZSwgc3RhdHVzKSB7XG4gICAgY29uc3QgY2hhbmdlcyA9IHt9O1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBlbmRpbmcgPSBzdGF0ZUNvbnRyb2xsZXIucG9wUGVuZGluZ1N0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICBmb3IgKHZhciBhdHRyIGluIHBlbmRpbmcpIHtcbiAgICAgIGlmIChwZW5kaW5nW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuUmVsYXRpb25PcCkge1xuICAgICAgICBjaGFuZ2VzW2F0dHJdID0gcGVuZGluZ1thdHRyXS5hcHBseVRvKHVuZGVmaW5lZCwgdGhpcywgYXR0cik7XG4gICAgICB9IGVsc2UgaWYgKCEoYXR0ciBpbiByZXNwb25zZSkpIHtcbiAgICAgICAgLy8gT25seSBTZXRPcHMgYW5kIFVuc2V0T3BzIHNob3VsZCBub3QgY29tZSBiYWNrIHdpdGggcmVzdWx0c1xuICAgICAgICBjaGFuZ2VzW2F0dHJdID0gcGVuZGluZ1thdHRyXS5hcHBseVRvKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoYXR0ciBpbiByZXNwb25zZSkge1xuICAgICAgaWYgKChhdHRyID09PSAnY3JlYXRlZEF0JyB8fCBhdHRyID09PSAndXBkYXRlZEF0JykgJiYgdHlwZW9mIHJlc3BvbnNlW2F0dHJdID09PSAnc3RyaW5nJykge1xuICAgICAgICBjaGFuZ2VzW2F0dHJdID0gKDAsIF9wYXJzZURhdGUuZGVmYXVsdCkocmVzcG9uc2VbYXR0cl0pO1xuICAgICAgfSBlbHNlIGlmIChhdHRyID09PSAnQUNMJykge1xuICAgICAgICBjaGFuZ2VzW2F0dHJdID0gbmV3IF9QYXJzZUFDTC5kZWZhdWx0KHJlc3BvbnNlW2F0dHJdKTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0ciAhPT0gJ29iamVjdElkJykge1xuICAgICAgICBjb25zdCB2YWwgPSAoMCwgX2RlY29kZS5kZWZhdWx0KShyZXNwb25zZVthdHRyXSk7XG4gICAgICAgIGlmICh2YWwgJiYgKDAsIF9nZXRQcm90b3R5cGVPZi5kZWZhdWx0KSh2YWwpID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgICAgY2hhbmdlc1thdHRyXSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuYXR0cmlidXRlc1thdHRyXSxcbiAgICAgICAgICAgIC4uLnZhbFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhbmdlc1thdHRyXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1thdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlVuc2V0T3ApIHtcbiAgICAgICAgICBjaGFuZ2VzW2F0dHJdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmNyZWF0ZWRBdCAmJiAhY2hhbmdlcy51cGRhdGVkQXQpIHtcbiAgICAgIGNoYW5nZXMudXBkYXRlZEF0ID0gY2hhbmdlcy5jcmVhdGVkQXQ7XG4gICAgfVxuICAgIHRoaXMuX21pZ3JhdGVJZChyZXNwb25zZS5vYmplY3RJZCk7XG4gICAgaWYgKHN0YXR1cyAhPT0gMjAxKSB7XG4gICAgICB0aGlzLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgIH1cbiAgICBzdGF0ZUNvbnRyb2xsZXIuY29tbWl0U2VydmVyQ2hhbmdlcyh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgY2hhbmdlcyk7XG4gIH1cbiAgX2hhbmRsZVNhdmVFcnJvcigpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBzdGF0ZUNvbnRyb2xsZXIubWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gIH1cbiAgc3RhdGljIF9nZXRDbGFzc01hcCgpIHtcbiAgICByZXR1cm4gY2xhc3NNYXA7XG4gIH1cblxuICAvKiBQdWJsaWMgbWV0aG9kcyAqL1xuXG4gIGluaXRpYWxpemUoKSB7XG4gICAgLy8gTk9PUFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OIHZlcnNpb24gb2YgdGhlIG9iamVjdCBzdWl0YWJsZSBmb3Igc2F2aW5nIHRvIFBhcnNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2VlblxuICAgKiBAcGFyYW0gb2ZmbGluZVxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKHNlZW4sIG9mZmxpbmUpIHtcbiAgICBjb25zdCBzZWVuRW50cnkgPSB0aGlzLmlkID8gdGhpcy5jbGFzc05hbWUgKyAnOicgKyB0aGlzLmlkIDogdGhpcztcbiAgICBzZWVuID0gc2VlbiB8fCBbc2VlbkVudHJ5XTtcbiAgICBjb25zdCBqc29uID0ge307XG4gICAgY29uc3QgYXR0cnMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJzKSB7XG4gICAgICBpZiAoKGF0dHIgPT09ICdjcmVhdGVkQXQnIHx8IGF0dHIgPT09ICd1cGRhdGVkQXQnKSAmJiBhdHRyc1thdHRyXS50b0pTT04pIHtcbiAgICAgICAganNvblthdHRyXSA9IGF0dHJzW2F0dHJdLnRvSlNPTigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvblthdHRyXSA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKGF0dHJzW2F0dHJdLCBmYWxzZSwgZmFsc2UsIHNlZW4sIG9mZmxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBwZW5kaW5nWzBdKSB7XG4gICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKGF0dHIpLmNhbGwoYXR0ciwgJy4nKSA8IDApIHtcbiAgICAgICAganNvblthdHRyXSA9IHBlbmRpbmdbMF1bYXR0cl0udG9KU09OKG9mZmxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5pZCkge1xuICAgICAganNvbi5vYmplY3RJZCA9IHRoaXMuaWQ7XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGlzIFBhcnNlT2JqZWN0IGlzIGVxdWFsIHRvIGFub3RoZXIgUGFyc2VPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG90aGVyIC0gQW4gb3RoZXIgb2JqZWN0IG90IGNvbXBhcmVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAodGhpcyA9PT0gb3RoZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCAmJiB0aGlzLmNsYXNzTmFtZSA9PT0gb3RoZXIuY2xhc3NOYW1lICYmIHRoaXMuaWQgPT09IG90aGVyLmlkICYmIHR5cGVvZiB0aGlzLmlkICE9PSAndW5kZWZpbmVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGxhc3RcbiAgICogc2F2ZS9yZWZyZXNoLiAgSWYgYW4gYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgaXQgcmV0dXJucyB0cnVlIG9ubHkgaWYgdGhhdFxuICAgKiBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBzYXZlL3JlZnJlc2guXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIEFuIGF0dHJpYnV0ZSBuYW1lIChvcHRpb25hbCkuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZGlydHkoYXR0cikge1xuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmdPcHMgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgY29uc3QgZGlydHlPYmplY3RzID0gdGhpcy5fZ2V0RGlydHlPYmplY3RBdHRyaWJ1dGVzKCk7XG4gICAgaWYgKGF0dHIpIHtcbiAgICAgIGlmIChkaXJ0eU9iamVjdHMuaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmdPcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBlbmRpbmdPcHNbaV0uaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoKDAsIF9rZXlzLmRlZmF1bHQpKHBlbmRpbmdPcHNbMF0pLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICgoMCwgX2tleXMuZGVmYXVsdCkoZGlydHlPYmplY3RzKS5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBrZXlzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGxhc3Qgc2F2ZS9yZWZyZXNoXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGRpcnR5S2V5cygpIHtcbiAgICBjb25zdCBwZW5kaW5nT3BzID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGNvbnN0IGtleXMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmdPcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBwZW5kaW5nT3BzW2ldKSB7XG4gICAgICAgIGtleXNbYXR0cl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaXJ0eU9iamVjdHMgPSB0aGlzLl9nZXREaXJ0eU9iamVjdEF0dHJpYnV0ZXMoKTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gZGlydHlPYmplY3RzKSB7XG4gICAgICBrZXlzW2F0dHJdID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfa2V5cy5kZWZhdWx0KShrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBmZXRjaGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzRGF0YUF2YWlsYWJsZSgpIHtcbiAgICBjb25zdCBzZXJ2ZXJEYXRhID0gdGhpcy5fZ2V0U2VydmVyRGF0YSgpO1xuICAgIHJldHVybiAhISgwLCBfa2V5cy5kZWZhdWx0KShzZXJ2ZXJEYXRhKS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIFBvaW50ZXIgcmVmZXJlbmNpbmcgdGhpcyBPYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQb2ludGVyfVxuICAgKi9cbiAgdG9Qb2ludGVyKCkge1xuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGEgcG9pbnRlciB0byBhbiB1bnNhdmVkIFBhcnNlT2JqZWN0Jyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogdGhpcy5pZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIFBvaW50ZXIgcmVmZXJlbmNpbmcgdGhpcyBPYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQb2ludGVyfVxuICAgKi9cbiAgdG9PZmZsaW5lUG9pbnRlcigpIHtcbiAgICBpZiAoIXRoaXMuX2xvY2FsSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBhIG9mZmxpbmUgcG9pbnRlciB0byBhIHNhdmVkIFBhcnNlT2JqZWN0Jyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdPYmplY3QnLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIF9sb2NhbElkOiB0aGlzLl9sb2NhbElkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBzdHJpbmcgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZ2V0KGF0dHIpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2F0dHJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWxhdGlvbiBvbiB0aGUgZ2l2ZW4gY2xhc3MgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBhdHRyaWJ1dGUgdG8gZ2V0IHRoZSByZWxhdGlvbiBmb3IuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5SZWxhdGlvbn1cbiAgICovXG4gIHJlbGF0aW9uKGF0dHIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KGF0dHIpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxlZCByZWxhdGlvbigpIG9uIG5vbi1yZWxhdGlvbiBmaWVsZCAnICsgYXR0cik7XG4gICAgICB9XG4gICAgICB2YWx1ZS5fZW5zdXJlUGFyZW50QW5kS2V5KHRoaXMsIGF0dHIpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQodGhpcywgYXR0cik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgSFRNTC1lc2NhcGVkIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIHN0cmluZyBuYW1lIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVzY2FwZShhdHRyKSB7XG4gICAgbGV0IHZhbCA9IHRoaXMuYXR0cmlidXRlc1thdHRyXTtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbC50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICB2YWwgPSB2YWwudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfZXNjYXBlLmRlZmF1bHQpKHZhbCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIGNvbnRhaW5zIGEgdmFsdWUgdGhhdCBpcyBub3RcbiAgICogbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGhhcyhhdHRyKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNbYXR0cl0gIT0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBoYXNoIG9mIG1vZGVsIGF0dHJpYnV0ZXMgb24gdGhlIG9iamVjdC5cbiAgICpcbiAgICogPHA+WW91IGNhbiBjYWxsIGl0IHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcga2V5cyBhbmQgdmFsdWVzLCB3aXRoIG9uZVxuICAgKiBrZXkgYW5kIHZhbHVlLCBvciBkb3Qgbm90YXRpb24uICBGb3IgZXhhbXBsZTo8cHJlPlxuICAgKiAgIGdhbWVUdXJuLnNldCh7XG4gICAqICAgICBwbGF5ZXI6IHBsYXllcjEsXG4gICAqICAgICBkaWNlUm9sbDogMlxuICAgKiAgIH0sIHtcbiAgICogICAgIGVycm9yOiBmdW5jdGlvbihnYW1lVHVybkFnYWluLCBlcnJvcikge1xuICAgKiAgICAgICAvLyBUaGUgc2V0IGZhaWxlZCB2YWxpZGF0aW9uLlxuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIGdhbWUuc2V0KFwiY3VycmVudFBsYXllclwiLCBwbGF5ZXIyLCB7XG4gICAqICAgICBlcnJvcjogZnVuY3Rpb24oZ2FtZVR1cm5BZ2FpbiwgZXJyb3IpIHtcbiAgICogICAgICAgLy8gVGhlIHNldCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogICBnYW1lLnNldChcImZpbmlzaGVkXCIsIHRydWUpOzwvcHJlPjwvcD5cbiAgICpcbiAgICogICBnYW1lLnNldChcInBsYXllci5zY29yZVwiLCAxMCk7PC9wcmU+PC9wPlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KX0ga2V5IFRoZSBrZXkgdG8gc2V0LlxuICAgKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KX0gdmFsdWUgVGhlIHZhbHVlIHRvIGdpdmUgaXQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIEEgc2V0IG9mIG9wdGlvbnMgZm9yIHRoZSBzZXQuXG4gICAqICAgICBUaGUgb25seSBzdXBwb3J0ZWQgb3B0aW9uIGlzIDxjb2RlPmVycm9yPC9jb2RlPi5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdHxib29sZWFuKX0gdHJ1ZSBpZiB0aGUgc2V0IHN1Y2NlZWRlZC5cbiAgICovXG4gIHNldChrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgbGV0IGNoYW5nZXMgPSB7fTtcbiAgICBjb25zdCBuZXdPcHMgPSB7fTtcbiAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICBjaGFuZ2VzID0ga2V5O1xuICAgICAgb3B0aW9ucyA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNoYW5nZXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgbGV0IHJlYWRvbmx5ID0gW107XG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVhZG9ubHkgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShyZWFkb25seSkuY2FsbChyZWFkb25seSwgdGhpcy5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMoKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgayBpbiBjaGFuZ2VzKSB7XG4gICAgICBpZiAoayA9PT0gJ2NyZWF0ZWRBdCcgfHwgayA9PT0gJ3VwZGF0ZWRBdCcpIHtcbiAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBpcyByZWFkLW9ubHksIGJ1dCBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc2lsZW50bHlcbiAgICAgICAgLy8gaWdub3JlIGl0XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShyZWFkb25seSkuY2FsbChyZWFkb25seSwgaykgPiAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtb2RpZnkgcmVhZG9ubHkgYXR0cmlidXRlOiAnICsgayk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy51bnNldCkge1xuICAgICAgICBuZXdPcHNba10gPSBuZXcgX1BhcnNlT3AuVW5zZXRPcCgpO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzW2tdIGluc3RhbmNlb2YgX1BhcnNlT3AuT3ApIHtcbiAgICAgICAgbmV3T3BzW2tdID0gY2hhbmdlc1trXTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlc1trXSAmJiB0eXBlb2YgY2hhbmdlc1trXSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGNoYW5nZXNba10uX19vcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmV3T3BzW2tdID0gKDAsIF9QYXJzZU9wLm9wRnJvbUpTT04pKGNoYW5nZXNba10pO1xuICAgICAgfSBlbHNlIGlmIChrID09PSAnb2JqZWN0SWQnIHx8IGsgPT09ICdpZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGFuZ2VzW2tdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuaWQgPSBjaGFuZ2VzW2tdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGsgPT09ICdBQ0wnICYmIHR5cGVvZiBjaGFuZ2VzW2tdID09PSAnb2JqZWN0JyAmJiAhKGNoYW5nZXNba10gaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCkpIHtcbiAgICAgICAgbmV3T3BzW2tdID0gbmV3IF9QYXJzZU9wLlNldE9wKG5ldyBfUGFyc2VBQ0wuZGVmYXVsdChjaGFuZ2VzW2tdKSk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNba10gaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uID0gbmV3IF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQodGhpcywgayk7XG4gICAgICAgIHJlbGF0aW9uLnRhcmdldENsYXNzTmFtZSA9IGNoYW5nZXNba10udGFyZ2V0Q2xhc3NOYW1lO1xuICAgICAgICBuZXdPcHNba10gPSBuZXcgX1BhcnNlT3AuU2V0T3AocmVsYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T3BzW2tdID0gbmV3IF9QYXJzZU9wLlNldE9wKGNoYW5nZXNba10pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjdXJyZW50QXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgdmFsdWVzXG4gICAgY29uc3QgbmV3VmFsdWVzID0ge307XG4gICAgZm9yIChjb25zdCBhdHRyIGluIG5ld09wcykge1xuICAgICAgaWYgKG5ld09wc1thdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlJlbGF0aW9uT3ApIHtcbiAgICAgICAgbmV3VmFsdWVzW2F0dHJdID0gbmV3T3BzW2F0dHJdLmFwcGx5VG8oY3VycmVudEF0dHJpYnV0ZXNbYXR0cl0sIHRoaXMsIGF0dHIpO1xuICAgICAgfSBlbHNlIGlmICghKG5ld09wc1thdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlVuc2V0T3ApKSB7XG4gICAgICAgIG5ld1ZhbHVlc1thdHRyXSA9IG5ld09wc1thdHRyXS5hcHBseVRvKGN1cnJlbnRBdHRyaWJ1dGVzW2F0dHJdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjaGFuZ2VzXG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZVZhbGlkYXRpb24pIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlKG5ld1ZhbHVlcyk7XG4gICAgICBpZiAodmFsaWRhdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRpb25zLmVycm9yKHRoaXMsIHZhbGlkYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb25zb2xpZGF0ZSBPcHNcbiAgICBjb25zdCBwZW5kaW5nT3BzID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGNvbnN0IGxhc3QgPSBwZW5kaW5nT3BzLmxlbmd0aCAtIDE7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgZm9yIChjb25zdCBhdHRyIGluIG5ld09wcykge1xuICAgICAgY29uc3QgbmV4dE9wID0gbmV3T3BzW2F0dHJdLm1lcmdlV2l0aChwZW5kaW5nT3BzW2xhc3RdW2F0dHJdKTtcbiAgICAgIHN0YXRlQ29udHJvbGxlci5zZXRQZW5kaW5nT3AodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIGF0dHIsIG5leHRPcCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgbW9kZWwuIFRoaXMgaXMgYSBub29wIGlmIHRoZSBhdHRyaWJ1dGUgZG9lc24ndFxuICAgKiBleGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIHN0cmluZyBuYW1lIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgdW5zZXQoYXR0ciwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMudW5zZXQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBudWxsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdGhlIG5leHQgdGltZSB0aGVcbiAgICogb2JqZWN0IGlzIHNhdmVkLiBJZiBubyBhbW91bnQgaXMgc3BlY2lmaWVkLCAxIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGFtb3VudCB7TnVtYmVyfSBUaGUgYW1vdW50IHRvIGluY3JlbWVudCBieSAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0fGJvb2xlYW4pfVxuICAgKi9cbiAgaW5jcmVtZW50KGF0dHIsIGFtb3VudCkge1xuICAgIGlmICh0eXBlb2YgYW1vdW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgYW1vdW50ID0gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbmNyZW1lbnQgYnkgYSBub24tbnVtZXJpYyBhbW91bnQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuSW5jcmVtZW50T3AoYW1vdW50KSk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSBkZWNyZW1lbnRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHRoZSBuZXh0IHRpbWUgdGhlXG4gICAqIG9iamVjdCBpcyBzYXZlZC4gSWYgbm8gYW1vdW50IGlzIHNwZWNpZmllZCwgMSBpcyB1c2VkIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBhbW91bnQge051bWJlcn0gVGhlIGFtb3VudCB0byBkZWNyZW1lbnQgYnkgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgZGVjcmVtZW50KGF0dHIsIGFtb3VudCkge1xuICAgIGlmICh0eXBlb2YgYW1vdW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgYW1vdW50ID0gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBkZWNyZW1lbnQgYnkgYSBub24tbnVtZXJpYyBhbW91bnQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuSW5jcmVtZW50T3AoYW1vdW50ICogLTEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGFkZCBhbiBvYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW5cbiAgICoga2V5LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gaXRlbSB7fSBUaGUgaXRlbSB0byBhZGQuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIGFkZChhdHRyLCBpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5BZGRPcChbaXRlbV0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGFkZCB0aGUgb2JqZWN0cyB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICAgKiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBpdGVtcyB7T2JqZWN0W119IFRoZSBpdGVtcyB0byBhZGQuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIGFkZEFsbChhdHRyLCBpdGVtcykge1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuQWRkT3AoaXRlbXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGFkZCBhbiBvYmplY3QgdG8gdGhlIGFycmF5IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleSwgb25seVxuICAgKiBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBhcnJheS4gVGhlIHBvc2l0aW9uIG9mIHRoZSBpbnNlcnQgaXNcbiAgICogbm90IGd1YXJhbnRlZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBpdGVtIHt9IFRoZSBvYmplY3QgdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICBhZGRVbmlxdWUoYXR0ciwgaXRlbSkge1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuQWRkVW5pcXVlT3AoW2l0ZW1dKSk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSBhZGQgdGhlIG9iamVjdHMgdG8gdGhlIGFycmF5IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleSwgb25seVxuICAgKiBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBhcnJheS4gVGhlIHBvc2l0aW9uIG9mIHRoZSBpbnNlcnQgaXNcbiAgICogbm90IGd1YXJhbnRlZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBpdGVtcyB7T2JqZWN0W119IFRoZSBvYmplY3RzIHRvIGFkZC5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgYWRkQWxsVW5pcXVlKGF0dHIsIGl0ZW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5BZGRVbmlxdWVPcChpdGVtcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgcmVtb3ZlIGFsbCBpbnN0YW5jZXMgb2YgYW4gb2JqZWN0IGZyb20gdGhlIGFycmF5IGFzc29jaWF0ZWRcbiAgICogd2l0aCBhIGdpdmVuIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW0ge30gVGhlIG9iamVjdCB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIHJlbW92ZShhdHRyLCBpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5SZW1vdmVPcChbaXRlbV0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IHJlbW92ZSBhbGwgaW5zdGFuY2VzIG9mIHRoZSBvYmplY3RzIGZyb20gdGhlIGFycmF5IGFzc29jaWF0ZWRcbiAgICogd2l0aCBhIGdpdmVuIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW1zIHtPYmplY3RbXX0gVGhlIG9iamVjdCB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIHJlbW92ZUFsbChhdHRyLCBpdGVtcykge1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuUmVtb3ZlT3AoaXRlbXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgUGFyc2UuT3AgZGVzY3JpYmluZyB3aGF0IGtpbmQgb2ZcbiAgICogbW9kaWZpY2F0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZCBvbiB0aGlzIGZpZWxkIHNpbmNlIHRoZSBsYXN0IHRpbWUgaXQgd2FzXG4gICAqIHNhdmVkLiBGb3IgZXhhbXBsZSwgYWZ0ZXIgY2FsbGluZyBvYmplY3QuaW5jcmVtZW50KFwieFwiKSwgY2FsbGluZ1xuICAgKiBvYmplY3Qub3AoXCJ4XCIpIHdvdWxkIHJldHVybiBhbiBpbnN0YW5jZSBvZiBQYXJzZS5PcC5JbmNyZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PcCB8IHVuZGVmaW5lZH0gVGhlIG9wZXJhdGlvbiwgb3IgdW5kZWZpbmVkIGlmIG5vbmUuXG4gICAqL1xuICBvcChhdHRyKSB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX2dldFBlbmRpbmdPcHMoKTtcbiAgICBmb3IgKGxldCBpID0gcGVuZGluZy5sZW5ndGg7IGktLTspIHtcbiAgICAgIGlmIChwZW5kaW5nW2ldW2F0dHJdKSB7XG4gICAgICAgIHJldHVybiBwZW5kaW5nW2ldW2F0dHJdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IG1vZGVsIHdpdGggaWRlbnRpY2FsIGF0dHJpYnV0ZXMgdG8gdGhpcyBvbmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9XG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICBjb25zdCBjbG9uZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuY2xhc3NOYW1lKTtcbiAgICBsZXQgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uc3RydWN0b3IucmVhZE9ubHlBdHRyaWJ1dGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCByZWFkb25seSA9IHRoaXMuY29uc3RydWN0b3IucmVhZE9ubHlBdHRyaWJ1dGVzKCkgfHwgW107XG4gICAgICAvLyBBdHRyaWJ1dGVzIGFyZSBmcm96ZW4sIHNvIHdlIGhhdmUgdG8gcmVidWlsZCBhbiBvYmplY3QsXG4gICAgICAvLyByYXRoZXIgdGhhbiBkZWxldGUgcmVhZG9ubHkga2V5c1xuICAgICAgY29uc3QgY29weSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBhIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShyZWFkb25seSkuY2FsbChyZWFkb25seSwgYSkgPCAwKSB7XG4gICAgICAgICAgY29weVthXSA9IGF0dHJpYnV0ZXNbYV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF0dHJpYnV0ZXMgPSBjb3B5O1xuICAgIH1cbiAgICBpZiAoY2xvbmUuc2V0KSB7XG4gICAgICBjbG9uZS5zZXQoYXR0cmlidXRlcyk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgb2JqZWN0LiBOb3QgdG8gYmUgY29uZnVzZWQgd2l0aCBjbG9uZSgpXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9XG4gICAqL1xuICBuZXdJbnN0YW5jZSgpIHtcbiAgICBjb25zdCBjbG9uZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuY2xhc3NOYW1lKTtcbiAgICBjbG9uZS5pZCA9IHRoaXMuaWQ7XG4gICAgaWYgKHNpbmdsZUluc3RhbmNlKSB7XG4gICAgICAvLyBKdXN0IHJldHVybiBhbiBvYmplY3Qgd2l0aCB0aGUgcmlnaHQgaWRcbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgaWYgKHN0YXRlQ29udHJvbGxlcikge1xuICAgICAgc3RhdGVDb250cm9sbGVyLmR1cGxpY2F0ZVN0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpLCBjbG9uZS5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgb2JqZWN0IGhhcyBuZXZlciBiZWVuIHNhdmVkIHRvIFBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzTmV3KCkge1xuICAgIHJldHVybiAhdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQgYnkgdGhlIFBhcnNlIHNlcnZlciB3aGVuIHRoZVxuICAgKiBvYmplY3QgbWlnaHQgaGF2ZSBhbHJlYWR5IGJlZW4gdGhlcmUgKGUuZy4gaW4gdGhlIGNhc2Ugb2YgYSBGYWNlYm9va1xuICAgKiBsb2dpbilcbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBleGlzdGVkKCkge1xuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgaWYgKHN0YXRlKSB7XG4gICAgICByZXR1cm4gc3RhdGUuZXhpc3RlZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9iamVjdCBleGlzdHMgb24gdGhlIFNlcnZlclxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgYm9vbGVhbiBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIGlmIG9iamVjdCBleGlzdHMuXG4gICAqL1xuICBhc3luYyBleGlzdHMob3B0aW9ucykge1xuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgUGFyc2VRdWVyeSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUXVlcnkoKTtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkodGhpcy5jbGFzc05hbWUpO1xuICAgICAgYXdhaXQgcXVlcnkuZ2V0KHRoaXMuaWQsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgY3VycmVudGx5IGluIGEgdmFsaWQgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gIXRoaXMudmFsaWRhdGUodGhpcy5hdHRyaWJ1dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3Ugc2hvdWxkIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkgdW5sZXNzIHlvdSBzdWJjbGFzc1xuICAgKiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LCBpbiB3aGljaCBjYXNlIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2RcbiAgICogdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHZhbGlkYXRpb24gb24gPGNvZGU+c2V0PC9jb2RlPiBhbmRcbiAgICogPGNvZGU+c2F2ZTwvY29kZT4uICBZb3VyIGltcGxlbWVudGF0aW9uIHNob3VsZCByZXR1cm5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJzIFRoZSBjdXJyZW50IGRhdGEgdG8gdmFsaWRhdGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5FcnJvcnxib29sZWFufSBGYWxzZSBpZiB0aGUgZGF0YSBpcyB2YWxpZC4gIEFuIGVycm9yIG9iamVjdCBvdGhlcndpc2UuXG4gICAqIEBzZWUgUGFyc2UuT2JqZWN0I3NldFxuICAgKi9cbiAgdmFsaWRhdGUoYXR0cnMpIHtcbiAgICBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkoJ0FDTCcpICYmICEoYXR0cnMuQUNMIGluc3RhbmNlb2YgX1BhcnNlQUNMLmRlZmF1bHQpKSB7XG4gICAgICByZXR1cm4gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ0FDTCBtdXN0IGJlIGEgUGFyc2UgQUNMLicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgICAgaWYgKCEvXltBLVphLXpdWzAtOUEtWmEtel8uXSokLy50ZXN0KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9LRVlfTkFNRSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBBQ0wgZm9yIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuQUNMfG51bGx9IEFuIGluc3RhbmNlIG9mIFBhcnNlLkFDTC5cbiAgICogQHNlZSBQYXJzZS5PYmplY3QjZ2V0XG4gICAqL1xuICBnZXRBQ0woKSB7XG4gICAgY29uc3QgYWNsID0gdGhpcy5nZXQoJ0FDTCcpO1xuICAgIGlmIChhY2wgaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCkge1xuICAgICAgcmV0dXJuIGFjbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgQUNMIHRvIGJlIHVzZWQgZm9yIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlLkFDTH0gYWNsIEFuIGluc3RhbmNlIG9mIFBhcnNlLkFDTC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfSBXaGV0aGVyIHRoZSBzZXQgcGFzc2VkIHZhbGlkYXRpb24uXG4gICAqIEBzZWUgUGFyc2UuT2JqZWN0I3NldFxuICAgKi9cbiAgc2V0QUNMKGFjbCwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnNldCgnQUNMJywgYWNsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW55IChvciBzcGVjaWZpYykgY2hhbmdlcyB0byB0aGlzIG9iamVjdCBtYWRlIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gc2F2ZSgpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5c10gLSBzcGVjaWZ5IHdoaWNoIGZpZWxkcyB0byByZXZlcnRcbiAgICovXG4gIHJldmVydCgpIHtcbiAgICBsZXQga2V5c1RvUmV2ZXJ0O1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAga2V5c1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICBrZXlzVG9SZXZlcnQgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAga2V5c1RvUmV2ZXJ0LnB1c2goa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlLk9iamVjdCNyZXZlcnQgZXhwZWN0cyBlaXRoZXIgbm8sIG9yIGEgbGlzdCBvZiBzdHJpbmcsIGFyZ3VtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jbGVhclBlbmRpbmdPcHMoa2V5c1RvUmV2ZXJ0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIGF0dHJpYnV0ZXMgb24gYSBtb2RlbFxuICAgKlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgIGNvbnN0IGVyYXNhYmxlID0ge307XG4gICAgbGV0IHJlYWRvbmx5ID0gWydjcmVhdGVkQXQnLCAndXBkYXRlZEF0J107XG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVhZG9ubHkgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShyZWFkb25seSkuY2FsbChyZWFkb25seSwgdGhpcy5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMoKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHJlYWRvbmx5KS5jYWxsKHJlYWRvbmx5LCBhdHRyKSA8IDApIHtcbiAgICAgICAgZXJhc2FibGVbYXR0cl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXQoZXJhc2FibGUsIHtcbiAgICAgIHVuc2V0OiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIG1vZGVsIGZyb20gdGhlIHNlcnZlci4gSWYgdGhlIHNlcnZlcidzIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuICAgKiBtb2RlbCBkaWZmZXJzIGZyb20gaXRzIGN1cnJlbnQgYXR0cmlidXRlcywgdGhleSB3aWxsIGJlIG92ZXJyaWRlbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmluY2x1ZGU6IFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS4gQ2FuIGJlIGEgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLFxuICAgKiAgICAgICBvciBhbiBhcnJheSBvZiBhcnJheSBvZiBzdHJpbmdzLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZUZpbmRgIHRyaWdnZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgZmV0Y2hcbiAgICogICAgIGNvbXBsZXRlcy5cbiAgICovXG4gIGZldGNoKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZldGNoT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBmZXRjaE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZldGNoT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5jbHVkZScpKSB7XG4gICAgICBmZXRjaE9wdGlvbnMuaW5jbHVkZSA9IFtdO1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvcHRpb25zLmluY2x1ZGUpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDtcbiAgICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0ID0gb3B0aW9ucy5pbmNsdWRlKS5jYWxsKF9jb250ZXh0LCBrZXkgPT4ge1xuICAgICAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICAgICAgdmFyIF9jb250ZXh0MjtcbiAgICAgICAgICAgIGZldGNoT3B0aW9ucy5pbmNsdWRlID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQyID0gZmV0Y2hPcHRpb25zLmluY2x1ZGUpLmNhbGwoX2NvbnRleHQyLCBrZXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuaW5jbHVkZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZldGNoT3B0aW9ucy5pbmNsdWRlLnB1c2gob3B0aW9ucy5pbmNsdWRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5mZXRjaCh0aGlzLCB0cnVlLCBmZXRjaE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBtb2RlbCBmcm9tIHRoZSBzZXJ2ZXIuIElmIHRoZSBzZXJ2ZXIncyByZXByZXNlbnRhdGlvbiBvZiB0aGVcbiAgICogbW9kZWwgZGlmZmVycyBmcm9tIGl0cyBjdXJyZW50IGF0dHJpYnV0ZXMsIHRoZXkgd2lsbCBiZSBvdmVycmlkZW4uXG4gICAqXG4gICAqIEluY2x1ZGVzIG5lc3RlZCBQYXJzZS5PYmplY3RzIGZvciB0aGUgcHJvdmlkZWQga2V5LiBZb3UgY2FuIHVzZSBkb3RcbiAgICogbm90YXRpb24gdG8gc3BlY2lmeSB3aGljaCBmaWVsZHMgaW4gdGhlIGluY2x1ZGVkIG9iamVjdCBhcmUgYWxzbyBmZXRjaGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IEFycmF5PHN0cmluZz4+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgZmV0Y2hcbiAgICogICAgIGNvbXBsZXRlcy5cbiAgICovXG4gIGZldGNoV2l0aEluY2x1ZGUoa2V5cywgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuaW5jbHVkZSA9IGtleXM7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2gob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhpcyBvYmplY3QgdG8gdGhlIHNlcnZlciBhdCBzb21lIHVuc3BlY2lmaWVkIHRpbWUgaW4gdGhlIGZ1dHVyZSxcbiAgICogZXZlbiBpZiBQYXJzZSBpcyBjdXJyZW50bHkgaW5hY2Nlc3NpYmxlLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIHlvdSBtYXkgbm90IGhhdmUgYSBzb2xpZCBuZXR3b3JrIGNvbm5lY3Rpb24sIGFuZCBkb24ndCBuZWVkIHRvIGtub3cgd2hlbiB0aGUgc2F2ZSBjb21wbGV0ZXMuXG4gICAqIElmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSB3aXRoIHRoZSBvYmplY3Qgc3VjaCB0aGF0IGl0IGNhbid0IGJlIHNhdmVkLCBpdCB3aWxsIGJlIHNpbGVudGx5IGRpc2NhcmRlZC5cbiAgICpcbiAgICogT2JqZWN0cyBzYXZlZCB3aXRoIHRoaXMgbWV0aG9kIHdpbGwgYmUgc3RvcmVkIGxvY2FsbHkgaW4gYW4gb24tZGlzayBjYWNoZSB1bnRpbCB0aGV5IGNhbiBiZSBkZWxpdmVyZWQgdG8gUGFyc2UuXG4gICAqIFRoZXkgd2lsbCBiZSBzZW50IGltbWVkaWF0ZWx5IGlmIHBvc3NpYmxlLiBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBzZW50IHRoZSBuZXh0IHRpbWUgYSBuZXR3b3JrIGNvbm5lY3Rpb24gaXNcbiAgICogYXZhaWxhYmxlLiBPYmplY3RzIHNhdmVkIHRoaXMgd2F5IHdpbGwgcGVyc2lzdCBldmVuIGFmdGVyIHRoZSBhcHAgaXMgY2xvc2VkLCBpbiB3aGljaCBjYXNlIHRoZXkgd2lsbCBiZSBzZW50IHRoZVxuICAgKiBuZXh0IHRpbWUgdGhlIGFwcCBpcyBvcGVuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICogVXNlZCB0byBwYXNzIG9wdGlvbiBwYXJhbWV0ZXJzIHRvIG1ldGhvZCBpZiBhcmcxIGFuZCBhcmcyIHdlcmUgYm90aCBwYXNzZWQgYXMgc3RyaW5ncy5cbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6XG4gICAqIDx1bD5cbiAgICogPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDxsaT5jYXNjYWRlU2F2ZTogSWYgYGZhbHNlYCwgbmVzdGVkIG9iamVjdHMgd2lsbCBub3QgYmUgc2F2ZWQgKGRlZmF1bHQgaXMgYHRydWVgKS5cbiAgICogPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlU2F2ZWAgYW5kIGBhZnRlclNhdmVgIHRyaWdnZXJzLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHNhdmVcbiAgICogY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgc2F2ZUV2ZW50dWFsbHkob3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmUobnVsbCwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5DT05ORUNUSU9OX0ZBSUxFRCkge1xuICAgICAgICBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKS5zYXZlKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKS5wb2xsKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGhhc2ggb2YgbW9kZWwgYXR0cmlidXRlcywgYW5kIHNhdmUgdGhlIG1vZGVsIHRvIHRoZSBzZXJ2ZXIuXG4gICAqIHVwZGF0ZWRBdCB3aWxsIGJlIHVwZGF0ZWQgd2hlbiB0aGUgcmVxdWVzdCByZXR1cm5zLlxuICAgKiBZb3UgY2FuIGVpdGhlciBjYWxsIGl0IGFzOjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKCk7PC9wcmU+XG4gICAqIG9yPHByZT5cbiAgICogb2JqZWN0LnNhdmUoYXR0cnMpOzwvcHJlPlxuICAgKiBvcjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKG51bGwsIG9wdGlvbnMpOzwvcHJlPlxuICAgKiBvcjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKGF0dHJzLCBvcHRpb25zKTs8L3ByZT5cbiAgICogb3I8cHJlPlxuICAgKiBvYmplY3Quc2F2ZShrZXksIHZhbHVlKTs8L3ByZT5cbiAgICogb3I8cHJlPlxuICAgKiBvYmplY3Quc2F2ZShrZXksIHZhbHVlLCBvcHRpb25zKTs8L3ByZT5cbiAgICpcbiAgICogRXhhbXBsZSAxOiA8cHJlPlxuICAgKiBnYW1lVHVybi5zYXZlKHtcbiAgICogcGxheWVyOiBcIkpha2UgQ3V0dGVyXCIsXG4gICAqIGRpY2VSb2xsOiAyXG4gICAqIH0pLnRoZW4oZnVuY3Rpb24oZ2FtZVR1cm5BZ2Fpbikge1xuICAgKiAvLyBUaGUgc2F2ZSB3YXMgc3VjY2Vzc2Z1bC5cbiAgICogfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICogLy8gVGhlIHNhdmUgZmFpbGVkLiAgRXJyb3IgaXMgYW4gaW5zdGFuY2Ugb2YgUGFyc2UuRXJyb3IuXG4gICAqIH0pOzwvcHJlPlxuICAgKlxuICAgKiBFeGFtcGxlIDI6IDxwcmU+XG4gICAqIGdhbWVUdXJuLnNhdmUoXCJwbGF5ZXJcIiwgXCJKYWtlIEN1dHRlclwiKTs8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBvYmplY3QgfCBudWxsfSBbYXJnMV1cbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiA8bGk+YE9iamVjdGAgLSBLZXkvdmFsdWUgcGFpcnMgdG8gdXBkYXRlIG9uIHRoZSBvYmplY3QuPC9saT5cbiAgICogPGxpPmBTdHJpbmdgIEtleSAtIEtleSBvZiBhdHRyaWJ1dGUgdG8gdXBkYXRlIChyZXF1aXJlcyBhcmcyIHRvIGFsc28gYmUgc3RyaW5nKTwvbGk+XG4gICAqIDxsaT5gbnVsbGAgLSBQYXNzaW5nIG51bGwgZm9yIGFyZzEgYWxsb3dzIHlvdSB0byBzYXZlIHRoZSBvYmplY3Qgd2l0aCBvcHRpb25zIHBhc3NlZCBpbiBhcmcyLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgb2JqZWN0fSBbYXJnMl1cbiAgICogPHVsPlxuICAgKiA8bGk+YFN0cmluZ2AgVmFsdWUgLSBJZiBhcmcxIHdhcyBwYXNzZWQgYXMgYSBrZXksIGFyZzIgaXMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGF0IGtleS48L2xpPlxuICAgKiA8bGk+YE9iamVjdGAgT3B0aW9ucyAtIFZhbGlkIG9wdGlvbnMgYXJlOlxuICAgKiA8dWw+XG4gICAqIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDxsaT5jYXNjYWRlU2F2ZTogSWYgYGZhbHNlYCwgbmVzdGVkIG9iamVjdHMgd2lsbCBub3QgYmUgc2F2ZWQgKGRlZmF1bHQgaXMgYHRydWVgKS5cbiAgICogPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlU2F2ZWAgYW5kIGBhZnRlclNhdmVgIHRyaWdnZXJzLlxuICAgKiA8L3VsPlxuICAgKiA8L2xpPlxuICAgKiA8L3VsPlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZzNdXG4gICAqIFVzZWQgdG8gcGFzcyBvcHRpb24gcGFyYW1ldGVycyB0byBtZXRob2QgaWYgYXJnMSBhbmQgYXJnMiB3ZXJlIGJvdGggcGFzc2VkIGFzIHN0cmluZ3MuXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOlxuICAgKiA8dWw+XG4gICAqIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDxsaT5jYXNjYWRlU2F2ZTogSWYgYGZhbHNlYCwgbmVzdGVkIG9iamVjdHMgd2lsbCBub3QgYmUgc2F2ZWQgKGRlZmF1bHQgaXMgYHRydWVgKS5cbiAgICogPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlU2F2ZWAgYW5kIGBhZnRlclNhdmVgIHRyaWdnZXJzLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHNhdmVcbiAgICogY29tcGxldGVzLlxuICAgKi9cbiAgc2F2ZShhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgbGV0IGF0dHJzO1xuICAgIGxldCBvcHRpb25zO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGFyZzEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBhdHRycyA9IGFyZzE7XG4gICAgICBpZiAodHlwZW9mIGFyZzIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdGlvbnMgPSBhcmcyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhdHRycyA9IHt9O1xuICAgICAgYXR0cnNbYXJnMV0gPSBhcmcyO1xuICAgICAgb3B0aW9ucyA9IGFyZzM7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmIChhdHRycykge1xuICAgICAgbGV0IHZhbGlkYXRpb25FcnJvcjtcbiAgICAgIG9wdGlvbnMuZXJyb3IgPSAoXywgdmFsaWRhdGlvbikgPT4ge1xuICAgICAgICB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0aW9uO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnNldChhdHRycywgb3B0aW9ucyk7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KHZhbGlkYXRpb25FcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNhdmVPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBzYXZlT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSAhIW9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykgJiYgdHlwZW9mIG9wdGlvbnMuc2Vzc2lvblRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgc2F2ZU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdpbnN0YWxsYXRpb25JZCcpICYmIHR5cGVvZiBvcHRpb25zLmluc3RhbGxhdGlvbklkID09PSAnc3RyaW5nJykge1xuICAgICAgc2F2ZU9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPSBvcHRpb25zLmluc3RhbGxhdGlvbklkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBzYXZlT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHVuc2F2ZWQgPSBvcHRpb25zLmNhc2NhZGVTYXZlICE9PSBmYWxzZSA/ICgwLCBfdW5zYXZlZENoaWxkcmVuLmRlZmF1bHQpKHRoaXMpIDogbnVsbDtcbiAgICByZXR1cm4gY29udHJvbGxlci5zYXZlKHVuc2F2ZWQsIHNhdmVPcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLnNhdmUodGhpcywgc2F2ZU9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhpcyBvYmplY3QgZnJvbSB0aGUgc2VydmVyIGF0IHNvbWUgdW5zcGVjaWZpZWQgdGltZSBpbiB0aGUgZnV0dXJlLFxuICAgKiBldmVuIGlmIFBhcnNlIGlzIGN1cnJlbnRseSBpbmFjY2Vzc2libGUuXG4gICAqXG4gICAqIFVzZSB0aGlzIHdoZW4geW91IG1heSBub3QgaGF2ZSBhIHNvbGlkIG5ldHdvcmsgY29ubmVjdGlvbixcbiAgICogYW5kIGRvbid0IG5lZWQgdG8ga25vdyB3aGVuIHRoZSBkZWxldGUgY29tcGxldGVzLiBJZiB0aGVyZSBpcyBzb21lIHByb2JsZW0gd2l0aCB0aGUgb2JqZWN0XG4gICAqIHN1Y2ggdGhhdCBpdCBjYW4ndCBiZSBkZWxldGVkLCB0aGUgcmVxdWVzdCB3aWxsIGJlIHNpbGVudGx5IGRpc2NhcmRlZC5cbiAgICpcbiAgICogRGVsZXRlIGluc3RydWN0aW9ucyBtYWRlIHdpdGggdGhpcyBtZXRob2Qgd2lsbCBiZSBzdG9yZWQgbG9jYWxseSBpbiBhbiBvbi1kaXNrIGNhY2hlIHVudGlsIHRoZXkgY2FuIGJlIHRyYW5zbWl0dGVkXG4gICAqIHRvIFBhcnNlLiBUaGV5IHdpbGwgYmUgc2VudCBpbW1lZGlhdGVseSBpZiBwb3NzaWJsZS4gT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUgc2VudCB0aGUgbmV4dCB0aW1lIGEgbmV0d29yayBjb25uZWN0aW9uXG4gICAqIGlzIGF2YWlsYWJsZS4gRGVsZXRlIHJlcXVlc3RzIHdpbGwgcGVyc2lzdCBldmVuIGFmdGVyIHRoZSBhcHAgaXMgY2xvc2VkLCBpbiB3aGljaCBjYXNlIHRoZXkgd2lsbCBiZSBzZW50IHRoZVxuICAgKiBuZXh0IHRpbWUgdGhlIGFwcCBpcyBvcGVuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZURlbGV0ZWAgYW5kIGBhZnRlckRlbGV0ZWAgdHJpZ2dlcnMuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgZGVzdHJveVxuICAgKiAgICAgY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgZGVzdHJveUV2ZW50dWFsbHkob3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3kob3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5DT05ORUNUSU9OX0ZBSUxFRCkge1xuICAgICAgICBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKS5kZXN0cm95KHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKS5wb2xsKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhpcyBtb2RlbCBvbiB0aGUgc2VydmVyIGlmIGl0IHdhcyBhbHJlYWR5IHBlcnNpc3RlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRGVsZXRlYCBhbmQgYGFmdGVyRGVsZXRlYCB0cmlnZ2Vycy5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBkZXN0cm95XG4gICAqICAgICBjb21wbGV0ZXMuXG4gICAqL1xuICBkZXN0cm95KG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBkZXN0cm95T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZGVzdHJveU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZGVzdHJveU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpLmRlc3Ryb3kodGhpcywgZGVzdHJveU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHN0b3JlcyB0aGUgb2JqZWN0IGFuZCBldmVyeSBvYmplY3QgaXQgcG9pbnRzIHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsXG4gICAqIHJlY3Vyc2l2ZWx5LCB1c2luZyBhIGRlZmF1bHQgcGluIG5hbWU6IF9kZWZhdWx0LlxuICAgKlxuICAgKiBJZiB0aG9zZSBvdGhlciBvYmplY3RzIGhhdmUgbm90IGJlZW4gZmV0Y2hlZCBmcm9tIFBhcnNlLCB0aGV5IHdpbGwgbm90IGJlIHN0b3JlZC5cbiAgICogSG93ZXZlciwgaWYgdGhleSBoYXZlIGNoYW5nZWQgZGF0YSwgYWxsIHRoZSBjaGFuZ2VzIHdpbGwgYmUgcmV0YWluZWQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IG9iamVjdC5waW4oKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFRvIHJldHJpZXZlIG9iamVjdDpcbiAgICogPGNvZGU+cXVlcnkuZnJvbUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+IG9yIDxjb2RlPnF1ZXJ5LmZyb21QaW4oKTwvY29kZT5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBwaW4gY29tcGxldGVzLlxuICAgKi9cbiAgcGluKCkge1xuICAgIHJldHVybiBQYXJzZU9iamVjdC5waW5BbGxXaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiwgW3RoaXNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZW1vdmVzIHRoZSBvYmplY3QgYW5kIGV2ZXJ5IG9iamVjdCBpdCBwb2ludHMgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSxcbiAgICogcmVjdXJzaXZlbHksIHVzaW5nIGEgZGVmYXVsdCBwaW4gbmFtZTogX2RlZmF1bHQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IG9iamVjdC51blBpbigpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqL1xuICB1blBpbigpIHtcbiAgICByZXR1cm4gUGFyc2VPYmplY3QudW5QaW5BbGxXaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiwgW3RoaXNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZXR1cm5zIGlmIHRoZSBvYmplY3QgaXMgcGlubmVkXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGNvbnN0IGlzUGlubmVkID0gYXdhaXQgb2JqZWN0LmlzUGlubmVkKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBib29sZWFuIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgaWYgb2JqZWN0IGlzIHBpbm5lZC5cbiAgICovXG4gIGFzeW5jIGlzUGlubmVkKCkge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdEtleSA9IGxvY2FsRGF0YXN0b3JlLmdldEtleUZvck9iamVjdCh0aGlzKTtcbiAgICBjb25zdCBwaW4gPSBhd2FpdCBsb2NhbERhdGFzdG9yZS5mcm9tUGluV2l0aE5hbWUob2JqZWN0S2V5KTtcbiAgICByZXR1cm4gcGluLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgc3RvcmVzIHRoZSBvYmplY3RzIGFuZCBldmVyeSBvYmplY3QgdGhleSBwb2ludCB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLCByZWN1cnNpdmVseS5cbiAgICpcbiAgICogSWYgdGhvc2Ugb3RoZXIgb2JqZWN0cyBoYXZlIG5vdCBiZWVuIGZldGNoZWQgZnJvbSBQYXJzZSwgdGhleSB3aWxsIG5vdCBiZSBzdG9yZWQuXG4gICAqIEhvd2V2ZXIsIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkIGRhdGEsIGFsbCB0aGUgY2hhbmdlcyB3aWxsIGJlIHJldGFpbmVkLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBvYmplY3QucGluV2l0aE5hbWUobmFtZSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBUbyByZXRyaWV2ZSBvYmplY3Q6XG4gICAqIDxjb2RlPnF1ZXJ5LmZyb21Mb2NhbERhdGFzdG9yZSgpPC9jb2RlPiBvciA8Y29kZT5xdWVyeS5mcm9tUGluV2l0aE5hbWUobmFtZSk8L2NvZGU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgUGluLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHBpbiBjb21wbGV0ZXMuXG4gICAqL1xuICBwaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LnBpbkFsbFdpdGhOYW1lKG5hbWUsIFt0aGlzXSk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmVtb3ZlcyB0aGUgb2JqZWN0IGFuZCBldmVyeSBvYmplY3QgaXQgcG9pbnRzIHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsIHJlY3Vyc2l2ZWx5LlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBvYmplY3QudW5QaW5XaXRoTmFtZShuYW1lKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgUGluLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVuUGluIGNvbXBsZXRlcy5cbiAgICovXG4gIHVuUGluV2l0aE5hbWUobmFtZSkge1xuICAgIHJldHVybiBQYXJzZU9iamVjdC51blBpbkFsbFdpdGhOYW1lKG5hbWUsIFt0aGlzXSk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgbG9hZHMgZGF0YSBmcm9tIHRoZSBsb2NhbCBkYXRhc3RvcmUgaW50byB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgb2JqZWN0LmZldGNoRnJvbUxvY2FsRGF0YXN0b3JlKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBZb3UgY2FuIGNyZWF0ZSBhbiB1bmZldGNoZWQgcG9pbnRlciB3aXRoIDxjb2RlPlBhcnNlLk9iamVjdC5jcmVhdGVXaXRob3V0RGF0YSgpPC9jb2RlPlxuICAgKiBhbmQgdGhlbiBjYWxsIDxjb2RlPmZldGNoRnJvbUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+IG9uIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGZldGNoIGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIGZldGNoRnJvbUxvY2FsRGF0YXN0b3JlKCkge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdEtleSA9IGxvY2FsRGF0YXN0b3JlLmdldEtleUZvck9iamVjdCh0aGlzKTtcbiAgICBjb25zdCBwaW5uZWQgPSBhd2FpdCBsb2NhbERhdGFzdG9yZS5fc2VyaWFsaXplT2JqZWN0KG9iamVjdEtleSk7XG4gICAgaWYgKCFwaW5uZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZldGNoIGFuIHVuc2F2ZWQgUGFyc2VPYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gUGFyc2VPYmplY3QuZnJvbUpTT04ocGlubmVkKTtcbiAgICB0aGlzLl9maW5pc2hGZXRjaChyZXN1bHQudG9KU09OKCkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyogU3RhdGljIG1ldGhvZHMgKi9cblxuICBzdGF0aWMgX2NsZWFyQWxsU3RhdGUoKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgc3RhdGVDb250cm9sbGVyLmNsZWFyQWxsU3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIFBhcnNlLk9iamVjdC5cbiAgICogSWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkLCBzdG9wcyBhbmQgY2FsbHMgdGhlIGVycm9yIGhhbmRsZXIuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqICAgUGFyc2UuT2JqZWN0LmZldGNoQWxsKFtvYmplY3QxLCBvYmplY3QyLCAuLi5dKVxuICAgKiAgICAudGhlbigobGlzdCkgPT4ge1xuICAgKiAgICAgIC8vIEFsbCB0aGUgb2JqZWN0cyB3ZXJlIGZldGNoZWQuXG4gICAqICAgIH0sIChlcnJvcikgPT4ge1xuICAgKiAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGZldGNoaW5nIG9uZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogICAgfSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+aW5jbHVkZTogVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLiBDYW4gYmUgYSBzdHJpbmcsIGFuIGFycmF5IG9mIHN0cmluZ3MsXG4gICAqICAgICAgIG9yIGFuIGFycmF5IG9mIGFycmF5IG9mIHN0cmluZ3MuXG4gICAqIDwvdWw+XG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdFtdfVxuICAgKi9cbiAgc3RhdGljIGZldGNoQWxsKGxpc3QpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY29uc3QgcXVlcnlPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgcXVlcnlPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5jbHVkZScpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMuaW5jbHVkZSA9IFBhcnNlT2JqZWN0LmhhbmRsZUluY2x1ZGVPcHRpb25zKG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpLmZldGNoKGxpc3QsIHRydWUsIHF1ZXJ5T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgZ2l2ZW4gbGlzdCBvZiBQYXJzZS5PYmplY3QuXG4gICAqXG4gICAqIEluY2x1ZGVzIG5lc3RlZCBQYXJzZS5PYmplY3RzIGZvciB0aGUgcHJvdmlkZWQga2V5LiBZb3UgY2FuIHVzZSBkb3RcbiAgICogbm90YXRpb24gdG8gc3BlY2lmeSB3aGljaCBmaWVsZHMgaW4gdGhlIGluY2x1ZGVkIG9iamVjdCBhcmUgYWxzbyBmZXRjaGVkLlxuICAgKlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogPHByZT5cbiAgICogICBQYXJzZS5PYmplY3QuZmV0Y2hBbGxXaXRoSW5jbHVkZShbb2JqZWN0MSwgb2JqZWN0MiwgLi4uXSwgW3BvaW50ZXIxLCBwb2ludGVyMiwgLi4uXSlcbiAgICogICAgLnRoZW4oKGxpc3QpID0+IHtcbiAgICogICAgICAvLyBBbGwgdGhlIG9iamVjdHMgd2VyZSBmZXRjaGVkLlxuICAgKiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICogICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBmZXRjaGluZyBvbmUgb2YgdGhlIG9iamVjdHMuXG4gICAqICAgIH0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBBcnJheTxzdHJpbmc+Pn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3RbXX1cbiAgICovXG4gIHN0YXRpYyBmZXRjaEFsbFdpdGhJbmNsdWRlKGxpc3QsIGtleXMsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmluY2x1ZGUgPSBrZXlzO1xuICAgIHJldHVybiBQYXJzZU9iamVjdC5mZXRjaEFsbChsaXN0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIFBhcnNlLk9iamVjdCBpZiBuZWVkZWQuXG4gICAqIElmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZCwgc3RvcHMgYW5kIGNhbGxzIHRoZSBlcnJvciBoYW5kbGVyLlxuICAgKlxuICAgKiBJbmNsdWRlcyBuZXN0ZWQgUGFyc2UuT2JqZWN0cyBmb3IgdGhlIHByb3ZpZGVkIGtleS4gWW91IGNhbiB1c2UgZG90XG4gICAqIG5vdGF0aW9uIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGluIHRoZSBpbmNsdWRlZCBvYmplY3QgYXJlIGFsc28gZmV0Y2hlZC5cbiAgICpcbiAgICogSWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkLCBzdG9wcyBhbmQgY2FsbHMgdGhlIGVycm9yIGhhbmRsZXIuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqICAgUGFyc2UuT2JqZWN0LmZldGNoQWxsSWZOZWVkZWRXaXRoSW5jbHVkZShbb2JqZWN0MSwgb2JqZWN0MiwgLi4uXSwgW3BvaW50ZXIxLCBwb2ludGVyMiwgLi4uXSlcbiAgICogICAgLnRoZW4oKGxpc3QpID0+IHtcbiAgICogICAgICAvLyBBbGwgdGhlIG9iamVjdHMgd2VyZSBmZXRjaGVkLlxuICAgKiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICogICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBmZXRjaGluZyBvbmUgb2YgdGhlIG9iamVjdHMuXG4gICAqICAgIH0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBBcnJheTxzdHJpbmc+Pn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3RbXX1cbiAgICovXG4gIHN0YXRpYyBmZXRjaEFsbElmTmVlZGVkV2l0aEluY2x1ZGUobGlzdCwga2V5cywgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuaW5jbHVkZSA9IGtleXM7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LmZldGNoQWxsSWZOZWVkZWQobGlzdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgZ2l2ZW4gbGlzdCBvZiBQYXJzZS5PYmplY3QgaWYgbmVlZGVkLlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogPHByZT5cbiAgICogICBQYXJzZS5PYmplY3QuZmV0Y2hBbGxJZk5lZWRlZChbb2JqZWN0MSwgLi4uXSlcbiAgICogICAgLnRoZW4oKGxpc3QpID0+IHtcbiAgICogICAgICAvLyBPYmplY3RzIHdlcmUgZmV0Y2hlZCBhbmQgdXBkYXRlZC5cbiAgICogICAgfSwgKGVycm9yKSA9PiB7XG4gICAqICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZmV0Y2hpbmcgb25lIG9mIHRoZSBvYmplY3RzLlxuICAgKiAgICB9KTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdFtdfVxuICAgKi9cbiAgc3RhdGljIGZldGNoQWxsSWZOZWVkZWQobGlzdCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHF1ZXJ5T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgcXVlcnlPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIHF1ZXJ5T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2luY2x1ZGUnKSkge1xuICAgICAgcXVlcnlPcHRpb25zLmluY2x1ZGUgPSBQYXJzZU9iamVjdC5oYW5kbGVJbmNsdWRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKS5mZXRjaChsaXN0LCBmYWxzZSwgcXVlcnlPcHRpb25zKTtcbiAgfVxuICBzdGF0aWMgaGFuZGxlSW5jbHVkZU9wdGlvbnMob3B0aW9ucykge1xuICAgIGxldCBpbmNsdWRlID0gW107XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvcHRpb25zLmluY2x1ZGUpKSB7XG4gICAgICB2YXIgX2NvbnRleHQzO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0MyA9IG9wdGlvbnMuaW5jbHVkZSkuY2FsbChfY29udGV4dDMsIGtleSA9PiB7XG4gICAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICAgIGluY2x1ZGUgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShpbmNsdWRlKS5jYWxsKGluY2x1ZGUsIGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5jbHVkZS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmNsdWRlLnB1c2gob3B0aW9ucy5pbmNsdWRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGluY2x1ZGU7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgZ2l2ZW4gbGlzdCBvZiBtb2RlbHMgb24gdGhlIHNlcnZlciBpZiBpdCB3YXMgYWxyZWFkeSBwZXJzaXN0ZWQuXG4gICAqXG4gICAqIDxwPlVubGlrZSBzYXZlQWxsLCBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgYW4gaW5kaXZpZHVhbCBtb2RlbCxcbiAgICogdGhpcyBtZXRob2Qgd2lsbCBjb250aW51ZSB0cnlpbmcgdG8gZGVsZXRlIHRoZSByZXN0IG9mIHRoZSBtb2RlbHMgaWZcbiAgICogcG9zc2libGUsIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBhIGZhdGFsIGVycm9yIGxpa2UgYSBjb25uZWN0aW9uIGVycm9yLlxuICAgKlxuICAgKiA8cD5JbiBwYXJ0aWN1bGFyLCB0aGUgUGFyc2UuRXJyb3Igb2JqZWN0IHJldHVybmVkIGluIHRoZSBjYXNlIG9mIGVycm9yIG1heVxuICAgKiBiZSBvbmUgb2YgdHdvIHR5cGVzOlxuICAgKlxuICAgKiA8dWw+XG4gICAqIDxsaT5BIFBhcnNlLkVycm9yLkFHR1JFR0FURV9FUlJPUi4gVGhpcyBvYmplY3QncyBcImVycm9yc1wiIHByb3BlcnR5IGlzIGFuXG4gICAqIGFycmF5IG9mIG90aGVyIFBhcnNlLkVycm9yIG9iamVjdHMuIEVhY2ggZXJyb3Igb2JqZWN0IGluIHRoaXMgYXJyYXlcbiAgICogaGFzIGFuIFwib2JqZWN0XCIgcHJvcGVydHkgdGhhdCByZWZlcmVuY2VzIHRoZSBvYmplY3QgdGhhdCBjb3VsZCBub3QgYmVcbiAgICogZGVsZXRlZCAoZm9yIGluc3RhbmNlLCBiZWNhdXNlIHRoYXQgb2JqZWN0IGNvdWxkIG5vdCBiZSBmb3VuZCkuPC9saT5cbiAgICogPGxpPkEgbm9uLWFnZ3JlZ2F0ZSBQYXJzZS5FcnJvci4gVGhpcyBpbmRpY2F0ZXMgYSBzZXJpb3VzIGVycm9yIHRoYXRcbiAgICogY2F1c2VkIHRoZSBkZWxldGUgb3BlcmF0aW9uIHRvIGJlIGFib3J0ZWQgcGFydHdheSB0aHJvdWdoIChmb3JcbiAgICogaW5zdGFuY2UsIGEgY29ubmVjdGlvbiBmYWlsdXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGRlbGV0ZSkuPC9saT5cbiAgICogPC91bD5cbiAgICpcbiAgICogPHByZT5cbiAgICogUGFyc2UuT2JqZWN0LmRlc3Ryb3lBbGwoW29iamVjdDEsIG9iamVjdDIsIC4uLl0pXG4gICAqIC50aGVuKChsaXN0KSA9PiB7XG4gICAqIC8vIEFsbCB0aGUgb2JqZWN0cyB3ZXJlIGRlbGV0ZWQuXG4gICAqIH0sIChlcnJvcikgPT4ge1xuICAgKiAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBkZWxldGluZyBvbmUgb3IgbW9yZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogLy8gSWYgdGhpcyBpcyBhbiBhZ2dyZWdhdGUgZXJyb3IsIHRoZW4gd2UgY2FuIGluc3BlY3QgZWFjaCBlcnJvclxuICAgKiAvLyBvYmplY3QgaW5kaXZpZHVhbGx5IHRvIGRldGVybWluZSB0aGUgcmVhc29uIHdoeSBhIHBhcnRpY3VsYXJcbiAgICogLy8gb2JqZWN0IHdhcyBub3QgZGVsZXRlZC5cbiAgICogaWYgKGVycm9yLmNvZGUgPT09IFBhcnNlLkVycm9yLkFHR1JFR0FURV9FUlJPUikge1xuICAgKiBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9yLmVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgKiBjb25zb2xlLmxvZyhcIkNvdWxkbid0IGRlbGV0ZSBcIiArIGVycm9yLmVycm9yc1tpXS5vYmplY3QuaWQgK1xuICAgKiBcImR1ZSB0byBcIiArIGVycm9yLmVycm9yc1tpXS5tZXNzYWdlKTtcbiAgICogfVxuICAgKiB9IGVsc2Uge1xuICAgKiBjb25zb2xlLmxvZyhcIkRlbGV0ZSBhYm9ydGVkIGJlY2F1c2Ugb2YgXCIgKyBlcnJvci5tZXNzYWdlKTtcbiAgICogfVxuICAgKiB9KTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBkZXN0cm95QWxsXG4gICAqIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBkZXN0cm95QWxsKGxpc3QpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY29uc3QgZGVzdHJveU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYmF0Y2hTaXplJykgJiYgdHlwZW9mIG9wdGlvbnMuYmF0Y2hTaXplID09PSAnbnVtYmVyJykge1xuICAgICAgZGVzdHJveU9wdGlvbnMuYmF0Y2hTaXplID0gb3B0aW9ucy5iYXRjaFNpemU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCkuZGVzdHJveShsaXN0LCBkZXN0cm95T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIGdpdmVuIGxpc3Qgb2YgUGFyc2UuT2JqZWN0LlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogPHByZT5cbiAgICogUGFyc2UuT2JqZWN0LnNhdmVBbGwoW29iamVjdDEsIG9iamVjdDIsIC4uLl0pXG4gICAqIC50aGVuKChsaXN0KSA9PiB7XG4gICAqIC8vIEFsbCB0aGUgb2JqZWN0cyB3ZXJlIHNhdmVkLlxuICAgKiB9LCAoZXJyb3IpID0+IHtcbiAgICogLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2F2aW5nIG9uZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogfSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3RbXX1cbiAgICovXG4gIHN0YXRpYyBzYXZlQWxsKGxpc3QpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY29uc3Qgc2F2ZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHNhdmVPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIHNhdmVPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYmF0Y2hTaXplJykgJiYgdHlwZW9mIG9wdGlvbnMuYmF0Y2hTaXplID09PSAnbnVtYmVyJykge1xuICAgICAgc2F2ZU9wdGlvbnMuYmF0Y2hTaXplID0gb3B0aW9ucy5iYXRjaFNpemU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHNhdmVPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCkuc2F2ZShsaXN0LCBzYXZlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlZmVyZW5jZSB0byBhIHN1YmNsYXNzIG9mIFBhcnNlLk9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZC4gVGhpc1xuICAgKiBkb2VzIG5vdCBleGlzdCBvbiBQYXJzZS5PYmplY3QsIG9ubHkgb24gc3ViY2xhc3Nlcy5cbiAgICpcbiAgICogPHA+QSBzaG9ydGN1dCBmb3I6IDxwcmU+XG4gICAqICB2YXIgRm9vID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkZvb1wiKTtcbiAgICogIHZhciBwb2ludGVyVG9Gb28gPSBuZXcgRm9vKCk7XG4gICAqICBwb2ludGVyVG9Gb28uaWQgPSBcIm15T2JqZWN0SWRcIjtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIG9iamVjdCB0byBjcmVhdGUgYSByZWZlcmVuY2UgdG8uXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gQSBQYXJzZS5PYmplY3QgcmVmZXJlbmNlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVdpdGhvdXREYXRhKGlkKSB7XG4gICAgY29uc3Qgb2JqID0gbmV3IHRoaXMoKTtcbiAgICBvYmouaWQgPSBpZDtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYSBQYXJzZSBPYmplY3QgZnJvbSBhIEpTT04gcmVwcmVzZW50YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIFRoZSBKU09OIG1hcCBvZiB0aGUgT2JqZWN0J3MgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG92ZXJyaWRlIEluIHNpbmdsZSBpbnN0YW5jZSBtb2RlLCBhbGwgb2xkIHNlcnZlciBkYXRhXG4gICAqICAgaXMgb3ZlcndyaXR0ZW4gaWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRpcnR5IFdoZXRoZXIgdGhlIFBhcnNlLk9iamVjdCBzaG91bGQgc2V0IEpTT04ga2V5cyB0byBkaXJ0eVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9IEEgUGFyc2UuT2JqZWN0IHJlZmVyZW5jZVxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIG92ZXJyaWRlLCBkaXJ0eSkge1xuICAgIGlmICghanNvbi5jbGFzc05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBhbiBvYmplY3Qgd2l0aG91dCBhIGNsYXNzTmFtZScpO1xuICAgIH1cbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGNsYXNzTWFwW2pzb24uY2xhc3NOYW1lXTtcbiAgICBjb25zdCBvID0gY29uc3RydWN0b3IgPyBuZXcgY29uc3RydWN0b3IoanNvbi5jbGFzc05hbWUpIDogbmV3IFBhcnNlT2JqZWN0KGpzb24uY2xhc3NOYW1lKTtcbiAgICBjb25zdCBvdGhlckF0dHJpYnV0ZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4ganNvbikge1xuICAgICAgaWYgKGF0dHIgIT09ICdjbGFzc05hbWUnICYmIGF0dHIgIT09ICdfX3R5cGUnKSB7XG4gICAgICAgIG90aGVyQXR0cmlidXRlc1thdHRyXSA9IGpzb25bYXR0cl07XG4gICAgICAgIGlmIChkaXJ0eSkge1xuICAgICAgICAgIG8uc2V0KGF0dHIsIGpzb25bYXR0cl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgLy8gaWQgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSBjbGVhclNlcnZlckRhdGEgY2FuIHdvcmtcbiAgICAgIGlmIChvdGhlckF0dHJpYnV0ZXMub2JqZWN0SWQpIHtcbiAgICAgICAgby5pZCA9IG90aGVyQXR0cmlidXRlcy5vYmplY3RJZDtcbiAgICAgIH1cbiAgICAgIGxldCBwcmVzZXJ2ZWQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvLl9wcmVzZXJ2ZUZpZWxkc09uRmV0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJlc2VydmVkID0gby5fcHJlc2VydmVGaWVsZHNPbkZldGNoKCk7XG4gICAgICB9XG4gICAgICBvLl9jbGVhclNlcnZlckRhdGEoKTtcbiAgICAgIGlmIChwcmVzZXJ2ZWQpIHtcbiAgICAgICAgby5fZmluaXNoRmV0Y2gocHJlc2VydmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgby5fZmluaXNoRmV0Y2gob3RoZXJBdHRyaWJ1dGVzKTtcbiAgICBpZiAoanNvbi5vYmplY3RJZCkge1xuICAgICAgby5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG87XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0IHdpdGggYSBzcGVjaWZpYyBjbGFzcyBuYW1lLlxuICAgKiBXaGVuIG9iamVjdHMgb2YgdGhhdCBjbGFzcyBhcmUgcmV0cmlldmVkIGZyb20gYSBxdWVyeSwgdGhleSB3aWxsIGJlXG4gICAqIGluc3RhbnRpYXRlZCB3aXRoIHRoaXMgc3ViY2xhc3MuXG4gICAqIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiB1c2luZyBFUzYgc3ViY2xhc3NpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIHN1YmNsYXNzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIFRoZSBzdWJjbGFzc1xuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoY2xhc3NOYW1lLCBjb25zdHJ1Y3Rvcikge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCBjbGFzcyBuYW1lLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3Qgc3VwcGx5IGEgc3ViY2xhc3MgY29uc3RydWN0b3IuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHJlZ2lzdGVyIHRoZSBzdWJjbGFzcyBjb25zdHJ1Y3Rvci4gJyArICdEaWQgeW91IGF0dGVtcHQgdG8gcmVnaXN0ZXIgYW4gaW5zdGFuY2Ugb2YgdGhlIHN1YmNsYXNzPycpO1xuICAgIH1cbiAgICBjbGFzc01hcFtjbGFzc05hbWVdID0gY29uc3RydWN0b3I7XG4gICAgaWYgKCFjb25zdHJ1Y3Rvci5jbGFzc05hbWUpIHtcbiAgICAgIGNvbnN0cnVjdG9yLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5lZ2lzdGVycyBhIHN1YmNsYXNzIG9mIFBhcnNlLk9iamVjdCB3aXRoIGEgc3BlY2lmaWMgY2xhc3MgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgc3ViY2xhc3NcbiAgICovXG4gIHN0YXRpYyB1bnJlZ2lzdGVyU3ViY2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHZhbGlkIGNsYXNzIG5hbWUuJyk7XG4gICAgfVxuICAgIGRlbGV0ZSBjbGFzc01hcFtjbGFzc05hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0IGZvciB0aGUgZ2l2ZW4gUGFyc2UgY2xhc3MgbmFtZS5cbiAgICpcbiAgICogPHA+RXZlcnkgZXh0ZW5zaW9uIG9mIGEgUGFyc2UgY2xhc3Mgd2lsbCBpbmhlcml0IGZyb20gdGhlIG1vc3QgcmVjZW50XG4gICAqIHByZXZpb3VzIGV4dGVuc2lvbiBvZiB0aGF0IGNsYXNzLiBXaGVuIGEgUGFyc2UuT2JqZWN0IGlzIGF1dG9tYXRpY2FsbHlcbiAgICogY3JlYXRlZCBieSBwYXJzaW5nIEpTT04sIGl0IHdpbGwgdXNlIHRoZSBtb3N0IHJlY2VudCBleHRlbnNpb24gb2YgdGhhdFxuICAgKiBjbGFzcy48L3A+XG4gICAqXG4gICAqIDxwPllvdSBzaG91bGQgY2FsbCBlaXRoZXI6PHByZT5cbiAgICogICAgIHZhciBNeUNsYXNzID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIk15Q2xhc3NcIiwge1xuICAgKiAgICAgICAgIDxpPkluc3RhbmNlIG1ldGhvZHM8L2k+LFxuICAgKiAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGF0dHJzLCBvcHRpb25zKSB7XG4gICAqICAgICAgICAgICAgIHRoaXMuc29tZUluc3RhbmNlUHJvcGVydHkgPSBbXSxcbiAgICogICAgICAgICAgICAgPGk+T3RoZXIgaW5zdGFuY2UgcHJvcGVydGllczwvaT5cbiAgICogICAgICAgICB9XG4gICAqICAgICB9LCB7XG4gICAqICAgICAgICAgPGk+Q2xhc3MgcHJvcGVydGllczwvaT5cbiAgICogICAgIH0pOzwvcHJlPlxuICAgKiBvciwgZm9yIEJhY2tib25lIGNvbXBhdGliaWxpdHk6PHByZT5cbiAgICogICAgIHZhciBNeUNsYXNzID0gUGFyc2UuT2JqZWN0LmV4dGVuZCh7XG4gICAqICAgICAgICAgY2xhc3NOYW1lOiBcIk15Q2xhc3NcIixcbiAgICogICAgICAgICA8aT5JbnN0YW5jZSBtZXRob2RzPC9pPixcbiAgICogICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihhdHRycywgb3B0aW9ucykge1xuICAgKiAgICAgICAgICAgICB0aGlzLnNvbWVJbnN0YW5jZVByb3BlcnR5ID0gW10sXG4gICAqICAgICAgICAgICAgIDxpPk90aGVyIGluc3RhbmNlIHByb3BlcnRpZXM8L2k+XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgfSwge1xuICAgKiAgICAgICAgIDxpPkNsYXNzIHByb3BlcnRpZXM8L2k+XG4gICAqICAgICB9KTs8L3ByZT48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIFBhcnNlIGNsYXNzIGJhY2tpbmcgdGhpcyBtb2RlbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IFtwcm90b1Byb3BzXSBJbnN0YW5jZSBwcm9wZXJ0aWVzIHRvIGFkZCB0byBpbnN0YW5jZXMgb2YgdGhlXG4gICAqICAgICBjbGFzcyByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2NsYXNzUHJvcHNdIENsYXNzIHByb3BlcnRpZXMgdG8gYWRkIHRoZSBjbGFzcyByZXR1cm5lZCBmcm9tXG4gICAqICAgICB0aGlzIG1ldGhvZC5cbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gQSBuZXcgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIGV4dGVuZChjbGFzc05hbWUsIHByb3RvUHJvcHMsIGNsYXNzUHJvcHMpIHtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChjbGFzc05hbWUgJiYgdHlwZW9mIGNsYXNzTmFtZS5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBQYXJzZU9iamVjdC5leHRlbmQoY2xhc3NOYW1lLmNsYXNzTmFtZSwgY2xhc3NOYW1lLCBwcm90b1Byb3BzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhcnNlLk9iamVjdC5leHRlbmQncyBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGNsYXNzTmFtZS5cIik7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBhZGp1c3RlZENsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICBpZiAoYWRqdXN0ZWRDbGFzc05hbWUgPT09ICdVc2VyJyAmJiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1BFUkZPUk1fVVNFUl9SRVdSSVRFJykpIHtcbiAgICAgIGFkanVzdGVkQ2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICB9XG4gICAgbGV0IHBhcmVudFByb3RvID0gUGFyc2VPYmplY3QucHJvdG90eXBlO1xuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdfX3N1cGVyX18nKSAmJiB0aGlzLl9fc3VwZXJfXykge1xuICAgICAgcGFyZW50UHJvdG8gPSB0aGlzLnByb3RvdHlwZTtcbiAgICB9XG4gICAgbGV0IFBhcnNlT2JqZWN0U3ViY2xhc3MgPSBmdW5jdGlvbiAoYXR0cmlidXRlcywgb3B0aW9ucykge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBhZGp1c3RlZENsYXNzTmFtZTtcbiAgICAgIHRoaXMuX29iakNvdW50ID0gb2JqZWN0Q291bnQrKztcbiAgICAgIC8vIEVuYWJsZSBsZWdhY3kgaW5pdGlhbGl6ZXJzXG4gICAgICBpZiAodHlwZW9mIHRoaXMuaW5pdGlhbGl6ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbml0aWFsaXplciBvZiB0aGlzLl9pbml0aWFsaXplcnMpIHtcbiAgICAgICAgICBpbml0aWFsaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNldChhdHRyaWJ1dGVzIHx8IHt9LCBvcHRpb25zKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBhbiBpbnZhbGlkIFBhcnNlIE9iamVjdFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGNsYXNzTWFwW2FkanVzdGVkQ2xhc3NOYW1lXSkge1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcyA9IGNsYXNzTWFwW2FkanVzdGVkQ2xhc3NOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcy5leHRlbmQgPSBmdW5jdGlvbiAobmFtZSwgcHJvdG9Qcm9wcywgY2xhc3NQcm9wcykge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIFBhcnNlT2JqZWN0LmV4dGVuZC5jYWxsKFBhcnNlT2JqZWN0U3ViY2xhc3MsIG5hbWUsIHByb3RvUHJvcHMsIGNsYXNzUHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQYXJzZU9iamVjdC5leHRlbmQuY2FsbChQYXJzZU9iamVjdFN1YmNsYXNzLCBhZGp1c3RlZENsYXNzTmFtZSwgbmFtZSwgcHJvdG9Qcm9wcyk7XG4gICAgICB9O1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcy5jcmVhdGVXaXRob3V0RGF0YSA9IFBhcnNlT2JqZWN0LmNyZWF0ZVdpdGhvdXREYXRhO1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcy5jbGFzc05hbWUgPSBhZGp1c3RlZENsYXNzTmFtZTtcbiAgICAgIFBhcnNlT2JqZWN0U3ViY2xhc3MuX19zdXBlcl9fID0gcGFyZW50UHJvdG87XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzLnByb3RvdHlwZSA9ICgwLCBfY3JlYXRlLmRlZmF1bHQpKHBhcmVudFByb3RvLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IFBhcnNlT2JqZWN0U3ViY2xhc3MsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocHJvdG9Qcm9wcykge1xuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHByb3RvUHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3AgPT09ICdpbml0aWFsaXplJykge1xuICAgICAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlT2JqZWN0U3ViY2xhc3MucHJvdG90eXBlLCAnX2luaXRpYWxpemVycycsIHtcbiAgICAgICAgICAgIHZhbHVlOiBbLi4uKFBhcnNlT2JqZWN0U3ViY2xhc3MucHJvdG90eXBlLl9pbml0aWFsaXplcnMgfHwgW10pLCBwcm90b1Byb3BzW3Byb3BdXSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcCAhPT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICAoMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZU9iamVjdFN1YmNsYXNzLnByb3RvdHlwZSwgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IHByb3RvUHJvcHNbcHJvcF0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNsYXNzUHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBjbGFzc1Byb3BzKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY2xhc3NOYW1lJykge1xuICAgICAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlT2JqZWN0U3ViY2xhc3MsIHByb3AsIHtcbiAgICAgICAgICAgIHZhbHVlOiBjbGFzc1Byb3BzW3Byb3BdLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNsYXNzTWFwW2FkanVzdGVkQ2xhc3NOYW1lXSA9IFBhcnNlT2JqZWN0U3ViY2xhc3M7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0U3ViY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHNpbmdsZSBpbnN0YW5jZSBvYmplY3RzLCB3aGVyZSBhbnkgbG9jYWwgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIElkXG4gICAqIHNoYXJlIHRoZSBzYW1lIGF0dHJpYnV0ZXMsIGFuZCBzdGF5IHN5bmNocm9uaXplZCB3aXRoIGVhY2ggb3RoZXIuXG4gICAqIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBpbiBzZXJ2ZXIgZW52aXJvbm1lbnRzLCBzaW5jZSBpdCBjYW4gbGVhZCB0b1xuICAgKiBzZWN1cml0eSBpc3N1ZXMuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBlbmFibGVTaW5nbGVJbnN0YW5jZSgpIHtcbiAgICBzaW5nbGVJbnN0YW5jZSA9IHRydWU7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKFNpbmdsZUluc3RhbmNlU3RhdGVDb250cm9sbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHNpbmdsZSBpbnN0YW5jZSBvYmplY3RzLCB3aGVyZSBhbnkgbG9jYWwgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIElkXG4gICAqIHNoYXJlIHRoZSBzYW1lIGF0dHJpYnV0ZXMsIGFuZCBzdGF5IHN5bmNocm9uaXplZCB3aXRoIGVhY2ggb3RoZXIuXG4gICAqIFdoZW4gZGlzYWJsZWQsIHlvdSBjYW4gaGF2ZSB0d28gaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG9iamVjdCBpbiBtZW1vcnlcbiAgICogd2l0aG91dCB0aGVtIHNoYXJpbmcgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGRpc2FibGVTaW5nbGVJbnN0YW5jZSgpIHtcbiAgICBzaW5nbGVJbnN0YW5jZSA9IGZhbHNlO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldE9iamVjdFN0YXRlQ29udHJvbGxlcihVbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlcik7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgc3RvcmVzIHRoZSBvYmplY3RzIGFuZCBldmVyeSBvYmplY3QgdGhleSBwb2ludCB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLFxuICAgKiByZWN1cnNpdmVseSwgdXNpbmcgYSBkZWZhdWx0IHBpbiBuYW1lOiBfZGVmYXVsdC5cbiAgICpcbiAgICogSWYgdGhvc2Ugb3RoZXIgb2JqZWN0cyBoYXZlIG5vdCBiZWVuIGZldGNoZWQgZnJvbSBQYXJzZSwgdGhleSB3aWxsIG5vdCBiZSBzdG9yZWQuXG4gICAqIEhvd2V2ZXIsIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkIGRhdGEsIGFsbCB0aGUgY2hhbmdlcyB3aWxsIGJlIHJldGFpbmVkLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QucGluQWxsKFsuLi5dKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFRvIHJldHJpZXZlIG9iamVjdDpcbiAgICogPGNvZGU+cXVlcnkuZnJvbUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+IG9yIDxjb2RlPnF1ZXJ5LmZyb21QaW4oKTwvY29kZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBwaW4gY29tcGxldGVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcGluQWxsKG9iamVjdHMpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gUGFyc2VPYmplY3QucGluQWxsV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4sIG9iamVjdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHN0b3JlcyB0aGUgb2JqZWN0cyBhbmQgZXZlcnkgb2JqZWN0IHRoZXkgcG9pbnQgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSwgcmVjdXJzaXZlbHkuXG4gICAqXG4gICAqIElmIHRob3NlIG90aGVyIG9iamVjdHMgaGF2ZSBub3QgYmVlbiBmZXRjaGVkIGZyb20gUGFyc2UsIHRoZXkgd2lsbCBub3QgYmUgc3RvcmVkLlxuICAgKiBIb3dldmVyLCBpZiB0aGV5IGhhdmUgY2hhbmdlZCBkYXRhLCBhbGwgdGhlIGNoYW5nZXMgd2lsbCBiZSByZXRhaW5lZC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuT2JqZWN0LnBpbkFsbFdpdGhOYW1lKG5hbWUsIFtvYmoxLCBvYmoyLCAuLi5dKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFRvIHJldHJpZXZlIG9iamVjdDpcbiAgICogPGNvZGU+cXVlcnkuZnJvbUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+IG9yIDxjb2RlPnF1ZXJ5LmZyb21QaW5XaXRoTmFtZShuYW1lKTwvY29kZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBQaW4uXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9iamVjdHMgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgcGluIGNvbXBsZXRlcy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHBpbkFsbFdpdGhOYW1lKG5hbWUsIG9iamVjdHMpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxEYXRhc3RvcmUuX2hhbmRsZVBpbkFsbFdpdGhOYW1lKG5hbWUsIG9iamVjdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgdGhlIG9iamVjdHMgYW5kIGV2ZXJ5IG9iamVjdCB0aGV5IHBvaW50IHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsXG4gICAqIHJlY3Vyc2l2ZWx5LCB1c2luZyBhIGRlZmF1bHQgcGluIG5hbWU6IF9kZWZhdWx0LlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QudW5QaW5BbGwoWy4uLl0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB1blBpbkFsbChvYmplY3RzKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LnVuUGluQWxsV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4sIG9iamVjdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgdGhlIG9iamVjdHMgYW5kIGV2ZXJ5IG9iamVjdCB0aGV5IHBvaW50IHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsIHJlY3Vyc2l2ZWx5LlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QudW5QaW5BbGxXaXRoTmFtZShuYW1lLCBbb2JqMSwgb2JqMiwgLi4uXSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIFBpbi5cbiAgICogQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB1blBpbkFsbFdpdGhOYW1lKG5hbWUsIG9iamVjdHMpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxEYXRhc3RvcmUuX2hhbmRsZVVuUGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmVtb3ZlcyBhbGwgb2JqZWN0cyBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlIHVzaW5nIGEgZGVmYXVsdCBwaW4gbmFtZTogX2RlZmF1bHQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLk9iamVjdC51blBpbkFsbE9iamVjdHMoKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5QaW4gY29tcGxldGVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgdW5QaW5BbGxPYmplY3RzKCkge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbERhdGFzdG9yZS51blBpbldpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZW1vdmVzIGFsbCBvYmplY3RzIHdpdGggdGhlIHNwZWNpZmllZCBwaW4gbmFtZS5cbiAgICogRGVsZXRlcyB0aGUgcGluIG5hbWUgYWxzby5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuT2JqZWN0LnVuUGluQWxsT2JqZWN0c1dpdGhOYW1lKG5hbWUpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBQaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5QaW4gY29tcGxldGVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgdW5QaW5BbGxPYmplY3RzV2l0aE5hbWUobmFtZSkge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbERhdGFzdG9yZS51blBpbldpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLlBJTl9QUkVGSVggKyBuYW1lKTtcbiAgfVxufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGZldGNoKHRhcmdldCwgZm9yY2VGZXRjaCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHRhcmdldCkpIHtcbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKFtdKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ianMgPSBbXTtcbiAgICAgIGNvbnN0IGlkcyA9IFtdO1xuICAgICAgbGV0IGNsYXNzTmFtZSA9IG51bGw7XG4gICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHRhcmdldCkuY2FsbCh0YXJnZXQsIGVsID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2xhc3NOYW1lKSB7XG4gICAgICAgICAgY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGFzc05hbWUgIT09IGVsLmNsYXNzTmFtZSkge1xuICAgICAgICAgIGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0NMQVNTX05BTUUsICdBbGwgb2JqZWN0cyBzaG91bGQgYmUgb2YgdGhlIHNhbWUgY2xhc3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVsLmlkKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk1JU1NJTkdfT0JKRUNUX0lELCAnQWxsIG9iamVjdHMgbXVzdCBoYXZlIGFuIElEJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcmNlRmV0Y2ggfHwgIWVsLmlzRGF0YUF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgaWRzLnB1c2goZWwuaWQpO1xuICAgICAgICAgIG9ianMucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0cy5wdXNoKGVsKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgICBjb25zdCBQYXJzZVF1ZXJ5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VRdWVyeSgpO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShjbGFzc05hbWUpO1xuICAgICAgcXVlcnkuY29udGFpbmVkSW4oJ29iamVjdElkJywgaWRzKTtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZSkge1xuICAgICAgICBxdWVyeS5pbmNsdWRlKG9wdGlvbnMuaW5jbHVkZSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5fbGltaXQgPSBpZHMubGVuZ3RoO1xuICAgICAgcmV0dXJuICgwLCBfZmluZC5kZWZhdWx0KShxdWVyeSkuY2FsbChxdWVyeSwgb3B0aW9ucykudGhlbihhc3luYyBvYmplY3RzID0+IHtcbiAgICAgICAgY29uc3QgaWRNYXAgPSB7fTtcbiAgICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgbyA9PiB7XG4gICAgICAgICAgaWRNYXBbby5pZF0gPSBvO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb2JqID0gb2Jqc1tpXTtcbiAgICAgICAgICBpZiAoIW9iaiB8fCAhb2JqLmlkIHx8ICFpZE1hcFtvYmouaWRdKSB7XG4gICAgICAgICAgICBpZiAoZm9yY2VGZXRjaCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PQkpFQ1RfTk9UX0ZPVU5ELCAnQWxsIG9iamVjdHMgbXVzdCBleGlzdCBvbiB0aGUgc2VydmVyLicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaW5nbGVJbnN0YW5jZSkge1xuICAgICAgICAgIC8vIElmIHNpbmdsZSBpbnN0YW5jZSBvYmplY3RzIGFyZSBkaXNhYmxlZCwgd2UgbmVlZCB0byByZXBsYWNlIHRoZVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgb2JqID0gcmVzdWx0c1tpXTtcbiAgICAgICAgICAgIGlmIChvYmogJiYgb2JqLmlkICYmIGlkTWFwW29iai5pZF0pIHtcbiAgICAgICAgICAgICAgY29uc3QgaWQgPSBvYmouaWQ7XG4gICAgICAgICAgICAgIG9iai5fZmluaXNoRmV0Y2goaWRNYXBbaWRdLnRvSlNPTigpKTtcbiAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGlkTWFwW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgcmVzdWx0cykge1xuICAgICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVPYmplY3RJZlBpbm5lZChvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUocmVzdWx0cyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICBpZiAoIXRhcmdldC5pZCkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5NSVNTSU5HX09CSkVDVF9JRCwgJ09iamVjdCBkb2VzIG5vdCBoYXZlIGFuIElEJykpO1xuICAgICAgfVxuICAgICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgICAgcGFyYW1zLmluY2x1ZGUgPSBvcHRpb25zLmluY2x1ZGUuam9pbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdjbGFzc2VzLycgKyB0YXJnZXQuY2xhc3NOYW1lICsgJy8nICsgdGFyZ2V0Ll9nZXRJZCgpLCBwYXJhbXMsIG9wdGlvbnMpLnRoZW4oYXN5bmMgcmVzcG9uc2UgPT4ge1xuICAgICAgICB0YXJnZXQuX2NsZWFyUGVuZGluZ09wcygpO1xuICAgICAgICB0YXJnZXQuX2NsZWFyU2VydmVyRGF0YSgpO1xuICAgICAgICB0YXJnZXQuX2ZpbmlzaEZldGNoKHJlc3BvbnNlKTtcbiAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX3VwZGF0ZU9iamVjdElmUGlubmVkKHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9LFxuICBhc3luYyBkZXN0cm95KHRhcmdldCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5iYXRjaFNpemUgPyBvcHRpb25zLmJhdGNoU2l6ZSA6IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUkVRVUVTVF9CQVRDSF9TSVpFJyk7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHRhcmdldCkpIHtcbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKFtdKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhdGNoZXMgPSBbW11dO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHRhcmdldCkuY2FsbCh0YXJnZXQsIG9iaiA9PiB7XG4gICAgICAgIGlmICghb2JqLmlkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGJhdGNoZXNbYmF0Y2hlcy5sZW5ndGggLSAxXS5wdXNoKG9iaik7XG4gICAgICAgIGlmIChiYXRjaGVzW2JhdGNoZXMubGVuZ3RoIC0gMV0ubGVuZ3RoID49IGJhdGNoU2l6ZSkge1xuICAgICAgICAgIGJhdGNoZXMucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGJhdGNoZXNbYmF0Y2hlcy5sZW5ndGggLSAxXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gSWYgdGhlIGxhc3QgYmF0Y2ggaXMgZW1wdHksIHJlbW92ZSBpdFxuICAgICAgICBiYXRjaGVzLnBvcCgpO1xuICAgICAgfVxuICAgICAgbGV0IGRlbGV0ZUNvbXBsZXRlZCA9IF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoYmF0Y2hlcykuY2FsbChiYXRjaGVzLCBiYXRjaCA9PiB7XG4gICAgICAgIGRlbGV0ZUNvbXBsZXRlZCA9IGRlbGV0ZUNvbXBsZXRlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdiYXRjaCcsIHtcbiAgICAgICAgICAgIHJlcXVlc3RzOiAoMCwgX21hcC5kZWZhdWx0KShiYXRjaCkuY2FsbChiYXRjaCwgb2JqID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgICAgICAgIHBhdGg6IGdldFNlcnZlclVybFBhdGgoKSArICdjbGFzc2VzLycgKyBvYmouY2xhc3NOYW1lICsgJy8nICsgb2JqLl9nZXRJZCgpLFxuICAgICAgICAgICAgICAgIGJvZHk6IHt9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sIG9wdGlvbnMpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdHNbaV0gJiYgcmVzdWx0c1tpXS5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KHJlc3VsdHNbaV0uZXJyb3IuY29kZSwgcmVzdWx0c1tpXS5lcnJvci5lcnJvcik7XG4gICAgICAgICAgICAgICAgZXJyLm9iamVjdCA9IGJhdGNoW2ldO1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkZWxldGVDb21wbGV0ZWQudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgYWdncmVnYXRlID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5BR0dSRUdBVEVfRVJST1IpO1xuICAgICAgICAgIGFnZ3JlZ2F0ZS5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGFnZ3JlZ2F0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgdGFyZ2V0KSB7XG4gICAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX2Rlc3Ryb3lPYmplY3RJZlBpbm5lZChvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdERUxFVEUnLCAnY2xhc3Nlcy8nICsgdGFyZ2V0LmNsYXNzTmFtZSArICcvJyArIHRhcmdldC5fZ2V0SWQoKSwge30sIG9wdGlvbnMpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fZGVzdHJveU9iamVjdElmUGlubmVkKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHRhcmdldCk7XG4gIH0sXG4gIHNhdmUodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gb3B0aW9ucyAmJiBvcHRpb25zLmJhdGNoU2l6ZSA/IG9wdGlvbnMuYmF0Y2hTaXplIDogX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdSRVFVRVNUX0JBVENIX1NJWkUnKTtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgY29uc3QgbWFwSWRGb3JQaW4gPSB7fTtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgY29uc3QgYWxsb3dDdXN0b21PYmplY3RJZCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQUxMT1dfQ1VTVE9NX09CSkVDVF9JRCcpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMucmV0dXJuU3RhdHVzID0gb3B0aW9ucy5yZXR1cm5TdGF0dXMgfHwgdHJ1ZTtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHRhcmdldCkpIHtcbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKFtdKTtcbiAgICAgIH1cbiAgICAgIGxldCB1bnNhdmVkID0gKDAsIF9jb25jYXQuZGVmYXVsdCkodGFyZ2V0KS5jYWxsKHRhcmdldCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB0YXJnZXRfaSA9IHRhcmdldFtpXTtcbiAgICAgICAgaWYgKHRhcmdldF9pIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgICAgICB1bnNhdmVkID0gKDAsIF9jb25jYXQuZGVmYXVsdCkodW5zYXZlZCkuY2FsbCh1bnNhdmVkLCAoMCwgX3Vuc2F2ZWRDaGlsZHJlbi5kZWZhdWx0KSh0YXJnZXRfaSwgdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB1bnNhdmVkID0gKDAsIF91bmlxdWUuZGVmYXVsdCkodW5zYXZlZCk7XG4gICAgICBjb25zdCBmaWxlc1NhdmVkID0gW107XG4gICAgICBsZXQgcGVuZGluZyA9IFtdO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHVuc2F2ZWQpLmNhbGwodW5zYXZlZCwgZWwgPT4ge1xuICAgICAgICBpZiAoZWwgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQpIHtcbiAgICAgICAgICBmaWxlc1NhdmVkLnB1c2goZWwuc2F2ZShvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWwgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgICAgIHBlbmRpbmcucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQuYWxsKGZpbGVzU2F2ZWQpLnRoZW4oKCkgPT4ge1xuICAgICAgICBsZXQgb2JqZWN0RXJyb3IgPSBudWxsO1xuICAgICAgICByZXR1cm4gKDAsIF9wcm9taXNlVXRpbHMuY29udGludWVXaGlsZSkoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBwZW5kaW5nLmxlbmd0aCA+IDA7XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICBjb25zdCBiYXRjaCA9IFtdO1xuICAgICAgICAgIGNvbnN0IG5leHRQZW5kaW5nID0gW107XG4gICAgICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHBlbmRpbmcpLmNhbGwocGVuZGluZywgZWwgPT4ge1xuICAgICAgICAgICAgaWYgKGFsbG93Q3VzdG9tT2JqZWN0SWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVsLCAnaWQnKSAmJiAhZWwuaWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5NSVNTSU5HX09CSkVDVF9JRCwgJ29iamVjdElkIG11c3Qgbm90IGJlIGVtcHR5IG9yIG51bGwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYXRjaC5sZW5ndGggPCBiYXRjaFNpemUgJiYgKDAsIF9jYW5CZVNlcmlhbGl6ZWQuZGVmYXVsdCkoZWwpKSB7XG4gICAgICAgICAgICAgIGJhdGNoLnB1c2goZWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV4dFBlbmRpbmcucHVzaChlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcGVuZGluZyA9IG5leHRQZW5kaW5nO1xuICAgICAgICAgIGlmIChiYXRjaC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1RyaWVkIHRvIHNhdmUgYSBiYXRjaCB3aXRoIGEgY3ljbGUuJykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFF1ZXVlIHVwIHRhc2tzIGZvciBlYWNoIG9iamVjdCBpbiB0aGUgYmF0Y2guXG4gICAgICAgICAgLy8gV2hlbiBldmVyeSB0YXNrIGlzIHJlYWR5LCB0aGUgQVBJIHJlcXVlc3Qgd2lsbCBleGVjdXRlXG4gICAgICAgICAgY29uc3QgYmF0Y2hSZXR1cm5lZCA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgICAgICAgY29uc3QgYmF0Y2hSZWFkeSA9IFtdO1xuICAgICAgICAgIGNvbnN0IGJhdGNoVGFza3MgPSBbXTtcbiAgICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoYmF0Y2gpLmNhbGwoYmF0Y2gsIChvYmosIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWFkeSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgICAgICAgICBiYXRjaFJlYWR5LnB1c2gocmVhZHkpO1xuICAgICAgICAgICAgc3RhdGVDb250cm9sbGVyLnB1c2hQZW5kaW5nU3RhdGUob2JqLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgICAgICAgICBiYXRjaFRhc2tzLnB1c2goc3RhdGVDb250cm9sbGVyLmVucXVldWVUYXNrKG9iai5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVhZHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gYmF0Y2hSZXR1cm5lZC50aGVuKHJlc3BvbnNlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlc1tpbmRleF0uaGFzT3duUHJvcGVydHkoJ3N1Y2Nlc3MnKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSByZXNwb25zZXNbaW5kZXhdLnN1Y2Nlc3Mub2JqZWN0SWQ7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZXNbaW5kZXhdLl9zdGF0dXM7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2VzW2luZGV4XS5fc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3BvbnNlc1tpbmRleF0uX2hlYWRlcnM7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2VzW2luZGV4XS5feGhyO1xuICAgICAgICAgICAgICAgICAgbWFwSWRGb3JQaW5bb2JqZWN0SWRdID0gb2JqLl9sb2NhbElkO1xuICAgICAgICAgICAgICAgICAgb2JqLl9oYW5kbGVTYXZlUmVzcG9uc2UocmVzcG9uc2VzW2luZGV4XS5zdWNjZXNzLCBzdGF0dXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIW9iamVjdEVycm9yICYmIHJlc3BvbnNlc1tpbmRleF0uaGFzT3duUHJvcGVydHkoJ2Vycm9yJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVyRXJyb3IgPSByZXNwb25zZXNbaW5kZXhdLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RFcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KHNlcnZlckVycm9yLmNvZGUsIHNlcnZlckVycm9yLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSByZXN0IG9mIHRoZSBzYXZlXG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG9iai5faGFuZGxlU2F2ZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAoMCwgX3Byb21pc2VVdGlscy53aGVuKShiYXRjaFJlYWR5KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEtpY2sgb2ZmIHRoZSBiYXRjaCByZXF1ZXN0XG4gICAgICAgICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdiYXRjaCcsIHtcbiAgICAgICAgICAgICAgcmVxdWVzdHM6ICgwLCBfbWFwLmRlZmF1bHQpKGJhdGNoKS5jYWxsKGJhdGNoLCBvYmogPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IG9iai5fZ2V0U2F2ZVBhcmFtcygpO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5wYXRoID0gZ2V0U2VydmVyVXJsUGF0aCgpICsgcGFyYW1zLnBhdGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICAgIH0pLnRoZW4oYmF0Y2hSZXR1cm5lZC5yZXNvbHZlLCBlcnJvciA9PiB7XG4gICAgICAgICAgICBiYXRjaFJldHVybmVkLnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOQ09SUkVDVF9UWVBFLCBlcnJvci5tZXNzYWdlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuICgwLCBfcHJvbWlzZVV0aWxzLndoZW4pKGJhdGNoVGFza3MpO1xuICAgICAgICB9KS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAob2JqZWN0RXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChvYmplY3RFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIHRhcmdldCkge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgaXMgYSBQYXJzZU9iamVjdCBiZWZvcmUgdXBkYXRpbmcgaXQgaW50byB0aGUgbG9jYWxEYXRhU3RvcmVcbiAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlTG9jYWxJZEZvck9iamVjdChtYXBJZEZvclBpbltvYmplY3QuaWRdLCBvYmplY3QpO1xuICAgICAgICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlT2JqZWN0SWZQaW5uZWQob2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh0YXJnZXQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgIGlmIChhbGxvd0N1c3RvbU9iamVjdElkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsICdpZCcpICYmICF0YXJnZXQuaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5NSVNTSU5HX09CSkVDVF9JRCwgJ29iamVjdElkIG11c3Qgbm90IGJlIGVtcHR5IG9yIG51bGwnKTtcbiAgICAgIH1cbiAgICAgIC8vIGdlbmVyYXRlIF9sb2NhbElkIGluIGNhc2UgaWYgY2FzY2FkZVNhdmU9ZmFsc2VcbiAgICAgIHRhcmdldC5fZ2V0SWQoKTtcbiAgICAgIGNvbnN0IGxvY2FsSWQgPSB0YXJnZXQuX2xvY2FsSWQ7XG4gICAgICAvLyBjb3B5aW5nIHRhcmdldCBsZXRzIGd1YXJhbnRlZSB0aGUgcG9pbnRlciBpc24ndCBtb2RpZmllZCBlbHNld2hlcmVcbiAgICAgIGNvbnN0IHRhcmdldENvcHkgPSB0YXJnZXQ7XG4gICAgICBjb25zdCB0YXNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB0YXJnZXRDb3B5Ll9nZXRTYXZlUGFyYW1zKCk7XG4gICAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KHBhcmFtcy5tZXRob2QsIHBhcmFtcy5wYXRoLCBwYXJhbXMuYm9keSwgb3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2UuX3N0YXR1cztcbiAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuX3N0YXR1cztcbiAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuX2hlYWRlcnM7XG4gICAgICAgICAgZGVsZXRlIHJlc3BvbnNlLl94aHI7XG4gICAgICAgICAgdGFyZ2V0Q29weS5faGFuZGxlU2F2ZVJlc3BvbnNlKHJlc3BvbnNlLCBzdGF0dXMpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgdGFyZ2V0Q29weS5faGFuZGxlU2F2ZUVycm9yKCk7XG4gICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgc3RhdGVDb250cm9sbGVyLnB1c2hQZW5kaW5nU3RhdGUodGFyZ2V0Ll9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgICByZXR1cm4gc3RhdGVDb250cm9sbGVyLmVucXVldWVUYXNrKHRhcmdldC5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIHRhc2spLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlTG9jYWxJZEZvck9iamVjdChsb2NhbElkLCB0YXJnZXQpO1xuICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlT2JqZWN0SWZQaW5uZWQodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQYXJzZU9iamVjdChQYXJzZU9iamVjdCk7XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRPYmplY3RDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlT2JqZWN0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlVuc2V0T3AgPSBleHBvcnRzLlNldE9wID0gZXhwb3J0cy5SZW1vdmVPcCA9IGV4cG9ydHMuUmVsYXRpb25PcCA9IGV4cG9ydHMuT3AgPSBleHBvcnRzLkluY3JlbWVudE9wID0gZXhwb3J0cy5BZGRVbmlxdWVPcCA9IGV4cG9ydHMuQWRkT3AgPSB2b2lkIDA7XG5leHBvcnRzLm9wRnJvbUpTT04gPSBvcEZyb21KU09OO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2NvbmNhdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX3NwbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3BsaWNlXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9hcnJheUNvbnRhaW5zT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9hcnJheUNvbnRhaW5zT2JqZWN0XCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xudmFyIF91bmlxdWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VuaXF1ZVwiKSk7XG5mdW5jdGlvbiBvcEZyb21KU09OKGpzb24pIHtcbiAgaWYgKCFqc29uIHx8ICFqc29uLl9fb3ApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBzd2l0Y2ggKGpzb24uX19vcCkge1xuICAgIGNhc2UgJ0RlbGV0ZSc6XG4gICAgICByZXR1cm4gbmV3IFVuc2V0T3AoKTtcbiAgICBjYXNlICdJbmNyZW1lbnQnOlxuICAgICAgcmV0dXJuIG5ldyBJbmNyZW1lbnRPcChqc29uLmFtb3VudCk7XG4gICAgY2FzZSAnQWRkJzpcbiAgICAgIHJldHVybiBuZXcgQWRkT3AoKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vYmplY3RzKSk7XG4gICAgY2FzZSAnQWRkVW5pcXVlJzpcbiAgICAgIHJldHVybiBuZXcgQWRkVW5pcXVlT3AoKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vYmplY3RzKSk7XG4gICAgY2FzZSAnUmVtb3ZlJzpcbiAgICAgIHJldHVybiBuZXcgUmVtb3ZlT3AoKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vYmplY3RzKSk7XG4gICAgY2FzZSAnQWRkUmVsYXRpb24nOlxuICAgICAge1xuICAgICAgICBjb25zdCB0b0FkZCA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub2JqZWN0cyk7XG4gICAgICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHRvQWRkKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25PcChbXSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25PcCh0b0FkZCwgW10pO1xuICAgICAgfVxuICAgIGNhc2UgJ1JlbW92ZVJlbGF0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSAoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9iamVjdHMpO1xuICAgICAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KSh0b1JlbW92ZSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uT3AoW10sIFtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uT3AoW10sIHRvUmVtb3ZlKTtcbiAgICAgIH1cbiAgICBjYXNlICdCYXRjaCc6XG4gICAgICB7XG4gICAgICAgIGxldCB0b0FkZCA9IFtdO1xuICAgICAgICBsZXQgdG9SZW1vdmUgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBqc29uLm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChqc29uLm9wc1tpXS5fX29wID09PSAnQWRkUmVsYXRpb24nKSB7XG4gICAgICAgICAgICB0b0FkZCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHRvQWRkKS5jYWxsKHRvQWRkLCAoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9wc1tpXS5vYmplY3RzKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChqc29uLm9wc1tpXS5fX29wID09PSAnUmVtb3ZlUmVsYXRpb24nKSB7XG4gICAgICAgICAgICB0b1JlbW92ZSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHRvUmVtb3ZlKS5jYWxsKHRvUmVtb3ZlLCAoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9wc1tpXS5vYmplY3RzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25PcCh0b0FkZCwgdG9SZW1vdmUpO1xuICAgICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuY2xhc3MgT3Age1xuICAvLyBFbXB0eSBwYXJlbnQgY2xhc3NcbiAgYXBwbHlUbygpIHt9IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gIG1lcmdlV2l0aCgpIHt9IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gIHRvSlNPTigpIHt9IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG59XG5leHBvcnRzLk9wID0gT3A7XG5jbGFzcyBTZXRPcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICBzdXBlcigpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3ZhbHVlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBhcHBseVRvKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBtZXJnZVdpdGgoKSB7XG4gICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLl92YWx1ZSk7XG4gIH1cbiAgdG9KU09OKG9mZmxpbmUpIHtcbiAgICByZXR1cm4gKDAsIF9lbmNvZGUuZGVmYXVsdCkodGhpcy5fdmFsdWUsIGZhbHNlLCB0cnVlLCB1bmRlZmluZWQsIG9mZmxpbmUpO1xuICB9XG59XG5leHBvcnRzLlNldE9wID0gU2V0T3A7XG5jbGFzcyBVbnNldE9wIGV4dGVuZHMgT3Age1xuICBhcHBseVRvKCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbWVyZ2VXaXRoKCkge1xuICAgIHJldHVybiBuZXcgVW5zZXRPcCgpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19vcDogJ0RlbGV0ZSdcbiAgICB9O1xuICB9XG59XG5leHBvcnRzLlVuc2V0T3AgPSBVbnNldE9wO1xuY2xhc3MgSW5jcmVtZW50T3AgZXh0ZW5kcyBPcCB7XG4gIGNvbnN0cnVjdG9yKGFtb3VudCkge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfYW1vdW50XCIsIHZvaWQgMCk7XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbmNyZW1lbnQgT3AgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgbnVtZXJpYyBhbW91bnQuJyk7XG4gICAgfVxuICAgIHRoaXMuX2Ftb3VudCA9IGFtb3VudDtcbiAgfVxuICBhcHBseVRvKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hbW91bnQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgaW5jcmVtZW50IGEgbm9uLW51bWVyaWMgdmFsdWUuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hbW91bnQgKyB2YWx1ZTtcbiAgfVxuICBtZXJnZVdpdGgocHJldmlvdXMpIHtcbiAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgU2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl92YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBVbnNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuX2Ftb3VudCk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIEluY3JlbWVudE9wKSB7XG4gICAgICByZXR1cm4gbmV3IEluY3JlbWVudE9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fYW1vdW50KSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1lcmdlIEluY3JlbWVudCBPcCB3aXRoIHRoZSBwcmV2aW91cyBPcCcpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19vcDogJ0luY3JlbWVudCcsXG4gICAgICBhbW91bnQ6IHRoaXMuX2Ftb3VudFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydHMuSW5jcmVtZW50T3AgPSBJbmNyZW1lbnRPcDtcbmNsYXNzIEFkZE9wIGV4dGVuZHMgT3Age1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdmFsdWVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl92YWx1ZSA9ICgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gIH1cbiAgYXBwbHlUbyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gKDAsIF9jb25jYXQuZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsIHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGEgbm9uLWFycmF5IHZhbHVlJyk7XG4gIH1cbiAgbWVyZ2VXaXRoKHByZXZpb3VzKSB7XG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fdmFsdWUpKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgVW5zZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIEFkZE9wKSB7XG4gICAgICByZXR1cm4gbmV3IEFkZE9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fdmFsdWUpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWVyZ2UgQWRkIE9wIHdpdGggdGhlIHByZXZpb3VzIE9wJyk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX29wOiAnQWRkJyxcbiAgICAgIG9iamVjdHM6ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHRoaXMuX3ZhbHVlLCBmYWxzZSwgdHJ1ZSlcbiAgICB9O1xuICB9XG59XG5leHBvcnRzLkFkZE9wID0gQWRkT3A7XG5jbGFzcyBBZGRVbmlxdWVPcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICBzdXBlcigpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3ZhbHVlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5fdmFsdWUgPSAoMCwgX3VuaXF1ZS5kZWZhdWx0KSgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcbiAgfVxuICBhcHBseVRvKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZSB8fCBbXTtcbiAgICB9XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICAgIHZhciBfY29udGV4dDtcbiAgICAgIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgICAgIGNvbnN0IHRvQWRkID0gW107XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQgPSB0aGlzLl92YWx1ZSkuY2FsbChfY29udGV4dCwgdiA9PiB7XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgICAgICBpZiAoISgwLCBfYXJyYXlDb250YWluc09iamVjdC5kZWZhdWx0KSh2YWx1ZSwgdikpIHtcbiAgICAgICAgICAgIHRvQWRkLnB1c2godik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsIHYpIDwgMCkge1xuICAgICAgICAgICAgdG9BZGQucHVzaCh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgwLCBfY29uY2F0LmRlZmF1bHQpKHZhbHVlKS5jYWxsKHZhbHVlLCB0b0FkZCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBlbGVtZW50cyB0byBhIG5vbi1hcnJheSB2YWx1ZScpO1xuICB9XG4gIG1lcmdlV2l0aChwcmV2aW91cykge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBTZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX3ZhbHVlKSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFVuc2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBBZGRVbmlxdWVPcCkge1xuICAgICAgcmV0dXJuIG5ldyBBZGRVbmlxdWVPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX3ZhbHVlKSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1lcmdlIEFkZFVuaXF1ZSBPcCB3aXRoIHRoZSBwcmV2aW91cyBPcCcpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19vcDogJ0FkZFVuaXF1ZScsXG4gICAgICBvYmplY3RzOiAoMCwgX2VuY29kZS5kZWZhdWx0KSh0aGlzLl92YWx1ZSwgZmFsc2UsIHRydWUpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0cy5BZGRVbmlxdWVPcCA9IEFkZFVuaXF1ZU9wO1xuY2xhc3MgUmVtb3ZlT3AgZXh0ZW5kcyBPcCB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgc3VwZXIoKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl92YWx1ZVwiLCB2b2lkIDApO1xuICAgIHRoaXMuX3ZhbHVlID0gKDAsIF91bmlxdWUuZGVmYXVsdCkoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XG4gIH1cbiAgYXBwbHlUbyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gICAgICAvLyB2YXIgaSA9IHZhbHVlLmluZGV4T2YodGhpcy5fdmFsdWUpO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHZhbHVlKS5jYWxsKHZhbHVlLCBbXSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShyZW1vdmVkKS5jYWxsKHJlbW92ZWQsIHRoaXMuX3ZhbHVlW2ldKTtcbiAgICAgICAgd2hpbGUgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAoMCwgX3NwbGljZS5kZWZhdWx0KShyZW1vdmVkKS5jYWxsKHJlbW92ZWQsIGluZGV4LCAxKTtcbiAgICAgICAgICBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShyZW1vdmVkKS5jYWxsKHJlbW92ZWQsIHRoaXMuX3ZhbHVlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdmFsdWVbaV0gaW5zdGFuY2VvZiBQYXJzZU9iamVjdCAmJiB0aGlzLl92YWx1ZVtpXS5pZCkge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHJlbW92ZWRbal0gaW5zdGFuY2VvZiBQYXJzZU9iamVjdCAmJiB0aGlzLl92YWx1ZVtpXS5pZCA9PT0gcmVtb3ZlZFtqXS5pZCkge1xuICAgICAgICAgICAgICAoMCwgX3NwbGljZS5kZWZhdWx0KShyZW1vdmVkKS5jYWxsKHJlbW92ZWQsIGosIDEpO1xuICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVtb3ZlIGVsZW1lbnRzIGZyb20gYSBub24tYXJyYXkgdmFsdWUnKTtcbiAgfVxuICBtZXJnZVdpdGgocHJldmlvdXMpIHtcbiAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgU2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl92YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBVbnNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFVuc2V0T3AoKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgUmVtb3ZlT3ApIHtcbiAgICAgIHZhciBfY29udGV4dDI7XG4gICAgICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gICAgICBjb25zdCB1bmlxdWVzID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQyID0gcHJldmlvdXMuX3ZhbHVlKS5jYWxsKF9jb250ZXh0MiwgW10pO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl92YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5fdmFsdWVbaV0gaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgICAgIGlmICghKDAsIF9hcnJheUNvbnRhaW5zT2JqZWN0LmRlZmF1bHQpKHVuaXF1ZXMsIHRoaXMuX3ZhbHVlW2ldKSkge1xuICAgICAgICAgICAgdW5pcXVlcy5wdXNoKHRoaXMuX3ZhbHVlW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KSh1bmlxdWVzKS5jYWxsKHVuaXF1ZXMsIHRoaXMuX3ZhbHVlW2ldKSA8IDApIHtcbiAgICAgICAgICAgIHVuaXF1ZXMucHVzaCh0aGlzLl92YWx1ZVtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlbW92ZU9wKHVuaXF1ZXMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtZXJnZSBSZW1vdmUgT3Agd2l0aCB0aGUgcHJldmlvdXMgT3AnKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fb3A6ICdSZW1vdmUnLFxuICAgICAgb2JqZWN0czogKDAsIF9lbmNvZGUuZGVmYXVsdCkodGhpcy5fdmFsdWUsIGZhbHNlLCB0cnVlKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydHMuUmVtb3ZlT3AgPSBSZW1vdmVPcDtcbmNsYXNzIFJlbGF0aW9uT3AgZXh0ZW5kcyBPcCB7XG4gIGNvbnN0cnVjdG9yKGFkZHMsIHJlbW92ZXMpIHtcbiAgICBzdXBlcigpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3RhcmdldENsYXNzTmFtZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVsYXRpb25zVG9BZGRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlbGF0aW9uc1RvUmVtb3ZlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lID0gbnVsbDtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGFkZHMpKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uc1RvQWRkID0gKDAsIF91bmlxdWUuZGVmYXVsdCkoKDAsIF9tYXAuZGVmYXVsdCkoYWRkcykuY2FsbChhZGRzLCB0aGlzLl9leHRyYWN0SWQsIHRoaXMpKTtcbiAgICB9XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShyZW1vdmVzKSkge1xuICAgICAgdGhpcy5yZWxhdGlvbnNUb1JlbW92ZSA9ICgwLCBfdW5pcXVlLmRlZmF1bHQpKCgwLCBfbWFwLmRlZmF1bHQpKHJlbW92ZXMpLmNhbGwocmVtb3ZlcywgdGhpcy5fZXh0cmFjdElkLCB0aGlzKSk7XG4gICAgfVxuICB9XG4gIF9leHRyYWN0SWQob2JqKSB7XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBpZiAoIW9iai5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IGFkZCBvciByZW1vdmUgYW4gdW5zYXZlZCBQYXJzZSBPYmplY3QgZnJvbSBhIHJlbGF0aW9uJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICB0aGlzLl90YXJnZXRDbGFzc05hbWUgPSBvYmouY2xhc3NOYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFyZ2V0Q2xhc3NOYW1lICE9PSBvYmouY2xhc3NOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIGNyZWF0ZSBhIFJlbGF0aW9uIHdpdGggMiBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzOiAnICsgdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lICsgJyBhbmQgJyArIG9iai5jbGFzc05hbWUgKyAnLicpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqLmlkO1xuICB9XG4gIGFwcGx5VG8odmFsdWUsIHBhcmVudCwga2V5KSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgaWYgKCFwYXJlbnQgfHwgIWtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhcHBseSBhIFJlbGF0aW9uT3Agd2l0aG91dCBlaXRoZXIgYSBwcmV2aW91cyB2YWx1ZSwgb3IgYW4gb2JqZWN0IGFuZCBhIGtleScpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpb24gPSBuZXcgX1BhcnNlUmVsYXRpb24uZGVmYXVsdChwYXJlbnQsIGtleSk7XG4gICAgICByZWxhdGlvbi50YXJnZXRDbGFzc05hbWUgPSB0aGlzLl90YXJnZXRDbGFzc05hbWU7XG4gICAgICByZXR1cm4gcmVsYXRpb247XG4gICAgfVxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICAgIGlmICh0aGlzLl90YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlLnRhcmdldENsYXNzTmFtZSkge1xuICAgICAgICAgIGlmICh0aGlzLl90YXJnZXRDbGFzc05hbWUgIT09IHZhbHVlLnRhcmdldENsYXNzTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWxhdGVkIG9iamVjdCBtdXN0IGJlIGEgJyArIHZhbHVlLnRhcmdldENsYXNzTmFtZSArICcsIGJ1dCBhICcgKyB0aGlzLl90YXJnZXRDbGFzc05hbWUgKyAnIHdhcyBwYXNzZWQgaW4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlLnRhcmdldENsYXNzTmFtZSA9IHRoaXMuX3RhcmdldENsYXNzTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbGF0aW9uIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGEgbm9uLXJlbGF0aW9uIGZpZWxkJyk7XG4gICAgfVxuICB9XG4gIG1lcmdlV2l0aChwcmV2aW91cykge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBVbnNldE9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgbW9kaWZ5IGEgcmVsYXRpb24gYWZ0ZXIgZGVsZXRpbmcgaXQuJyk7XG4gICAgfSBlbHNlIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFNldE9wICYmIHByZXZpb3VzLl92YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBSZWxhdGlvbk9wKSB7XG4gICAgICB2YXIgX2NvbnRleHQzLCBfY29udGV4dDQsIF9jb250ZXh0NSwgX2NvbnRleHQ2LCBfY29udGV4dDcsIF9jb250ZXh0ODtcbiAgICAgIGlmIChwcmV2aW91cy5fdGFyZ2V0Q2xhc3NOYW1lICYmIHByZXZpb3VzLl90YXJnZXRDbGFzc05hbWUgIT09IHRoaXMuX3RhcmdldENsYXNzTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbGF0ZWQgb2JqZWN0IG11c3QgYmUgb2YgY2xhc3MgJyArIHByZXZpb3VzLl90YXJnZXRDbGFzc05hbWUgKyAnLCBidXQgJyArICh0aGlzLl90YXJnZXRDbGFzc05hbWUgfHwgJ251bGwnKSArICcgd2FzIHBhc3NlZCBpbi4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0FkZCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0MyA9IHByZXZpb3VzLnJlbGF0aW9uc1RvQWRkKS5jYWxsKF9jb250ZXh0MywgW10pO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NCA9IHRoaXMucmVsYXRpb25zVG9SZW1vdmUpLmNhbGwoX2NvbnRleHQ0LCByID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkobmV3QWRkKS5jYWxsKG5ld0FkZCwgcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgKDAsIF9zcGxpY2UuZGVmYXVsdCkobmV3QWRkKS5jYWxsKG5ld0FkZCwgaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDUgPSB0aGlzLnJlbGF0aW9uc1RvQWRkKS5jYWxsKF9jb250ZXh0NSwgciA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKG5ld0FkZCkuY2FsbChuZXdBZGQsIHIpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgbmV3QWRkLnB1c2gocik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV3UmVtb3ZlID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQ2ID0gcHJldmlvdXMucmVsYXRpb25zVG9SZW1vdmUpLmNhbGwoX2NvbnRleHQ2LCBbXSk7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ3ID0gdGhpcy5yZWxhdGlvbnNUb0FkZCkuY2FsbChfY29udGV4dDcsIHIgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShuZXdSZW1vdmUpLmNhbGwobmV3UmVtb3ZlLCByKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAoMCwgX3NwbGljZS5kZWZhdWx0KShuZXdSZW1vdmUpLmNhbGwobmV3UmVtb3ZlLCBpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0OCA9IHRoaXMucmVsYXRpb25zVG9SZW1vdmUpLmNhbGwoX2NvbnRleHQ4LCByID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkobmV3UmVtb3ZlKS5jYWxsKG5ld1JlbW92ZSwgcik7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICBuZXdSZW1vdmUucHVzaChyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXdSZWxhdGlvbiA9IG5ldyBSZWxhdGlvbk9wKG5ld0FkZCwgbmV3UmVtb3ZlKTtcbiAgICAgIG5ld1JlbGF0aW9uLl90YXJnZXRDbGFzc05hbWUgPSB0aGlzLl90YXJnZXRDbGFzc05hbWU7XG4gICAgICByZXR1cm4gbmV3UmVsYXRpb247XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1lcmdlIFJlbGF0aW9uIE9wIHdpdGggdGhlIHByZXZpb3VzIE9wJyk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IGlkVG9Qb2ludGVyID0gaWQgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lLFxuICAgICAgICBvYmplY3RJZDogaWRcbiAgICAgIH07XG4gICAgfTtcbiAgICBsZXQgcG9pbnRlcnMgPSBudWxsO1xuICAgIGxldCBhZGRzID0gbnVsbDtcbiAgICBsZXQgcmVtb3ZlcyA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVsYXRpb25zVG9BZGQubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIF9jb250ZXh0OTtcbiAgICAgIHBvaW50ZXJzID0gKDAsIF9tYXAuZGVmYXVsdCkoX2NvbnRleHQ5ID0gdGhpcy5yZWxhdGlvbnNUb0FkZCkuY2FsbChfY29udGV4dDksIGlkVG9Qb2ludGVyKTtcbiAgICAgIGFkZHMgPSB7XG4gICAgICAgIF9fb3A6ICdBZGRSZWxhdGlvbicsXG4gICAgICAgIG9iamVjdHM6IHBvaW50ZXJzXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWxhdGlvbnNUb1JlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2NvbnRleHQxMDtcbiAgICAgIHBvaW50ZXJzID0gKDAsIF9tYXAuZGVmYXVsdCkoX2NvbnRleHQxMCA9IHRoaXMucmVsYXRpb25zVG9SZW1vdmUpLmNhbGwoX2NvbnRleHQxMCwgaWRUb1BvaW50ZXIpO1xuICAgICAgcmVtb3ZlcyA9IHtcbiAgICAgICAgX19vcDogJ1JlbW92ZVJlbGF0aW9uJyxcbiAgICAgICAgb2JqZWN0czogcG9pbnRlcnNcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChhZGRzICYmIHJlbW92ZXMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fb3A6ICdCYXRjaCcsXG4gICAgICAgIG9wczogW2FkZHMsIHJlbW92ZXNdXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYWRkcyB8fCByZW1vdmVzIHx8IHt9O1xuICB9XG59XG5leHBvcnRzLlJlbGF0aW9uT3AgPSBSZWxhdGlvbk9wO1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UGFyc2VPcCh7XG4gIE9wLFxuICBvcEZyb21KU09OLFxuICBTZXRPcCxcbiAgVW5zZXRPcCxcbiAgSW5jcmVtZW50T3AsXG4gIEFkZE9wLFxuICBSZWxhdGlvbk9wLFxuICBSZW1vdmVPcCxcbiAgQWRkVW5pcXVlT3Bcbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUG9seWdvbiB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOjxicj5cbiAqICAgPHByZT5cbiAqICAgbmV3IFBvbHlnb24oW1swLDBdLFswLDFdLFsxLDFdLFsxLDBdXSlcbiAqICAgbmV3IFBvbHlnb24oW0dlb1BvaW50LCBHZW9Qb2ludCwgR2VvUG9pbnRdKVxuICogICA8L3ByZT5cbiAqXG4gKiA8cD5SZXByZXNlbnRzIGEgY29vcmRpbmF0ZXMgdGhhdCBtYXkgYmUgYXNzb2NpYXRlZFxuICogd2l0aCBhIGtleSBpbiBhIFBhcnNlT2JqZWN0IG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgcG9pbnQgZm9yIGdlbyBxdWVyaWVzLlxuICogVGhpcyBhbGxvd3MgcHJveGltaXR5LWJhc2VkIHF1ZXJpZXMgb24gdGhlIGtleS48L3A+XG4gKlxuICogPHA+RXhhbXBsZTo8cHJlPlxuICogICB2YXIgcG9seWdvbiA9IG5ldyBQYXJzZS5Qb2x5Z29uKFtbMCwwXSxbMCwxXSxbMSwxXSxbMSwwXV0pO1xuICogICB2YXIgb2JqZWN0ID0gbmV3IFBhcnNlLk9iamVjdChcIlBsYWNlT2JqZWN0XCIpO1xuICogICBvYmplY3Quc2V0KFwiYXJlYVwiLCBwb2x5Z29uKTtcbiAqICAgb2JqZWN0LnNhdmUoKTs8L3ByZT48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlBvbHlnb25cbiAqL1xuY2xhc3MgUGFyc2VQb2x5Z29uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7KENvb3JkaW5hdGVzIHwgUGFyc2UuR2VvUG9pbnRbXSl9IGNvb3JkaW5hdGVzIEFuIEFycmF5IG9mIGNvb3JkaW5hdGUgcGFpcnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvb3JkaW5hdGVzKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfY29vcmRpbmF0ZXNcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl9jb29yZGluYXRlcyA9IFBhcnNlUG9seWdvbi5fdmFsaWRhdGUoY29vcmRpbmF0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvb3JkaW5hdGVzIHZhbHVlIGZvciB0aGlzIFBvbHlnb24uXG4gICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgbm90IHZhbGlkIHR5cGUuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7KENvb3JkaW5hdGVzIHwgUGFyc2UuR2VvUG9pbnRbXSl9IGNvb3JkaW5hdGVzIGxpc3Qgb2YgY29vcmRpbmF0ZXNcbiAgICogQHJldHVybnMge0Nvb3JkaW5hdGVzfVxuICAgKi9cbiAgZ2V0IGNvb3JkaW5hdGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9jb29yZGluYXRlcztcbiAgfVxuICBzZXQgY29vcmRpbmF0ZXMoY29vcmRzKSB7XG4gICAgdGhpcy5fY29vcmRpbmF0ZXMgPSBQYXJzZVBvbHlnb24uX3ZhbGlkYXRlKGNvb3Jkcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIFBvbHlnb24sIHN1aXRhYmxlIGZvciBQYXJzZS5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICBQYXJzZVBvbHlnb24uX3ZhbGlkYXRlKHRoaXMuX2Nvb3JkaW5hdGVzKTtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnUG9seWdvbicsXG4gICAgICBjb29yZGluYXRlczogdGhpcy5fY29vcmRpbmF0ZXNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0d28gcG9seWdvbnMgYXJlIGVxdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7KFBhcnNlLlBvbHlnb24gfCBvYmplY3QpfSBvdGhlclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGVxdWFscyhvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgUGFyc2VQb2x5Z29uKSB8fCB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCAhPT0gb3RoZXIuY29vcmRpbmF0ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBpc0VxdWFsID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodGhpcy5fY29vcmRpbmF0ZXNbaV1bMF0gIT0gb3RoZXIuY29vcmRpbmF0ZXNbaV1bMF0gfHwgdGhpcy5fY29vcmRpbmF0ZXNbaV1bMV0gIT0gb3RoZXIuY29vcmRpbmF0ZXNbaV1bMV0pIHtcbiAgICAgICAgaXNFcXVhbCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzRXF1YWw7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgaWYgdGhlIHBvaW50IGlzIGNvbnRhaW5lZCBpbiB0aGUgcG9seWdvblxuICAgKi9cbiAgY29udGFpbnNQb2ludChwb2ludCkge1xuICAgIGxldCBtaW5YID0gdGhpcy5fY29vcmRpbmF0ZXNbMF1bMF07XG4gICAgbGV0IG1heFggPSB0aGlzLl9jb29yZGluYXRlc1swXVswXTtcbiAgICBsZXQgbWluWSA9IHRoaXMuX2Nvb3JkaW5hdGVzWzBdWzFdO1xuICAgIGxldCBtYXhZID0gdGhpcy5fY29vcmRpbmF0ZXNbMF1bMV07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcCA9IHRoaXMuX2Nvb3JkaW5hdGVzW2ldO1xuICAgICAgbWluWCA9IE1hdGgubWluKHBbMF0sIG1pblgpO1xuICAgICAgbWF4WCA9IE1hdGgubWF4KHBbMF0sIG1heFgpO1xuICAgICAgbWluWSA9IE1hdGgubWluKHBbMV0sIG1pblkpO1xuICAgICAgbWF4WSA9IE1hdGgubWF4KHBbMV0sIG1heFkpO1xuICAgIH1cbiAgICBjb25zdCBvdXRzaWRlID0gcG9pbnQubGF0aXR1ZGUgPCBtaW5YIHx8IHBvaW50LmxhdGl0dWRlID4gbWF4WCB8fCBwb2ludC5sb25naXR1ZGUgPCBtaW5ZIHx8IHBvaW50LmxvbmdpdHVkZSA+IG1heFk7XG4gICAgaWYgKG91dHNpZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoIC0gMTsgaSA8IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDsgaiA9IGkrKykge1xuICAgICAgY29uc3Qgc3RhcnRYID0gdGhpcy5fY29vcmRpbmF0ZXNbaV1bMF07XG4gICAgICBjb25zdCBzdGFydFkgPSB0aGlzLl9jb29yZGluYXRlc1tpXVsxXTtcbiAgICAgIGNvbnN0IGVuZFggPSB0aGlzLl9jb29yZGluYXRlc1tqXVswXTtcbiAgICAgIGNvbnN0IGVuZFkgPSB0aGlzLl9jb29yZGluYXRlc1tqXVsxXTtcbiAgICAgIGNvbnN0IGludGVyc2VjdCA9IHN0YXJ0WSA+IHBvaW50LmxvbmdpdHVkZSAhPSBlbmRZID4gcG9pbnQubG9uZ2l0dWRlICYmIHBvaW50LmxhdGl0dWRlIDwgKGVuZFggLSBzdGFydFgpICogKHBvaW50LmxvbmdpdHVkZSAtIHN0YXJ0WSkgLyAoZW5kWSAtIHN0YXJ0WSkgKyBzdGFydFg7XG4gICAgICBpZiAoaW50ZXJzZWN0KSB7XG4gICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnNpZGU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGxpc3Qgb2YgY29vcmRpbmF0ZXMgY2FuIGZvcm0gYSB2YWxpZCBwb2x5Z29uXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvb3JkcyB0aGUgbGlzdCBvZiBjb29yZGluYXRlcyB0byB2YWxpZGF0ZSBhcyBhIHBvbHlnb25cbiAgICogQHRocm93cyB7VHlwZUVycm9yfVxuICAgKiBAcmV0dXJucyB7bnVtYmVyW11bXX0gQXJyYXkgb2YgY29vcmRpbmF0ZXMgaWYgdmFsaWRhdGVkLlxuICAgKi9cbiAgc3RhdGljIF92YWxpZGF0ZShjb29yZHMpIHtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShjb29yZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChjb29yZHMubGVuZ3RoIDwgMykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUG9seWdvbiBtdXN0IGhhdmUgYXQgbGVhc3QgMyBHZW9Qb2ludHMgb3IgUG9pbnRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHBvaW50cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBjb29yZCA9IGNvb3Jkc1tpXTtcbiAgICAgIGxldCBnZW9Qb2ludDtcbiAgICAgIGlmIChjb29yZCBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQpIHtcbiAgICAgICAgZ2VvUG9pbnQgPSBjb29yZDtcbiAgICAgIH0gZWxzZSBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGNvb3JkKSAmJiBjb29yZC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgZ2VvUG9pbnQgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChjb29yZFswXSwgY29vcmRbMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSBvZiBHZW9Qb2ludHMgb3IgUG9pbnRzJyk7XG4gICAgICB9XG4gICAgICBwb2ludHMucHVzaChbZ2VvUG9pbnQubGF0aXR1ZGUsIGdlb1BvaW50LmxvbmdpdHVkZV0pO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVBvbHlnb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfc2xpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NsaWNlXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9maWx0ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbHRlclwiKSk7XG52YXIgX2tleXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9rZXlzXCIpKTtcbnZhciBfY29uY2F0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXRcIikpO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9zb3J0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zb3J0XCIpKTtcbnZhciBfc3BsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zcGxpY2VcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfZmluZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZFwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfZW50cmllcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2VudHJpZXNcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xudmFyIF9PZmZsaW5lUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL09mZmxpbmVRdWVyeVwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlVXRpbHMgPSByZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVV0aWxzXCIpO1xuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgcmVnZXggdGhhdCBtYXRjaGVzIGl0LlxuICogU3Vycm91bmRpbmcgd2l0aCBcXFEgLi4gXFxFIGRvZXMgdGhpcywgd2UganVzdCBuZWVkIHRvIGVzY2FwZSBhbnkgXFxFJ3MgaW5cbiAqIHRoZSB0ZXh0IHNlcGFyYXRlbHkuXG4gKlxuICogQHBhcmFtIHNcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBxdW90ZShzKSB7XG4gIHJldHVybiAnXFxcXFEnICsgcy5yZXBsYWNlKCdcXFxcRScsICdcXFxcRVxcXFxcXFxcRVxcXFxRJykgKyAnXFxcXEUnO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBjbGFzcyBuYW1lIGZyb20gcXVlcmllcy4gSWYgbm90IGFsbCBxdWVyaWVzIGhhdmUgdGhlIHNhbWVcbiAqIGNsYXNzIG5hbWUgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKlxuICogQHBhcmFtIHF1ZXJpZXNcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBfZ2V0Q2xhc3NOYW1lRnJvbVF1ZXJpZXMocXVlcmllcykge1xuICBsZXQgY2xhc3NOYW1lID0gbnVsbDtcbiAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHF1ZXJpZXMpLmNhbGwocXVlcmllcywgcSA9PiB7XG4gICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZSA9IHEuY2xhc3NOYW1lO1xuICAgIH1cbiAgICBpZiAoY2xhc3NOYW1lICE9PSBxLmNsYXNzTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgcXVlcmllcyBtdXN0IGJlIGZvciB0aGUgc2FtZSBjbGFzcy4nKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2xhc3NOYW1lO1xufVxuXG4vKlxuICogSGFuZGxlcyBwcmUtcG9wdWxhdGluZyB0aGUgcmVzdWx0IGRhdGEgb2YgYSBxdWVyeSB3aXRoIHNlbGVjdCBmaWVsZHMsXG4gKiBtYWtpbmcgc3VyZSB0aGF0IHRoZSBkYXRhIG9iamVjdCBjb250YWlucyBrZXlzIGZvciBhbGwgb2JqZWN0cyB0aGF0IGhhdmVcbiAqIGJlZW4gcmVxdWVzdGVkIHdpdGggYSBzZWxlY3QsIHNvIHRoYXQgb3VyIGNhY2hlZCBzdGF0ZSB1cGRhdGVzIGNvcnJlY3RseS5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlU2VsZWN0UmVzdWx0KGRhdGEsIHNlbGVjdCkge1xuICBjb25zdCBzZXJ2ZXJEYXRhTWFzayA9IHt9O1xuICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoc2VsZWN0KS5jYWxsKHNlbGVjdCwgZmllbGQgPT4ge1xuICAgIGNvbnN0IGhhc1N1Yk9iamVjdFNlbGVjdCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShmaWVsZCkuY2FsbChmaWVsZCwgJy4nKSAhPT0gLTE7XG4gICAgaWYgKCFoYXNTdWJPYmplY3RTZWxlY3QgJiYgIWRhdGEuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7XG4gICAgICAvLyB0aGlzIGZpZWxkIHdhcyBzZWxlY3RlZCwgYnV0IGlzIG1pc3NpbmcgZnJvbSB0aGUgcmV0cmlldmVkIGRhdGFcbiAgICAgIGRhdGFbZmllbGRdID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoaGFzU3ViT2JqZWN0U2VsZWN0KSB7XG4gICAgICAvLyB0aGlzIGZpZWxkIHJlZmVyZW5jZXMgYSBzdWItb2JqZWN0LFxuICAgICAgLy8gc28gd2UgbmVlZCB0byB3YWxrIGRvd24gdGhlIHBhdGggY29tcG9uZW50c1xuICAgICAgY29uc3QgcGF0aENvbXBvbmVudHMgPSBmaWVsZC5zcGxpdCgnLicpO1xuICAgICAgbGV0IG9iaiA9IGRhdGE7XG4gICAgICBsZXQgc2VydmVyTWFzayA9IHNlcnZlckRhdGFNYXNrO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHBhdGhDb21wb25lbnRzKS5jYWxsKHBhdGhDb21wb25lbnRzLCAoY29tcG9uZW50LCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgIC8vIGFkZCBrZXlzIGlmIHRoZSBleHBlY3RlZCBkYXRhIGlzIG1pc3NpbmdcbiAgICAgICAgaWYgKG9iaiAmJiAhb2JqLmhhc093blByb3BlcnR5KGNvbXBvbmVudCkpIHtcbiAgICAgICAgICBvYmpbY29tcG9uZW50XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgb2JqID0gb2JqW2NvbXBvbmVudF07XG4gICAgICAgIH1cblxuICAgICAgICAvL2FkZCB0aGlzIHBhdGggY29tcG9uZW50IHRvIHRoZSBzZXJ2ZXIgbWFzayBzbyB3ZSBjYW4gZmlsbCBpdCBpbiBsYXRlciBpZiBuZWVkZWRcbiAgICAgICAgaWYgKGluZGV4IDwgYXJyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAoIXNlcnZlck1hc2tbY29tcG9uZW50XSkge1xuICAgICAgICAgICAgc2VydmVyTWFza1tjb21wb25lbnRdID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcnZlck1hc2sgPSBzZXJ2ZXJNYXNrW2NvbXBvbmVudF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIGlmICgoMCwgX2tleXMuZGVmYXVsdCkoc2VydmVyRGF0YU1hc2spLmxlbmd0aCA+IDApIHtcbiAgICAvLyBXaGVuIHNlbGVjdGluZyBmcm9tIHN1Yi1vYmplY3RzLCB3ZSBkb24ndCB3YW50IHRvIGJsb3cgYXdheSB0aGUgbWlzc2luZ1xuICAgIC8vIGluZm9ybWF0aW9uIHRoYXQgd2UgbWF5IGhhdmUgcmV0cmlldmVkIGJlZm9yZS4gV2UndmUgYWxyZWFkeSBhZGRlZCBhbnlcbiAgICAvLyBtaXNzaW5nIHNlbGVjdGVkIGtleXMgdG8gc3ViLW9iamVjdHMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGFkZCBpbiB0aGVcbiAgICAvLyBkYXRhIGZvciBhbnkgcHJldmlvdXNseSByZXRyaWV2ZWQgc3ViLW9iamVjdHMgdGhhdCB3ZXJlIG5vdCBzZWxlY3RlZC5cblxuICAgIGNvbnN0IHNlcnZlckRhdGEgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKS5nZXRTZXJ2ZXJEYXRhKHtcbiAgICAgIGlkOiBkYXRhLm9iamVjdElkLFxuICAgICAgY2xhc3NOYW1lOiBkYXRhLmNsYXNzTmFtZVxuICAgIH0pO1xuICAgIGNvcHlNaXNzaW5nRGF0YVdpdGhNYXNrKHNlcnZlckRhdGEsIGRhdGEsIHNlcnZlckRhdGFNYXNrLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNvcHlNaXNzaW5nRGF0YVdpdGhNYXNrKHNyYywgZGVzdCwgbWFzaywgY29weVRoaXNMZXZlbCkge1xuICAvL2NvcHkgbWlzc2luZyBlbGVtZW50cyBhdCB0aGlzIGxldmVsXG4gIGlmIChjb3B5VGhpc0xldmVsKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3JjKSB7XG4gICAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkgJiYgIWRlc3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBkZXN0W2tleV0gPSBzcmNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gbWFzaykge1xuICAgIGlmIChkZXN0W2tleV0gIT09IHVuZGVmaW5lZCAmJiBkZXN0W2tleV0gIT09IG51bGwgJiYgc3JjICE9PSB1bmRlZmluZWQgJiYgc3JjICE9PSBudWxsKSB7XG4gICAgICAvL3RyYXZlcnNlIGludG8gb2JqZWN0cyBhcyBuZWVkZWRcbiAgICAgIGNvcHlNaXNzaW5nRGF0YVdpdGhNYXNrKHNyY1trZXldLCBkZXN0W2tleV0sIG1hc2tba2V5XSwgdHJ1ZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVPZmZsaW5lU29ydChhLCBiLCBzb3J0cykge1xuICBsZXQgb3JkZXIgPSBzb3J0c1swXTtcbiAgY29uc3Qgb3BlcmF0b3IgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKG9yZGVyKS5jYWxsKG9yZGVyLCAwLCAxKTtcbiAgY29uc3QgaXNEZXNjZW5kaW5nID0gb3BlcmF0b3IgPT09ICctJztcbiAgaWYgKGlzRGVzY2VuZGluZykge1xuICAgIG9yZGVyID0gb3JkZXIuc3Vic3RyaW5nKDEpO1xuICB9XG4gIGlmIChvcmRlciA9PT0gJ19jcmVhdGVkX2F0Jykge1xuICAgIG9yZGVyID0gJ2NyZWF0ZWRBdCc7XG4gIH1cbiAgaWYgKG9yZGVyID09PSAnX3VwZGF0ZWRfYXQnKSB7XG4gICAgb3JkZXIgPSAndXBkYXRlZEF0JztcbiAgfVxuICBpZiAoIS9eW0EtWmEtel1bMC05QS1aYS16X10qJC8udGVzdChvcmRlcikgfHwgb3JkZXIgPT09ICdwYXNzd29yZCcpIHtcbiAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfS0VZX05BTUUsIGBJbnZhbGlkIEtleTogJHtvcmRlcn1gKTtcbiAgfVxuICBjb25zdCBmaWVsZDEgPSBhLmdldChvcmRlcik7XG4gIGNvbnN0IGZpZWxkMiA9IGIuZ2V0KG9yZGVyKTtcbiAgaWYgKGZpZWxkMSA8IGZpZWxkMikge1xuICAgIHJldHVybiBpc0Rlc2NlbmRpbmcgPyAxIDogLTE7XG4gIH1cbiAgaWYgKGZpZWxkMSA+IGZpZWxkMikge1xuICAgIHJldHVybiBpc0Rlc2NlbmRpbmcgPyAtMSA6IDE7XG4gIH1cbiAgaWYgKHNvcnRzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCByZW1haW5pbmdTb3J0cyA9ICgwLCBfc2xpY2UuZGVmYXVsdCkoc29ydHMpLmNhbGwoc29ydHMsIDEpO1xuICAgIHJldHVybiBoYW5kbGVPZmZsaW5lU29ydChhLCBiLCByZW1haW5pbmdTb3J0cyk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcGFyc2UgUGFyc2UuUXVlcnkgZm9yIHRoZSBnaXZlbiBQYXJzZS5PYmplY3Qgc3ViY2xhc3MuXG4gKlxuICogPHA+UGFyc2UuUXVlcnkgZGVmaW5lcyBhIHF1ZXJ5IHRoYXQgaXMgdXNlZCB0byBmZXRjaCBQYXJzZS5PYmplY3RzLiBUaGVcbiAqIG1vc3QgY29tbW9uIHVzZSBjYXNlIGlzIGZpbmRpbmcgYWxsIG9iamVjdHMgdGhhdCBtYXRjaCBhIHF1ZXJ5IHRocm91Z2ggdGhlXG4gKiA8Y29kZT5maW5kPC9jb2RlPiBtZXRob2QuIGZvciBleGFtcGxlLCB0aGlzIHNhbXBsZSBjb2RlIGZldGNoZXMgYWxsIG9iamVjdHNcbiAqIG9mIGNsYXNzIDxjb2RlPm15Y2xhc3M8L2NvZGU+LiBpdCBjYWxscyBhIGRpZmZlcmVudCBmdW5jdGlvbiBkZXBlbmRpbmcgb25cbiAqIHdoZXRoZXIgdGhlIGZldGNoIHN1Y2NlZWRlZCBvciBub3QuXG4gKlxuICogPHByZT5cbiAqIHZhciBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShteWNsYXNzKTtcbiAqIHF1ZXJ5LmZpbmQoKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gKiAgIC8vIHJlc3VsdHMgaXMgYW4gYXJyYXkgb2YgcGFyc2Uub2JqZWN0LlxuICogfSkuY2F0Y2goKGVycm9yKSA9PiAge1xuICogIC8vIGVycm9yIGlzIGFuIGluc3RhbmNlIG9mIHBhcnNlLmVycm9yLlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPmEgUGFyc2UuUXVlcnkgY2FuIGFsc28gYmUgdXNlZCB0byByZXRyaWV2ZSBhIHNpbmdsZSBvYmplY3Qgd2hvc2UgaWQgaXNcbiAqIGtub3duLCB0aHJvdWdoIHRoZSBnZXQgbWV0aG9kLiBmb3IgZXhhbXBsZSwgdGhpcyBzYW1wbGUgY29kZSBmZXRjaGVzIGFuXG4gKiBvYmplY3Qgb2YgY2xhc3MgPGNvZGU+bXljbGFzczwvY29kZT4gYW5kIGlkIDxjb2RlPm15aWQ8L2NvZGU+LiBpdCBjYWxscyBhXG4gKiBkaWZmZXJlbnQgZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGZldGNoIHN1Y2NlZWRlZCBvciBub3QuXG4gKlxuICogPHByZT5cbiAqIHZhciBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShteWNsYXNzKTtcbiAqIHF1ZXJ5LmdldChteWlkKS50aGVuKChvYmplY3QpID0+IHtcbiAqICAgICAvLyBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgcGFyc2Uub2JqZWN0LlxuICogfSkuY2F0Y2goKGVycm9yKSA9PiAge1xuICogIC8vIGVycm9yIGlzIGFuIGluc3RhbmNlIG9mIHBhcnNlLmVycm9yLlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPmEgUGFyc2UuUXVlcnkgY2FuIGFsc28gYmUgdXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIG9iamVjdHMgdGhhdCBtYXRjaFxuICogdGhlIHF1ZXJ5IHdpdGhvdXQgcmV0cmlldmluZyBhbGwgb2YgdGhvc2Ugb2JqZWN0cy4gZm9yIGV4YW1wbGUsIHRoaXNcbiAqIHNhbXBsZSBjb2RlIGNvdW50cyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgb2YgdGhlIGNsYXNzIDxjb2RlPm15Y2xhc3M8L2NvZGU+XG4gKiA8cHJlPlxuICogdmFyIHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KG15Y2xhc3MpO1xuICogcXVlcnkuY291bnQoKS50aGVuKChudW1iZXIpID0+IHtcbiAqICAgICAvLyB0aGVyZSBhcmUgbnVtYmVyIGluc3RhbmNlcyBvZiBteWNsYXNzLlxuICogfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gKiAgICAgLy8gZXJyb3IgaXMgYW4gaW5zdGFuY2Ugb2YgUGFyc2UuRXJyb3IuXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlF1ZXJ5XG4gKi9cbmNsYXNzIFBhcnNlUXVlcnkge1xuICAvKipcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgUGFyc2UuT2JqZWN0KX0gb2JqZWN0Q2xhc3MgQW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBQYXJzZS5PYmplY3QsIG9yIGEgUGFyc2UgY2xhc3NOYW1lIHN0cmluZy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9iamVjdENsYXNzKSB7XG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNsYXNzTmFtZVxuICAgICAqL1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiY2xhc3NOYW1lXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfd2hlcmVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl93YXRjaFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2luY2x1ZGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9leGNsdWRlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfc2VsZWN0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbGltaXRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9za2lwXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfY291bnRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9vcmRlclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3JlYWRQcmVmZXJlbmNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfaW5jbHVkZVJlYWRQcmVmZXJlbmNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfc3VicXVlcnlSZWFkUHJlZmVyZW5jZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3F1ZXJpZXNMb2NhbERhdGFzdG9yZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2xvY2FsRGF0YXN0b3JlUGluTmFtZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2V4dHJhT3B0aW9uc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2hpbnRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9leHBsYWluXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfeGhyUmVxdWVzdFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2NvbW1lbnRcIiwgdm9pZCAwKTtcbiAgICBpZiAodHlwZW9mIG9iamVjdENsYXNzID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKG9iamVjdENsYXNzID09PSAnVXNlcicgJiYgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdQRVJGT1JNX1VTRVJfUkVXUklURScpKSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gb2JqZWN0Q2xhc3M7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvYmplY3RDbGFzcyBpbnN0YW5jZW9mIF9QYXJzZU9iamVjdC5kZWZhdWx0KSB7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IG9iamVjdENsYXNzLmNsYXNzTmFtZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3RDbGFzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgb2JqQ2xhc3MgPSBvYmplY3RDbGFzcztcbiAgICAgIGlmICh0eXBlb2Ygb2JqQ2xhc3MuY2xhc3NOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IG9iakNsYXNzLmNsYXNzTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IG5ldyBvYmpDbGFzcygpO1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IG9iai5jbGFzc05hbWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgUGFyc2VRdWVyeSBtdXN0IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBQYXJzZU9iamVjdCBvciBjbGFzcyBuYW1lLicpO1xuICAgIH1cbiAgICB0aGlzLl93aGVyZSA9IHt9O1xuICAgIHRoaXMuX3dhdGNoID0gW107XG4gICAgdGhpcy5faW5jbHVkZSA9IFtdO1xuICAgIHRoaXMuX2V4Y2x1ZGUgPSBbXTtcbiAgICB0aGlzLl9jb3VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2xpbWl0ID0gLTE7IC8vIG5lZ2F0aXZlIGxpbWl0IGlzIG5vdCBzZW50IGluIHRoZSBzZXJ2ZXIgcmVxdWVzdFxuICAgIHRoaXMuX3NraXAgPSAwO1xuICAgIHRoaXMuX3JlYWRQcmVmZXJlbmNlID0gbnVsbDtcbiAgICB0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSBudWxsO1xuICAgIHRoaXMuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSBudWxsO1xuICAgIHRoaXMuX3F1ZXJpZXNMb2NhbERhdGFzdG9yZSA9IGZhbHNlO1xuICAgIHRoaXMuX2xvY2FsRGF0YXN0b3JlUGluTmFtZSA9IG51bGw7XG4gICAgdGhpcy5fZXh0cmFPcHRpb25zID0ge307XG4gICAgdGhpcy5feGhyUmVxdWVzdCA9IHtcbiAgICAgIHRhc2s6IG51bGwsXG4gICAgICBvbmNoYW5nZTogKCkgPT4ge31cbiAgICB9O1xuICAgIHRoaXMuX2NvbW1lbnQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29uc3RyYWludCB0aGF0IGF0IGxlYXN0IG9uZSBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMgbWF0Y2hlcy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gcXVlcmllc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIF9vclF1ZXJ5KHF1ZXJpZXMpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSAoMCwgX21hcC5kZWZhdWx0KShxdWVyaWVzKS5jYWxsKHF1ZXJpZXMsIHEgPT4ge1xuICAgICAgcmV0dXJuIHEudG9KU09OKCkud2hlcmU7XG4gICAgfSk7XG4gICAgdGhpcy5fd2hlcmUuJG9yID0gcXVlcnlKU09OO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29uc3RyYWludCB0aGF0IGFsbCBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMgbWF0Y2guXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHF1ZXJpZXNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBfYW5kUXVlcnkocXVlcmllcykge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9ICgwLCBfbWFwLmRlZmF1bHQpKHF1ZXJpZXMpLmNhbGwocXVlcmllcywgcSA9PiB7XG4gICAgICByZXR1cm4gcS50b0pTT04oKS53aGVyZTtcbiAgICB9KTtcbiAgICB0aGlzLl93aGVyZS4kYW5kID0gcXVlcnlKU09OO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29uc3RyYWludCB0aGF0IG5vbmUgb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzIG1hdGNoLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBxdWVyaWVzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgX25vclF1ZXJ5KHF1ZXJpZXMpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSAoMCwgX21hcC5kZWZhdWx0KShxdWVyaWVzKS5jYWxsKHF1ZXJpZXMsIHEgPT4ge1xuICAgICAgcmV0dXJuIHEudG9KU09OKCkud2hlcmU7XG4gICAgfSk7XG4gICAgdGhpcy5fd2hlcmUuJG5vciA9IHF1ZXJ5SlNPTjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZm9yIGNvbmRpdGlvbiBxdWVyaWVzXG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIGNvbmRpdGlvblxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fVxuICAgKi9cbiAgX2FkZENvbmRpdGlvbihrZXksIGNvbmRpdGlvbiwgdmFsdWUpIHtcbiAgICBpZiAoIXRoaXMuX3doZXJlW2tleV0gfHwgdHlwZW9mIHRoaXMuX3doZXJlW2tleV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl93aGVyZVtrZXldID0ge307XG4gICAgfVxuICAgIHRoaXMuX3doZXJlW2tleV1bY29uZGl0aW9uXSA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHZhbHVlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgc3RyaW5nIGZvciByZWd1bGFyIGV4cHJlc3Npb24gYXQgdGhlIGJlZ2lubmluZ1xuICAgKlxuICAgKiBAcGFyYW0gc3RyaW5nXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBfcmVnZXhTdGFydFdpdGgoc3RyaW5nKSB7XG4gICAgcmV0dXJuICdeJyArIHF1b3RlKHN0cmluZyk7XG4gIH1cbiAgYXN5bmMgX2hhbmRsZU9mZmxpbmVRdWVyeShwYXJhbXMpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgX09mZmxpbmVRdWVyeS5kZWZhdWx0LnZhbGlkYXRlUXVlcnkodGhpcyk7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGNvbnN0IG9iamVjdHMgPSBhd2FpdCBsb2NhbERhdGFzdG9yZS5fc2VyaWFsaXplT2JqZWN0c0Zyb21QaW5OYW1lKHRoaXMuX2xvY2FsRGF0YXN0b3JlUGluTmFtZSk7XG4gICAgbGV0IHJlc3VsdHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShfY29udGV4dCA9ICgwLCBfbWFwLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgKGpzb24sIGluZGV4LCBhcnIpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdCA9IF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKGpzb24sIGZhbHNlKTtcbiAgICAgIGlmIChqc29uLl9sb2NhbElkICYmICFqc29uLm9iamVjdElkKSB7XG4gICAgICAgIG9iamVjdC5fbG9jYWxJZCA9IGpzb24uX2xvY2FsSWQ7XG4gICAgICB9XG4gICAgICBpZiAoIV9PZmZsaW5lUXVlcnkuZGVmYXVsdC5tYXRjaGVzUXVlcnkodGhpcy5jbGFzc05hbWUsIG9iamVjdCwgYXJyLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSkpLmNhbGwoX2NvbnRleHQsIG9iamVjdCA9PiBvYmplY3QgIT09IG51bGwpO1xuICAgIGlmICgoMCwgX2tleXMyLmRlZmF1bHQpKHBhcmFtcykpIHtcbiAgICAgIGxldCBrZXlzID0gKDAsIF9rZXlzMi5kZWZhdWx0KShwYXJhbXMpLnNwbGl0KCcsJyk7XG4gICAgICBrZXlzID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBbJ2NsYXNzTmFtZScsICdvYmplY3RJZCcsICdjcmVhdGVkQXQnLCAndXBkYXRlZEF0JywgJ0FDTCddKTtcbiAgICAgIHJlc3VsdHMgPSAoMCwgX21hcC5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIG9iamVjdCA9PiB7XG4gICAgICAgIHZhciBfY29udGV4dDI7XG4gICAgICAgIGNvbnN0IGpzb24gPSBvYmplY3QuX3RvRnVsbEpTT04oKTtcbiAgICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0MiA9ICgwLCBfa2V5cy5kZWZhdWx0KShqc29uKSkuY2FsbChfY29udGV4dDIsIGtleSA9PiB7XG4gICAgICAgICAgaWYgKCEoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5KSkge1xuICAgICAgICAgICAgZGVsZXRlIGpzb25ba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04oanNvbiwgZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMub3JkZXIpIHtcbiAgICAgIGNvbnN0IHNvcnRzID0gcGFyYW1zLm9yZGVyLnNwbGl0KCcsJyk7XG4gICAgICAoMCwgX3NvcnQuZGVmYXVsdCkocmVzdWx0cykuY2FsbChyZXN1bHRzLCAoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gaGFuZGxlT2ZmbGluZVNvcnQoYSwgYiwgc29ydHMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBjb3VudDsgLy8gY291bnQgdG90YWwgYmVmb3JlIGFwcGx5aW5nIGxpbWl0L3NraXBcbiAgICBpZiAocGFyYW1zLmNvdW50KSB7XG4gICAgICBjb3VudCA9IHJlc3VsdHMubGVuZ3RoOyAvLyB0b3RhbCBjb3VudCBmcm9tIHJlc3BvbnNlXG4gICAgfVxuICAgIGlmIChwYXJhbXMuc2tpcCkge1xuICAgICAgaWYgKHBhcmFtcy5za2lwID49IHJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdHMgPSAoMCwgX3NwbGljZS5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIHBhcmFtcy5za2lwLCByZXN1bHRzLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBsaW1pdCA9IHJlc3VsdHMubGVuZ3RoO1xuICAgIGlmIChwYXJhbXMubGltaXQgIT09IDAgJiYgcGFyYW1zLmxpbWl0IDwgcmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgIGxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cbiAgICByZXN1bHRzID0gKDAsIF9zcGxpY2UuZGVmYXVsdCkocmVzdWx0cykuY2FsbChyZXN1bHRzLCAwLCBsaW1pdCk7XG4gICAgaWYgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdHMsXG4gICAgICAgIGNvdW50XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcXVlcnkuXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgd2hlcmU6IHRoaXMuX3doZXJlXG4gICAgfTtcbiAgICBpZiAodGhpcy5fd2F0Y2gubGVuZ3RoKSB7XG4gICAgICBwYXJhbXMud2F0Y2ggPSB0aGlzLl93YXRjaC5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbmNsdWRlLmxlbmd0aCkge1xuICAgICAgcGFyYW1zLmluY2x1ZGUgPSB0aGlzLl9pbmNsdWRlLmpvaW4oJywnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V4Y2x1ZGUubGVuZ3RoKSB7XG4gICAgICBwYXJhbXMuZXhjbHVkZUtleXMgPSB0aGlzLl9leGNsdWRlLmpvaW4oJywnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NlbGVjdCkge1xuICAgICAgcGFyYW1zLmtleXMgPSB0aGlzLl9zZWxlY3Quam9pbignLCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY291bnQpIHtcbiAgICAgIHBhcmFtcy5jb3VudCA9IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLl9saW1pdCA+PSAwKSB7XG4gICAgICBwYXJhbXMubGltaXQgPSB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NraXAgPiAwKSB7XG4gICAgICBwYXJhbXMuc2tpcCA9IHRoaXMuX3NraXA7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcmRlcikge1xuICAgICAgcGFyYW1zLm9yZGVyID0gdGhpcy5fb3JkZXIuam9pbignLCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHBhcmFtcy5yZWFkUHJlZmVyZW5jZSA9IHRoaXMuX3JlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICBwYXJhbXMuaW5jbHVkZVJlYWRQcmVmZXJlbmNlID0gdGhpcy5faW5jbHVkZVJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgICAgcGFyYW1zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5faGludCkge1xuICAgICAgcGFyYW1zLmhpbnQgPSB0aGlzLl9oaW50O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXhwbGFpbikge1xuICAgICAgcGFyYW1zLmV4cGxhaW4gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29tbWVudCkge1xuICAgICAgcGFyYW1zLmNvbW1lbnQgPSB0aGlzLl9jb21tZW50O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9leHRyYU9wdGlvbnMpIHtcbiAgICAgIHBhcmFtc1trZXldID0gdGhpcy5fZXh0cmFPcHRpb25zW2tleV07XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgcXVlcnkgd2l0aCBjb25kaXRpb25zIGZyb20ganNvbiwgY2FuIGJlIHVzZWZ1bCB0byBzZW5kIHF1ZXJ5IGZyb20gc2VydmVyIHNpZGUgdG8gY2xpZW50XG4gICAqIE5vdCBzdGF0aWMsIGFsbCBxdWVyeSBjb25kaXRpb25zIHdhcyBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBiZSBkZWxldGVkLlxuICAgKiBGb3IgZXhhbXBsZSBvbiB0aGUgc2VydmVyIHNpZGUgd2UgaGF2ZVxuICAgKiB2YXIgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJjbGFzc05hbWVcIik7XG4gICAqIHF1ZXJ5LmVxdWFsVG8oa2V5OiB2YWx1ZSk7XG4gICAqIHF1ZXJ5LmxpbWl0KDEwMCk7XG4gICAqIC4uLiAob3RoZXJzIHF1ZXJpZXMpXG4gICAqIENyZWF0ZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIFF1ZXJ5IE9iamVjdFxuICAgKiB2YXIganNvbkZyb21TZXJ2ZXIgPSBxdWVyeS5mcm9tSlNPTigpO1xuICAgKlxuICAgKiBPbiBjbGllbnQgc2lkZSBnZXR0aW5nIHF1ZXJ5OlxuICAgKiB2YXIgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJjbGFzc05hbWVcIik7XG4gICAqIHF1ZXJ5LmZyb21KU09OKGpzb25Gcm9tU2VydmVyKTtcbiAgICpcbiAgICogYW5kIGNvbnRpbnVlIHRvIHF1ZXJ5Li4uXG4gICAqIHF1ZXJ5LnNraXAoMTAwKS5maW5kKCkudGhlbiguLi4pO1xuICAgKlxuICAgKiBAcGFyYW0ge1F1ZXJ5SlNPTn0ganNvbiBmcm9tIFBhcnNlLlF1ZXJ5LnRvSlNPTigpIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhKU09OKGpzb24pIHtcbiAgICBpZiAoanNvbi53aGVyZSkge1xuICAgICAgdGhpcy5fd2hlcmUgPSBqc29uLndoZXJlO1xuICAgIH1cbiAgICBpZiAoanNvbi53YXRjaCkge1xuICAgICAgdGhpcy5fd2F0Y2ggPSBqc29uLndhdGNoLnNwbGl0KCcsJyk7XG4gICAgfVxuICAgIGlmIChqc29uLmluY2x1ZGUpIHtcbiAgICAgIHRoaXMuX2luY2x1ZGUgPSBqc29uLmluY2x1ZGUuc3BsaXQoJywnKTtcbiAgICB9XG4gICAgaWYgKCgwLCBfa2V5czIuZGVmYXVsdCkoanNvbikpIHtcbiAgICAgIHRoaXMuX3NlbGVjdCA9ICgwLCBfa2V5czIuZGVmYXVsdCkoanNvbikuc3BsaXQoJywnKTtcbiAgICB9XG4gICAgaWYgKGpzb24uZXhjbHVkZUtleXMpIHtcbiAgICAgIHRoaXMuX2V4Y2x1ZGUgPSBqc29uLmV4Y2x1ZGVLZXlzLnNwbGl0KCcsJyk7XG4gICAgfVxuICAgIGlmIChqc29uLmNvdW50KSB7XG4gICAgICB0aGlzLl9jb3VudCA9IGpzb24uY291bnQgPT09IDE7XG4gICAgfVxuICAgIGlmIChqc29uLmxpbWl0KSB7XG4gICAgICB0aGlzLl9saW1pdCA9IGpzb24ubGltaXQ7XG4gICAgfVxuICAgIGlmIChqc29uLnNraXApIHtcbiAgICAgIHRoaXMuX3NraXAgPSBqc29uLnNraXA7XG4gICAgfVxuICAgIGlmIChqc29uLm9yZGVyKSB7XG4gICAgICB0aGlzLl9vcmRlciA9IGpzb24ub3JkZXIuc3BsaXQoJywnKTtcbiAgICB9XG4gICAgaWYgKGpzb24ucmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHRoaXMuX3JlYWRQcmVmZXJlbmNlID0ganNvbi5yZWFkUHJlZmVyZW5jZTtcbiAgICB9XG4gICAgaWYgKGpzb24uaW5jbHVkZVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICB0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSBqc29uLmluY2x1ZGVSZWFkUHJlZmVyZW5jZTtcbiAgICB9XG4gICAgaWYgKGpzb24uc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgICAgdGhpcy5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IGpzb24uc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcbiAgICB9XG4gICAgaWYgKGpzb24uaGludCkge1xuICAgICAgdGhpcy5faGludCA9IGpzb24uaGludDtcbiAgICB9XG4gICAgaWYgKGpzb24uZXhwbGFpbikge1xuICAgICAgdGhpcy5fZXhwbGFpbiA9ICEhanNvbi5leHBsYWluO1xuICAgIH1cbiAgICBpZiAoanNvbi5jb21tZW50KSB7XG4gICAgICB0aGlzLl9jb21tZW50ID0ganNvbi5jb21tZW50O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICBpZiAoanNvbi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDM7XG4gICAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoX2NvbnRleHQzID0gWyd3aGVyZScsICdpbmNsdWRlJywgJ2tleXMnLCAnY291bnQnLCAnbGltaXQnLCAnc2tpcCcsICdvcmRlcicsICdyZWFkUHJlZmVyZW5jZScsICdpbmNsdWRlUmVhZFByZWZlcmVuY2UnLCAnc3VicXVlcnlSZWFkUHJlZmVyZW5jZScsICdoaW50JywgJ2V4cGxhaW4nLCAnY29tbWVudCddKS5jYWxsKF9jb250ZXh0Mywga2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICB0aGlzLl9leHRyYU9wdGlvbnNba2V5XSA9IGpzb25ba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kIHRvIHJlc3RvcmUgUGFyc2UuUXVlcnkgYnkganNvbiByZXByZXNlbnRhdGlvblxuICAgKiBJbnRlcm5hbGx5IGNhbGxpbmcgUGFyc2UuUXVlcnkud2l0aEpTT05cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICAgKiBAcGFyYW0ge1F1ZXJ5SlNPTn0ganNvbiBmcm9tIFBhcnNlLlF1ZXJ5LnRvSlNPTigpIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IG5ldyBjcmVhdGVkIHF1ZXJ5XG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oY2xhc3NOYW1lLCBqc29uKSB7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShjbGFzc05hbWUpO1xuICAgIHJldHVybiBxdWVyeS53aXRoSlNPTihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUGFyc2UuT2JqZWN0IHdob3NlIGlkIGlzIGFscmVhZHkga25vd24gYnkgZmV0Y2hpbmcgZGF0YSBmcm9tXG4gICAqIHRoZSBzZXJ2ZXIuIFVubGlrZSB0aGUgPGNvZGU+Zmlyc3Q8L2NvZGU+IG1ldGhvZCwgaXQgbmV2ZXIgcmV0dXJucyB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3RJZCBUaGUgaWQgb2YgdGhlIG9iamVjdCB0byBiZSBmZXRjaGVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVGaW5kYCB0cmlnZ2VyLlxuICAgKiAgIDxsaT5qc29uOiBSZXR1cm4gcmF3IGpzb24gd2l0aG91dCBjb252ZXJ0aW5nIHRvIFBhcnNlLk9iamVjdFxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGdldChvYmplY3RJZCwgb3B0aW9ucykge1xuICAgIHRoaXMuZXF1YWxUbygnb2JqZWN0SWQnLCBvYmplY3RJZCk7XG4gICAgY29uc3QgZmlyc3RPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZpcnN0T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZpcnN0T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBmaXJzdE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnanNvbicpKSB7XG4gICAgICBmaXJzdE9wdGlvbnMuanNvbiA9IG9wdGlvbnMuanNvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlyc3QoZmlyc3RPcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvck9iamVjdCA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT0JKRUNUX05PVF9GT1VORCwgJ09iamVjdCBub3QgZm91bmQuJyk7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3JPYmplY3QpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIGxpc3Qgb2YgUGFyc2VPYmplY3RzIHRoYXQgc2F0aXNmeSB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zXG4gICAqIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVGaW5kYCB0cmlnZ2VyLlxuICAgKiAgIDxsaT5qc29uOiBSZXR1cm4gcmF3IGpzb24gd2l0aG91dCBjb252ZXJ0aW5nIHRvIFBhcnNlLk9iamVjdFxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBmaW5kKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBmaW5kT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZmluZE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZmluZE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZpbmRPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIHRoaXMuX3NldFJlcXVlc3RUYXNrKGZpbmRPcHRpb25zKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UXVlcnlDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy5fc2VsZWN0O1xuICAgIGlmICh0aGlzLl9xdWVyaWVzTG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVPZmZsaW5lUXVlcnkodGhpcy50b0pTT04oKSk7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX2ZpbmQuZGVmYXVsdCkoY29udHJvbGxlcikuY2FsbChjb250cm9sbGVyLCB0aGlzLmNsYXNzTmFtZSwgdGhpcy50b0pTT04oKSwgZmluZE9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgLy8gUmV0dXJuIGdlbmVyaWMgb2JqZWN0IHdoZW4gZXhwbGFpbiBpcyB1c2VkXG4gICAgICBpZiAodGhpcy5fZXhwbGFpbikge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0cztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSByZXNwb25zZS5yZXN1bHRzPy5tYXAoZGF0YSA9PiB7XG4gICAgICAgIC8vIEluIGNhc2VzIG9mIHJlbGF0aW9ucywgdGhlIHNlcnZlciBtYXkgc2VuZCBiYWNrIGEgY2xhc3NOYW1lXG4gICAgICAgIC8vIG9uIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHBheWxvYWRcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGUgPSByZXNwb25zZS5jbGFzc05hbWUgfHwgdGhpcy5jbGFzc05hbWU7XG4gICAgICAgIGlmICghZGF0YS5jbGFzc05hbWUpIHtcbiAgICAgICAgICBkYXRhLmNsYXNzTmFtZSA9IG92ZXJyaWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBkYXRhIG9iamVjdCBjb250YWlucyBrZXlzIGZvciBhbGwgb2JqZWN0cyB0aGF0XG4gICAgICAgIC8vIGhhdmUgYmVlbiByZXF1ZXN0ZWQgd2l0aCBhIHNlbGVjdCwgc28gdGhhdCBvdXIgY2FjaGVkIHN0YXRlXG4gICAgICAgIC8vIHVwZGF0ZXMgY29ycmVjdGx5LlxuICAgICAgICBpZiAoc2VsZWN0KSB7XG4gICAgICAgICAgaGFuZGxlU2VsZWN0UmVzdWx0KGRhdGEsIHNlbGVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTihkYXRhLCAhc2VsZWN0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjb3VudCA9IHJlc3BvbnNlLmNvdW50O1xuICAgICAgaWYgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXN1bHRzLFxuICAgICAgICAgIGNvdW50XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBjb21wbGV0ZSBsaXN0IG9mIFBhcnNlT2JqZWN0cyB0aGF0IHNhdGlzZnkgdGhpcyBxdWVyeS5cbiAgICogVXNpbmcgYGVhY2hCYXRjaGAgdW5kZXIgdGhlIGhvb2QgdG8gZmV0Y2ggYWxsIHRoZSB2YWxpZCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPmJhdGNoU2l6ZTogSG93IG1hbnkgb2JqZWN0cyB0byB5aWVsZCBpbiBlYWNoIGJhdGNoIChkZWZhdWx0OiAxMDApXG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdHMgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgZmluZEFsbChvcHRpb25zKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGF3YWl0IHRoaXMuZWFjaEJhdGNoKG9iamVjdHMgPT4ge1xuICAgICAgcmVzdWx0ID0gWy4uLnJlc3VsdCwgLi4ub2JqZWN0c107XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudHMgdGhlIG51bWJlciBvZiBvYmplY3RzIHRoYXQgbWF0Y2ggdGhpcyBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy51c2VNYXN0ZXJLZXldXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zZXNzaW9uVG9rZW5dXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgY291bnQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgY291bnQob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGZpbmRPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBmaW5kT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBmaW5kT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgdGhpcy5fc2V0UmVxdWVzdFRhc2soZmluZE9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRRdWVyeUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnRvSlNPTigpO1xuICAgIHBhcmFtcy5saW1pdCA9IDA7XG4gICAgcGFyYW1zLmNvdW50ID0gMTtcbiAgICByZXR1cm4gKDAsIF9maW5kLmRlZmF1bHQpKGNvbnRyb2xsZXIpLmNhbGwoY29udHJvbGxlciwgdGhpcy5jbGFzc05hbWUsIHBhcmFtcywgZmluZE9wdGlvbnMpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgIHJldHVybiByZXN1bHQuY291bnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBkaXN0aW5jdCBxdWVyeSBhbmQgcmV0dXJucyB1bmlxdWUgdmFsdWVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQSBmaWVsZCB0byBmaW5kIGRpc3RpbmN0IHZhbHVlc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc2Vzc2lvblRva2VuXSBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb24gYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGRpc3RpbmN0KGtleSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGRpc3RpbmN0T3B0aW9ucyA9IHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBkaXN0aW5jdE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIHRoaXMuX3NldFJlcXVlc3RUYXNrKGRpc3RpbmN0T3B0aW9ucyk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFF1ZXJ5Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGRpc3RpbmN0OiBrZXksXG4gICAgICB3aGVyZTogdGhpcy5fd2hlcmUsXG4gICAgICBoaW50OiB0aGlzLl9oaW50XG4gICAgfTtcbiAgICByZXR1cm4gY29udHJvbGxlci5hZ2dyZWdhdGUodGhpcy5jbGFzc05hbWUsIHBhcmFtcywgZGlzdGluY3RPcHRpb25zKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBhZ2dyZWdhdGUgcXVlcnkgYW5kIHJldHVybnMgYWdncmVnYXRlIHJlc3VsdHNcbiAgICpcbiAgICogQHBhcmFtIHsoQXJyYXl8b2JqZWN0KX0gcGlwZWxpbmUgQXJyYXkgb3IgT2JqZWN0IG9mIHN0YWdlcyB0byBwcm9jZXNzIHF1ZXJ5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zZXNzaW9uVG9rZW5dIEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvbiBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgYWdncmVnYXRlKHBpcGVsaW5lLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgYWdncmVnYXRlT3B0aW9ucyA9IHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBhZ2dyZWdhdGVPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRSZXF1ZXN0VGFzayhhZ2dyZWdhdGVPcHRpb25zKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UXVlcnlDb250cm9sbGVyKCk7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkocGlwZWxpbmUpICYmIHR5cGVvZiBwaXBlbGluZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwaXBlbGluZSBtdXN0IGJlIEFycmF5IG9yIE9iamVjdCcpO1xuICAgIH1cbiAgICBpZiAoKDAsIF9rZXlzLmRlZmF1bHQpKHRoaXMuX3doZXJlIHx8IHt9KS5sZW5ndGgpIHtcbiAgICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHBpcGVsaW5lKSkge1xuICAgICAgICBwaXBlbGluZSA9IFtwaXBlbGluZV07XG4gICAgICB9XG4gICAgICBwaXBlbGluZS51bnNoaWZ0KHtcbiAgICAgICAgJG1hdGNoOiB0aGlzLl93aGVyZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHBpcGVsaW5lLFxuICAgICAgaGludDogdGhpcy5faGludCxcbiAgICAgIGV4cGxhaW46IHRoaXMuX2V4cGxhaW4sXG4gICAgICByZWFkUHJlZmVyZW5jZTogdGhpcy5fcmVhZFByZWZlcmVuY2VcbiAgICB9O1xuICAgIHJldHVybiBjb250cm9sbGVyLmFnZ3JlZ2F0ZSh0aGlzLmNsYXNzTmFtZSwgcGFyYW1zLCBhZ2dyZWdhdGVPcHRpb25zKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYXQgbW9zdCBvbmUgUGFyc2UuT2JqZWN0IHRoYXQgc2F0aXNmaWVzIHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIG9iamVjdCBpZiB0aGVyZSBpcyBvbmUsIG90aGVyd2lzZSB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZUZpbmRgIHRyaWdnZXIuXG4gICAqICAgPGxpPmpzb246IFJldHVybiByYXcganNvbiB3aXRob3V0IGNvbnZlcnRpbmcgdG8gUGFyc2UuT2JqZWN0XG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBvYmplY3Qgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZmlyc3QoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNvbnN0IGZpbmRPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBmaW5kT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBmaW5kT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZmluZE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgdGhpcy5fc2V0UmVxdWVzdFRhc2soZmluZE9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRRdWVyeUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnRvSlNPTigpO1xuICAgIHBhcmFtcy5saW1pdCA9IDE7XG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy5fc2VsZWN0O1xuICAgIGlmICh0aGlzLl9xdWVyaWVzTG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVPZmZsaW5lUXVlcnkocGFyYW1zKS50aGVuKG9iamVjdHMgPT4ge1xuICAgICAgICBpZiAoIW9iamVjdHNbMF0pIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3RzWzBdO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX2ZpbmQuZGVmYXVsdCkoY29udHJvbGxlcikuY2FsbChjb250cm9sbGVyLCB0aGlzLmNsYXNzTmFtZSwgcGFyYW1zLCBmaW5kT3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RzID0gcmVzcG9uc2UucmVzdWx0cztcbiAgICAgIGlmICghb2JqZWN0c1swXSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKCFvYmplY3RzWzBdLmNsYXNzTmFtZSkge1xuICAgICAgICBvYmplY3RzWzBdLmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5zIGtleXMgZm9yIGFsbCBvYmplY3RzIHRoYXRcbiAgICAgIC8vIGhhdmUgYmVlbiByZXF1ZXN0ZWQgd2l0aCBhIHNlbGVjdCwgc28gdGhhdCBvdXIgY2FjaGVkIHN0YXRlXG4gICAgICAvLyB1cGRhdGVzIGNvcnJlY3RseS5cbiAgICAgIGlmIChzZWxlY3QpIHtcbiAgICAgICAgaGFuZGxlU2VsZWN0UmVzdWx0KG9iamVjdHNbMF0sIHNlbGVjdCk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RzWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKG9iamVjdHNbMF0sICFzZWxlY3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgb2JqZWN0cyBtYXRjaGluZyBhIHF1ZXJ5LCBjYWxsaW5nIGEgY2FsbGJhY2sgZm9yIGVhY2ggYmF0Y2guXG4gICAqIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcHJvbWlzZSwgdGhlIGl0ZXJhdGlvbiB3aWxsIG5vdCBjb250aW51ZSB1bnRpbFxuICAgKiB0aGF0IHByb21pc2UgaGFzIGJlZW4gZnVsZmlsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHJlamVjdGVkXG4gICAqIHByb21pc2UsIHRoZW4gaXRlcmF0aW9uIHdpbGwgc3RvcCB3aXRoIHRoYXQgZXJyb3IuIFRoZSBpdGVtcyBhcmUgcHJvY2Vzc2VkXG4gICAqIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLiBUaGUgcXVlcnkgbWF5IG5vdCBoYXZlIGFueSBzb3J0IG9yZGVyLCBhbmQgbWF5XG4gICAqIG5vdCB1c2UgbGltaXQgb3Igc2tpcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGVhY2ggcmVzdWx0XG4gICAqICAgICBvZiB0aGUgcXVlcnkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+YmF0Y2hTaXplOiBIb3cgbWFueSBvYmplY3RzIHRvIHlpZWxkIGluIGVhY2ggYmF0Y2ggKGRlZmF1bHQ6IDEwMClcbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZUZpbmRgIHRyaWdnZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZVxuICAgKiAgICAgaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBlYWNoQmF0Y2goY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAodGhpcy5fb3JkZXIgfHwgdGhpcy5fc2tpcCB8fCB0aGlzLl9saW1pdCA+PSAwKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ0Nhbm5vdCBpdGVyYXRlIG9uIGEgcXVlcnkgd2l0aCBzb3J0LCBza2lwLCBvciBsaW1pdC4nKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeSh0aGlzLmNsYXNzTmFtZSk7XG4gICAgcXVlcnkuX2xpbWl0ID0gb3B0aW9ucy5iYXRjaFNpemUgfHwgMTAwO1xuICAgIHF1ZXJ5Ll9pbmNsdWRlID0gWy4uLnRoaXMuX2luY2x1ZGVdO1xuICAgIHF1ZXJ5Ll9leGNsdWRlID0gWy4uLnRoaXMuX2V4Y2x1ZGVdO1xuICAgIGlmICh0aGlzLl9zZWxlY3QpIHtcbiAgICAgIHF1ZXJ5Ll9zZWxlY3QgPSBbLi4udGhpcy5fc2VsZWN0XTtcbiAgICB9XG4gICAgcXVlcnkuX2hpbnQgPSB0aGlzLl9oaW50O1xuICAgIHF1ZXJ5Ll93aGVyZSA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiB0aGlzLl93aGVyZSkge1xuICAgICAgY29uc3QgdmFsID0gdGhpcy5fd2hlcmVbYXR0cl07XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbCkpIHtcbiAgICAgICAgcXVlcnkuX3doZXJlW2F0dHJdID0gKDAsIF9tYXAuZGVmYXVsdCkodmFsKS5jYWxsKHZhbCwgdiA9PiB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uTWFwID0ge307XG4gICAgICAgIHF1ZXJ5Ll93aGVyZVthdHRyXSA9IGNvbmRpdGlvbk1hcDtcbiAgICAgICAgZm9yIChjb25zdCBjb25kIGluIHZhbCkge1xuICAgICAgICAgIGNvbmRpdGlvbk1hcFtjb25kXSA9IHZhbFtjb25kXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkuX3doZXJlW2F0dHJdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICBxdWVyeS5hc2NlbmRpbmcoJ29iamVjdElkJyk7XG4gICAgY29uc3QgZmluZE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBmaW5kT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnanNvbicpKSB7XG4gICAgICBmaW5kT3B0aW9ucy5qc29uID0gb3B0aW9ucy5qc29uO1xuICAgIH1cbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgcHJldmlvdXNSZXN1bHRzID0gW107XG4gICAgcmV0dXJuICgwLCBfcHJvbWlzZVV0aWxzLmNvbnRpbnVlV2hpbGUpKCgpID0+IHtcbiAgICAgIHJldHVybiAhZmluaXNoZWQ7XG4gICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgW3Jlc3VsdHNdID0gYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwoWygwLCBfZmluZC5kZWZhdWx0KShxdWVyeSkuY2FsbChxdWVyeSwgZmluZE9wdGlvbnMpLCBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUocHJldmlvdXNSZXN1bHRzLmxlbmd0aCA+IDAgJiYgY2FsbGJhY2socHJldmlvdXNSZXN1bHRzKSldKTtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+PSBxdWVyeS5fbGltaXQpIHtcbiAgICAgICAgcXVlcnkuZ3JlYXRlclRoYW4oJ29iamVjdElkJywgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLmlkKTtcbiAgICAgICAgcHJldmlvdXNSZXN1bHRzID0gcmVzdWx0cztcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjYWxsYmFjayhyZXN1bHRzKSk7XG4gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIGVhY2ggcmVzdWx0IG9mIGEgcXVlcnksIGNhbGxpbmcgYSBjYWxsYmFjayBmb3IgZWFjaCBvbmUuIElmXG4gICAqIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcHJvbWlzZSwgdGhlIGl0ZXJhdGlvbiB3aWxsIG5vdCBjb250aW51ZSB1bnRpbFxuICAgKiB0aGF0IHByb21pc2UgaGFzIGJlZW4gZnVsZmlsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHJlamVjdGVkXG4gICAqIHByb21pc2UsIHRoZW4gaXRlcmF0aW9uIHdpbGwgc3RvcCB3aXRoIHRoYXQgZXJyb3IuIFRoZSBpdGVtcyBhcmVcbiAgICogcHJvY2Vzc2VkIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLiBUaGUgcXVlcnkgbWF5IG5vdCBoYXZlIGFueSBzb3J0IG9yZGVyLFxuICAgKiBhbmQgbWF5IG5vdCB1c2UgbGltaXQgb3Igc2tpcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGVhY2ggcmVzdWx0XG4gICAqICAgICBvZiB0aGUgcXVlcnkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5qc29uOiBSZXR1cm4gcmF3IGpzb24gd2l0aG91dCBjb252ZXJ0aW5nIHRvIFBhcnNlLk9iamVjdFxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgb25jZSB0aGVcbiAgICogICAgIGl0ZXJhdGlvbiBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgZWFjaChjYWxsYmFjaywgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmVhY2hCYXRjaChyZXN1bHRzID0+IHtcbiAgICAgIGxldCBjYWxsYmFja3NEb25lID0gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocmVzdWx0cykuY2FsbChyZXN1bHRzLCByZXN1bHQgPT4ge1xuICAgICAgICBjYWxsYmFja3NEb25lID0gY2FsbGJhY2tzRG9uZS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjYWxsYmFja3NEb25lO1xuICAgIH0sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBoaW50IHRvIGZvcmNlIGluZGV4IHNlbGVjdGlvbi4gKGh0dHBzOi8vZG9jcy5tb25nb2RiLmNvbS9tYW51YWwvcmVmZXJlbmNlL29wZXJhdG9yL21ldGEvaGludC8pXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSB2YWx1ZSBTdHJpbmcgb3IgT2JqZWN0IG9mIGluZGV4IHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBleGVjdXRpbmcgcXVlcnlcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBoaW50KHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9oaW50O1xuICAgIH1cbiAgICB0aGlzLl9oaW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW52ZXN0aWdhdGVzIHRoZSBxdWVyeSBleGVjdXRpb24gcGxhbi4gVXNlZnVsIGZvciBvcHRpbWl6aW5nIHF1ZXJpZXMuIChodHRwczovL2RvY3MubW9uZ29kYi5jb20vbWFudWFsL3JlZmVyZW5jZS9vcGVyYXRvci9tZXRhL2V4cGxhaW4vKVxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV4cGxhaW4gVXNlZCB0byB0b2dnbGUgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSBxdWVyeSBwbGFuLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGV4cGxhaW4oKSB7XG4gICAgbGV0IGV4cGxhaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gICAgaWYgKHR5cGVvZiBleHBsYWluICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbiBvbmx5IHNldCBleHBsYWluIHRvIGEgYm9vbGVhbiB2YWx1ZScpO1xuICAgIH1cbiAgICB0aGlzLl9leHBsYWluID0gZXhwbGFpbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIGVhY2ggcmVzdWx0IG9mIGEgcXVlcnksIGNhbGxpbmcgYSBjYWxsYmFjayBmb3IgZWFjaCBvbmUuIElmXG4gICAqIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcHJvbWlzZSwgdGhlIGl0ZXJhdGlvbiB3aWxsIG5vdCBjb250aW51ZSB1bnRpbFxuICAgKiB0aGF0IHByb21pc2UgaGFzIGJlZW4gZnVsZmlsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHJlamVjdGVkXG4gICAqIHByb21pc2UsIHRoZW4gaXRlcmF0aW9uIHdpbGwgc3RvcCB3aXRoIHRoYXQgZXJyb3IuIFRoZSBpdGVtcyBhcmVcbiAgICogcHJvY2Vzc2VkIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLiBUaGUgcXVlcnkgbWF5IG5vdCBoYXZlIGFueSBzb3J0IG9yZGVyLFxuICAgKiBhbmQgbWF5IG5vdCB1c2UgbGltaXQgb3Igc2tpcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgPHVsPlxuICAgKiAgIDxsaT5jdXJyZW50T2JqZWN0OiBUaGUgY3VycmVudCBQYXJzZS5PYmplY3QgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBhcnJheS48L2xpPlxuICAgKiAgIDxsaT5pbmRleDogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IFBhcnNlLk9iamVjdCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIGFycmF5LjwvbGk+XG4gICAqICAgPGxpPnF1ZXJ5OiBUaGUgcXVlcnkgbWFwIHdhcyBjYWxsZWQgdXBvbi48L2xpPlxuICAgKiA8L3VsPlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlXG4gICAqICAgICBpdGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIGFzeW5jIG1hcChjYWxsYmFjaywgb3B0aW9ucykge1xuICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBhd2FpdCB0aGlzLmVhY2gob2JqZWN0ID0+IHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY2FsbGJhY2sob2JqZWN0LCBpbmRleCwgdGhpcykpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgYXJyYXkucHVzaChyZXN1bHQpO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfSk7XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgZWFjaCByZXN1bHQgb2YgYSBxdWVyeSwgY2FsbGluZyBhIGNhbGxiYWNrIGZvciBlYWNoIG9uZS4gSWZcbiAgICogdGhlIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB0aGUgaXRlcmF0aW9uIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsXG4gICAqIHRoYXQgcHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICogcHJvbWlzZSwgdGhlbiBpdGVyYXRpb24gd2lsbCBzdG9wIHdpdGggdGhhdCBlcnJvci4gVGhlIGl0ZW1zIGFyZVxuICAgKiBwcm9jZXNzZWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIuIFRoZSBxdWVyeSBtYXkgbm90IGhhdmUgYW55IHNvcnQgb3JkZXIsXG4gICAqIGFuZCBtYXkgbm90IHVzZSBsaW1pdCBvciBza2lwLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayA8dWw+XG4gICAqICAgPGxpPmFjY3VtdWxhdG9yOiBUaGUgYWNjdW11bGF0b3IgYWNjdW11bGF0ZXMgdGhlIGNhbGxiYWNrJ3MgcmV0dXJuIHZhbHVlcy4gSXQgaXMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvbiBvZiB0aGUgY2FsbGJhY2suPC9saT5cbiAgICogICA8bGk+Y3VycmVudE9iamVjdDogVGhlIGN1cnJlbnQgUGFyc2UuT2JqZWN0IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgYXJyYXkuPC9saT5cbiAgICogICA8bGk+aW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBQYXJzZS5PYmplY3QgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBhcnJheS48L2xpPlxuICAgKiA8L3VsPlxuICAgKiBAcGFyYW0geyp9IGluaXRpYWxWYWx1ZSBBIHZhbHVlIHRvIHVzZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGNhbGwgb2YgdGhlIGNhbGxiYWNrLiBJZiBubyBpbml0aWFsVmFsdWUgaXMgc3VwcGxpZWQsIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIHF1ZXJ5IHdpbGwgYmUgdXNlZCBhbmQgc2tpcHBlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZVxuICAgKiAgICAgaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBhc3luYyByZWR1Y2UoY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgb3B0aW9ucykge1xuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGF3YWl0IHRoaXMuZWFjaChvYmplY3QgPT4ge1xuICAgICAgLy8gSWYgbm8gaW5pdGlhbCB2YWx1ZSB3YXMgZ2l2ZW4sIHdlIHRha2UgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoZSBxdWVyeVxuICAgICAgLy8gYXMgdGhlIGluaXRpYWwgdmFsdWUgYW5kIGRvbid0IGNhbGwgdGhlIGNhbGxiYWNrIHdpdGggaXQuXG4gICAgICBpZiAoaW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWNjdW11bGF0b3IgPSBvYmplY3Q7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY2FsbGJhY2soYWNjdW11bGF0b3IsIG9iamVjdCwgaW5kZXgpKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGFjY3VtdWxhdG9yID0gcmVzdWx0O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfSk7XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgaWYgKGluZGV4ID09PSAwICYmIGluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBNYXRjaCBBcnJheS5yZWR1Y2UgYmVoYXZpb3I6IFwiQ2FsbGluZyByZWR1Y2UoKSBvbiBhbiBlbXB0eSBhcnJheVxuICAgICAgLy8gd2l0aG91dCBhbiBpbml0aWFsVmFsdWUgd2lsbCB0aHJvdyBhIFR5cGVFcnJvclwiLlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVkdWNpbmcgZW1wdHkgcXVlcnkgcmVzdWx0IHNldCB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgZWFjaCByZXN1bHQgb2YgYSBxdWVyeSwgY2FsbGluZyBhIGNhbGxiYWNrIGZvciBlYWNoIG9uZS4gSWZcbiAgICogdGhlIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB0aGUgaXRlcmF0aW9uIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsXG4gICAqIHRoYXQgcHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICogcHJvbWlzZSwgdGhlbiBpdGVyYXRpb24gd2lsbCBzdG9wIHdpdGggdGhhdCBlcnJvci4gVGhlIGl0ZW1zIGFyZVxuICAgKiBwcm9jZXNzZWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIuIFRoZSBxdWVyeSBtYXkgbm90IGhhdmUgYW55IHNvcnQgb3JkZXIsXG4gICAqIGFuZCBtYXkgbm90IHVzZSBsaW1pdCBvciBza2lwLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayA8dWw+XG4gICAqICAgPGxpPmN1cnJlbnRPYmplY3Q6IFRoZSBjdXJyZW50IFBhcnNlLk9iamVjdCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIGFycmF5LjwvbGk+XG4gICAqICAgPGxpPmluZGV4OiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgUGFyc2UuT2JqZWN0IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgYXJyYXkuPC9saT5cbiAgICogICA8bGk+cXVlcnk6IFRoZSBxdWVyeSBmaWx0ZXIgd2FzIGNhbGxlZCB1cG9uLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgb25jZSB0aGVcbiAgICogICAgIGl0ZXJhdGlvbiBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgYXN5bmMgZmlsdGVyKGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGF3YWl0IHRoaXMuZWFjaChvYmplY3QgPT4ge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjYWxsYmFjayhvYmplY3QsIGluZGV4LCB0aGlzKSkudGhlbihmbGFnID0+IHtcbiAgICAgICAgaWYgKGZsYWcpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH0pO1xuICAgIH0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qIFF1ZXJ5IENvbmRpdGlvbnMgKi9cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGVxdWFsIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIFBhcnNlLk9iamVjdCBtdXN0IGNvbnRhaW4uXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZXF1YWxUbyhrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIF9jb250ZXh0NDtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDQgPSAoMCwgX2VudHJpZXMuZGVmYXVsdCkoa2V5KSkuY2FsbChfY29udGV4dDQsIF9yZWYgPT4ge1xuICAgICAgICBsZXQgW2ssIHZhbF0gPSBfcmVmO1xuICAgICAgICByZXR1cm4gdGhpcy5lcXVhbFRvKGssIHZhbCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZG9lc05vdEV4aXN0KGtleSk7XG4gICAgfVxuICAgIHRoaXMuX3doZXJlW2tleV0gPSAoMCwgX2VuY29kZS5kZWZhdWx0KSh2YWx1ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBub3QgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCBtdXN0IG5vdCBiZSBlcXVhbGxlZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBub3RFcXVhbFRvKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX2NvbnRleHQ1O1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NSA9ICgwLCBfZW50cmllcy5kZWZhdWx0KShrZXkpKS5jYWxsKF9jb250ZXh0NSwgX3JlZjIgPT4ge1xuICAgICAgICBsZXQgW2ssIHZhbF0gPSBfcmVmMjtcbiAgICAgICAgcmV0dXJuIHRoaXMubm90RXF1YWxUbyhrLCB2YWwpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbmUnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGxlc3MgdGhhbiB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHByb3ZpZGVzIGFuIHVwcGVyIGJvdW5kLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGxlc3NUaGFuKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRsdCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgZ3JlYXRlciB0aGFuIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgcHJvdmlkZXMgYW4gbG93ZXIgYm91bmQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZ3JlYXRlclRoYW4oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGd0JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCBwcm92aWRlcyBhbiB1cHBlciBib3VuZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBsZXNzVGhhbk9yRXF1YWxUbyhrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbHRlJywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgcHJvdmlkZXMgYW4gbG93ZXIgYm91bmQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZ3JlYXRlclRoYW5PckVxdWFsVG8oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGd0ZScsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZCBsaXN0IG9mIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0ge0FycmF5PCo+fSB2YWx1ZSBUaGUgdmFsdWVzIHRoYXQgd2lsbCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb250YWluZWRJbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckaW4nLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIG5vdCBiZSBjb250YWluZWQgaW4gdGhlIHByb3ZpZGVkIGxpc3Qgb2YgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB7QXJyYXk8Kj59IHZhbHVlIFRoZSB2YWx1ZXMgdGhhdCB3aWxsIG5vdCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBub3RDb250YWluZWRJbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbmluJywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBjb250YWluZWQgYnkgdGhlIHByb3ZpZGVkIGxpc3Qgb2YgdmFsdWVzLiBHZXQgb2JqZWN0cyB3aGVyZSBhbGwgYXJyYXkgZWxlbWVudHMgbWF0Y2guXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdGhhdCB3aWxsIG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNvbnRhaW5lZEJ5KGtleSwgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckY29udGFpbmVkQnknLCB2YWx1ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBjb250YWluIGVhY2ggb25lIG9mIHRoZSBwcm92aWRlZCBsaXN0IG9mIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLiAgVGhpcyBrZXkncyB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5LlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0aGF0IHdpbGwgbWF0Y2guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY29udGFpbnNBbGwoa2V5LCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRhbGwnLCB2YWx1ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBjb250YWluIGVhY2ggb25lIG9mIHRoZSBwcm92aWRlZCBsaXN0IG9mIHZhbHVlcyBzdGFydGluZyB3aXRoIGdpdmVuIHN0cmluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay4gIFRoaXMga2V5J3MgdmFsdWUgbXVzdCBiZSBhbiBhcnJheS5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB2YWx1ZXMgVGhlIHN0cmluZyB2YWx1ZXMgdGhhdCB3aWxsIG1hdGNoIGFzIHN0YXJ0aW5nIHN0cmluZy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb250YWluc0FsbFN0YXJ0aW5nV2l0aChrZXksIHZhbHVlcykge1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlcykpIHtcbiAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdO1xuICAgIH1cbiAgICBjb25zdCByZWdleE9iamVjdCA9ICgwLCBfbWFwLmRlZmF1bHQpKHZhbHVlcykuY2FsbCh2YWx1ZXMsIHZhbHVlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICRyZWdleDogdGhpcy5fcmVnZXhTdGFydFdpdGgodmFsdWUpXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5zQWxsKGtleSwgcmVnZXhPYmplY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IGZvciBmaW5kaW5nIG9iamVjdHMgdGhhdCBjb250YWluIHRoZSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHNob3VsZCBleGlzdC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBleGlzdHMoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZXhpc3RzJywgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgb2JqZWN0cyB0aGF0IGRvIG5vdCBjb250YWluIGEgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCBzaG91bGQgbm90IGV4aXN0XG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZG9lc05vdEV4aXN0KGtleSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGV4aXN0cycsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVndWxhciBleHByZXNzaW9uIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgc3RyaW5nIHZhbHVlcyB0aGF0IG1hdGNoXG4gICAqIHRoZSBwcm92aWRlZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqIFRoaXMgbWF5IGJlIHNsb3cgZm9yIGxhcmdlIGRhdGFzZXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgc3RyaW5nIHRvIG1hdGNoIGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtSZWdFeHAgfCBzdHJpbmd9IHJlZ2V4IFRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGlmaWVycyBUaGUgcmVndWxhciBleHByZXNzaW9uIG1vZGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbWF0Y2hlcyhrZXksIHJlZ2V4LCBtb2RpZmllcnMpIHtcbiAgICB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJHJlZ2V4JywgcmVnZXgpO1xuICAgIGlmICghbW9kaWZpZXJzKSB7XG4gICAgICBtb2RpZmllcnMgPSAnJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWdleCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChyZWdleC5pZ25vcmVDYXNlKSB7XG4gICAgICAgIG1vZGlmaWVycyArPSAnaSc7XG4gICAgICB9XG4gICAgICBpZiAocmVnZXgubXVsdGlsaW5lKSB7XG4gICAgICAgIG1vZGlmaWVycyArPSAnbSc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2RpZmllcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJG9wdGlvbnMnLCBtb2RpZmllcnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0aGF0IHJlcXVpcmVzIHRoYXQgYSBrZXkncyB2YWx1ZSBtYXRjaGVzIGEgUGFyc2UuUXVlcnlcbiAgICogY29uc3RyYWludC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIGNvbnRhaW5zIHRoZSBvYmplY3QgdG8gbWF0Y2ggdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgcXVlcnkuXG4gICAqIEBwYXJhbSB7UGFyc2UuUXVlcnl9IHF1ZXJ5IFRoZSBxdWVyeSB0aGF0IHNob3VsZCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBtYXRjaGVzUXVlcnkoa2V5LCBxdWVyeSkge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9IHF1ZXJ5LnRvSlNPTigpO1xuICAgIHF1ZXJ5SlNPTi5jbGFzc05hbWUgPSBxdWVyeS5jbGFzc05hbWU7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckaW5RdWVyeScsIHF1ZXJ5SlNPTik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdGhhdCByZXF1aXJlcyB0aGF0IGEga2V5J3MgdmFsdWUgbm90IG1hdGNoZXMgYVxuICAgKiBQYXJzZS5RdWVyeSBjb25zdHJhaW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgY29udGFpbnMgdGhlIG9iamVjdCB0byBtYXRjaCB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICBxdWVyeS5cbiAgICogQHBhcmFtIHtQYXJzZS5RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IHRoYXQgc2hvdWxkIG5vdCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkb2VzTm90TWF0Y2hRdWVyeShrZXksIHF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gcXVlcnkudG9KU09OKCk7XG4gICAgcXVlcnlKU09OLmNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRub3RJblF1ZXJ5JywgcXVlcnlKU09OKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0aGF0IHJlcXVpcmVzIHRoYXQgYSBrZXkncyB2YWx1ZSBtYXRjaGVzIGEgdmFsdWUgaW5cbiAgICogYW4gb2JqZWN0IHJldHVybmVkIGJ5IGEgZGlmZmVyZW50IFBhcnNlLlF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgdGhhdCBpcyBiZWluZ1xuICAgKiAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeUtleSBUaGUga2V5IGluIHRoZSBvYmplY3RzIHJldHVybmVkIGJ5IHRoZSBxdWVyeSB0b1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIHtQYXJzZS5RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHJ1bi5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBtYXRjaGVzS2V5SW5RdWVyeShrZXksIHF1ZXJ5S2V5LCBxdWVyeSkge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9IHF1ZXJ5LnRvSlNPTigpO1xuICAgIHF1ZXJ5SlNPTi5jbGFzc05hbWUgPSBxdWVyeS5jbGFzc05hbWU7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckc2VsZWN0Jywge1xuICAgICAga2V5OiBxdWVyeUtleSxcbiAgICAgIHF1ZXJ5OiBxdWVyeUpTT05cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0aGF0IHJlcXVpcmVzIHRoYXQgYSBrZXkncyB2YWx1ZSBub3QgbWF0Y2ggYSB2YWx1ZSBpblxuICAgKiBhbiBvYmplY3QgcmV0dXJuZWQgYnkgYSBkaWZmZXJlbnQgUGFyc2UuUXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSB0aGF0IGlzIGJlaW5nXG4gICAqICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeUtleSBUaGUga2V5IGluIHRoZSBvYmplY3RzIHJldHVybmVkIGJ5IHRoZSBxdWVyeSB0b1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIHtQYXJzZS5RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHJ1bi5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkb2VzTm90TWF0Y2hLZXlJblF1ZXJ5KGtleSwgcXVlcnlLZXksIHF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gcXVlcnkudG9KU09OKCk7XG4gICAgcXVlcnlKU09OLmNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRkb250U2VsZWN0Jywge1xuICAgICAga2V5OiBxdWVyeUtleSxcbiAgICAgIHF1ZXJ5OiBxdWVyeUpTT05cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBzdHJpbmcgdmFsdWVzIHRoYXQgY29udGFpbiBhIHByb3ZpZGVkXG4gICAqIHN0cmluZy4gIFRoaXMgbWF5IGJlIHNsb3cgZm9yIGxhcmdlIGRhdGFzZXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgc3RyaW5nIHRvIG1hdGNoIGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnN0cmluZyBUaGUgc3Vic3RyaW5nIHRoYXQgdGhlIHZhbHVlIG11c3QgY29udGFpbi5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb250YWlucyhrZXksIHN1YnN0cmluZykge1xuICAgIGlmICh0eXBlb2Ygc3Vic3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgYmVpbmcgc2VhcmNoZWQgZm9yIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJHJlZ2V4JywgcXVvdGUoc3Vic3RyaW5nKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgc3RyaW5nIHZhbHVlcyB0aGF0IGNvbnRhaW4gYSBwcm92aWRlZFxuICAgKiBzdHJpbmcuIFRoaXMgbWF5IGJlIHNsb3cgZm9yIGxhcmdlIGRhdGFzZXRzLiBSZXF1aXJlcyBQYXJzZS1TZXJ2ZXIgPiAyLjUuMFxuICAgKlxuICAgKiBJbiBvcmRlciB0byBzb3J0IHlvdSBtdXN0IHVzZSBzZWxlY3QgYW5kIGFzY2VuZGluZyAoJHNjb3JlIGlzIHJlcXVpcmVkKVxuICAgKiAgPHByZT5cbiAgICogICBxdWVyeS5mdWxsVGV4dCgnZmllbGQnLCAndGVybScpO1xuICAgKiAgIHF1ZXJ5LmFzY2VuZGluZygnJHNjb3JlJyk7XG4gICAqICAgcXVlcnkuc2VsZWN0KCckc2NvcmUnKTtcbiAgICogIDwvcHJlPlxuICAgKlxuICAgKiBUbyByZXRyaWV2ZSB0aGUgd2VpZ2h0IC8gcmFua1xuICAgKiAgPHByZT5cbiAgICogICBvYmplY3QtPmdldCgnc2NvcmUnKTtcbiAgICogIDwvcHJlPlxuICAgKlxuICAgKiBZb3UgY2FuIGRlZmluZSBvcHRpb25hbHMgYnkgcHJvdmlkaW5nIGFuIG9iamVjdCBhcyBhIHRoaXJkIHBhcmFtZXRlclxuICAgKiAgPHByZT5cbiAgICogICBxdWVyeS5mdWxsVGV4dCgnZmllbGQnLCAndGVybScsIHsgbGFuZ3VhZ2U6ICdlcycsIGRpYWNyaXRpY1NlbnNpdGl2ZTogdHJ1ZSB9KTtcbiAgICogIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgc3RyaW5nIHRvIG1hdGNoIGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSBzdHJpbmcgdG8gc2VhcmNoXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIChPcHRpb25hbClcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubGFuZ3VhZ2UgVGhlIGxhbmd1YWdlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgbGlzdCBvZiBzdG9wIHdvcmRzIGZvciB0aGUgc2VhcmNoIGFuZCB0aGUgcnVsZXMgZm9yIHRoZSBzdGVtbWVyIGFuZCB0b2tlbml6ZXIuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5jYXNlU2Vuc2l0aXZlIEEgYm9vbGVhbiBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIGNhc2Ugc2Vuc2l0aXZlIHNlYXJjaC5cbiAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmRpYWNyaXRpY1NlbnNpdGl2ZSBBIGJvb2xlYW4gZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBkaWFjcml0aWMgc2Vuc2l0aXZlIHNlYXJjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBmdWxsVGV4dChrZXksIHZhbHVlKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmICgha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Ega2V5IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Egc2VhcmNoIHRlcm0gaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZhbHVlIGJlaW5nIHNlYXJjaGVkIGZvciBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICBjb25zdCBmdWxsT3B0aW9ucyA9IHt9O1xuICAgIGZ1bGxPcHRpb25zLiR0ZXJtID0gdmFsdWU7XG4gICAgZm9yIChjb25zdCBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgY2FzZSAnbGFuZ3VhZ2UnOlxuICAgICAgICAgIGZ1bGxPcHRpb25zLiRsYW5ndWFnZSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2FzZVNlbnNpdGl2ZSc6XG4gICAgICAgICAgZnVsbE9wdGlvbnMuJGNhc2VTZW5zaXRpdmUgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RpYWNyaXRpY1NlbnNpdGl2ZSc6XG4gICAgICAgICAgZnVsbE9wdGlvbnMuJGRpYWNyaXRpY1NlbnNpdGl2ZSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gb3B0aW9uOiAke29wdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckdGV4dCcsIHtcbiAgICAgICRzZWFyY2g6IGZ1bGxPcHRpb25zXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHNvcnQgdGhlIGZ1bGwgdGV4dCBzZWFyY2ggYnkgdGV4dCBzY29yZVxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHNvcnRCeVRleHRTY29yZSgpIHtcbiAgICB0aGlzLmFzY2VuZGluZygnJHNjb3JlJyk7XG4gICAgdGhpcy5zZWxlY3QoWyckc2NvcmUnXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgc3RyaW5nIHZhbHVlcyB0aGF0IHN0YXJ0IHdpdGggYSBwcm92aWRlZFxuICAgKiBzdHJpbmcuICBUaGlzIHF1ZXJ5IHdpbGwgdXNlIHRoZSBiYWNrZW5kIGluZGV4LCBzbyBpdCB3aWxsIGJlIGZhc3QgZXZlblxuICAgKiBmb3IgbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IFRoZSBzdWJzdHJpbmcgdGhhdCB0aGUgdmFsdWUgbXVzdCBzdGFydCB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kaWZpZXJzIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbW9kZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBzdGFydHNXaXRoKGtleSwgcHJlZml4LCBtb2RpZmllcnMpIHtcbiAgICBpZiAodHlwZW9mIHByZWZpeCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZhbHVlIGJlaW5nIHNlYXJjaGVkIGZvciBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKGtleSwgdGhpcy5fcmVnZXhTdGFydFdpdGgocHJlZml4KSwgbW9kaWZpZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBzdHJpbmcgdmFsdWVzIHRoYXQgZW5kIHdpdGggYSBwcm92aWRlZFxuICAgKiBzdHJpbmcuICBUaGlzIHdpbGwgYmUgc2xvdyBmb3IgbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4IFRoZSBzdWJzdHJpbmcgdGhhdCB0aGUgdmFsdWUgbXVzdCBlbmQgd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGlmaWVycyBUaGUgcmVndWxhciBleHByZXNzaW9uIG1vZGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZW5kc1dpdGgoa2V5LCBzdWZmaXgsIG1vZGlmaWVycykge1xuICAgIGlmICh0eXBlb2Ygc3VmZml4ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgYmVpbmcgc2VhcmNoZWQgZm9yIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hdGNoZXMoa2V5LCBxdW90ZShzdWZmaXgpICsgJyQnLCBtb2RpZmllcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwcm94aW1pdHkgYmFzZWQgY29uc3RyYWludCBmb3IgZmluZGluZyBvYmplY3RzIHdpdGgga2V5IHBvaW50XG4gICAqIHZhbHVlcyBuZWFyIHRoZSBwb2ludCBnaXZlbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIFBhcnNlLkdlb1BvaW50IGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgVGhlIHJlZmVyZW5jZSBQYXJzZS5HZW9Qb2ludCB0aGF0IGlzIHVzZWQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbmVhcihrZXksIHBvaW50KSB7XG4gICAgaWYgKCEocG9pbnQgaW5zdGFuY2VvZiBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KSkge1xuICAgICAgLy8gVHJ5IHRvIGNhc3QgaXQgYXMgYSBHZW9Qb2ludFxuICAgICAgcG9pbnQgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChwb2ludCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJG5lYXJTcGhlcmUnLCBwb2ludCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHByb3hpbWl0eSBiYXNlZCBjb25zdHJhaW50IGZvciBmaW5kaW5nIG9iamVjdHMgd2l0aCBrZXkgcG9pbnRcbiAgICogdmFsdWVzIG5lYXIgdGhlIHBvaW50IGdpdmVuIGFuZCB3aXRoaW4gdGhlIG1heGltdW0gZGlzdGFuY2UgZ2l2ZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBQYXJzZS5HZW9Qb2ludCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50IFRoZSByZWZlcmVuY2UgUGFyc2UuR2VvUG9pbnQgdGhhdCBpcyB1c2VkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4RGlzdGFuY2UgTWF4aW11bSBkaXN0YW5jZSAoaW4gcmFkaWFucykgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc29ydGVkIEEgQm9vbCB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgcmVzdWx0cyBzaG91bGQgYmVcbiAgICogc29ydGVkIGJ5IGRpc3RhbmNlIGFzY2VuZGluZywgZmFsc2UgaXMgbm8gc29ydGluZyBpcyByZXF1aXJlZCxcbiAgICogZGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3aXRoaW5SYWRpYW5zKGtleSwgcG9pbnQsIG1heERpc3RhbmNlLCBzb3J0ZWQpIHtcbiAgICBpZiAoc29ydGVkIHx8IHNvcnRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm5lYXIoa2V5LCBwb2ludCk7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRtYXhEaXN0YW5jZScsIG1heERpc3RhbmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZ2VvV2l0aGluJywge1xuICAgICAgICAkY2VudGVyU3BoZXJlOiBbW3BvaW50LmxvbmdpdHVkZSwgcG9pbnQubGF0aXR1ZGVdLCBtYXhEaXN0YW5jZV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcHJveGltaXR5IGJhc2VkIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgb2JqZWN0cyB3aXRoIGtleSBwb2ludFxuICAgKiB2YWx1ZXMgbmVhciB0aGUgcG9pbnQgZ2l2ZW4gYW5kIHdpdGhpbiB0aGUgbWF4aW11bSBkaXN0YW5jZSBnaXZlbi5cbiAgICogUmFkaXVzIG9mIGVhcnRoIHVzZWQgaXMgMzk1OC44IG1pbGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgUGFyc2UuR2VvUG9pbnQgaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCBUaGUgcmVmZXJlbmNlIFBhcnNlLkdlb1BvaW50IHRoYXQgaXMgdXNlZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heERpc3RhbmNlIE1heGltdW0gZGlzdGFuY2UgKGluIG1pbGVzKSBvZiByZXN1bHRzIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHtib29sZWFufSBzb3J0ZWQgQSBCb29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiByZXN1bHRzIHNob3VsZCBiZVxuICAgKiBzb3J0ZWQgYnkgZGlzdGFuY2UgYXNjZW5kaW5nLCBmYWxzZSBpcyBubyBzb3J0aW5nIGlzIHJlcXVpcmVkLFxuICAgKiBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhpbk1pbGVzKGtleSwgcG9pbnQsIG1heERpc3RhbmNlLCBzb3J0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy53aXRoaW5SYWRpYW5zKGtleSwgcG9pbnQsIG1heERpc3RhbmNlIC8gMzk1OC44LCBzb3J0ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwcm94aW1pdHkgYmFzZWQgY29uc3RyYWludCBmb3IgZmluZGluZyBvYmplY3RzIHdpdGgga2V5IHBvaW50XG4gICAqIHZhbHVlcyBuZWFyIHRoZSBwb2ludCBnaXZlbiBhbmQgd2l0aGluIHRoZSBtYXhpbXVtIGRpc3RhbmNlIGdpdmVuLlxuICAgKiBSYWRpdXMgb2YgZWFydGggdXNlZCBpcyA2MzcxLjAga2lsb21ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIFBhcnNlLkdlb1BvaW50IGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgVGhlIHJlZmVyZW5jZSBQYXJzZS5HZW9Qb2ludCB0aGF0IGlzIHVzZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhEaXN0YW5jZSBNYXhpbXVtIGRpc3RhbmNlIChpbiBraWxvbWV0ZXJzKSBvZiByZXN1bHRzIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHtib29sZWFufSBzb3J0ZWQgQSBCb29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiByZXN1bHRzIHNob3VsZCBiZVxuICAgKiBzb3J0ZWQgYnkgZGlzdGFuY2UgYXNjZW5kaW5nLCBmYWxzZSBpcyBubyBzb3J0aW5nIGlzIHJlcXVpcmVkLFxuICAgKiBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhpbktpbG9tZXRlcnMoa2V5LCBwb2ludCwgbWF4RGlzdGFuY2UsIHNvcnRlZCkge1xuICAgIHJldHVybiB0aGlzLndpdGhpblJhZGlhbnMoa2V5LCBwb2ludCwgbWF4RGlzdGFuY2UgLyA2MzcxLjAsIHNvcnRlZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzXG4gICAqIGNvb3JkaW5hdGVzIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBnaXZlbiByZWN0YW5ndWxhciBnZW9ncmFwaGljIGJvdW5kaW5nXG4gICAqIGJveC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGJlIGNvbnN0cmFpbmVkLlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBzb3V0aHdlc3RcbiAgICogICAgIFRoZSBsb3dlci1sZWZ0IGluY2x1c2l2ZSBjb3JuZXIgb2YgdGhlIGJveC5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gbm9ydGhlYXN0XG4gICAqICAgICBUaGUgdXBwZXItcmlnaHQgaW5jbHVzaXZlIGNvcm5lciBvZiB0aGUgYm94LlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhpbkdlb0JveChrZXksIHNvdXRod2VzdCwgbm9ydGhlYXN0KSB7XG4gICAgaWYgKCEoc291dGh3ZXN0IGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCkpIHtcbiAgICAgIHNvdXRod2VzdCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KHNvdXRod2VzdCk7XG4gICAgfVxuICAgIGlmICghKG5vcnRoZWFzdCBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQpKSB7XG4gICAgICBub3J0aGVhc3QgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChub3J0aGVhc3QpO1xuICAgIH1cbiAgICB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJHdpdGhpbicsIHtcbiAgICAgICRib3g6IFtzb3V0aHdlc3QsIG5vcnRoZWFzdF1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3NcbiAgICogY29vcmRpbmF0ZXMgYmUgY29udGFpbmVkIHdpdGhpbiBhbmQgb24gdGhlIGJvdW5kcyBvZiBhIGdpdmVuIHBvbHlnb24uXG4gICAqIFN1cHBvcnRzIGNsb3NlZCBhbmQgb3BlbiAobGFzdCBwb2ludCBpcyBjb25uZWN0ZWQgdG8gZmlyc3QpIHBhdGhzXG4gICAqXG4gICAqIFBvbHlnb24gbXVzdCBoYXZlIGF0IGxlYXN0IDMgcG9pbnRzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBiZSBjb25zdHJhaW5lZC5cbiAgICogQHBhcmFtIHtBcnJheX0gcG9pbnRzIEFycmF5IG9mIENvb3JkaW5hdGVzIC8gR2VvUG9pbnRzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aGluUG9seWdvbihrZXksIHBvaW50cykge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGdlb1dpdGhpbicsIHtcbiAgICAgICRwb2x5Z29uOiBwb2ludHNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXknc1xuICAgKiBjb29yZGluYXRlcyB0aGF0IGNvbnRhaW5zIGEgUGFyc2VHZW9Qb2ludFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gYmUgY29uc3RyYWluZWQuXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50XG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgcG9seWdvbkNvbnRhaW5zKGtleSwgcG9pbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRnZW9JbnRlcnNlY3RzJywge1xuICAgICAgJHBvaW50OiBwb2ludFxuICAgIH0pO1xuICB9XG5cbiAgLyogUXVlcnkgT3JkZXJpbmdzICovXG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSByZXN1bHRzIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBrZXlzIFRoZSBrZXkgdG8gb3JkZXIgYnksIHdoaWNoIGlzIGFcbiAgICogc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMsIG9yIGFuIEFycmF5IG9mIGtleXMsIG9yIG11bHRpcGxlIGtleXMuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYXNjZW5kaW5nKCkge1xuICAgIHRoaXMuX29yZGVyID0gW107XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBrZXlzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZGRBc2NlbmRpbmcuYXBwbHkodGhpcywga2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIHJlc3VsdHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBnaXZlbiBrZXksXG4gICAqIGJ1dCBjYW4gYWxzbyBhZGQgc2Vjb25kYXJ5IHNvcnQgZGVzY3JpcHRvcnMgd2l0aG91dCBvdmVyd3JpdGluZyBfb3JkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IGtleXMgVGhlIGtleSB0byBvcmRlciBieSwgd2hpY2ggaXMgYVxuICAgKiBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcywgb3IgYW4gQXJyYXkgb2Yga2V5cywgb3IgbXVsdGlwbGUga2V5cy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRBc2NlbmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLl9vcmRlcikge1xuICAgICAgdGhpcy5fb3JkZXIgPSBbXTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBrZXlzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICB2YXIgX2NvbnRleHQ2O1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgIGtleSA9IGtleS5qb2luKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9vcmRlciA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0NiA9IHRoaXMuX29yZGVyKS5jYWxsKF9jb250ZXh0Niwga2V5LnJlcGxhY2UoL1xccy9nLCAnJykuc3BsaXQoJywnKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBrZXlzIFRoZSBrZXkgdG8gb3JkZXIgYnksIHdoaWNoIGlzIGFcbiAgICogc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMsIG9yIGFuIEFycmF5IG9mIGtleXMsIG9yIG11bHRpcGxlIGtleXMuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZGVzY2VuZGluZygpIHtcbiAgICB0aGlzLl9vcmRlciA9IFtdO1xuICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAga2V5c1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZGREZXNjZW5kaW5nLmFwcGx5KHRoaXMsIGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGdpdmVuIGtleSxcbiAgICogYnV0IGNhbiBhbHNvIGFkZCBzZWNvbmRhcnkgc29ydCBkZXNjcmlwdG9ycyB3aXRob3V0IG92ZXJ3cml0aW5nIF9vcmRlci5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0ga2V5cyBUaGUga2V5IHRvIG9yZGVyIGJ5LCB3aGljaCBpcyBhXG4gICAqIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzLCBvciBhbiBBcnJheSBvZiBrZXlzLCBvciBtdWx0aXBsZSBrZXlzLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZERlc2NlbmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLl9vcmRlcikge1xuICAgICAgdGhpcy5fb3JkZXIgPSBbXTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICBrZXlzW19rZXk0XSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICB2YXIgX2NvbnRleHQ3LCBfY29udGV4dDg7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAga2V5ID0ga2V5LmpvaW4oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29yZGVyID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQ3ID0gdGhpcy5fb3JkZXIpLmNhbGwoX2NvbnRleHQ3LCAoMCwgX21hcC5kZWZhdWx0KShfY29udGV4dDggPSBrZXkucmVwbGFjZSgvXFxzL2csICcnKS5zcGxpdCgnLCcpKS5jYWxsKF9jb250ZXh0OCwgayA9PiB7XG4gICAgICAgIHJldHVybiAnLScgKyBrO1xuICAgICAgfSkpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyogUXVlcnkgT3B0aW9ucyAqL1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgYW55IHJlc3VsdHMuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBwYWdpbmF0aW9uLlxuICAgKiBEZWZhdWx0IGlzIHRvIHNraXAgemVybyByZXN1bHRzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbiB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgdG8gc2tpcC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBza2lwKG4pIHtcbiAgICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW4gb25seSBza2lwIGJ5IGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gICAgfVxuICAgIHRoaXMuX3NraXAgPSBuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGxpbWl0IG9mIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4uIFRoZSBkZWZhdWx0IGxpbWl0IGlzIDEwMC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gdGhlIG51bWJlciBvZiByZXN1bHRzIHRvIGxpbWl0IHRvLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGxpbWl0KG4pIHtcbiAgICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW4gb25seSBzZXQgdGhlIGxpbWl0IHRvIGEgbnVtZXJpYyB2YWx1ZScpO1xuICAgIH1cbiAgICB0aGlzLl9saW1pdCA9IG47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZmxhZyB0byBpbmNsdWRlIHdpdGggcmVzcG9uc2UgdGhlIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIHNhdGlzZnlpbmcgdGhpcyBxdWVyeSxcbiAgICogZGVzcGl0ZSBsaW1pdHMvc2tpcC4gTWlnaHQgYmUgdXNlZnVsIGZvciBwYWdpbmF0aW9uLlxuICAgKiBOb3RlIHRoYXQgcmVzdWx0IG9mIHRoaXMgcXVlcnkgd2lsbCBiZSB3cmFwcGVkIGFzIGFuIG9iamVjdCB3aXRoXG4gICAqIGByZXN1bHRzYDogaG9sZGluZyB7UGFyc2VPYmplY3R9IGFycmF5IGFuZCBgY291bnRgOiBpbnRlZ2VyIGhvbGRpbmcgdG90YWwgbnVtYmVyXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUNvdW50IGZhbHNlIC0gZGlzYWJsZSwgdHJ1ZSAtIGVuYWJsZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3aXRoQ291bnQoKSB7XG4gICAgbGV0IGluY2x1ZGVDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGluY2x1ZGVDb3VudCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW4gb25seSBzZXQgd2l0aENvdW50IHRvIGEgYm9vbGVhbiB2YWx1ZScpO1xuICAgIH1cbiAgICB0aGlzLl9jb3VudCA9IGluY2x1ZGVDb3VudDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogSW5jbHVkZXMgbmVzdGVkIFBhcnNlLk9iamVjdHMgZm9yIHRoZSBwcm92aWRlZCBrZXkuICBZb3UgY2FuIHVzZSBkb3RcbiAgICogbm90YXRpb24gdG8gc3BlY2lmeSB3aGljaCBmaWVsZHMgaW4gdGhlIGluY2x1ZGVkIG9iamVjdCBhcmUgYWxzbyBmZXRjaGVkLlxuICAgKlxuICAgKiBZb3UgY2FuIGluY2x1ZGUgYWxsIG5lc3RlZCBQYXJzZS5PYmplY3RzIGJ5IHBhc3NpbmcgaW4gJyonLlxuICAgKiBSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgMy4wLjArXG4gICAqIDxwcmU+cXVlcnkuaW5jbHVkZSgnKicpOzwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0gey4uLnN0cmluZ3xBcnJheTxzdHJpbmc+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBpbmNsdWRlKCkge1xuICAgIGZvciAodmFyIF9sZW41ID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuNSksIF9rZXk1ID0gMDsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuICAgICAga2V5c1tfa2V5NV0gPSBhcmd1bWVudHNbX2tleTVdO1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDk7XG4gICAgICAgIHRoaXMuX2luY2x1ZGUgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDkgPSB0aGlzLl9pbmNsdWRlKS5jYWxsKF9jb250ZXh0OSwga2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2luY2x1ZGUucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluY2x1ZGVzIGFsbCBuZXN0ZWQgUGFyc2UuT2JqZWN0cyBvbmUgbGV2ZWwgZGVlcC5cbiAgICpcbiAgICogUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuMC4wK1xuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGluY2x1ZGVBbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5jbHVkZSgnKicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyaWN0cyB0aGUgZmllbGRzIG9mIHRoZSByZXR1cm5lZCBQYXJzZS5PYmplY3RzIHRvIGluY2x1ZGUgb25seSB0aGVcbiAgICogcHJvdmlkZWQga2V5cy4gIElmIHRoaXMgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCB0aGVuIGFsbCBvZiB0aGUga2V5c1xuICAgKiBzcGVjaWZpZWQgaW4gZWFjaCBvZiB0aGUgY2FsbHMgd2lsbCBiZSBpbmNsdWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5zdHJpbmd8QXJyYXk8c3RyaW5nPn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgc2VsZWN0KCkge1xuICAgIGlmICghdGhpcy5fc2VsZWN0KSB7XG4gICAgICB0aGlzLl9zZWxlY3QgPSBbXTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW42KSwgX2tleTYgPSAwOyBfa2V5NiA8IF9sZW42OyBfa2V5NisrKSB7XG4gICAgICBrZXlzW19rZXk2XSA9IGFyZ3VtZW50c1tfa2V5Nl07XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0MTA7XG4gICAgICAgIHRoaXMuX3NlbGVjdCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0MTAgPSB0aGlzLl9zZWxlY3QpLmNhbGwoX2NvbnRleHQxMCwga2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVzdHJpY3RzIHRoZSBmaWVsZHMgb2YgdGhlIHJldHVybmVkIFBhcnNlLk9iamVjdHMgdG8gYWxsIGtleXMgZXhjZXB0IHRoZVxuICAgKiBwcm92aWRlZCBrZXlzLiBFeGNsdWRlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBzZWxlY3QgYW5kIGluY2x1ZGUuXG4gICAqXG4gICAqIFJlcXVpcmVzIFBhcnNlIFNlcnZlciAzLjYuMCtcbiAgICpcbiAgICogQHBhcmFtIHsuLi5zdHJpbmd8QXJyYXk8c3RyaW5nPn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGV4Y2x1ZGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZXhjbHVkZSgpIHtcbiAgICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjcpLCBfa2V5NyA9IDA7IF9rZXk3IDwgX2xlbjc7IF9rZXk3KyspIHtcbiAgICAgIGtleXNbX2tleTddID0gYXJndW1lbnRzW19rZXk3XTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICB2YXIgX2NvbnRleHQxMTtcbiAgICAgICAgdGhpcy5fZXhjbHVkZSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0MTEgPSB0aGlzLl9leGNsdWRlKS5jYWxsKF9jb250ZXh0MTEsIGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9leGNsdWRlLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0cmljdHMgbGl2ZSBxdWVyeSB0byB0cmlnZ2VyIG9ubHkgZm9yIHdhdGNoZWQgZmllbGRzLlxuICAgKlxuICAgKiBSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgNi4wLjArXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nfEFycmF5PHN0cmluZz59IGtleXMgVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byB3YXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3YXRjaCgpIHtcbiAgICBmb3IgKHZhciBfbGVuOCA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjgpLCBfa2V5OCA9IDA7IF9rZXk4IDwgX2xlbjg7IF9rZXk4KyspIHtcbiAgICAgIGtleXNbX2tleThdID0gYXJndW1lbnRzW19rZXk4XTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICB2YXIgX2NvbnRleHQxMjtcbiAgICAgICAgdGhpcy5fd2F0Y2ggPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDEyID0gdGhpcy5fd2F0Y2gpLmNhbGwoX2NvbnRleHQxMiwga2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3dhdGNoLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRoZSByZWFkIHByZWZlcmVuY2UgdGhhdCB0aGUgYmFja2VuZCB3aWxsIHVzZSB3aGVuIHBlcmZvcm1pbmcgdGhlIHF1ZXJ5IHRvIHRoZSBkYXRhYmFzZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYWRQcmVmZXJlbmNlIFRoZSByZWFkIHByZWZlcmVuY2UgZm9yIHRoZSBtYWluIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5jbHVkZVJlYWRQcmVmZXJlbmNlIFRoZSByZWFkIHByZWZlcmVuY2UgZm9yIHRoZSBxdWVyaWVzIHRvIGluY2x1ZGUgcG9pbnRlcnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlIFRoZSByZWFkIHByZWZlcmVuY2UgZm9yIHRoZSBzdWIgcXVlcmllcy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICByZWFkUHJlZmVyZW5jZShyZWFkUHJlZmVyZW5jZSwgaW5jbHVkZVJlYWRQcmVmZXJlbmNlLCBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgdGhpcy5fcmVhZFByZWZlcmVuY2UgPSByZWFkUHJlZmVyZW5jZTtcbiAgICB0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSBpbmNsdWRlUmVhZFByZWZlcmVuY2UgfHwgbnVsbDtcbiAgICB0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gc3VicXVlcnlSZWFkUHJlZmVyZW5jZSB8fCBudWxsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0aGlzIHF1ZXJ5IHRvIGdldCBsaXZlUXVlcnkgdXBkYXRlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblRva2VuIChvcHRpb25hbCkgRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnRVc2VyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExpdmVRdWVyeVN1YnNjcmlwdGlvbj59IFJldHVybnMgdGhlIGxpdmVRdWVyeVN1YnNjcmlwdGlvbiwgaXQncyBhbiBldmVudCBlbWl0dGVyXG4gICAqIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGdldCBsaXZlUXVlcnkgdXBkYXRlcy5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZShzZXNzaW9uVG9rZW4pIHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCkuY3VycmVudFVzZXJBc3luYygpO1xuICAgIGlmICghc2Vzc2lvblRva2VuKSB7XG4gICAgICBzZXNzaW9uVG9rZW4gPSBjdXJyZW50VXNlciA/IGN1cnJlbnRVc2VyLmdldFNlc3Npb25Ub2tlbigpIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbGl2ZVF1ZXJ5Q2xpZW50ID0gYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlcigpLmdldERlZmF1bHRMaXZlUXVlcnlDbGllbnQoKTtcbiAgICBpZiAobGl2ZVF1ZXJ5Q2xpZW50LnNob3VsZE9wZW4oKSkge1xuICAgICAgbGl2ZVF1ZXJ5Q2xpZW50Lm9wZW4oKTtcbiAgICB9XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbGl2ZVF1ZXJ5Q2xpZW50LnN1YnNjcmliZSh0aGlzLCBzZXNzaW9uVG9rZW4pO1xuICAgIHJldHVybiBzdWJzY3JpcHRpb24uc3Vic2NyaWJlUHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFBhcnNlLlF1ZXJ5IHRoYXQgaXMgdGhlIE9SIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy4gIEZvclxuICAgKiBleGFtcGxlOlxuICAgKiA8cHJlPnZhciBjb21wb3VuZFF1ZXJ5ID0gUGFyc2UuUXVlcnkub3IocXVlcnkxLCBxdWVyeTIsIHF1ZXJ5Myk7PC9wcmU+XG4gICAqXG4gICAqIHdpbGwgY3JlYXRlIGEgY29tcG91bmRRdWVyeSB0aGF0IGlzIGFuIG9yIG9mIHRoZSBxdWVyeTEsIHF1ZXJ5MiwgYW5kXG4gICAqIHF1ZXJ5My5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QYXJzZS5RdWVyeX0gcXVlcmllcyBUaGUgbGlzdCBvZiBxdWVyaWVzIHRvIE9SLlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gVGhlIHF1ZXJ5IHRoYXQgaXMgdGhlIE9SIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy5cbiAgICovXG4gIHN0YXRpYyBvcigpIHtcbiAgICBmb3IgKHZhciBfbGVuOSA9IGFyZ3VtZW50cy5sZW5ndGgsIHF1ZXJpZXMgPSBuZXcgQXJyYXkoX2xlbjkpLCBfa2V5OSA9IDA7IF9rZXk5IDwgX2xlbjk7IF9rZXk5KyspIHtcbiAgICAgIHF1ZXJpZXNbX2tleTldID0gYXJndW1lbnRzW19rZXk5XTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NOYW1lID0gX2dldENsYXNzTmFtZUZyb21RdWVyaWVzKHF1ZXJpZXMpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkoY2xhc3NOYW1lKTtcbiAgICBxdWVyeS5fb3JRdWVyeShxdWVyaWVzKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFBhcnNlLlF1ZXJ5IHRoYXQgaXMgdGhlIEFORCBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMuICBGb3JcbiAgICogZXhhbXBsZTpcbiAgICogPHByZT52YXIgY29tcG91bmRRdWVyeSA9IFBhcnNlLlF1ZXJ5LmFuZChxdWVyeTEsIHF1ZXJ5MiwgcXVlcnkzKTs8L3ByZT5cbiAgICpcbiAgICogd2lsbCBjcmVhdGUgYSBjb21wb3VuZFF1ZXJ5IHRoYXQgaXMgYW4gYW5kIG9mIHRoZSBxdWVyeTEsIHF1ZXJ5MiwgYW5kXG4gICAqIHF1ZXJ5My5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QYXJzZS5RdWVyeX0gcXVlcmllcyBUaGUgbGlzdCBvZiBxdWVyaWVzIHRvIEFORC5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFRoZSBxdWVyeSB0aGF0IGlzIHRoZSBBTkQgb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzLlxuICAgKi9cbiAgc3RhdGljIGFuZCgpIHtcbiAgICBmb3IgKHZhciBfbGVuMTAgPSBhcmd1bWVudHMubGVuZ3RoLCBxdWVyaWVzID0gbmV3IEFycmF5KF9sZW4xMCksIF9rZXkxMCA9IDA7IF9rZXkxMCA8IF9sZW4xMDsgX2tleTEwKyspIHtcbiAgICAgIHF1ZXJpZXNbX2tleTEwXSA9IGFyZ3VtZW50c1tfa2V5MTBdO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBfZ2V0Q2xhc3NOYW1lRnJvbVF1ZXJpZXMocXVlcmllcyk7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShjbGFzc05hbWUpO1xuICAgIHF1ZXJ5Ll9hbmRRdWVyeShxdWVyaWVzKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFBhcnNlLlF1ZXJ5IHRoYXQgaXMgdGhlIE5PUiBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMuICBGb3JcbiAgICogZXhhbXBsZTpcbiAgICogPHByZT5jb25zdCBjb21wb3VuZFF1ZXJ5ID0gUGFyc2UuUXVlcnkubm9yKHF1ZXJ5MSwgcXVlcnkyLCBxdWVyeTMpOzwvcHJlPlxuICAgKlxuICAgKiB3aWxsIGNyZWF0ZSBhIGNvbXBvdW5kUXVlcnkgdGhhdCBpcyBhIG5vciBvZiB0aGUgcXVlcnkxLCBxdWVyeTIsIGFuZFxuICAgKiBxdWVyeTMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGFyc2UuUXVlcnl9IHF1ZXJpZXMgVGhlIGxpc3Qgb2YgcXVlcmllcyB0byBOT1IuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBUaGUgcXVlcnkgdGhhdCBpcyB0aGUgTk9SIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy5cbiAgICovXG4gIHN0YXRpYyBub3IoKSB7XG4gICAgZm9yICh2YXIgX2xlbjExID0gYXJndW1lbnRzLmxlbmd0aCwgcXVlcmllcyA9IG5ldyBBcnJheShfbGVuMTEpLCBfa2V5MTEgPSAwOyBfa2V5MTEgPCBfbGVuMTE7IF9rZXkxMSsrKSB7XG4gICAgICBxdWVyaWVzW19rZXkxMV0gPSBhcmd1bWVudHNbX2tleTExXTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NOYW1lID0gX2dldENsYXNzTmFtZUZyb21RdWVyaWVzKHF1ZXJpZXMpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkoY2xhc3NOYW1lKTtcbiAgICBxdWVyeS5fbm9yUXVlcnkocXVlcmllcyk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgc291cmNlIG9mIHRoaXMgcXVlcnkgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBmcm9tTmV0d29yaygpIHtcbiAgICB0aGlzLl9xdWVyaWVzTG9jYWxEYXRhc3RvcmUgPSBmYWxzZTtcbiAgICB0aGlzLl9sb2NhbERhdGFzdG9yZVBpbk5hbWUgPSBudWxsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHNvdXJjZSBvZiB0aGlzIHF1ZXJ5IHRvIGFsbCBwaW5uZWQgb2JqZWN0cy5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBmcm9tTG9jYWxEYXRhc3RvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbVBpbldpdGhOYW1lKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHNvdXJjZSBvZiB0aGlzIHF1ZXJ5IHRvIHRoZSBkZWZhdWx0IGdyb3VwIG9mIHBpbm5lZCBvYmplY3RzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGZyb21QaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbVBpbldpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRoZSBzb3VyY2Ugb2YgdGhpcyBxdWVyeSB0byBhIHNwZWNpZmljIGdyb3VwIG9mIHBpbm5lZCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiBxdWVyeSBzb3VyY2UuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZnJvbVBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKGxvY2FsRGF0YXN0b3JlLmNoZWNrSWZFbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuX3F1ZXJpZXNMb2NhbERhdGFzdG9yZSA9IHRydWU7XG4gICAgICB0aGlzLl9sb2NhbERhdGFzdG9yZVBpbk5hbWUgPSBuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSBjdXJyZW50IG5ldHdvcmsgcmVxdWVzdCAoaWYgYW55IGlzIHJ1bm5pbmcpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICBpZiAodGhpcy5feGhyUmVxdWVzdC50YXNrICYmIHR5cGVvZiB0aGlzLl94aHJSZXF1ZXN0LnRhc2suYWJvcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX3hoclJlcXVlc3QudGFzay5fYWJvcnRlZCA9IHRydWU7XG4gICAgICB0aGlzLl94aHJSZXF1ZXN0LnRhc2suYWJvcnQoKTtcbiAgICAgIHRoaXMuX3hoclJlcXVlc3QudGFzayA9IG51bGw7XG4gICAgICB0aGlzLl94aHJSZXF1ZXN0Lm9uY2hhbmdlID0gKCkgPT4ge307XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5feGhyUmVxdWVzdC5vbmNoYW5nZSA9ICgpID0+IHRoaXMuY2FuY2VsKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgX3NldFJlcXVlc3RUYXNrKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnJlcXVlc3RUYXNrID0gdGFzayA9PiB7XG4gICAgICB0aGlzLl94aHJSZXF1ZXN0LnRhc2sgPSB0YXNrO1xuICAgICAgdGhpcy5feGhyUmVxdWVzdC5vbmNoYW5nZSgpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIGNvbW1lbnQgdG8gdGhlIHF1ZXJ5IHNvIHRoYXQgdGhlIHF1ZXJ5XG4gICAqIGNhbiBiZSBpZGVudGlmaWVkIHdoZW4gdXNpbmcgYSB0aGUgcHJvZmlsZXIgZm9yIE1vbmdvREIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBhIGNvbW1lbnQgY2FuIG1ha2UgeW91ciBwcm9maWxlIGRhdGEgZWFzaWVyIHRvIGludGVycHJldCBhbmQgdHJhY2UuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY29tbWVudCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBkZWxldGUgdGhpcy5fY29tbWVudDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgb2YgYSBjb21tZW50IHRvIGJlIHNlbnQgd2l0aCB0aGlzIHF1ZXJ5IG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHRoaXMuX2NvbW1lbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGZpbmQoY2xhc3NOYW1lLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdjbGFzc2VzLycgKyBjbGFzc05hbWUsIHBhcmFtcywgb3B0aW9ucyk7XG4gIH0sXG4gIGFnZ3JlZ2F0ZShjbGFzc05hbWUsIHBhcmFtcywgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2FnZ3JlZ2F0ZS8nICsgY2xhc3NOYW1lLCBwYXJhbXMsIG9wdGlvbnMpO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UGFyc2VRdWVyeShQYXJzZVF1ZXJ5KTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFF1ZXJ5Q29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVF1ZXJ5OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBSZWxhdGlvbiBmb3IgdGhlIGdpdmVuIHBhcmVudCBvYmplY3QgYW5kIGtleS4gVGhpc1xuICogY29uc3RydWN0b3Igc2hvdWxkIHJhcmVseSBiZSB1c2VkIGRpcmVjdGx5LCBidXQgcmF0aGVyIGNyZWF0ZWQgYnlcbiAqIFBhcnNlLk9iamVjdC5yZWxhdGlvbi5cbiAqXG4gKiA8cD5cbiAqIEEgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGFjY2VzcyBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIGEgbWFueS10by1tYW55XG4gKiByZWxhdGlvbnNoaXAuICBFYWNoIGluc3RhbmNlIG9mIFBhcnNlLlJlbGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhXG4gKiBwYXJ0aWN1bGFyIHBhcmVudCBvYmplY3QgYW5kIGtleS5cbiAqIDwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuUmVsYXRpb25cbiAqL1xuY2xhc3MgUGFyc2VSZWxhdGlvbiB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcnNlLk9iamVjdH0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhpcyByZWxhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IGZvciB0aGlzIHJlbGF0aW9uIG9uIHRoZSBwYXJlbnQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQsIGtleSkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicGFyZW50XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJrZXlcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInRhcmdldENsYXNzTmFtZVwiLCB2b2lkIDApO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMudGFyZ2V0Q2xhc3NOYW1lID0gbnVsbDtcbiAgfVxuXG4gIC8qXG4gICAqIE1ha2VzIHN1cmUgdGhhdCB0aGlzIHJlbGF0aW9uIGhhcyB0aGUgcmlnaHQgcGFyZW50IGFuZCBrZXkuXG4gICAqL1xuICBfZW5zdXJlUGFyZW50QW5kS2V5KHBhcmVudCwga2V5KSB7XG4gICAgdGhpcy5rZXkgPSB0aGlzLmtleSB8fCBrZXk7XG4gICAgaWYgKHRoaXMua2V5ICE9PSBrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgRXJyb3IuIFJlbGF0aW9uIHJldHJpZXZlZCBmcm9tIHR3byBkaWZmZXJlbnQga2V5cy4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQuY2xhc3NOYW1lICE9PSBwYXJlbnQuY2xhc3NOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgRXJyb3IuIFJlbGF0aW9uIHJldHJpZXZlZCBmcm9tIHR3byBkaWZmZXJlbnQgT2JqZWN0cy4nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBhcmVudC5pZCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQuaWQgIT09IHBhcmVudC5pZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgRXJyb3IuIFJlbGF0aW9uIHJldHJpZXZlZCBmcm9tIHR3byBkaWZmZXJlbnQgT2JqZWN0cy4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJlbnQuaWQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgUGFyc2UuT2JqZWN0IG9yIGFuIGFycmF5IG9mIFBhcnNlLk9iamVjdHMgdG8gdGhlIHJlbGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geyhQYXJzZS5PYmplY3R8QXJyYXkpfSBvYmplY3RzIFRoZSBpdGVtIG9yIGl0ZW1zIHRvIGFkZC5cbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gVGhlIHBhcmVudCBvZiB0aGUgcmVsYXRpb24uXG4gICAqL1xuICBhZGQob2JqZWN0cykge1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9iamVjdHMpKSB7XG4gICAgICBvYmplY3RzID0gW29iamVjdHNdO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBSZWxhdGlvbk9wXG4gICAgfSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT3AoKTtcbiAgICBjb25zdCBjaGFuZ2UgPSBuZXcgUmVsYXRpb25PcChvYmplY3RzLCBbXSk7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCB0byBhIFJlbGF0aW9uIHdpdGhvdXQgYSBwYXJlbnQnKTtcbiAgICB9XG4gICAgaWYgKG9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgICBwYXJlbnQuc2V0KHRoaXMua2V5LCBjaGFuZ2UpO1xuICAgIHRoaXMudGFyZ2V0Q2xhc3NOYW1lID0gY2hhbmdlLl90YXJnZXRDbGFzc05hbWU7XG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgUGFyc2UuT2JqZWN0IG9yIGFuIGFycmF5IG9mIFBhcnNlLk9iamVjdHMgZnJvbSB0aGlzIHJlbGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geyhQYXJzZS5PYmplY3R8QXJyYXkpfSBvYmplY3RzIFRoZSBpdGVtIG9yIGl0ZW1zIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZShvYmplY3RzKSB7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqZWN0cykpIHtcbiAgICAgIG9iamVjdHMgPSBbb2JqZWN0c107XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIFJlbGF0aW9uT3BcbiAgICB9ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPcCgpO1xuICAgIGNvbnN0IGNoYW5nZSA9IG5ldyBSZWxhdGlvbk9wKFtdLCBvYmplY3RzKTtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZW1vdmUgZnJvbSBhIFJlbGF0aW9uIHdpdGhvdXQgYSBwYXJlbnQnKTtcbiAgICB9XG4gICAgaWYgKG9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50LnNldCh0aGlzLmtleSwgY2hhbmdlKTtcbiAgICB0aGlzLnRhcmdldENsYXNzTmFtZSA9IGNoYW5nZS5fdGFyZ2V0Q2xhc3NOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OIHZlcnNpb24gb2YgdGhlIG9iamVjdCBzdWl0YWJsZSBmb3Igc2F2aW5nIHRvIGRpc2suXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IEpTT04gcmVwcmVzZW50YXRpb24gb2YgUmVsYXRpb25cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnUmVsYXRpb24nLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLnRhcmdldENsYXNzTmFtZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFBhcnNlLlF1ZXJ5IHRoYXQgaXMgbGltaXRlZCB0byBvYmplY3RzIGluIHRoaXNcbiAgICogcmVsYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmVsYXRpb24gUXVlcnlcbiAgICovXG4gIHF1ZXJ5KCkge1xuICAgIGxldCBxdWVyeTtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29uc3RydWN0IGEgcXVlcnkgZm9yIGEgUmVsYXRpb24gd2l0aG91dCBhIHBhcmVudCcpO1xuICAgIH1cbiAgICBjb25zdCBQYXJzZVF1ZXJ5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VRdWVyeSgpO1xuICAgIGlmICghdGhpcy50YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgIHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkocGFyZW50LmNsYXNzTmFtZSk7XG4gICAgICBxdWVyeS5fZXh0cmFPcHRpb25zLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5ID0gdGhpcy5rZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkodGhpcy50YXJnZXRDbGFzc05hbWUpO1xuICAgIH1cbiAgICBxdWVyeS5fYWRkQ29uZGl0aW9uKCckcmVsYXRlZFRvJywgJ29iamVjdCcsIHtcbiAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgY2xhc3NOYW1lOiBwYXJlbnQuY2xhc3NOYW1lLFxuICAgICAgb2JqZWN0SWQ6IHBhcmVudC5pZFxuICAgIH0pO1xuICAgIHF1ZXJ5Ll9hZGRDb25kaXRpb24oJyRyZWxhdGVkVG8nLCAna2V5JywgdGhpcy5rZXkpO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VSZWxhdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUFDTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VBQ0xcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbi8qKlxuICogUmVwcmVzZW50cyBhIFJvbGUgb24gdGhlIFBhcnNlIHNlcnZlci4gUm9sZXMgcmVwcmVzZW50IGdyb3VwaW5ncyBvZlxuICogVXNlcnMgZm9yIHRoZSBwdXJwb3NlcyBvZiBncmFudGluZyBwZXJtaXNzaW9ucyAoZS5nLiBzcGVjaWZ5aW5nIGFuIEFDTFxuICogZm9yIGFuIE9iamVjdCkuIFJvbGVzIGFyZSBzcGVjaWZpZWQgYnkgdGhlaXIgc2V0cyBvZiBjaGlsZCB1c2VycyBhbmRcbiAqIGNoaWxkIHJvbGVzLCBhbGwgb2Ygd2hpY2ggYXJlIGdyYW50ZWQgYW55IHBlcm1pc3Npb25zIHRoYXQgdGhlIHBhcmVudFxuICogcm9sZSBoYXMuXG4gKlxuICogPHA+Um9sZXMgbXVzdCBoYXZlIGEgbmFtZSAod2hpY2ggY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24gb2YgdGhlXG4gKiByb2xlKSwgYW5kIG11c3Qgc3BlY2lmeSBhbiBBQ0wuPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5Sb2xlXG4gKiBAYXVnbWVudHMgUGFyc2UuT2JqZWN0XG4gKi9cbmNsYXNzIFBhcnNlUm9sZSBleHRlbmRzIF9QYXJzZU9iamVjdC5kZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBSb2xlIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHtQYXJzZS5BQ0x9IGFjbCBUaGUgQUNMIGZvciB0aGlzIHJvbGUuIFJvbGVzIG11c3QgaGF2ZSBhbiBBQ0wuXG4gICAqIEEgUGFyc2UuUm9sZSBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgcm9sZSBwZXJzaXN0ZWQgdG8gdGhlIFBhcnNlXG4gICAqIGNsb3VkLlxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZSwgYWNsKSB7XG4gICAgc3VwZXIoJ19Sb2xlJyk7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiBhY2wgaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCkge1xuICAgICAgdGhpcy5zZXROYW1lKG5hbWUpO1xuICAgICAgdGhpcy5zZXRBQ0woYWNsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcm9sZS4gIFlvdSBjYW4gYWx0ZXJuYXRpdmVseSBjYWxsIHJvbGUuZ2V0KFwibmFtZVwiKVxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgbmFtZSBvZiB0aGUgcm9sZS5cbiAgICovXG4gIGdldE5hbWUoKSB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0KCduYW1lJyk7XG4gICAgaWYgKG5hbWUgPT0gbnVsbCB8fCB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmFtZSBmb3IgYSByb2xlLiBUaGlzIHZhbHVlIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgcm9sZSBoYXNcbiAgICogYmVlbiBzYXZlZCB0byB0aGUgc2VydmVyLCBhbmQgY2Fubm90IGJlIHNldCBvbmNlIHRoZSByb2xlIGhhcyBiZWVuXG4gICAqIHNhdmVkLlxuICAgKlxuICAgKiA8cD5cbiAgICogICBBIHJvbGUncyBuYW1lIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIF8sIC0sIGFuZFxuICAgKiAgIHNwYWNlcy5cbiAgICogPC9wPlxuICAgKlxuICAgKiA8cD5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyByb2xlLnNldChcIm5hbWVcIiwgbmFtZSk8L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSByb2xlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTdGFuZGFyZCBvcHRpb25zIG9iamVjdCB3aXRoIHN1Y2Nlc3MgYW5kIGVycm9yXG4gICAqICAgICBjYWxsYmFja3MuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3R8Ym9vbGVhbil9IHRydWUgaWYgdGhlIHNldCBzdWNjZWVkZWQuXG4gICAqL1xuICBzZXROYW1lKG5hbWUsIG9wdGlvbnMpIHtcbiAgICB0aGlzLl92YWxpZGF0ZU5hbWUobmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuc2V0KCduYW1lJywgbmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgUGFyc2UuUmVsYXRpb24gZm9yIHRoZSBQYXJzZS5Vc2VycyB0aGF0IGFyZSBkaXJlY3RcbiAgICogY2hpbGRyZW4gb2YgdGhpcyByb2xlLiBUaGVzZSB1c2VycyBhcmUgZ3JhbnRlZCBhbnkgcHJpdmlsZWdlcyB0aGF0IHRoaXNcbiAgICogcm9sZSBoYXMgYmVlbiBncmFudGVkIChlLmcuIHJlYWQgb3Igd3JpdGUgYWNjZXNzIHRocm91Z2ggQUNMcykuIFlvdSBjYW5cbiAgICogYWRkIG9yIHJlbW92ZSB1c2VycyBmcm9tIHRoZSByb2xlIHRocm91Z2ggdGhpcyByZWxhdGlvbi5cbiAgICpcbiAgICogPHA+VGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgcm9sZS5yZWxhdGlvbihcInVzZXJzXCIpPC9wPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUmVsYXRpb259IHRoZSByZWxhdGlvbiBmb3IgdGhlIHVzZXJzIGJlbG9uZ2luZyB0byB0aGlzXG4gICAqICAgICByb2xlLlxuICAgKi9cbiAgZ2V0VXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVsYXRpb24oJ3VzZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgUGFyc2UuUmVsYXRpb24gZm9yIHRoZSBQYXJzZS5Sb2xlcyB0aGF0IGFyZSBkaXJlY3RcbiAgICogY2hpbGRyZW4gb2YgdGhpcyByb2xlLiBUaGVzZSByb2xlcycgdXNlcnMgYXJlIGdyYW50ZWQgYW55IHByaXZpbGVnZXMgdGhhdFxuICAgKiB0aGlzIHJvbGUgaGFzIGJlZW4gZ3JhbnRlZCAoZS5nLiByZWFkIG9yIHdyaXRlIGFjY2VzcyB0aHJvdWdoIEFDTHMpLiBZb3VcbiAgICogY2FuIGFkZCBvciByZW1vdmUgY2hpbGQgcm9sZXMgZnJvbSB0aGlzIHJvbGUgdGhyb3VnaCB0aGlzIHJlbGF0aW9uLlxuICAgKlxuICAgKiA8cD5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyByb2xlLnJlbGF0aW9uKFwicm9sZXNcIik8L3A+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5SZWxhdGlvbn0gdGhlIHJlbGF0aW9uIGZvciB0aGUgcm9sZXMgYmVsb25naW5nIHRvIHRoaXNcbiAgICogICAgIHJvbGUuXG4gICAqL1xuICBnZXRSb2xlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGlvbigncm9sZXMnKTtcbiAgfVxuICBfdmFsaWRhdGVOYW1lKG5ld05hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5ld05hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCBcIkEgcm9sZSdzIG5hbWUgbXVzdCBiZSBhIFN0cmluZy5cIik7XG4gICAgfVxuICAgIGlmICghL15bMC05YS16QS1aXFwtXyBdKyQvLnRlc3QobmV3TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsIFwiQSByb2xlJ3MgbmFtZSBjYW4gYmUgb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBfLCBcIiArICctLCBhbmQgc3BhY2VzLicpO1xuICAgIH1cbiAgfVxuICB2YWxpZGF0ZShhdHRycywgb3B0aW9ucykge1xuICAgIGNvbnN0IGlzSW52YWxpZCA9IHN1cGVyLnZhbGlkYXRlKGF0dHJzLCBvcHRpb25zKTtcbiAgICBpZiAoaXNJbnZhbGlkKSB7XG4gICAgICByZXR1cm4gaXNJbnZhbGlkO1xuICAgIH1cbiAgICBpZiAoJ25hbWUnIGluIGF0dHJzICYmIGF0dHJzLm5hbWUgIT09IHRoaXMuZ2V0TmFtZSgpKSB7XG4gICAgICBjb25zdCBuZXdOYW1lID0gYXR0cnMubmFtZTtcbiAgICAgIGlmICh0aGlzLmlkICYmIHRoaXMuaWQgIT09IGF0dHJzLm9iamVjdElkKSB7XG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgb2JqZWN0SWQgYmVpbmcgc2V0IG1hdGNoZXMgdGhpcy5pZFxuICAgICAgICAvLyBUaGlzIGhhcHBlbnMgZHVyaW5nIGEgZmV0Y2ggLS0gdGhlIGlkIGlzIHNldCBiZWZvcmUgY2FsbGluZyBmZXRjaFxuICAgICAgICAvLyBMZXQgdGhlIG5hbWUgYmUgc2V0IGluIHRoaXMgY2FzZVxuICAgICAgICByZXR1cm4gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgXCJBIHJvbGUncyBuYW1lIGNhbiBvbmx5IGJlIHNldCBiZWZvcmUgaXQgaGFzIGJlZW4gc2F2ZWQuXCIpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVOYW1lKG5ld05hbWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQYXJzZVJvbGUoUGFyc2VSb2xlKTtcbl9QYXJzZU9iamVjdC5kZWZhdWx0LnJlZ2lzdGVyU3ViY2xhc3MoJ19Sb2xlJywgUGFyc2VSb2xlKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlUm9sZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX1BhcnNlQ0xQID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUNMUFwiKSk7XG5jb25zdCBGSUVMRF9UWVBFUyA9IFsnU3RyaW5nJywgJ051bWJlcicsICdCb29sZWFuJywgJ0J5dGVzJywgJ0RhdGUnLCAnRmlsZScsICdHZW9Qb2ludCcsICdQb2x5Z29uJywgJ0FycmF5JywgJ09iamVjdCcsICdQb2ludGVyJywgJ1JlbGF0aW9uJ107XG4vKipcbiAqIEEgUGFyc2UuU2NoZW1hIG9iamVjdCBpcyBmb3IgaGFuZGxpbmcgc2NoZW1hIGRhdGEgZnJvbSBQYXJzZS5cbiAqIDxwPkFsbCB0aGUgc2NoZW1hcyBtZXRob2RzIHJlcXVpcmUgTWFzdGVyS2V5LlxuICpcbiAqIFdoZW4gYWRkaW5nIGZpZWxkcywgeW91IG1heSBzZXQgcmVxdWlyZWQgYW5kIGRlZmF1bHQgdmFsdWVzLiAoUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuNy4wKylcbiAqXG4gKiA8cHJlPlxuICogY29uc3Qgb3B0aW9ucyA9IHsgcmVxdWlyZWQ6IHRydWUsIGRlZmF1bHRWYWx1ZTogJ2hlbGxvIHdvcmxkJyB9O1xuICogY29uc3Qgc2NoZW1hID0gbmV3IFBhcnNlLlNjaGVtYSgnTXlDbGFzcycpO1xuICogc2NoZW1hLmFkZFN0cmluZygnZmllbGQnLCBvcHRpb25zKTtcbiAqIHNjaGVtYS5hZGRJbmRleCgnaW5kZXhfbmFtZScsIHsgJ2ZpZWxkJzogMSB9KTtcbiAqIHNjaGVtYS5zYXZlKCk7XG4gKiA8L3ByZT5cbiAqIDwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuU2NoZW1hXG4gKi9cbmNsYXNzIFBhcnNlU2NoZW1hIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgUGFyc2UgQ2xhc3Mgc3RyaW5nLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY2xhc3NOYW1lKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJjbGFzc05hbWVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9maWVsZHNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9pbmRleGVzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfY2xwXCIsIHZvaWQgMCk7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoY2xhc3NOYW1lID09PSAnVXNlcicgJiYgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdQRVJGT1JNX1VTRVJfUkVXUklURScpKSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9maWVsZHMgPSB7fTtcbiAgICB0aGlzLl9pbmRleGVzID0ge307XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCB0byBnZXQgYWxsIHNjaGVtYXNcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgYWxsKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTY2hlbWFDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0KCcnKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5yZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjaGVtYSBub3QgZm91bmQuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFNjaGVtYSBmcm9tIFBhcnNlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZ2V0KCkge1xuICAgIHRoaXMuYXNzZXJ0Q2xhc3NOYW1lKCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5nZXQodGhpcy5jbGFzc05hbWUpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjaGVtYSBub3QgZm91bmQuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IFNjaGVtYSBvbiBQYXJzZVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIHNhdmUoKSB7XG4gICAgdGhpcy5hc3NlcnRDbGFzc05hbWUoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U2NoZW1hQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICBmaWVsZHM6IHRoaXMuX2ZpZWxkcyxcbiAgICAgIGluZGV4ZXM6IHRoaXMuX2luZGV4ZXMsXG4gICAgICBjbGFzc0xldmVsUGVybWlzc2lvbnM6IHRoaXMuX2NscFxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuY3JlYXRlKHRoaXMuY2xhc3NOYW1lLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIFNjaGVtYSBvbiBQYXJzZVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIHVwZGF0ZSgpIHtcbiAgICB0aGlzLmFzc2VydENsYXNzTmFtZSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTY2hlbWFDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIGZpZWxkczogdGhpcy5fZmllbGRzLFxuICAgICAgaW5kZXhlczogdGhpcy5faW5kZXhlcyxcbiAgICAgIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogdGhpcy5fY2xwXG4gICAgfTtcbiAgICB0aGlzLl9maWVsZHMgPSB7fTtcbiAgICB0aGlzLl9pbmRleGVzID0ge307XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIudXBkYXRlKHRoaXMuY2xhc3NOYW1lLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92aW5nIGEgU2NoZW1hIGZyb20gUGFyc2VcbiAgICogQ2FuIG9ubHkgYmUgdXNlZCBvbiBTY2hlbWEgd2l0aG91dCBvYmplY3RzXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZGVsZXRlKCkge1xuICAgIHRoaXMuYXNzZXJ0Q2xhc3NOYW1lKCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5kZWxldGUodGhpcy5jbGFzc05hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSBhIFNjaGVtYSAoY2xhc3MpIGluIFBhcnNlLlxuICAgKiBFWEVSQ0lTRSBDQVVUSU9OLCBydW5uaW5nIHRoaXMgd2lsbCBkZWxldGUgYWxsIG9iamVjdHMgZm9yIHRoaXMgc2NoZW1hIGFuZCBjYW5ub3QgYmUgcmV2ZXJzZWRcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBwdXJnZSgpIHtcbiAgICB0aGlzLmFzc2VydENsYXNzTmFtZSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTY2hlbWFDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIucHVyZ2UodGhpcy5jbGFzc05hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VydCBpZiBDbGFzc05hbWUgaGFzIGJlZW4gZmlsbGVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhc3NlcnRDbGFzc05hbWUoKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBzZXQgYSBDbGFzcyBOYW1lIGJlZm9yZSBtYWtpbmcgYW55IHJlcXVlc3QuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgQ2xhc3MgTGV2ZWwgUGVybWlzc2lvbnMgd2hlbiBjcmVhdGluZyAvIHVwZGF0aW5nIGEgU2NoZW1hLlxuICAgKiBFWEVSQ0lTRSBDQVVUSU9OLCBydW5uaW5nIHRoaXMgbWF5IG92ZXJyaWRlIENMUCBmb3IgdGhpcyBzY2hlbWEgYW5kIGNhbm5vdCBiZSByZXZlcnNlZFxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdCB8IFBhcnNlLkNMUH0gY2xwIENsYXNzIExldmVsIFBlcm1pc3Npb25zXG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBzZXRDTFAoY2xwKSB7XG4gICAgaWYgKGNscCBpbnN0YW5jZW9mIF9QYXJzZUNMUC5kZWZhdWx0KSB7XG4gICAgICB0aGlzLl9jbHAgPSBjbHAudG9KU09OKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NscCA9IGNscDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIGEgRmllbGQgdG8gQ3JlYXRlIC8gVXBkYXRlIGEgU2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIENhbiBiZSBhIChTdHJpbmd8TnVtYmVyfEJvb2xlYW58RGF0ZXxQYXJzZS5GaWxlfFBhcnNlLkdlb1BvaW50fEFycmF5fE9iamVjdHxQb2ludGVyfFBhcnNlLlJlbGF0aW9uKVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnJlcXVpcmVkOiBJZiBmaWVsZCBpcyBub3Qgc2V0LCBzYXZlIG9wZXJhdGlvbiBmYWlscyAoUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuNy4wKylcbiAgICogICA8bGk+ZGVmYXVsdFZhbHVlOiBJZiBmaWVsZCBpcyBub3Qgc2V0LCBhIGRlZmF1bHQgdmFsdWUgaXMgc2VsZWN0ZWQgKFJlcXVpcmVzIFBhcnNlIFNlcnZlciAzLjcuMCspXG4gICAqICAgPGxpPnRhcmdldENsYXNzOiBSZXF1aXJlZCBpZiB0eXBlIGlzIFBvaW50ZXIgb3IgUGFyc2UuUmVsYXRpb25cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZEZpZWxkKG5hbWUsIHR5cGUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdHlwZSA9IHR5cGUgfHwgJ1N0cmluZyc7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpZWxkIG5hbWUgbWF5IG5vdCBiZSBudWxsLicpO1xuICAgIH1cbiAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKEZJRUxEX1RZUEVTKS5jYWxsKEZJRUxEX1RZUEVTLCB0eXBlKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0eXBlfSBpcyBub3QgYSB2YWxpZCB0eXBlLmApO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRQb2ludGVyKG5hbWUsIG9wdGlvbnMudGFyZ2V0Q2xhc3MsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1JlbGF0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkUmVsYXRpb24obmFtZSwgb3B0aW9ucy50YXJnZXRDbGFzcyk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkT3B0aW9ucyA9IHtcbiAgICAgIHR5cGVcbiAgICB9O1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZXF1aXJlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBmaWVsZE9wdGlvbnMucmVxdWlyZWQgPSBvcHRpb25zLnJlcXVpcmVkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmllbGRPcHRpb25zLmRlZmF1bHRWYWx1ZSA9IG9wdGlvbnMuZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ0RhdGUnKSB7XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmaWVsZE9wdGlvbnMuZGVmYXVsdFZhbHVlID0ge1xuICAgICAgICAgIF9fdHlwZTogJ0RhdGUnLFxuICAgICAgICAgIGlzbzogbmV3IERhdGUob3B0aW9ucy5kZWZhdWx0VmFsdWUpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnQnl0ZXMnKSB7XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmaWVsZE9wdGlvbnMuZGVmYXVsdFZhbHVlID0ge1xuICAgICAgICAgIF9fdHlwZTogJ0J5dGVzJyxcbiAgICAgICAgICBiYXNlNjQ6IG9wdGlvbnMuZGVmYXVsdFZhbHVlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2ZpZWxkc1tuYW1lXSA9IGZpZWxkT3B0aW9ucztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgYW4gSW5kZXggdG8gQ3JlYXRlIC8gVXBkYXRlIGEgU2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGluZGV4XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbmRleCB7IGZpZWxkOiB2YWx1ZSB9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIHNjaGVtYS5hZGRJbmRleCgnaW5kZXhfbmFtZScsIHsgJ2ZpZWxkJzogMSB9KTtcbiAgICogPC9wcmU+XG4gICAqL1xuICBhZGRJbmRleChuYW1lLCBpbmRleCkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmRleCBuYW1lIG1heSBub3QgYmUgbnVsbC4nKTtcbiAgICB9XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmRleCBtYXkgbm90IGJlIG51bGwuJyk7XG4gICAgfVxuICAgIHRoaXMuX2luZGV4ZXNbbmFtZV0gPSBpbmRleDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgU3RyaW5nIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZFN0cmluZyhuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ1N0cmluZycsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBOdW1iZXIgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkTnVtYmVyKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnTnVtYmVyJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIEJvb2xlYW4gRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkQm9vbGVhbihuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0Jvb2xlYW4nLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgQnl0ZXMgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkQnl0ZXMobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdCeXRlcycsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBEYXRlIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZERhdGUobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdEYXRlJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIEZpbGUgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkRmlsZShuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0ZpbGUnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgR2VvUG9pbnQgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkR2VvUG9pbnQobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdHZW9Qb2ludCcsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBQb2x5Z29uIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZFBvbHlnb24obmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdQb2x5Z29uJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIEFycmF5IEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZEFycmF5KG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnQXJyYXknLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgT2JqZWN0IEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZE9iamVjdChuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ09iamVjdCcsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBQb2ludGVyIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRDbGFzcyBOYW1lIG9mIHRoZSB0YXJnZXQgUG9pbnRlciBDbGFzc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRQb2ludGVyKG5hbWUsIHRhcmdldENsYXNzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmaWVsZCBuYW1lIG1heSBub3QgYmUgbnVsbC4nKTtcbiAgICB9XG4gICAgaWYgKCF0YXJnZXRDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzZXQgdGhlIHRhcmdldENsYXNzIG9mIHRoZSBQb2ludGVyLicpO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZE9wdGlvbnMgPSB7XG4gICAgICB0eXBlOiAnUG9pbnRlcicsXG4gICAgICB0YXJnZXRDbGFzc1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlcXVpcmVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGZpZWxkT3B0aW9ucy5yZXF1aXJlZCA9IG9wdGlvbnMucmVxdWlyZWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWVsZE9wdGlvbnMuZGVmYXVsdFZhbHVlID0gb3B0aW9ucy5kZWZhdWx0VmFsdWU7XG4gICAgICBpZiAob3B0aW9ucy5kZWZhdWx0VmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VPYmplY3QuZGVmYXVsdCkge1xuICAgICAgICBmaWVsZE9wdGlvbnMuZGVmYXVsdFZhbHVlID0gb3B0aW9ucy5kZWZhdWx0VmFsdWUudG9Qb2ludGVyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2ZpZWxkc1tuYW1lXSA9IGZpZWxkT3B0aW9ucztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgUmVsYXRpb24gRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldENsYXNzIE5hbWUgb2YgdGhlIHRhcmdldCBQb2ludGVyIENsYXNzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRSZWxhdGlvbihuYW1lLCB0YXJnZXRDbGFzcykge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmaWVsZCBuYW1lIG1heSBub3QgYmUgbnVsbC4nKTtcbiAgICB9XG4gICAgaWYgKCF0YXJnZXRDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzZXQgdGhlIHRhcmdldENsYXNzIG9mIHRoZSBSZWxhdGlvbi4nKTtcbiAgICB9XG4gICAgdGhpcy5fZmllbGRzW25hbWVdID0ge1xuICAgICAgdHlwZTogJ1JlbGF0aW9uJyxcbiAgICAgIHRhcmdldENsYXNzXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGluZyBhIEZpZWxkIHRvIFVwZGF0ZSBvbiBhIFNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZGVsZXRlRmllbGQobmFtZSkge1xuICAgIHRoaXMuX2ZpZWxkc1tuYW1lXSA9IHtcbiAgICAgIF9fb3A6ICdEZWxldGUnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGluZyBhbiBJbmRleCB0byBVcGRhdGUgb24gYSBTY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGRcbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGRlbGV0ZUluZGV4KG5hbWUpIHtcbiAgICB0aGlzLl9pbmRleGVzW25hbWVdID0ge1xuICAgICAgX19vcDogJ0RlbGV0ZSdcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgc2VuZChjbGFzc05hbWUsIG1ldGhvZCkge1xuICAgIGxldCBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdChtZXRob2QsIGBzY2hlbWFzLyR7Y2xhc3NOYW1lfWAsIHBhcmFtcywge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfSk7XG4gIH0sXG4gIGdldChjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kKGNsYXNzTmFtZSwgJ0dFVCcpO1xuICB9LFxuICBjcmVhdGUoY2xhc3NOYW1lLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kKGNsYXNzTmFtZSwgJ1BPU1QnLCBwYXJhbXMpO1xuICB9LFxuICB1cGRhdGUoY2xhc3NOYW1lLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kKGNsYXNzTmFtZSwgJ1BVVCcsIHBhcmFtcyk7XG4gIH0sXG4gIGRlbGV0ZShjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kKGNsYXNzTmFtZSwgJ0RFTEVURScpO1xuICB9LFxuICBwdXJnZShjbGFzc05hbWUpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0RFTEVURScsIGBwdXJnZS8ke2NsYXNzTmFtZX1gLCB7fSwge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfSk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRTY2hlbWFDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlU2NoZW1hOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9pc1Jldm9jYWJsZVNlc3Npb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2lzUmV2b2NhYmxlU2Vzc2lvblwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX1BhcnNlVXNlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VVc2VyXCIpKTtcbi8qKlxuICogPHA+QSBQYXJzZS5TZXNzaW9uIG9iamVjdCBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgcmV2b2NhYmxlIHNlc3Npb24uXG4gKiBUaGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgYSBQYXJzZS5PYmplY3QsIGFuZCByZXRhaW5zIHRoZSBzYW1lXG4gKiBmdW5jdGlvbmFsaXR5IG9mIGEgUGFyc2UuT2JqZWN0LjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuU2Vzc2lvblxuICogQGF1Z21lbnRzIFBhcnNlLk9iamVjdFxuICovXG5jbGFzcyBQYXJzZVNlc3Npb24gZXh0ZW5kcyBfUGFyc2VPYmplY3QuZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyBUaGUgaW5pdGlhbCBzZXQgb2YgZGF0YSB0byBzdG9yZSBpbiB0aGUgdXNlci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHtcbiAgICBzdXBlcignX1Nlc3Npb24nKTtcbiAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghdGhpcy5zZXQoYXR0cmlidXRlcyB8fCB7fSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGFuIGludmFsaWQgU2Vzc2lvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiB0b2tlbiBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRTZXNzaW9uVG9rZW4oKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldCgnc2Vzc2lvblRva2VuJyk7XG4gICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHN0YXRpYyByZWFkT25seUF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnY3JlYXRlZFdpdGgnLCAnZXhwaXJlc0F0JywgJ2luc3RhbGxhdGlvbklkJywgJ3Jlc3RyaWN0ZWQnLCAnc2Vzc2lvblRva2VuJywgJ3VzZXInXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIFNlc3Npb24gb2JqZWN0IGZvciB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyB1c2VNYXN0ZXJLZXlcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgUGFyc2UuU2Vzc2lvblxuICAgKiBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gZmV0Y2hlZC4gSWYgdGhlcmUgaXMgbm8gY3VycmVudCB1c2VyLCB0aGVcbiAgICogcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkLlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTZXNzaW9uQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHNlc3Npb25PcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBzZXNzaW9uT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgcmV0dXJuIF9QYXJzZVVzZXIuZGVmYXVsdC5jdXJyZW50QXN5bmMoKS50aGVuKHVzZXIgPT4ge1xuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnVGhlcmUgaXMgbm8gY3VycmVudCB1c2VyLicpO1xuICAgICAgfVxuICAgICAgc2Vzc2lvbk9wdGlvbnMuc2Vzc2lvblRva2VuID0gdXNlci5nZXRTZXNzaW9uVG9rZW4oKTtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmdldFNlc3Npb24oc2Vzc2lvbk9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzZXNzaW9uIHRva2VuIGlzIHJldm9jYWJsZS5cbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBtaWdyYXRpbmcgRXhwcmVzcy5qcyBvciBOb2RlLmpzIHdlYiBhcHBzIHRvXG4gICAqIHVzZSByZXZvY2FibGUgc2Vzc2lvbnMuIElmIHlvdSBhcmUgbWlncmF0aW5nIGFuIGFwcCB0aGF0IHVzZXMgdGhlIFBhcnNlXG4gICAqIFNESyBpbiB0aGUgYnJvd3NlciBvbmx5LCBwbGVhc2UgdXNlIFBhcnNlLlVzZXIuZW5hYmxlUmV2b2NhYmxlU2Vzc2lvbigpXG4gICAqIGluc3RlYWQsIHNvIHRoYXQgc2Vzc2lvbnMgY2FuIGJlIGF1dG9tYXRpY2FsbHkgdXBncmFkZWQuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNDdXJyZW50U2Vzc2lvblJldm9jYWJsZSgpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IF9QYXJzZVVzZXIuZGVmYXVsdC5jdXJyZW50KCk7XG4gICAgaWYgKGN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4gKDAsIF9pc1Jldm9jYWJsZVNlc3Npb24uZGVmYXVsdCkoY3VycmVudFVzZXIuZ2V0U2Vzc2lvblRva2VuKCkgfHwgJycpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbl9QYXJzZU9iamVjdC5kZWZhdWx0LnJlZ2lzdGVyU3ViY2xhc3MoJ19TZXNzaW9uJywgUGFyc2VTZXNzaW9uKTtcbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBnZXRTZXNzaW9uKG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBQYXJzZVNlc3Npb24oKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ3Nlc3Npb25zL21lJywge30sIG9wdGlvbnMpLnRoZW4oc2Vzc2lvbkRhdGEgPT4ge1xuICAgICAgc2Vzc2lvbi5fZmluaXNoRmV0Y2goc2Vzc2lvbkRhdGEpO1xuICAgICAgc2Vzc2lvbi5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH0pO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0U2Vzc2lvbkNvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VTZXNzaW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkyKGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2lzUmV2b2NhYmxlU2Vzc2lvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaXNSZXZvY2FibGVTZXNzaW9uXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX1N0b3JhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VcIikpO1xuY29uc3QgQ1VSUkVOVF9VU0VSX0tFWSA9ICdjdXJyZW50VXNlcic7XG5sZXQgY2FuVXNlQ3VycmVudFVzZXIgPSAhX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJU19OT0RFJyk7XG5sZXQgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gZmFsc2U7XG5sZXQgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG5jb25zdCBhdXRoUHJvdmlkZXJzID0ge307XG5cbi8qKlxuICogPHA+QSBQYXJzZS5Vc2VyIG9iamVjdCBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgdXNlciBwZXJzaXN0ZWQgdG8gdGhlXG4gKiBQYXJzZSBjbG91ZC4gVGhpcyBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIGEgUGFyc2UuT2JqZWN0LCBhbmQgcmV0YWlucyB0aGVcbiAqIHNhbWUgZnVuY3Rpb25hbGl0eSBvZiBhIFBhcnNlLk9iamVjdCwgYnV0IGFsc28gZXh0ZW5kcyBpdCB3aXRoIHZhcmlvdXNcbiAqIHVzZXIgc3BlY2lmaWMgbWV0aG9kcywgbGlrZSBhdXRoZW50aWNhdGlvbiwgc2lnbmluZyB1cCwgYW5kIHZhbGlkYXRpb24gb2ZcbiAqIHVuaXF1ZW5lc3MuPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5Vc2VyXG4gKiBAYXVnbWVudHMgUGFyc2UuT2JqZWN0XG4gKi9cbmNsYXNzIFBhcnNlVXNlciBleHRlbmRzIF9QYXJzZU9iamVjdC5kZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIFRoZSBpbml0aWFsIHNldCBvZiBkYXRhIHRvIHN0b3JlIGluIHRoZSB1c2VyLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykge1xuICAgIHN1cGVyKCdfVXNlcicpO1xuICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKCF0aGlzLnNldChhdHRyaWJ1dGVzIHx8IHt9KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgYW4gaW52YWxpZCBQYXJzZSBVc2VyXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgcmV2b2NhYmxlIHNlc3Npb24gdG9rZW4gdG8gcmVwbGFjZSB0aGUgb2xkZXIgc3R5bGUgb2YgdG9rZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSByZXBsYWNlbWVudFxuICAgKiAgIHRva2VuIGhhcyBiZWVuIGZldGNoZWQuXG4gICAqL1xuICBfdXBncmFkZVRvUmV2b2NhYmxlU2Vzc2lvbihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgdXBncmFkZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHVwZ3JhZGVPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci51cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uKHRoaXMsIHVwZ3JhZGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbGxvd3MgeW91IHRvIGxpbmsgeW91ciB1c2VycyB3aXRoIHtAbGluayBodHRwczovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvcGFyc2Utc2VydmVyL2d1aWRlLyNvYXV0aC1hbmQtM3JkLXBhcnR5LWF1dGhlbnRpY2F0aW9uIDNyZCBwYXJ0eSBhdXRoZW50aWNhdGlvbn0sIGVuYWJsaW5nXG4gICAqIHlvdXIgdXNlcnMgdG8gc2lnbiB1cCBvciBsb2cgaW50byB5b3VyIGFwcGxpY2F0aW9uIHVzaW5nIHRoZWlyIGV4aXN0aW5nIGlkZW50aXRpZXMuXG4gICAqIFNpbmNlIDIuOS4wXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9qcy9ndWlkZS8jbGlua2luZy11c2VycyBMaW5raW5nIFVzZXJzfVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEF1dGhQcm92aWRlcn0gcHJvdmlkZXIgTmFtZSBvZiBhdXRoIHByb3ZpZGVyIG9yIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL0F1dGhQcm92aWRlci5odG1sIEF1dGhQcm92aWRlcn1cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmF1dGhEYXRhXSBBdXRoRGF0YSB0byBsaW5rIHdpdGhcbiAgICogPHVsPlxuICAgKiAgIDxsaT5JZiBwcm92aWRlciBpcyBzdHJpbmcsIG9wdGlvbnMgaXMge0BsaW5rIGh0dHA6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL3BhcnNlLXNlcnZlci9ndWlkZS8jc3VwcG9ydGVkLTNyZC1wYXJ0eS1hdXRoZW50aWNhdGlvbnMgYXV0aERhdGF9XG4gICAqICAgPGxpPklmIHByb3ZpZGVyIGlzIEF1dGhQcm92aWRlciwgb3B0aW9ucyBpcyBzYXZlT3B0c1xuICAgKiA8L3VsPlxuICAgKiBAcGFyYW0ge29iamVjdH0gc2F2ZU9wdHMgdXNlTWFzdGVyS2V5IC8gc2Vzc2lvblRva2VuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciBpcyBsaW5rZWRcbiAgICovXG4gIGxpbmtXaXRoKHByb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgbGV0IHNhdmVPcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBzYXZlT3B0cy5zZXNzaW9uVG9rZW4gPSBzYXZlT3B0cy5zZXNzaW9uVG9rZW4gfHwgdGhpcy5nZXRTZXNzaW9uVG9rZW4oKSB8fCAnJztcbiAgICBsZXQgYXV0aFR5cGU7XG4gICAgaWYgKHR5cGVvZiBwcm92aWRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGF1dGhUeXBlID0gcHJvdmlkZXI7XG4gICAgICBpZiAoYXV0aFByb3ZpZGVyc1twcm92aWRlcl0pIHtcbiAgICAgICAgcHJvdmlkZXIgPSBhdXRoUHJvdmlkZXJzW3Byb3ZpZGVyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IHtcbiAgICAgICAgICByZXN0b3JlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldEF1dGhUeXBlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGF1dGhUeXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYXV0aFByb3ZpZGVyc1thdXRoUHJvdmlkZXIuZ2V0QXV0aFR5cGUoKV0gPSBhdXRoUHJvdmlkZXI7XG4gICAgICAgIHByb3ZpZGVyID0gYXV0aFByb3ZpZGVyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyLmdldEF1dGhUeXBlKCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2F1dGhEYXRhJykpIHtcbiAgICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJykgfHwge307XG4gICAgICBpZiAodHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHlwZTogYXV0aERhdGEgZmllbGQgc2hvdWxkIGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgYXV0aERhdGFbYXV0aFR5cGVdID0gb3B0aW9ucy5hdXRoRGF0YTtcbiAgICAgIGNvbnN0IG9sZEFub255bW91c0RhdGEgPSBhdXRoRGF0YS5hbm9ueW1vdXM7XG4gICAgICB0aGlzLnN0cmlwQW5vbnltaXR5KCk7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmxpbmtXaXRoKHRoaXMsIGF1dGhEYXRhLCBzYXZlT3B0cykuY2F0Y2goZSA9PiB7XG4gICAgICAgIGRlbGV0ZSBhdXRoRGF0YVthdXRoVHlwZV07XG4gICAgICAgIHRoaXMucmVzdG9yZUFub25pbWl0eShvbGRBbm9ueW1vdXNEYXRhKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBwcm92aWRlci5hdXRoZW50aWNhdGUoe1xuICAgICAgICAgIHN1Y2Nlc3M6IChwcm92aWRlciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0ge307XG4gICAgICAgICAgICBvcHRzLmF1dGhEYXRhID0gcmVzdWx0O1xuICAgICAgICAgICAgdGhpcy5saW5rV2l0aChwcm92aWRlciwgb3B0cywgc2F2ZU9wdHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKHByb3ZpZGVyLCBlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwcm92aWRlclxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuYXV0aERhdGFdXG4gICAqIEBwYXJhbSBzYXZlT3B0c1xuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjkuMCBzZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuVXNlci5odG1sI2xpbmtXaXRoIGxpbmtXaXRofVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIF9saW5rV2l0aChwcm92aWRlciwgb3B0aW9ucykge1xuICAgIGxldCBzYXZlT3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgcmV0dXJuIHRoaXMubGlua1dpdGgocHJvdmlkZXIsIG9wdGlvbnMsIHNhdmVPcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZXMgYXV0aCBkYXRhIGZvciBhIHByb3ZpZGVyIChlLmcuIHB1dHMgdGhlIGFjY2VzcyB0b2tlbiBpbiB0aGVcbiAgICogcmlnaHQgcGxhY2UgdG8gYmUgdXNlZCBieSB0aGUgRmFjZWJvb2sgU0RLKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyXG4gICAqL1xuICBfc3luY2hyb25pemVBdXRoRGF0YShwcm92aWRlcikge1xuICAgIGlmICghdGhpcy5pc0N1cnJlbnQoKSB8fCAhcHJvdmlkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGF1dGhUeXBlO1xuICAgIGlmICh0eXBlb2YgcHJvdmlkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyO1xuICAgICAgcHJvdmlkZXIgPSBhdXRoUHJvdmlkZXJzW2F1dGhUeXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXV0aFR5cGUgPSBwcm92aWRlci5nZXRBdXRoVHlwZSgpO1xuICAgIH1cbiAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpO1xuICAgIGlmICghcHJvdmlkZXIgfHwgIWF1dGhEYXRhIHx8IHR5cGVvZiBhdXRoRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3VjY2VzcyA9IHByb3ZpZGVyLnJlc3RvcmVBdXRoZW50aWNhdGlvbihhdXRoRGF0YVthdXRoVHlwZV0pO1xuICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgdGhpcy5fdW5saW5rRnJvbShwcm92aWRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplcyBhdXRoRGF0YSBmb3IgYWxsIHByb3ZpZGVycy5cbiAgICovXG4gIF9zeW5jaHJvbml6ZUFsbEF1dGhEYXRhKCkge1xuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgaWYgKHR5cGVvZiBhdXRoRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXV0aERhdGEpIHtcbiAgICAgIHRoaXMuX3N5bmNocm9uaXplQXV0aERhdGEoa2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBudWxsIHZhbHVlcyBmcm9tIGF1dGhEYXRhICh3aGljaCBleGlzdCB0ZW1wb3JhcmlseSBmb3IgdW5saW5raW5nKVxuICAgKi9cbiAgX2NsZWFudXBBdXRoRGF0YSgpIHtcbiAgICBpZiAoIXRoaXMuaXNDdXJyZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKTtcbiAgICBpZiAodHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdXRoRGF0YSkge1xuICAgICAgaWYgKCFhdXRoRGF0YVtrZXldKSB7XG4gICAgICAgIGRlbGV0ZSBhdXRoRGF0YVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxpbmtzIGEgdXNlciBmcm9tIGEgc2VydmljZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBdXRoUHJvdmlkZXJ9IHByb3ZpZGVyIE5hbWUgb2YgYXV0aCBwcm92aWRlciBvciB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9BdXRoUHJvdmlkZXIuaHRtbCBBdXRoUHJvdmlkZXJ9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE1hc3RlcktleSAvIFNlc3Npb25Ub2tlblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVubGlua2luZ1xuICAgKiAgICAgZmluaXNoZXMuXG4gICAqL1xuICBfdW5saW5rRnJvbShwcm92aWRlciwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmxpbmtXaXRoKHByb3ZpZGVyLCB7XG4gICAgICBhdXRoRGF0YTogbnVsbFxuICAgIH0sIG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fc3luY2hyb25pemVBdXRoRGF0YShwcm92aWRlcik7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgdXNlciBpcyBsaW5rZWQgdG8gYSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvdmlkZXIgc2VydmljZSB0byBsaW5rIHRvXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGxpbmsgd2FzIHN1Y2Nlc3NmdWxcbiAgICovXG4gIF9pc0xpbmtlZChwcm92aWRlcikge1xuICAgIGxldCBhdXRoVHlwZTtcbiAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgYXV0aFR5cGUgPSBwcm92aWRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgYXV0aFR5cGUgPSBwcm92aWRlci5nZXRBdXRoVHlwZSgpO1xuICAgIH1cbiAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpIHx8IHt9O1xuICAgIGlmICh0eXBlb2YgYXV0aERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIWF1dGhEYXRhW2F1dGhUeXBlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWF1dGhlbnRpY2F0ZXMgYWxsIHByb3ZpZGVycy5cbiAgICovXG4gIF9sb2dPdXRXaXRoQWxsKCkge1xuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgaWYgKHR5cGVvZiBhdXRoRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXV0aERhdGEpIHtcbiAgICAgIHRoaXMuX2xvZ091dFdpdGgoa2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVhdXRoZW50aWNhdGVzIGEgc2luZ2xlIHByb3ZpZGVyIChlLmcuIHJlbW92aW5nIGFjY2VzcyB0b2tlbnMgZnJvbSB0aGVcbiAgICogRmFjZWJvb2sgU0RLKS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHByb3ZpZGVyIHNlcnZpY2UgdG8gbG9nb3V0IG9mXG4gICAqL1xuICBfbG9nT3V0V2l0aChwcm92aWRlcikge1xuICAgIGlmICghdGhpcy5pc0N1cnJlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgcHJvdmlkZXIgPSBhdXRoUHJvdmlkZXJzW3Byb3ZpZGVyXTtcbiAgICB9XG4gICAgaWYgKHByb3ZpZGVyICYmIHByb3ZpZGVyLmRlYXV0aGVudGljYXRlKSB7XG4gICAgICBwcm92aWRlci5kZWF1dGhlbnRpY2F0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGFzcyBpbnN0YW5jZSBtZXRob2QgdXNlZCB0byBtYWludGFpbiBzcGVjaWZpYyBrZXlzIHdoZW4gYSBmZXRjaCBvY2N1cnMuXG4gICAqIFVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHNlc3Npb24gdG9rZW4gaXMgbm90IGxvc3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IHNlc3Npb25Ub2tlblxuICAgKi9cbiAgX3ByZXNlcnZlRmllbGRzT25GZXRjaCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vzc2lvblRva2VuOiB0aGlzLmdldCgnc2Vzc2lvblRva2VuJylcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiA8Y29kZT5jdXJyZW50PC9jb2RlPiB3b3VsZCByZXR1cm4gdGhpcyB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB1c2VyIGlzIGNhY2hlZCBvbiBkaXNrXG4gICAqL1xuICBpc0N1cnJlbnQoKSB7XG4gICAgY29uc3QgY3VycmVudCA9IFBhcnNlVXNlci5jdXJyZW50KCk7XG4gICAgcmV0dXJuICEhY3VycmVudCAmJiBjdXJyZW50LmlkID09PSB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiA8Y29kZT5jdXJyZW50PC9jb2RlPiB3b3VsZCByZXR1cm4gdGhpcyB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gdHJ1ZSBpZiB1c2VyIGlzIGNhY2hlZCBvbiBkaXNrXG4gICAqL1xuICBhc3luYyBpc0N1cnJlbnRBc3luYygpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgUGFyc2VVc2VyLmN1cnJlbnRBc3luYygpO1xuICAgIHJldHVybiAhIWN1cnJlbnQgJiYgY3VycmVudC5pZCA9PT0gdGhpcy5pZDtcbiAgfVxuICBzdHJpcEFub255bWl0eSgpIHtcbiAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpO1xuICAgIGlmIChhdXRoRGF0YSAmJiB0eXBlb2YgYXV0aERhdGEgPT09ICdvYmplY3QnICYmIGF1dGhEYXRhLmhhc093blByb3BlcnR5KCdhbm9ueW1vdXMnKSkge1xuICAgICAgLy8gV2UgbmVlZCB0byBzZXQgYW5vbnltb3VzIHRvIG51bGwgaW5zdGVhZCBvZiBkZWxldGluZyBpdCBpbiBvcmRlciB0byByZW1vdmUgaXQgZnJvbSBQYXJzZS5cbiAgICAgIGF1dGhEYXRhLmFub255bW91cyA9IG51bGw7XG4gICAgfVxuICB9XG4gIHJlc3RvcmVBbm9uaW1pdHkoYW5vbnltb3VzRGF0YSkge1xuICAgIGlmIChhbm9ueW1vdXNEYXRhKSB7XG4gICAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpO1xuICAgICAgYXV0aERhdGEuYW5vbnltb3VzID0gYW5vbnltb3VzRGF0YTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBnZXQoXCJ1c2VybmFtZVwiKS5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFVzZXJuYW1lKCkge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5nZXQoJ3VzZXJuYW1lJyk7XG4gICAgaWYgKHVzZXJuYW1lID09IG51bGwgfHwgdHlwZW9mIHVzZXJuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHVzZXJuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgc2V0KFwidXNlcm5hbWVcIiwgdXNlcm5hbWUsIG9wdGlvbnMpIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZVxuICAgKi9cbiAgc2V0VXNlcm5hbWUodXNlcm5hbWUpIHtcbiAgICB0aGlzLnN0cmlwQW5vbnltaXR5KCk7XG4gICAgdGhpcy5zZXQoJ3VzZXJuYW1lJywgdXNlcm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHNldChcInBhc3N3b3JkXCIsIHBhc3N3b3JkLCBvcHRpb25zKSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVXNlcidzIFBhc3N3b3JkXG4gICAqL1xuICBzZXRQYXNzd29yZChwYXNzd29yZCkge1xuICAgIHRoaXMuc2V0KCdwYXNzd29yZCcsIHBhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGdldChcImVtYWlsXCIpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBVc2VyJ3MgRW1haWxcbiAgICovXG4gIGdldEVtYWlsKCkge1xuICAgIGNvbnN0IGVtYWlsID0gdGhpcy5nZXQoJ2VtYWlsJyk7XG4gICAgaWYgKGVtYWlsID09IG51bGwgfHwgdHlwZW9mIGVtYWlsID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVtYWlsO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgc2V0KFwiZW1haWxcIiwgZW1haWwpIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNldEVtYWlsKGVtYWlsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KCdlbWFpbCcsIGVtYWlsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIHRva2VuIGZvciB0aGlzIHVzZXIsIGlmIHRoZSB1c2VyIGhhcyBiZWVuIGxvZ2dlZCBpbixcbiAgICogb3IgaWYgaXQgaXMgdGhlIHJlc3VsdCBvZiBhIHF1ZXJ5IHdpdGggdGhlIG1hc3RlciBrZXkuIE90aGVyd2lzZSwgcmV0dXJuc1xuICAgKiB1bmRlZmluZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBzZXNzaW9uIHRva2VuLCBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldFNlc3Npb25Ub2tlbigpIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0KCdzZXNzaW9uVG9rZW4nKTtcbiAgICBpZiAodG9rZW4gPT0gbnVsbCB8fCB0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIHVzZXIgaXMgdGhlIGN1cnJlbnQgdXNlciBhbmQgaGFzIGJlZW4gYXV0aGVudGljYXRlZC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhpcyB1c2VyIGlzIHRoZSBjdXJyZW50IHVzZXIgYW5kIGlzIGxvZ2dlZCBpbi5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZWQoKSB7XG4gICAgY29uc3QgY3VycmVudCA9IFBhcnNlVXNlci5jdXJyZW50KCk7XG4gICAgcmV0dXJuICEhdGhpcy5nZXQoJ3Nlc3Npb25Ub2tlbicpICYmICEhY3VycmVudCAmJiBjdXJyZW50LmlkID09PSB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHVwIGEgbmV3IHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGluc3RlYWQgb2Ygc2F2ZSBmb3JcbiAgICogbmV3IFBhcnNlLlVzZXJzLiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IFBhcnNlLlVzZXIgb24gdGhlIHNlcnZlciwgYW5kXG4gICAqIGFsc28gcGVyc2lzdCB0aGUgc2Vzc2lvbiBvbiBkaXNrIHNvIHRoYXQgeW91IGNhbiBhY2Nlc3MgdGhlIHVzZXIgdXNpbmdcbiAgICogPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIDxwPkEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHNpZ25VcC48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRycyBFeHRyYSBmaWVsZHMgdG8gc2V0IG9uIHRoZSBuZXcgdXNlciwgb3IgbnVsbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBzaWdudXBcbiAgICogICAgIGZpbmlzaGVzLlxuICAgKi9cbiAgc2lnblVwKGF0dHJzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3Qgc2lnbnVwT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgc2lnbnVwT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2luc3RhbGxhdGlvbklkJykpIHtcbiAgICAgIHNpZ251cE9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPSBvcHRpb25zLmluc3RhbGxhdGlvbklkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcHRpb25zLmNvbnRleHQpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgc2lnbnVwT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduVXAodGhpcywgYXR0cnMsIHNpZ251cE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW4gYSBQYXJzZS5Vc2VyLiBPbiBzdWNjZXNzLCB0aGlzIHNhdmVzIHRoZSBzZXNzaW9uIHRvIGRpc2ssXG4gICAqIHNvIHlvdSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciB1c2luZ1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogPHA+QSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgbG9nSW4uPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgbG9nSW4oKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGxvZ2luT3B0aW9ucyA9IHtcbiAgICAgIHVzZVBvc3Q6IHRydWVcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgbG9naW5PcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5zdGFsbGF0aW9uSWQnKSkge1xuICAgICAgbG9naW5PcHRpb25zLmluc3RhbGxhdGlvbklkID0gb3B0aW9ucy5pbnN0YWxsYXRpb25JZDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZVBvc3QnKSkge1xuICAgICAgbG9naW5PcHRpb25zLnVzZVBvc3QgPSBvcHRpb25zLnVzZVBvc3Q7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9wdGlvbnMuY29udGV4dCkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICBsb2dpbk9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIubG9nSW4odGhpcywgbG9naW5PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBkZWZhdWx0IHNhdmUgYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRvIHNhdmUgdG8gbG9jYWxcbiAgICogc3RvcmFnZSBpZiB0aGlzIGlzIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBhc3luYyBzYXZlKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuc2F2ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5pc0N1cnJlbnRBc3luYygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS51cGRhdGVVc2VyT25EaXNrKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBkZWZhdWx0IGRlc3Ryb3kgYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRoYXQgbG9ncyBvdXRcbiAgICogdGhlIGN1cnJlbnQgdXNlciB3aGVuIGl0IGlzIGRlc3Ryb3llZFxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuVXNlcn1cbiAgICovXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJncyk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuaXNDdXJyZW50QXN5bmMoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCkucmVtb3ZlVXNlckZyb21EaXNrKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgZmV0Y2ggYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRvIHNhdmUgdG8gbG9jYWxcbiAgICogc3RvcmFnZSBpZiB0aGlzIGlzIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1BhcnNlLlVzZXJ9XG4gICAqL1xuICBhc3luYyBmZXRjaCgpIHtcbiAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZmV0Y2guYXBwbHkodGhpcywgYXJncyk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuaXNDdXJyZW50QXN5bmMoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCkudXBkYXRlVXNlck9uRGlzayh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZGVmYXVsdCBmZXRjaFdpdGhJbmNsdWRlIGJlaGF2aW9yIHdpdGggZnVuY3Rpb25hbGl0eSB0byBzYXZlIHRvIGxvY2FsXG4gICAqIHN0b3JhZ2UgaWYgdGhpcyBpcyBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5Vc2VyfVxuICAgKi9cbiAgYXN5bmMgZmV0Y2hXaXRoSW5jbHVkZSgpIHtcbiAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZmV0Y2hXaXRoSW5jbHVkZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5pc0N1cnJlbnRBc3luYygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS51cGRhdGVVc2VyT25EaXNrKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgd2hldGhlciBhIGdpdmVuIHBhc3N3b3JkIGlzIHRoZSBwYXNzd29yZCBvZiB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGJlIHZlcmlmaWVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pZ25vcmVFbWFpbFZlcmlmaWNhdGlvbl0gU2V0IHRvIGB0cnVlYCB0byBieXBhc3MgZW1haWwgdmVyaWZpY2F0aW9uIGFuZCB2ZXJpZnlcbiAgICogdGhlIHBhc3N3b3JkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZW1haWwgaGFzIGJlZW4gdmVyaWZpZWQuIFRoaXMgcmVxdWlyZXMgdGhlIG1hc3RlciBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhIHVzZXIgd2hlbiB0aGUgcGFzc3dvcmQgaXMgY29ycmVjdC5cbiAgICovXG4gIHZlcmlmeVBhc3N3b3JkKHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLmdldFVzZXJuYW1lKCkgfHwgJyc7XG4gICAgcmV0dXJuIFBhcnNlVXNlci52ZXJpZnlQYXNzd29yZCh1c2VybmFtZSwgcGFzc3dvcmQsIG9wdGlvbnMpO1xuICB9XG4gIHN0YXRpYyByZWFkT25seUF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnc2Vzc2lvblRva2VuJ107XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBmdW5jdGlvbmFsaXR5IHRvIHRoZSBleGlzdGluZyBQYXJzZS5Vc2VyIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvdG9Qcm9wcyBBIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgcHJvdG90eXBlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjbGFzc1Byb3BzIEEgc2V0IG9mIHN0YXRpYyBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgY2xhc3NcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuVXNlcn0gVGhlIG5ld2x5IGV4dGVuZGVkIFBhcnNlLlVzZXIgY2xhc3NcbiAgICovXG4gIHN0YXRpYyBleHRlbmQocHJvdG9Qcm9wcywgY2xhc3NQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcHJvdG9Qcm9wcykge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICAoMCwgX2RlZmluZVByb3BlcnR5LmRlZmF1bHQpKFBhcnNlVXNlci5wcm90b3R5cGUsIHByb3AsIHtcbiAgICAgICAgICAgIHZhbHVlOiBwcm90b1Byb3BzW3Byb3BdLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjbGFzc1Byb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gY2xhc3NQcm9wcykge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICAoMCwgX2RlZmluZVByb3BlcnR5LmRlZmF1bHQpKFBhcnNlVXNlciwgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IGNsYXNzUHJvcHNbcHJvcF0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFBhcnNlVXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gUGFyc2VVc2VyIHdpdGggYSB2YWxpZCBzZXNzaW9uLFxuICAgKiBlaXRoZXIgZnJvbSBtZW1vcnkgb3IgbG9jYWxTdG9yYWdlLCBpZiBuZWNlc3NhcnkuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gVGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gUGFyc2UuVXNlci5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCkge1xuICAgIGlmICghY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5jdXJyZW50VXNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiBQYXJzZVVzZXIgZnJvbSBhc3luY2hyb25vdXMgU3RvcmFnZS5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgY3VycmVudGx5XG4gICAqICAgbG9nZ2VkIGluIFBhcnNlIFVzZXJcbiAgICovXG4gIHN0YXRpYyBjdXJyZW50QXN5bmMoKSB7XG4gICAgaWYgKCFjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuY3VycmVudFVzZXJBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHVwIGEgbmV3IHVzZXIgd2l0aCBhIHVzZXJuYW1lIChvciBlbWFpbCkgYW5kIHBhc3N3b3JkLlxuICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IFBhcnNlLlVzZXIgb24gdGhlIHNlcnZlciwgYW5kIGFsc28gcGVyc2lzdCB0aGVcbiAgICogc2Vzc2lvbiBpbiBsb2NhbFN0b3JhZ2Ugc28gdGhhdCB5b3UgY2FuIGFjY2VzcyB0aGUgdXNlciB1c2luZ1xuICAgKiB7QGxpbmsgI2N1cnJlbnR9LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIChvciBlbWFpbCkgdG8gc2lnbiB1cCB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIHNpZ24gdXAgd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJzIEV4dHJhIGZpZWxkcyB0byBzZXQgb24gdGhlIG5ldyB1c2VyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgc2lnbnVwIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBzaWduVXAodXNlcm5hbWUsIHBhc3N3b3JkLCBhdHRycywgb3B0aW9ucykge1xuICAgIGF0dHJzID0gYXR0cnMgfHwge307XG4gICAgYXR0cnMudXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICBhdHRycy5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcyhhdHRycyk7XG4gICAgcmV0dXJuIHVzZXIuc2lnblVwKHt9LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB3aXRoIGEgdXNlcm5hbWUgKG9yIGVtYWlsKSBhbmQgcGFzc3dvcmQuIE9uIHN1Y2Nlc3MsIHRoaXNcbiAgICogc2F2ZXMgdGhlIHNlc3Npb24gdG8gZGlzaywgc28geW91IGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudGx5IGxvZ2dlZCBpblxuICAgKiB1c2VyIHVzaW5nIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIChvciBlbWFpbCkgdG8gbG9nIGluIHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gbG9nIGluIHdpdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIHdoZW5cbiAgICogICAgIHRoZSBsb2dpbiBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgbG9nSW4odXNlcm5hbWUsIHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnVXNlcm5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1Bhc3N3b3JkIG11c3QgYmUgYSBzdHJpbmcuJykpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICB1c2VyLl9maW5pc2hGZXRjaCh7XG4gICAgICB1c2VybmFtZTogdXNlcm5hbWUsXG4gICAgICBwYXNzd29yZDogcGFzc3dvcmRcbiAgICB9KTtcbiAgICByZXR1cm4gdXNlci5sb2dJbihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB3aXRoIGEgdXNlcm5hbWUgKG9yIGVtYWlsKSBhbmQgcGFzc3dvcmQsIGFuZCBhdXRoRGF0YS4gT24gc3VjY2VzcywgdGhpc1xuICAgKiBzYXZlcyB0aGUgc2Vzc2lvbiB0byBkaXNrLCBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluXG4gICAqIHVzZXIgdXNpbmcgPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgKG9yIGVtYWlsKSB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGF1dGhEYXRhIFRoZSBhdXRoRGF0YSB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBsb2dJbldpdGhBZGRpdGlvbmFsQXV0aCh1c2VybmFtZSwgcGFzc3dvcmQsIGF1dGhEYXRhLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnVXNlcm5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1Bhc3N3b3JkIG11c3QgYmUgYSBzdHJpbmcuJykpO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGF1dGhEYXRhKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnQXV0aCBtdXN0IGJlIGFuIG9iamVjdC4nKSk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHVzZXIuX2ZpbmlzaEZldGNoKHtcbiAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgIGF1dGhEYXRhXG4gICAgfSk7XG4gICAgcmV0dXJuIHVzZXIubG9nSW4ob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbiBhIHVzZXIgd2l0aCBhbiBvYmplY3RJZC4gT24gc3VjY2VzcywgdGhpcyBzYXZlcyB0aGUgc2Vzc2lvblxuICAgKiB0byBkaXNrLCBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgdXNpbmdcbiAgICogPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySWQgVGhlIG9iamVjdElkIGZvciB0aGUgdXNlci5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBsb2dpbkFzKHVzZXJJZCkge1xuICAgIGlmICghdXNlcklkKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LlVTRVJOQU1FX01JU1NJTkcsICdDYW5ub3QgbG9nIGluIGFzIHVzZXIgd2l0aCBhbiBlbXB0eSB1c2VyIGlkJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmxvZ2luQXModXNlciwgdXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB3aXRoIGEgc2Vzc2lvbiB0b2tlbi4gT24gc3VjY2VzcywgdGhpcyBzYXZlcyB0aGUgc2Vzc2lvblxuICAgKiB0byBkaXNrLCBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgdXNpbmdcbiAgICogPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uVG9rZW4gVGhlIHNlc3Npb25Ub2tlbiB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBiZWNvbWUoc2Vzc2lvblRva2VuLCBvcHRpb25zKSB7XG4gICAgaWYgKCFjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJdCBpcyBub3QgbWVtb3J5LXNhZmUgdG8gYmVjb21lIGEgdXNlciBpbiBhIHNlcnZlciBlbnZpcm9ubWVudCcpO1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBiZWNvbWVPcHRpb25zID0ge1xuICAgICAgc2Vzc2lvblRva2VuOiBzZXNzaW9uVG9rZW5cbiAgICB9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgYmVjb21lT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuYmVjb21lKHVzZXIsIGJlY29tZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHVzZXIgd2l0aCBhIHNlc3Npb24gdG9rZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uVG9rZW4gVGhlIHNlc3Npb25Ub2tlbiB0byBnZXQgdXNlciB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciBpcyBmZXRjaGVkLlxuICAgKi9cbiAgc3RhdGljIG1lKHNlc3Npb25Ub2tlbikge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBtZU9wdGlvbnMgPSB7XG4gICAgICBzZXNzaW9uVG9rZW46IHNlc3Npb25Ub2tlblxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMudXNlTWFzdGVyS2V5KSB7XG4gICAgICBtZU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHJldHVybiBjb250cm9sbGVyLm1lKHVzZXIsIG1lT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbiBhIHVzZXIgd2l0aCBhIHNlc3Npb24gdG9rZW4uIE9uIHN1Y2Nlc3MsIHRoaXMgc2F2ZXMgdGhlIHNlc3Npb25cbiAgICogdG8gZGlzaywgc28geW91IGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIHVzaW5nXG4gICAqIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LiBJZiB0aGVyZSBpcyBubyBzZXNzaW9uIHRva2VuIHRoZSB1c2VyIHdpbGwgbm90IGxvZ2dlZCBpbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHVzZXJKU09OIFRoZSBKU09OIG1hcCBvZiB0aGUgVXNlcidzIGRhdGFcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBoeWRyYXRlKHVzZXJKU09OKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuaHlkcmF0ZSh1c2VyLCB1c2VySlNPTik7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIHZlcnNpb24gb2Yge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuVXNlci5odG1sI2xpbmtXaXRoIGxpbmtXaXRofVxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmF1dGhEYXRhXVxuICAgKiBAcGFyYW0gc2F2ZU9wdHNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHN0YXRpYyBsb2dJbldpdGgocHJvdmlkZXIsIG9wdGlvbnMsIHNhdmVPcHRzKSB7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIHVzZXIubGlua1dpdGgocHJvdmlkZXIsIG9wdGlvbnMsIHNhdmVPcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIG91dCB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIHNlc3Npb24uIFRoaXMgd2lsbCByZW1vdmUgdGhlXG4gICAqIHNlc3Npb24gZnJvbSBkaXNrLCBsb2cgb3V0IG9mIGxpbmtlZCBzZXJ2aWNlcywgYW5kIGZ1dHVyZSBjYWxscyB0b1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPiB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgc2Vzc2lvbiBpc1xuICAgKiAgIGRlc3Ryb3llZCBvbiB0aGUgc2VydmVyLlxuICAgKi9cbiAgc3RhdGljIGxvZ091dCgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIubG9nT3V0KG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGEgcGFzc3dvcmQgcmVzZXQgZW1haWwgdG8gYmUgc2VudCB0byB0aGUgc3BlY2lmaWVkIGVtYWlsIGFkZHJlc3NcbiAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGFjY291bnQuIFRoaXMgZW1haWwgYWxsb3dzIHRoZSB1c2VyIHRvIHNlY3VyZWx5XG4gICAqIHJlc2V0IHRoZWlyIHBhc3N3b3JkIG9uIHRoZSBQYXJzZSBzaXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW1haWwgVGhlIGVtYWlsIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRoYXRcbiAgICogICAgIGZvcmdvdCB0aGVpciBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHN0YXRpYyByZXF1ZXN0UGFzc3dvcmRSZXNldChlbWFpbCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICByZXF1ZXN0T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIucmVxdWVzdFBhc3N3b3JkUmVzZXQoZW1haWwsIHJlcXVlc3RPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGFuIGVtYWlsIHZlcmlmaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsIFRoZSBlbWFpbCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0aGF0XG4gICAqICAgICBuZWVkcyB0byB2ZXJpZnkgdGhlaXIgZW1haWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBzdGF0aWMgcmVxdWVzdEVtYWlsVmVyaWZpY2F0aW9uKGVtYWlsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5yZXF1ZXN0RW1haWxWZXJpZmljYXRpb24oZW1haWwsIHJlcXVlc3RPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgd2hldGhlciBhIGdpdmVuIHBhc3N3b3JkIGlzIHRoZSBwYXNzd29yZCBvZiB0aGUgY3VycmVudCB1c2VyLlxuICAgKiBAc3RhdGljXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZSAgVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHdob3NlIHBhc3N3b3JkIHNob3VsZCBiZSB2ZXJpZmllZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBiZSB2ZXJpZmllZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaWdub3JlRW1haWxWZXJpZmljYXRpb25dIFNldCB0byBgdHJ1ZWAgdG8gYnlwYXNzIGVtYWlsIHZlcmlmaWNhdGlvbiBhbmQgdmVyaWZ5XG4gICAqIHRoZSBwYXNzd29yZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGVtYWlsIGhhcyBiZWVuIHZlcmlmaWVkLiBUaGlzIHJlcXVpcmVzIHRoZSBtYXN0ZXIga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSB1c2VyIHdoZW4gdGhlIHBhc3N3b3JkIGlzIGNvcnJlY3QuXG4gICAqL1xuICBzdGF0aWMgdmVyaWZ5UGFzc3dvcmQodXNlcm5hbWUsIHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnVXNlcm5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1Bhc3N3b3JkIG11c3QgYmUgYSBzdHJpbmcuJykpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci52ZXJpZnlQYXNzd29yZCh1c2VybmFtZSwgcGFzc3dvcmQsIG9wdGlvbnMgfHwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHNvbWVvbmUgdG8gZGVmaW5lIGEgY3VzdG9tIFVzZXIgY2xhc3Mgd2l0aG91dCBjbGFzc05hbWVcbiAgICogYmVpbmcgcmV3cml0dGVuIHRvIF9Vc2VyLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXdyaXRlXG4gICAqIFVzZXIgdG8gX1VzZXIgZm9yIGxlZ2FjeSByZWFzb25zLiBUaGlzIGFsbG93cyBkZXZlbG9wZXJzIHRvXG4gICAqIG92ZXJyaWRlIHRoYXQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBbGxvd2VkIFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IGN1c3RvbSBVc2VyIGNsYXNzXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBhbGxvd0N1c3RvbVVzZXJDbGFzcyhpc0FsbG93ZWQpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ1BFUkZPUk1fVVNFUl9SRVdSSVRFJywgIWlzQWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGEgbGVnYWN5IGFwcGxpY2F0aW9uIHRvIHN0YXJ0IHVzaW5nIHJldm9jYWJsZSBzZXNzaW9ucy4gSWYgdGhlXG4gICAqIGN1cnJlbnQgc2Vzc2lvbiB0b2tlbiBpcyBub3QgcmV2b2NhYmxlLCBhIHJlcXVlc3Qgd2lsbCBiZSBtYWRlIGZvciBhIG5ldyxcbiAgICogcmV2b2NhYmxlIHNlc3Npb24uXG4gICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGNsb3VkIGNvZGUgdW5sZXNzIHlvdSBhcmVcbiAgICogaGFuZGxpbmcgdXNlciBzaWdudXAgb3IgbG9naW4gZnJvbSB0aGUgc2VydmVyIHNpZGUuIEluIGEgY2xvdWQgY29kZSBjYWxsLFxuICAgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGF0dGVtcHQgdG8gdXBncmFkZSB0aGUgY3VycmVudCB0b2tlbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgcHJvY2VzcyBoYXNcbiAgICogICBjb21wbGV0ZWQuIElmIGEgcmVwbGFjZW1lbnQgc2Vzc2lvbiB0b2tlbiBpcyByZXF1ZXN0ZWQsIHRoZSBwcm9taXNlXG4gICAqICAgd2lsbCBiZSByZXNvbHZlZCBhZnRlciBhIG5ldyB0b2tlbiBoYXMgYmVlbiBmZXRjaGVkLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZVJldm9jYWJsZVNlc3Npb24ob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnRk9SQ0VfUkVWT0NBQkxFX1NFU1NJT04nLCB0cnVlKTtcbiAgICBpZiAoY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBQYXJzZVVzZXIuY3VycmVudCgpO1xuICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQuX3VwZ3JhZGVUb1Jldm9jYWJsZVNlc3Npb24ob3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgYmVjb21lIG9yIHRoZSBjdXJyZW50IHVzZXIgaW4gYSBzZXJ2ZXJcbiAgICogZW52aXJvbm1lbnQuIFRoZXNlIGZlYXR1cmVzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LCBzaW5jZSB0aGV5IGRlcGVuZCBvblxuICAgKiBnbG9iYWwgb2JqZWN0cyB0aGF0IGFyZSBub3QgbWVtb3J5LXNhZmUgZm9yIG1vc3Qgc2VydmVycy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGVuYWJsZVVuc2FmZUN1cnJlbnRVc2VyKCkge1xuICAgIGNhblVzZUN1cnJlbnRVc2VyID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgdXNlIG9mIGJlY29tZSBvciB0aGUgY3VycmVudCB1c2VyIGluIGFueSBlbnZpcm9ubWVudC5cbiAgICogVGhlc2UgZmVhdHVyZXMgYXJlIGRpc2FibGVkIG9uIHNlcnZlcnMgYnkgZGVmYXVsdCwgc2luY2UgdGhleSBkZXBlbmQgb25cbiAgICogZ2xvYmFsIG9iamVjdHMgdGhhdCBhcmUgbm90IG1lbW9yeS1zYWZlIGZvciBtb3N0IHNlcnZlcnMuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBkaXNhYmxlVW5zYWZlQ3VycmVudFVzZXIoKSB7XG4gICAgY2FuVXNlQ3VycmVudFVzZXIgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHJlZ2lzdGVyaW5nIHVzZXJzIHdpdGgge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuVXNlci5odG1sI2xpbmtXaXRoIGxpbmtXaXRofSBhIGJhc2ljIGF1dGggcHJvdmlkZXJcbiAgICogaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciB5b3UuXG4gICAqXG4gICAqIEZvciBhZHZhbmNlZCBhdXRoZW50aWNhdGlvbiwgeW91IGNhbiByZWdpc3RlciBhbiBBdXRoIHByb3ZpZGVyIHRvXG4gICAqIGltcGxlbWVudCBjdXN0b20gYXV0aGVudGljYXRpb24sIGRlYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlclxuICAgKiBAc2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL0F1dGhQcm92aWRlci5odG1sIEF1dGhQcm92aWRlcn1cbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL2pzL2d1aWRlLyNjdXN0b20tYXV0aGVudGljYXRpb24tbW9kdWxlIEN1c3RvbSBBdXRoZW50aWNhdGlvbiBNb2R1bGV9XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBfcmVnaXN0ZXJBdXRoZW50aWNhdGlvblByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgYXV0aFByb3ZpZGVyc1twcm92aWRlci5nZXRBdXRoVHlwZSgpXSA9IHByb3ZpZGVyO1xuICAgIC8vIFN5bmNocm9uaXplIHRoZSBjdXJyZW50IHVzZXIgd2l0aCB0aGUgYXV0aCBwcm92aWRlci5cbiAgICBQYXJzZVVzZXIuY3VycmVudEFzeW5jKCkudGhlbihjdXJyZW50ID0+IHtcbiAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnQuX3N5bmNocm9uaXplQXV0aERhdGEocHJvdmlkZXIuZ2V0QXV0aFR5cGUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHByb3ZpZGVyXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy5hdXRoRGF0YV1cbiAgICogQHBhcmFtIHNhdmVPcHRzXG4gICAqIEBkZXByZWNhdGVkIHNpbmNlIDIuOS4wIHNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5Vc2VyLmh0bWwjbG9nSW5XaXRoIGxvZ0luV2l0aH1cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHN0YXRpYyBfbG9nSW5XaXRoKHByb3ZpZGVyLCBvcHRpb25zLCBzYXZlT3B0cykge1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHJldHVybiB1c2VyLmxpbmtXaXRoKHByb3ZpZGVyLCBvcHRpb25zLCBzYXZlT3B0cyk7XG4gIH1cbiAgc3RhdGljIF9jbGVhckNhY2hlKCkge1xuICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSBudWxsO1xuICAgIGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzayA9IGZhbHNlO1xuICB9XG4gIHN0YXRpYyBfc2V0Q3VycmVudFVzZXJDYWNoZSh1c2VyKSB7XG4gICAgY3VycmVudFVzZXJDYWNoZSA9IHVzZXI7XG4gIH1cbn1cbl9QYXJzZU9iamVjdC5kZWZhdWx0LnJlZ2lzdGVyU3ViY2xhc3MoJ19Vc2VyJywgUGFyc2VVc2VyKTtcbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICB1cGRhdGVVc2VyT25EaXNrKHVzZXIpIHtcbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9VU0VSX0tFWSk7XG4gICAgY29uc3QganNvbiA9IHVzZXIudG9KU09OKCk7XG4gICAgZGVsZXRlIGpzb24ucGFzc3dvcmQ7XG4gICAganNvbi5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgIGxldCB1c2VyRGF0YSA9ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGpzb24pO1xuICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9VU0VSJykpIHtcbiAgICAgIGNvbnN0IGNyeXB0byA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENyeXB0b0NvbnRyb2xsZXIoKTtcbiAgICAgIHVzZXJEYXRhID0gY3J5cHRvLmVuY3J5cHQoanNvbiwgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfS0VZJykpO1xuICAgIH1cbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMocGF0aCwgdXNlckRhdGEpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfSk7XG4gIH0sXG4gIHJlbW92ZVVzZXJGcm9tRGlzaygpIHtcbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9VU0VSX0tFWSk7XG4gICAgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gdHJ1ZTtcbiAgICBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5yZW1vdmVJdGVtQXN5bmMocGF0aCk7XG4gIH0sXG4gIHNldEN1cnJlbnRVc2VyKHVzZXIpIHtcbiAgICBjdXJyZW50VXNlckNhY2hlID0gdXNlcjtcbiAgICB1c2VyLl9jbGVhbnVwQXV0aERhdGEoKTtcbiAgICB1c2VyLl9zeW5jaHJvbml6ZUFsbEF1dGhEYXRhKCk7XG4gICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnVwZGF0ZVVzZXJPbkRpc2sodXNlcik7XG4gIH0sXG4gIGN1cnJlbnRVc2VyKCkge1xuICAgIGlmIChjdXJyZW50VXNlckNhY2hlKSB7XG4gICAgICByZXR1cm4gY3VycmVudFVzZXJDYWNoZTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzaykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChfU3RvcmFnZS5kZWZhdWx0LmFzeW5jKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNhbGwgY3VycmVudFVzZXIoKSB3aGVuIHVzaW5nIGEgcGxhdGZvcm0gd2l0aCBhbiBhc3luYyAnICsgJ3N0b3JhZ2Ugc3lzdGVtLiBDYWxsIGN1cnJlbnRVc2VyQXN5bmMoKSBpbnN0ZWFkLicpO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9VU0VSX0tFWSk7XG4gICAgbGV0IHVzZXJEYXRhID0gX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtKHBhdGgpO1xuICAgIGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzayA9IHRydWU7XG4gICAgaWYgKCF1c2VyRGF0YSkge1xuICAgICAgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX1VTRVInKSkge1xuICAgICAgY29uc3QgY3J5cHRvID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q3J5cHRvQ29udHJvbGxlcigpO1xuICAgICAgdXNlckRhdGEgPSBjcnlwdG8uZGVjcnlwdCh1c2VyRGF0YSwgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfS0VZJykpO1xuICAgIH1cbiAgICB1c2VyRGF0YSA9IEpTT04ucGFyc2UodXNlckRhdGEpO1xuICAgIGlmICghdXNlckRhdGEuY2xhc3NOYW1lKSB7XG4gICAgICB1c2VyRGF0YS5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgIH1cbiAgICBpZiAodXNlckRhdGEuX2lkKSB7XG4gICAgICBpZiAodXNlckRhdGEub2JqZWN0SWQgIT09IHVzZXJEYXRhLl9pZCkge1xuICAgICAgICB1c2VyRGF0YS5vYmplY3RJZCA9IHVzZXJEYXRhLl9pZDtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB1c2VyRGF0YS5faWQ7XG4gICAgfVxuICAgIGlmICh1c2VyRGF0YS5fc2Vzc2lvblRva2VuKSB7XG4gICAgICB1c2VyRGF0YS5zZXNzaW9uVG9rZW4gPSB1c2VyRGF0YS5fc2Vzc2lvblRva2VuO1xuICAgICAgZGVsZXRlIHVzZXJEYXRhLl9zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnQgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTih1c2VyRGF0YSk7XG4gICAgY3VycmVudFVzZXJDYWNoZSA9IGN1cnJlbnQ7XG4gICAgY3VycmVudC5fc3luY2hyb25pemVBbGxBdXRoRGF0YSgpO1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9LFxuICBjdXJyZW50VXNlckFzeW5jKCkge1xuICAgIGlmIChjdXJyZW50VXNlckNhY2hlKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGN1cnJlbnRVc2VyQ2FjaGUpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9VU0VSX0tFWSk7XG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKHBhdGgpLnRoZW4odXNlckRhdGEgPT4ge1xuICAgICAgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gdHJ1ZTtcbiAgICAgIGlmICghdXNlckRhdGEpIHtcbiAgICAgICAgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUobnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfVVNFUicpKSB7XG4gICAgICAgIGNvbnN0IGNyeXB0byA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENyeXB0b0NvbnRyb2xsZXIoKTtcbiAgICAgICAgdXNlckRhdGEgPSBjcnlwdG8uZGVjcnlwdCh1c2VyRGF0YS50b1N0cmluZygpLCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9LRVknKSk7XG4gICAgICB9XG4gICAgICB1c2VyRGF0YSA9IEpTT04ucGFyc2UodXNlckRhdGEpO1xuICAgICAgaWYgKCF1c2VyRGF0YS5jbGFzc05hbWUpIHtcbiAgICAgICAgdXNlckRhdGEuY2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICAgIH1cbiAgICAgIGlmICh1c2VyRGF0YS5faWQpIHtcbiAgICAgICAgaWYgKHVzZXJEYXRhLm9iamVjdElkICE9PSB1c2VyRGF0YS5faWQpIHtcbiAgICAgICAgICB1c2VyRGF0YS5vYmplY3RJZCA9IHVzZXJEYXRhLl9pZDtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdXNlckRhdGEuX2lkO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXJEYXRhLl9zZXNzaW9uVG9rZW4pIHtcbiAgICAgICAgdXNlckRhdGEuc2Vzc2lvblRva2VuID0gdXNlckRhdGEuX3Nlc3Npb25Ub2tlbjtcbiAgICAgICAgZGVsZXRlIHVzZXJEYXRhLl9zZXNzaW9uVG9rZW47XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50ID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04odXNlckRhdGEpO1xuICAgICAgY3VycmVudFVzZXJDYWNoZSA9IGN1cnJlbnQ7XG4gICAgICBjdXJyZW50Ll9zeW5jaHJvbml6ZUFsbEF1dGhEYXRhKCk7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGN1cnJlbnQpO1xuICAgIH0pO1xuICB9LFxuICBzaWduVXAodXNlciwgYXR0cnMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IGF0dHJzICYmIGF0dHJzLnVzZXJuYW1lIHx8IHVzZXIuZ2V0KCd1c2VybmFtZScpO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gYXR0cnMgJiYgYXR0cnMucGFzc3dvcmQgfHwgdXNlci5nZXQoJ3Bhc3N3b3JkJyk7XG4gICAgaWYgKCF1c2VybmFtZSB8fCAhdXNlcm5hbWUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ0Nhbm5vdCBzaWduIHVwIHVzZXIgd2l0aCBhbiBlbXB0eSB1c2VybmFtZS4nKSk7XG4gICAgfVxuICAgIGlmICghcGFzc3dvcmQgfHwgIXBhc3N3b3JkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdDYW5ub3Qgc2lnbiB1cCB1c2VyIHdpdGggYW4gZW1wdHkgcGFzc3dvcmQuJykpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlci5zYXZlKGF0dHJzLCBvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgIC8vIENsZWFyIHRoZSBwYXNzd29yZCBmaWVsZFxuICAgICAgdXNlci5fZmluaXNoRmV0Y2goe1xuICAgICAgICBwYXNzd29yZDogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIGlmIChjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9KTtcbiAgfSxcbiAgbG9nSW4odXNlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBhdXRoID0ge1xuICAgICAgdXNlcm5hbWU6IHVzZXIuZ2V0KCd1c2VybmFtZScpLFxuICAgICAgcGFzc3dvcmQ6IHVzZXIuZ2V0KCdwYXNzd29yZCcpLFxuICAgICAgYXV0aERhdGE6IHVzZXIuZ2V0KCdhdXRoRGF0YScpXG4gICAgfTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdChvcHRpb25zLnVzZVBvc3QgPyAnUE9TVCcgOiAnR0VUJywgJ2xvZ2luJywgYXV0aCwgb3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICB1c2VyLl9taWdyYXRlSWQocmVzcG9uc2Uub2JqZWN0SWQpO1xuICAgICAgdXNlci5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICAgIHN0YXRlQ29udHJvbGxlci5zZXRQZW5kaW5nT3AodXNlci5fZ2V0U3RhdGVJZGVudGlmaWVyKCksICd1c2VybmFtZScsIHVuZGVmaW5lZCk7XG4gICAgICBzdGF0ZUNvbnRyb2xsZXIuc2V0UGVuZGluZ09wKHVzZXIuX2dldFN0YXRlSWRlbnRpZmllcigpLCAncGFzc3dvcmQnLCB1bmRlZmluZWQpO1xuICAgICAgcmVzcG9uc2UucGFzc3dvcmQgPSB1bmRlZmluZWQ7XG4gICAgICB1c2VyLl9maW5pc2hGZXRjaChyZXNwb25zZSk7XG4gICAgICBpZiAoIWNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICAgIC8vIFdlIGNhbid0IHNldCB0aGUgY3VycmVudCB1c2VyLCBzbyBqdXN0IHJldHVybiB0aGUgb25lIHdlIGxvZ2dlZCBpblxuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVzZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH0pO1xuICB9LFxuICBsb2dpbkFzKHVzZXIsIHVzZXJJZCkge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdsb2dpbkFzJywge1xuICAgICAgdXNlcklkXG4gICAgfSwge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICB1c2VyLl9maW5pc2hGZXRjaChyZXNwb25zZSk7XG4gICAgICB1c2VyLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgICAgaWYgKCFjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVzZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH0pO1xuICB9LFxuICBiZWNvbWUodXNlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ3VzZXJzL21lJywge30sIG9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgdXNlci5fZmluaXNoRmV0Y2gocmVzcG9uc2UpO1xuICAgICAgdXNlci5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICB9KTtcbiAgfSxcbiAgaHlkcmF0ZSh1c2VyLCB1c2VySlNPTikge1xuICAgIHVzZXIuX2ZpbmlzaEZldGNoKHVzZXJKU09OKTtcbiAgICB1c2VyLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgIGlmICh1c2VySlNPTi5zZXNzaW9uVG9rZW4gJiYgY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh1c2VyKTtcbiAgICB9XG4gIH0sXG4gIG1lKHVzZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICd1c2Vycy9tZScsIHt9LCBvcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIHVzZXIuX2ZpbmlzaEZldGNoKHJlc3BvbnNlKTtcbiAgICAgIHVzZXIuX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9KTtcbiAgfSxcbiAgbG9nT3V0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgaWYgKG9wdGlvbnMuc2Vzc2lvblRva2VuKSB7XG4gICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdsb2dvdXQnLCB7fSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5jdXJyZW50VXNlckFzeW5jKCkudGhlbihjdXJyZW50VXNlciA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9VU0VSX0tFWSk7XG4gICAgICBsZXQgcHJvbWlzZSA9IF9TdG9yYWdlLmRlZmF1bHQucmVtb3ZlSXRlbUFzeW5jKHBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRVc2VyICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZXNzaW9uID0gY3VycmVudFVzZXIuZ2V0U2Vzc2lvblRva2VuKCk7XG4gICAgICAgIGlmIChjdXJyZW50U2Vzc2lvbiAmJiAoMCwgX2lzUmV2b2NhYmxlU2Vzc2lvbi5kZWZhdWx0KShjdXJyZW50U2Vzc2lvbikpIHtcbiAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2xvZ291dCcsIHt9LCB7XG4gICAgICAgICAgICAgIHNlc3Npb25Ub2tlbjogY3VycmVudFNlc3Npb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRVc2VyLl9sb2dPdXRXaXRoQWxsKCk7XG4gICAgICAgIGN1cnJlbnRVc2VyLl9maW5pc2hGZXRjaCh7XG4gICAgICAgICAgc2Vzc2lvblRva2VuOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2sgPSB0cnVlO1xuICAgICAgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9KTtcbiAgfSxcbiAgcmVxdWVzdFBhc3N3b3JkUmVzZXQoZW1haWwsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAncmVxdWVzdFBhc3N3b3JkUmVzZXQnLCB7XG4gICAgICBlbWFpbDogZW1haWxcbiAgICB9LCBvcHRpb25zKTtcbiAgfSxcbiAgYXN5bmMgdXBncmFkZVRvUmV2b2NhYmxlU2Vzc2lvbih1c2VyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdG9rZW4gPSB1c2VyLmdldFNlc3Npb25Ub2tlbigpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LlNFU1NJT05fTUlTU0lORywgJ0Nhbm5vdCB1cGdyYWRlIGEgdXNlciB3aXRoIG5vIHNlc3Npb24gdG9rZW4nKSk7XG4gICAgfVxuICAgIG9wdGlvbnMuc2Vzc2lvblRva2VuID0gdG9rZW47XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAndXBncmFkZVRvUmV2b2NhYmxlU2Vzc2lvbicsIHt9LCBvcHRpb25zKTtcbiAgICB1c2VyLl9maW5pc2hGZXRjaCh7XG4gICAgICBzZXNzaW9uVG9rZW46IHJlc3VsdD8uc2Vzc2lvblRva2VuIHx8ICcnXG4gICAgfSk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHVzZXIuaXNDdXJyZW50QXN5bmMoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVzZXIpO1xuICB9LFxuICBsaW5rV2l0aCh1c2VyLCBhdXRoRGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiB1c2VyLnNhdmUoe1xuICAgICAgYXV0aERhdGFcbiAgICB9LCBvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9KTtcbiAgfSxcbiAgdmVyaWZ5UGFzc3dvcmQodXNlcm5hbWUsIHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgLi4uKG9wdGlvbnMuaWdub3JlRW1haWxWZXJpZmljYXRpb24gIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGlnbm9yZUVtYWlsVmVyaWZpY2F0aW9uOiBvcHRpb25zLmlnbm9yZUVtYWlsVmVyaWZpY2F0aW9uXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICd2ZXJpZnlQYXNzd29yZCcsIGRhdGEsIG9wdGlvbnMpO1xuICB9LFxuICByZXF1ZXN0RW1haWxWZXJpZmljYXRpb24oZW1haWwsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAndmVyaWZpY2F0aW9uRW1haWxSZXF1ZXN0Jywge1xuICAgICAgZW1haWw6IGVtYWlsXG4gICAgfSwgb3B0aW9ucyk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQYXJzZVVzZXIoUGFyc2VVc2VyKTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFVzZXJDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlVXNlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRQdXNoU3RhdHVzID0gZ2V0UHVzaFN0YXR1cztcbmV4cG9ydHMuc2VuZCA9IHNlbmQ7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUXVlcnlcIikpO1xuLyoqXG4gKiBDb250YWlucyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIFB1c2ggaW4gUGFyc2UuXG4gKlxuICogQGNsYXNzIFBhcnNlLlB1c2hcbiAqIEBzdGF0aWNcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuXG4vKipcbiAqIFNlbmRzIGEgcHVzaCBub3RpZmljYXRpb24uXG4gKiAqKkF2YWlsYWJsZSBpbiBDbG91ZCBDb2RlIG9ubHkuKipcbiAqXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9qcy9ndWlkZS8jcHVzaC1ub3RpZmljYXRpb25zIFB1c2ggTm90aWZpY2F0aW9uIEd1aWRlfVxuICpcbiAqIEBmdW5jdGlvbiBzZW5kXG4gKiBAbmFtZSBQYXJzZS5QdXNoLnNlbmRcbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gIFRoZSBkYXRhIG9mIHRoZSBwdXNoIG5vdGlmaWNhdGlvbi4gVmFsaWQgZmllbGRzXG4gKiBhcmU6XG4gKiAgIDxvbD5cbiAqICAgICA8bGk+Y2hhbm5lbHMgLSBBbiBBcnJheSBvZiBjaGFubmVscyB0byBwdXNoIHRvLjwvbGk+XG4gKiAgICAgPGxpPnB1c2hfdGltZSAtIEEgRGF0ZSBvYmplY3QgZm9yIHdoZW4gdG8gc2VuZCB0aGUgcHVzaC48L2xpPlxuICogICAgIDxsaT5leHBpcmF0aW9uX3RpbWUgLSAgQSBEYXRlIG9iamVjdCBmb3Igd2hlbiB0byBleHBpcmVcbiAqICAgICAgICAgdGhlIHB1c2guPC9saT5cbiAqICAgICA8bGk+ZXhwaXJhdGlvbl9pbnRlcnZhbCAtIFRoZSBzZWNvbmRzIGZyb20gbm93IHRvIGV4cGlyZSB0aGUgcHVzaC48L2xpPlxuICogICAgIDxsaT53aGVyZSAtIEEgUGFyc2UuUXVlcnkgb3ZlciBQYXJzZS5JbnN0YWxsYXRpb24gdGhhdCBpcyB1c2VkIHRvIG1hdGNoXG4gKiAgICAgICAgIGEgc2V0IG9mIGluc3RhbGxhdGlvbnMgdG8gcHVzaCB0by48L2xpPlxuICogICAgIDxsaT5kYXRhIC0gVGhlIGRhdGEgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSBwdXNoLjwvbGk+XG4gKiAgIDxvbD5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnNcbiAqIGFyZTo8dWw+XG4gKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICogPC91bD5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgcHVzaCByZXF1ZXN0XG4gKiAgICAgY29tcGxldGVzIGFuZCByZXR1cm5zIGBwdXNoU3RhdHVzSWRgLlxuICovXG5mdW5jdGlvbiBzZW5kKGRhdGEpIHtcbiAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICBpZiAoZGF0YS53aGVyZSAmJiBkYXRhLndoZXJlIGluc3RhbmNlb2YgX1BhcnNlUXVlcnkuZGVmYXVsdCkge1xuICAgIGRhdGEud2hlcmUgPSBkYXRhLndoZXJlLnRvSlNPTigpLndoZXJlO1xuICB9XG4gIGlmIChkYXRhLnB1c2hfdGltZSAmJiB0eXBlb2YgZGF0YS5wdXNoX3RpbWUgPT09ICdvYmplY3QnKSB7XG4gICAgZGF0YS5wdXNoX3RpbWUgPSBkYXRhLnB1c2hfdGltZS50b0pTT04oKTtcbiAgfVxuICBpZiAoZGF0YS5leHBpcmF0aW9uX3RpbWUgJiYgdHlwZW9mIGRhdGEuZXhwaXJhdGlvbl90aW1lID09PSAnb2JqZWN0Jykge1xuICAgIGRhdGEuZXhwaXJhdGlvbl90aW1lID0gZGF0YS5leHBpcmF0aW9uX3RpbWUudG9KU09OKCk7XG4gIH1cbiAgaWYgKGRhdGEuZXhwaXJhdGlvbl90aW1lICYmIGRhdGEuZXhwaXJhdGlvbl9pbnRlcnZhbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwaXJhdGlvbl90aW1lIGFuZCBleHBpcmF0aW9uX2ludGVydmFsIGNhbm5vdCBib3RoIGJlIHNldC4nKTtcbiAgfVxuICBjb25zdCBwdXNoT3B0aW9ucyA9IHtcbiAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgfTtcbiAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgcHVzaE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gIH1cbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFB1c2hDb250cm9sbGVyKCkuc2VuZChkYXRhLCBwdXNoT3B0aW9ucyk7XG59XG5cbi8qKlxuICogR2V0cyBwdXNoIHN0YXR1cyBieSBJZFxuICpcbiAqIEBmdW5jdGlvbiBnZXRQdXNoU3RhdHVzXG4gKiBAbmFtZSBQYXJzZS5QdXNoLmdldFB1c2hTdGF0dXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwdXNoU3RhdHVzSWQgVGhlIElkIG9mIFB1c2ggU3RhdHVzLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9uc1xuICogYXJlOjx1bD5cbiAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gKiA8L3VsPlxuICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gU3RhdHVzIG9mIFB1c2guXG4gKi9cbmZ1bmN0aW9uIGdldFB1c2hTdGF0dXMocHVzaFN0YXR1c0lkKSB7XG4gIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgY29uc3QgcHVzaE9wdGlvbnMgPSB7XG4gICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gIH07XG4gIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgIHB1c2hPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICB9XG4gIGNvbnN0IHF1ZXJ5ID0gbmV3IF9QYXJzZVF1ZXJ5LmRlZmF1bHQoJ19QdXNoU3RhdHVzJyk7XG4gIHJldHVybiBxdWVyeS5nZXQocHVzaFN0YXR1c0lkLCBwdXNoT3B0aW9ucyk7XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgYXN5bmMgc2VuZChkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5yZXR1cm5TdGF0dXMgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5yZXF1ZXN0KCdQT1NUJywgJ3B1c2gnLCBkYXRhLCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuX2hlYWRlcnM/LlsnWC1QYXJzZS1QdXNoLVN0YXR1cy1JZCddO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UHVzaENvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfaW5jbHVkZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX3NldFRpbWVvdXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXQtdGltZW91dFwiKSk7XG52YXIgX3V1aWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V1aWRcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfcHJvbWlzZVV0aWxzID0gcmVxdWlyZShcIi4vcHJvbWlzZVV0aWxzXCIpO1xudmFyIF9YaHIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1hoci53ZWFwcFwiKSk7XG4vKiBnbG9iYWwgWE1MSHR0cFJlcXVlc3QsIFhEb21haW5SZXF1ZXN0ICovXG5cbmxldCBYSFIgPSBudWxsO1xuaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgWEhSID0gWE1MSHR0cFJlcXVlc3Q7XG59XG5sZXQgdXNlWERvbWFpblJlcXVlc3QgPSBmYWxzZTtcbi8vIEB0cy1pZ25vcmVcbmlmICh0eXBlb2YgWERvbWFpblJlcXVlc3QgIT09ICd1bmRlZmluZWQnICYmICEoJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KCkpKSB7XG4gIHVzZVhEb21haW5SZXF1ZXN0ID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGFqYXhJRTkobWV0aG9kLCB1cmwsIGRhdGEsIGhlYWRlcnMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgeGRyID0gbmV3IFhEb21haW5SZXF1ZXN0KCk7XG4gICAgeGRyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCByZXNwb25zZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4ZHIucmVzcG9uc2VUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgeGRyLm9uZXJyb3IgPSB4ZHIub250aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gTGV0J3MgZmFrZSBhIHJlYWwgZXJyb3IgbWVzc2FnZS5cbiAgICAgIGNvbnN0IGZha2VSZXNwb25zZSA9IHtcbiAgICAgICAgcmVzcG9uc2VUZXh0OiAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KSh7XG4gICAgICAgICAgY29kZTogX1BhcnNlRXJyb3IuZGVmYXVsdC5YX0RPTUFJTl9SRVFVRVNULFxuICAgICAgICAgIGVycm9yOiBcIklFJ3MgWERvbWFpblJlcXVlc3QgZG9lcyBub3Qgc3VwcGx5IGVycm9yIGluZm8uXCJcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgICByZWplY3QoZmFrZVJlc3BvbnNlKTtcbiAgICB9O1xuICAgIHhkci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0aW9ucy5wcm9ncmVzcyh4ZHIucmVzcG9uc2VUZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHhkci5vcGVuKG1ldGhvZCwgdXJsKTtcbiAgICB4ZHIuc2VuZChkYXRhKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucmVxdWVzdFRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG9wdGlvbnMucmVxdWVzdFRhc2soeGRyKTtcbiAgICB9XG4gIH0pO1xufVxuY29uc3QgUkVTVENvbnRyb2xsZXIgPSB7XG4gIGFqYXgobWV0aG9kLCB1cmwsIGRhdGEsIGhlYWRlcnMsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgaWYgKHVzZVhEb21haW5SZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gYWpheElFOShtZXRob2QsIHVybCwgZGF0YSwgaGVhZGVycywgb3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgIGNvbnN0IGlzSWRlbXBvdGVudCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSURFTVBPVEVOQ1knKSAmJiAoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKF9jb250ZXh0ID0gWydQT1NUJywgJ1BVVCddKS5jYWxsKF9jb250ZXh0LCBtZXRob2QpO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IGlzSWRlbXBvdGVudCA/ICgwLCBfdXVpZC5kZWZhdWx0KSgpIDogJyc7XG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBjb25zdCBkaXNwYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChYSFIgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtYWtlIGEgcmVxdWVzdDogTm8gZGVmaW5pdGlvbiBvZiBYTUxIdHRwUmVxdWVzdCB3YXMgZm91bmQuJyk7XG4gICAgICB9XG4gICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgeGhyID0gbmV3IFhIUigpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSA0IHx8IGhhbmRsZWQgfHwgeGhyLl9hYm9ydGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlSGVhZGVycyA9IHR5cGVvZiB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzID09PSAnZnVuY3Rpb24nID8geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIDogJyc7XG4gICAgICAgICAgICBoZWFkZXJzID0ge307XG4gICAgICAgICAgICBpZiAodHlwZW9mIHhoci5nZXRSZXNwb25zZUhlYWRlciA9PT0gJ2Z1bmN0aW9uJyAmJiBhdmFpbGFibGVIZWFkZXJzPy5pbmRleE9mKCdhY2Nlc3MtY29udHJvbC1leHBvc2UtaGVhZGVycycpID49IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdhY2Nlc3MtY29udHJvbC1leHBvc2UtaGVhZGVycycpLnNwbGl0KCcsICcpO1xuICAgICAgICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocmVzcG9uc2VIZWFkZXJzKS5jYWxsKHJlc3BvbnNlSGVhZGVycywgaGVhZGVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKGF2YWlsYWJsZUhlYWRlcnMpLmNhbGwoYXZhaWxhYmxlSGVhZGVycywgaGVhZGVyLnRvTG93ZXJDYXNlKCkpID49IDApIHtcbiAgICAgICAgICAgICAgICAgIGhlYWRlcnNbaGVhZGVyXSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICBzdGF0dXM6IHhoci5zdGF0dXMsXG4gICAgICAgICAgICAgIHhoclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHhoci5zdGF0dXMgPj0gNTAwIHx8IHhoci5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAvLyByZXRyeSBvbiA1WFggb3Igbm9kZS14bWxodHRwcmVxdWVzdCBlcnJvclxuICAgICAgICAgIGlmICgrK2F0dGVtcHRzIDwgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdSRVFVRVNUX0FUVEVNUFRfTElNSVQnKSkge1xuICAgICAgICAgICAgLy8gRXhwb25lbnRpYWxseS1ncm93aW5nIHJhbmRvbSBkZWxheVxuICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxMjUgKiBNYXRoLnBvdygyLCBhdHRlbXB0cykpO1xuICAgICAgICAgICAgKDAsIF9zZXRUaW1lb3V0Mi5kZWZhdWx0KShkaXNwYXRjaCwgZGVsYXkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeGhyLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoJ1VuYWJsZSB0byBjb25uZWN0IHRvIHRoZSBQYXJzZSBBUEknKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlIHJldHJ5IGxpbWl0IGlzIHJlYWNoZWQsIGZhaWxcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHhocik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb21pc2UucmVqZWN0KHhocik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBoZWFkZXJzID0gaGVhZGVycyB8fCB7fTtcbiAgICAgIGlmICh0eXBlb2YgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW4nOyAvLyBBdm9pZCBwcmUtZmxpZ2h0XG4gICAgICB9XG4gICAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJU19OT0RFJykpIHtcbiAgICAgICAgaGVhZGVyc1snVXNlci1BZ2VudCddID0gJ1BhcnNlLycgKyBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1ZFUlNJT04nKSArICcgKE5vZGVKUyAnICsgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlICsgJyknO1xuICAgICAgfVxuICAgICAgaWYgKGlzSWRlbXBvdGVudCkge1xuICAgICAgICBoZWFkZXJzWydYLVBhcnNlLVJlcXVlc3QtSWQnXSA9IHJlcXVlc3RJZDtcbiAgICAgIH1cbiAgICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RZUEUnKSAmJiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RPS0VOJykpIHtcbiAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfQVVUSF9UWVBFJykgKyAnICcgKyBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RPS0VOJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXN0b21IZWFkZXJzID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdSRVFVRVNUX0hFQURFUlMnKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGN1c3RvbUhlYWRlcnMpIHtcbiAgICAgICAgaGVhZGVyc1trZXldID0gY3VzdG9tSGVhZGVyc1trZXldO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlUHJvZ3Jlc3MgPSBmdW5jdGlvbiAodHlwZSwgZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5wcm9ncmVzcyhldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCwgZXZlbnQubG9hZGVkLCBldmVudC50b3RhbCwge1xuICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucy5wcm9ncmVzcyhudWxsLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSBldmVudCA9PiB7XG4gICAgICAgICAgaGFuZGxlUHJvZ3Jlc3MoJ2Rvd25sb2FkJywgZXZlbnQpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoeGhyLnVwbG9hZCkge1xuICAgICAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGhhbmRsZVByb2dyZXNzKCd1cGxvYWQnLCBldmVudCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgeGhyLm9wZW4obWV0aG9kLCB1cmwsIHRydWUpO1xuICAgICAgZm9yIChjb25zdCBoIGluIGhlYWRlcnMpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaCwgaGVhZGVyc1toXSk7XG4gICAgICB9XG4gICAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgcmVzdWx0czogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgICB4aHJcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgeGhyLnNlbmQoZGF0YSk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZXF1ZXN0VGFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG9wdGlvbnMucmVxdWVzdFRhc2soeGhyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGRpc3BhdGNoKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH0sXG4gIHJlcXVlc3QobWV0aG9kLCBwYXRoLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgbGV0IHVybCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX1VSTCcpO1xuICAgIGlmICh1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICAgIHVybCArPSAnLyc7XG4gICAgfVxuICAgIHVybCArPSBwYXRoO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7fTtcbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAoY29uc3QgayBpbiBkYXRhKSB7XG4gICAgICAgIHBheWxvYWRba10gPSBkYXRhW2tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBjb250ZXh0XG4gICAgY29uc3QgY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICB9XG4gICAgaWYgKG1ldGhvZCAhPT0gJ1BPU1QnKSB7XG4gICAgICBwYXlsb2FkLl9tZXRob2QgPSBtZXRob2Q7XG4gICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgfVxuICAgIHBheWxvYWQuX0FwcGxpY2F0aW9uSWQgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FQUExJQ0FUSU9OX0lEJyk7XG4gICAgY29uc3QganNLZXkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0pBVkFTQ1JJUFRfS0VZJyk7XG4gICAgaWYgKGpzS2V5KSB7XG4gICAgICBwYXlsb2FkLl9KYXZhU2NyaXB0S2V5ID0ganNLZXk7XG4gICAgfVxuICAgIHBheWxvYWQuX0NsaWVudFZlcnNpb24gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1ZFUlNJT04nKTtcbiAgICBsZXQgdXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgaWYgKHR5cGVvZiB1c2VNYXN0ZXJLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB1c2VNYXN0ZXJLZXkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1VTRV9NQVNURVJfS0VZJyk7XG4gICAgfVxuICAgIGlmICh1c2VNYXN0ZXJLZXkpIHtcbiAgICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ01BU1RFUl9LRVknKSkge1xuICAgICAgICBkZWxldGUgcGF5bG9hZC5fSmF2YVNjcmlwdEtleTtcbiAgICAgICAgcGF5bG9hZC5fTWFzdGVyS2V5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdNQVNURVJfS0VZJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgdGhlIE1hc3RlciBLZXksIGl0IGhhcyBub3QgYmVlbiBwcm92aWRlZC4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRk9SQ0VfUkVWT0NBQkxFX1NFU1NJT04nKSkge1xuICAgICAgcGF5bG9hZC5fUmV2b2NhYmxlU2Vzc2lvbiA9ICcxJztcbiAgICB9XG4gICAgY29uc3QgaW5zdGFsbGF0aW9uSWQgPSBvcHRpb25zLmluc3RhbGxhdGlvbklkO1xuICAgIGxldCBpbnN0YWxsYXRpb25JZFByb21pc2U7XG4gICAgaWYgKGluc3RhbGxhdGlvbklkICYmIHR5cGVvZiBpbnN0YWxsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGluc3RhbGxhdGlvbklkUHJvbWlzZSA9IF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShpbnN0YWxsYXRpb25JZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluc3RhbGxhdGlvbkNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCk7XG4gICAgICBpbnN0YWxsYXRpb25JZFByb21pc2UgPSBpbnN0YWxsYXRpb25Db250cm9sbGVyLmN1cnJlbnRJbnN0YWxsYXRpb25JZCgpO1xuICAgIH1cbiAgICByZXR1cm4gaW5zdGFsbGF0aW9uSWRQcm9taXNlLnRoZW4oaWlkID0+IHtcbiAgICAgIHBheWxvYWQuX0luc3RhbGxhdGlvbklkID0gaWlkO1xuICAgICAgY29uc3QgdXNlckNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuc2Vzc2lvblRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKG9wdGlvbnMuc2Vzc2lvblRva2VuKTtcbiAgICAgIH0gZWxzZSBpZiAodXNlckNvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIHVzZXJDb250cm9sbGVyLmN1cnJlbnRVc2VyQXN5bmMoKS50aGVuKHVzZXIgPT4ge1xuICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVzZXIuZ2V0U2Vzc2lvblRva2VuKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUobnVsbCk7XG4gICAgfSkudGhlbih0b2tlbiA9PiB7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgcGF5bG9hZC5fU2Vzc2lvblRva2VuID0gdG9rZW47XG4gICAgICB9XG4gICAgICBjb25zdCBwYXlsb2FkU3RyaW5nID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkocGF5bG9hZCk7XG4gICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIuYWpheChtZXRob2QsIHVybCwgcGF5bG9hZFN0cmluZywge30sIG9wdGlvbnMpLnRoZW4oX3JlZiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgeGhyXG4gICAgICAgIH0gPSBfcmVmO1xuICAgICAgICBpZiAob3B0aW9ucy5yZXR1cm5TdGF0dXMpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgICBfc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgICBfaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIF94aHI6IHhoclxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KS5jYXRjaChSRVNUQ29udHJvbGxlci5oYW5kbGVFcnJvcik7XG4gIH0sXG4gIGhhbmRsZUVycm9yKHJlc3BvbnNlKSB7XG4gICAgLy8gVHJhbnNmb3JtIHRoZSBlcnJvciBpbnRvIGFuIGluc3RhbmNlIG9mIFBhcnNlRXJyb3IgYnkgdHJ5aW5nIHRvIHBhcnNlXG4gICAgLy8gdGhlIGVycm9yIHN0cmluZyBhcyBKU09OXG4gICAgbGV0IGVycm9yO1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXNwb25zZVRleHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVycm9ySlNPTiA9IEpTT04ucGFyc2UocmVzcG9uc2UucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChlcnJvckpTT04uY29kZSwgZXJyb3JKU09OLmVycm9yKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgd2UgZmFpbCB0byBwYXJzZSB0aGUgZXJyb3IgdGV4dCwgdGhhdCdzIG9rYXkuXG4gICAgICAgIGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0pTT04sICdSZWNlaXZlZCBhbiBlcnJvciB3aXRoIGludmFsaWQgSlNPTiBmcm9tIFBhcnNlOiAnICsgcmVzcG9uc2UucmVzcG9uc2VUZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2UgPyByZXNwb25zZS5tZXNzYWdlIDogcmVzcG9uc2U7XG4gICAgICBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuQ09OTkVDVElPTl9GQUlMRUQsICdYTUxIdHRwUmVxdWVzdCBmYWlsZWQ6ICcgKyAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShtZXNzYWdlKSk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gIH0sXG4gIF9zZXRYSFIoeGhyKSB7XG4gICAgWEhSID0geGhyO1xuICB9LFxuICBfZ2V0WEhSKCkge1xuICAgIHJldHVybiBYSFI7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFJFU1RDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUkVTVENvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfV2Vha01hcCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3dlYWstbWFwXCIpO1xudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jbGVhckFsbFN0YXRlID0gY2xlYXJBbGxTdGF0ZTtcbmV4cG9ydHMuY29tbWl0U2VydmVyQ2hhbmdlcyA9IGNvbW1pdFNlcnZlckNoYW5nZXM7XG5leHBvcnRzLmR1cGxpY2F0ZVN0YXRlID0gZHVwbGljYXRlU3RhdGU7XG5leHBvcnRzLmVucXVldWVUYXNrID0gZW5xdWV1ZVRhc2s7XG5leHBvcnRzLmVzdGltYXRlQXR0cmlidXRlID0gZXN0aW1hdGVBdHRyaWJ1dGU7XG5leHBvcnRzLmVzdGltYXRlQXR0cmlidXRlcyA9IGVzdGltYXRlQXR0cmlidXRlcztcbmV4cG9ydHMuZ2V0T2JqZWN0Q2FjaGUgPSBnZXRPYmplY3RDYWNoZTtcbmV4cG9ydHMuZ2V0UGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHM7XG5leHBvcnRzLmdldFNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhO1xuZXhwb3J0cy5nZXRTdGF0ZSA9IGdldFN0YXRlO1xuZXhwb3J0cy5pbml0aWFsaXplU3RhdGUgPSBpbml0aWFsaXplU3RhdGU7XG5leHBvcnRzLm1lcmdlRmlyc3RQZW5kaW5nU3RhdGUgPSBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wb3BQZW5kaW5nU3RhdGUgPSBwb3BQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnB1c2hQZW5kaW5nU3RhdGUgPSBwdXNoUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5yZW1vdmVTdGF0ZSA9IHJlbW92ZVN0YXRlO1xuZXhwb3J0cy5zZXRQZW5kaW5nT3AgPSBzZXRQZW5kaW5nT3A7XG5leHBvcnRzLnNldFNlcnZlckRhdGEgPSBzZXRTZXJ2ZXJEYXRhO1xudmFyIE9iamVjdFN0YXRlTXV0YXRpb25zID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vT2JqZWN0U3RhdGVNdXRhdGlvbnNcIikpO1xuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgX1dlYWtNYXApIHJldHVybiBudWxsO1xuICB2YXIgciA9IG5ldyBfV2Vha01hcCgpLFxuICAgIHQgPSBuZXcgX1dlYWtNYXAoKTtcbiAgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlID8gdCA6IHI7XG4gIH0pKGUpO1xufVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoZSwgcikge1xuICBpZiAoIXIgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICBkZWZhdWx0OiBlXG4gIH07XG4gIHZhciB0ID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKHIpO1xuICBpZiAodCAmJiB0LmhhcyhlKSkgcmV0dXJuIHQuZ2V0KGUpO1xuICB2YXIgbiA9IHtcbiAgICBfX3Byb3RvX186IG51bGxcbiAgfTtcbiAgZm9yICh2YXIgdSBpbiBlKSBpZiAoXCJkZWZhdWx0XCIgIT09IHUgJiYge30uaGFzT3duUHJvcGVydHkuY2FsbChlLCB1KSkge1xuICAgIHZhciBpID0gX09iamVjdCRkZWZpbmVQcm9wZXJ0eSAmJiBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA/IF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHUpIDogbnVsbDtcbiAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBfT2JqZWN0JGRlZmluZVByb3BlcnR5KG4sIHUsIGkpIDogblt1XSA9IGVbdV07XG4gIH1cbiAgcmV0dXJuIG4uZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgbiksIG47XG59XG5sZXQgb2JqZWN0U3RhdGUgPSB7fTtcbmZ1bmN0aW9uIGdldFN0YXRlKG9iaikge1xuICBjb25zdCBjbGFzc0RhdGEgPSBvYmplY3RTdGF0ZVtvYmouY2xhc3NOYW1lXTtcbiAgaWYgKGNsYXNzRGF0YSkge1xuICAgIHJldHVybiBjbGFzc0RhdGFbb2JqLmlkXSB8fCBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gaW5pdGlhbGl6ZVN0YXRlKG9iaiwgaW5pdGlhbCkge1xuICBsZXQgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKCFvYmplY3RTdGF0ZVtvYmouY2xhc3NOYW1lXSkge1xuICAgIG9iamVjdFN0YXRlW29iai5jbGFzc05hbWVdID0ge307XG4gIH1cbiAgaWYgKCFpbml0aWFsKSB7XG4gICAgaW5pdGlhbCA9IE9iamVjdFN0YXRlTXV0YXRpb25zLmRlZmF1bHRTdGF0ZSgpO1xuICB9XG4gIHN0YXRlID0gb2JqZWN0U3RhdGVbb2JqLmNsYXNzTmFtZV1bb2JqLmlkXSA9IGluaXRpYWw7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0YXRlKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGRlbGV0ZSBvYmplY3RTdGF0ZVtvYmouY2xhc3NOYW1lXVtvYmouaWRdO1xuICByZXR1cm4gc3RhdGU7XG59XG5mdW5jdGlvbiBnZXRTZXJ2ZXJEYXRhKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5zZXJ2ZXJEYXRhO1xuICB9XG4gIHJldHVybiB7fTtcbn1cbmZ1bmN0aW9uIHNldFNlcnZlckRhdGEob2JqLCBhdHRyaWJ1dGVzKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBpbml0aWFsaXplU3RhdGUob2JqKS5zZXJ2ZXJEYXRhO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5zZXRTZXJ2ZXJEYXRhKHNlcnZlckRhdGEsIGF0dHJpYnV0ZXMpO1xufVxuZnVuY3Rpb24gZ2V0UGVuZGluZ09wcyhvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUucGVuZGluZ09wcztcbiAgfVxuICByZXR1cm4gW3t9XTtcbn1cbmZ1bmN0aW9uIHNldFBlbmRpbmdPcChvYmosIGF0dHIsIG9wKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5zZXRQZW5kaW5nT3AocGVuZGluZ09wcywgYXR0ciwgb3ApO1xufVxuZnVuY3Rpb24gcHVzaFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGluaXRpYWxpemVTdGF0ZShvYmopLnBlbmRpbmdPcHM7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLnB1c2hQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG59XG5mdW5jdGlvbiBwb3BQZW5kaW5nU3RhdGUob2JqKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICByZXR1cm4gT2JqZWN0U3RhdGVNdXRhdGlvbnMucG9wUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xufVxuZnVuY3Rpb24gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMubWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbn1cbmZ1bmN0aW9uIGdldE9iamVjdENhY2hlKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5vYmplY3RDYWNoZTtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZShvYmosIGF0dHIpIHtcbiAgY29uc3Qgc2VydmVyRGF0YSA9IGdldFNlcnZlckRhdGEob2JqKTtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgcmV0dXJuIE9iamVjdFN0YXRlTXV0YXRpb25zLmVzdGltYXRlQXR0cmlidXRlKHNlcnZlckRhdGEsIHBlbmRpbmdPcHMsIG9iaiwgYXR0cik7XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZXMob2JqKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhKG9iaik7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzKG9iaik7XG4gIHJldHVybiBPYmplY3RTdGF0ZU11dGF0aW9ucy5lc3RpbWF0ZUF0dHJpYnV0ZXMoc2VydmVyRGF0YSwgcGVuZGluZ09wcywgb2JqKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFNlcnZlckNoYW5nZXMob2JqLCBjaGFuZ2VzKSB7XG4gIGNvbnN0IHN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKG9iaik7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLmNvbW1pdFNlcnZlckNoYW5nZXMoc3RhdGUuc2VydmVyRGF0YSwgc3RhdGUub2JqZWN0Q2FjaGUsIGNoYW5nZXMpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVRhc2sob2JqLCB0YXNrKSB7XG4gIGNvbnN0IHN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKG9iaik7XG4gIHJldHVybiBzdGF0ZS50YXNrcy5lbnF1ZXVlKHRhc2spO1xufVxuZnVuY3Rpb24gY2xlYXJBbGxTdGF0ZSgpIHtcbiAgb2JqZWN0U3RhdGUgPSB7fTtcbn1cbmZ1bmN0aW9uIGR1cGxpY2F0ZVN0YXRlKHNvdXJjZSwgZGVzdCkge1xuICBkZXN0LmlkID0gc291cmNlLmlkO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5jbGFzcyBTb2NrZXRXZWFwcCB7XG4gIGNvbnN0cnVjdG9yKHNlcnZlclVSTCkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25vcGVuXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbm1lc3NhZ2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uY2xvc2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uZXJyb3JcIiwgdm9pZCAwKTtcbiAgICB0aGlzLm9ub3BlbiA9ICgpID0+IHt9O1xuICAgIHRoaXMub25tZXNzYWdlID0gKCkgPT4ge307XG4gICAgdGhpcy5vbmNsb3NlID0gKCkgPT4ge307XG4gICAgdGhpcy5vbmVycm9yID0gKCkgPT4ge307XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3gub25Tb2NrZXRPcGVuKCgpID0+IHtcbiAgICAgIHRoaXMub25vcGVuKCk7XG4gICAgfSk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3gub25Tb2NrZXRNZXNzYWdlKG1zZyA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm9ubWVzc2FnZShtc2cpO1xuICAgIH0pO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4Lm9uU29ja2V0Q2xvc2UoZXZlbnQgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5vbmNsb3NlKGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5vblNvY2tldEVycm9yKGVycm9yID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMub25lcnJvcihlcnJvcik7XG4gICAgfSk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3guY29ubmVjdFNvY2tldCh7XG4gICAgICB1cmw6IHNlcnZlclVSTFxuICAgIH0pO1xuICB9XG4gIHNlbmQoZGF0YSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5zZW5kU29ja2V0TWVzc2FnZSh7XG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cbiAgY2xvc2UoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4LmNsb3NlU29ja2V0KCk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gU29ja2V0V2VhcHA7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTb2NrZXRXZWFwcDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbmNvbnN0IFN0b3JhZ2UgPSB7XG4gIGFzeW5jKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiAhIWNvbnRyb2xsZXIuYXN5bmM7XG4gIH0sXG4gIGdldEl0ZW0ocGF0aCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIHN0b3JhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBzdG9yYWdlIGNvbnRyb2xsZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0SXRlbShwYXRoKTtcbiAgfSxcbiAgZ2V0SXRlbUFzeW5jKHBhdGgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0SXRlbUFzeW5jKHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNvbnRyb2xsZXIuZ2V0SXRlbShwYXRoKSk7XG4gIH0sXG4gIHNldEl0ZW0ocGF0aCwgdmFsdWUpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTeW5jaHJvbm91cyBzdG9yYWdlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgc3RvcmFnZSBjb250cm9sbGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLnNldEl0ZW0ocGF0aCwgdmFsdWUpO1xuICB9LFxuICBzZXRJdGVtQXN5bmMocGF0aCwgdmFsdWUpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuc2V0SXRlbUFzeW5jKHBhdGgsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjb250cm9sbGVyLnNldEl0ZW0ocGF0aCwgdmFsdWUpKTtcbiAgfSxcbiAgcmVtb3ZlSXRlbShwYXRoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3luY2hyb25vdXMgc3RvcmFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHN0b3JhZ2UgY29udHJvbGxlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5yZW1vdmVJdGVtKHBhdGgpO1xuICB9LFxuICByZW1vdmVJdGVtQXN5bmMocGF0aCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5yZW1vdmVJdGVtQXN5bmMocGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY29udHJvbGxlci5yZW1vdmVJdGVtKHBhdGgpKTtcbiAgfSxcbiAgZ2V0QWxsS2V5cygpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTeW5jaHJvbm91cyBzdG9yYWdlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgc3RvcmFnZSBjb250cm9sbGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLmdldEFsbEtleXMoKTtcbiAgfSxcbiAgZ2V0QWxsS2V5c0FzeW5jKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjb250cm9sbGVyLmdldEFsbEtleXMoKSk7XG4gIH0sXG4gIGdlbmVyYXRlUGF0aChwYXRoKSB7XG4gICAgaWYgKCFfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FQUExJQ0FUSU9OX0lEJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gY2FsbCBQYXJzZS5pbml0aWFsaXplIGJlZm9yZSB1c2luZyBQYXJzZS4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBnZXQgYSBTdG9yYWdlIHBhdGggdGhhdCB3YXMgbm90IGEgU3RyaW5nLicpO1xuICAgIH1cbiAgICBpZiAocGF0aFswXSA9PT0gJy8nKSB7XG4gICAgICBwYXRoID0gcGF0aC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIHJldHVybiAnUGFyc2UvJyArIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKSArICcvJyArIHBhdGg7XG4gIH0sXG4gIF9jbGVhcigpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5oYXNPd25Qcm9wZXJ0eSgnY2xlYXInKSkge1xuICAgICAgY29udHJvbGxlci5jbGVhcigpO1xuICAgIH1cbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2U7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuLyogZ2xvYmFsIGxvY2FsU3RvcmFnZSAqL1xuXG5jb25zdCBTdG9yYWdlQ29udHJvbGxlciA9IHtcbiAgYXN5bmM6IDAsXG4gIGdldEl0ZW0ocGF0aCkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShwYXRoKTtcbiAgfSxcbiAgc2V0SXRlbShwYXRoLCB2YWx1ZSkge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXRoLCB2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUXVvdGEgZXhjZWVkZWQsIHBvc3NpYmx5IGR1ZSB0byBTYWZhcmkgUHJpdmF0ZSBCcm93c2luZyBtb2RlXG4gICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlSXRlbShwYXRoKSB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0ocGF0aCk7XG4gIH0sXG4gIGdldEFsbEtleXMoKSB7XG4gICAgY29uc3Qga2V5cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBrZXlzLnB1c2gobG9jYWxTdG9yYWdlLmtleShpKSk7XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xuICB9LFxuICBjbGVhcigpIHtcbiAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG4vLyBXaGVuIHRoZXJlIGlzIG5vIG5hdGl2ZSBzdG9yYWdlIGludGVyZmFjZSwgd2UgZGVmYXVsdCB0byBhbiBpbi1tZW1vcnkgbWFwXG5jb25zdCBtZW1NYXAgPSB7fTtcbmNvbnN0IFN0b3JhZ2VDb250cm9sbGVyID0ge1xuICBhc3luYzogMCxcbiAgZ2V0SXRlbShwYXRoKSB7XG4gICAgaWYgKG1lbU1hcC5oYXNPd25Qcm9wZXJ0eShwYXRoKSkge1xuICAgICAgcmV0dXJuIG1lbU1hcFtwYXRoXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIHNldEl0ZW0ocGF0aCwgdmFsdWUpIHtcbiAgICBtZW1NYXBbcGF0aF0gPSBTdHJpbmcodmFsdWUpO1xuICB9LFxuICByZW1vdmVJdGVtKHBhdGgpIHtcbiAgICBkZWxldGUgbWVtTWFwW3BhdGhdO1xuICB9LFxuICBnZXRBbGxLZXlzKCkge1xuICAgIHJldHVybiAoMCwgX2tleXMuZGVmYXVsdCkobWVtTWFwKTtcbiAgfSxcbiAgY2xlYXIoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWVtTWFwKSB7XG4gICAgICBpZiAobWVtTWFwLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZGVsZXRlIG1lbU1hcFtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlXCIpKTtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlQ29udHJvbGxlci5icm93c2VyXCIpKTtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlQ29udHJvbGxlci53ZWFwcFwiKSk7XG52YXIgX1N0b3JhZ2VDb250cm9sbGVyNCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdFwiKSk7XG5sZXQgU3RvcmFnZUNvbnRyb2xsZXIgPSBfU3RvcmFnZUNvbnRyb2xsZXI0LmRlZmF1bHQ7XG5TdG9yYWdlQ29udHJvbGxlciA9IF9TdG9yYWdlQ29udHJvbGxlcjIuZGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbmNvbnN0IFN0b3JhZ2VDb250cm9sbGVyID0ge1xuICBhc3luYzogMSxcbiAgZ2V0SXRlbUFzeW5jKHBhdGgpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkuZ2V0SXRlbShwYXRoLCAoZXJyLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIHNldEl0ZW1Bc3luYyhwYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5zZXRJdGVtKHBhdGgsIHZhbHVlLCBlcnIgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgcmVtb3ZlSXRlbUFzeW5jKHBhdGgpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkucmVtb3ZlSXRlbShwYXRoLCBlcnIgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0QWxsS2V5c0FzeW5jKCkge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5nZXRBbGxLZXlzKChlcnIsIGtleXMpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoa2V5cyB8fCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBtdWx0aUdldChrZXlzKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLm11bHRpR2V0KGtleXMsIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBtdWx0aVJlbW92ZShrZXlzKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLm11bHRpUmVtb3ZlKGtleXMsIGVyciA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGtleXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgY2xlYXIoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLmNsZWFyKCk7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2VDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU3RvcmFnZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uva2V5c1wiKSk7XG5jb25zdCBTdG9yYWdlQ29udHJvbGxlciA9IHtcbiAgYXN5bmM6IDAsXG4gIGdldEl0ZW0ocGF0aCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gd3guZ2V0U3RvcmFnZVN5bmMocGF0aCk7XG4gIH0sXG4gIHNldEl0ZW0ocGF0aCwgdmFsdWUpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgd3guc2V0U3RvcmFnZVN5bmMocGF0aCwgdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFF1b3RhIGV4Y2VlZGVkXG4gICAgfVxuICB9LFxuICByZW1vdmVJdGVtKHBhdGgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3gucmVtb3ZlU3RvcmFnZVN5bmMocGF0aCk7XG4gIH0sXG4gIGdldEFsbEtleXMoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHJlcyA9IHd4LmdldFN0b3JhZ2VJbmZvU3luYygpO1xuICAgIHJldHVybiAoMCwgX2tleXMuZGVmYXVsdCkocmVzKTtcbiAgfSxcbiAgY2xlYXIoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4LmNsZWFyU3RvcmFnZVN5bmMoKTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9wcm9taXNlVXRpbHMgPSByZXF1aXJlKFwiLi9wcm9taXNlVXRpbHNcIik7XG5jbGFzcyBUYXNrUXVldWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInF1ZXVlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5xdWV1ZSA9IFtdO1xuICB9XG4gIGVucXVldWUodGFzaykge1xuICAgIGNvbnN0IHRhc2tDb21wbGV0ZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgdGhpcy5xdWV1ZS5wdXNoKHtcbiAgICAgIHRhc2s6IHRhc2ssXG4gICAgICBfY29tcGxldGlvbjogdGFza0NvbXBsZXRlXG4gICAgfSk7XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID09PSAxKSB7XG4gICAgICB0YXNrKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RlcXVldWUoKTtcbiAgICAgICAgdGFza0NvbXBsZXRlLnJlc29sdmUoKTtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5fZGVxdWV1ZSgpO1xuICAgICAgICB0YXNrQ29tcGxldGUucmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFza0NvbXBsZXRlO1xuICB9XG4gIF9kZXF1ZXVlKCkge1xuICAgIHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnF1ZXVlWzBdO1xuICAgICAgbmV4dC50YXNrKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RlcXVldWUoKTtcbiAgICAgICAgbmV4dC5fY29tcGxldGlvbi5yZXNvbHZlKCk7XG4gICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgIHRoaXMuX2RlcXVldWUoKTtcbiAgICAgICAgbmV4dC5fY29tcGxldGlvbi5yZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IFRhc2tRdWV1ZTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFRhc2tRdWV1ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9XZWFrTWFwMiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3dlYWstbWFwXCIpO1xudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2xlYXJBbGxTdGF0ZSA9IGNsZWFyQWxsU3RhdGU7XG5leHBvcnRzLmNvbW1pdFNlcnZlckNoYW5nZXMgPSBjb21taXRTZXJ2ZXJDaGFuZ2VzO1xuZXhwb3J0cy5kdXBsaWNhdGVTdGF0ZSA9IGR1cGxpY2F0ZVN0YXRlO1xuZXhwb3J0cy5lbnF1ZXVlVGFzayA9IGVucXVldWVUYXNrO1xuZXhwb3J0cy5lc3RpbWF0ZUF0dHJpYnV0ZSA9IGVzdGltYXRlQXR0cmlidXRlO1xuZXhwb3J0cy5lc3RpbWF0ZUF0dHJpYnV0ZXMgPSBlc3RpbWF0ZUF0dHJpYnV0ZXM7XG5leHBvcnRzLmdldE9iamVjdENhY2hlID0gZ2V0T2JqZWN0Q2FjaGU7XG5leHBvcnRzLmdldFBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzO1xuZXhwb3J0cy5nZXRTZXJ2ZXJEYXRhID0gZ2V0U2VydmVyRGF0YTtcbmV4cG9ydHMuZ2V0U3RhdGUgPSBnZXRTdGF0ZTtcbmV4cG9ydHMuaW5pdGlhbGl6ZVN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlO1xuZXhwb3J0cy5tZXJnZUZpcnN0UGVuZGluZ1N0YXRlID0gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucG9wUGVuZGluZ1N0YXRlID0gcG9wUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wdXNoUGVuZGluZ1N0YXRlID0gcHVzaFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucmVtb3ZlU3RhdGUgPSByZW1vdmVTdGF0ZTtcbmV4cG9ydHMuc2V0UGVuZGluZ09wID0gc2V0UGVuZGluZ09wO1xuZXhwb3J0cy5zZXRTZXJ2ZXJEYXRhID0gc2V0U2VydmVyRGF0YTtcbnZhciBfd2Vha01hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXBcIikpO1xudmFyIE9iamVjdFN0YXRlTXV0YXRpb25zID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vT2JqZWN0U3RhdGVNdXRhdGlvbnNcIikpO1xudmFyIF9UYXNrUXVldWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1Rhc2tRdWV1ZVwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoZSkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBfV2Vha01hcDIpIHJldHVybiBudWxsO1xuICB2YXIgciA9IG5ldyBfV2Vha01hcDIoKSxcbiAgICB0ID0gbmV3IF9XZWFrTWFwMigpO1xuICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGUgPyB0IDogcjtcbiAgfSkoZSk7XG59XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChlLCByKSB7XG4gIGlmICghciAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgIGRlZmF1bHQ6IGVcbiAgfTtcbiAgdmFyIHQgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUocik7XG4gIGlmICh0ICYmIHQuaGFzKGUpKSByZXR1cm4gdC5nZXQoZSk7XG4gIHZhciBuID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbFxuICB9O1xuICBmb3IgKHZhciB1IGluIGUpIGlmIChcImRlZmF1bHRcIiAhPT0gdSAmJiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHUpKSB7XG4gICAgdmFyIGkgPSBfT2JqZWN0JGRlZmluZVByb3BlcnR5ICYmIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID8gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdSkgOiBudWxsO1xuICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IF9PYmplY3QkZGVmaW5lUHJvcGVydHkobiwgdSwgaSkgOiBuW3VdID0gZVt1XTtcbiAgfVxuICByZXR1cm4gbi5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCBuKSwgbjtcbn1cbmxldCBvYmplY3RTdGF0ZSA9IG5ldyBfd2Vha01hcC5kZWZhdWx0KCk7XG5mdW5jdGlvbiBnZXRTdGF0ZShvYmopIHtcbiAgY29uc3QgY2xhc3NEYXRhID0gb2JqZWN0U3RhdGUuZ2V0KG9iaik7XG4gIHJldHVybiBjbGFzc0RhdGEgfHwgbnVsbDtcbn1cbmZ1bmN0aW9uIGluaXRpYWxpemVTdGF0ZShvYmosIGluaXRpYWwpIHtcbiAgbGV0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGlmICghaW5pdGlhbCkge1xuICAgIGluaXRpYWwgPSB7XG4gICAgICBzZXJ2ZXJEYXRhOiB7fSxcbiAgICAgIHBlbmRpbmdPcHM6IFt7fV0sXG4gICAgICBvYmplY3RDYWNoZToge30sXG4gICAgICB0YXNrczogbmV3IF9UYXNrUXVldWUuZGVmYXVsdCgpLFxuICAgICAgZXhpc3RlZDogZmFsc2VcbiAgICB9O1xuICB9XG4gIHN0YXRlID0gaW5pdGlhbDtcbiAgb2JqZWN0U3RhdGUuc2V0KG9iaiwgc3RhdGUpO1xuICByZXR1cm4gc3RhdGU7XG59XG5mdW5jdGlvbiByZW1vdmVTdGF0ZShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBvYmplY3RTdGF0ZS5kZWxldGUob2JqKTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gZ2V0U2VydmVyRGF0YShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuc2VydmVyRGF0YTtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBzZXRTZXJ2ZXJEYXRhKG9iaiwgYXR0cmlidXRlcykge1xuICBjb25zdCBzZXJ2ZXJEYXRhID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikuc2VydmVyRGF0YTtcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMuc2V0U2VydmVyRGF0YShzZXJ2ZXJEYXRhLCBhdHRyaWJ1dGVzKTtcbn1cbmZ1bmN0aW9uIGdldFBlbmRpbmdPcHMob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLnBlbmRpbmdPcHM7XG4gIH1cbiAgcmV0dXJuIFt7fV07XG59XG5mdW5jdGlvbiBzZXRQZW5kaW5nT3Aob2JqLCBhdHRyLCBvcCkge1xuICBjb25zdCBwZW5kaW5nT3BzID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikucGVuZGluZ09wcztcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMuc2V0UGVuZGluZ09wKHBlbmRpbmdPcHMsIGF0dHIsIG9wKTtcbn1cbmZ1bmN0aW9uIHB1c2hQZW5kaW5nU3RhdGUob2JqKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5wdXNoUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xufVxuZnVuY3Rpb24gcG9wUGVuZGluZ1N0YXRlKG9iaikge1xuICBjb25zdCBwZW5kaW5nT3BzID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikucGVuZGluZ09wcztcbiAgcmV0dXJuIE9iamVjdFN0YXRlTXV0YXRpb25zLnBvcFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbn1cbmZ1bmN0aW9uIG1lcmdlRmlyc3RQZW5kaW5nU3RhdGUob2JqKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzKG9iaik7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLm1lcmdlRmlyc3RQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG59XG5mdW5jdGlvbiBnZXRPYmplY3RDYWNoZShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUub2JqZWN0Q2FjaGU7XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuZnVuY3Rpb24gZXN0aW1hdGVBdHRyaWJ1dGUob2JqLCBhdHRyKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhKG9iaik7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzKG9iaik7XG4gIHJldHVybiBPYmplY3RTdGF0ZU11dGF0aW9ucy5lc3RpbWF0ZUF0dHJpYnV0ZShzZXJ2ZXJEYXRhLCBwZW5kaW5nT3BzLCBvYmosIGF0dHIpO1xufVxuZnVuY3Rpb24gZXN0aW1hdGVBdHRyaWJ1dGVzKG9iaikge1xuICBjb25zdCBzZXJ2ZXJEYXRhID0gZ2V0U2VydmVyRGF0YShvYmopO1xuICBjb25zdCBwZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcyhvYmopO1xuICByZXR1cm4gT2JqZWN0U3RhdGVNdXRhdGlvbnMuZXN0aW1hdGVBdHRyaWJ1dGVzKHNlcnZlckRhdGEsIHBlbmRpbmdPcHMsIG9iaik7XG59XG5mdW5jdGlvbiBjb21taXRTZXJ2ZXJDaGFuZ2VzKG9iaiwgY2hhbmdlcykge1xuICBjb25zdCBzdGF0ZSA9IGluaXRpYWxpemVTdGF0ZShvYmopO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5jb21taXRTZXJ2ZXJDaGFuZ2VzKHN0YXRlLnNlcnZlckRhdGEsIHN0YXRlLm9iamVjdENhY2hlLCBjaGFuZ2VzKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVUYXNrKG9iaiwgdGFzaykge1xuICBjb25zdCBzdGF0ZSA9IGluaXRpYWxpemVTdGF0ZShvYmopO1xuICByZXR1cm4gc3RhdGUudGFza3MuZW5xdWV1ZSh0YXNrKTtcbn1cbmZ1bmN0aW9uIGR1cGxpY2F0ZVN0YXRlKHNvdXJjZSwgZGVzdCkge1xuICBjb25zdCBvbGRTdGF0ZSA9IGluaXRpYWxpemVTdGF0ZShzb3VyY2UpO1xuICBjb25zdCBuZXdTdGF0ZSA9IGluaXRpYWxpemVTdGF0ZShkZXN0KTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2xkU3RhdGUuc2VydmVyRGF0YSkge1xuICAgIG5ld1N0YXRlLnNlcnZlckRhdGFba2V5XSA9IG9sZFN0YXRlLnNlcnZlckRhdGFba2V5XTtcbiAgfVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2xkU3RhdGUucGVuZGluZ09wcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRTdGF0ZS5wZW5kaW5nT3BzW2luZGV4XSkge1xuICAgICAgbmV3U3RhdGUucGVuZGluZ09wc1tpbmRleF1ba2V5XSA9IG9sZFN0YXRlLnBlbmRpbmdPcHNbaW5kZXhdW2tleV07XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG9sZFN0YXRlLm9iamVjdENhY2hlKSB7XG4gICAgbmV3U3RhdGUub2JqZWN0Q2FjaGVba2V5XSA9IG9sZFN0YXRlLm9iamVjdENhY2hlW2tleV07XG4gIH1cbiAgbmV3U3RhdGUuZXhpc3RlZCA9IG9sZFN0YXRlLmV4aXN0ZWQ7XG59XG5mdW5jdGlvbiBjbGVhckFsbFN0YXRlKCkge1xuICBvYmplY3RTdGF0ZSA9IG5ldyBfd2Vha01hcC5kZWZhdWx0KCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfd3MgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJ3c1wiKSk7XG52YXIgX1NvY2tldCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU29ja2V0LndlYXBwXCIpKTtcbi8qIGdsb2JhbCBXZWJTb2NrZXQgKi9cblxubGV0IFdlYlNvY2tldENvbnRyb2xsZXI7XG50cnkge1xuICBXZWJTb2NrZXRDb250cm9sbGVyID0gdHlwZW9mIFdlYlNvY2tldCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgV2ViU29ja2V0ID09PSAnb2JqZWN0JyA/IFdlYlNvY2tldCA6IG51bGw7XG59IGNhdGNoIChfKSB7XG4gIC8vIFdlYlNvY2tldCB1bmF2YWlsYWJsZVxufVxubW9kdWxlLmV4cG9ydHMgPSBXZWJTb2NrZXRDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gV2ViU29ja2V0Q29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbmNsYXNzIFhocldlYXBwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJVTlNFTlRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIk9QRU5FRFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiSEVBREVSU19SRUNFSVZFRFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiTE9BRElOR1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiRE9ORVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiaGVhZGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZWFkeVN0YXRlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzdGF0dXNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlc3BvbnNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZXNwb25zZVR5cGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlc3BvbnNlVGV4dFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVzcG9uc2VIZWFkZXJcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm1ldGhvZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwidXJsXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbmFib3J0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbnByb2dyZXNzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbmVycm9yXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlcXVlc3RUYXNrXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5VTlNFTlQgPSAwO1xuICAgIHRoaXMuT1BFTkVEID0gMTtcbiAgICB0aGlzLkhFQURFUlNfUkVDRUlWRUQgPSAyO1xuICAgIHRoaXMuTE9BRElORyA9IDM7XG4gICAgdGhpcy5ET05FID0gNDtcbiAgICB0aGlzLmhlYWRlciA9IHt9O1xuICAgIHRoaXMucmVhZHlTdGF0ZSA9IHRoaXMuRE9ORTtcbiAgICB0aGlzLnN0YXR1cyA9IDA7XG4gICAgdGhpcy5yZXNwb25zZSA9ICcnO1xuICAgIHRoaXMucmVzcG9uc2VUeXBlID0gJyc7XG4gICAgdGhpcy5yZXNwb25zZVRleHQgPSAnJztcbiAgICB0aGlzLnJlc3BvbnNlSGVhZGVyID0ge307XG4gICAgdGhpcy5tZXRob2QgPSAnJztcbiAgICB0aGlzLnVybCA9ICcnO1xuICAgIHRoaXMub25hYm9ydCA9ICgpID0+IHt9O1xuICAgIHRoaXMub25wcm9ncmVzcyA9ICgpID0+IHt9O1xuICAgIHRoaXMub25lcnJvciA9ICgpID0+IHt9O1xuICAgIHRoaXMub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge307XG4gICAgdGhpcy5yZXF1ZXN0VGFzayA9IG51bGw7XG4gIH1cbiAgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkge1xuICAgIGxldCBoZWFkZXIgPSAnJztcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnJlc3BvbnNlSGVhZGVyKSB7XG4gICAgICBoZWFkZXIgKz0ga2V5ICsgJzonICsgdGhpcy5nZXRSZXNwb25zZUhlYWRlcihrZXkpICsgJ1xcclxcbic7XG4gICAgfVxuICAgIHJldHVybiBoZWFkZXI7XG4gIH1cbiAgZ2V0UmVzcG9uc2VIZWFkZXIoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VIZWFkZXJba2V5XTtcbiAgfVxuICBzZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpIHtcbiAgICB0aGlzLmhlYWRlcltrZXldID0gdmFsdWU7XG4gIH1cbiAgb3BlbihtZXRob2QsIHVybCkge1xuICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICB9XG4gIGFib3J0KCkge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0VGFzaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlcXVlc3RUYXNrLmFib3J0KCk7XG4gICAgdGhpcy5zdGF0dXMgPSAwO1xuICAgIHRoaXMucmVzcG9uc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vbmFib3J0KCk7XG4gICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UoKTtcbiAgfVxuICBzZW5kKGRhdGEpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5yZXF1ZXN0VGFzayA9IHd4LnJlcXVlc3Qoe1xuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcixcbiAgICAgIHJlc3BvbnNlVHlwZTogdGhpcy5yZXNwb25zZVR5cGUsXG4gICAgICBzdWNjZXNzOiByZXMgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHJlcy5zdGF0dXNDb2RlO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzLmRhdGE7XG4gICAgICAgIHRoaXMucmVzcG9uc2VIZWFkZXIgPSByZXMuaGVhZGVyO1xuICAgICAgICB0aGlzLnJlc3BvbnNlVGV4dCA9ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHJlcy5kYXRhKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgIHRoaXMub25yZWFkeXN0YXRlY2hhbmdlKCk7XG4gICAgICB9LFxuICAgICAgZmFpbDogZXJyID0+IHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5vbmVycm9yKGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZXF1ZXN0VGFzay5vblByb2dyZXNzVXBkYXRlKHJlcyA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogcmVzLnRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGUgIT09IDAsXG4gICAgICAgIGxvYWRlZDogcmVzLnRvdGFsQnl0ZXNXcml0dGVuLFxuICAgICAgICB0b3RhbDogcmVzLnRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGVcbiAgICAgIH07XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm9ucHJvZ3Jlc3MoZXZlbnQpO1xuICAgIH0pO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IFhocldlYXBwO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gWGhyV2VhcHA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGFycmF5Q29udGFpbnNPYmplY3Q7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbmZ1bmN0aW9uIGFycmF5Q29udGFpbnNPYmplY3QoYXJyYXksIG9iamVjdCkge1xuICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKGFycmF5KS5jYWxsKGFycmF5LCBvYmplY3QpID4gLTEpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJyYXlbaV0gaW5zdGFuY2VvZiBQYXJzZU9iamVjdCAmJiBhcnJheVtpXS5jbGFzc05hbWUgPT09IG9iamVjdC5jbGFzc05hbWUgJiYgYXJyYXlbaV0uX2dldElkKCkgPT09IG9iamVjdC5fZ2V0SWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gY2FuQmVTZXJpYWxpemVkO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG5mdW5jdGlvbiBjYW5CZVNlcmlhbGl6ZWQob2JqKSB7XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgYXR0cmlidXRlcyA9IG9iai5hdHRyaWJ1dGVzO1xuICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgIGNvbnN0IHZhbCA9IGF0dHJpYnV0ZXNbYXR0cl07XG4gICAgaWYgKCFjYW5CZVNlcmlhbGl6ZWRIZWxwZXIodmFsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNhbkJlU2VyaWFsaXplZEhlbHBlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgcmV0dXJuICEhdmFsdWUuaWQ7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0KSB7XG4gICAgaWYgKHZhbHVlLnVybCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFjYW5CZVNlcmlhbGl6ZWRIZWxwZXIodmFsdWVbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgaWYgKCFjYW5CZVNlcmlhbGl6ZWRIZWxwZXIodmFsdWVba10pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBkZWNvZGU7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xudmFyIF9QYXJzZVBvbHlnb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUG9seWdvblwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xuZnVuY3Rpb24gZGVjb2RlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSkge1xuICAgIGNvbnN0IGR1cCA9IFtdO1xuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KSh2YWx1ZSkuY2FsbCh2YWx1ZSwgKHYsIGkpID0+IHtcbiAgICAgIGR1cFtpXSA9IGRlY29kZSh2KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZHVwO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUuX19vcCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7XG4gICAgICBvcEZyb21KU09OXG4gICAgfSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT3AoKTtcbiAgICByZXR1cm4gb3BGcm9tSlNPTih2YWx1ZSk7XG4gIH1cbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBpZiAodmFsdWUuX190eXBlID09PSAnUG9pbnRlcicgJiYgdmFsdWUuY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LmZyb21KU09OKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWUuX190eXBlID09PSAnT2JqZWN0JyAmJiB2YWx1ZS5jbGFzc05hbWUpIHtcbiAgICByZXR1cm4gUGFyc2VPYmplY3QuZnJvbUpTT04odmFsdWUpO1xuICB9XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdSZWxhdGlvbicpIHtcbiAgICAvLyBUaGUgcGFyZW50IGFuZCBrZXkgZmllbGRzIHdpbGwgYmUgcG9wdWxhdGVkIGJ5IHRoZSBwYXJlbnRcbiAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KG51bGwsIG51bGwpO1xuICAgIHJlbGF0aW9uLnRhcmdldENsYXNzTmFtZSA9IHZhbHVlLmNsYXNzTmFtZTtcbiAgICByZXR1cm4gcmVsYXRpb247XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ0RhdGUnKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLmlzbyk7XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ0ZpbGUnKSB7XG4gICAgcmV0dXJuIF9QYXJzZUZpbGUuZGVmYXVsdC5mcm9tSlNPTih2YWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ0dlb1BvaW50Jykge1xuICAgIHJldHVybiBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCh7XG4gICAgICBsYXRpdHVkZTogdmFsdWUubGF0aXR1ZGUsXG4gICAgICBsb25naXR1ZGU6IHZhbHVlLmxvbmdpdHVkZVxuICAgIH0pO1xuICB9XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdQb2x5Z29uJykge1xuICAgIHJldHVybiBuZXcgX1BhcnNlUG9seWdvbi5kZWZhdWx0KHZhbHVlLmNvb3JkaW5hdGVzKTtcbiAgfVxuICBjb25zdCBjb3B5ID0ge307XG4gIGZvciAoY29uc3QgayBpbiB2YWx1ZSkge1xuICAgIGNvcHlba10gPSBkZWNvZGUodmFsdWVba10pO1xuICB9XG4gIHJldHVybiBjb3B5O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX3N0YXJ0c1dpdGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3N0YXJ0cy13aXRoXCIpKTtcbnZhciBfY29uY2F0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXRcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VBQ0wgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQUNMXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbnZhciBfUGFyc2VQb2x5Z29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVBvbHlnb25cIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbmZ1bmN0aW9uIGVuY29kZSh2YWx1ZSwgZGlzYWxsb3dPYmplY3RzLCBmb3JjZVBvaW50ZXJzLCBzZWVuLCBvZmZsaW5lKSB7XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICBpZiAoZGlzYWxsb3dPYmplY3RzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlIE9iamVjdHMgbm90IGFsbG93ZWQgaGVyZScpO1xuICAgIH1cbiAgICBjb25zdCBzZWVuRW50cnkgPSB2YWx1ZS5pZCA/IHZhbHVlLmNsYXNzTmFtZSArICc6JyArIHZhbHVlLmlkIDogdmFsdWU7XG4gICAgaWYgKGZvcmNlUG9pbnRlcnMgfHwgIXNlZW4gfHwgKDAsIF9pbmRleE9mLmRlZmF1bHQpKHNlZW4pLmNhbGwoc2Vlbiwgc2VlbkVudHJ5KSA+IC0xIHx8IHZhbHVlLmRpcnR5KCkgfHwgKDAsIF9rZXlzLmRlZmF1bHQpKHZhbHVlLl9nZXRTZXJ2ZXJEYXRhKCkpLmxlbmd0aCA8IDEpIHtcbiAgICAgIHZhciBfY29udGV4dDtcbiAgICAgIGlmIChvZmZsaW5lICYmICgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShfY29udGV4dCA9IHZhbHVlLl9nZXRJZCgpKS5jYWxsKF9jb250ZXh0LCAnbG9jYWwnKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9PZmZsaW5lUG9pbnRlcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLnRvUG9pbnRlcigpO1xuICAgIH1cbiAgICBzZWVuID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoc2VlbikuY2FsbChzZWVuLCBzZWVuRW50cnkpO1xuICAgIHJldHVybiB2YWx1ZS5fdG9GdWxsSlNPTihzZWVuLCBvZmZsaW5lKTtcbiAgfVxuICBjb25zdCB7XG4gICAgT3BcbiAgfSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT3AoKTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT3AgfHwgdmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQgfHwgdmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VQb2x5Z29uLmRlZmF1bHQgfHwgdmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvSlNPTigpO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCkge1xuICAgIGlmICghdmFsdWUudXJsKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gZW5jb2RlIGFuIHVuc2F2ZWQgZmlsZS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnRvSlNPTigpO1xuICB9XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIGVuY29kZSBhbiBpbnZhbGlkIGRhdGUuJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdEYXRlJyxcbiAgICAgIGlzbzogdmFsdWUudG9KU09OKClcbiAgICB9O1xuICB9XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBSZWdFeHBdJyAmJiB0eXBlb2YgdmFsdWUuc291cmNlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZS5zb3VyY2U7XG4gIH1cbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gKDAsIF9tYXAuZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsIHYgPT4ge1xuICAgICAgcmV0dXJuIGVuY29kZSh2LCBkaXNhbGxvd09iamVjdHMsIGZvcmNlUG9pbnRlcnMsIHNlZW4sIG9mZmxpbmUpO1xuICAgIH0pO1xuICB9XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgICBvdXRwdXRba10gPSBlbmNvZGUodmFsdWVba10sIGRpc2FsbG93T2JqZWN0cywgZm9yY2VQb2ludGVycywgc2Vlbiwgb2ZmbGluZSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gX2RlZmF1bHQodmFsdWUsIGRpc2FsbG93T2JqZWN0cywgZm9yY2VQb2ludGVycywgc2Vlbiwgb2ZmbGluZSkge1xuICByZXR1cm4gZW5jb2RlKHZhbHVlLCAhIWRpc2FsbG93T2JqZWN0cywgISFmb3JjZVBvaW50ZXJzLCBzZWVuIHx8IFtdLCBvZmZsaW5lKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXF1YWxzO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VBQ0wgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQUNMXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbmZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIGNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgaWYgKHRvU3RyaW5nLmNhbGwoYSkgPT09ICdbb2JqZWN0IERhdGVdJyB8fCB0b1N0cmluZy5jYWxsKGIpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICBjb25zdCBkYXRlQSA9IG5ldyBEYXRlKGEpO1xuICAgIGNvbnN0IGRhdGVCID0gbmV3IERhdGUoYik7XG4gICAgcmV0dXJuICtkYXRlQSA9PT0gK2RhdGVCO1xuICB9XG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFhIHx8IHR5cGVvZiBhICE9PSAnb2JqZWN0Jykge1xuICAgIC8vIGEgaXMgYSBwcmltaXRpdmVcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgfVxuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGEpIHx8ICgwLCBfaXNBcnJheS5kZWZhdWx0KShiKSkge1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKGEpIHx8ICEoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gYS5sZW5ndGg7IGktLTspIHtcbiAgICAgIGlmICghZXF1YWxzKGFbaV0sIGJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBpZiAoYSBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0IHx8IGEgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQgfHwgYSBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQgfHwgYSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgcmV0dXJuIGEuZXF1YWxzKGIpO1xuICB9XG4gIGlmIChiIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICBpZiAoYS5fX3R5cGUgPT09ICdPYmplY3QnIHx8IGEuX190eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiBhLm9iamVjdElkID09PSBiLmlkICYmIGEuY2xhc3NOYW1lID09PSBiLmNsYXNzTmFtZTtcbiAgICB9XG4gIH1cbiAgaWYgKCgwLCBfa2V5cy5kZWZhdWx0KShhKS5sZW5ndGggIT09ICgwLCBfa2V5cy5kZWZhdWx0KShiKS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBrIGluIGEpIHtcbiAgICBpZiAoIWVxdWFscyhhW2tdLCBiW2tdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBlc2NhcGU7XG5jb25zdCBlbmNvZGVkID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgJy8nOiAnJiN4MkY7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnXCInOiAnJnF1b3Q7J1xufTtcbmZ1bmN0aW9uIGVzY2FwZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bJjw+XFwvJ1wiXS9nLCBmdW5jdGlvbiAoY2hhcikge1xuICAgIHJldHVybiBlbmNvZGVkW2NoYXJdO1xuICB9KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gaXNSZXZvY2FibGVTZXNzaW9uO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG5mdW5jdGlvbiBpc1Jldm9jYWJsZVNlc3Npb24odG9rZW4pIHtcbiAgcmV0dXJuICgwLCBfaW5kZXhPZi5kZWZhdWx0KSh0b2tlbikuY2FsbCh0b2tlbiwgJ3I6JykgPiAtMTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gcGFyc2VEYXRlO1xudmFyIF9wYXJzZUludDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3BhcnNlLWludFwiKSk7XG5mdW5jdGlvbiBwYXJzZURhdGUoaXNvODYwMSkge1xuICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKCdeKFswLTldezEsNH0pLShbMC05XXsxLDJ9KS0oWzAtOV17MSwyfSknICsgJ1QnICsgJyhbMC05XXsxLDJ9KTooWzAtOV17MSwyfSk6KFswLTldezEsMn0pJyArICcoLihbMC05XSspKT8nICsgJ1okJyk7XG4gIGNvbnN0IG1hdGNoID0gcmVnZXhwLmV4ZWMoaXNvODYwMSk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB5ZWFyID0gKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbMV0pIHx8IDA7XG4gIGNvbnN0IG1vbnRoID0gKCgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzJdKSB8fCAxKSAtIDE7XG4gIGNvbnN0IGRheSA9ICgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzNdKSB8fCAwO1xuICBjb25zdCBob3VyID0gKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbNF0pIHx8IDA7XG4gIGNvbnN0IG1pbnV0ZSA9ICgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzVdKSB8fCAwO1xuICBjb25zdCBzZWNvbmQgPSAoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFs2XSkgfHwgMDtcbiAgY29uc3QgbWlsbGkgPSAoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFs4XSkgfHwgMDtcbiAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaSkpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNvbnRpbnVlV2hpbGUgPSBjb250aW51ZVdoaWxlO1xuZXhwb3J0cy5yZXNvbHZpbmdQcm9taXNlID0gcmVzb2x2aW5nUHJvbWlzZTtcbmV4cG9ydHMud2hlbiA9IHdoZW47XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG4vLyBDcmVhdGUgRGVmZXJyZWQgUHJvbWlzZVxuZnVuY3Rpb24gcmVzb2x2aW5nUHJvbWlzZSgpIHtcbiAgbGV0IHJlcztcbiAgbGV0IHJlajtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXMgPSByZXNvbHZlO1xuICAgIHJlaiA9IHJlamVjdDtcbiAgfSk7XG4gIGNvbnN0IGRlZmVyID0gcHJvbWlzZTtcbiAgZGVmZXIucmVzb2x2ZSA9IHJlcztcbiAgZGVmZXIucmVqZWN0ID0gcmVqO1xuICByZXR1cm4gZGVmZXI7XG59XG5mdW5jdGlvbiB3aGVuKHByb21pc2VzKSB7XG4gIGxldCBvYmplY3RzO1xuICBjb25zdCBhcnJheUFyZ3VtZW50ID0gKDAsIF9pc0FycmF5LmRlZmF1bHQpKHByb21pc2VzKTtcbiAgaWYgKGFycmF5QXJndW1lbnQpIHtcbiAgICBvYmplY3RzID0gcHJvbWlzZXM7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0cyA9IGFyZ3VtZW50cztcbiAgfVxuICBsZXQgdG90YWwgPSBvYmplY3RzLmxlbmd0aDtcbiAgbGV0IGhhZEVycm9yID0gZmFsc2U7XG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgY29uc3QgcmV0dXJuVmFsdWUgPSBhcnJheUFyZ3VtZW50ID8gW3Jlc3VsdHNdIDogcmVzdWx0cztcbiAgY29uc3QgZXJyb3JzID0gW107XG4gIHJlc3VsdHMubGVuZ3RoID0gb2JqZWN0cy5sZW5ndGg7XG4gIGVycm9ycy5sZW5ndGggPSBvYmplY3RzLmxlbmd0aDtcbiAgaWYgKHRvdGFsID09PSAwKSB7XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gIH1cbiAgY29uc3QgcHJvbWlzZSA9IHJlc29sdmluZ1Byb21pc2UoKTtcbiAgY29uc3QgcmVzb2x2ZU9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0b3RhbC0tO1xuICAgIGlmICh0b3RhbCA8PSAwKSB7XG4gICAgICBpZiAoaGFkRXJyb3IpIHtcbiAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3JzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb21pc2UucmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBjaGFpbiA9IGZ1bmN0aW9uIChvYmplY3QsIGluZGV4KSB7XG4gICAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9iamVjdC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSByZXN1bHQ7XG4gICAgICAgIHJlc29sdmVPbmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBlcnJvcnNbaW5kZXhdID0gZXJyb3I7XG4gICAgICAgIGhhZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZU9uZSgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdHNbaW5kZXhdID0gb2JqZWN0O1xuICAgICAgcmVzb2x2ZU9uZSgpO1xuICAgIH1cbiAgfTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhaW4ob2JqZWN0c1tpXSwgaSk7XG4gIH1cbiAgcmV0dXJuIHByb21pc2U7XG59XG5mdW5jdGlvbiBjb250aW51ZVdoaWxlKHRlc3QsIGVtaXR0ZXIpIHtcbiAgaWYgKHRlc3QoKSkge1xuICAgIHJldHVybiBlbWl0dGVyKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gY29udGludWVXaGlsZSh0ZXN0LCBlbWl0dGVyKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVuaXF1ZTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2FycmF5Q29udGFpbnNPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2FycmF5Q29udGFpbnNPYmplY3RcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuZnVuY3Rpb24gdW5pcXVlKGFycikge1xuICBjb25zdCB1bmlxdWVzID0gW107XG4gICgwLCBfZm9yRWFjaC5kZWZhdWx0KShhcnIpLmNhbGwoYXJyLCB2YWx1ZSA9PiB7XG4gICAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICBpZiAoISgwLCBfYXJyYXlDb250YWluc09iamVjdC5kZWZhdWx0KSh1bmlxdWVzLCB2YWx1ZSkpIHtcbiAgICAgICAgdW5pcXVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KSh1bmlxdWVzKS5jYWxsKHVuaXF1ZXMsIHZhbHVlKSA8IDApIHtcbiAgICAgICAgdW5pcXVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdW5pcXVlcztcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdW5zYXZlZENoaWxkcmVuO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBvZiB1bnNhdmVkIGNoaWxkcmVuLCB3aGljaCBhcmUgZWl0aGVyIFBhcnNlIE9iamVjdHMgb3IgRmlsZXMuXG4gKiBJZiBpdCBlbmNvdW50ZXJzIGFueSBkaXJ0eSBPYmplY3RzIHdpdGhvdXQgSWRzLCBpdCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1BhcnNlLk9iamVjdH0gb2JqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93RGVlcFVuc2F2ZWRcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdW5zYXZlZENoaWxkcmVuKG9iaiwgYWxsb3dEZWVwVW5zYXZlZCkge1xuICBjb25zdCBlbmNvdW50ZXJlZCA9IHtcbiAgICBvYmplY3RzOiB7fSxcbiAgICBmaWxlczogW11cbiAgfTtcbiAgY29uc3QgaWRlbnRpZmllciA9IG9iai5jbGFzc05hbWUgKyAnOicgKyBvYmouX2dldElkKCk7XG4gIGVuY291bnRlcmVkLm9iamVjdHNbaWRlbnRpZmllcl0gPSBvYmouZGlydHkoKSA/IG9iaiA6IHRydWU7XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBvYmouYXR0cmlidXRlcztcbiAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXNbYXR0cl0gPT09ICdvYmplY3QnKSB7XG4gICAgICB0cmF2ZXJzZShhdHRyaWJ1dGVzW2F0dHJdLCBlbmNvdW50ZXJlZCwgZmFsc2UsICEhYWxsb3dEZWVwVW5zYXZlZCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHVuc2F2ZWQgPSBbXTtcbiAgZm9yIChjb25zdCBpZCBpbiBlbmNvdW50ZXJlZC5vYmplY3RzKSB7XG4gICAgaWYgKGlkICE9PSBpZGVudGlmaWVyICYmIGVuY291bnRlcmVkLm9iamVjdHNbaWRdICE9PSB0cnVlKSB7XG4gICAgICB1bnNhdmVkLnB1c2goZW5jb3VudGVyZWQub2JqZWN0c1tpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKDAsIF9jb25jYXQuZGVmYXVsdCkodW5zYXZlZCkuY2FsbCh1bnNhdmVkLCBlbmNvdW50ZXJlZC5maWxlcyk7XG59XG5mdW5jdGlvbiB0cmF2ZXJzZShvYmosIGVuY291bnRlcmVkLCBzaG91bGRUaHJvdywgYWxsb3dEZWVwVW5zYXZlZCkge1xuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgIGlmICghb2JqLmlkICYmIHNob3VsZFRocm93KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBwb2ludGVyIHRvIGFuIHVuc2F2ZWQgT2JqZWN0LicpO1xuICAgIH1cbiAgICBjb25zdCBpZGVudGlmaWVyID0gb2JqLmNsYXNzTmFtZSArICc6JyArIG9iai5fZ2V0SWQoKTtcbiAgICBpZiAoIWVuY291bnRlcmVkLm9iamVjdHNbaWRlbnRpZmllcl0pIHtcbiAgICAgIGVuY291bnRlcmVkLm9iamVjdHNbaWRlbnRpZmllcl0gPSBvYmouZGlydHkoKSA/IG9iaiA6IHRydWU7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gb2JqLmF0dHJpYnV0ZXM7XG4gICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXNbYXR0cl0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdHJhdmVyc2UoYXR0cmlidXRlc1thdHRyXSwgZW5jb3VudGVyZWQsICFhbGxvd0RlZXBVbnNhdmVkLCBhbGxvd0RlZXBVbnNhdmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG9iaiBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCkge1xuICAgIHZhciBfY29udGV4dDtcbiAgICBpZiAoIW9iai51cmwoKSAmJiAoMCwgX2luZGV4T2YuZGVmYXVsdCkoX2NvbnRleHQgPSBlbmNvdW50ZXJlZC5maWxlcykuY2FsbChfY29udGV4dCwgb2JqKSA8IDApIHtcbiAgICAgIGVuY291bnRlcmVkLmZpbGVzLnB1c2gob2JqKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChvYmogaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqKSkge1xuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShvYmopLmNhbGwob2JqLCBlbCA9PiB7XG4gICAgICBpZiAodHlwZW9mIGVsID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0cmF2ZXJzZShlbCwgZW5jb3VudGVyZWQsIHNob3VsZFRocm93LCBhbGxvd0RlZXBVbnNhdmVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgaWYgKHR5cGVvZiBvYmpba10gPT09ICdvYmplY3QnKSB7XG4gICAgICB0cmF2ZXJzZShvYmpba10sIGVuY291bnRlcmVkLCBzaG91bGRUaHJvdywgYWxsb3dEZWVwVW5zYXZlZCk7XG4gICAgfVxuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF91dWlkID0gcmVxdWlyZShcInV1aWRcIik7XG5sZXQgdXVpZCA9IF91dWlkLnY0O1xubW9kdWxlLmV4cG9ydHMgPSB1dWlkO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdXVpZDsiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEVuY3J5cHRlZFBERkVycm9yLCBGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yLCBGb3JlaWduUGFnZUVycm9yLCBSZW1vdmVQYWdlRnJvbUVtcHR5RG9jdW1lbnRFcnJvciwgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCBQREZFbWJlZGRlZFBhZ2UgZnJvbSBcIi4vUERGRW1iZWRkZWRQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi9QREZGb250XCI7XG5pbXBvcnQgUERGSW1hZ2UgZnJvbSBcIi4vUERGSW1hZ2VcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuL1BERlBhZ2VcIjtcbmltcG9ydCBQREZGb3JtIGZyb20gXCIuL2Zvcm0vUERGRm9ybVwiO1xuaW1wb3J0IHsgUGFnZVNpemVzIH0gZnJvbSBcIi4vc2l6ZXNcIjtcbmltcG9ydCB7IEN1c3RvbUZvbnRFbWJlZGRlciwgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLCBKcGVnRW1iZWRkZXIsIFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yLCBQREZDYXRhbG9nLCBQREZDb250ZXh0LCBQREZEaWN0LCBQREZIZXhTdHJpbmcsIFBERk5hbWUsIFBERk9iamVjdENvcGllciwgUERGUGFnZUVtYmVkZGVyLCBQREZQYWdlTGVhZiwgUERGUGFnZVRyZWUsIFBERlBhcnNlciwgUERGU3RyZWFtV3JpdGVyLCBQREZTdHJpbmcsIFBERldyaXRlciwgUG5nRW1iZWRkZXIsIFN0YW5kYXJkRm9udEVtYmVkZGVyLCBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yLCB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBQYXJzZVNwZWVkcywgfSBmcm9tIFwiLi9QREZEb2N1bWVudE9wdGlvbnNcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQsIGFzc2VydE9yVW5kZWZpbmVkLCBhc3NlcnRSYW5nZSwgQ2FjaGUsIGNhbkJlQ29udmVydGVkVG9VaW50OEFycmF5LCBlbmNvZGVUb0Jhc2U2NCwgaXNTdGFuZGFyZEZvbnQsIHBsdWNrSW5kaWNlcywgcmFuZ2UsIHRvVWludDhBcnJheSwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBGaWxlRW1iZWRkZXIsIHsgQUZSZWxhdGlvbnNoaXAgfSBmcm9tIFwiLi4vY29yZS9lbWJlZGRlcnMvRmlsZUVtYmVkZGVyXCI7XG5pbXBvcnQgUERGRW1iZWRkZWRGaWxlIGZyb20gXCIuL1BERkVtYmVkZGVkRmlsZVwiO1xuaW1wb3J0IFBERkphdmFTY3JpcHQgZnJvbSBcIi4vUERGSmF2YVNjcmlwdFwiO1xuaW1wb3J0IEphdmFTY3JpcHRFbWJlZGRlciBmcm9tIFwiLi4vY29yZS9lbWJlZGRlcnMvSmF2YVNjcmlwdEVtYmVkZGVyXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBQREYgZG9jdW1lbnQuXG4gKi9cbnZhciBQREZEb2N1bWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZEb2N1bWVudChjb250ZXh0LCBpZ25vcmVFbmNyeXB0aW9uLCB1cGRhdGVNZXRhZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvKiogVGhlIGRlZmF1bHQgd29yZCBicmVha3MgdXNlZCBpbiBQREZQYWdlLmRyYXdUZXh0ICovXG4gICAgICAgIHRoaXMuZGVmYXVsdFdvcmRCcmVha3MgPSBbJyAnXTtcbiAgICAgICAgdGhpcy5jb21wdXRlUGFnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcGFnZXMgPSBbXTtcbiAgICAgICAgICAgIF90aGlzLmNhdGFsb2cuUGFnZXMoKS50cmF2ZXJzZShmdW5jdGlvbiAobm9kZSwgcmVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBQREZQYWdlTGVhZikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFnZSA9IF90aGlzLnBhZ2VNYXAuZ2V0KG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBQREZQYWdlLm9mKG5vZGUsIHJlZiwgX3RoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucGFnZU1hcC5zZXQobm9kZSwgcGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFnZXMucHVzaChwYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYWdlcztcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRPckNyZWF0ZUZvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYWNyb0Zvcm0gPSBfdGhpcy5jYXRhbG9nLmdldE9yQ3JlYXRlQWNyb0Zvcm0oKTtcbiAgICAgICAgICAgIHJldHVybiBQREZGb3JtLm9mKGFjcm9Gb3JtLCBfdGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIGFzc2VydElzKGNvbnRleHQsICdjb250ZXh0JywgW1tQREZDb250ZXh0LCAnUERGQ29udGV4dCddXSk7XG4gICAgICAgIGFzc2VydElzKGlnbm9yZUVuY3J5cHRpb24sICdpZ25vcmVFbmNyeXB0aW9uJywgWydib29sZWFuJ10pO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmNhdGFsb2cgPSBjb250ZXh0Lmxvb2t1cChjb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QpO1xuICAgICAgICB0aGlzLmlzRW5jcnlwdGVkID0gISFjb250ZXh0Lmxvb2t1cChjb250ZXh0LnRyYWlsZXJJbmZvLkVuY3J5cHQpO1xuICAgICAgICB0aGlzLnBhZ2VDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KHRoaXMuY29tcHV0ZVBhZ2VzKTtcbiAgICAgICAgdGhpcy5wYWdlTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmZvcm1DYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KHRoaXMuZ2V0T3JDcmVhdGVGb3JtKTtcbiAgICAgICAgdGhpcy5mb250cyA9IFtdO1xuICAgICAgICB0aGlzLmltYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLmVtYmVkZGVkUGFnZXMgPSBbXTtcbiAgICAgICAgdGhpcy5lbWJlZGRlZEZpbGVzID0gW107XG4gICAgICAgIHRoaXMuamF2YVNjcmlwdHMgPSBbXTtcbiAgICAgICAgaWYgKCFpZ25vcmVFbmNyeXB0aW9uICYmIHRoaXMuaXNFbmNyeXB0ZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRW5jcnlwdGVkUERGRXJyb3IoKTtcbiAgICAgICAgaWYgKHVwZGF0ZU1ldGFkYXRhKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVJbmZvRGljdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkIGFuIGV4aXN0aW5nIFtbUERGRG9jdW1lbnRdXS4gVGhlIGlucHV0IGRhdGEgY2FuIGJlIHByb3ZpZGVkIGluXG4gICAgICogbXVsdGlwbGUgZm9ybWF0czpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICB8IENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGBzdHJpbmdgICAgICAgfCBBIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAob3IgZGF0YSBVUkkpIGNvbnRhaW5pbmcgYSBQREYgfFxuICAgICAqIHwgYFVpbnQ4QXJyYXlgICB8IFRoZSByYXcgYnl0ZXMgb2YgYSBQREYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgQXJyYXlCdWZmZXJgIHwgVGhlIHJhdyBieXRlcyBvZiBhIFBERiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogLy8gcGRmPXN0cmluZ1xuICAgICAqIGNvbnN0IGJhc2U2NCA9XG4gICAgICogICdKVkJFUmkweExqY0tKWUdCZ1lFS0NqVWdNQ0J2WW1vS1BEd0tMMFpwYkhSbGNpQXZSbXhoZEdWRVpXTnZaR1VLTDB4bGJtJyArXG4gICAgICogICdkMGFDQXhNRFFLUGo0S2MzUnlaV0Z0Q25pY2N3cmhNbEFBd2FKMExuMlAxSnl5MUpMTTVFUmRjME1qQ3dVakU0V1FOQzRRJyArXG4gICAgICogICc2Y05sQ0Zaa3FHQ3FZR1NxRUpMTFpXTnVZR1ppWm1ia1l1WnNabWxtWkdSZ1ptbHVEQ1FOemMzTlRNMk56ZHpNWE14TWpRJyArXG4gICAgICogICd6dEZFS3l1RUswdUZ4RHVBQU9FUmRWQ21WdVpITjBjbVZoYlFwbGJtUnZZbW9LQ2pZZ01DQnZZbW9LUER3S0wwWnBiSFJsJyArXG4gICAgICogICdjaUF2Um14aGRHVkVaV052WkdVS0wxUjVjR1VnTDA5aWFsTjBiUW92VGlBMENpOUdhWEp6ZENBeU1Bb3ZUR1Z1WjNSb0lEJyArXG4gICAgICogICdJeE5RbytQZ3B6ZEhKbFlXMEtlSnhWajlHcXdqQU1odS96RkhrQnpUbzNuQ0NDaWlLSUhQRUlDdUpGM2NLb1NDdTJFOC9iJyArXG4gICAgICogICcyMHdQSXIxcDh2OS84a1ZoZ2lsbUdmYXdYMkNHYVZyZ2NBaTAvYnN5MGxyWDdJR1dwdko0aUpZRU4zZ0VtcnJHQmxRd0dzJyArXG4gICAgICogICdISE85VkJYMXdOcnhBcU1YODdSQkQ1eHBKdWRkcXdkODJ0akFIeHpWMVU1TFBneTUyREtYV25yMUxoZWcrai9jL3B6R1ZyJyArXG4gICAgICogICdpcVYwVmx3WlBYR1BDSmpFbHcveWJrd1VtZW9XZ3hlc0RYR2hISkMvRC9paWtwMUF2ODBwdEtVMEZkQkVlMjVwUGloQU0xJyArXG4gICAgICogICd1Nnl0Z2FhV2ZzMkhyejM1Q0pUMStFV21BS1pXNWtjM1J5WldGdENtVnVaRzlpYWdvS055QXdJRzlpYWdvOFBBb3ZVMmw2JyArXG4gICAgICogICdaU0E0Q2k5U2IyOTBJRElnTUNCU0NpOUdhV3gwWlhJZ0wwWnNZWFJsUkdWamIyUmxDaTlVZVhCbElDOVlVbVZtQ2k5TVpXJyArXG4gICAgICogICc1bmRHZ2dNemdLTDFjZ1d5QXhJRElnTWlCZENpOUpibVJsZUNCYklEQWdPQ0JkQ2o0K0NuTjBjbVZoYlFwNG5CWEV3UkVBJyArXG4gICAgICogICdFQkFFc0N3ejN2cnZSbU9PeXlPb0doWmR1dEhOMk1UNTVmSUFWb2NEK0FwbGJtUnpkSEpsWVcwS1pXNWtiMkpxQ2dwemRHJyArXG4gICAgICogICdGeWRIaHlaV1lLTlRFd0NpVWxSVTlHJ1xuICAgICAqXG4gICAgICogY29uc3QgZGF0YVVyaSA9ICdkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJyArIGJhc2U2NFxuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jMSA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoYmFzZTY0KVxuICAgICAqIGNvbnN0IHBkZkRvYzIgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKGRhdGFVcmkpXG4gICAgICpcbiAgICAgKiAvLyBwZGY9VWludDhBcnJheVxuICAgICAqIGltcG9ydCBmcyBmcm9tICdmcydcbiAgICAgKiBjb25zdCB1aW50OEFycmF5ID0gZnMucmVhZEZpbGVTeW5jKCd3aXRoX3VwZGF0ZV9zZWN0aW9ucy5wZGYnKVxuICAgICAqIGNvbnN0IHBkZkRvYzMgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKHVpbnQ4QXJyYXkpXG4gICAgICpcbiAgICAgKiAvLyBwZGY9QXJyYXlCdWZmZXJcbiAgICAgKiBjb25zdCB1cmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvd2l0aF91cGRhdGVfc2VjdGlvbnMucGRmJ1xuICAgICAqIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKHJlcyA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBwZGZEb2M0ID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChhcnJheUJ1ZmZlcilcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHBkZiBUaGUgaW5wdXQgZGF0YSBjb250YWluaW5nIGEgUERGIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBsb2FkaW5nIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGEgZG9jdW1lbnQgbG9hZGVkIGZyb20gdGhlIGlucHV0LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LmxvYWQgPSBmdW5jdGlvbiAocGRmLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgaWdub3JlRW5jcnlwdGlvbiwgX2IsIHBhcnNlU3BlZWQsIF9jLCB0aHJvd09uSW52YWxpZE9iamVjdCwgX2QsIHVwZGF0ZU1ldGFkYXRhLCBfZSwgY2FwTnVtYmVycywgYnl0ZXMsIGNvbnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9mKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9wdGlvbnMuaWdub3JlRW5jcnlwdGlvbiwgaWdub3JlRW5jcnlwdGlvbiA9IF9hID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hLCBfYiA9IG9wdGlvbnMucGFyc2VTcGVlZCwgcGFyc2VTcGVlZCA9IF9iID09PSB2b2lkIDAgPyBQYXJzZVNwZWVkcy5TbG93IDogX2IsIF9jID0gb3B0aW9ucy50aHJvd09uSW52YWxpZE9iamVjdCwgdGhyb3dPbkludmFsaWRPYmplY3QgPSBfYyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYywgX2QgPSBvcHRpb25zLnVwZGF0ZU1ldGFkYXRhLCB1cGRhdGVNZXRhZGF0YSA9IF9kID09PSB2b2lkIDAgPyB0cnVlIDogX2QsIF9lID0gb3B0aW9ucy5jYXBOdW1iZXJzLCBjYXBOdW1iZXJzID0gX2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhwZGYsICdwZGYnLCBbJ3N0cmluZycsIFVpbnQ4QXJyYXksIEFycmF5QnVmZmVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhpZ25vcmVFbmNyeXB0aW9uLCAnaWdub3JlRW5jcnlwdGlvbicsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHBhcnNlU3BlZWQsICdwYXJzZVNwZWVkJywgWydudW1iZXInXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyh0aHJvd09uSW52YWxpZE9iamVjdCwgJ3Rocm93T25JbnZhbGlkT2JqZWN0JywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSB0b1VpbnQ4QXJyYXkocGRmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFBERlBhcnNlci5mb3JCeXRlc1dpdGhPcHRpb25zKGJ5dGVzLCBwYXJzZVNwZWVkLCB0aHJvd09uSW52YWxpZE9iamVjdCwgY2FwTnVtYmVycykucGFyc2VEb2N1bWVudCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IF9mLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUERGRG9jdW1lbnQoY29udGV4dCwgaWdub3JlRW5jcnlwdGlvbiwgdXBkYXRlTWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgW1tQREZEb2N1bWVudF1dLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQuY3JlYXRlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCB1cGRhdGVNZXRhZGF0YSwgY29udGV4dCwgcGFnZVRyZWUsIHBhZ2VUcmVlUmVmLCBjYXRhbG9nO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIF9hID0gb3B0aW9ucy51cGRhdGVNZXRhZGF0YSwgdXBkYXRlTWV0YWRhdGEgPSBfYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hO1xuICAgICAgICAgICAgICAgIGNvbnRleHQgPSBQREZDb250ZXh0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgIHBhZ2VUcmVlID0gUERGUGFnZVRyZWUud2l0aENvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgcGFnZVRyZWVSZWYgPSBjb250ZXh0LnJlZ2lzdGVyKHBhZ2VUcmVlKTtcbiAgICAgICAgICAgICAgICBjYXRhbG9nID0gUERGQ2F0YWxvZy53aXRoQ29udGV4dEFuZFBhZ2VzKGNvbnRleHQsIHBhZ2VUcmVlUmVmKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QgPSBjb250ZXh0LnJlZ2lzdGVyKGNhdGFsb2cpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUERGRG9jdW1lbnQoY29udGV4dCwgZmFsc2UsIHVwZGF0ZU1ldGFkYXRhKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIGZvbnRraXQgaW5zdGFuY2UuIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBjdXN0b20gZm9udHMgY2FuXG4gICAgICogYmUgZW1iZWRkZWQuIFNlZSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL0hvcGRpbmcvcGRmLWxpYi90cmVlL21hc3RlciNmb250a2l0LWluc3RhbGxhdGlvbilcbiAgICAgKiBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBpbnN0YWxsIGFuZCByZWdpc3RlciBhIGZvbnRraXQgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiA+IFlvdSBkbyAqKm5vdCoqIG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCB0byBlbWJlZCBzdGFuZGFyZCBmb250cy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqIGltcG9ydCBmb250a2l0IGZyb20gJ0BwZGYtbGliL2ZvbnRraXQnXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIHBkZkRvYy5yZWdpc3RlckZvbnRraXQoZm9udGtpdClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb250a2l0IFRoZSBmb250a2l0IGluc3RhbmNlIHRvIGJlIHJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnJlZ2lzdGVyRm9udGtpdCA9IGZ1bmN0aW9uIChmb250a2l0KSB7XG4gICAgICAgIHRoaXMuZm9udGtpdCA9IGZvbnRraXQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIFtbUERGRm9ybV1dIGNvbnRhaW5pbmcgYWxsIGludGVyYWN0aXZlIGZpZWxkcyBmb3IgdGhpcyBkb2N1bWVudC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZmllbGRzID0gZm9ybS5nZXRGaWVsZHMoKVxuICAgICAqIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgKiAgIGNvbnN0IHR5cGUgPSBmaWVsZC5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICogICBjb25zdCBuYW1lID0gZmllbGQuZ2V0TmFtZSgpXG4gICAgICogICBjb25zb2xlLmxvZyhgJHt0eXBlfTogJHtuYW1lfWApXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgZm9ybSBmb3IgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0Rm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZvcm0gPSB0aGlzLmZvcm1DYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgaWYgKGZvcm0uaGFzWEZBKCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVtb3ZpbmcgWEZBIGZvcm0gZGF0YSBhcyBwZGYtbGliIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBvciB3cml0aW5nIFhGQScpO1xuICAgICAgICAgICAgZm9ybS5kZWxldGVYRkEoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgdGl0bGUgbWV0YWRhdGEuIFRoZSB0aXRsZSBhcHBlYXJzIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0aXRsZSA9IHBkZkRvYy5nZXRUaXRsZSgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgdGl0bGUgb2YgdGhpcyBkb2N1bWVudCwgaWYgaXQgaGFzIG9uZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0VGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5UaXRsZSk7XG4gICAgICAgIGlmICghdGl0bGUpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyh0aXRsZSk7XG4gICAgICAgIHJldHVybiB0aXRsZS5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIGF1dGhvciBtZXRhZGF0YS4gVGhlIGF1dGhvciBhcHBlYXJzIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBhdXRob3IgPSBwZGZEb2MuZ2V0QXV0aG9yKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBhdXRob3Igb2YgdGhpcyBkb2N1bWVudCwgaWYgaXQgaGFzIG9uZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0QXV0aG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXV0aG9yID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLkF1dGhvcik7XG4gICAgICAgIGlmICghYXV0aG9yKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcoYXV0aG9yKTtcbiAgICAgICAgcmV0dXJuIGF1dGhvci5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIHN1YmplY3QgbWV0YWRhdGEuIFRoZSBzdWJqZWN0IGFwcGVhcnMgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHN1YmplY3QgPSBwZGZEb2MuZ2V0U3ViamVjdCgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3ViamVjdCBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRTdWJqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3ViamVjdCA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5TdWJqZWN0KTtcbiAgICAgICAgaWYgKCFzdWJqZWN0KVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcoc3ViamVjdCk7XG4gICAgICAgIHJldHVybiBzdWJqZWN0LmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3Mga2V5d29yZHMgbWV0YWRhdGEuIFRoZSBrZXl3b3JkcyBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGtleXdvcmRzID0gcGRmRG9jLmdldEtleXdvcmRzKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBrZXl3b3JkcyBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgYW55LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRLZXl3b3JkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtleXdvcmRzID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLktleXdvcmRzKTtcbiAgICAgICAgaWYgKCFrZXl3b3JkcylcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKGtleXdvcmRzKTtcbiAgICAgICAgcmV0dXJuIGtleXdvcmRzLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgY3JlYXRvciBtZXRhZGF0YS4gVGhlIGNyZWF0b3IgYXBwZWFycyBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY3JlYXRvciA9IHBkZkRvYy5nZXRDcmVhdG9yKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjcmVhdG9yIG9mIHRoaXMgZG9jdW1lbnQsIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldENyZWF0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjcmVhdG9yID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLkNyZWF0b3IpO1xuICAgICAgICBpZiAoIWNyZWF0b3IpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhjcmVhdG9yKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0b3IuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBwcm9kdWNlciBtZXRhZGF0YS4gVGhlIHByb2R1Y2VyIGFwcGVhcnMgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHByb2R1Y2VyID0gcGRmRG9jLmdldFByb2R1Y2VyKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBwcm9kdWNlciBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRQcm9kdWNlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByb2R1Y2VyID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLlByb2R1Y2VyKTtcbiAgICAgICAgaWYgKCFwcm9kdWNlcilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKHByb2R1Y2VyKTtcbiAgICAgICAgcmV0dXJuIHByb2R1Y2VyLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgY3JlYXRpb24gZGF0ZSBtZXRhZGF0YS4gVGhlIGNyZWF0aW9uIGRhdGUgYXBwZWFycyBpblxuICAgICAqIHRoZSBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY3JlYXRpb25EYXRlID0gcGRmRG9jLmdldENyZWF0aW9uRGF0ZSgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBEYXRlIGNvbnRhaW5pbmcgdGhlIGNyZWF0aW9uIGRhdGUgb2YgdGhpcyBkb2N1bWVudCxcbiAgICAgKiAgICAgICAgICBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRDcmVhdGlvbkRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjcmVhdGlvbkRhdGUgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuQ3JlYXRpb25EYXRlKTtcbiAgICAgICAgaWYgKCFjcmVhdGlvbkRhdGUpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhjcmVhdGlvbkRhdGUpO1xuICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlLmRlY29kZURhdGUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgbW9kaWZpY2F0aW9uIGRhdGUgbWV0YWRhdGEuIFRoZSBtb2RpZmljYXRpb24gZGF0ZVxuICAgICAqIGFwcGVhcnMgaW4gdGhlIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG1vZGlmaWNhdGlvbiA9IHBkZkRvYy5nZXRNb2RpZmljYXRpb25EYXRlKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIERhdGUgY29udGFpbmluZyB0aGUgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhpcyBkb2N1bWVudCxcbiAgICAgKiAgICAgICAgICBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRNb2RpZmljYXRpb25EYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5Nb2REYXRlKTtcbiAgICAgICAgaWYgKCFtb2RpZmljYXRpb25EYXRlKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcobW9kaWZpY2F0aW9uRGF0ZSk7XG4gICAgICAgIHJldHVybiBtb2RpZmljYXRpb25EYXRlLmRlY29kZURhdGUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgdGl0bGUgbWV0YWRhdGEuIFRoZSB0aXRsZSB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldFRpdGxlKCfwn6WaIFRoZSBMaWZlIG9mIGFuIEVnZyDwn42zJylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRvIGRpc3BsYXkgdGhlIHRpdGxlIGluIHRoZSB3aW5kb3cncyB0aXRsZSBiYXIsIHNldCB0aGVcbiAgICAgKiBgc2hvd0luV2luZG93VGl0bGVCYXJgIG9wdGlvbiB0byBgdHJ1ZWAgKHdvcmtzIGZvciBfbW9zdF8gUERGIHJlYWRlcnMpLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldFRpdGxlKCfwn6WaIFRoZSBMaWZlIG9mIGFuIEVnZyDwn42zJywgeyBzaG93SW5XaW5kb3dUaXRsZUJhcjogdHJ1ZSB9KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBvZiB0aGlzIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBzZXR0aW5nIHRoZSB0aXRsZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0VGl0bGUgPSBmdW5jdGlvbiAodGl0bGUsIG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0SXModGl0bGUsICd0aXRsZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignVGl0bGUnKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dCh0aXRsZSkpO1xuICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHJlYWRlcnMgc2hvdWxkIGRpc3BsYXkgdGhlIHRpdGxlIHJhdGhlciB0aGFuIHRoZSBmaWxlbmFtZVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNob3dJbldpbmRvd1RpdGxlQmFyKSB7XG4gICAgICAgICAgICB2YXIgcHJlZnMgPSB0aGlzLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpO1xuICAgICAgICAgICAgcHJlZnMuc2V0RGlzcGxheURvY1RpdGxlKHRydWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIGF1dGhvciBtZXRhZGF0YS4gVGhlIGF1dGhvciB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldEF1dGhvcignSHVtcHR5IER1bXB0eScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGF1dGhvciBUaGUgYXV0aG9yIG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldEF1dGhvciA9IGZ1bmN0aW9uIChhdXRob3IpIHtcbiAgICAgICAgYXNzZXJ0SXMoYXV0aG9yLCAnYXV0aG9yJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdBdXRob3InKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dChhdXRob3IpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3Mgc3ViamVjdCBtZXRhZGF0YS4gVGhlIHN1YmplY3Qgd2lsbCBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRTdWJqZWN0KCfwn5OYIEFuIEVwaWMgVGFsZSBvZiBXb2Ug8J+TlicpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHN1YmplY3QgVGhlIHN1YmplY3Qgb2YgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0U3ViamVjdCA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgIGFzc2VydElzKHN1YmplY3QsICdhdXRob3InLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ1N1YmplY3QnKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dChzdWJqZWN0KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIGtleXdvcmQgbWV0YWRhdGEuIFRoZXNlIGtleXdvcmRzIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0S2V5d29yZHMoWydlZ2dzJywgJ3dhbGwnLCAnZmFsbCcsICdraW5nJywgJ2hvcnNlcycsICdtZW4nXSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0ga2V5d29yZHMgQW4gYXJyYXkgb2Yga2V5d29yZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldEtleXdvcmRzID0gZnVuY3Rpb24gKGtleXdvcmRzKSB7XG4gICAgICAgIGFzc2VydElzKGtleXdvcmRzLCAna2V5d29yZHMnLCBbQXJyYXldKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ0tleXdvcmRzJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZIZXhTdHJpbmcuZnJvbVRleHQoa2V5d29yZHMuam9pbignICcpKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIGNyZWF0b3IgbWV0YWRhdGEuIFRoZSBjcmVhdG9yIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0Q3JlYXRvcignUERGIEFwcCA5MDAwIPCfpJYnKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjcmVhdG9yIFRoZSBjcmVhdG9yIG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldENyZWF0b3IgPSBmdW5jdGlvbiAoY3JlYXRvcikge1xuICAgICAgICBhc3NlcnRJcyhjcmVhdG9yLCAnY3JlYXRvcicsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignQ3JlYXRvcicpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KGNyZWF0b3IpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgcHJvZHVjZXIgbWV0YWRhdGEuIFRoZSBwcm9kdWNlciB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldFByb2R1Y2VyKCdQREYgQXBwIDkwMDAg8J+klicpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHByb2R1Y2VyIFRoZSBwcm9kdWNlciBvZiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRQcm9kdWNlciA9IGZ1bmN0aW9uIChwcm9kdWNlcikge1xuICAgICAgICBhc3NlcnRJcyhwcm9kdWNlciwgJ2NyZWF0b3InLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ1Byb2R1Y2VyJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZIZXhTdHJpbmcuZnJvbVRleHQocHJvZHVjZXIpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgbGFuZ3VhZ2UgbWV0YWRhdGEuIFRoZSBsYW5ndWFnZSB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIHNvbWUgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldExhbmd1YWdlKCdlbi11cycpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgQW4gUkZDIDMwNjYgX0xhbmd1YWdlLVRhZ18gZGVub3RpbmcgdGhlIGxhbmd1YWdlIG9mIHRoaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgZG9jdW1lbnQsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgbGFuZ3VhZ2UgaXMgdW5rbm93bi5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0TGFuZ3VhZ2UgPSBmdW5jdGlvbiAobGFuZ3VhZ2UpIHtcbiAgICAgICAgYXNzZXJ0SXMobGFuZ3VhZ2UsICdsYW5ndWFnZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignTGFuZycpO1xuICAgICAgICB0aGlzLmNhdGFsb2cuc2V0KGtleSwgUERGU3RyaW5nLm9mKGxhbmd1YWdlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIGNyZWF0aW9uIGRhdGUgbWV0YWRhdGEuIFRoZSBjcmVhdGlvbiBkYXRlIHdpbGwgYXBwZWFyXG4gICAgICogaW4gdGhlIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0Q3JlYXRpb25EYXRlKG5ldyBEYXRlKCkpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNyZWF0aW9uRGF0ZSBUaGUgZGF0ZSB0aGlzIGRvY3VtZW50IHdhcyBjcmVhdGVkLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRDcmVhdGlvbkRhdGUgPSBmdW5jdGlvbiAoY3JlYXRpb25EYXRlKSB7XG4gICAgICAgIGFzc2VydElzKGNyZWF0aW9uRGF0ZSwgJ2NyZWF0aW9uRGF0ZScsIFtbRGF0ZSwgJ0RhdGUnXV0pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignQ3JlYXRpb25EYXRlJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZTdHJpbmcuZnJvbURhdGUoY3JlYXRpb25EYXRlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIG1vZGlmaWNhdGlvbiBkYXRlIG1ldGFkYXRhLiBUaGUgbW9kaWZpY2F0aW9uIGRhdGUgd2lsbFxuICAgICAqIGFwcGVhciBpbiB0aGUgXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3JcbiAgICAgKiBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldE1vZGlmaWNhdGlvbkRhdGUobmV3IERhdGUoKSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbW9kaWZpY2F0aW9uRGF0ZSBUaGUgZGF0ZSB0aGlzIGRvY3VtZW50IHdhcyBsYXN0IG1vZGlmaWVkLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRNb2RpZmljYXRpb25EYXRlID0gZnVuY3Rpb24gKG1vZGlmaWNhdGlvbkRhdGUpIHtcbiAgICAgICAgYXNzZXJ0SXMobW9kaWZpY2F0aW9uRGF0ZSwgJ21vZGlmaWNhdGlvbkRhdGUnLCBbW0RhdGUsICdEYXRlJ11dKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ01vZERhdGUnKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERlN0cmluZy5mcm9tRGF0ZShtb2RpZmljYXRpb25EYXRlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBwYWdlcyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0b3RhbFBhZ2VzID0gcGRmRG9jLmdldFBhZ2VDb3VudCgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRQYWdlQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VDb3VudCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5wYWdlQ291bnQgPSB0aGlzLmdldFBhZ2VzKCkubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlQ291bnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIHRoZSBwYWdlcyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4gVGhlIHBhZ2VzIGFyZVxuICAgICAqIHN0b3JlZCBpbiB0aGUgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IGFyZSByZW5kZXJlZCBpbiB0aGVcbiAgICAgKiBkb2N1bWVudC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwYWdlcyA9IHBkZkRvYy5nZXRQYWdlcygpXG4gICAgICogcGFnZXNbMF0gICAvLyBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBwYWdlc1syXSAgIC8vIFRoZSB0aGlyZCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBhZ2VzWzE5N10gLy8gVGhlIDE5OHRoIHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYWxsIHRoZSBwYWdlcyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0UGFnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VDYWNoZS5hY2Nlc3MoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcGFnZSByZW5kZXJlZCBhdCBhIHBhcnRpY3VsYXIgYGluZGV4YCBvZiB0aGUgZG9jdW1lbnQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLmdldFBhZ2UoMCkgICAvLyBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBwZGZEb2MuZ2V0UGFnZSgyKSAgIC8vIFRoZSB0aGlyZCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBkZkRvYy5nZXRQYWdlKDE5NykgLy8gVGhlIDE5OHRoIHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIFtbUERGUGFnZV1dIHJlbmRlcmVkIGF0IHRoZSBnaXZlbiBgaW5kZXhgIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0UGFnZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgcGFnZXMgPSB0aGlzLmdldFBhZ2VzKCk7XG4gICAgICAgIGFzc2VydFJhbmdlKGluZGV4LCAnaW5kZXgnLCAwLCBwYWdlcy5sZW5ndGggLSAxKTtcbiAgICAgICAgcmV0dXJuIHBhZ2VzW2luZGV4XTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhbiBhcnJheSBvZiBpbmRpY2VzIGZvciBhbGwgdGhlIHBhZ2VzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LiBUaGVcbiAgICAgKiBhcnJheSB3aWxsIGNvbnRhaW4gYSByYW5nZSBvZiBpbnRlZ2VycyBmcm9tXG4gICAgICogYDAuLnBkZkRvYy5nZXRQYWdlQ291bnQoKSAtIDFgLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqIHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKiBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBpbmRpY2VzID0gcGRmRG9jLmdldFBhZ2VJbmRpY2VzKClcbiAgICAgKiBpbmRpY2VzIC8vID0+IFswLCAxLCAyXVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGluZGljZXMgZm9yIGFsbCBwYWdlcyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0UGFnZUluZGljZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiByYW5nZSgwLCB0aGlzLmdldFBhZ2VDb3VudCgpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgcGFnZSBhdCBhIGdpdmVuIGluZGV4IGZyb20gdGhpcyBkb2N1bWVudC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2MucmVtb3ZlUGFnZSgwKSAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBwZGZEb2MucmVtb3ZlUGFnZSgyKSAgIC8vIFJlbW92ZSB0aGUgdGhpcmQgcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBwZGZEb2MucmVtb3ZlUGFnZSgxOTcpIC8vIFJlbW92ZSB0aGUgMTk4dGggcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKiBPbmNlIGEgcGFnZSBoYXMgYmVlbiByZW1vdmVkLCBpdCB3aWxsIG5vIGxvbmdlciBiZSByZW5kZXJlZCBhdCB0aGF0IGluZGV4XG4gICAgICogaW4gdGhlIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHBhZ2UgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlUGFnZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgcGFnZUNvdW50ID0gdGhpcy5nZXRQYWdlQ291bnQoKTtcbiAgICAgICAgaWYgKHRoaXMucGFnZUNvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yKCk7XG4gICAgICAgIGFzc2VydFJhbmdlKGluZGV4LCAnaW5kZXgnLCAwLCBwYWdlQ291bnQgLSAxKTtcbiAgICAgICAgdGhpcy5jYXRhbG9nLnJlbW92ZUxlYWZOb2RlKGluZGV4KTtcbiAgICAgICAgdGhpcy5wYWdlQ291bnQgPSBwYWdlQ291bnQgLSAxO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIGEgcGFnZSB0byB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgbWV0aG9kIGFjY2VwdHMgdGhyZWVcbiAgICAgKiBkaWZmZXJlbnQgdmFsdWUgdHlwZXMgZm9yIHRoZSBgcGFnZWAgcGFyYW1ldGVyOlxuICAgICAqXG4gICAgICogfCBUeXBlICAgICAgICAgICAgICAgfCBCZWhhdmlvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgdW5kZWZpbmVkYCAgICAgICAgfCBDcmVhdGUgYSBuZXcgcGFnZSBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhpcyBkb2N1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgW251bWJlciwgbnVtYmVyXWAgfCBDcmVhdGUgYSBuZXcgcGFnZSB3aXRoIHRoZSBnaXZlbiBkaW1lbnNpb25zIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGlzIGRvY3VtZW50ICB8XG4gICAgICogfCBgUERGUGFnZWAgICAgICAgICAgfCBBZGQgdGhlIGV4aXN0aW5nIHBhZ2UgdG8gdGhlIGVuZCBvZiB0aGlzIGRvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBhZ2U9dW5kZWZpbmVkXG4gICAgICogY29uc3QgbmV3UGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIC8vIHBhZ2U9W251bWJlciwgbnVtYmVyXVxuICAgICAqIGltcG9ydCB7IFBhZ2VTaXplcyB9IGZyb20gJ3BkZi1saWInXG4gICAgICogY29uc3QgbmV3UGFnZTEgPSBwZGZEb2MuYWRkUGFnZShQYWdlU2l6ZXMuQTcpXG4gICAgICogY29uc3QgbmV3UGFnZTIgPSBwZGZEb2MuYWRkUGFnZShQYWdlU2l6ZXMuTGV0dGVyKVxuICAgICAqIGNvbnN0IG5ld1BhZ2UzID0gcGRmRG9jLmFkZFBhZ2UoWzUwMCwgNzUwXSlcbiAgICAgKlxuICAgICAqIC8vIHBhZ2U9UERGUGFnZVxuICAgICAqIGNvbnN0IHBkZkRvYzEgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHBkZkRvYzIgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKC4uLilcbiAgICAgKiBjb25zdCBbZXhpc3RpbmdQYWdlXSA9IGF3YWl0IHBkZkRvYzEuY29weVBhZ2VzKHBkZkRvYzIsIFswXSlcbiAgICAgKiBwZGZEb2MxLmFkZFBhZ2UoZXhpc3RpbmdQYWdlKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHBhZ2UgT3B0aW9uYWxseSwgdGhlIGRlc2lyZWQgZGltZW5zaW9ucyBvciBleGlzdGluZyBwYWdlLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXdseSBjcmVhdGVkIChvciBleGlzdGluZykgcGFnZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuYWRkUGFnZSA9IGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgWyd1bmRlZmluZWQnLCBbUERGUGFnZSwgJ1BERlBhZ2UnXSwgQXJyYXldKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0UGFnZSh0aGlzLmdldFBhZ2VDb3VudCgpLCBwYWdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydCBhIHBhZ2UgYXQgYSBnaXZlbiBpbmRleCB3aXRoaW4gdGhpcyBkb2N1bWVudC4gVGhpcyBtZXRob2QgYWNjZXB0c1xuICAgICAqIHRocmVlIGRpZmZlcmVudCB2YWx1ZSB0eXBlcyBmb3IgdGhlIGBwYWdlYCBwYXJhbWV0ZXI6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgICAgICB8IEJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgICAqIHwgYHVuZGVmaW5lZGAgICAgICAgIHwgQ3JlYXRlIGEgbmV3IHBhZ2UgYW5kIGluc2VydCBpdCBpbnRvIHRoaXMgZG9jdW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBbbnVtYmVyLCBudW1iZXJdYCB8IENyZWF0ZSBhIG5ldyBwYWdlIHdpdGggdGhlIGdpdmVuIGRpbWVuc2lvbnMgYW5kIGluc2VydCBpdCBpbnRvIHRoaXMgZG9jdW1lbnQgICB8XG4gICAgICogfCBgUERGUGFnZWAgICAgICAgICAgfCBJbnNlcnQgdGhlIGV4aXN0aW5nIHBhZ2UgaW50byB0aGlzIGRvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBwYWdlPXVuZGVmaW5lZFxuICAgICAqIGNvbnN0IG5ld1BhZ2UgPSBwZGZEb2MuaW5zZXJ0UGFnZSgyKVxuICAgICAqXG4gICAgICogLy8gcGFnZT1bbnVtYmVyLCBudW1iZXJdXG4gICAgICogaW1wb3J0IHsgUGFnZVNpemVzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKiBjb25zdCBuZXdQYWdlMSA9IHBkZkRvYy5pbnNlcnRQYWdlKDIsIFBhZ2VTaXplcy5BNylcbiAgICAgKiBjb25zdCBuZXdQYWdlMiA9IHBkZkRvYy5pbnNlcnRQYWdlKDAsIFBhZ2VTaXplcy5MZXR0ZXIpXG4gICAgICogY29uc3QgbmV3UGFnZTMgPSBwZGZEb2MuaW5zZXJ0UGFnZSgxOTgsIFs1MDAsIDc1MF0pXG4gICAgICpcbiAgICAgKiAvLyBwYWdlPVBERlBhZ2VcbiAgICAgKiBjb25zdCBwZGZEb2MxID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCBwZGZEb2MyID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZCguLi4pXG4gICAgICogY29uc3QgW2V4aXN0aW5nUGFnZV0gPSBhd2FpdCBwZGZEb2MxLmNvcHlQYWdlcyhwZGZEb2MyLCBbMF0pXG4gICAgICogcGRmRG9jMS5pbnNlcnRQYWdlKDAsIGV4aXN0aW5nUGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIHBhZ2Ugc2hvdWxkIGJlIGluc2VydGVkICh6ZXJvLWJhc2VkKS5cbiAgICAgKiBAcGFyYW0gcGFnZSBPcHRpb25hbGx5LCB0aGUgZGVzaXJlZCBkaW1lbnNpb25zIG9yIGV4aXN0aW5nIHBhZ2UuXG4gICAgICogQHJldHVybnMgVGhlIG5ld2x5IGNyZWF0ZWQgKG9yIGV4aXN0aW5nKSBwYWdlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5pbnNlcnRQYWdlID0gZnVuY3Rpb24gKGluZGV4LCBwYWdlKSB7XG4gICAgICAgIHZhciBwYWdlQ291bnQgPSB0aGlzLmdldFBhZ2VDb3VudCgpO1xuICAgICAgICBhc3NlcnRSYW5nZShpbmRleCwgJ2luZGV4JywgMCwgcGFnZUNvdW50KTtcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbJ3VuZGVmaW5lZCcsIFtQREZQYWdlLCAnUERGUGFnZSddLCBBcnJheV0pO1xuICAgICAgICBpZiAoIXBhZ2UgfHwgQXJyYXkuaXNBcnJheShwYWdlKSkge1xuICAgICAgICAgICAgdmFyIGRpbXMgPSBBcnJheS5pc0FycmF5KHBhZ2UpID8gcGFnZSA6IFBhZ2VTaXplcy5BNDtcbiAgICAgICAgICAgIHBhZ2UgPSBQREZQYWdlLmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgICAgIHBhZ2Uuc2V0U2l6ZS5hcHBseShwYWdlLCBkaW1zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYWdlLmRvYyAhPT0gdGhpcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmVpZ25QYWdlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50UmVmID0gdGhpcy5jYXRhbG9nLmluc2VydExlYWZOb2RlKHBhZ2UucmVmLCBpbmRleCk7XG4gICAgICAgIHBhZ2Uubm9kZS5zZXRQYXJlbnQocGFyZW50UmVmKTtcbiAgICAgICAgdGhpcy5wYWdlTWFwLnNldChwYWdlLm5vZGUsIHBhZ2UpO1xuICAgICAgICB0aGlzLnBhZ2VDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMucGFnZUNvdW50ID0gcGFnZUNvdW50ICsgMTtcbiAgICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb3B5IHBhZ2VzIGZyb20gYSBzb3VyY2UgZG9jdW1lbnQgaW50byB0aGlzIGRvY3VtZW50LiBBbGxvd3MgcGFnZXMgdG8gYmVcbiAgICAgKiBjb3BpZWQgYmV0d2VlbiBkaWZmZXJlbnQgW1tQREZEb2N1bWVudF1dIGluc3RhbmNlcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHNyY0RvYyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoLi4uKVxuICAgICAqXG4gICAgICogY29uc3QgY29waWVkUGFnZXMgPSBhd2FpdCBwZGZEb2MuY29weVBhZ2VzKHNyY0RvYywgWzAsIDMsIDg5XSlcbiAgICAgKiBjb25zdCBbZmlyc3RQYWdlLCBmb3VydGhQYWdlLCBuaW5ldGlldGhQYWdlXSA9IGNvcGllZFBhZ2VzO1xuICAgICAqXG4gICAgICogcGRmRG9jLmFkZFBhZ2UoZm91cnRoUGFnZSlcbiAgICAgKiBwZGZEb2MuaW5zZXJ0UGFnZSgwLCBuaW5ldGlldGhQYWdlKVxuICAgICAqIHBkZkRvYy5hZGRQYWdlKGZpcnN0UGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gc3JjRG9jIFRoZSBkb2N1bWVudCBmcm9tIHdoaWNoIHBhZ2VzIHNob3VsZCBiZSBjb3BpZWQuXG4gICAgICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHBhZ2VzIHRoYXQgc2hvdWxkIGJlIGNvcGllZC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHBhZ2VzIGNvcGllZCBpbnRvIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmNvcHlQYWdlcyA9IGZ1bmN0aW9uIChzcmNEb2MsIGluZGljZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvcGllciwgc3JjUGFnZXMsIGNvcGllZFBhZ2VzLCBpZHgsIGxlbiwgc3JjUGFnZSwgY29waWVkUGFnZSwgcmVmO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoc3JjRG9jLCAnc3JjRG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGluZGljZXMsICdpbmRpY2VzJywgW0FycmF5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBzcmNEb2MuZmx1c2goKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllciA9IFBERk9iamVjdENvcGllci5mb3Ioc3JjRG9jLmNvbnRleHQsIHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmNQYWdlcyA9IHNyY0RvYy5nZXRQYWdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkUGFnZXMgPSBuZXcgQXJyYXkoaW5kaWNlcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpZHggPSAwLCBsZW4gPSBpbmRpY2VzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhZ2UgPSBzcmNQYWdlc1tpbmRpY2VzW2lkeF1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFBhZ2UgPSBjb3BpZXIuY29weShzcmNQYWdlLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMuY29udGV4dC5yZWdpc3Rlcihjb3BpZWRQYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRQYWdlc1tpZHhdID0gUERGUGFnZS5vZihjb3BpZWRQYWdlLCByZWYsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvcGllZFBhZ2VzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgYSBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHNyY0RvYyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoLi4uKVxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IHNyY0RvYy5jb3B5KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqID4gKipOT1RFOioqICBUaGlzIG1ldGhvZCB3b24ndCBjb3B5IGFsbCBpbmZvcm1hdGlvbiBvdmVyIHRvIHRoZSBuZXdcbiAgICAgKiA+IGRvY3VtZW50IChhY3JvZm9ybXMsIG91dGxpbmVzLCBldGMuLi4pLlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCBhIGNvcHkgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBkZkNvcHksIGNvbnRlbnRQYWdlcywgaWR4LCBsZW47XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIFBERkRvY3VtZW50LmNyZWF0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHBkZkNvcHkuY29weVBhZ2VzKHRoaXMsIHRoaXMuZ2V0UGFnZUluZGljZXMoKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UGFnZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDAsIGxlbiA9IGNvbnRlbnRQYWdlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LmFkZFBhZ2UoY29udGVudFBhZ2VzW2lkeF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0QXV0aG9yKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0QXV0aG9yKHRoaXMuZ2V0QXV0aG9yKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q3JlYXRpb25EYXRlKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0Q3JlYXRpb25EYXRlKHRoaXMuZ2V0Q3JlYXRpb25EYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q3JlYXRvcigpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldENyZWF0b3IodGhpcy5nZXRDcmVhdG9yKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldE1vZGlmaWNhdGlvbkRhdGUodGhpcy5nZXRNb2RpZmljYXRpb25EYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UHJvZHVjZXIoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRQcm9kdWNlcih0aGlzLmdldFByb2R1Y2VyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U3ViamVjdCgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldFN1YmplY3QodGhpcy5nZXRTdWJqZWN0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0VGl0bGUoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRUaXRsZSh0aGlzLmdldFRpdGxlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5kZWZhdWx0V29yZEJyZWFrcyA9IHRoaXMuZGVmYXVsdFdvcmRCcmVha3M7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcGRmQ29weV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIEphdmFTY3JpcHQgdG8gdGhpcyBkb2N1bWVudC4gVGhlIHN1cHBsaWVkIGBzY3JpcHRgIGlzIGV4ZWN1dGVkIHdoZW4gdGhlXG4gICAgICogZG9jdW1lbnQgaXMgb3BlbmVkLiBUaGUgYHNjcmlwdGAgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBzb21lIG9wZXJhdGlvblxuICAgICAqIHdoZW4gdGhlIGRvY3VtZW50IGlzIG9wZW5lZCAoZS5nLiBsb2dnaW5nIHRvIHRoZSBjb25zb2xlKSwgb3IgaXQgY2FuIGJlXG4gICAgICogdXNlZCB0byBkZWZpbmUgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGxhdGVyIGluIGEgSmF2YVNjcmlwdFxuICAgICAqIGFjdGlvbi4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBTaG93IFwiSGVsbG8gV29ybGQhXCIgaW4gdGhlIGNvbnNvbGUgd2hlbiB0aGUgUERGIGlzIG9wZW5lZFxuICAgICAqIHBkZkRvYy5hZGRKYXZhU2NyaXB0KFxuICAgICAqICAgJ21haW4nLFxuICAgICAqICAgJ2NvbnNvbGUuc2hvdygpOyBjb25zb2xlLnByaW50bG4oXCJIZWxsbyBXb3JsZCFcIik7J1xuICAgICAqICk7XG4gICAgICpcbiAgICAgKiAvLyBEZWZpbmUgYSBmdW5jdGlvbiBuYW1lZCBcImZvb1wiIHRoYXQgY2FuIGJlIGNhbGxlZCBpbiBKYXZhU2NyaXB0IEFjdGlvbnNcbiAgICAgKiBwZGZEb2MuYWRkSmF2YVNjcmlwdChcbiAgICAgKiAgICdmb28nLFxuICAgICAqICAgJ2Z1bmN0aW9uIGZvbygpIHsgcmV0dXJuIFwiZm9vXCI7IH0nXG4gICAgICogKTtcbiAgICAgKiBgYGBcbiAgICAgKiBTZWUgdGhlIFtKYXZhU2NyaXB0IGZvciBBY3JvYmF0IEFQSSBSZWZlcmVuY2VdKGh0dHBzOi8vd3d3LmFkb2JlLmNvbS9jb250ZW50L2RhbS9hY29tL2VuL2Rldm5ldC9hY3JvYmF0L3BkZnMvanNfYXBpX3JlZmVyZW5jZS5wZGYpXG4gICAgICogZm9yIGRldGFpbHMuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHNjcmlwdC4gTXVzdCBiZSB1bmlxdWUgcGVyIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBzY3JpcHQgVGhlIEphdmFTY3JpcHQgdG8gZXhlY3V0ZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuYWRkSmF2YVNjcmlwdCA9IGZ1bmN0aW9uIChuYW1lLCBzY3JpcHQpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgYXNzZXJ0SXMoc2NyaXB0LCAnc2NyaXB0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBlbWJlZGRlciA9IEphdmFTY3JpcHRFbWJlZGRlci5mb3Ioc2NyaXB0LCBuYW1lKTtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgIHZhciBqYXZhU2NyaXB0ID0gUERGSmF2YVNjcmlwdC5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgdGhpcy5qYXZhU2NyaXB0cy5wdXNoKGphdmFTY3JpcHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIGFuIGF0dGFjaG1lbnQgdG8gdGhpcyBkb2N1bWVudC4gQXR0YWNobWVudHMgYXJlIHZpc2libGUgaW4gdGhlXG4gICAgICogXCJBdHRhY2htZW50c1wiIHBhbmVsIG9mIEFkb2JlIEFjcm9iYXQgYW5kIHNvbWUgb3RoZXIgUERGIHJlYWRlcnMuIEFueVxuICAgICAqIHR5cGUgb2YgZmlsZSBjYW4gYmUgYWRkZWQgYXMgYW4gYXR0YWNobWVudC4gVGhpcyBpbmNsdWRlcywgYnV0IGlzIG5vdFxuICAgICAqIGxpbWl0ZWQgdG8sIGAucG5nYCwgYC5qcGdgLCBgLnBkZmAsIGAuY3N2YCwgYC5kb2N4YCwgYW5kIGAueGxzeGAgZmlsZXMuXG4gICAgICpcbiAgICAgKiBUaGUgaW5wdXQgZGF0YSBjYW4gYmUgcHJvdmlkZWQgaW4gbXVsdGlwbGUgZm9ybWF0czpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICB8IENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgc3RyaW5nYCAgICAgIHwgQSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgKG9yIGRhdGEgVVJJKSBjb250YWluaW5nIGFuIGF0dGFjaG1lbnQgfFxuICAgICAqIHwgYFVpbnQ4QXJyYXlgICB8IFRoZSByYXcgYnl0ZXMgb2YgYW4gYXR0YWNobWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBBcnJheUJ1ZmZlcmAgfCBUaGUgcmF3IGJ5dGVzIG9mIGFuIGF0dGFjaG1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIGF0dGFjaG1lbnQ9c3RyaW5nXG4gICAgICogYXdhaXQgcGRmRG9jLmF0dGFjaCgnLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3QkQuLi4nLCAnY2F0X3JpZGluZ191bmljb3JuLmpwZycsIHtcbiAgICAgKiAgIG1pbWVUeXBlOiAnaW1hZ2UvanBlZycsXG4gICAgICogICBkZXNjcmlwdGlvbjogJ0Nvb2wgY2F0IHJpZGluZyBhIHVuaWNvcm4hIPCfpoTwn5CI8J+Vtu+4jycsXG4gICAgICogICBjcmVhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDE5LzEyLzAxJyksXG4gICAgICogICBtb2RpZmljYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAyMC8wNC8xOScpLFxuICAgICAqIH0pXG4gICAgICogYXdhaXQgcGRmRG9jLmF0dGFjaCgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUS4uLicsICdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJywge1xuICAgICAqICAgbWltZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgKiAgIGRlc2NyaXB0aW9uOiAnQ29vbCBjYXQgcmlkaW5nIGEgdW5pY29ybiEg8J+mhPCfkIjwn5W277iPJyxcbiAgICAgKiAgIGNyZWF0aW9uRGF0ZTogbmV3IERhdGUoJzIwMTkvMTIvMDEnKSxcbiAgICAgKiAgIG1vZGlmaWNhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDIwLzA0LzE5JyksXG4gICAgICogfSlcbiAgICAgKlxuICAgICAqIC8vIGF0dGFjaG1lbnQ9VWludDhBcnJheVxuICAgICAqIGltcG9ydCBmcyBmcm9tICdmcydcbiAgICAgKiBjb25zdCB1aW50OEFycmF5ID0gZnMucmVhZEZpbGVTeW5jKCdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJylcbiAgICAgKiBhd2FpdCBwZGZEb2MuYXR0YWNoKHVpbnQ4QXJyYXksICdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJywge1xuICAgICAqICAgbWltZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgKiAgIGRlc2NyaXB0aW9uOiAnQ29vbCBjYXQgcmlkaW5nIGEgdW5pY29ybiEg8J+mhPCfkIjwn5W277iPJyxcbiAgICAgKiAgIGNyZWF0aW9uRGF0ZTogbmV3IERhdGUoJzIwMTkvMTIvMDEnKSxcbiAgICAgKiAgIG1vZGlmaWNhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDIwLzA0LzE5JyksXG4gICAgICogfSlcbiAgICAgKlxuICAgICAqIC8vIGF0dGFjaG1lbnQ9QXJyYXlCdWZmZXJcbiAgICAgKiBjb25zdCB1cmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvY2F0X3JpZGluZ191bmljb3JuLmpwZydcbiAgICAgKiBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZldGNoKHVybCkudGhlbihyZXMgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICogYXdhaXQgcGRmRG9jLmF0dGFjaChhcnJheUJ1ZmZlciwgJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnLCB7XG4gICAgICogICBtaW1lVHlwZTogJ2ltYWdlL2pwZWcnLFxuICAgICAqICAgZGVzY3JpcHRpb246ICdDb29sIGNhdCByaWRpbmcgYSB1bmljb3JuISDwn6aE8J+QiPCflbbvuI8nLFxuICAgICAqICAgY3JlYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAxOS8xMi8wMScpLFxuICAgICAqICAgbW9kaWZpY2F0aW9uRGF0ZTogbmV3IERhdGUoJzIwMjAvMDQvMTknKSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgVGhlIGlucHV0IGRhdGEgY29udGFpbmluZyB0aGUgZmlsZSB0byBiZSBhdHRhY2hlZC5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBhdHRhY2hlZC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBhdHRhY2htZW50IGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5hdHRhY2ggPSBmdW5jdGlvbiAoYXR0YWNobWVudCwgbmFtZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZXMsIGVtYmVkZGVyLCByZWYsIGVtYmVkZGVkRmlsZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnRJcyhhdHRhY2htZW50LCAnYXR0YWNobWVudCcsIFsnc3RyaW5nJywgVWludDhBcnJheSwgQXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICAgICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMubWltZVR5cGUsICdtaW1lVHlwZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICAgICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuZGVzY3JpcHRpb24sICdkZXNjcmlwdGlvbicsIFsnc3RyaW5nJ10pO1xuICAgICAgICAgICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuY3JlYXRpb25EYXRlLCAnb3B0aW9ucy5jcmVhdGlvbkRhdGUnLCBbRGF0ZV0pO1xuICAgICAgICAgICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMubW9kaWZpY2F0aW9uRGF0ZSwgJ29wdGlvbnMubW9kaWZpY2F0aW9uRGF0ZScsIFtcbiAgICAgICAgICAgICAgICAgICAgRGF0ZSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5hZlJlbGF0aW9uc2hpcCwgJ29wdGlvbnMuYWZSZWxhdGlvbnNoaXAnLCBBRlJlbGF0aW9uc2hpcCk7XG4gICAgICAgICAgICAgICAgYnl0ZXMgPSB0b1VpbnQ4QXJyYXkoYXR0YWNobWVudCk7XG4gICAgICAgICAgICAgICAgZW1iZWRkZXIgPSBGaWxlRW1iZWRkZXIuZm9yKGJ5dGVzLCBuYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkRmlsZSA9IFBERkVtYmVkZGVkRmlsZS5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtYmVkZGVkRmlsZXMucHVzaChlbWJlZGRlZEZpbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIGEgZm9udCBpbnRvIHRoaXMgZG9jdW1lbnQuIFRoZSBpbnB1dCBkYXRhIGNhbiBiZSBwcm92aWRlZCBpbiBtdWx0aXBsZVxuICAgICAqIGZvcm1hdHM6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgICB8IENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgU3RhbmRhcmRGb250c2AgfCBPbmUgb2YgdGhlIHN0YW5kYXJkIDE0IGZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBzdHJpbmdgICAgICAgICB8IEEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIChvciBkYXRhIFVSSSkgY29udGFpbmluZyBhIGZvbnQgfFxuICAgICAqIHwgYFVpbnQ4QXJyYXlgICAgIHwgVGhlIHJhdyBieXRlcyBvZiBhIGZvbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgQXJyYXlCdWZmZXJgICAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgZm9udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gZm9udD1TdGFuZGFyZEZvbnRzXG4gICAgICogaW1wb3J0IHsgU3RhbmRhcmRGb250cyB9IGZyb20gJ3BkZi1saWInXG4gICAgICogY29uc3QgZm9udDEgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqXG4gICAgICogLy8gZm9udD1zdHJpbmdcbiAgICAgKiBjb25zdCBmb250MiA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoJ0FBRUFBQUFWQVFBQUJBQlFSRk5KUngvdXBlLi4uJylcbiAgICAgKiBjb25zdCBmb250MyA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoJ2RhdGE6Zm9udC9vcGVudHlwZTtiYXNlNjQsQUFFQUFBLi4uJylcbiAgICAgKlxuICAgICAqIC8vIGZvbnQ9VWludDhBcnJheVxuICAgICAqIGltcG9ydCBmcyBmcm9tICdmcydcbiAgICAgKiBjb25zdCBmb250NCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoZnMucmVhZEZpbGVTeW5jKCdVYnVudHUtUi50dGYnKSlcbiAgICAgKlxuICAgICAqIC8vIGZvbnQ9QXJyYXlCdWZmZXJcbiAgICAgKiBjb25zdCB1cmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvdWJ1bnR1L1VidW50dS1SLnR0ZidcbiAgICAgKiBjb25zdCB1YnVudHVCeXRlcyA9IGF3YWl0IGZldGNoKHVybCkudGhlbihyZXMgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICogY29uc3QgZm9udDUgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KHVidW50dUJ5dGVzKVxuICAgICAqIGBgYFxuICAgICAqIFNlZSBhbHNvOiBbW3JlZ2lzdGVyRm9udGtpdF1dXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGlucHV0IGRhdGEgZm9yIGEgZm9udC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZW1iZWRkaW5nIHRoZSBmb250LlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIGVtYmVkZGVkIGZvbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkRm9udCA9IGZ1bmN0aW9uIChmb250LCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgc3Vic2V0LCBjdXN0b21OYW1lLCBmZWF0dXJlcywgZW1iZWRkZXIsIGJ5dGVzLCBmb250a2l0LCBfYiwgcmVmLCBwZGZGb250O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBvcHRpb25zLnN1YnNldCwgc3Vic2V0ID0gX2EgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EsIGN1c3RvbU5hbWUgPSBvcHRpb25zLmN1c3RvbU5hbWUsIGZlYXR1cmVzID0gb3B0aW9ucy5mZWF0dXJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgWydzdHJpbmcnLCBVaW50OEFycmF5LCBBcnJheUJ1ZmZlcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoc3Vic2V0LCAnc3Vic2V0JywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1N0YW5kYXJkRm9udChmb250KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlciA9IFN0YW5kYXJkRm9udEVtYmVkZGVyLmZvcihmb250LCBjdXN0b21OYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbkJlQ29udmVydGVkVG9VaW50OEFycmF5KGZvbnQpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gdG9VaW50OEFycmF5KGZvbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udGtpdCA9IHRoaXMuYXNzZXJ0Rm9udGtpdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzZXQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLmZvcihmb250a2l0LCBieXRlcywgY3VzdG9tTmFtZSwgZmVhdHVyZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzQgLyp5aWVsZCovLCBDdXN0b21Gb250RW1iZWRkZXIuZm9yKGZvbnRraXQsIGJ5dGVzLCBjdXN0b21OYW1lLCBmZWF0dXJlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZXIgPSBfYjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bmb250YCBtdXN0IGJlIG9uZSBvZiBgU3RhbmRhcmRGb250cyB8IHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBBcnJheUJ1ZmZlcmAnKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBkZkZvbnQgPSBQREZGb250Lm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb250cy5wdXNoKHBkZkZvbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBkZkZvbnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIGEgc3RhbmRhcmQgZm9udCBpbnRvIHRoaXMgZG9jdW1lbnQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBTdGFuZGFyZEZvbnRzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2FGb250ID0gcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgc3RhbmRhcmQgZm9udCB0byBiZSBlbWJlZGRlZC5cbiAgICAgKiBAcGFyYW0gY3VzdG9tTmFtZSBUaGUgbmFtZSB0byBiZSB1c2VkIHdoZW4gZW1iZWRkaW5nIHRoZSBmb250LlxuICAgICAqIEByZXR1cm5zIFRoZSBlbWJlZGRlZCBmb250LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZFN0YW5kYXJkRm9udCA9IGZ1bmN0aW9uIChmb250LCBjdXN0b21OYW1lKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgWydzdHJpbmcnXSk7XG4gICAgICAgIGlmICghaXNTdGFuZGFyZEZvbnQoZm9udCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bmb250YCBtdXN0IGJlIG9uZSBvZiB0eXBlIGBTdGFuZGFyZEZvbnRzYCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbWJlZGRlciA9IFN0YW5kYXJkRm9udEVtYmVkZGVyLmZvcihmb250LCBjdXN0b21OYW1lKTtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgIHZhciBwZGZGb250ID0gUERGRm9udC5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgdGhpcy5mb250cy5wdXNoKHBkZkZvbnQpO1xuICAgICAgICByZXR1cm4gcGRmRm9udDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIGEgSlBFRyBpbWFnZSBpbnRvIHRoaXMgZG9jdW1lbnQuIFRoZSBpbnB1dCBkYXRhIGNhbiBiZSBwcm92aWRlZCBpblxuICAgICAqIG11bHRpcGxlIGZvcm1hdHM6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgfCBDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGBzdHJpbmdgICAgICAgfCBBIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAob3IgZGF0YSBVUkkpIGNvbnRhaW5pbmcgYSBKUEVHIGltYWdlIHxcbiAgICAgKiB8IGBVaW50OEFycmF5YCAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgSlBFRyBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBBcnJheUJ1ZmZlcmAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgSlBFRyBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8ganBnPXN0cmluZ1xuICAgICAqIGNvbnN0IGltYWdlMSA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZygnLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3QkQuLi4nKVxuICAgICAqIGNvbnN0IGltYWdlMiA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZygnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUS4uLicpXG4gICAgICpcbiAgICAgKiAvLyBqcGc9VWludDhBcnJheVxuICAgICAqIGltcG9ydCBmcyBmcm9tICdmcydcbiAgICAgKiBjb25zdCB1aW50OEFycmF5ID0gZnMucmVhZEZpbGVTeW5jKCdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJylcbiAgICAgKiBjb25zdCBpbWFnZTMgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcodWludDhBcnJheSlcbiAgICAgKlxuICAgICAqIC8vIGpwZz1BcnJheUJ1ZmZlclxuICAgICAqIGNvbnN0IHVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy9jYXRfcmlkaW5nX3VuaWNvcm4uanBnJ1xuICAgICAqIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKHJlcyA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBpbWFnZTQgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcoYXJyYXlCdWZmZXIpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ganBnIFRoZSBpbnB1dCBkYXRhIGZvciBhIEpQRUcgaW1hZ2UuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCB0aGUgZW1iZWRkZWQgaW1hZ2UuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkSnBnID0gZnVuY3Rpb24gKGpwZykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZXMsIGVtYmVkZGVyLCByZWYsIHBkZkltYWdlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoanBnLCAnanBnJywgWydzdHJpbmcnLCBVaW50OEFycmF5LCBBcnJheUJ1ZmZlcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSB0b1VpbnQ4QXJyYXkoanBnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIEpwZWdFbWJlZGRlci5mb3IoYnl0ZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZXIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGRmSW1hZ2UgPSBQREZJbWFnZS5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VzLnB1c2gocGRmSW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBkZkltYWdlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWJlZCBhIFBORyBpbWFnZSBpbnRvIHRoaXMgZG9jdW1lbnQuIFRoZSBpbnB1dCBkYXRhIGNhbiBiZSBwcm92aWRlZCBpblxuICAgICAqIG11bHRpcGxlIGZvcm1hdHM6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgfCBDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgc3RyaW5nYCAgICAgIHwgQSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgKG9yIGRhdGEgVVJJKSBjb250YWluaW5nIGEgUE5HIGltYWdlIHxcbiAgICAgKiB8IGBVaW50OEFycmF5YCAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgUE5HIGltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYEFycmF5QnVmZmVyYCB8IFRoZSByYXcgYnl0ZXMgb2YgYSBQTkcgaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBuZz1zdHJpbmdcbiAgICAgKiBjb25zdCBpbWFnZTEgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoJ2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFsZ0FBQUYzLi4uJylcbiAgICAgKiBjb25zdCBpbWFnZTIgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnLi4uJylcbiAgICAgKlxuICAgICAqIC8vIHBuZz1VaW50OEFycmF5XG4gICAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgICAqIGNvbnN0IHVpbnQ4QXJyYXkgPSBmcy5yZWFkRmlsZVN5bmMoJ3NtYWxsX21hcmlvLnBuZycpXG4gICAgICogY29uc3QgaW1hZ2UzID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKHVpbnQ4QXJyYXkpXG4gICAgICpcbiAgICAgKiAvLyBwbmc9QXJyYXlCdWZmZXJcbiAgICAgKiBjb25zdCB1cmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvc21hbGxfbWFyaW8ucG5nJ1xuICAgICAqIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKHJlcyA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBpbWFnZTQgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoYXJyYXlCdWZmZXIpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG5nIFRoZSBpbnB1dCBkYXRhIGZvciBhIFBORyBpbWFnZS5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIHRoZSBlbWJlZGRlZCBpbWFnZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRQbmcgPSBmdW5jdGlvbiAocG5nKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBieXRlcywgZW1iZWRkZXIsIHJlZiwgcGRmSW1hZ2U7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhwbmcsICdwbmcnLCBbJ3N0cmluZycsIFVpbnQ4QXJyYXksIEFycmF5QnVmZmVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IHRvVWludDhBcnJheShwbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUG5nRW1iZWRkZXIuZm9yKGJ5dGVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVyID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBkZkltYWdlID0gUERGSW1hZ2Uub2YocmVmLCB0aGlzLCBlbWJlZGRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlcy5wdXNoKHBkZkltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBwZGZJbWFnZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgb25lIG9yIG1vcmUgUERGIHBhZ2VzIGludG8gdGhpcyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHNvdXJjZVBkZlVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy93aXRoX2xhcmdlX3BhZ2VfY291bnQucGRmJ1xuICAgICAqIGNvbnN0IHNvdXJjZVBkZiA9IGF3YWl0IGZldGNoKHNvdXJjZVBkZlVybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKlxuICAgICAqIC8vIEVtYmVkIHBhZ2UgNzQgb2YgYHNvdXJjZVBkZmAgaW50byBgcGRmRG9jYFxuICAgICAqIGNvbnN0IFtlbWJlZGRlZFBhZ2VdID0gYXdhaXQgcGRmRG9jLmVtYmVkUGRmKHNvdXJjZVBkZiwgWzczXSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERkRvY3VtZW50LmxvYWRdXSBmb3IgZXhhbXBsZXMgb2YgdGhlIGFsbG93ZWQgaW5wdXQgZGF0YSBmb3JtYXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBkZiBUaGUgaW5wdXQgZGF0YSBjb250YWluaW5nIGEgUERGIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBpbmRpY2VzIFRoZSBpbmRpY2VzIG9mIHRoZSBwYWdlcyB0aGF0IHNob3VsZCBiZSBlbWJlZGRlZC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSBlbWJlZGRlZCBwYWdlcy5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRQZGYgPSBmdW5jdGlvbiAocGRmLCBpbmRpY2VzKSB7XG4gICAgICAgIGlmIChpbmRpY2VzID09PSB2b2lkIDApIHsgaW5kaWNlcyA9IFswXTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3JjRG9jLCBfYSwgc3JjUGFnZXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhwZGYsICdwZGYnLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhpbmRpY2VzLCAnaW5kaWNlcycsIFtBcnJheV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocGRmIGluc3RhbmNlb2YgUERGRG9jdW1lbnQpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gcGRmO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgUERGRG9jdW1lbnQubG9hZChwZGYpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RvYyA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGFnZXMgPSBwbHVja0luZGljZXMoc3JjRG9jLmdldFBhZ2VzKCksIGluZGljZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuZW1iZWRQYWdlcyhzcmNQYWdlcyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIGEgc2luZ2xlIFBERiBwYWdlIGludG8gdGhpcyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHNvdXJjZVBkZlVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy93aXRoX2xhcmdlX3BhZ2VfY291bnQucGRmJ1xuICAgICAqIGNvbnN0IHNvdXJjZUJ1ZmZlciA9IGF3YWl0IGZldGNoKHNvdXJjZVBkZlVybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBzb3VyY2VQZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKHNvdXJjZUJ1ZmZlcilcbiAgICAgKiBjb25zdCBzb3VyY2VQZGZQYWdlID0gc291cmNlUGRmRG9jLmdldFBhZ2VzKClbNzNdXG4gICAgICpcbiAgICAgKiBjb25zdCBlbWJlZGRlZFBhZ2UgPSBhd2FpdCBwZGZEb2MuZW1iZWRQYWdlKFxuICAgICAqICAgc291cmNlUGRmUGFnZSxcbiAgICAgKlxuICAgICAqICAgLy8gQ2xpcCBhIHNlY3Rpb24gb2YgdGhlIHNvdXJjZSBwYWdlIHNvIHRoYXQgd2Ugb25seSBlbWJlZCBwYXJ0IG9mIGl0XG4gICAgICogICB7IGxlZnQ6IDEwMCwgcmlnaHQ6IDQ1MCwgYm90dG9tOiAzMzAsIHRvcDogNTcwIH0sXG4gICAgICpcbiAgICAgKiAgIC8vIFRyYW5zbGF0ZSBhbGwgZHJhd2luZ3Mgb2YgdGhlIGVtYmVkZGVkIHBhZ2UgYnkgKDEwLCAyMDApIHVuaXRzXG4gICAgICogICBbMSwgMCwgMCwgMSwgMTAsIDIwMF0sXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gYmUgZW1iZWRkZWQuXG4gICAgICogQHBhcmFtIGJvdW5kaW5nQm94XG4gICAgICogT3B0aW9uYWxseSwgYW4gYXJlYSBvZiB0aGUgc291cmNlIHBhZ2UgdGhhdCBzaG91bGQgYmUgZW1iZWRkZWRcbiAgICAgKiAoZGVmYXVsdHMgdG8gZW50aXJlIHBhZ2UpLlxuICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbk1hdHJpeFxuICAgICAqIE9wdGlvbmFsbHksIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRoYXQgaXMgYWx3YXlzIGFwcGxpZWQgdG8gdGhlIGVtYmVkZGVkXG4gICAgICogcGFnZSBhbnl3aGVyZSBpdCBpcyBkcmF3bi5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIHRoZSBlbWJlZGRlZCBwZGYgcGFnZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRQYWdlID0gZnVuY3Rpb24gKHBhZ2UsIGJvdW5kaW5nQm94LCB0cmFuc2Zvcm1hdGlvbk1hdHJpeCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZW1iZWRkZWRQYWdlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRQYWdlcyhbcGFnZV0sIFtib3VuZGluZ0JveF0sIFt0cmFuc2Zvcm1hdGlvbk1hdHJpeF0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZWRQYWdlID0gKF9hLnNlbnQoKSlbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW1iZWRkZWRQYWdlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWJlZCBvbmUgb3IgbW9yZSBQREYgcGFnZXMgaW50byB0aGlzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqXG4gICAgICogY29uc3Qgc291cmNlUGRmVXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3dpdGhfbGFyZ2VfcGFnZV9jb3VudC5wZGYnXG4gICAgICogY29uc3Qgc291cmNlQnVmZmVyID0gYXdhaXQgZmV0Y2goc291cmNlUGRmVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IHNvdXJjZVBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoc291cmNlQnVmZmVyKVxuICAgICAqXG4gICAgICogY29uc3QgcGFnZTEgPSBzb3VyY2VQZGZEb2MuZ2V0UGFnZXMoKVswXVxuICAgICAqIGNvbnN0IHBhZ2UyID0gc291cmNlUGRmRG9jLmdldFBhZ2VzKClbNTJdXG4gICAgICogY29uc3QgcGFnZTMgPSBzb3VyY2VQZGZEb2MuZ2V0UGFnZXMoKVs3M11cbiAgICAgKlxuICAgICAqIGNvbnN0IGVtYmVkZGVkUGFnZXMgPSBhd2FpdCBwZGZEb2MuZW1iZWRQYWdlcyhbcGFnZTEsIHBhZ2UyLCBwYWdlM10pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZVxuICAgICAqIFRoZSBwYWdlcyB0byBiZSBlbWJlZGRlZCAodGhleSBtdXN0IGFsbCBzaGFyZSB0aGUgc2FtZSBjb250ZXh0KS5cbiAgICAgKiBAcGFyYW0gYm91bmRpbmdCb3hlc1xuICAgICAqIE9wdGlvbmFsbHksIGFuIGFycmF5IG9mIGNsaXBwaW5nIGJvdW5kYXJpZXMgLSBvbmUgZm9yIGVhY2ggcGFnZVxuICAgICAqIChkZWZhdWx0cyB0byBlbnRpcmV0eSBvZiBlYWNoIHBhZ2UpLlxuICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbk1hdHJpY2VzXG4gICAgICogT3B0aW9uYWxseSwgYW4gYXJyYXkgb2YgdHJhbnNmb3JtYXRpb24gbWF0cmljZXMgLSBvbmUgZm9yIGVhY2ggcGFnZVxuICAgICAqIChlYWNoIHBhZ2UncyB0cmFuc2Zvcm1hdGlvbiB3aWxsIGFwcGx5IGFueXdoZXJlIGl0IGlzIGRyYXduKS5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSBlbWJlZGRlZCBwZGYgcGFnZXMuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkUGFnZXMgPSBmdW5jdGlvbiAocGFnZXMsIGJvdW5kaW5nQm94ZXMsIHRyYW5zZm9ybWF0aW9uTWF0cmljZXMpIHtcbiAgICAgICAgaWYgKGJvdW5kaW5nQm94ZXMgPT09IHZvaWQgMCkgeyBib3VuZGluZ0JveGVzID0gW107IH1cbiAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9uTWF0cmljZXMgPT09IHZvaWQgMCkgeyB0cmFuc2Zvcm1hdGlvbk1hdHJpY2VzID0gW107IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGlkeCwgbGVuLCBjdXJyUGFnZSwgbmV4dFBhZ2UsIGNvbnRleHQsIG1heWJlQ29weVBhZ2UsIGVtYmVkZGVkUGFnZXMsIGlkeCwgbGVuLCBwYWdlLCBib3gsIG1hdHJpeCwgZW1iZWRkZXIsIHJlZjtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2VydCBhbGwgcGFnZXMgaGF2ZSB0aGUgc2FtZSBjb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDAsIGxlbiA9IHBhZ2VzLmxlbmd0aCAtIDE7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyUGFnZSA9IHBhZ2VzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFBhZ2UgPSBwYWdlc1tpZHggKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyclBhZ2Uubm9kZS5jb250ZXh0ICE9PSBuZXh0UGFnZS5ub2RlLmNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IHBhZ2VzWzBdLm5vZGUuY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlQ29weVBhZ2UgPSBjb250ZXh0ID09PSB0aGlzLmNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChwKSB7IHJldHVybiBwOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQREZPYmplY3RDb3BpZXIuZm9yKGNvbnRleHQsIHRoaXMuY29udGV4dCkuY29weTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkUGFnZXMgPSBuZXcgQXJyYXkocGFnZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IHBhZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gbWF5YmVDb3B5UGFnZShwYWdlc1tpZHhdLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm94ID0gYm91bmRpbmdCb3hlc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4ID0gdHJhbnNmb3JtYXRpb25NYXRyaWNlc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUERGUGFnZUVtYmVkZGVyLmZvcihwYWdlLCBib3gsIG1hdHJpeCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlciA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZFBhZ2VzW2lkeF0gPSBQREZFbWJlZGRlZFBhZ2Uub2YocmVmLCB0aGlzLCBlbWJlZGRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIChfYSA9IHRoaXMuZW1iZWRkZWRQYWdlcykucHVzaC5hcHBseShfYSwgZW1iZWRkZWRQYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW1iZWRkZWRQYWdlc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHNob3VsZG4ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZSBbW3NhdmVdXVxuICAgICAqID4gYW5kIFtbc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsIGF1dG9tYXRpY2FsbHkgZW5zdXJlIHRoYXQgYWxsIGVtYmVkZGVkXG4gICAgICogPiBhc3NldHMgYXJlIGZsdXNoZWQgYmVmb3JlIHNlcmlhbGl6aW5nIHRoZSBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZsdXNoIGFsbCBlbWJlZGRlZCBmb250cywgUERGIHBhZ2VzLCBhbmQgaW1hZ2VzIHRvIHRoaXMgZG9jdW1lbnQnc1xuICAgICAqIFtbY29udGV4dF1dLlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZmx1c2ggaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRBbGwodGhpcy5mb250cyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkQWxsKHRoaXMuaW1hZ2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRBbGwodGhpcy5lbWJlZGRlZFBhZ2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRBbGwodGhpcy5lbWJlZGRlZEZpbGVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRBbGwodGhpcy5qYXZhU2NyaXB0cyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIHRoaXMgZG9jdW1lbnQgdG8gYW4gYXJyYXkgb2YgYnl0ZXMgbWFraW5nIHVwIGEgUERGIGZpbGUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZCeXRlcyA9IGF3YWl0IHBkZkRvYy5zYXZlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0aGluZ3MgeW91IGNhbiBkbyB3aXRoIHRoZSBzZXJpYWxpemVkIGRvY3VtZW50LFxuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCB5b3UncmUgcnVubmluZyBpbjpcbiAgICAgKiAqIFdyaXRlIGl0IHRvIGEgZmlsZSBpbiBOb2RlIG9yIFJlYWN0IE5hdGl2ZVxuICAgICAqICogRG93bmxvYWQgaXQgYXMgYSBCbG9iIGluIHRoZSBicm93c2VyXG4gICAgICogKiBSZW5kZXIgaXQgaW4gYW4gYGlmcmFtZWBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBzYXZpbmcgdGhlIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIGJ5dGVzIG9mIHRoZSBzZXJpYWxpemVkIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCB1c2VPYmplY3RTdHJlYW1zLCBfYiwgYWRkRGVmYXVsdFBhZ2UsIF9jLCBvYmplY3RzUGVyVGljaywgX2QsIHVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMsIGZvcm0sIFdyaXRlcjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gb3B0aW9ucy51c2VPYmplY3RTdHJlYW1zLCB1c2VPYmplY3RTdHJlYW1zID0gX2EgPT09IHZvaWQgMCA/IHRydWUgOiBfYSwgX2IgPSBvcHRpb25zLmFkZERlZmF1bHRQYWdlLCBhZGREZWZhdWx0UGFnZSA9IF9iID09PSB2b2lkIDAgPyB0cnVlIDogX2IsIF9jID0gb3B0aW9ucy5vYmplY3RzUGVyVGljaywgb2JqZWN0c1BlclRpY2sgPSBfYyA9PT0gdm9pZCAwID8gNTAgOiBfYywgX2QgPSBvcHRpb25zLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMsIHVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMgPSBfZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9kO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXModXNlT2JqZWN0U3RyZWFtcywgJ3VzZU9iamVjdFN0cmVhbXMnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhhZGREZWZhdWx0UGFnZSwgJ2FkZERlZmF1bHRQYWdlJywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMob2JqZWN0c1BlclRpY2ssICdvYmplY3RzUGVyVGljaycsIFsnbnVtYmVyJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXModXBkYXRlRmllbGRBcHBlYXJhbmNlcywgJ3VwZGF0ZUZpZWxkQXBwZWFyYW5jZXMnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkRGVmYXVsdFBhZ2UgJiYgdGhpcy5nZXRQYWdlQ291bnQoKSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVGaWVsZEFwcGVhcmFuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSA9IHRoaXMuZm9ybUNhY2hlLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5mbHVzaCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVyID0gdXNlT2JqZWN0U3RyZWFtcyA/IFBERlN0cmVhbVdyaXRlciA6IFBERldyaXRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBXcml0ZXIuZm9yQ29udGV4dCh0aGlzLmNvbnRleHQsIG9iamVjdHNQZXJUaWNrKS5zZXJpYWxpemVUb0J1ZmZlcigpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgdGhpcyBkb2N1bWVudCB0byBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBvciBkYXRhIFVSSSBtYWtpbmcgdXAgYVxuICAgICAqIFBERiBmaWxlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGJhc2U2NFN0cmluZyA9IGF3YWl0IHBkZkRvYy5zYXZlQXNCYXNlNjQoKVxuICAgICAqIGJhc2U2NFN0cmluZyAvLyA9PiAnSlZCRVJpMHhMamNLSllHQmdZRUtDLi4uJ1xuICAgICAqXG4gICAgICogY29uc3QgYmFzZTY0RGF0YVVyaSA9IGF3YWl0IHBkZkRvYy5zYXZlQXNCYXNlNjQoeyBkYXRhVXJpOiB0cnVlIH0pXG4gICAgICogYmFzZTY0RGF0YVVyaSAvLyA9PiAnZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LEpWQkVSaTB4TGpjS0pZR0JnWUVLQy4uLidcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBzYXZpbmcgdGhlIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgb3IgZGF0YSBVUkkgb2YgdGhlXG4gICAgICogICAgICAgICAgc2VyaWFsaXplZCBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2F2ZUFzQmFzZTY0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBkYXRhVXJpLCBvdGhlck9wdGlvbnMsIGJ5dGVzLCBiYXNlNjQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9wdGlvbnMuZGF0YVVyaSwgZGF0YVVyaSA9IF9hID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hLCBvdGhlck9wdGlvbnMgPSBfX3Jlc3Qob3B0aW9ucywgW1wiZGF0YVVyaVwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhkYXRhVXJpLCAnZGF0YVVyaScsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc2F2ZShvdGhlck9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBlbmNvZGVUb0Jhc2U2NChieXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YVVyaSA/IFwiZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LFwiICsgYmFzZTY0IDogYmFzZTY0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZmluZFBhZ2VGb3JBbm5vdGF0aW9uUmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICB2YXIgcGFnZXMgPSB0aGlzLmdldFBhZ2VzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHBhZ2VzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHBhZ2UgPSBwYWdlc1tpZHhdO1xuICAgICAgICAgICAgdmFyIGFubm90YXRpb25zID0gcGFnZS5ub2RlLkFubm90cygpO1xuICAgICAgICAgICAgaWYgKChhbm5vdGF0aW9ucyA9PT0gbnVsbCB8fCBhbm5vdGF0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYW5ub3RhdGlvbnMuaW5kZXhPZihyZWYpKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZEFsbCA9IGZ1bmN0aW9uIChlbWJlZGRhYmxlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaWR4LCBsZW47XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBlbWJlZGRhYmxlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZW1iZWRkYWJsZXNbaWR4XS5lbWJlZCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUudXBkYXRlSW5mb0RpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwZGZMaWIgPSBcInBkZi1saWIgKGh0dHBzOi8vZ2l0aHViLmNvbS9Ib3BkaW5nL3BkZi1saWIpXCI7XG4gICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgaW5mbyA9IHRoaXMuZ2V0SW5mb0RpY3QoKTtcbiAgICAgICAgdGhpcy5zZXRQcm9kdWNlcihwZGZMaWIpO1xuICAgICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUobm93KTtcbiAgICAgICAgaWYgKCFpbmZvLmdldChQREZOYW1lLm9mKCdDcmVhdG9yJykpKVxuICAgICAgICAgICAgdGhpcy5zZXRDcmVhdG9yKHBkZkxpYik7XG4gICAgICAgIGlmICghaW5mby5nZXQoUERGTmFtZS5vZignQ3JlYXRpb25EYXRlJykpKVxuICAgICAgICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUobm93KTtcbiAgICB9O1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRJbmZvRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nSW5mbyA9IHRoaXMuY29udGV4dC5sb29rdXAodGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLkluZm8pO1xuICAgICAgICBpZiAoZXhpc3RpbmdJbmZvIGluc3RhbmNlb2YgUERGRGljdClcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0luZm87XG4gICAgICAgIHZhciBuZXdJbmZvID0gdGhpcy5jb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIHRoaXMuY29udGV4dC50cmFpbGVySW5mby5JbmZvID0gdGhpcy5jb250ZXh0LnJlZ2lzdGVyKG5ld0luZm8pO1xuICAgICAgICByZXR1cm4gbmV3SW5mbztcbiAgICB9O1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5hc3NlcnRGb250a2l0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9udGtpdClcbiAgICAgICAgICAgIHRocm93IG5ldyBGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRraXQ7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRG9jdW1lbnQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRG9jdW1lbnQ7XG4vKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgb25seS1hcnJvdy1mdW5jdGlvbnMgKi9cbmZ1bmN0aW9uIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKHBkZk9iamVjdCkge1xuICAgIGlmICghKHBkZk9iamVjdCBpbnN0YW5jZW9mIFBERkhleFN0cmluZykgJiZcbiAgICAgICAgIShwZGZPYmplY3QgaW5zdGFuY2VvZiBQREZTdHJpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yKFtQREZIZXhTdHJpbmcsIFBERlN0cmluZ10sIHBkZk9iamVjdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRG9jdW1lbnQuanMubWFwIiwiZXhwb3J0IHZhciBQYXJzZVNwZWVkcztcbihmdW5jdGlvbiAoUGFyc2VTcGVlZHMpIHtcbiAgICBQYXJzZVNwZWVkc1tQYXJzZVNwZWVkc1tcIkZhc3Rlc3RcIl0gPSBJbmZpbml0eV0gPSBcIkZhc3Rlc3RcIjtcbiAgICBQYXJzZVNwZWVkc1tQYXJzZVNwZWVkc1tcIkZhc3RcIl0gPSAxNTAwXSA9IFwiRmFzdFwiO1xuICAgIFBhcnNlU3BlZWRzW1BhcnNlU3BlZWRzW1wiTWVkaXVtXCJdID0gNTAwXSA9IFwiTWVkaXVtXCI7XG4gICAgUGFyc2VTcGVlZHNbUGFyc2VTcGVlZHNbXCJTbG93XCJdID0gMTAwXSA9IFwiU2xvd1wiO1xufSkoUGFyc2VTcGVlZHMgfHwgKFBhcnNlU3BlZWRzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkRvY3VtZW50T3B0aW9ucy5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQREZOYW1lLCBQREZBcnJheSwgUERGRGljdCwgUERGSGV4U3RyaW5nIH0gZnJvbSBcIi4uL2NvcmVcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIGZpbGUgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERkVtYmVkZGVkRmlsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZFbWJlZGRlZEZpbGUocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHRoaXMuYWxyZWFkeUVtYmVkZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5lbWJlZGRlciA9IGVtYmVkZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBUaGVcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuc2F2ZV1dIGFuZCBbW1BERkRvY3VtZW50LnNhdmVBc0Jhc2U2NF1dIG1ldGhvZHMgd2lsbFxuICAgICAqID4gYXV0b21hdGljYWxseSBlbnN1cmUgYWxsIGVtYmVkZGFibGUgZmlsZXMgZ2V0IGVtYmVkZGVkLlxuICAgICAqXG4gICAgICogRW1iZWQgdGhpcyBlbWJlZGRhYmxlIGZpbGUgaW4gaXRzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZW1iZWRkaW5nIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkRmlsZS5wcm90b3R5cGUuZW1iZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZWYsIE5hbWVzLCBFbWJlZGRlZEZpbGVzLCBFRk5hbWVzLCBBRjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMuYWxyZWFkeUVtYmVkZGVkKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRkZXIuZW1iZWRJbnRvQ29udGV4dCh0aGlzLmRvYy5jb250ZXh0LCB0aGlzLnJlZildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZG9jLmNhdGFsb2cuaGFzKFBERk5hbWUub2YoJ05hbWVzJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2MuY2F0YWxvZy5zZXQoUERGTmFtZS5vZignTmFtZXMnKSwgdGhpcy5kb2MuY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzID0gdGhpcy5kb2MuY2F0YWxvZy5sb29rdXAoUERGTmFtZS5vZignTmFtZXMnKSwgUERGRGljdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU5hbWVzLmhhcyhQREZOYW1lLm9mKCdFbWJlZGRlZEZpbGVzJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXMuc2V0KFBERk5hbWUub2YoJ0VtYmVkZGVkRmlsZXMnKSwgdGhpcy5kb2MuY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkZGVkRmlsZXMgPSBOYW1lcy5sb29rdXAoUERGTmFtZS5vZignRW1iZWRkZWRGaWxlcycpLCBQREZEaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRW1iZWRkZWRGaWxlcy5oYXMoUERGTmFtZS5vZignTmFtZXMnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZEZpbGVzLnNldChQREZOYW1lLm9mKCdOYW1lcycpLCB0aGlzLmRvYy5jb250ZXh0Lm9iaihbXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgRUZOYW1lcyA9IEVtYmVkZGVkRmlsZXMubG9va3VwKFBERk5hbWUub2YoJ05hbWVzJyksIFBERkFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEVGTmFtZXMucHVzaChQREZIZXhTdHJpbmcuZnJvbVRleHQodGhpcy5lbWJlZGRlci5maWxlTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRUZOYW1lcy5wdXNoKHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBBRi1UYWcgaXMgbmVlZGVkIHRvIGFjaGlldmUgUERGLUEzIGNvbXBsaWFuY2UgZm9yIGVtYmVkZGVkIGZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlIGZvbGxvd2luZyBkb2N1bWVudCBvdXRsaW5lcyB0aGUgdXNlcyBjYXNlcyBvZiB0aGUgYXNzb2NpYXRlZCBmaWxlcyAoQUYpIHRhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vd3d3LnBkZmEub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE4LzEwL1BERjIwX0FOMDAyLUFGLnBkZlxuICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZG9jLmNhdGFsb2cuaGFzKFBERk5hbWUub2YoJ0FGJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2MuY2F0YWxvZy5zZXQoUERGTmFtZS5vZignQUYnKSwgdGhpcy5kb2MuY29udGV4dC5vYmooW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEFGID0gdGhpcy5kb2MuY2F0YWxvZy5sb29rdXAoUERGTmFtZS5vZignQUYnKSwgUERGQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgQUYucHVzaChyZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuYXR0YWNoXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZVxuICAgICAqIGluc3RhbmNlcyBvZiBbW1BERkVtYmVkZGVkRmlsZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZFbWJlZGRlZEZpbGVdXSBmcm9tIGFuIGV4aXN0aW5nIHJlZiBhbmQgZW1iZWRkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgZmlsZS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgZmlsZSB3aWxsIGJlbG9uZy5cbiAgICAgKiBAcGFyYW0gZW1iZWRkZXIgVGhlIGVtYmVkZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVtYmVkIHRoZSBmaWxlLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkRmlsZS5vZiA9IGZ1bmN0aW9uIChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZFbWJlZGRlZEZpbGUocmVmLCBkb2MsIGVtYmVkZGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZFbWJlZGRlZEZpbGU7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRW1iZWRkZWRGaWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRW1iZWRkZWRGaWxlLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEb2N1bWVudCBmcm9tIFwiLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IHsgUERGUGFnZUVtYmVkZGVyLCBQREZSZWYgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIFBERiBwYWdlIHRoYXQgaGFzIGJlZW4gZW1iZWRkZWQgaW4gYSBbW1BERkRvY3VtZW50XV0uXG4gKi9cbnZhciBQREZFbWJlZGRlZFBhZ2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGRW1iZWRkZWRQYWdlKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IGZhbHNlO1xuICAgICAgICBhc3NlcnRJcyhyZWYsICdyZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIGFzc2VydElzKGVtYmVkZGVyLCAnZW1iZWRkZXInLCBbW1BERlBhZ2VFbWJlZGRlciwgJ1BERlBhZ2VFbWJlZGRlciddXSk7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy53aWR0aCA9IGVtYmVkZGVyLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGVtYmVkZGVyLmhlaWdodDtcbiAgICAgICAgdGhpcy5lbWJlZGRlciA9IGVtYmVkZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgcGFnZSBhZnRlciBiZWluZyBzY2FsZWQgYnkgdGhlXG4gICAgICogZ2l2ZW4gYGZhY3RvcmAuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogZW1iZWRkZWRQYWdlLndpZHRoICAvLyA9PiA1MDBcbiAgICAgKiBlbWJlZGRlZFBhZ2UuaGVpZ2h0IC8vID0+IDI1MFxuICAgICAqXG4gICAgICogY29uc3Qgc2NhbGVkID0gZW1iZWRkZWRQYWdlLnNjYWxlKDAuNSlcbiAgICAgKiBzY2FsZWQud2lkdGggIC8vID0+IDI1MFxuICAgICAqIHNjYWxlZC5oZWlnaHQgLy8gPT4gMTI1XG4gICAgICogYGBgXG4gICAgICogVGhpcyBvcGVyYXRpb24gaXMgb2Z0ZW4gdXNlZnVsIGJlZm9yZSBkcmF3aW5nIGEgcGFnZSB3aXRoXG4gICAgICogW1tQREZQYWdlLmRyYXdQYWdlXV0gdG8gY29tcHV0ZSB0aGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0gZmFjdG9yIFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhpcyBwYWdlIHNob3VsZCBiZSBzY2FsZWQuXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHBhZ2UgYWZ0ZXIgYmVpbmcgc2NhbGVkLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkUGFnZS5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAoZmFjdG9yKSB7XG4gICAgICAgIGFzc2VydElzKGZhY3RvciwgJ2ZhY3RvcicsIFsnbnVtYmVyJ10pO1xuICAgICAgICByZXR1cm4geyB3aWR0aDogdGhpcy53aWR0aCAqIGZhY3RvciwgaGVpZ2h0OiB0aGlzLmhlaWdodCAqIGZhY3RvciB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGVtYmVkZGVkUGFnZS5zaXplKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZFbWJlZGRlZFBhZ2UucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlKDEpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LnNhdmVdXSBhbmQgW1tQREZEb2N1bWVudC5zYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGxcbiAgICAgKiA+IGF1dG9tYXRpY2FsbHkgZW5zdXJlIGFsbCBlbWJlZGRhYmxlIHBhZ2VzIGdldCBlbWJlZGRlZC5cbiAgICAgKlxuICAgICAqIEVtYmVkIHRoaXMgZW1iZWRkYWJsZSBwYWdlIGluIGl0cyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGVtYmVkZGluZyBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZFbWJlZGRlZFBhZ2UucHJvdG90eXBlLmVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLmFscmVhZHlFbWJlZGRlZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkZGVyLmVtYmVkSW50b0NvbnRleHQodGhpcy5kb2MuY29udGV4dCwgdGhpcy5yZWYpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuZW1iZWRQZGZdXSBhbmRcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuZW1iZWRQYWdlXV0gbWV0aG9kcywgd2hpY2ggd2lsbCBjcmVhdGUgaW5zdGFuY2VzIG9mXG4gICAgICogPiBbW1BERkVtYmVkZGVkUGFnZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZFbWJlZGRlZFBhZ2VdXSBmcm9tIGFuIGV4aXN0aW5nIHJlZiBhbmQgZW1iZWRkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgZW1iZWRkZWQgcGFnZS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgZW1iZWRkZWQgcGFnZSB3aWxsIGJlbG9uZy5cbiAgICAgKiBAcGFyYW0gZW1iZWRkZXIgVGhlIGVtYmVkZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVtYmVkIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkUGFnZS5vZiA9IGZ1bmN0aW9uIChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZFbWJlZGRlZFBhZ2UocmVmLCBkb2MsIGVtYmVkZGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZFbWJlZGRlZFBhZ2U7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRW1iZWRkZWRQYWdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRW1iZWRkZWRQYWdlLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEb2N1bWVudCBmcm9tIFwiLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IHsgQ3VzdG9tRm9udEVtYmVkZGVyLCBQREZSZWYsIFN0YW5kYXJkRm9udEVtYmVkZGVyLCB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0T3JVbmRlZmluZWQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIGZvbnQgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERkZvbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGRm9udChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IHRydWU7XG4gICAgICAgIGFzc2VydElzKHJlZiwgJ3JlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZW1iZWRkZXIsICdlbWJlZGRlcicsIFtcbiAgICAgICAgICAgIFtDdXN0b21Gb250RW1iZWRkZXIsICdDdXN0b21Gb250RW1iZWRkZXInXSxcbiAgICAgICAgICAgIFtTdGFuZGFyZEZvbnRFbWJlZGRlciwgJ1N0YW5kYXJkRm9udEVtYmVkZGVyJ10sXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMubmFtZSA9IGVtYmVkZGVyLmZvbnROYW1lO1xuICAgICAgICB0aGlzLmVtYmVkZGVyID0gZW1iZWRkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZQYWdlLmRyYXdUZXh0XV0gbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBlbmNvZGUgdGhlIHRleHQgaXQgaXNcbiAgICAgKiA+IGdpdmVuLlxuICAgICAqXG4gICAgICogRW5jb2RlcyBhIHN0cmluZyBvZiB0ZXh0IGluIHRoaXMgZm9udC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIGVuY29kZWQuXG4gICAgICogQHJldHVybnMgVGhlIGVuY29kZWQgdGV4dCBhcyBhIGhleCBzdHJpbmcuXG4gICAgICovXG4gICAgUERGRm9udC5wcm90b3R5cGUuZW5jb2RlVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIGFzc2VydElzKHRleHQsICd0ZXh0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIHRoaXMubW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlci5lbmNvZGVUZXh0KHRleHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWVhc3VyZSB0aGUgd2lkdGggb2YgYSBzdHJpbmcgb2YgdGV4dCBkcmF3biBpbiB0aGlzIGZvbnQgYXQgYSBnaXZlbiBzaXplLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgd2lkdGggPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKCdGb28gQmFyIFF1eCBCYXonLCAzNilcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgc3RyaW5nIG9mIHRleHQgdG8gYmUgbWVhc3VyZWQuXG4gICAgICogQHBhcmFtIHNpemUgVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIGZvciB0aGlzIG1lYXN1cmVtZW50LlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBvZiB0aGUgc3RyaW5nIG9mIHRleHQgd2hlbiBkcmF3biBpbiB0aGlzIGZvbnQgYXQgdGhlXG4gICAgICogICAgICAgICAgZ2l2ZW4gc2l6ZS5cbiAgICAgKi9cbiAgICBQREZGb250LnByb3RvdHlwZS53aWR0aE9mVGV4dEF0U2l6ZSA9IGZ1bmN0aW9uICh0ZXh0LCBzaXplKSB7XG4gICAgICAgIGFzc2VydElzKHRleHQsICd0ZXh0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIGFzc2VydElzKHNpemUsICdzaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLndpZHRoT2ZUZXh0QXRTaXplKHRleHQsIHNpemUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWVhc3VyZSB0aGUgaGVpZ2h0IG9mIHRoaXMgZm9udCBhdCBhIGdpdmVuIHNpemUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVpZ2h0ID0gZm9udC5oZWlnaHRBdFNpemUoMjQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgYG9wdGlvbnMuZGVzY2VuZGVyYCB2YWx1ZSBjb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgZm9udCdzXG4gICAgICogZGVzY2VuZGVyIGlzIGluY2x1ZGVkIGluIHRoZSBoZWlnaHQgY2FsY3VsYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgZm9yIHRoaXMgbWVhc3VyZW1lbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGlzIG1lYXN1cmVtZW50LlxuICAgICAqIEByZXR1cm5zIFRoZSBoZWlnaHQgb2YgdGhpcyBmb250IGF0IHRoZSBnaXZlbiBzaXplLlxuICAgICAqL1xuICAgIFBERkZvbnQucHJvdG90eXBlLmhlaWdodEF0U2l6ZSA9IGZ1bmN0aW9uIChzaXplLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgYXNzZXJ0SXMoc2l6ZSwgJ3NpemUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRlc2NlbmRlciwgJ29wdGlvbnMuZGVzY2VuZGVyJywgWydib29sZWFuJ10pO1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlci5oZWlnaHRPZkZvbnRBdFNpemUoc2l6ZSwge1xuICAgICAgICAgICAgZGVzY2VuZGVyOiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVzY2VuZGVyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbXB1dGUgdGhlIGZvbnQgc2l6ZSBhdCB3aGljaCB0aGlzIGZvbnQgaXMgYSBnaXZlbiBoZWlnaHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udFNpemUgPSBmb250LnNpemVBdEhlaWdodCgxMilcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgdG8gYmUgdXNlZCBmb3IgdGhpcyBjYWxjdWxhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBUaGUgZm9udCBzaXplIGF0IHdoaWNoIHRoaXMgZm9udCBpcyB0aGUgZ2l2ZW4gaGVpZ2h0LlxuICAgICAqL1xuICAgIFBERkZvbnQucHJvdG90eXBlLnNpemVBdEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLnNpemVPZkZvbnRBdEhlaWdodChoZWlnaHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZXQgb2YgdW5pY29kZSBjb2RlIHBvaW50cyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBieSB0aGlzIGZvbnQuXG4gICAgICogQHJldHVybnMgVGhlIHNldCBvZiB1bmljb2RlIGNvZGUgcG9pbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZvbnQuXG4gICAgICovXG4gICAgUERGRm9udC5wcm90b3R5cGUuZ2V0Q2hhcmFjdGVyU2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5lbWJlZGRlciBpbnN0YW5jZW9mIFN0YW5kYXJkRm9udEVtYmVkZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlci5lbmNvZGluZy5zdXBwb3J0ZWRDb2RlUG9pbnRzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZXIuZm9udC5jaGFyYWN0ZXJTZXQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZEb2N1bWVudC5zYXZlXV0gYW5kIFtbUERGRG9jdW1lbnQuc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsXG4gICAgICogPiBhdXRvbWF0aWNhbGx5IGVuc3VyZSBhbGwgZm9udHMgZ2V0IGVtYmVkZGVkLlxuICAgICAqXG4gICAgICogRW1iZWQgdGhpcyBmb250IGluIGl0cyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGVtYmVkZGluZyBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZGb250LnByb3RvdHlwZS5lbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1vZGlmaWVkKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRkZXIuZW1iZWRJbnRvQ29udGV4dCh0aGlzLmRvYy5jb250ZXh0LCB0aGlzLnJlZildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5lbWJlZEZvbnRdXSBhbmRcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuZW1iZWRTdGFuZGFyZEZvbnRdXSBtZXRob2RzLCB3aGljaCB3aWxsIGNyZWF0ZSBpbnN0YW5jZXNcbiAgICAgKiA+IG9mIFtbUERGRm9udF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZGb250XV0gZnJvbSBhbiBleGlzdGluZyByZWYgYW5kIGVtYmVkZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIGZvbnQuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIGZvbnQgd2lsbCBiZWxvbmcuXG4gICAgICogQHBhcmFtIGVtYmVkZGVyIFRoZSBlbWJlZGRlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBlbWJlZCB0aGUgZm9udC5cbiAgICAgKi9cbiAgICBQREZGb250Lm9mID0gZnVuY3Rpb24gKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkZvbnQocmVmLCBkb2MsIGVtYmVkZGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZGb250O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkZvbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZGb250LmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEb2N1bWVudCBmcm9tIFwiLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IHsgSnBlZ0VtYmVkZGVyLCBQREZSZWYsIFBuZ0VtYmVkZGVyIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1hZ2UgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERkltYWdlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkltYWdlKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICBhc3NlcnRJcyhyZWYsICdyZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIGFzc2VydElzKGVtYmVkZGVyLCAnZW1iZWRkZXInLCBbXG4gICAgICAgICAgICBbSnBlZ0VtYmVkZGVyLCAnSnBlZ0VtYmVkZGVyJ10sXG4gICAgICAgICAgICBbUG5nRW1iZWRkZXIsICdQbmdFbWJlZGRlciddLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLndpZHRoID0gZW1iZWRkZXIud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gZW1iZWRkZXIuaGVpZ2h0O1xuICAgICAgICB0aGlzLmVtYmVkZGVyID0gZW1iZWRkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhpcyBpbWFnZSBhZnRlciBiZWluZyBzY2FsZWQgYnkgdGhlXG4gICAgICogZ2l2ZW4gYGZhY3RvcmAuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1hZ2Uud2lkdGggIC8vID0+IDUwMFxuICAgICAqIGltYWdlLmhlaWdodCAvLyA9PiAyNTBcbiAgICAgKlxuICAgICAqIGNvbnN0IHNjYWxlZCA9IGltYWdlLnNjYWxlKDAuNSlcbiAgICAgKiBzY2FsZWQud2lkdGggIC8vID0+IDI1MFxuICAgICAqIHNjYWxlZC5oZWlnaHQgLy8gPT4gMTI1XG4gICAgICogYGBgXG4gICAgICogVGhpcyBvcGVyYXRpb24gaXMgb2Z0ZW4gdXNlZnVsIGJlZm9yZSBkcmF3aW5nIGFuIGltYWdlIHdpdGhcbiAgICAgKiBbW1BERlBhZ2UuZHJhd0ltYWdlXV0gdG8gY29tcHV0ZSB0aGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0gZmFjdG9yIFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhpcyBpbWFnZSBzaG91bGQgYmUgc2NhbGVkLlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZSBhZnRlciBiZWluZyBzY2FsZWQuXG4gICAgICovXG4gICAgUERGSW1hZ2UucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKGZhY3Rvcikge1xuICAgICAgICBhc3NlcnRJcyhmYWN0b3IsICdmYWN0b3InLCBbJ251bWJlciddKTtcbiAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHRoaXMud2lkdGggKiBmYWN0b3IsIGhlaWdodDogdGhpcy5oZWlnaHQgKiBmYWN0b3IgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGlzIGltYWdlIGFmdGVyIHNjYWxpbmcgaXQgYXMgbGFyZ2UgYXNcbiAgICAgKiBwb3NzaWJsZSB3aGlsZSBtYWludGFpbmluZyBpdHMgYXNwZWN0IHJhdGlvIGFuZCBub3QgZXhjZWVkaW5nIHRoZVxuICAgICAqIHNwZWNpZmllZCBgd2lkdGhgIGFuZCBgaGVpZ2h0YC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBgXG4gICAgICogaW1hZ2Uud2lkdGggIC8vID0+IDUwMFxuICAgICAqIGltYWdlLmhlaWdodCAvLyA9PiAyNTBcbiAgICAgKlxuICAgICAqIGNvbnN0IHNjYWxlZCA9IGltYWdlLnNjYWxlVG9GaXQoNzUwLCAxMDAwKVxuICAgICAqIHNjYWxlZC53aWR0aCAgLy8gPT4gNzUwXG4gICAgICogc2NhbGVkLmhlaWdodCAvLyA9PiAzNzVcbiAgICAgKiBgYGBcbiAgICAgKiBUaGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgcGFyYW1ldGVycyBjYW4gYWxzbyBiZSB0aG91Z2h0IG9mIGFzIHRoZSB3aWR0aFxuICAgICAqIGFuZCBoZWlnaHQgb2YgYSBib3ggdGhhdCB0aGUgc2NhbGVkIGltYWdlIG11c3QgZml0IHdpdGhpbi5cbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIGJvdW5kaW5nIGJveCdzIHdpZHRoLlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGJvdW5kaW5nIGJveCdzIGhlaWdodC5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UgYWZ0ZXIgYmVpbmcgc2NhbGVkLlxuICAgICAqL1xuICAgIFBERkltYWdlLnByb3RvdHlwZS5zY2FsZVRvRml0ID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIGltZ1dpZHRoU2NhbGUgPSB3aWR0aCAvIHRoaXMud2lkdGg7XG4gICAgICAgIHZhciBpbWdIZWlnaHRTY2FsZSA9IGhlaWdodCAvIHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgc2NhbGUgPSBNYXRoLm1pbihpbWdXaWR0aFNjYWxlLCBpbWdIZWlnaHRTY2FsZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlKHNjYWxlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGlzIGltYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gaW1hZ2Uuc2l6ZSgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGltYWdlLlxuICAgICAqL1xuICAgIFBERkltYWdlLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSgxKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZEb2N1bWVudC5zYXZlXV0gYW5kIFtbUERGRG9jdW1lbnQuc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsXG4gICAgICogPiBhdXRvbWF0aWNhbGx5IGVuc3VyZSBhbGwgaW1hZ2VzIGdldCBlbWJlZGRlZC5cbiAgICAgKlxuICAgICAqIEVtYmVkIHRoaXMgaW1hZ2UgaW4gaXRzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZW1iZWRkaW5nIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkltYWdlLnByb3RvdHlwZS5lbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBkb2MsIHJlZjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbWJlZGRlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaW1hZ2Ugc2hvdWxkIG9ubHkgYmUgZW1iZWRkZWQgb25jZS4gSWYgdGhlcmUncyBhIHBlbmRpbmcgZW1iZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdGlvbiB0aGVuIHdhaXQgb24gaXQuIE90aGVyd2lzZSB3ZSBuZWVkIHRvIHN0YXJ0IHRoZSBlbWJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbWJlZFRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMsIGRvYyA9IF9hLmRvYywgcmVmID0gX2EucmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRUYXNrID0gdGhpcy5lbWJlZGRlci5lbWJlZEludG9Db250ZXh0KGRvYy5jb250ZXh0LCByZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZFRhc2tdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjbGVhciBgdGhpcy5lbWJlZGRlcmAgc28gdGhhdCB0aGUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGltYWdlIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZCwgdGh1cyBhdm9pZGluZyBhIG1lbW9yeSBsZWFrLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Ib3BkaW5nL3BkZi1saWIvcHVsbC8xMDMyL2ZpbGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWJlZGRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuZW1iZWRQbmddXSBhbmQgW1tQREZEb2N1bWVudC5lbWJlZEpwZ11dXG4gICAgICogPiBtZXRob2RzLCB3aGljaCB3aWxsIGNyZWF0ZSBpbnN0YW5jZXMgb2YgW1tQREZJbWFnZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZJbWFnZV1dIGZyb20gYW4gZXhpc3RpbmcgcmVmIGFuZCBlbWJlZGRlclxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBpbWFnZS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgaW1hZ2Ugd2lsbCBiZWxvbmcuXG4gICAgICogQHBhcmFtIGVtYmVkZGVyIFRoZSBlbWJlZGRlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBlbWJlZCB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgUERGSW1hZ2Uub2YgPSBmdW5jdGlvbiAocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGSW1hZ2UocmVmLCBkb2MsIGVtYmVkZGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZJbWFnZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZJbWFnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkltYWdlLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFBERk5hbWUsIFBERkFycmF5LCBQREZEaWN0LCBQREZIZXhTdHJpbmcgfSBmcm9tIFwiLi4vY29yZVwiO1xuLyoqXG4gKiBSZXByZXNlbnRzIEphdmFTY3JpcHQgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERkphdmFTY3JpcHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGSmF2YVNjcmlwdChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmVtYmVkZGVyID0gZW1iZWRkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZEb2N1bWVudC5zYXZlXV0gYW5kIFtbUERGRG9jdW1lbnQuc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsXG4gICAgICogPiBhdXRvbWF0aWNhbGx5IGVuc3VyZSBhbGwgSmF2YVNjcmlwdHMgZ2V0IGVtYmVkZGVkLlxuICAgICAqXG4gICAgICogRW1iZWQgdGhpcyBKYXZhU2NyaXB0IGluIGl0cyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGVtYmVkZGluZyBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZKYXZhU2NyaXB0LnByb3RvdHlwZS5lbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBjYXRhbG9nLCBjb250ZXh0LCByZWYsIE5hbWVzLCBKYXZhc2NyaXB0LCBKU05hbWVzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5hbHJlYWR5RW1iZWRkZWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzLmRvYywgY2F0YWxvZyA9IF9hLmNhdGFsb2csIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZGRlci5lbWJlZEludG9Db250ZXh0KHRoaXMuZG9jLmNvbnRleHQsIHRoaXMucmVmKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2F0YWxvZy5oYXMoUERGTmFtZS5vZignTmFtZXMnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLnNldChQREZOYW1lLm9mKCdOYW1lcycpLCBjb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXMgPSBjYXRhbG9nLmxvb2t1cChQREZOYW1lLm9mKCdOYW1lcycpLCBQREZEaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTmFtZXMuaGFzKFBERk5hbWUub2YoJ0phdmFTY3JpcHQnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lcy5zZXQoUERGTmFtZS5vZignSmF2YVNjcmlwdCcpLCBjb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgSmF2YXNjcmlwdCA9IE5hbWVzLmxvb2t1cChQREZOYW1lLm9mKCdKYXZhU2NyaXB0JyksIFBERkRpY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKYXZhc2NyaXB0LmhhcyhQREZOYW1lLm9mKCdOYW1lcycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFzY3JpcHQuc2V0KFBERk5hbWUub2YoJ05hbWVzJyksIGNvbnRleHQub2JqKFtdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBKU05hbWVzID0gSmF2YXNjcmlwdC5sb29rdXAoUERGTmFtZS5vZignTmFtZXMnKSwgUERGQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSlNOYW1lcy5wdXNoKFBERkhleFN0cmluZy5mcm9tVGV4dCh0aGlzLmVtYmVkZGVyLnNjcmlwdE5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTTmFtZXMucHVzaChyZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuYWRkSmF2YVNjcmlwdF1dIG1ldGhvZCwgd2hpY2ggd2lsbFxuICAgICAqIGNyZWF0ZSBpbnN0YW5jZXMgb2YgW1tQREZKYXZhU2NyaXB0XV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkphdmFTY3JpcHRdXSBmcm9tIGFuIGV4aXN0aW5nIHJlZiBhbmQgc2NyaXB0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIHNjcmlwdC5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgc2NyaXB0IHdpbGwgYmVsb25nLlxuICAgICAqIEBwYXJhbSBlbWJlZGRlciBUaGUgZW1iZWRkZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZW1iZWQgdGhlIHNjcmlwdC5cbiAgICAgKi9cbiAgICBQREZKYXZhU2NyaXB0Lm9mID0gZnVuY3Rpb24gKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkphdmFTY3JpcHQocmVmLCBkb2MsIGVtYmVkZGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZKYXZhU2NyaXB0O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkphdmFTY3JpcHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZKYXZhU2NyaXB0LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRyYXdJbWFnZSwgZHJhd0xpbmUsIGRyYXdMaW5lc09mVGV4dCwgZHJhd1BhZ2UsIGRyYXdSZWN0YW5nbGUsIGRyYXdTdmdQYXRoLCBkcmF3RWxsaXBzZSwgfSBmcm9tIFwiLi9vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBwb3BHcmFwaGljc1N0YXRlLCBwdXNoR3JhcGhpY3NTdGF0ZSwgdHJhbnNsYXRlLCBMaW5lQ2FwU3R5bGUsIHNjYWxlLCB9IGZyb20gXCIuL29wZXJhdG9yc1wiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgUERGRW1iZWRkZWRQYWdlIGZyb20gXCIuL1BERkVtYmVkZGVkUGFnZVwiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4vUERGRm9udFwiO1xuaW1wb3J0IFBERkltYWdlIGZyb20gXCIuL1BERkltYWdlXCI7XG5pbXBvcnQgeyBCbGVuZE1vZGUsIH0gZnJvbSBcIi4vUERGUGFnZU9wdGlvbnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMsIHRvRGVncmVlcyB9IGZyb20gXCIuL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgU3RhbmRhcmRGb250cyB9IGZyb20gXCIuL1N0YW5kYXJkRm9udHNcIjtcbmltcG9ydCB7IFBERkNvbnRlbnRTdHJlYW0sIFBERk5hbWUsIFBERk9wZXJhdG9yLCBQREZQYWdlTGVhZiwgUERGUmVmLCBQREZEaWN0LCBQREZBcnJheSwgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0RWFjaElzLCBhc3NlcnRJcywgYXNzZXJ0TXVsdGlwbGUsIGFzc2VydE9yVW5kZWZpbmVkLCBicmVha1RleHRJbnRvTGluZXMsIGNsZWFuVGV4dCwgcmVjdGFuZ2xlc0FyZUVxdWFsLCBsaW5lU3BsaXQsIGFzc2VydFJhbmdlT3JVbmRlZmluZWQsIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZCwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIHNpbmdsZSBwYWdlIG9mIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGUGFnZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZQYWdlKGxlYWZOb2RlLCByZWYsIGRvYykge1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gMjQ7XG4gICAgICAgIHRoaXMuZm9udENvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSAyNDtcbiAgICAgICAgdGhpcy54ID0gMDtcbiAgICAgICAgdGhpcy55ID0gMDtcbiAgICAgICAgYXNzZXJ0SXMobGVhZk5vZGUsICdsZWFmTm9kZScsIFtbUERGUGFnZUxlYWYsICdQREZQYWdlTGVhZiddXSk7XG4gICAgICAgIGFzc2VydElzKHJlZiwgJ3JlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbGVhZk5vZGU7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUm90YXRlIHRoaXMgcGFnZSBieSBhIG11bHRpcGxlIG9mIDkwIGRlZ3JlZXMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMoLTkwKSlcbiAgICAgKiBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMoMCkpXG4gICAgICogcGFnZS5zZXRSb3RhdGlvbihkZWdyZWVzKDkwKSlcbiAgICAgKiBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMoMTgwKSlcbiAgICAgKiBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMoMjcwKSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gYW5nbGUgVGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGlzIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0Um90YXRpb24gPSBmdW5jdGlvbiAoYW5nbGUpIHtcbiAgICAgICAgdmFyIGRlZ3JlZXNBbmdsZSA9IHRvRGVncmVlcyhhbmdsZSk7XG4gICAgICAgIGFzc2VydE11bHRpcGxlKGRlZ3JlZXNBbmdsZSwgJ2RlZ3JlZXNBbmdsZScsIDkwKTtcbiAgICAgICAgdGhpcy5ub2RlLnNldChQREZOYW1lLm9mKCdSb3RhdGUnKSwgdGhpcy5kb2MuY29udGV4dC5vYmooZGVncmVlc0FuZ2xlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBwYWdlJ3Mgcm90YXRpb24gYW5nbGUgaW4gZGVncmVlcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByb3RhdGlvbkFuZ2xlID0gcGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlO1xuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgcGFnZSBpbiBkZWdyZWVzIChhbHdheXMgYSBtdWx0aXBsZSBvZlxuICAgICAqICAgICAgICAgIDkwIGRlZ3JlZXMpLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFJvdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgUm90YXRlID0gdGhpcy5ub2RlLlJvdGF0ZSgpO1xuICAgICAgICByZXR1cm4gZGVncmVlcyhSb3RhdGUgPyBSb3RhdGUuYXNOdW1iZXIoKSA6IDApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoaXMgcGFnZSBieSBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgaXRzIHdpZHRoIGFuZCBoZWlnaHQuIEZvclxuICAgICAqIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLnNldFNpemUoMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRTaXplKHBhZ2UuZ2V0V2lkdGgoKSArIDUwLCBwYWdlLmdldEhlaWdodCgpICsgMTAwKVxuICAgICAqIHBhZ2Uuc2V0U2l6ZShwYWdlLmdldFdpZHRoKCkgLSA1MCwgcGFnZS5nZXRIZWlnaHQoKSAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGUgUERGIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgZm9yIHBhZ2VzIHRvIGhhdmUgZXhwbGljaXRcbiAgICAgKiB3aWR0aHMgYW5kIGhlaWdodHMuIEluc3RlYWQgaXQgZGVmaW5lcyB0aGUgXCJzaXplXCIgb2YgYSBwYWdlIGluIHRlcm1zIG9mXG4gICAgICogZml2ZSByZWN0YW5nbGVzOiB0aGUgTWVkaWFCb3gsIENyb3BCb3gsIEJsZWVkQm94LCBUcmltQm94LCBhbmQgQXJ0Qm94LiBBcyBhXG4gICAgICogcmVzdWx0LCB0aGlzIG1ldGhvZCBjYW5ub3QgZGlyZWN0bHkgY2hhbmdlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGEgcGFnZS5cbiAgICAgKiBJbnN0ZWFkLCBpdCB3b3JrcyBieSBhZGp1c3RpbmcgdGhlc2UgZml2ZSBib3hlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAgICogICAxLiBTZXQgd2lkdGggJiBoZWlnaHQgb2YgTWVkaWFCb3guXG4gICAgICogICAyLiBTZXQgd2lkdGggJiBoZWlnaHQgb2YgQ3JvcEJveCwgaWYgaXQgaGFzIHNhbWUgZGltZW5zaW9ucyBhcyBNZWRpYUJveC5cbiAgICAgKiAgIDMuIFNldCB3aWR0aCAmIGhlaWdodCBvZiBCbGVlZEJveCwgaWYgaXQgaGFzIHNhbWUgZGltZW5zaW9ucyBhcyBNZWRpYUJveC5cbiAgICAgKiAgIDQuIFNldCB3aWR0aCAmIGhlaWdodCBvZiBUcmltQm94LCBpZiBpdCBoYXMgc2FtZSBkaW1lbnNpb25zIGFzIE1lZGlhQm94LlxuICAgICAqICAgNS4gU2V0IHdpZHRoICYgaGVpZ2h0IG9mIEFydEJveCwgaWYgaXQgaGFzIHNhbWUgZGltZW5zaW9ucyBhcyBNZWRpYUJveC5cbiAgICAgKlxuICAgICAqIFRoaXMgYXBwcm9hY2ggd29ya3Mgd2VsbCBmb3IgbW9zdCBQREYgZG9jdW1lbnRzIGFzIGFsbCBQREYgcGFnZXMgbXVzdFxuICAgICAqIGhhdmUgYSBNZWRpYUJveCwgYnV0IHJlbGF0aXZlbHkgZmV3IGhhdmUgYSBDcm9wQm94LCBCbGVlZEJveCwgVHJpbUJveCwgb3JcbiAgICAgKiBBcnRCb3guIEFuZCB3aGVuIHRoZXkgZG8gaGF2ZSB0aGVzZSBhZGRpdGlvbmFsIGJveGVzLCB0aGV5IG9mdGVuIGhhdmUgdGhlXG4gICAgICogc2FtZSBkaW1lbnNpb25zIGFzIHRoZSBNZWRpYUJveC4gSG93ZXZlciwgaWYgeW91IGZpbmQgdGhpcyBtZXRob2QgZG9lcyBub3RcbiAgICAgKiB3b3JrIGZvciB5b3VyIGRvY3VtZW50LCBjb25zaWRlciBzZXR0aW5nIHRoZSBib3hlcyBkaXJlY3RseTpcbiAgICAgKiAgICogW1tQREZQYWdlLnNldE1lZGlhQm94XV1cbiAgICAgKiAgICogW1tQREZQYWdlLnNldENyb3BCb3hdXVxuICAgICAqICAgKiBbW1BERlBhZ2Uuc2V0QmxlZWRCb3hdXVxuICAgICAqICAgKiBbW1BERlBhZ2Uuc2V0VHJpbUJveF1dXG4gICAgICogICAqIFtbUERGUGFnZS5zZXRBcnRCb3hdXVxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSBuZXcgd2lkdGggb2YgdGhlIHBhZ2UuXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgbmV3IGhlaWdodCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRTaXplID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIG1lZGlhQm94ID0gdGhpcy5nZXRNZWRpYUJveCgpO1xuICAgICAgICB0aGlzLnNldE1lZGlhQm94KG1lZGlhQm94LngsIG1lZGlhQm94LnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB2YXIgY3JvcEJveCA9IHRoaXMuZ2V0Q3JvcEJveCgpO1xuICAgICAgICB2YXIgYmxlZWRCb3ggPSB0aGlzLmdldEJsZWVkQm94KCk7XG4gICAgICAgIHZhciB0cmltQm94ID0gdGhpcy5nZXRUcmltQm94KCk7XG4gICAgICAgIHZhciBhcnRCb3ggPSB0aGlzLmdldEFydEJveCgpO1xuICAgICAgICB2YXIgaGFzQ3JvcEJveCA9IHRoaXMubm9kZS5Dcm9wQm94KCk7XG4gICAgICAgIHZhciBoYXNCbGVlZEJveCA9IHRoaXMubm9kZS5CbGVlZEJveCgpO1xuICAgICAgICB2YXIgaGFzVHJpbUJveCA9IHRoaXMubm9kZS5UcmltQm94KCk7XG4gICAgICAgIHZhciBoYXNBcnRCb3ggPSB0aGlzLm5vZGUuQXJ0Qm94KCk7XG4gICAgICAgIGlmIChoYXNDcm9wQm94ICYmIHJlY3RhbmdsZXNBcmVFcXVhbChjcm9wQm94LCBtZWRpYUJveCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3JvcEJveChtZWRpYUJveC54LCBtZWRpYUJveC55LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzQmxlZWRCb3ggJiYgcmVjdGFuZ2xlc0FyZUVxdWFsKGJsZWVkQm94LCBtZWRpYUJveCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmxlZWRCb3gobWVkaWFCb3gueCwgbWVkaWFCb3gueSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1RyaW1Cb3ggJiYgcmVjdGFuZ2xlc0FyZUVxdWFsKHRyaW1Cb3gsIG1lZGlhQm94KSkge1xuICAgICAgICAgICAgdGhpcy5zZXRUcmltQm94KG1lZGlhQm94LngsIG1lZGlhQm94LnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNBcnRCb3ggJiYgcmVjdGFuZ2xlc0FyZUVxdWFsKGFydEJveCwgbWVkaWFCb3gpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEFydEJveChtZWRpYUJveC54LCBtZWRpYUJveC55LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoaXMgcGFnZSBieSBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgaXRzIHdpZHRoLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2V0V2lkdGgoMjUwKVxuICAgICAqIHBhZ2Uuc2V0V2lkdGgocGFnZS5nZXRXaWR0aCgpICsgNTApXG4gICAgICogcGFnZS5zZXRXaWR0aChwYWdlLmdldFdpZHRoKCkgLSA1MClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgW1tQREZQYWdlLnNldFNpemVdXSB0byBzZXQgdGhlIHBhZ2UncyB3aWR0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgbmV3IHdpZHRoIG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldFdpZHRoID0gZnVuY3Rpb24gKHdpZHRoKSB7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCB0aGlzLmdldFNpemUoKS5oZWlnaHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoaXMgcGFnZSBieSBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgaXRzIGhlaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLnNldEhlaWdodCg1MDApXG4gICAgICogcGFnZS5zZXRIZWlnaHQocGFnZS5nZXRXaWR0aCgpICsgMTAwKVxuICAgICAqIHBhZ2Uuc2V0SGVpZ2h0KHBhZ2UuZ2V0V2lkdGgoKSAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgW1tQREZQYWdlLnNldFNpemVdXSB0byBzZXQgdGhlIHBhZ2UncyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuc2V0U2l6ZSh0aGlzLmdldFNpemUoKS53aWR0aCwgaGVpZ2h0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgTWVkaWFCb3ggb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG1lZGlhQm94ID0gcGFnZS5nZXRNZWRpYUJveCgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldE1lZGlhQm94KDAsIDAsIDI1MCwgNTAwKVxuICAgICAqIHBhZ2Uuc2V0TWVkaWFCb3gobWVkaWFCb3gueCwgbWVkaWFCb3gueSwgNTAsIDEwMClcbiAgICAgKiBwYWdlLnNldE1lZGlhQm94KDE1LCA1LCBtZWRpYUJveC53aWR0aCAtIDUwLCBtZWRpYUJveC5oZWlnaHQgLSAxMDApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZWUgW1tQREZQYWdlLmdldE1lZGlhQm94XV0gZm9yIGRldGFpbHMgYWJvdXQgd2hhdCB0aGUgTWVkaWFCb3ggcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgTWVkaWFCb3guXG4gICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBNZWRpYUJveC5cbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBuZXcgTWVkaWFCb3guXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBuZXcgTWVkaWFCb3guXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0TWVkaWFCb3ggPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgbWVkaWFCb3ggPSB0aGlzLmRvYy5jb250ZXh0Lm9iaihbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMubm9kZS5zZXQoUERGTmFtZS5NZWRpYUJveCwgbWVkaWFCb3gpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBDcm9wQm94IG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjcm9wQm94ID0gcGFnZS5nZXRDcm9wQm94KClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Q3JvcEJveCgwLCAwLCAyNTAsIDUwMClcbiAgICAgKiBwYWdlLnNldENyb3BCb3goY3JvcEJveC54LCBjcm9wQm94LnksIDUwLCAxMDApXG4gICAgICogcGFnZS5zZXRDcm9wQm94KDE1LCA1LCBjcm9wQm94LndpZHRoIC0gNTAsIGNyb3BCb3guaGVpZ2h0IC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2VlIFtbUERGUGFnZS5nZXRDcm9wQm94XV0gZm9yIGRldGFpbHMgYWJvdXQgd2hhdCB0aGUgQ3JvcEJveCByZXByZXNlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBDcm9wQm94LlxuICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgQ3JvcEJveC5cbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBuZXcgQ3JvcEJveC5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIG5ldyBDcm9wQm94LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldENyb3BCb3ggPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgY3JvcEJveCA9IHRoaXMuZG9jLmNvbnRleHQub2JqKFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdKTtcbiAgICAgICAgdGhpcy5ub2RlLnNldChQREZOYW1lLkNyb3BCb3gsIGNyb3BCb3gpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBCbGVlZEJveCBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYmxlZWRCb3ggPSBwYWdlLmdldEJsZWVkQm94KClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0QmxlZWRCb3goMCwgMCwgMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRCbGVlZEJveChibGVlZEJveC54LCBibGVlZEJveC55LCA1MCwgMTAwKVxuICAgICAqIHBhZ2Uuc2V0QmxlZWRCb3goMTUsIDUsIGJsZWVkQm94LndpZHRoIC0gNTAsIGJsZWVkQm94LmhlaWdodCAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERlBhZ2UuZ2V0QmxlZWRCb3hdXSBmb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBCbGVlZEJveCByZXByZXNlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBCbGVlZEJveC5cbiAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IEJsZWVkQm94LlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG5ldyBCbGVlZEJveC5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIG5ldyBCbGVlZEJveC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRCbGVlZEJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBibGVlZEJveCA9IHRoaXMuZG9jLmNvbnRleHQub2JqKFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdKTtcbiAgICAgICAgdGhpcy5ub2RlLnNldChQREZOYW1lLkJsZWVkQm94LCBibGVlZEJveCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIFRyaW1Cb3ggb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRyaW1Cb3ggPSBwYWdlLmdldFRyaW1Cb3goKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRUcmltQm94KDAsIDAsIDI1MCwgNTAwKVxuICAgICAqIHBhZ2Uuc2V0VHJpbUJveCh0cmltQm94LngsIHRyaW1Cb3gueSwgNTAsIDEwMClcbiAgICAgKiBwYWdlLnNldFRyaW1Cb3goMTUsIDUsIHRyaW1Cb3gud2lkdGggLSA1MCwgdHJpbUJveC5oZWlnaHQgLSAxMDApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZWUgW1tQREZQYWdlLmdldFRyaW1Cb3hdXSBmb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBUcmltQm94IHJlcHJlc2VudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IFRyaW1Cb3guXG4gICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBUcmltQm94LlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG5ldyBUcmltQm94LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbmV3IFRyaW1Cb3guXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0VHJpbUJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciB0cmltQm94ID0gdGhpcy5kb2MuY29udGV4dC5vYmooW3gsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodF0pO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUuVHJpbUJveCwgdHJpbUJveCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIEFydEJveCBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYXJ0Qm94ID0gcGFnZS5nZXRBcnRCb3goKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRBcnRCb3goMCwgMCwgMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRBcnRCb3goYXJ0Qm94LngsIGFydEJveC55LCA1MCwgMTAwKVxuICAgICAqIHBhZ2Uuc2V0QXJ0Qm94KDE1LCA1LCBhcnRCb3gud2lkdGggLSA1MCwgYXJ0Qm94LmhlaWdodCAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERlBhZ2UuZ2V0QXJ0Qm94XV0gZm9yIGRldGFpbHMgYWJvdXQgd2hhdCB0aGUgQXJ0Qm94IHJlcHJlc2VudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IEFydEJveC5cbiAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IEFydEJveC5cbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBuZXcgQXJ0Qm94LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbmV3IEFydEJveC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRBcnRCb3ggPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgYXJ0Qm94ID0gdGhpcy5kb2MuY29udGV4dC5vYmooW3gsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodF0pO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUuQXJ0Qm94LCBhcnRCb3gpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgcGFnZSdzIHdpZHRoIGFuZCBoZWlnaHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldFNpemUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgdXNlcyBbW1BERlBhZ2UuZ2V0TWVkaWFCb3hdXSB0byBvYnRhaW4gdGhlIHBhZ2Unc1xuICAgICAqIHdpZHRoIGFuZCBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE1lZGlhQm94KCksIHdpZHRoID0gX2Eud2lkdGgsIGhlaWdodCA9IF9hLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgcGFnZSdzIHdpZHRoLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHdpZHRoID0gcGFnZS5nZXRXaWR0aCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIFtbUERGUGFnZS5nZXRTaXplXV0gdG8gb2J0YWluIHRoZSBwYWdlJ3Mgc2l6ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2l6ZSgpLndpZHRoO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgcGFnZSdzIGhlaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWlnaHQgPSBwYWdlLmdldEhlaWdodCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIFtbUERGUGFnZS5nZXRTaXplXV0gdG8gb2J0YWluIHRoZSBwYWdlJ3Mgc2l6ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBoZWlnaHQgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTaXplKCkuaGVpZ2h0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWN0YW5nbGUgZGVmaW5pbmcgdGhpcyBwYWdlJ3MgTWVkaWFCb3guIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldE1lZGlhQm94KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBNZWRpYUJveCBvZiBhIHBhZ2UgZGVmaW5lcyB0aGUgYm91bmRhcmllcyBvZiB0aGUgcGh5c2ljYWwgbWVkaXVtIG9uXG4gICAgICogd2hpY2ggdGhlIHBhZ2UgaXMgdG8gYmUgZGlzcGxheWVkL3ByaW50ZWQuIEl0IG1heSBpbmNsdWRlIGV4dGVuZGVkIGFyZWFcbiAgICAgKiBzdXJyb3VuZGluZyB0aGUgcGFnZSBjb250ZW50IGZvciBibGVlZCBtYXJrcywgcHJpbnRpbmcgbWFya3MsIGV0Yy4uLlxuICAgICAqIEl0IG1heSBhbHNvIGluY2x1ZGUgYXJlYXMgY2xvc2UgdG8gdGhlIGVkZ2VzIG9mIHRoZSBtZWRpdW0gdGhhdCBjYW5ub3QgYmVcbiAgICAgKiBtYXJrZWQgYmVjYXVzZSBvZiBwaHlzaWNhbCBsaW1pdGF0aW9ucyBvZiB0aGUgb3V0cHV0IGRldmljZS4gQ29udGVudFxuICAgICAqIGZhbGxpbmcgb3V0c2lkZSB0aGlzIGJvdW5kYXJ5IG1heSBzYWZlbHkgYmUgZGlzY2FyZGVkIHdpdGhvdXQgYWZmZWN0aW5nXG4gICAgICogdGhlIG1lYW5pbmcgb2YgdGhlIFBERiBmaWxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGRlZmluaW5nIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgTWVkaWFCb3ggYW5kIGl0c1xuICAgICAqICAgICAgICAgIHdpZHRoICYgaGVpZ2h0LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldE1lZGlhQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWVkaWFCb3ggPSB0aGlzLm5vZGUuTWVkaWFCb3goKTtcbiAgICAgICAgcmV0dXJuIG1lZGlhQm94LmFzUmVjdGFuZ2xlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGlzIHBhZ2UncyBDcm9wQm94LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcGFnZS5nZXRDcm9wQm94KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBDcm9wQm94IG9mIGEgcGFnZSBkZWZpbmVzIHRoZSByZWdpb24gdG8gd2hpY2ggdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWdlXG4gICAgICogc2hhbGwgYmUgY2xpcHBlZCB3aGVuIGRpc3BsYXllZCBvciBwcmludGVkLiBVbmxpa2UgdGhlIG90aGVyIGJveGVzLCB0aGVcbiAgICAgKiBDcm9wQm94IGRvZXMgbm90IG5lY2Vzc2FyaWx5IHJlcHJlc2VudCB0aGUgcGh5c2ljYWwgcGFnZSBnZW9tZXRyeS4gSXRcbiAgICAgKiBtZXJlbHkgaW1wb3NlcyBjbGlwcGluZyBvbiB0aGUgcGFnZSBjb250ZW50cy5cbiAgICAgKlxuICAgICAqIFRoZSBDcm9wQm94J3MgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgcGFnZSdzIE1lZGlhQm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGRlZmluaW5nIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgQ3JvcEJveCBhbmQgaXRzXG4gICAgICogICAgICAgICAgd2lkdGggJiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0Q3JvcEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgY3JvcEJveCA9IHRoaXMubm9kZS5Dcm9wQm94KCk7XG4gICAgICAgIHJldHVybiAoX2EgPSBjcm9wQm94ID09PSBudWxsIHx8IGNyb3BCb3ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNyb3BCb3guYXNSZWN0YW5nbGUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5nZXRNZWRpYUJveCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWN0YW5nbGUgZGVmaW5pbmcgdGhpcyBwYWdlJ3MgQmxlZWRCb3guIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldEJsZWVkQm94KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBCbGVlZEJveCBvZiBhIHBhZ2UgZGVmaW5lcyB0aGUgcmVnaW9uIHRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiB0aGVcbiAgICAgKiBwYWdlIHNoYWxsIGJlIGNsaXBwZWQgd2hlbiBvdXRwdXQgaW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LiBUaGlzIG1heVxuICAgICAqIGluY2x1ZGUgYW55IGV4dHJhIGJsZWVkIGFyZWEgbmVlZGVkIHRvIGFjY29tbW9kYXRlIHRoZSBwaHlzaWNhbFxuICAgICAqIGxpbWl0YXRpb25zIG9mIGN1dHRpbmcsIGZvbGRpbmcsIGFuZCB0cmltbWluZyBlcXVpcG1lbnQuIFRoZSBhY3R1YWxcbiAgICAgKiBwcmludGVkIHBhZ2UgbWF5IGluY2x1ZGUgcHJpbnRpbmcgbWFya3MgdGhhdCBmYWxsIG91dHNpZGUgdGhlIEJsZWVkQm94LlxuICAgICAqXG4gICAgICogVGhlIEJsZWVkQm94J3MgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgcGFnZSdzIENyb3BCb3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBCbGVlZEJveCBhbmQgaXRzXG4gICAgICogICAgICAgICAgd2lkdGggJiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0QmxlZWRCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGJsZWVkQm94ID0gdGhpcy5ub2RlLkJsZWVkQm94KCk7XG4gICAgICAgIHJldHVybiAoX2EgPSBibGVlZEJveCA9PT0gbnVsbCB8fCBibGVlZEJveCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYmxlZWRCb3guYXNSZWN0YW5nbGUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5nZXRDcm9wQm94KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGlzIHBhZ2UncyBUcmltQm94LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcGFnZS5nZXRUcmltQm94KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBUcmltQm94IG9mIGEgcGFnZSBkZWZpbmVzIHRoZSBpbnRlbmRlZCBkaW1lbnNpb25zIG9mIHRoZSBmaW5pc2hlZFxuICAgICAqIHBhZ2UgYWZ0ZXIgdHJpbW1pbmcuIEl0IG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIE1lZGlhQm94IHRvIGFsbG93IGZvclxuICAgICAqIHByb2R1Y3Rpb24tcmVsYXRlZCBjb250ZW50LCBzdWNoIGFzIHByaW50aW5nIGluc3RydWN0aW9ucywgY3V0IG1hcmtzLCBvclxuICAgICAqIGNvbG9yIGJhcnMuXG4gICAgICpcbiAgICAgKiBUaGUgVHJpbUJveCdzIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHBhZ2UncyBDcm9wQm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGRlZmluaW5nIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgVHJpbUJveCBhbmQgaXRzXG4gICAgICogICAgICAgICAgd2lkdGggJiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0VHJpbUJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdHJpbUJveCA9IHRoaXMubm9kZS5UcmltQm94KCk7XG4gICAgICAgIHJldHVybiAoX2EgPSB0cmltQm94ID09PSBudWxsIHx8IHRyaW1Cb3ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRyaW1Cb3guYXNSZWN0YW5nbGUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5nZXRDcm9wQm94KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGlzIHBhZ2UncyBBcnRCb3guIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldEFydEJveCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgQXJ0Qm94IG9mIGEgcGFnZSBkZWZpbmVzIHRoZSBleHRlbnQgb2YgdGhlIHBhZ2UncyBtZWFuaW5nZnVsIGNvbnRlbnRcbiAgICAgKiAoaW5jbHVkaW5nIHBvdGVudGlhbCB3aGl0ZSBzcGFjZSkuXG4gICAgICpcbiAgICAgKiBUaGUgQXJ0Qm94J3MgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgcGFnZSdzIENyb3BCb3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBBcnRCb3ggYW5kIGl0c1xuICAgICAqICAgICAgICAgIHdpZHRoICYgaGVpZ2h0LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldEFydEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXJ0Qm94ID0gdGhpcy5ub2RlLkFydEJveCgpO1xuICAgICAgICByZXR1cm4gKF9hID0gYXJ0Qm94ID09PSBudWxsIHx8IGFydEJveCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJ0Qm94LmFzUmVjdGFuZ2xlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuZ2V0Q3JvcEJveCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlIHRoaXMgcGFnZSdzIGNvbnRlbnQgdG8gYSBuZXcgbG9jYXRpb24gb24gdGhlIHBhZ2UuIFRoaXMgb3BlcmF0aW9uXG4gICAgICogaXMgb2Z0ZW4gdXNlZnVsIGFmdGVyIHJlc2l6aW5nIHRoZSBwYWdlIHdpdGggW1tzZXRTaXplXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gQWRkIDUwIHVuaXRzIG9mIHdoaXRlc3BhY2UgdG8gdGhlIHRvcCBhbmQgcmlnaHQgb2YgdGhlIHBhZ2VcbiAgICAgKiBwYWdlLnNldFNpemUocGFnZS5nZXRXaWR0aCgpICsgNTAsIHBhZ2UuZ2V0SGVpZ2h0KCkgKyA1MClcbiAgICAgKlxuICAgICAqIC8vIE1vdmUgdGhlIHBhZ2UncyBjb250ZW50IGZyb20gdGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIHRoZSBwYWdlXG4gICAgICogLy8gdG8gdGhlIHRvcC1yaWdodCBjb3JuZXIuXG4gICAgICogcGFnZS50cmFuc2xhdGVDb250ZW50KDUwLCA1MClcbiAgICAgKlxuICAgICAqIC8vIE5vdyB0aGVyZSBhcmUgNTAgdW5pdHMgb2Ygd2hpdGVzcGFjZSB0byB0aGUgbGVmdCBhbmQgYm90dG9tIG9mIHRoZSBwYWdlXG4gICAgICogYGBgXG4gICAgICogU2VlIGFsc286IFtbcmVzZXRQb3NpdGlvbl1dXG4gICAgICogQHBhcmFtIHggVGhlIG5ldyBwb3NpdGlvbiBvbiB0aGUgeC1heGlzIGZvciB0aGlzIHBhZ2UncyBjb250ZW50LlxuICAgICAqIEBwYXJhbSB5IFRoZSBuZXcgcG9zaXRpb24gb24gdGhlIHktYXhpcyBmb3IgdGhpcyBwYWdlJ3MgY29udGVudC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS50cmFuc2xhdGVDb250ZW50ID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5ub2RlLm5vcm1hbGl6ZSgpO1xuICAgICAgICB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jcmVhdGVDb250ZW50U3RyZWFtKHB1c2hHcmFwaGljc1N0YXRlKCksIHRyYW5zbGF0ZSh4LCB5KSk7XG4gICAgICAgIHZhciBzdGFydFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIoc3RhcnQpO1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5jcmVhdGVDb250ZW50U3RyZWFtKHBvcEdyYXBoaWNzU3RhdGUoKSk7XG4gICAgICAgIHZhciBlbmRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKGVuZCk7XG4gICAgICAgIHRoaXMubm9kZS53cmFwQ29udGVudFN0cmVhbXMoc3RhcnRSZWYsIGVuZFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTY2FsZSB0aGUgc2l6ZSwgY29udGVudCwgYW5kIGFubm90YXRpb25zIG9mIGEgcGFnZS5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5zY2FsZSgwLjUsIDAuNSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSB3aWR0aCBmb3IgdGhlIHBhZ2Ugc2hvdWxkIGJlIHNjYWxlZFxuICAgICAqICAgICAgICAgIChlLmcuIGAwLjVgIGlzIDUwJSkuXG4gICAgICogQHBhcmFtIHkgVGhlIGZhY3RvciBieSB3aGljaCB0aGUgaGVpZ2h0IGZvciB0aGUgcGFnZSBzaG91bGQgYmUgc2NhbGVkXG4gICAgICogICAgICAgICAgKGUuZy4gYDIuMGAgaXMgMjAwJSkuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnNldFNpemUodGhpcy5nZXRXaWR0aCgpICogeCwgdGhpcy5nZXRIZWlnaHQoKSAqIHkpO1xuICAgICAgICB0aGlzLnNjYWxlQ29udGVudCh4LCB5KTtcbiAgICAgICAgdGhpcy5zY2FsZUFubm90YXRpb25zKHgsIHkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGNvbnRlbnQgb2YgYSBwYWdlLiBUaGlzIGlzIHVzZWZ1bCBhZnRlciByZXNpemluZyBhbiBleGlzdGluZ1xuICAgICAqIHBhZ2UuIFRoaXMgc2NhbGVzIG9ubHkgdGhlIGNvbnRlbnQsIG5vdCB0aGUgYW5ub3RhdGlvbnMuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIEJpc2VjdCB0aGUgc2l6ZSBvZiB0aGUgcGFnZVxuICAgICAqIHBhZ2Uuc2V0U2l6ZShwYWdlLmdldFdpZHRoKCkgLyAyLCBwYWdlLmdldEhlaWdodCgpIC8gMik7XG4gICAgICpcbiAgICAgKiAvLyBTY2FsZSB0aGUgY29udGVudCBvZiB0aGUgcGFnZSBkb3duIGJ5IDUwJSBpbiB4IGFuZCB5XG4gICAgICogcGFnZS5zY2FsZUNvbnRlbnQoMC41LCAwLjUpO1xuICAgICAqIGBgYFxuICAgICAqIFNlZSBhbHNvOiBbW3NjYWxlQW5ub3RhdGlvbnNdXVxuICAgICAqIEBwYXJhbSB4IFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhlIHgtYXhpcyBmb3IgdGhlIGNvbnRlbnQgc2hvdWxkIGJlIHNjYWxlZFxuICAgICAqICAgICAgICAgIChlLmcuIGAwLjVgIGlzIDUwJSkuXG4gICAgICogQHBhcmFtIHkgVGhlIGZhY3RvciBieSB3aGljaCB0aGUgeS1heGlzIGZvciB0aGUgY29udGVudCBzaG91bGQgYmUgc2NhbGVkXG4gICAgICogICAgICAgICAgKGUuZy4gYDIuMGAgaXMgMjAwJSkuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2NhbGVDb250ZW50ID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5ub2RlLm5vcm1hbGl6ZSgpO1xuICAgICAgICB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jcmVhdGVDb250ZW50U3RyZWFtKHB1c2hHcmFwaGljc1N0YXRlKCksIHNjYWxlKHgsIHkpKTtcbiAgICAgICAgdmFyIHN0YXJ0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3RlcihzdGFydCk7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLmNyZWF0ZUNvbnRlbnRTdHJlYW0ocG9wR3JhcGhpY3NTdGF0ZSgpKTtcbiAgICAgICAgdmFyIGVuZFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIoZW5kKTtcbiAgICAgICAgdGhpcy5ub2RlLndyYXBDb250ZW50U3RyZWFtcyhzdGFydFJlZiwgZW5kUmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBhbm5vdGF0aW9ucyBvZiBhIHBhZ2UuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHNjYWxlIGFcbiAgICAgKiBwYWdlIHdpdGggY29tbWVudHMgb3Igb3RoZXIgYW5ub3RhdGlvbnMuXG4gICAgICogYGBganNcbiAgICAgKiAvLyBTY2FsZSB0aGUgY29udGVudCBvZiB0aGUgcGFnZSBkb3duIGJ5IDUwJSBpbiB4IGFuZCB5XG4gICAgICogcGFnZS5zY2FsZUNvbnRlbnQoMC41LCAwLjUpO1xuICAgICAqXG4gICAgICogLy8gU2NhbGUgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2UgZG93biBieSA1MCUgaW4geCBhbmQgeVxuICAgICAqIHBhZ2Uuc2NhbGVBbm5vdGF0aW9ucygwLjUsIDAuNSk7XG4gICAgICogYGBgXG4gICAgICogU2VlIGFsc286IFtbc2NhbGVDb250ZW50XV1cbiAgICAgKiBAcGFyYW0geCBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSB4LWF4aXMgZm9yIHRoZSBhbm5vdGF0aW9ucyBzaG91bGQgYmVcbiAgICAgKiAgICAgICAgICBzY2FsZWQgKGUuZy4gYDAuNWAgaXMgNTAlKS5cbiAgICAgKiBAcGFyYW0geSBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSB5LWF4aXMgZm9yIHRoZSBhbm5vdGF0aW9ucyBzaG91bGQgYmVcbiAgICAgKiAgICAgICAgICBzY2FsZWQgKGUuZy4gYDIuMGAgaXMgMjAwJSkuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2NhbGVBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBhbm5vdHMgPSB0aGlzLm5vZGUuQW5ub3RzKCk7XG4gICAgICAgIGlmICghYW5ub3RzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBhbm5vdHMuc2l6ZSgpOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGFubm90ID0gYW5ub3RzLmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgaWYgKGFubm90IGluc3RhbmNlb2YgUERGRGljdClcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlQW5ub3QoYW5ub3QsIHgsIHkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGlzIHBhZ2UgdG8gYCgwLCAwKWAuIFRoaXMgb3BlcmF0aW9uIGlzXG4gICAgICogb2Z0ZW4gdXNlZnVsIGFmdGVyIGNhbGxpbmcgW1t0cmFuc2xhdGVDb250ZW50XV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gU2hpZnQgdGhlIHBhZ2UncyBjb250ZW50cyB1cCBhbmQgdG8gdGhlIHJpZ2h0IGJ5IDUwIHVuaXRzXG4gICAgICogcGFnZS50cmFuc2xhdGVDb250ZW50KDUwLCA1MClcbiAgICAgKlxuICAgICAqIC8vIFRoaXMgdGV4dCB3aWxsIHNoaWZ0ZWQgLSBpdCB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSBhbSBzaGlmdGVkJylcbiAgICAgKlxuICAgICAqIC8vIE1vdmUgYmFjayB0byAoMCwgMClcbiAgICAgKiBwYWdlLnJlc2V0UG9zaXRpb24oKVxuICAgICAqXG4gICAgICogLy8gVGhpcyB0ZXh0IHdpbGwgbm90IGJlIHNoaWZ0ZWQgLSBpdCB3aWxsIGJlIGRyYXduIGF0ICgwLCAwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgYW0gbm90IHNoaWZ0ZWQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnJlc2V0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZ2V0Q29udGVudFN0cmVhbShmYWxzZSk7XG4gICAgICAgIHRoaXMueCA9IDA7XG4gICAgICAgIHRoaXMueSA9IDA7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgYSBkZWZhdWx0IGZvbnQgZm9yIHRoaXMgcGFnZS4gVGhlIGRlZmF1bHQgZm9udCB3aWxsIGJlIHVzZWQgd2hlbmV2ZXJcbiAgICAgKiB0ZXh0IGlzIGRyYXduIG9uIHRoaXMgcGFnZSBhbmQgbm8gZm9udCBpcyBzcGVjaWZpZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgU3RhbmRhcmRGb250cyB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCB0aW1lc1JvbWFuRm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5UaW1lc1JvbWFuKVxuICAgICAqIGNvbnN0IGhlbHZldGljYUZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IGNvdXJpZXJGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkNvdXJpZXIpXG4gICAgICpcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRGb250KGhlbHZldGljYUZvbnQpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGluIEhlbHZldGljYScpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnQodGltZXNSb21hbkZvbnQpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGluIENvdXJpZXInLCB7IGZvbnQ6IGNvdXJpZXJGb250IH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGRlZmF1bHQgZm9udCB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0ZXh0IG9uIHRoaXMgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRGb250ID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgLy8gVE9ETzogUmV1c2UgaW1hZ2UgRm9udCBuYW1lIGlmIHdlJ3ZlIGFscmVhZHkgYWRkZWQgdGhpcyBpbWFnZSB0byBSZXNvdXJjZXMuRm9udHNcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgdGhpcy5mb250ID0gZm9udDtcbiAgICAgICAgdGhpcy5mb250S2V5ID0gdGhpcy5ub2RlLm5ld0ZvbnREaWN0aW9uYXJ5KHRoaXMuZm9udC5uYW1lLCB0aGlzLmZvbnQucmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSBhIGRlZmF1bHQgZm9udCBzaXplIGZvciB0aGlzIHBhZ2UuIFRoZSBkZWZhdWx0IGZvbnQgc2l6ZSB3aWxsIGJlXG4gICAgICogdXNlZCB3aGVuZXZlciB0ZXh0IGlzIGRyYXduIG9uIHRoaXMgcGFnZSBhbmQgbm8gZm9udCBzaXplIGlzIHNwZWNpZmllZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2V0Rm9udFNpemUoMTIpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGluIHNpemUgMTInKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRGb250U2l6ZSgzNilcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gc2l6ZSAyNCcsIHsgZm9udFNpemU6IDI0IH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnRTaXplIFRoZSBkZWZhdWx0IGZvbnQgc2l6ZSB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0ZXh0IG9uIHRoaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICBhc3NlcnRJcyhmb250U2l6ZSwgJ2ZvbnRTaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSBhIGRlZmF1bHQgZm9udCBjb2xvciBmb3IgdGhpcyBwYWdlLiBUaGUgZGVmYXVsdCBmb250IGNvbG9yIHdpbGwgYmVcbiAgICAgKiB1c2VkIHdoZW5ldmVyIHRleHQgaXMgZHJhd24gb24gdGhpcyBwYWdlIGFuZCBubyBmb250IGNvbG9yIGlzIHNwZWNpZmllZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IHJnYiwgY215aywgZ3JheXNjYWxlIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Rm9udENvbG9yKHJnYigwLjk3LCAwLjAyLCAwLjk3KSlcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gcGluaycpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnRDb2xvcihjbXlrKDAuNCwgMC43LCAwLjM5LCAwLjE1KSlcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gZ3JheScsIHsgY29sb3I6IGdyYXlzY2FsZSgwLjUpIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnRDb2xvciBUaGUgZGVmYXVsdCBmb250IGNvbG9yIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRleHQgb25cbiAgICAgKiAgICAgICAgICAgICAgICAgIHRoaXMgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRGb250Q29sb3IgPSBmdW5jdGlvbiAoZm9udENvbG9yKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnRDb2xvciwgJ2ZvbnRDb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICB0aGlzLmZvbnRDb2xvciA9IGZvbnRDb2xvcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSBhIGRlZmF1bHQgbGluZSBoZWlnaHQgZm9yIHRoaXMgcGFnZS4gVGhlIGRlZmF1bHQgbGluZSBoZWlnaHQgd2lsbCBiZVxuICAgICAqIHVzZWQgd2hlbmV2ZXIgdGV4dCBpcyBkcmF3biBvbiB0aGlzIHBhZ2UgYW5kIG5vIGxpbmUgaGVpZ2h0IGlzIHNwZWNpZmllZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2V0TGluZUhlaWdodCgxMik7XG4gICAgICogcGFnZS5kcmF3VGV4dCgnVGhlc2UgbGluZXMgd2lsbCBiZSB2ZXJ0aWNhbGx5IFxcbiBzZXBhcmF0ZWQgYnkgMTIgdW5pdHMnKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRMaW5lSGVpZ2h0KDM2KTtcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdUaGVzZSBsaW5lcyB3aWxsIGJlIHZlcnRpY2FsbHkgXFxuIHNlcGFyYXRlZCBieSAyNCB1bml0cycsIHtcbiAgICAgKiAgIGxpbmVIZWlnaHQ6IDI0XG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbGluZUhlaWdodCBUaGUgZGVmYXVsdCBsaW5lIGhlaWdodCB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0ZXh0IG9uXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhpcyBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldExpbmVIZWlnaHQgPSBmdW5jdGlvbiAobGluZUhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyhsaW5lSGVpZ2h0LCAnbGluZUhlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHgsIHkgfSA9IHBhZ2UuZ2V0UG9zaXRpb24oKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4geyB4OiB0aGlzLngsIHk6IHRoaXMueSB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHggY29vcmRpbmF0ZSBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeCA9IHBhZ2UuZ2V0WCgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIGRlZmF1bHQgeCBjb29yZGluYXRlIG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLng7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgeSBjb29yZGluYXRlIG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB5ID0gcGFnZS5nZXRZKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCB5IGNvb3JkaW5hdGUgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5tb3ZlVG8oMCwgMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgdGhlIG9yaWdpbicpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVUbygwLCAyNSlcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gMjUgdW5pdHMgdXAnKVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlVG8oMjUsIDI1KVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biAyNSB1bml0cyB1cCBhbmQgMjUgdW5pdHMgdG8gdGhlIHJpZ2h0JylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0geCBUaGUgbmV3IGRlZmF1bHQgcG9zaXRpb24gb24gdGhlIHgtYXhpcyBmb3IgdGhpcyBwYWdlLlxuICAgICAqIEBwYXJhbSB5IFRoZSBuZXcgZGVmYXVsdCBwb3NpdGlvbiBvbiB0aGUgeS1heGlzIGZvciB0aGlzIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUubW92ZVRvID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGlzIHBhZ2UgdG8gYmUgZnVydGhlciBkb3duIHRoZSB5LWF4aXMuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLm1vdmVUbyg1MCwgNTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNTApJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZURvd24oMTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNDApJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0geURlY3JlYXNlIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHBhZ2UncyBkZWZhdWx0IHBvc2l0aW9uIGFsb25nIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgeS1heGlzIHNob3VsZCBiZSBkZWNyZWFzZWQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUubW92ZURvd24gPSBmdW5jdGlvbiAoeURlY3JlYXNlKSB7XG4gICAgICAgIGFzc2VydElzKHlEZWNyZWFzZSwgJ3lEZWNyZWFzZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnkgLT0geURlY3JlYXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZSB0byBiZSBmdXJ0aGVyIHVwIHRoZSB5LWF4aXMuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLm1vdmVUbyg1MCwgNTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNTApJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZVVwKDEwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNTAsIDYwKScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHlJbmNyZWFzZSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBwYWdlJ3MgZGVmYXVsdCBwb3NpdGlvbiBhbG9uZyB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgIHktYXhpcyBzaG91bGQgYmUgaW5jcmVhc2VkLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLm1vdmVVcCA9IGZ1bmN0aW9uICh5SW5jcmVhc2UpIHtcbiAgICAgICAgYXNzZXJ0SXMoeUluY3JlYXNlLCAneUluY3JlYXNlJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMueSArPSB5SW5jcmVhc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhpcyBwYWdlIHRvIGJlIGZ1cnRoZXIgbGVmdCBvbiB0aGUgeC1heGlzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5tb3ZlVG8oNTAsIDUwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNTAsIDUwKScpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVMZWZ0KDEwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNDAsIDUwKScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHhEZWNyZWFzZSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBwYWdlJ3MgZGVmYXVsdCBwb3NpdGlvbiBhbG9uZyB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgIHgtYXhpcyBzaG91bGQgYmUgZGVjcmVhc2VkLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLm1vdmVMZWZ0ID0gZnVuY3Rpb24gKHhEZWNyZWFzZSkge1xuICAgICAgICBhc3NlcnRJcyh4RGVjcmVhc2UsICd4RGVjcmVhc2UnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy54IC09IHhEZWNyZWFzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGlzIHBhZ2UgdG8gYmUgZnVydGhlciByaWdodCBvbiB0aGUgeS1heGlzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5tb3ZlVG8oNTAsIDUwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNTAsIDUwKScpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVSaWdodCgxMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDYwLCA1MCknKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB4SW5jcmVhc2UgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgcGFnZSdzIGRlZmF1bHQgcG9zaXRpb24gYWxvbmcgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICB4LWF4aXMgc2hvdWxkIGJlIGluY3JlYXNlZC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5tb3ZlUmlnaHQgPSBmdW5jdGlvbiAoeEluY3JlYXNlKSB7XG4gICAgICAgIGFzc2VydElzKHhJbmNyZWFzZSwgJ3hJbmNyZWFzZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnggKz0geEluY3JlYXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVzaCBvbmUgb3IgbW9yZSBvcGVyYXRvcnMgdG8gdGhlIGVuZCBvZiB0aGlzIHBhZ2UncyBjdXJyZW50IGNvbnRlbnRcbiAgICAgKiBzdHJlYW0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHtcbiAgICAgKiAgIHB1c2hHcmFwaGljc1N0YXRlLFxuICAgICAqICAgbW92ZVRvLFxuICAgICAqICAgbGluZVRvLFxuICAgICAqICAgY2xvc2VQYXRoLFxuICAgICAqICAgc2V0RmlsbGluZ0NvbG9yLFxuICAgICAqICAgcmdiLFxuICAgICAqICAgZmlsbCxcbiAgICAgKiAgIHBvcEdyYXBoaWNzU3RhdGUsXG4gICAgICogfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogLy8gRHJhdyBhIGdyZWVuIHRyaWFuZ2xlIGluIHRoZSBsb3dlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGFnZVxuICAgICAqIHBhZ2UucHVzaE9wZXJhdG9ycyhcbiAgICAgKiAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICogICBtb3ZlVG8oMCwgMCksXG4gICAgICogICBsaW5lVG8oMTAwLCAwKSxcbiAgICAgKiAgIGxpbmVUbyg1MCwgMTAwKSxcbiAgICAgKiAgIGNsb3NlUGF0aCgpLFxuICAgICAqICAgc2V0RmlsbGluZ0NvbG9yKHJnYigwLjAsIDEuMCwgMC4wKSksXG4gICAgICogICBmaWxsKCksXG4gICAgICogICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcGVyYXRvciBUaGUgb3BlcmF0b3JzIHRvIGJlIHB1c2hlZC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5wdXNoT3BlcmF0b3JzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb3BlcmF0b3IgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG9wZXJhdG9yW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0RWFjaElzKG9wZXJhdG9yLCAnb3BlcmF0b3InLCBbW1BERk9wZXJhdG9yLCAnUERGT3BlcmF0b3InXV0pO1xuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgb3BlcmF0b3IpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBvbmUgb3IgbW9yZSBsaW5lcyBvZiB0ZXh0IG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBTdGFuZGFyZEZvbnRzLCByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgaGVsdmV0aWNhRm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgdGltZXNSb21hbkZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuVGltZXNSb21hbilcbiAgICAgKlxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnQoaGVsdmV0aWNhRm9udClcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZVRvKDUsIDIwMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdUaGUgTGlmZSBvZiBhbiBFZ2cnLCB7IHNpemU6IDM2IH0pXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVEb3duKDM2KVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0FuIEVwaWMgVGFsZSBvZiBXb2UnLCB7IHNpemU6IDMwIH0pXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdUZXh0KFxuICAgICAqICAgYEh1bXB0eSBEdW1wdHkgc2F0IG9uIGEgd2FsbCBcXG5gICtcbiAgICAgKiAgIGBIdW1wdHkgRHVtcHR5IGhhZCBhIGdyZWF0IGZhbGw7IFxcbmAgK1xuICAgICAqICAgYEFsbCB0aGUga2luZydzIGhvcnNlcyBhbmQgYWxsIHRoZSBraW5nJ3MgbWVuIFxcbmAgK1xuICAgICAqICAgYENvdWxkbid0IHB1dCBIdW1wdHkgdG9nZXRoZXIgYWdhaW4uIFxcbmAsXG4gICAgICogICB7XG4gICAgICogICAgIHg6IDI1LFxuICAgICAqICAgICB5OiAxMDAsXG4gICAgICogICAgIGZvbnQ6IHRpbWVzUm9tYW5Gb250LFxuICAgICAqICAgICBzaXplOiAyNCxcbiAgICAgKiAgICAgY29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgICAgbGluZUhlaWdodDogMjQsXG4gICAgICogICAgIG9wYWNpdHk6IDAuNzUsXG4gICAgICogICB9LFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBiZSBkcmF3bi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgdGV4dC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgYXNzZXJ0SXModGV4dCwgJ3RleHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jb2xvciwgJ29wdGlvbnMuY29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5mb250LCAnb3B0aW9ucy5mb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuc2l6ZSwgJ29wdGlvbnMuc2l6ZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnJvdGF0ZSwgJ29wdGlvbnMucm90YXRlJywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueFNrZXcsICdvcHRpb25zLnhTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueVNrZXcsICdvcHRpb25zLnlTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5saW5lSGVpZ2h0LCAnb3B0aW9ucy5saW5lSGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMubWF4V2lkdGgsICdvcHRpb25zLm1heFdpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMud29yZEJyZWFrcywgJ29wdGlvbnMud29yZEJyZWFrcycsIFtBcnJheV0pO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciBfaCA9IHRoaXMuc2V0T3JFbWJlZEZvbnQob3B0aW9ucy5mb250KSwgb2xkRm9udCA9IF9oLm9sZEZvbnQsIG5ld0ZvbnQgPSBfaC5uZXdGb250LCBuZXdGb250S2V5ID0gX2gubmV3Rm9udEtleTtcbiAgICAgICAgdmFyIGZvbnRTaXplID0gb3B0aW9ucy5zaXplIHx8IHRoaXMuZm9udFNpemU7XG4gICAgICAgIHZhciB3b3JkQnJlYWtzID0gb3B0aW9ucy53b3JkQnJlYWtzIHx8IHRoaXMuZG9jLmRlZmF1bHRXb3JkQnJlYWtzO1xuICAgICAgICB2YXIgdGV4dFdpZHRoID0gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIG5ld0ZvbnQud2lkdGhPZlRleHRBdFNpemUodCwgZm9udFNpemUpOyB9O1xuICAgICAgICB2YXIgbGluZXMgPSBvcHRpb25zLm1heFdpZHRoID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gbGluZVNwbGl0KGNsZWFuVGV4dCh0ZXh0KSlcbiAgICAgICAgICAgIDogYnJlYWtUZXh0SW50b0xpbmVzKHRleHQsIHdvcmRCcmVha3MsIG9wdGlvbnMubWF4V2lkdGgsIHRleHRXaWR0aCk7XG4gICAgICAgIHZhciBlbmNvZGVkTGluZXMgPSBuZXcgQXJyYXkobGluZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBlbmNvZGVkTGluZXNbaWR4XSA9IG5ld0ZvbnQuZW5jb2RlVGV4dChsaW5lc1tpZHhdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBkcmF3TGluZXNPZlRleHQoZW5jb2RlZExpbmVzLCB7XG4gICAgICAgICAgICBjb2xvcjogKF9hID0gb3B0aW9ucy5jb2xvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5mb250Q29sb3IsXG4gICAgICAgICAgICBmb250OiBuZXdGb250S2V5LFxuICAgICAgICAgICAgc2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICByb3RhdGU6IChfYiA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IChfYyA9IG9wdGlvbnMueFNrZXcpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogKF9kID0gb3B0aW9ucy55U2tldykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHg6IChfZSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogdGhpcy54LFxuICAgICAgICAgICAgeTogKF9mID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiB0aGlzLnksXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiAoX2cgPSBvcHRpb25zLmxpbmVIZWlnaHQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHRoaXMubGluZUhlaWdodCxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZm9udCkge1xuICAgICAgICAgICAgaWYgKG9sZEZvbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KG9sZEZvbnQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb250KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYW4gaW1hZ2Ugb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QganBnVXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnXG4gICAgICogY29uc3QganBnSW1hZ2VCeXRlcyA9IGF3YWl0IGZldGNoKGpwZ1VybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKlxuICAgICAqIGNvbnN0IGpwZ0ltYWdlID0gYXdhaXQgcGRmRG9jLmVtYmVkSnBnKGpwZ0ltYWdlQnl0ZXMpXG4gICAgICogY29uc3QganBnRGltcyA9IGpwZ0ltYWdlLnNjYWxlKDAuNSlcbiAgICAgKlxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdJbWFnZShqcGdJbWFnZSwge1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiAyNSxcbiAgICAgKiAgIHdpZHRoOiBqcGdEaW1zLndpZHRoLFxuICAgICAqICAgaGVpZ2h0OiBqcGdEaW1zLmhlaWdodCxcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcygzMCksXG4gICAgICogICBvcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0byBiZSBkcmF3bi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd0ltYWdlID0gZnVuY3Rpb24gKGltYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgLy8gVE9ETzogUmV1c2UgaW1hZ2UgWE9iamVjdCBuYW1lIGlmIHdlJ3ZlIGFscmVhZHkgYWRkZWQgdGhpcyBpbWFnZSB0byBSZXNvdXJjZXMuWE9iamVjdHNcbiAgICAgICAgYXNzZXJ0SXMoaW1hZ2UsICdpbWFnZScsIFtbUERGSW1hZ2UsICdQREZJbWFnZSddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy53aWR0aCwgJ29wdGlvbnMud2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5oZWlnaHQsICdvcHRpb25zLmhlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnJvdGF0ZSwgJ29wdGlvbnMucm90YXRlJywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueFNrZXcsICdvcHRpb25zLnhTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueVNrZXcsICdvcHRpb25zLnlTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5vcGFjaXR5LCAnb3BhY2l0eS5vcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIHhPYmplY3RLZXkgPSB0aGlzLm5vZGUubmV3WE9iamVjdCgnSW1hZ2UnLCBpbWFnZS5yZWYpO1xuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBkcmF3SW1hZ2UoeE9iamVjdEtleSwge1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMueSxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBpbWFnZS5zaXplKCkud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBpbWFnZS5zaXplKCkuaGVpZ2h0LFxuICAgICAgICAgICAgcm90YXRlOiAoX2UgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHhTa2V3OiAoX2YgPSBvcHRpb25zLnhTa2V3KSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeVNrZXc6IChfZyA9IG9wdGlvbnMueVNrZXcpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGFuIGVtYmVkZGVkIFBERiBwYWdlIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHNvdXJjZVBkZlVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy93aXRoX2xhcmdlX3BhZ2VfY291bnQucGRmJ1xuICAgICAqIGNvbnN0IHNvdXJjZVBkZiA9IGF3YWl0IGZldGNoKHNvdXJjZVBkZlVybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKlxuICAgICAqIC8vIEVtYmVkIHBhZ2UgNzQgZnJvbSB0aGUgUERGXG4gICAgICogY29uc3QgW2VtYmVkZGVkUGFnZV0gPSBhd2FpdCBwZGZEb2MuZW1iZWRQZGYoc291cmNlUGRmLCA3MylcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd1BhZ2UoZW1iZWRkZWRQYWdlLCB7XG4gICAgICogICB4OiAyNTAsXG4gICAgICogICB5OiAyMDAsXG4gICAgICogICB4U2NhbGU6IDAuNSxcbiAgICAgKiAgIHlTY2FsZTogMC41LFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDMwKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBgb3B0aW9uc2AgYXJndW1lbnQgYWNjZXB0cyBib3RoIGB3aWR0aGAvYGhlaWdodGAgYW5kIGB4U2NhbGVgL2B5U2NhbGVgXG4gICAgICogYXMgb3B0aW9ucy4gU2luY2UgZWFjaCBvZiB0aGVzZSBvcHRpb25zIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIGRyYXduIHBhZ2UsXG4gICAgICogaWYgYm90aCBvcHRpb25zIGFyZSBnaXZlbiwgYHdpZHRoYCBhbmQgYGhlaWdodGAgdGFrZSBwcmVjZWRlbmNlIGFuZCB0aGVcbiAgICAgKiBjb3JyZXNwb25kaW5nIHNjYWxlIHZhcmlhbnRzIGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVtYmVkZGVkUGFnZSBUaGUgZW1iZWRkZWQgcGFnZSB0byBiZSBkcmF3bi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgZW1iZWRkZWQgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3UGFnZSA9IGZ1bmN0aW9uIChlbWJlZGRlZFBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgLy8gVE9ETzogUmV1c2UgZW1iZWRkZWRQYWdlIFhPYmplY3QgbmFtZSBpZiB3ZSd2ZSBhbHJlYWR5IGFkZGVkIHRoaXMgZW1iZWRkZWRQYWdlIHRvIFJlc291cmNlcy5YT2JqZWN0c1xuICAgICAgICBhc3NlcnRJcyhlbWJlZGRlZFBhZ2UsICdlbWJlZGRlZFBhZ2UnLCBbXG4gICAgICAgICAgICBbUERGRW1iZWRkZWRQYWdlLCAnUERGRW1iZWRkZWRQYWdlJ10sXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLngsICdvcHRpb25zLngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueFNjYWxlLCAnb3B0aW9ucy54U2NhbGUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2NhbGUsICdvcHRpb25zLnlTY2FsZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLndpZHRoLCAnb3B0aW9ucy53aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmhlaWdodCwgJ29wdGlvbnMuaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2tldywgJ29wdGlvbnMueFNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2tldywgJ29wdGlvbnMueVNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYmxlbmRNb2RlLCAnb3B0aW9ucy5ibGVuZE1vZGUnLCBCbGVuZE1vZGUpO1xuICAgICAgICB2YXIgeE9iamVjdEtleSA9IHRoaXMubm9kZS5uZXdYT2JqZWN0KCdFbWJlZGRlZFBkZlBhZ2UnLCBlbWJlZGRlZFBhZ2UucmVmKTtcbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdmFyIHhTY2FsZSA9IChvcHRpb25zLndpZHRoICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLndpZHRoIC8gZW1iZWRkZWRQYWdlLndpZHRoXG4gICAgICAgICAgICA6IG9wdGlvbnMueFNjYWxlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnhTY2FsZVxuICAgICAgICAgICAgICAgIDogMSk7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB2YXIgeVNjYWxlID0gKG9wdGlvbnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmhlaWdodCAvIGVtYmVkZGVkUGFnZS5oZWlnaHRcbiAgICAgICAgICAgIDogb3B0aW9ucy55U2NhbGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMueVNjYWxlXG4gICAgICAgICAgICAgICAgOiAxKTtcbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdQYWdlKHhPYmplY3RLZXksIHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy54LFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0aGlzLnksXG4gICAgICAgICAgICB4U2NhbGU6IHhTY2FsZSxcbiAgICAgICAgICAgIHlTY2FsZTogeVNjYWxlLFxuICAgICAgICAgICAgcm90YXRlOiAoX2MgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHhTa2V3OiAoX2QgPSBvcHRpb25zLnhTa2V3KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeVNrZXc6IChfZSA9IG9wdGlvbnMueVNrZXcpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGFuIFNWRyBwYXRoIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3Qgc3ZnUGF0aCA9ICdNIDAsMjAgTCAxMDAsMTYwIFEgMTMwLDIwMCAxNTAsMTIwIEMgMTkwLC00MCAyMDAsMjAwIDMwMCwxNTAgTCA0MDAsOTAnXG4gICAgICpcbiAgICAgKiAvLyBEcmF3IHBhdGggYXMgYmxhY2sgbGluZVxuICAgICAqIHBhZ2UuZHJhd1N2Z1BhdGgoc3ZnUGF0aCwgeyB4OiAyNSwgeTogNzUgfSlcbiAgICAgKlxuICAgICAqIC8vIENoYW5nZSBib3JkZXIgc3R5bGUgYW5kIG9wYWNpdHlcbiAgICAgKiBwYWdlLmRyYXdTdmdQYXRoKHN2Z1BhdGgsIHtcbiAgICAgKiAgIHg6IDI1LFxuICAgICAqICAgeTogMjc1LFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLjUsIDAuNSwgMC41KSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgYm9yZGVyT3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqXG4gICAgICogLy8gU2V0IGZpbGwgY29sb3IgYW5kIG9wYWNpdHlcbiAgICAgKiBwYWdlLmRyYXdTdmdQYXRoKHN2Z1BhdGgsIHtcbiAgICAgKiAgIHg6IDI1LFxuICAgICAqICAgeTogNDc1LFxuICAgICAqICAgY29sb3I6IHJnYigxLjAsIDAsIDApLFxuICAgICAqICAgb3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqXG4gICAgICogLy8gRHJhdyA1MCUgb2Ygb3JpZ2luYWwgc2l6ZVxuICAgICAqIHBhZ2UuZHJhd1N2Z1BhdGgoc3ZnUGF0aCwge1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiA2NzUsXG4gICAgICogICBzY2FsZTogMC41LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHBhdGggVGhlIFNWRyBwYXRoIHRvIGJlIGRyYXduLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBTVkcgcGF0aC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3U3ZnUGF0aCA9IGZ1bmN0aW9uIChwYXRoLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBhc3NlcnRJcyhwYXRoLCAncGF0aCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLngsICdvcHRpb25zLngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuc2NhbGUsICdvcHRpb25zLnNjYWxlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJXaWR0aCwgJ29wdGlvbnMuYm9yZGVyV2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jb2xvciwgJ29wdGlvbnMuY29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJDb2xvciwgJ29wdGlvbnMuYm9yZGVyQ29sb3InLCBbXG4gICAgICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5LCAnb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXknLCBbXG4gICAgICAgICAgICBBcnJheSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlLCAnb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UnLCBbXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckxpbmVDYXAsICdvcHRpb25zLmJvcmRlckxpbmVDYXAnLCBMaW5lQ2FwU3R5bGUpO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyT3BhY2l0eSwgJ29wdGlvbnMuYm9yZGVyT3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBib3JkZXJPcGFjaXR5OiBvcHRpb25zLmJvcmRlck9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCEoJ2NvbG9yJyBpbiBvcHRpb25zKSAmJiAhKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdTdmdQYXRoKHBhdGgsIHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy54LFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0aGlzLnksXG4gICAgICAgICAgICBzY2FsZTogb3B0aW9ucy5zY2FsZSxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9jID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBjb2xvcjogKF9kID0gb3B0aW9ucy5jb2xvcikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IChfZSA9IG9wdGlvbnMuYm9yZGVyQ29sb3IpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2YgPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAwLFxuICAgICAgICAgICAgYm9yZGVyRGFzaEFycmF5OiAoX2cgPSBvcHRpb25zLmJvcmRlckRhc2hBcnJheSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyRGFzaFBoYXNlOiAoX2ggPSBvcHRpb25zLmJvcmRlckRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyTGluZUNhcDogKF9qID0gb3B0aW9ucy5ib3JkZXJMaW5lQ2FwKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGEgbGluZSBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd0xpbmUoe1xuICAgICAqICAgc3RhcnQ6IHsgeDogMjUsIHk6IDc1IH0sXG4gICAgICogICBlbmQ6IHsgeDogMTI1LCB5OiAxNzUgfSxcbiAgICAgKiAgIHRoaWNrbmVzczogMixcbiAgICAgKiAgIGNvbG9yOiByZ2IoMC43NSwgMC4yLCAwLjIpLFxuICAgICAqICAgb3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBsaW5lLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdMaW5lID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucy5zdGFydCwgJ29wdGlvbnMuc3RhcnQnLCBbXG4gICAgICAgICAgICBbT2JqZWN0LCAneyB4OiBudW1iZXIsIHk6IG51bWJlciB9J10sXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLmVuZCwgJ29wdGlvbnMuZW5kJywgW1xuICAgICAgICAgICAgW09iamVjdCwgJ3sgeDogbnVtYmVyLCB5OiBudW1iZXIgfSddLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucy5zdGFydC54LCAnb3B0aW9ucy5zdGFydC54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMuc3RhcnQueSwgJ29wdGlvbnMuc3RhcnQueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLmVuZC54LCAnb3B0aW9ucy5lbmQueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLmVuZC55LCAnb3B0aW9ucy5lbmQueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnRoaWNrbmVzcywgJ29wdGlvbnMudGhpY2tuZXNzJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuY29sb3IsICdvcHRpb25zLmNvbG9yJywgW1tPYmplY3QsICdDb2xvciddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuZGFzaEFycmF5LCAnb3B0aW9ucy5kYXNoQXJyYXknLCBbQXJyYXldKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5kYXNoUGhhc2UsICdvcHRpb25zLmRhc2hQaGFzZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5saW5lQ2FwLCAnb3B0aW9ucy5saW5lQ2FwJywgTGluZUNhcFN0eWxlKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYmxlbmRNb2RlLCAnb3B0aW9ucy5ibGVuZE1vZGUnLCBCbGVuZE1vZGUpO1xuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgYm9yZGVyT3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghKCdjb2xvcicgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdMaW5lKHtcbiAgICAgICAgICAgIHN0YXJ0OiBvcHRpb25zLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBvcHRpb25zLmVuZCxcbiAgICAgICAgICAgIHRoaWNrbmVzczogKF9hID0gb3B0aW9ucy50aGlja25lc3MpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDEsXG4gICAgICAgICAgICBjb2xvcjogKF9iID0gb3B0aW9ucy5jb2xvcikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGFzaEFycmF5OiAoX2MgPSBvcHRpb25zLmRhc2hBcnJheSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGFzaFBoYXNlOiAoX2QgPSBvcHRpb25zLmRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbGluZUNhcDogKF9lID0gb3B0aW9ucy5saW5lQ2FwKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGEgcmVjdGFuZ2xlIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBkZWdyZWVzLCBncmF5c2NhbGUsIHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdSZWN0YW5nbGUoe1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHdpZHRoOiAyNTAsXG4gICAgICogICBoZWlnaHQ6IDc1LFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKC0xNSksXG4gICAgICogICBib3JkZXJXaWR0aDogNSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiBncmF5c2NhbGUoMC41KSxcbiAgICAgKiAgIGNvbG9yOiByZ2IoMC43NSwgMC4yLCAwLjIpLFxuICAgICAqICAgb3BhY2l0eTogMC41LFxuICAgICAqICAgYm9yZGVyT3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSByZWN0YW5nbGUuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd1JlY3RhbmdsZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tLCBfbztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLndpZHRoLCAnb3B0aW9ucy53aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmhlaWdodCwgJ29wdGlvbnMuaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2tldywgJ29wdGlvbnMueFNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2tldywgJ29wdGlvbnMueVNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJXaWR0aCwgJ29wdGlvbnMuYm9yZGVyV2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jb2xvciwgJ29wdGlvbnMuY29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJDb2xvciwgJ29wdGlvbnMuYm9yZGVyQ29sb3InLCBbXG4gICAgICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5LCAnb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXknLCBbXG4gICAgICAgICAgICBBcnJheSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlLCAnb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UnLCBbXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckxpbmVDYXAsICdvcHRpb25zLmJvcmRlckxpbmVDYXAnLCBMaW5lQ2FwU3R5bGUpO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyT3BhY2l0eSwgJ29wdGlvbnMuYm9yZGVyT3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBib3JkZXJPcGFjaXR5OiBvcHRpb25zLmJvcmRlck9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCEoJ2NvbG9yJyBpbiBvcHRpb25zKSAmJiAhKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdSZWN0YW5nbGUoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMueSxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAxNTAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAxMDAsXG4gICAgICAgICAgICByb3RhdGU6IChfZSA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IChfZiA9IG9wdGlvbnMueFNrZXcpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogKF9nID0gb3B0aW9ucy55U2tldykgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2ggPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwLFxuICAgICAgICAgICAgY29sb3I6IChfaiA9IG9wdGlvbnMuY29sb3IpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiAoX2sgPSBvcHRpb25zLmJvcmRlckNvbG9yKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJEYXNoQXJyYXk6IChfbCA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJEYXNoUGhhc2U6IChfbSA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICAgICAgYm9yZGVyTGluZUNhcDogKF9vID0gb3B0aW9ucy5ib3JkZXJMaW5lQ2FwKSAhPT0gbnVsbCAmJiBfbyAhPT0gdm9pZCAwID8gX28gOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYSBzcXVhcmUgb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGRlZ3JlZXMsIGdyYXlzY2FsZSwgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd1NxdWFyZSh7XG4gICAgICogICB4OiAyNSxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgc2l6ZTogMTAwLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKC0xNSksXG4gICAgICogICBib3JkZXJXaWR0aDogNSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiBncmF5c2NhbGUoMC41KSxcbiAgICAgKiAgIGNvbG9yOiByZ2IoMC43NSwgMC4yLCAwLjIpLFxuICAgICAqICAgb3BhY2l0eTogMC41LFxuICAgICAqICAgYm9yZGVyT3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBzcXVhcmUuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd1NxdWFyZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBzaXplID0gb3B0aW9ucy5zaXplO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChzaXplLCAnc2l6ZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLmRyYXdSZWN0YW5nbGUoX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHdpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemUgfSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhbiBlbGxpcHNlIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBncmF5c2NhbGUsIHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdFbGxpcHNlKHtcbiAgICAgKiAgIHg6IDIwMCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgeFNjYWxlOiAxMDAsXG4gICAgICogICB5U2NhbGU6IDUwLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDUsXG4gICAgICogICBib3JkZXJDb2xvcjogZ3JheXNjYWxlKDAuNSksXG4gICAgICogICBjb2xvcjogcmdiKDAuNzUsIDAuMiwgMC4yKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNSxcbiAgICAgKiAgIGJvcmRlck9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgZWxsaXBzZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3RWxsaXBzZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2w7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2NhbGUsICdvcHRpb25zLnhTY2FsZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnlTY2FsZSwgJ29wdGlvbnMueVNjYWxlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jb2xvciwgJ29wdGlvbnMuY29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJDb2xvciwgJ29wdGlvbnMuYm9yZGVyQ29sb3InLCBbXG4gICAgICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJPcGFjaXR5LCAnb3B0aW9ucy5ib3JkZXJPcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyV2lkdGgsICdvcHRpb25zLmJvcmRlcldpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5LCAnb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXknLCBbXG4gICAgICAgICAgICBBcnJheSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlLCAnb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UnLCBbXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckxpbmVDYXAsICdvcHRpb25zLmJvcmRlckxpbmVDYXAnLCBMaW5lQ2FwU3R5bGUpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBib3JkZXJPcGFjaXR5OiBvcHRpb25zLmJvcmRlck9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCEoJ2NvbG9yJyBpbiBvcHRpb25zKSAmJiAhKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdFbGxpcHNlKHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy54LFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0aGlzLnksXG4gICAgICAgICAgICB4U2NhbGU6IChfYyA9IG9wdGlvbnMueFNjYWxlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAxMDAsXG4gICAgICAgICAgICB5U2NhbGU6IChfZCA9IG9wdGlvbnMueVNjYWxlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAxMDAsXG4gICAgICAgICAgICByb3RhdGU6IChfZSA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb2xvcjogKF9mID0gb3B0aW9ucy5jb2xvcikgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IChfZyA9IG9wdGlvbnMuYm9yZGVyQ29sb3IpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2ggPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwLFxuICAgICAgICAgICAgYm9yZGVyRGFzaEFycmF5OiAoX2ogPSBvcHRpb25zLmJvcmRlckRhc2hBcnJheSkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyRGFzaFBoYXNlOiAoX2sgPSBvcHRpb25zLmJvcmRlckRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyTGluZUNhcDogKF9sID0gb3B0aW9ucy5ib3JkZXJMaW5lQ2FwKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGEgY2lyY2xlIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBncmF5c2NhbGUsIHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdDaXJjbGUoe1xuICAgICAqICAgeDogMjAwLFxuICAgICAqICAgeTogMTUwLFxuICAgICAqICAgc2l6ZTogMTAwLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDUsXG4gICAgICogICBib3JkZXJDb2xvcjogZ3JheXNjYWxlKDAuNSksXG4gICAgICogICBjb2xvcjogcmdiKDAuNzUsIDAuMiwgMC4yKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNSxcbiAgICAgKiAgIGJvcmRlck9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgZWxsaXBzZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3Q2lyY2xlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIF9hID0gb3B0aW9ucy5zaXplLCBzaXplID0gX2EgPT09IHZvaWQgMCA/IDEwMCA6IF9hO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChzaXplLCAnc2l6ZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLmRyYXdFbGxpcHNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyB4U2NhbGU6IHNpemUsIHlTY2FsZTogc2l6ZSB9KSk7XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRPckVtYmVkRm9udCA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIHZhciBvbGRGb250ID0gdGhpcy5mb250O1xuICAgICAgICB2YXIgb2xkRm9udEtleSA9IHRoaXMuZm9udEtleTtcbiAgICAgICAgaWYgKGZvbnQpXG4gICAgICAgICAgICB0aGlzLnNldEZvbnQoZm9udCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9udCgpO1xuICAgICAgICB2YXIgbmV3Rm9udCA9IHRoaXMuZm9udDtcbiAgICAgICAgdmFyIG5ld0ZvbnRLZXkgPSB0aGlzLmZvbnRLZXk7XG4gICAgICAgIHJldHVybiB7IG9sZEZvbnQ6IG9sZEZvbnQsIG9sZEZvbnRLZXk6IG9sZEZvbnRLZXksIG5ld0ZvbnQ6IG5ld0ZvbnQsIG5ld0ZvbnRLZXk6IG5ld0ZvbnRLZXkgfTtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldEZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5mb250IHx8ICF0aGlzLmZvbnRLZXkpIHtcbiAgICAgICAgICAgIHZhciBmb250ID0gdGhpcy5kb2MuZW1iZWRTdGFuZGFyZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpO1xuICAgICAgICAgICAgdGhpcy5zZXRGb250KGZvbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5mb250LCB0aGlzLmZvbnRLZXldO1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUucmVzZXRGb250ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmZvbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZm9udEtleSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldENvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAodXNlRXhpc3RpbmcpIHtcbiAgICAgICAgaWYgKHVzZUV4aXN0aW5nID09PSB2b2lkIDApIHsgdXNlRXhpc3RpbmcgPSB0cnVlOyB9XG4gICAgICAgIGlmICh1c2VFeGlzdGluZyAmJiB0aGlzLmNvbnRlbnRTdHJlYW0pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50U3RyZWFtO1xuICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0gPSB0aGlzLmNyZWF0ZUNvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgdGhpcy5jb250ZW50U3RyZWFtUmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih0aGlzLmNvbnRlbnRTdHJlYW0pO1xuICAgICAgICB0aGlzLm5vZGUuYWRkQ29udGVudFN0cmVhbSh0aGlzLmNvbnRlbnRTdHJlYW1SZWYpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50U3RyZWFtO1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUuY3JlYXRlQ29udGVudFN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgb3BlcmF0b3JzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLmRvYy5jb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gUERGQ29udGVudFN0cmVhbS5vZihkaWN0LCBvcGVyYXRvcnMpO1xuICAgICAgICByZXR1cm4gY29udGVudFN0cmVhbTtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG9wYWNpdHkgPSBvcHRpb25zLm9wYWNpdHksIGJvcmRlck9wYWNpdHkgPSBvcHRpb25zLmJvcmRlck9wYWNpdHksIGJsZW5kTW9kZSA9IG9wdGlvbnMuYmxlbmRNb2RlO1xuICAgICAgICBpZiAob3BhY2l0eSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBib3JkZXJPcGFjaXR5ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGJsZW5kTW9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlID0gdGhpcy5kb2MuY29udGV4dC5vYmooe1xuICAgICAgICAgICAgVHlwZTogJ0V4dEdTdGF0ZScsXG4gICAgICAgICAgICBjYTogb3BhY2l0eSxcbiAgICAgICAgICAgIENBOiBib3JkZXJPcGFjaXR5LFxuICAgICAgICAgICAgQk06IGJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLm5vZGUubmV3RXh0R1N0YXRlKCdHUycsIGdyYXBoaWNzU3RhdGUpO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2NhbGVBbm5vdCA9IGZ1bmN0aW9uIChhbm5vdCwgeCwgeSkge1xuICAgICAgICB2YXIgc2VsZWN0b3JzID0gWydSRCcsICdDTCcsICdWZXJ0aWNlcycsICdRdWFkUG9pbnRzJywgJ0wnLCAnUmVjdCddO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBzZWxlY3RvcnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgbGlzdCA9IGFubm90Lmxvb2t1cChQREZOYW1lLm9mKHNlbGVjdG9yc1tpZHhdKSk7XG4gICAgICAgICAgICBpZiAobGlzdCBpbnN0YW5jZW9mIFBERkFycmF5KVxuICAgICAgICAgICAgICAgIGxpc3Quc2NhbGVQREZOdW1iZXJzKHgsIHkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmtMaXN0cyA9IGFubm90Lmxvb2t1cChQREZOYW1lLm9mKCdJbmtMaXN0JykpO1xuICAgICAgICBpZiAoaW5rTGlzdHMgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gaW5rTGlzdHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IGlua0xpc3RzLmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgICAgIGlmIChhcnIgaW5zdGFuY2VvZiBQREZBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgYXJyLnNjYWxlUERGTnVtYmVycyh4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmFkZFBhZ2VdXSBhbmQgW1tQREZEb2N1bWVudC5pbnNlcnRQYWdlXV1cbiAgICAgKiA+IG1ldGhvZHMsIHdoaWNoIGNhbiBjcmVhdGUgaW5zdGFuY2VzIG9mIFtbUERGUGFnZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZQYWdlXV0gZnJvbSBhbiBleGlzdGluZyBsZWFmIG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVhZk5vZGUgVGhlIGxlYWYgbm9kZSB0byBiZSB3cmFwcGVkLlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoZSBwYWdlLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBwYWdlIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERlBhZ2Uub2YgPSBmdW5jdGlvbiAobGVhZk5vZGUsIHJlZiwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZShsZWFmTm9kZSwgcmVmLCBkb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmFkZFBhZ2VdXSBhbmQgW1tQREZEb2N1bWVudC5pbnNlcnRQYWdlXV1cbiAgICAgKiA+IG1ldGhvZHMsIHdoaWNoIGNhbiBjcmVhdGUgaW5zdGFuY2VzIG9mIFtbUERGUGFnZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZQYWdlXV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgcGFnZSB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZQYWdlLmNyZWF0ZSA9IGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgdmFyIGR1bW15UmVmID0gUERGUmVmLm9mKC0xKTtcbiAgICAgICAgdmFyIHBhZ2VMZWFmID0gUERGUGFnZUxlYWYud2l0aENvbnRleHRBbmRQYXJlbnQoZG9jLmNvbnRleHQsIGR1bW15UmVmKTtcbiAgICAgICAgdmFyIHBhZ2VSZWYgPSBkb2MuY29udGV4dC5yZWdpc3RlcihwYWdlTGVhZik7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZShwYWdlTGVhZiwgcGFnZVJlZiwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZQYWdlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlBhZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYWdlLmpzLm1hcCIsImV4cG9ydCB2YXIgQmxlbmRNb2RlO1xuKGZ1bmN0aW9uIChCbGVuZE1vZGUpIHtcbiAgICBCbGVuZE1vZGVbXCJOb3JtYWxcIl0gPSBcIk5vcm1hbFwiO1xuICAgIEJsZW5kTW9kZVtcIk11bHRpcGx5XCJdID0gXCJNdWx0aXBseVwiO1xuICAgIEJsZW5kTW9kZVtcIlNjcmVlblwiXSA9IFwiU2NyZWVuXCI7XG4gICAgQmxlbmRNb2RlW1wiT3ZlcmxheVwiXSA9IFwiT3ZlcmxheVwiO1xuICAgIEJsZW5kTW9kZVtcIkRhcmtlblwiXSA9IFwiRGFya2VuXCI7XG4gICAgQmxlbmRNb2RlW1wiTGlnaHRlblwiXSA9IFwiTGlnaHRlblwiO1xuICAgIEJsZW5kTW9kZVtcIkNvbG9yRG9kZ2VcIl0gPSBcIkNvbG9yRG9kZ2VcIjtcbiAgICBCbGVuZE1vZGVbXCJDb2xvckJ1cm5cIl0gPSBcIkNvbG9yQnVyblwiO1xuICAgIEJsZW5kTW9kZVtcIkhhcmRMaWdodFwiXSA9IFwiSGFyZExpZ2h0XCI7XG4gICAgQmxlbmRNb2RlW1wiU29mdExpZ2h0XCJdID0gXCJTb2Z0TGlnaHRcIjtcbiAgICBCbGVuZE1vZGVbXCJEaWZmZXJlbmNlXCJdID0gXCJEaWZmZXJlbmNlXCI7XG4gICAgQmxlbmRNb2RlW1wiRXhjbHVzaW9uXCJdID0gXCJFeGNsdXNpb25cIjtcbn0pKEJsZW5kTW9kZSB8fCAoQmxlbmRNb2RlID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlBhZ2VPcHRpb25zLmpzLm1hcCIsImV4cG9ydCB2YXIgU3RhbmRhcmRGb250cztcbihmdW5jdGlvbiAoU3RhbmRhcmRGb250cykge1xuICAgIFN0YW5kYXJkRm9udHNbXCJDb3VyaWVyXCJdID0gXCJDb3VyaWVyXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIkNvdXJpZXJCb2xkXCJdID0gXCJDb3VyaWVyLUJvbGRcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiQ291cmllck9ibGlxdWVcIl0gPSBcIkNvdXJpZXItT2JsaXF1ZVwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJDb3VyaWVyQm9sZE9ibGlxdWVcIl0gPSBcIkNvdXJpZXItQm9sZE9ibGlxdWVcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiSGVsdmV0aWNhXCJdID0gXCJIZWx2ZXRpY2FcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiSGVsdmV0aWNhQm9sZFwiXSA9IFwiSGVsdmV0aWNhLUJvbGRcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiSGVsdmV0aWNhT2JsaXF1ZVwiXSA9IFwiSGVsdmV0aWNhLU9ibGlxdWVcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiSGVsdmV0aWNhQm9sZE9ibGlxdWVcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJUaW1lc1JvbWFuXCJdID0gXCJUaW1lcy1Sb21hblwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJUaW1lc1JvbWFuQm9sZFwiXSA9IFwiVGltZXMtQm9sZFwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJUaW1lc1JvbWFuSXRhbGljXCJdID0gXCJUaW1lcy1JdGFsaWNcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiVGltZXNSb21hbkJvbGRJdGFsaWNcIl0gPSBcIlRpbWVzLUJvbGRJdGFsaWNcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiU3ltYm9sXCJdID0gXCJTeW1ib2xcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiWmFwZkRpbmdiYXRzXCJdID0gXCJaYXBmRGluZ2JhdHNcIjtcbn0pKFN0YW5kYXJkRm9udHMgfHwgKFN0YW5kYXJkRm9udHMgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RhbmRhcmRGb250cy5qcy5tYXAiLCJpbXBvcnQgeyBzZXRGaWxsaW5nQ215a0NvbG9yLCBzZXRGaWxsaW5nR3JheXNjYWxlQ29sb3IsIHNldEZpbGxpbmdSZ2JDb2xvciwgc2V0U3Ryb2tpbmdDbXlrQ29sb3IsIHNldFN0cm9raW5nR3JheXNjYWxlQ29sb3IsIHNldFN0cm9raW5nUmdiQ29sb3IsIH0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBhc3NlcnRSYW5nZSwgZXJyb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmV4cG9ydCB2YXIgQ29sb3JUeXBlcztcbihmdW5jdGlvbiAoQ29sb3JUeXBlcykge1xuICAgIENvbG9yVHlwZXNbXCJHcmF5c2NhbGVcIl0gPSBcIkdyYXlzY2FsZVwiO1xuICAgIENvbG9yVHlwZXNbXCJSR0JcIl0gPSBcIlJHQlwiO1xuICAgIENvbG9yVHlwZXNbXCJDTVlLXCJdID0gXCJDTVlLXCI7XG59KShDb2xvclR5cGVzIHx8IChDb2xvclR5cGVzID0ge30pKTtcbmV4cG9ydCB2YXIgZ3JheXNjYWxlID0gZnVuY3Rpb24gKGdyYXkpIHtcbiAgICBhc3NlcnRSYW5nZShncmF5LCAnZ3JheScsIDAuMCwgMS4wKTtcbiAgICByZXR1cm4geyB0eXBlOiBDb2xvclR5cGVzLkdyYXlzY2FsZSwgZ3JheTogZ3JheSB9O1xufTtcbmV4cG9ydCB2YXIgcmdiID0gZnVuY3Rpb24gKHJlZCwgZ3JlZW4sIGJsdWUpIHtcbiAgICBhc3NlcnRSYW5nZShyZWQsICdyZWQnLCAwLCAxKTtcbiAgICBhc3NlcnRSYW5nZShncmVlbiwgJ2dyZWVuJywgMCwgMSk7XG4gICAgYXNzZXJ0UmFuZ2UoYmx1ZSwgJ2JsdWUnLCAwLCAxKTtcbiAgICByZXR1cm4geyB0eXBlOiBDb2xvclR5cGVzLlJHQiwgcmVkOiByZWQsIGdyZWVuOiBncmVlbiwgYmx1ZTogYmx1ZSB9O1xufTtcbmV4cG9ydCB2YXIgY215ayA9IGZ1bmN0aW9uIChjeWFuLCBtYWdlbnRhLCB5ZWxsb3csIGtleSkge1xuICAgIGFzc2VydFJhbmdlKGN5YW4sICdjeWFuJywgMCwgMSk7XG4gICAgYXNzZXJ0UmFuZ2UobWFnZW50YSwgJ21hZ2VudGEnLCAwLCAxKTtcbiAgICBhc3NlcnRSYW5nZSh5ZWxsb3csICd5ZWxsb3cnLCAwLCAxKTtcbiAgICBhc3NlcnRSYW5nZShrZXksICdrZXknLCAwLCAxKTtcbiAgICByZXR1cm4geyB0eXBlOiBDb2xvclR5cGVzLkNNWUssIGN5YW46IGN5YW4sIG1hZ2VudGE6IG1hZ2VudGEsIHllbGxvdzogeWVsbG93LCBrZXk6IGtleSB9O1xufTtcbnZhciBHcmF5c2NhbGUgPSBDb2xvclR5cGVzLkdyYXlzY2FsZSwgUkdCID0gQ29sb3JUeXBlcy5SR0IsIENNWUsgPSBDb2xvclR5cGVzLkNNWUs7XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB2YXIgc2V0RmlsbGluZ0NvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNvbG9yLnR5cGUgPT09IEdyYXlzY2FsZSA/IHNldEZpbGxpbmdHcmF5c2NhbGVDb2xvcihjb2xvci5ncmF5KVxuICAgICAgICA6IGNvbG9yLnR5cGUgPT09IFJHQiA/IHNldEZpbGxpbmdSZ2JDb2xvcihjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlKVxuICAgICAgICAgICAgOiBjb2xvci50eXBlID09PSBDTVlLID8gc2V0RmlsbGluZ0NteWtDb2xvcihjb2xvci5jeWFuLCBjb2xvci5tYWdlbnRhLCBjb2xvci55ZWxsb3csIGNvbG9yLmtleSlcbiAgICAgICAgICAgICAgICA6IGVycm9yKFwiSW52YWxpZCBjb2xvcjogXCIgKyBKU09OLnN0cmluZ2lmeShjb2xvcikpO1xufTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciBzZXRTdHJva2luZ0NvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNvbG9yLnR5cGUgPT09IEdyYXlzY2FsZSA/IHNldFN0cm9raW5nR3JheXNjYWxlQ29sb3IoY29sb3IuZ3JheSlcbiAgICAgICAgOiBjb2xvci50eXBlID09PSBSR0IgPyBzZXRTdHJva2luZ1JnYkNvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpXG4gICAgICAgICAgICA6IGNvbG9yLnR5cGUgPT09IENNWUsgPyBzZXRTdHJva2luZ0NteWtDb2xvcihjb2xvci5jeWFuLCBjb2xvci5tYWdlbnRhLCBjb2xvci55ZWxsb3csIGNvbG9yLmtleSlcbiAgICAgICAgICAgICAgICA6IGVycm9yKFwiSW52YWxpZCBjb2xvcjogXCIgKyBKU09OLnN0cmluZ2lmeShjb2xvcikpO1xufTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciBjb21wb25lbnRzVG9Db2xvciA9IGZ1bmN0aW9uIChjb21wcywgc2NhbGUpIHtcbiAgICBpZiAoc2NhbGUgPT09IHZvaWQgMCkgeyBzY2FsZSA9IDE7IH1cbiAgICByZXR1cm4gKChjb21wcyA9PT0gbnVsbCB8fCBjb21wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcHMubGVuZ3RoKSA9PT0gMSA/IGdyYXlzY2FsZShjb21wc1swXSAqIHNjYWxlKVxuICAgICAgICA6IChjb21wcyA9PT0gbnVsbCB8fCBjb21wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcHMubGVuZ3RoKSA9PT0gMyA/IHJnYihjb21wc1swXSAqIHNjYWxlLCBjb21wc1sxXSAqIHNjYWxlLCBjb21wc1syXSAqIHNjYWxlKVxuICAgICAgICAgICAgOiAoY29tcHMgPT09IG51bGwgfHwgY29tcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBzLmxlbmd0aCkgPT09IDQgPyBjbXlrKGNvbXBzWzBdICogc2NhbGUsIGNvbXBzWzFdICogc2NhbGUsIGNvbXBzWzJdICogc2NhbGUsIGNvbXBzWzNdICogc2NhbGUpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQpO1xufTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciBjb2xvclRvQ29tcG9uZW50cyA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIHJldHVybiBjb2xvci50eXBlID09PSBHcmF5c2NhbGUgPyBbY29sb3IuZ3JheV1cbiAgICAgICAgOiBjb2xvci50eXBlID09PSBSR0IgPyBbY29sb3IucmVkLCBjb2xvci5ncmVlbiwgY29sb3IuYmx1ZV1cbiAgICAgICAgICAgIDogY29sb3IudHlwZSA9PT0gQ01ZSyA/IFtjb2xvci5jeWFuLCBjb2xvci5tYWdlbnRhLCBjb2xvci55ZWxsb3csIGNvbG9yLmtleV1cbiAgICAgICAgICAgICAgICA6IGVycm9yKFwiSW52YWxpZCBjb2xvcjogXCIgKyBKU09OLnN0cmluZ2lmeShjb2xvcikpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbG9ycy5qcy5tYXAiLCIvLyB0c2xpbnQ6ZGlzYWJsZTogbWF4LWNsYXNzZXMtcGVyLWZpbGVcbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIGRvY3VtZW50YXRpb24gd2l0aCBleGFtcGxlXG52YXIgRW5jcnlwdGVkUERGRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVuY3J5cHRlZFBERkVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEVuY3J5cHRlZFBERkVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gJ0lucHV0IGRvY3VtZW50IHRvIGBQREZEb2N1bWVudC5sb2FkYCBpcyBlbmNyeXB0ZWQuIFlvdSBjYW4gdXNlIGBQREZEb2N1bWVudC5sb2FkKC4uLiwgeyBpZ25vcmVFbmNyeXB0aW9uOiB0cnVlIH0pYCBpZiB5b3Ugd2lzaCB0byBsb2FkIHRoZSBkb2N1bWVudCBhbnl3YXlzLic7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBFbmNyeXB0ZWRQREZFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEVuY3J5cHRlZFBERkVycm9yIH07XG4vLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gZG9jdW1lbnRhdGlvbiB3aXRoIGV4YW1wbGVcbnZhciBGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSAnSW5wdXQgdG8gYFBERkRvY3VtZW50LmVtYmVkRm9udGAgd2FzIGEgY3VzdG9tIGZvbnQsIGJ1dCBubyBgZm9udGtpdGAgaW5zdGFuY2Ugd2FzIGZvdW5kLiBZb3UgbXVzdCByZWdpc3RlciBhIGBmb250a2l0YCBpbnN0YW5jZSB3aXRoIGBQREZEb2N1bWVudC5yZWdpc3RlckZvbnRraXQoLi4uKWAgYmVmb3JlIGVtYmVkZGluZyBjdXN0b20gZm9udHMuJztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yIH07XG4vLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gZG9jdW1lbnRhdGlvbiB3aXRoIGV4YW1wbGVcbnZhciBGb3JlaWduUGFnZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGb3JlaWduUGFnZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZvcmVpZ25QYWdlRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSAnQSBgcGFnZWAgcGFzc2VkIHRvIGBQREZEb2N1bWVudC5hZGRQYWdlYCBvciBgUERGRG9jdW1lbnQuaW5zZXJ0UGFnZWAgd2FzIGZyb20gYSBkaWZmZXJlbnQgKGZvcmVpZ24pIFBERiBkb2N1bWVudC4gSWYgeW91IHdhbnQgdG8gY29weSBwYWdlcyBmcm9tIG9uZSBQREZEb2N1bWVudCB0byBhbm90aGVyLCB5b3UgbXVzdCB1c2UgYFBERkRvY3VtZW50LmNvcHlQYWdlcyguLi4pYCB0byBjb3B5IHRoZSBwYWdlcyBiZWZvcmUgYWRkaW5nIG9yIGluc2VydGluZyB0aGVtLic7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBGb3JlaWduUGFnZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgRm9yZWlnblBhZ2VFcnJvciB9O1xuLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIGRvY3VtZW50YXRpb24gd2l0aCBleGFtcGxlXG52YXIgUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gJ1BERkRvY3VtZW50IGhhcyBubyBwYWdlcyBzbyBgUERGRG9jdW1lbnQucmVtb3ZlUGFnZWAgY2Fubm90IGJlIGNhbGxlZCc7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBSZW1vdmVQYWdlRnJvbUVtcHR5RG9jdW1lbnRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yIH07XG52YXIgTm9TdWNoRmllbGRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTm9TdWNoRmllbGRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOb1N1Y2hGaWVsZEVycm9yKG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiUERGRG9jdW1lbnQgaGFzIG5vIGZvcm0gZmllbGQgd2l0aCB0aGUgbmFtZSBcXFwiXCIgKyBuYW1lICsgXCJcXFwiXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb1N1Y2hGaWVsZEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTm9TdWNoRmllbGRFcnJvciB9O1xudmFyIFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBleHBlY3RlZFR5cGUgPSBleHBlY3RlZCA9PT0gbnVsbCB8fCBleHBlY3RlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhwZWN0ZWQubmFtZTtcbiAgICAgICAgdmFyIGFjdHVhbFR5cGUgPSAoX2IgPSAoX2EgPSBhY3R1YWwgPT09IG51bGwgfHwgYWN0dWFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY3R1YWwuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBhY3R1YWw7XG4gICAgICAgIHZhciBtc2cgPSBcIkV4cGVjdGVkIGZpZWxkIFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgdG8gYmUgb2YgdHlwZSBcIiArIGV4cGVjdGVkVHlwZSArIFwiLCBcIiArXG4gICAgICAgICAgICAoXCJidXQgaXQgaXMgYWN0dWFsbHkgb2YgdHlwZSBcIiArIGFjdHVhbFR5cGUpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yIH07XG52YXIgTWlzc2luZ09uVmFsdWVDaGVja0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nT25WYWx1ZUNoZWNrRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ09uVmFsdWVDaGVja0Vycm9yKG9uVmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHNlbGVjdCBjaGVjayBib3ggZHVlIHRvIG1pc3Npbmcgb25WYWx1ZTogXFxcIlwiICsgb25WYWx1ZSArIFwiXFxcIlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ09uVmFsdWVDaGVja0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ09uVmFsdWVDaGVja0Vycm9yIH07XG52YXIgRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yKG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZTogXFxcIlwiICsgbmFtZSArIFwiXFxcIlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRmllbGRBbHJlYWR5RXhpc3RzRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBGaWVsZEFscmVhZHlFeGlzdHNFcnJvciB9O1xudmFyIEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvcihuYW1lUGFydCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGaWVsZCBuYW1lIGNvbnRhaW5zIGludmFsaWQgY29tcG9uZW50OiBcXFwiXCIgKyBuYW1lUGFydCArIFwiXFxcIlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3IgfTtcbnZhciBGaWVsZEV4aXN0c0FzTm9uVGVybWluYWxFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmllbGRFeGlzdHNBc05vblRlcm1pbmFsRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmllbGRFeGlzdHNBc05vblRlcm1pbmFsRXJyb3IobmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBIG5vbi10ZXJtaW5hbCBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZTogXFxcIlwiICsgbmFtZSArIFwiXFxcIlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRmllbGRFeGlzdHNBc05vblRlcm1pbmFsRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBGaWVsZEV4aXN0c0FzTm9uVGVybWluYWxFcnJvciB9O1xudmFyIFJpY2hUZXh0RmllbGRSZWFkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJpY2hUZXh0RmllbGRSZWFkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmljaFRleHRGaWVsZFJlYWRFcnJvcihmaWVsZE5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiUmVhZGluZyByaWNoIHRleHQgZmllbGRzIGlzIG5vdCBzdXBwb3J0ZWQ6IEF0dGVtcHRlZCB0byByZWFkIHJpY2ggdGV4dCBmaWVsZDogXCIgKyBmaWVsZE5hbWU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBSaWNoVGV4dEZpZWxkUmVhZEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUmljaFRleHRGaWVsZFJlYWRFcnJvciB9O1xudmFyIENvbWJlZFRleHRMYXlvdXRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29tYmVkVGV4dExheW91dEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvbWJlZFRleHRMYXlvdXRFcnJvcihsaW5lTGVuZ3RoLCBjZWxsQ291bnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIGxheW91dCBjb21iZWQgdGV4dCBhcyBsaW5lTGVuZ3RoPVwiICsgbGluZUxlbmd0aCArIFwiIGlzIGdyZWF0ZXIgdGhhbiBjZWxsQ291bnQ9XCIgKyBjZWxsQ291bnQ7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBDb21iZWRUZXh0TGF5b3V0RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBDb21iZWRUZXh0TGF5b3V0RXJyb3IgfTtcbnZhciBFeGNlZWRlZE1heExlbmd0aEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFeGNlZWRlZE1heExlbmd0aEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IodGV4dExlbmd0aCwgbWF4TGVuZ3RoLCBuYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBzZXQgdGV4dCB3aXRoIGxlbmd0aD1cIiArIHRleHRMZW5ndGggKyBcIiBmb3IgVGV4dEZpZWxkIHdpdGggbWF4TGVuZ3RoPVwiICsgbWF4TGVuZ3RoICsgXCIgYW5kIG5hbWU9XCIgKyBuYW1lO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRXhjZWVkZWRNYXhMZW5ndGhFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IgfTtcbnZhciBJbnZhbGlkTWF4TGVuZ3RoRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEludmFsaWRNYXhMZW5ndGhFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnZhbGlkTWF4TGVuZ3RoRXJyb3IodGV4dExlbmd0aCwgbWF4TGVuZ3RoLCBuYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBzZXQgbWF4TGVuZ3RoPVwiICsgbWF4TGVuZ3RoICsgXCIsIHdoaWNoIGlzIGxlc3MgdGhhbiBcIiArIHRleHRMZW5ndGggKyBcIiwgdGhlIGxlbmd0aCBvZiB0aGlzIGZpZWxkJ3MgY3VycmVudCB2YWx1ZSAobmFtZT1cIiArIG5hbWUgKyBcIilcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEludmFsaWRNYXhMZW5ndGhFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEludmFsaWRNYXhMZW5ndGhFcnJvciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4uL1BERlBhZ2VcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuLi9QREZGb250XCI7XG5pbXBvcnQgeyBJbWFnZUFsaWdubWVudCB9IGZyb20gXCIuLi9pbWFnZS9hbGlnbm1lbnRcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHRCdXR0b25BcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUERGU3RyZWFtLCBQREZBY3JvUHVzaEJ1dHRvbiwgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydE9yVW5kZWZpbmVkLCBhc3NlcnRQb3NpdGl2ZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgYnV0dG9uIGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZCdXR0b25dXSBmaWVsZHMgYXJlIGludGVyYWN0aXZlIGNvbnRyb2xzIHRoYXQgdXNlcnMgY2FuIGNsaWNrIHdpdGggdGhlaXJcbiAqIG1vdXNlLiBUaGlzIHR5cGUgb2YgW1tQREZGaWVsZF1dIGlzIG5vdCBzdGF0ZWZ1bC4gVGhlIHB1cnBvc2Ugb2YgYSBidXR0b25cbiAqIGlzIHRvIHBlcmZvcm0gYW4gYWN0aW9uIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGl0LCBzdWNoIGFzIG9wZW5pbmcgYSBwcmludFxuICogbW9kYWwgb3IgcmVzZXR0aW5nIHRoZSBmb3JtLiBCdXR0b25zIGFyZSB0eXBpY2FsbHkgcmVjdGFuZ3VsYXIgaW4gc2hhcGUgYW5kXG4gKiBoYXZlIGEgdGV4dCBsYWJlbCBkZXNjcmliaW5nIHRoZSBhY3Rpb24gdGhhdCB0aGV5IHBlcmZvcm0gd2hlbiBjbGlja2VkLlxuICovXG52YXIgUERGQnV0dG9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZCdXR0b24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQnV0dG9uKGFjcm9QdXNoQnV0dG9uLCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvUHVzaEJ1dHRvbiwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9QdXNoQnV0dG9uLCAnYWNyb0J1dHRvbicsIFtcbiAgICAgICAgICAgIFtQREZBY3JvUHVzaEJ1dHRvbiwgJ1BERkFjcm9QdXNoQnV0dG9uJ10sXG4gICAgICAgIF0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvUHVzaEJ1dHRvbjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IGFuIGltYWdlIGluc2lkZSB0aGUgYm91bmRzIG9mIHRoaXMgYnV0dG9uJ3Mgd2lkZ2V0cy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwbmdJbWFnZSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZyguLi4pXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKiBidXR0b24uc2V0SW1hZ2UocG5nSW1hZ2UsIEltYWdlQWxpZ25tZW50LkNlbnRlcilcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBhcHBlYXJhbmNlcyBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgYnV0dG9uJ3Mgd2lkZ2V0cy5cbiAgICAgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAcGFyYW0gYWxpZ25tZW50IFRoZSBhbGlnbm1lbnQgb2YgdGhlIGltYWdlLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUuc2V0SW1hZ2UgPSBmdW5jdGlvbiAoaW1hZ2UsIGFsaWdubWVudCkge1xuICAgICAgICBpZiAoYWxpZ25tZW50ID09PSB2b2lkIDApIHsgYWxpZ25tZW50ID0gSW1hZ2VBbGlnbm1lbnQuQ2VudGVyOyB9XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdHJlYW1SZWYgPSB0aGlzLmNyZWF0ZUltYWdlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIGltYWdlLCBhbGlnbm1lbnQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlcyh3aWRnZXQsIHsgbm9ybWFsOiBzdHJlYW1SZWYgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNDbGVhbigpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmb250IHNpemUgZm9yIHRoaXMgZmllbGQuIExhcmdlciBmb250IHNpemVzIHdpbGwgcmVzdWx0IGluIGxhcmdlclxuICAgICAqIHRleHQgYmVpbmcgZGlzcGxheWVkIHdoZW4gUERGIHJlYWRlcnMgcmVuZGVyIHRoaXMgYnV0dG9uLiBGb250IHNpemVzIG1heVxuICAgICAqIGJlIGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gU3VwcGx5aW5nIGEgbmVnYXRpdmUgZm9udCBzaXplIHdpbGxcbiAgICAgKiBjYXVzZSB0aGlzIG1ldGhvZCB0byB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKiBidXR0b24uc2V0Rm9udFNpemUoNClcbiAgICAgKiBidXR0b24uc2V0Rm9udFNpemUoMTUuNylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqID4gVGhpcyBtZXRob2QgZGVwZW5kcyB1cG9uIHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGFwcGVhcmFuY2VcbiAgICAgKiA+IChgL0RBYCkgc3RyaW5nLiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nLFxuICAgICAqID4gb3IgdGhhdCBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhIGZvbnQgc2l6ZSAodmlhIHRoZSBgVGZgIG9wZXJhdG9yKSxcbiAgICAgKiA+IHRoZW4gdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb250U2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGV4dCBpbiB0aGlzIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUuc2V0Rm9udFNpemUgPSBmdW5jdGlvbiAoZm9udFNpemUpIHtcbiAgICAgICAgYXNzZXJ0UG9zaXRpdmUoZm9udFNpemUsICdmb250U2l6ZScpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNob3cgdGhpcyBidXR0b24gb24gdGhlIHNwZWNpZmllZCBwYWdlIHdpdGggdGhlIGdpdmVuIHRleHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdWJ1bnR1Rm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQodWJ1bnR1Rm9udEJ5dGVzKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uY3JlYXRlQnV0dG9uKCdzb21lLmJ1dHRvbi5maWVsZCcpXG4gICAgICpcbiAgICAgKiBidXR0b24uYWRkVG9QYWdlKCdEbyBTdHVmZicsIHBhZ2UsIHtcbiAgICAgKiAgIHg6IDUwLFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB3aWR0aDogMjAwLFxuICAgICAqICAgaGVpZ2h0OiAxMDAsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiAgIGZvbnQ6IHVidW50dUZvbnQsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHdpZGdldCBmb3IgdGhpcyBidXR0b24gZmllbGQuXG4gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZGlzcGxheWVkIGZvciB0aGlzIGJ1dHRvbiB3aWRnZXQuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhpcyBidXR0b24gd2lkZ2V0IHNob3VsZCBiZSBhZGRlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gYWRkaW5nIHRoaXMgYnV0dG9uIHdpZGdldC5cbiAgICAgKi9cbiAgICBQREZCdXR0b24ucHJvdG90eXBlLmFkZFRvUGFnZSA9IGZ1bmN0aW9uIChcbiAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIGJlIG9wdGlvbmFsLCBlLmcuIGZvciBpbWFnZSBidXR0b25zXG4gICAgdGV4dCwgcGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZCh0ZXh0LCAndGV4dCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgYnV0dG9uXG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldCh7XG4gICAgICAgICAgICB4OiAoKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDApIC0gKChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCkgLyAyLFxuICAgICAgICAgICAgeTogKChfYyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwKSAtICgoX2QgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDApIC8gMixcbiAgICAgICAgICAgIHdpZHRoOiAoX2UgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDEwMCxcbiAgICAgICAgICAgIGhlaWdodDogKF9mID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogNTAsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IChfZyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50ZXh0Q29sb3IpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHJnYigwLCAwLCAwKSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogKF9oID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcikgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogcmdiKDAuNzUsIDAuNzUsIDAuNzUpLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2ogPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IDAsXG4gICAgICAgICAgICByb3RhdGU6IChfayA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9rICE9PSB2b2lkIDAgPyBfayA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBjYXB0aW9uOiB0ZXh0LFxuICAgICAgICAgICAgaGlkZGVuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXQod2lkZ2V0UmVmKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHZhciBmb250ID0gKF9sID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZvbnQpICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IHRoaXMuZG9jLmdldEZvcm0oKS5nZXREZWZhdWx0Rm9udCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGUgZ2l2ZW4gcGFnZVxuICAgICAgICBwYWdlLm5vZGUuYWRkQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYnV0dG9uIGhhcyBiZWVuIG1hcmtlZCBhcyBkaXJ0eSwgb3IgaWYgYW55IG9mIHRoaXNcbiAgICAgKiBidXR0b24ncyB3aWRnZXRzIGRvIG5vdCBoYXZlIGFuIGFwcGVhcmFuY2Ugc3RyZWFtLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uZ2V0QnV0dG9uKCdzb21lLmJ1dHRvbi5maWVsZCcpXG4gICAgICogaWYgKGJ1dHRvbi5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIGNvbnNvbGUubG9nKCdOZWVkcyB1cGRhdGUnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgYnV0dG9uIG5lZWRzIGFuIGFwcGVhcmFuY2UgdXBkYXRlLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5pc0RpcnR5KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIGhhc0FwcGVhcmFuY2VzID0gKChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsKSBpbnN0YW5jZW9mIFBERlN0cmVhbTtcbiAgICAgICAgICAgIGlmICghaGFzQXBwZWFyYW5jZXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBidXR0b24ncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgYnV0dG9ucy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uZ2V0QnV0dG9uKCdzb21lLmJ1dHRvbi5maWVsZCcpXG4gICAgICogYnV0dG9uLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZCdXR0b24ucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGJ1dHRvbidzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0XG4gICAgICogYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgYnV0dG9ucyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmdldEJ1dHRvbignc29tZS5idXR0b24uZmllbGQnKVxuICAgICAqIGJ1dHRvbi51cGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EsIChmaWVsZCwgd2lkZ2V0LCBmb250KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiB7XG4gICAgICogICAgIG5vcm1hbDogZHJhd0J1dHRvbiguLi4pLFxuICAgICAqICAgICBkb3duOiBkcmF3QnV0dG9uKC4uLiksXG4gICAgICogICB9XG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqIEBwYXJhbSBwcm92aWRlciBPcHRpb25hbGx5LCB0aGUgYXBwZWFyYW5jZSBwcm92aWRlciB0byBiZSB1c2VkIGZvclxuICAgICAqICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUudXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQocHJvdmlkZXIsICdwcm92aWRlcicsIFtGdW5jdGlvbl0pO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250LCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciBhcFByb3ZpZGVyID0gcHJvdmlkZXIgIT09IG51bGwgJiYgcHJvdmlkZXIgIT09IHZvaWQgMCA/IHByb3ZpZGVyIDogZGVmYXVsdEJ1dHRvbkFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCwgZm9udCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VXaXRoRm9udCh3aWRnZXQsIGZvbnQsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldEJ1dHRvbl1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGQnV0dG9uXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkJ1dHRvbl1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb1B1c2hCdXR0b24gYW5kIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9QdXNoQnV0dG9uIFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvUHVzaEJ1dHRvbmAgZm9yIHRoaXMgYnV0dG9uLlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgYnV0dG9uLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgYnV0dG9uIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5vZiA9IGZ1bmN0aW9uIChhY3JvUHVzaEJ1dHRvbiwgcmVmLCBkb2MpIHsgcmV0dXJuIG5ldyBQREZCdXR0b24oYWNyb1B1c2hCdXR0b24sIHJlZiwgZG9jKTsgfTtcbiAgICByZXR1cm4gUERGQnV0dG9uO1xufShQREZGaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQnV0dG9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQnV0dG9uLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4uL1BERlBhZ2VcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHRDaGVja0JveEFwcGVhcmFuY2VQcm92aWRlciwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuaW1wb3J0IHsgcmdiIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBQREZOYW1lLCBQREZEaWN0LCBQREZBY3JvQ2hlY2tCb3gsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRPclVuZGVmaW5lZCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2hlY2sgYm94IGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZDaGVja0JveF1dIGZpZWxkcyBhcmUgaW50ZXJhY3RpdmUgYm94ZXMgdGhhdCB1c2VycyBjYW4gY2xpY2sgd2l0aCB0aGVpclxuICogbW91c2UuIFRoaXMgdHlwZSBvZiBbW1BERkZpZWxkXV0gaGFzIHR3byBzdGF0ZXM6IGBvbmAgYW5kIGBvZmZgLiBUaGUgcHVycG9zZVxuICogb2YgYSBjaGVjayBib3ggaXMgdG8gZW5hYmxlIHVzZXJzIHRvIHNlbGVjdCBmcm9tIG9uZSBvciBtb3JlIG9wdGlvbnMsIHdoZXJlXG4gKiBlYWNoIG9wdGlvbiBpcyByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBjaGVjayBib3guIENoZWNrIGJveGVzIGFyZSB0eXBpY2FsbHlcbiAqIHNxdWFyZSBpbiBzaGFwZSBhbmQgZGlzcGxheSBhIGNoZWNrIG1hcmsgd2hlbiB0aGV5IGFyZSBpbiB0aGUgYG9uYCBzdGF0ZS5cbiAqL1xudmFyIFBERkNoZWNrQm94ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZDaGVja0JveCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZDaGVja0JveChhY3JvQ2hlY2tCb3gsIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9DaGVja0JveCwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9DaGVja0JveCwgJ2Fjcm9DaGVja0JveCcsIFtcbiAgICAgICAgICAgIFtQREZBY3JvQ2hlY2tCb3gsICdQREZBY3JvQ2hlY2tCb3gnXSxcbiAgICAgICAgXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9DaGVja0JveDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrIHRoaXMgY2hlY2sgYm94LiBUaGlzIG9wZXJhdGlvbiBpcyBhbmFsb2dvdXMgdG8gYSBodW1hbiB1c2VyIGNsaWNraW5nXG4gICAgICogYSBjaGVjayBib3ggdG8gZmlsbCBpdCBpbiBhIFBERiByZWFkZXIuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZVxuICAgICAqIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlIGNoZWNrIGJveCBmaWVsZCB0byBpbmRpY2F0ZSBpdCBoYXMgYmVlbiBzZWxlY3RlZC5cbiAgICAgKiBQREYgbGlicmFyaWVzIGFuZCByZWFkZXJzIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IHRoaXMgdmFsdWUgZnJvbSB0aGVcbiAgICAgKiBzYXZlZCBkb2N1bWVudCBhbmQgZGV0ZXJtaW5lIHRoYXQgaXQgd2FzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqIGNoZWNrQm94LmNoZWNrKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIGNoZWNrIGJveCBhcyBkaXJ0eSwgY2F1c2luZyBpdHMgYXBwZWFyYW5jZVxuICAgICAqIHN0cmVhbXMgdG8gYmUgdXBkYXRlZCB3aGVuIGVpdGhlciBbW1BERkRvY3VtZW50LnNhdmVdXSBvclxuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gaXMgY2FsbGVkLiBUaGUgdXBkYXRlZCBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB3aWxsIGRpc3BsYXkgYSBjaGVjayBtYXJrIGluc2lkZSB0aGUgd2lkZ2V0cyBvZiB0aGlzIGNoZWNrIGJveFxuICAgICAqIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgb25WYWx1ZSA9IChfYSA9IHRoaXMuYWNyb0ZpZWxkLmdldE9uVmFsdWUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUERGTmFtZS5vZignWWVzJyk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUob25WYWx1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhpcyBjaGVjayBib3guIFRoaXMgb3BlcmF0aW9uIGlzIGFuYWxvZ291cyB0byBhIGh1bWFuIHVzZXIgY2xpY2tpbmdcbiAgICAgKiBhIGNoZWNrIGJveCB0byB1bm1hcmsgaXQgaW4gYSBQREYgcmVhZGVyLiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGVcbiAgICAgKiB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSBjaGVjayBib3ggZmllbGQgdG8gaW5kaWNhdGUgaXQgaGFzIGJlZW4gZGVzZWxlY3RlZC5cbiAgICAgKiBQREYgbGlicmFyaWVzIGFuZCByZWFkZXJzIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IHRoaXMgdmFsdWUgZnJvbSB0aGVcbiAgICAgKiBzYXZlZCBkb2N1bWVudCBhbmQgZGV0ZXJtaW5lIHRoYXQgaXQgd2FzIG5vdCBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBjaGVja0JveC51bmNoZWNrKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIGNoZWNrIGJveCBhcyBkaXJ0eS4gU2VlIFtbUERGQ2hlY2tCb3guY2hlY2tdXVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS51bmNoZWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlKFBERk5hbWUub2YoJ09mZicpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgY2hlY2sgYm94IGlzIHNlbGVjdGVkIChlaXRoZXIgYnkgYSBodW1hbiB1c2VyIHZpYVxuICAgICAqIGEgUERGIHJlYWRlciwgb3IgZWxzZSBwcm9ncmFtbWF0aWNhbGx5IHZpYSBzb2Z0d2FyZSkuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBpZiAoY2hlY2tCb3guaXNDaGVja2VkKCkpIGNvbnNvbGUubG9nKCdjaGVjayBib3ggaXMgc2VsZWN0ZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgY2hlY2sgYm94IGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS5pc0NoZWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvblZhbHVlID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZSgpO1xuICAgICAgICByZXR1cm4gISFvblZhbHVlICYmIG9uVmFsdWUgPT09IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93IHRoaXMgY2hlY2sgYm94IG9uIHRoZSBzcGVjaWZpZWQgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5jcmVhdGVDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICpcbiAgICAgKiBjaGVja0JveC5hZGRUb1BhZ2UocGFnZSwge1xuICAgICAqICAgeDogNTAsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHdpZHRoOiAyNSxcbiAgICAgKiAgIGhlaWdodDogMjUsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgd2lkZ2V0IGZvciB0aGlzIGNoZWNrIGJveCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGlzIGNoZWNrIGJveCB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhpcyBjaGVjayBib3ggd2lkZ2V0LlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS5hZGRUb1BhZ2UgPSBmdW5jdGlvbiAocGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoISgndGV4dENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMudGV4dENvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYmFja2dyb3VuZENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYmFja2dyb3VuZENvbG9yID0gcmdiKDEsIDEsIDEpO1xuICAgICAgICBpZiAoISgnYm9yZGVyQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlcldpZHRoJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyV2lkdGggPSAxO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgY2hlY2sgYm94XG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldCh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDAsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAsXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogNTAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiA1MCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9lID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9mID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXQod2lkZ2V0UmVmKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHdpZGdldC5zZXRBcHBlYXJhbmNlU3RhdGUoUERGTmFtZS5vZignT2ZmJykpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBQREZOYW1lLm9mKCdZZXMnKSk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgb2YgdGhpcyBjaGVjayBib3gncyB3aWRnZXRzIGRvIG5vdCBoYXZlIGFuXG4gICAgICogYXBwZWFyYW5jZSBzdHJlYW0gZm9yIGl0cyBjdXJyZW50IHN0YXRlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5nZXRDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICogaWYgKGNoZWNrQm94Lm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkgY29uc29sZS5sb2coJ05lZWRzIHVwZGF0ZScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBjaGVjayBib3ggbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VTdGF0ZSgpO1xuICAgICAgICAgICAgdmFyIG5vcm1hbCA9IChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsO1xuICAgICAgICAgICAgaWYgKCEobm9ybWFsIGluc3RhbmNlb2YgUERGRGljdCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoc3RhdGUgJiYgIW5vcm1hbC5oYXMoc3RhdGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgY2hlY2sgYm94J3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIGNoZWNrIGJveGVzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5nZXRDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICogY2hlY2tCb3guZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFwcGVhcmFuY2VzKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGNoZWNrIGJveCdzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0XG4gICAgICogYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgY2hlY2sgYm94cyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBjaGVja0JveC51cGRhdGVBcHBlYXJhbmNlcygoZmllbGQsIHdpZGdldCkgPT4ge1xuICAgICAqICAgLi4uXG4gICAgICogICByZXR1cm4ge1xuICAgICAqICAgICBub3JtYWw6IHsgb246IGRyYXdDaGVja0JveCguLi4pLCBvZmY6IGRyYXdDaGVja0JveCguLi4pIH0sXG4gICAgICogICAgIGRvd246IHsgb246IGRyYXdDaGVja0JveCguLi4pLCBvZmY6IGRyYXdDaGVja0JveCguLi4pIH0sXG4gICAgICogICB9XG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgT3B0aW9uYWxseSwgdGhlIGFwcGVhcmFuY2UgcHJvdmlkZXIgdG8gYmUgdXNlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUudXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBvblZhbHVlID0gKF9hID0gd2lkZ2V0LmdldE9uVmFsdWUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUERGTmFtZS5vZignWWVzJyk7XG4gICAgICAgICAgICBpZiAoIW9uVmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBvblZhbHVlLCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNDbGVhbigpO1xuICAgIH07XG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBvblZhbHVlLCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHRDaGVja0JveEFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZU9uT2ZmV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIG9uVmFsdWUsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldENoZWNrQm94XV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZDaGVja0JveF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZDaGVja0JveF1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb0NoZWNrQm94IGFuZCByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvQ2hlY2tCb3ggVGhlIHVuZGVybHlpbmcgYFBERkFjcm9DaGVja0JveGAgZm9yIHRoaXMgY2hlY2sgYm94LlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgY2hlY2sgYm94LlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgY2hlY2sgYm94IHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94Lm9mID0gZnVuY3Rpb24gKGFjcm9DaGVja0JveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZDaGVja0JveChhY3JvQ2hlY2tCb3gsIHJlZiwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZDaGVja0JveDtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkNoZWNrQm94O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQ2hlY2tCb3guanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi4vUERGUGFnZVwiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4uL1BERkZvbnRcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBub3JtYWxpemVBcHBlYXJhbmNlLCBkZWZhdWx0RHJvcGRvd25BcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZIZXhTdHJpbmcsIFBERlN0cmVhbSwgUERGQWNyb0NvbWJvQm94LCBBY3JvQ2hvaWNlRmxhZ3MsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRPclVuZGVmaW5lZCwgYXNzZXJ0UG9zaXRpdmUgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIGRyb3Bkb3duIGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZEcm9wZG93bl1dIGZpZWxkcyBhcmUgaW50ZXJhY3RpdmUgdGV4dCBib3hlcyB0aGF0IGRpc3BsYXkgYSBzaW5nbGVcbiAqIGVsZW1lbnQgKHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsdWUpLiBUaGUgcHVycG9zZSBvZiBhIGRyb3Bkb3duIGlzIHRvXG4gKiBlbmFibGUgdXNlcnMgdG8gc2VsZWN0IGEgc2luZ2xlIG9wdGlvbiBmcm9tIGEgc2V0IG9mIHBvc3NpYmxlIG9wdGlvbnMuIFVzZXJzXG4gKiBjYW4gY2xpY2sgb24gYSBkcm9wZG93biB0byB2aWV3IHRoZSBmdWxsIGxpc3Qgb2Ygb3B0aW9ucyBpdCBwcm92aWRlcy5cbiAqIENsaWNraW5nIG9uIGFuIG9wdGlvbiBpbiB0aGUgbGlzdCB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkIGFuZCBkaXNwbGF5ZWRcbiAqIGluIHRoZSBkcm9wZG93bidzIHRleHQgYm94LiBTb21lIGRyb3Bkb3ducyBhbGxvdyB1c2VycyB0byBlbnRlciB0ZXh0XG4gKiBkaXJlY3RseSBpbnRvIHRoZSBib3ggZnJvbSB0aGVpciBrZXlib2FyZCwgcmF0aGVyIHRoYW4gb25seSBiZWluZyBhbGxvd2VkIHRvXG4gKiBjaG9vc2UgYW4gb3B0aW9uIGZyb20gdGhlIGxpc3QgKHNlZSBbW1BERkRyb3Bkb3duLmlzRWRpdGFibGVdXSkuXG4gKi9cbnZhciBQREZEcm9wZG93biA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGRHJvcGRvd24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGRHJvcGRvd24oYWNyb0NvbWJvQm94LCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvQ29tYm9Cb3gsIHJlZiwgZG9jKSB8fCB0aGlzO1xuICAgICAgICBhc3NlcnRJcyhhY3JvQ29tYm9Cb3gsICdhY3JvQ29tYm9Cb3gnLCBbXG4gICAgICAgICAgICBbUERGQWNyb0NvbWJvQm94LCAnUERGQWNyb0NvbWJvQm94J10sXG4gICAgICAgIF0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvQ29tYm9Cb3g7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb25zIGZvciB0aGlzIGRyb3Bkb3duLiBUaGVzZSBvcHRpb25zIHdpbGwgYmVcbiAgICAgKiBkaXNwbGF5ZWQgdG8gdXNlcnMgd2hvIGNsaWNrIG9uIHRoaXMgZHJvcGRvd24gaW4gYSBQREYgcmVhZGVyLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBjb25zdCBvcHRpb25zID0gZHJvcGRvd24uZ2V0T3B0aW9ucygpXG4gICAgICogY29uc29sZS5sb2coJ0Ryb3Bkb3duIG9wdGlvbnM6Jywgb3B0aW9ucylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW9ucyBmb3IgdGhpcyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJhd09wdGlvbnMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBvcHRpb25zID0gbmV3IEFycmF5KHJhd09wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHJhd09wdGlvbnNbaWR4XSwgZGlzcGxheSA9IF9hLmRpc3BsYXksIHZhbHVlID0gX2EudmFsdWU7XG4gICAgICAgICAgICBvcHRpb25zW2lkeF0gPSAoZGlzcGxheSAhPT0gbnVsbCAmJiBkaXNwbGF5ICE9PSB2b2lkIDAgPyBkaXNwbGF5IDogdmFsdWUpLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2VsZWN0ZWQgb3B0aW9ucyBmb3IgdGhpcyBkcm9wZG93bi4gVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdGhhdCB3ZXJlXG4gICAgICogc2VsZWN0ZWQgYnkgYSBodW1hbiB1c2VyIHZpYSBhIFBERiByZWFkZXIsIG9yIHByb2dyYW1hdGljYWxseSB2aWFcbiAgICAgKiBzb2Z0d2FyZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogY29uc3Qgc2VsZWN0aW9ucyA9IGRyb3Bkb3duLmdldFNlbGVjdGVkKClcbiAgICAgKiBjb25zb2xlLmxvZygnRHJvcGRvd24gc2VsZWN0aW9uczonLCBzZWxlY3Rpb25zKVxuICAgICAqIGBgYFxuICAgICAqID4gKipOT1RFOioqIE5vdGUgdGhhdCBQREYgcmVhZGVycyBvbmx5IGRpc3BsYXkgb25lIHNlbGVjdGVkIG9wdGlvbiB3aGVuXG4gICAgICogPiByZW5kZXJpbmcgZHJvcGRvd25zLiBIb3dldmVyLCB0aGUgUERGIHNwZWNpZmljYXRpb24gZG9lcyBhbGxvdyBmb3JcbiAgICAgKiA+IG11bHRpcGxlIHZhbHVlcyB0byBiZSBzZWxlY3RlZCBpbiBhIGRyb3Bkb3duLiBBcyBzdWNoLCB0aGUgYHBkZi1saWJgXG4gICAgICogPiBBUEkgc3VwcG9ydHMgdGhpcy4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyB0aGUgYXJyYXkgcmV0dXJuZWQgYnkgdGhpc1xuICAgICAqID4gbWV0aG9kIHdpbGwgY29udGFpbiBvbmx5IGEgc2luZ2xlIGVsZW1lbnQgKG9yIG5vIGVsZW1lbnRzKS5cbiAgICAgKiBAcmV0dXJucyBUaGUgc2VsZWN0ZWQgb3B0aW9ucyBpbiB0aGlzIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5nZXRTZWxlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlcygpO1xuICAgICAgICB2YXIgc2VsZWN0ZWQgPSBuZXcgQXJyYXkodmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHNlbGVjdGVkW2lkeF0gPSB2YWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsaXN0IG9mIG9wdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGRyb3Bkb3duLiBUaGVzZSBhcmVcbiAgICAgKiB0aGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHVzZXJzIHRvIHNlbGVjdCB3aGVuIHRoZXkgdmlldyB0aGlzXG4gICAgICogZHJvcGRvd24gaW4gYSBQREYgcmVhZGVyLiBOb3RlIHRoYXQgcHJlZXhpc3Rpbmcgb3B0aW9ucyBmb3IgdGhpcyBkcm9wZG93blxuICAgICAqIHdpbGwgYmUgcmVtb3ZlZC4gT25seSB0aGUgdmFsdWVzIHBhc3NlZCBhcyBgb3B0aW9uc2Agd2lsbCBiZSBhdmFpbGFibGUgdG9cbiAgICAgKiBzZWxlY3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3BsYW5ldHMuZHJvcGRvd24nKVxuICAgICAqIGRyb3Bkb3duLnNldE9wdGlvbnMoWydFYXJ0aCcsICdNYXJzJywgJ1BsdXRvJywgJ1ZlbnVzJ10pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoaXMgZHJvcGRvd24uXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFtBcnJheV0pO1xuICAgICAgICB2YXIgb3B0aW9uT2JqZWN0cyA9IG5ldyBBcnJheShvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvcHRpb25PYmplY3RzW2lkeF0gPSB7IHZhbHVlOiBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uc1tpZHhdKSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldE9wdGlvbnMob3B0aW9uT2JqZWN0cyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgdG8gdGhlIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgZHJvcGRvd24uIFVzZXJzXG4gICAgICogd2lsbCBiZSBhYmxlIHRvIHNlbGVjdCB0aGVzZSB2YWx1ZXMgaW4gYSBQREYgcmVhZGVyLiBJbiBhZGRpdGlvbiB0byB0aGVcbiAgICAgKiB2YWx1ZXMgcGFzc2VkIGFzIGBvcHRpb25zYCwgYW55IHByZWV4aXN0aW5nIG9wdGlvbnMgZm9yIHRoaXMgZHJvcGRvd24gd2lsbFxuICAgICAqIHN0aWxsIGJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgdG8gc2VsZWN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdyb2NrZXRzLmRyb3Bkb3duJylcbiAgICAgKiBkcm9wZG93bi5hZGRPcHRpb25zKFsnU2F0dXJuIElWJywgJ0ZhbGNvbiBIZWF2eSddKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIE5ldyBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGlzIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5hZGRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucywgJ29wdGlvbnMnLCBbJ3N0cmluZycsIEFycmF5XSk7XG4gICAgICAgIHZhciBvcHRpb25zQXJyID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBbb3B0aW9uc107XG4gICAgICAgIHZhciBleGlzdGluZ09wdGlvbnMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBuZXdPcHRpb25zID0gbmV3IEFycmF5KG9wdGlvbnNBcnIubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9uc0Fyci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG5ld09wdGlvbnNbaWR4XSA9IHsgdmFsdWU6IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zQXJyW2lkeF0pIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0T3B0aW9ucyhleGlzdGluZ09wdGlvbnMuY29uY2F0KG5ld09wdGlvbnMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlbGVjdCBvbmUgb3IgbW9yZSB2YWx1ZXMgZm9yIHRoaXMgZHJvcGRvd24uIFRoaXMgb3BlcmF0aW9uIGlzIGFuYWxvZ291c1xuICAgICAqIHRvIGEgaHVtYW4gdXNlciBvcGVuaW5nIHRoZSBkcm9wZG93biBpbiBhIFBERiByZWFkZXIgYW5kIGNsaWNraW5nIG9uIGFcbiAgICAgKiB2YWx1ZSB0byBzZWxlY3QgaXQuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZVxuICAgICAqIGRyb3Bkb3duIHRvIGluZGljYXRlIHdoaWNoIHZhbHVlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuIFBERiBsaWJyYXJpZXMgYW5kXG4gICAgICogcmVhZGVycyB3aWxsIGJlIGFibGUgdG8gZXh0cmFjdCB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgc2F2ZWQgZG9jdW1lbnQgYW5kXG4gICAgICogZGV0ZXJtaW5lIHdoaWNoIHZhbHVlcyB3ZXJlIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ2Jlc3Quc3VwZXJoZXJvLmRyb3Bkb3duJylcbiAgICAgKiBkcm9wZG93bi5zZWxlY3QoJ09uZSBQdW5jaCBNYW4nKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgZHJvcGRvd24gYXMgZGlydHksIGNhdXNpbmcgaXRzIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHRvIGJlIHVwZGF0ZWQgd2hlbiBlaXRoZXIgW1tQREZEb2N1bWVudC5zYXZlXV0gb3JcbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIGlzIGNhbGxlZC4gVGhlIHVwZGF0ZWQgc3RyZWFtcyB3aWxsXG4gICAgICogZGlzcGxheSB0aGUgc2VsZWN0ZWQgb3B0aW9uIGluc2lkZSB0aGUgd2lkZ2V0cyBvZiB0aGlzIGRyb3Bkb3duLlxuICAgICAqXG4gICAgICogKipJTVBPUlRBTlQ6KiogVGhlIGRlZmF1bHQgZm9udCB1c2VkIHRvIHVwZGF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgaXNcbiAgICAgKiBbW1N0YW5kYXJkRm9udHMuSGVsdmV0aWNhXV0uIE5vdGUgdGhhdCB0aGlzIGlzIGEgV2luQW5zaSBmb250LiBUaGlzIG1lYW5zXG4gICAgICogdGhhdCBlbmNvZGluZyBlcnJvcnMgd2lsbCBiZSB0aHJvd24gaWYgdGhlIHNlbGVjdGVkIG9wdGlvbiBmb3IgdGhpcyBmaWVsZFxuICAgICAqIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgV2luQW5zaSBjaGFyYWN0ZXIgc2V0ICh0aGUgbGF0aW4gYWxwaGFiZXQpLlxuICAgICAqXG4gICAgICogRW1iZWRkaW5nIGEgY3VzdG9tIGZvbnQgYW5kIHBhc3NpbmcgaXQgdG9cbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIG9yIFtbUERGRHJvcGRvd24udXBkYXRlQXBwZWFyYW5jZXNdXVxuICAgICAqIGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIHdpdGggY2hhcmFjdGVycyBvdXRzaWRlIHRoZVxuICAgICAqIGxhdGluIGFscGhhYmV0IChhc3N1bWluZyB0aGUgY3VzdG9tIGZvbnQgc3VwcG9ydHMgdGhlbSkuXG4gICAgICpcbiAgICAgKiBTZWxlY3RpbmcgYW4gb3B0aW9uIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBkcm9wZG93bidzIG9wdGlvbiBsaXN0XG4gICAgICogKHNlZSBbW1BERkRyb3Bkb3duLmdldE9wdGlvbnNdXSkgd2lsbCBlbmFibGUgZWRpdGluZyBvbiB0aGlzIGRyb3Bkb3duXG4gICAgICogKHNlZSBbW1BERkRyb3Bkb3duLmVuYWJsZUVkaXRpbmddXSkuXG4gICAgICpcbiAgICAgKiA+ICoqTk9URToqKiBQREYgcmVhZGVycyBvbmx5IGRpc3BsYXkgb25lIHNlbGVjdGVkIG9wdGlvbiB3aGVuIHJlbmRlcmluZ1xuICAgICAqID4gZHJvcGRvd25zLiBIb3dldmVyLCB0aGUgUERGIHNwZWNpZmljYXRpb24gZG9lcyBhbGxvdyBmb3IgbXVsdGlwbGUgdmFsdWVzXG4gICAgICogPiB0byBiZSBzZWxlY3RlZCBpbiBhIGRyb3Bkb3duLiBBcyBzdWNoLCB0aGUgYHBkZi1saWJgIEFQSSBzdXBwb3J0cyB0aGlzLlxuICAgICAqID4gSG93ZXZlciwgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHNlbGVjdCBtb3JlIHRoYW4gb25lIHZhbHVlIHdpdGggdGhpc1xuICAgICAqID4gbWV0aG9kLCBhcyBvbmx5IG9uZSB3aWxsIGJlIHZpc2libGUuIFtbUERGT3B0aW9uTGlzdF1dIGZpZWxkcyBhcmUgYmV0dGVyXG4gICAgICogPiBzdWl0ZWQgZm9yIGRpc3BsYXlpbmcgbXVsdGlwbGUgc2VsZWN0ZWQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICogQHBhcmFtIG1lcmdlIFdoZXRoZXIgb3Igbm90IGV4aXN0aW5nIHNlbGVjdGlvbnMgc2hvdWxkIGJlIHByZXNlcnZlZC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24gKG9wdGlvbnMsIG1lcmdlKSB7XG4gICAgICAgIGlmIChtZXJnZSA9PT0gdm9pZCAwKSB7IG1lcmdlID0gZmFsc2U7IH1cbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucywgJ29wdGlvbnMnLCBbJ3N0cmluZycsIEFycmF5XSk7XG4gICAgICAgIGFzc2VydElzKG1lcmdlLCAnbWVyZ2UnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgIHZhciBvcHRpb25zQXJyID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBbb3B0aW9uc107XG4gICAgICAgIHZhciB2YWxpZE9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIGhhc0N1c3RvbU9wdGlvbiA9IG9wdGlvbnNBcnIuZmluZChmdW5jdGlvbiAob3B0aW9uKSB7IHJldHVybiAhdmFsaWRPcHRpb25zLmluY2x1ZGVzKG9wdGlvbik7IH0pO1xuICAgICAgICBpZiAoaGFzQ3VzdG9tT3B0aW9uKVxuICAgICAgICAgICAgdGhpcy5lbmFibGVFZGl0aW5nKCk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgaWYgKG9wdGlvbnNBcnIubGVuZ3RoID4gMSB8fCAob3B0aW9uc0Fyci5sZW5ndGggPT09IDEgJiYgbWVyZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZU11bHRpc2VsZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlcyA9IG5ldyBBcnJheShvcHRpb25zQXJyLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnNBcnIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YWx1ZXNbaWR4XSA9IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zQXJyW2lkeF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXJnZSkge1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXMoZXhpc3RpbmdWYWx1ZXMuY29uY2F0KHZhbHVlcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWVzKHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBzZWxlY3RlZCB2YWx1ZXMgZm9yIHRoaXMgZHJvcGRvd24uIFRoaXMgb3BlcmF0aW9uIGlzIGVxdWl2YWxlbnRcbiAgICAgKiB0byBzZWxlY3RpbmcgYW4gZW1wdHkgbGlzdC4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgc3RhdGVcbiAgICAgKiBvZiB0aGUgZHJvcGRvd24gdG8gaW5kaWNhdGUgdGhhdCBubyB2YWx1ZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5jbGVhcigpXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eS4gU2VlIFtbUERGRHJvcGRvd24uc2VsZWN0XV1cbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWVzKFtdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZm9udCBzaXplIGZvciB0aGlzIGZpZWxkLiBMYXJnZXIgZm9udCBzaXplcyB3aWxsIHJlc3VsdCBpbiBsYXJnZXJcbiAgICAgKiB0ZXh0IGJlaW5nIGRpc3BsYXllZCB3aGVuIFBERiByZWFkZXJzIHJlbmRlciB0aGlzIGRyb3Bkb3duLiBGb250IHNpemVzIG1heVxuICAgICAqIGJlIGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gU3VwcGx5aW5nIGEgbmVnYXRpdmUgZm9udCBzaXplIHdpbGxcbiAgICAgKiBjYXVzZSB0aGlzIG1ldGhvZCB0byB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5zZXRGb250U2l6ZSg0KVxuICAgICAqIGRyb3Bkb3duLnNldEZvbnRTaXplKDE1LjcpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA+IFRoaXMgbWV0aG9kIGRlcGVuZHMgdXBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBhcHBlYXJhbmNlXG4gICAgICogPiAoYC9EQWApIHN0cmluZy4gSWYgdGhpcyBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBhcHBlYXJhbmNlIHN0cmluZyxcbiAgICAgKiA+IG9yIHRoYXQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYSBmb250IHNpemUgKHZpYSB0aGUgYFRmYCBvcGVyYXRvciksXG4gICAgICogPiB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRleHQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuc2V0Rm9udFNpemUgPSBmdW5jdGlvbiAoZm9udFNpemUpIHtcbiAgICAgICAgYXNzZXJ0UG9zaXRpdmUoZm9udFNpemUsICdmb250U2l6ZScpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHVzZXJzIGFyZSBhbGxvd2VkIHRvIGVkaXQgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoaXNcbiAgICAgKiBkcm9wZG93biBkaXJlY3RseSBhbmQgYXJlIG5vdCBjb25zdHJhaW5lZCBieSB0aGUgbGlzdCBvZiBhdmFpbGFibGVcbiAgICAgKiBvcHRpb25zLiBTZWUgW1tQREZEcm9wZG93bi5lbmFibGVFZGl0aW5nXV0gYW5kXG4gICAgICogW1tQREZEcm9wZG93bi5kaXNhYmxlRWRpdGluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLmlzRWRpdGFibGUoKSkgY29uc29sZS5sb2coJ0VkaXRpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBkcm9wZG93biBpcyBlZGl0YWJsZS5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuaXNFZGl0YWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkVkaXQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNlcnMgdG8gZWRpdCB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhpcyBkcm9wZG93biBpbiBQREYgcmVhZGVyc1xuICAgICAqIHdpdGggdGhlaXIga2V5Ym9hcmQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhpcyBkcm9wZG93blxuICAgICAqIHdpbGwgbm90IGJlIGNvbnN0cmFpbmVkIGJ5IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb25zLiBIb3dldmVyLCBpZiB0aGlzXG4gICAgICogZHJvcGRvd24gaGFzIGFueSBhdmFpbGFibGUgb3B0aW9ucywgdXNlcnMgd2lsbCBzdGlsbCBiZSBhbGxvd2VkIHRvIHNlbGVjdFxuICAgICAqIGZyb20gdGhhdCBsaXN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5lbmFibGVFZGl0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZW5hYmxlRWRpdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5FZGl0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyB1c2VycyB0byBlZGl0IHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGlzIGRyb3Bkb3duIGluIFBERlxuICAgICAqIHJlYWRlcnMgd2l0aCB0aGVpciBrZXlib2FyZC4gVGhpcyB3aWxsIGNvbnN0cmFpbiB0aGUgc2VsZWN0ZWQgdmFsdWUgb2ZcbiAgICAgKiB0aGlzIGRyb3Bkb3duIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb25zLiBVc2VycyB3aWxsIG9ubHkgYmUgYWJsZVxuICAgICAqIHRvIHNlbGVjdCBhbiBvcHRpb24gZnJvbSB0aGF0IGxpc3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRpc2FibGVFZGl0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGlzYWJsZUVkaXRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuRWRpdCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9wdGlvbiBsaXN0IG9mIHRoaXMgZHJvcGRvd24gaXMgYWx3YXlzIGRpc3BsYXllZFxuICAgICAqIGluIGFscGhhYmV0aWNhbCBvcmRlciwgaXJyZXNwZWN0aXZlIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgb3B0aW9uc1xuICAgICAqIHdlcmUgYWRkZWQgdG8gdGhlIGRyb3Bkb3duLiBTZWUgW1tQREZEcm9wZG93bi5lbmFibGVTb3J0aW5nXV0gYW5kXG4gICAgICogW1tQREZEcm9wZG93bi5kaXNhYmxlU29ydGluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLmlzU29ydGVkKCkpIGNvbnNvbGUubG9nKCdTb3J0aW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZHJvcGRvd24ncyBvcHRpb25zIGFyZSBzb3J0ZWQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmlzU29ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbHdheXMgZGlzcGxheSB0aGUgb3B0aW9uIGxpc3Qgb2YgdGhpcyBkcm9wZG93biBpbiBhbHBoYWJldGljYWwgb3JkZXIsXG4gICAgICogaXJyZXNwZWN0aXZlIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgb3B0aW9ucyB3ZXJlIGFkZGVkIHRvIHRoaXMgZHJvcGRvd24uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmVuYWJsZVNvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5lbmFibGVTb3J0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLlNvcnQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsd2F5cyBkaXNwbGF5IHRoZSBvcHRpb24gbGlzdCBvZiB0aGlzIGRyb3Bkb3duIGluIGFscGhhYmV0aWNhbFxuICAgICAqIG9yZGVyLiBJbnN0ZWFkLCBkaXNwbGF5IHRoZSBvcHRpb25zIGluIHdoaWNoZXZlciBvcmRlciB0aGV5IHdlcmUgYWRkZWRcbiAgICAgKiB0byB0aGUgbGlzdC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRpc2FibGVTb3J0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGlzYWJsZVNvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGlzIGRyb3Bkb3duJ3NcbiAgICAgKiBvcHRpb24gbGlzdC4gU2VlIFtbUERGRHJvcGRvd24uZW5hYmxlTXVsdGlzZWxlY3RdXSBhbmRcbiAgICAgKiBbW1BERkRyb3Bkb3duLmRpc2FibGVNdWx0aXNlbGVjdF1dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLmlzTXVsdGlzZWxlY3QoKSkgY29uc29sZS5sb2coJ011bHRpc2VsZWN0IGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IG11bHRpcGxlIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5pc011bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNlcnMgdG8gc2VsZWN0IG1vcmUgdGhhbiBvbmUgb3B0aW9uIGZyb20gdGhpcyBkcm9wZG93bidzIG9wdGlvblxuICAgICAqIGxpc3QuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5lbmFibGVNdWx0aXNlbGVjdCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmVuYWJsZU11bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyB1c2VycyB0byBzZWxlY3QgbW9yZSB0aGFuIG9uZSBvcHRpb24gZnJvbSB0aGlzIGRyb3Bkb3duJ3NcbiAgICAgKiBvcHRpb24gbGlzdC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRpc2FibGVNdWx0aXNlbGVjdCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmRpc2FibGVNdWx0aXNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5NdWx0aVNlbGVjdCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNlbGVjdGVkIG9wdGlvbiBzaG91bGQgYmUgc3BlbGwgY2hlY2tlZCBieSBQREZcbiAgICAgKiByZWFkZXJzLiBTcGVsbCBjaGVja2luZyB3aWxsIG9ubHkgYmUgcGVyZm9ybWVkIGlmIHRoaXMgZHJvcGRvd24gYWxsb3dzXG4gICAgICogZWRpdGluZyAoc2VlIFtbUERGRHJvcGRvd24uaXNFZGl0YWJsZV1dKS4gU2VlXG4gICAgICogW1tQREZEcm9wZG93bi5lbmFibGVTcGVsbENoZWNraW5nXV0gYW5kXG4gICAgICogW1tQREZEcm9wZG93bi5kaXNhYmxlU3BlbGxDaGVja2luZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLmlzU3BlbGxDaGVja2VkKCkpIGNvbnNvbGUubG9nKCdTcGVsbCBjaGVja2luZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGRyb3Bkb3duIGNhbiBiZSBzcGVsbCBjaGVja2VkLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5pc1NwZWxsQ2hlY2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5Eb05vdFNwZWxsQ2hlY2spO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgUERGIHJlYWRlcnMgdG8gc3BlbGwgY2hlY2sgdGhlIHNlbGVjdGVkIG9wdGlvbiBvZiB0aGlzIGRyb3Bkb3duLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5lbmFibGVTcGVsbENoZWNraW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZW5hYmxlU3BlbGxDaGVja2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Eb05vdFNwZWxsQ2hlY2ssIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyBQREYgcmVhZGVycyB0byBzcGVsbCBjaGVjayB0aGUgc2VsZWN0ZWQgb3B0aW9uIG9mIHRoaXNcbiAgICAgKiBkcm9wZG93bi4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRpc2FibGVTcGVsbENoZWNraW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGlzYWJsZVNwZWxsQ2hlY2tpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuRG9Ob3RTcGVsbENoZWNrLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIGlzIHN0b3JlZCwgb3IgXCJjb21taXR0ZWRcIixcbiAgICAgKiB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgb3B0aW9uLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhhdCB0aGUgdXNlcidzXG4gICAgICogc2VsZWN0aW9uIGlzIHN0b3JlZCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGlzIGRyb3Bkb3duIGZpZWxkIChieSBjbGlja2luZ1xuICAgICAqIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuIFNlZVxuICAgICAqIFtbUERGRHJvcGRvd24uZW5hYmxlU2VsZWN0T25DbGlja11dIGFuZFxuICAgICAqIFtbUERGRHJvcGRvd24uZGlzYWJsZVNlbGVjdE9uQ2xpY2tdXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGlmIChkcm9wZG93bi5pc1NlbGVjdE9uQ2xpY2soKSkgY29uc29sZS5sb2coJ1NlbGVjdCBvbiBjbGljayBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBvcHRpb25zIGFyZSBzZWxlY3RlZCBpbW1lZGlhdGVseSBhZnRlciB0aGV5IGFyZVxuICAgICAqICAgICAgICAgIGNsaWNrZWQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmlzU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkNvbW1pdE9uU2VsQ2hhbmdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN0b3JlIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1c2VyIGNsaWNrcyB0aGVcbiAgICAgKiBvcHRpb24uIERvIG5vdCB3YWl0IGZvciB0aGUgdXNlciB0byBsZWF2ZSB0aGlzIGRyb3Bkb3duIGZpZWxkIChieSBjbGlja2luZ1xuICAgICAqIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5lbmFibGVTZWxlY3RPbkNsaWNrKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZW5hYmxlU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Db21taXRPblNlbENoYW5nZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXYWl0IHRvIHN0b3JlIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIHVudGlsIHRoZXkgbGVhdmUgdGhpcyBkcm9wZG93blxuICAgICAqIGZpZWxkIChieSBjbGlja2luZyBvdXRzaWRlIG9mIGl0IC0gb24gYW5vdGhlciBmaWVsZCwgZm9yIGV4YW1wbGUpLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5kaXNhYmxlU2VsZWN0T25DbGljaygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmRpc2FibGVTZWxlY3RPbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkNvbW1pdE9uU2VsQ2hhbmdlLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93IHRoaXMgZHJvcGRvd24gb24gdGhlIHNwZWNpZmllZCBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHVidW50dUZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KHVidW50dUZvbnRCeXRlcylcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uY3JlYXRlRHJvcGRvd24oJ2Jlc3QuZ3VuZGFtJylcbiAgICAgKiBkcm9wZG93bi5zZXRPcHRpb25zKFsnRXhpYScsICdEeW5hbWVzJ10pXG4gICAgICogZHJvcGRvd24uc2VsZWN0KCdFeGlhJylcbiAgICAgKlxuICAgICAqIGRyb3Bkb3duLmFkZFRvUGFnZShwYWdlLCB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDIwMCxcbiAgICAgKiAgIGhlaWdodDogMTAwLFxuICAgICAqICAgdGV4dENvbG9yOiByZ2IoMSwgMCwgMCksXG4gICAgICogICBiYWNrZ3JvdW5kQ29sb3I6IHJnYigwLCAxLCAwKSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiByZ2IoMCwgMCwgMSksXG4gICAgICogICBib3JkZXJXaWR0aDogMixcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcyg5MCksXG4gICAgICogICBmb250OiB1YnVudHVGb250LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB3aWRnZXQgZm9yIHRoaXMgZHJvcGRvd24gZmllbGQuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhpcyBkcm9wZG93biB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhpcyBkcm9wZG93biB3aWRnZXQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmFkZFRvUGFnZSA9IGZ1bmN0aW9uIChwYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoISgndGV4dENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMudGV4dENvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYmFja2dyb3VuZENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYmFja2dyb3VuZENvbG9yID0gcmdiKDEsIDEsIDEpO1xuICAgICAgICBpZiAoISgnYm9yZGVyQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlcldpZHRoJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyV2lkdGggPSAxO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgZHJvcGRvd25cbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAyMDAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiA1MCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9lID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9mID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXQod2lkZ2V0UmVmKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHZhciBmb250ID0gKF9nID0gb3B0aW9ucy5mb250KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB0aGlzLmRvYy5nZXRGb3JtKCkuZ2V0RGVmYXVsdEZvbnQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGRyb3Bkb3duIGhhcyBiZWVuIG1hcmtlZCBhcyBkaXJ0eSwgb3IgaWYgYW55IG9mXG4gICAgICogdGhpcyBkcm9wZG93bidzIHdpZGdldHMgZG8gbm90IGhhdmUgYW4gYXBwZWFyYW5jZSBzdHJlYW0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24ubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSBjb25zb2xlLmxvZygnTmVlZHMgdXBkYXRlJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGRyb3Bkb3duIG5lZWRzIGFuIGFwcGVhcmFuY2UgdXBkYXRlLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmlzRGlydHkoKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgaGFzQXBwZWFyYW5jZXMgPSAoKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWwpIGluc3RhbmNlb2YgUERGU3RyZWFtO1xuICAgICAgICAgICAgaWYgKCFoYXNBcHBlYXJhbmNlcylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGRyb3Bkb3duJ3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIGRyb3Bkb3ducy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICB0aGlzLnVwZGF0ZUFwcGVhcmFuY2VzKGZvbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBkcm9wZG93bidzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0XG4gICAgICogYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgZHJvcGRvd25zIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24udXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhLCAoZmllbGQsIHdpZGdldCwgZm9udCkgPT4ge1xuICAgICAqICAgLi4uXG4gICAgICogICByZXR1cm4gZHJhd1RleHRGaWVsZCguLi4pXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqIEBwYXJhbSBwcm92aWRlciBPcHRpb25hbGx5LCB0aGUgYXBwZWFyYW5jZSBwcm92aWRlciB0byBiZSB1c2VkIGZvclxuICAgICAqICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250LCBwcm92aWRlcikge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICAvLyBnZXRPcHRpb24oaW5kZXg6IG51bWJlcik6IHN0cmluZyB7fVxuICAgIC8vIGdldFNlbGVjdGVkSW5kaWNlcygpOiBudW1iZXJbXSB7fVxuICAgIC8vIHJlbW92ZU9wdGlvbnMob3B0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSkge31cbiAgICAvLyByZW1vdmVJbmRpY2VzKG9wdGlvbjogbnVtYmVyW10pIHt9XG4gICAgLy8gZGVzZWxlY3Qob3B0aW9uczogc3RyaW5nIHwgc3RyaW5nW10pIHt9XG4gICAgLy8gZGVzZWxlY3RJbmRpY2VzKG9wdGlvbkluZGljZXM6IG51bWJlcltdKSB7fVxuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGFwUHJvdmlkZXIgPSBwcm92aWRlciAhPT0gbnVsbCAmJiBwcm92aWRlciAhPT0gdm9pZCAwID8gcHJvdmlkZXIgOiBkZWZhdWx0RHJvcGRvd25BcHBlYXJhbmNlUHJvdmlkZXI7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlcyA9IG5vcm1hbGl6ZUFwcGVhcmFuY2UoYXBQcm92aWRlcih0aGlzLCB3aWRnZXQsIGZvbnQpKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlV2l0aEZvbnQod2lkZ2V0LCBmb250LCBhcHBlYXJhbmNlcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRm9ybS5nZXREcm9wZG93bl1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGRHJvcGRvd25dXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGRHJvcGRvd25dXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9Db21ib0JveCBhbmQgcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb0NvbWJvQm94IFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvQ29tYm9Cb3hgIGZvciB0aGlzIGRyb3Bkb3duLlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgZHJvcGRvd24uXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyBkcm9wZG93biB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5vZiA9IGZ1bmN0aW9uIChhY3JvQ29tYm9Cb3gsIHJlZiwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRHJvcGRvd24oYWNyb0NvbWJvQm94LCByZWYsIGRvYyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRHJvcGRvd247XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZEcm9wZG93bjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkRyb3Bkb3duLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduLCBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IHsgY29sb3JUb0NvbXBvbmVudHMsIHNldEZpbGxpbmdDb2xvciB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IHRvRGVncmVlcywgcm90YXRlUmVjdGFuZ2xlLCByZWR1Y2VSb3RhdGlvbiwgYWRqdXN0RGltc0ZvclJvdGF0aW9uLCBkZWdyZWVzLCB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFBERlJlZiwgUERGV2lkZ2V0QW5ub3RhdGlvbiwgUERGTmFtZSwgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciwgQWNyb0ZpZWxkRmxhZ3MsIFBERkFjcm9UZXJtaW5hbCwgQW5ub3RhdGlvbkZsYWdzLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0TXVsdGlwbGUsIGFzc2VydE9yVW5kZWZpbmVkIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJbWFnZUFsaWdubWVudCB9IGZyb20gJy4uL2ltYWdlJztcbmltcG9ydCB7IGRyYXdJbWFnZSwgcm90YXRlSW5QbGFjZSB9IGZyb20gJy4uL29wZXJhdGlvbnMnO1xuZXhwb3J0IHZhciBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndpZHRoLCAnb3B0aW9ucy53aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oZWlnaHQsICdvcHRpb25zLmhlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50ZXh0Q29sb3IsICdvcHRpb25zLnRleHRDb2xvcicsIFtcbiAgICAgICAgW09iamVjdCwgJ0NvbG9yJ10sXG4gICAgXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJhY2tncm91bmRDb2xvciwgJ29wdGlvbnMuYmFja2dyb3VuZENvbG9yJywgW1xuICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICBdKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyQ29sb3IsICdvcHRpb25zLmJvcmRlckNvbG9yJywgW1xuICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICBdKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyV2lkdGgsICdvcHRpb25zLmJvcmRlcldpZHRoJywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJvdGF0ZSwgJ29wdGlvbnMucm90YXRlJywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG59O1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIGVmZmVjdGl2ZWx5IGFic3RyYWN0LiBBbGwgZmllbGRzIGluIGEgW1tQREZGb3JtXV0gd2lsbFxuICogYWN0dWFsbHkgYmUgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzLlxuICpcbiAqIE5vdGUgdGhhdCBlYWNoIGZpZWxkIGluIGEgUERGIGlzIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGZpZWxkIG9iamVjdC5cbiAqIEhvd2V2ZXIsIGEgZ2l2ZW4gZmllbGQgb2JqZWN0IG1heSBiZSByZW5kZXJlZCBhdCBtdWx0aXBsZSBsb2NhdGlvbnMgd2l0aGluXG4gKiB0aGUgZG9jdW1lbnQgKGFjcm9zcyBvbmUgb3IgbW9yZSBwYWdlcykuIFRoZSByZW5kZXJpbmcgb2YgYSBmaWVsZCBpc1xuICogY29udHJvbGxlZCBieSBpdHMgd2lkZ2V0cy4gRWFjaCB3aWRnZXQgY2F1c2VzIGl0cyBmaWVsZCB0byBiZSBkaXNwbGF5ZWQgYXQgYVxuICogcGFydGljdWxhciBsb2NhdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG4gKlxuICogTW9zdCBvZiB0aGUgdGltZSBlYWNoIGZpZWxkIGluIGEgUERGIGhhcyBvbmx5IGEgc2luZ2xlIHdpZGdldCwgYW5kIHRodXMgaXNcbiAqIG9ubHkgcmVuZGVyZWQgb25jZS4gSG93ZXZlciwgaWYgYSBmaWVsZCBpcyByZW5kZXJlZCBtdWx0aXBsZSB0aW1lcywgaXQgd2lsbFxuICogaGF2ZSBtdWx0aXBsZSB3aWRnZXRzIC0gb25lIGZvciBlYWNoIGxvY2F0aW9uIGl0IGlzIHJlbmRlcmVkLlxuICpcbiAqIFRoaXMgYWJzdHJhY3Rpb24gb2YgZmllbGQgb2JqZWN0cyBhbmQgd2lkZ2V0cyBpcyBkZWZpbmVkIGluIHRoZSBQREZcbiAqIHNwZWNpZmljYXRpb24gYW5kIGRpY3RhdGVzIGhvdyBQREYgZmlsZXMgc3RvcmUgZmllbGRzIGFuZCB3aGVyZSB0aGV5IGFyZVxuICogdG8gYmUgcmVuZGVyZWQuXG4gKi9cbnZhciBQREZGaWVsZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZGaWVsZChhY3JvRmllbGQsIHJlZiwgZG9jKSB7XG4gICAgICAgIGFzc2VydElzKGFjcm9GaWVsZCwgJ2Fjcm9GaWVsZCcsIFtbUERGQWNyb1Rlcm1pbmFsLCAnUERGQWNyb1Rlcm1pbmFsJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMocmVmLCAncmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZCA9IGFjcm9GaWVsZDtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgZmllbGQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGRzID0gZm9ybS5nZXRGaWVsZHMoKVxuICAgICAqIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgKiAgIGNvbnN0IG5hbWUgPSBmaWVsZC5nZXROYW1lKClcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdGaWVsZCBuYW1lOicsIG5hbWUpXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgUERGIGZpZWxkcyBhcmUgc3RydWN0dXJlZCBhcyBhIHRyZWUuIEVhY2ggZmllbGQgaXMgdGhlXG4gICAgICogZGVzY2VuZGVudCBvZiBhIHNlcmllcyBvZiBhbmNlc3RvciBub2RlcyBhbGwgdGhlIHdheSB1cCB0byB0aGUgZm9ybSBub2RlLFxuICAgICAqIHdoaWNoIGlzIGFsd2F5cyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4gRWFjaCBub2RlIGluIHRoZSB0cmVlIChleGNlcHQgZm9yXG4gICAgICogdGhlIGZvcm0gbm9kZSkgaGFzIGEgcGFydGlhbCBuYW1lLiBQYXJ0aWFsIG5hbWVzIGNhbiBiZSBjb21wb3NlZCBvZiBhbnlcbiAgICAgKiB1bmljb2RlIGNoYXJhY3RlcnMgZXhjZXB0IGEgcGVyaW9kIChgLmApLiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYVxuICAgICAqIGZpZWxkIGlzIGNvbXBvc2VkIG9mIHRoZSBwYXJ0aWFsIG5hbWVzIG9mIGFsbCBpdHMgYW5jZXN0b3JzIGpvaW5lZFxuICAgICAqIHdpdGggcGVyaW9kcy4gVGhpcyBtZWFucyB0aGF0IHNwbGl0dGluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb25cbiAgICAgKiBwZXJpb2RzIGFuZCB0YWtpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGFycmF5IHdpbGwgZ2l2ZSB5b3VcbiAgICAgKiB0aGUgcGFydGlhbCBuYW1lIG9mIGEgc3BlY2lmaWMgZmllbGQuXG4gICAgICogQHJldHVybnMgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgZmllbGQuXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuYWNyb0ZpZWxkLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgZmllbGQgaXMgcmVhZCBvbmx5LiBUaGlzIG1lYW5zIHRoYXQgUERGIHJlYWRlcnNcbiAgICAgKiB3aWxsIG5vdCBhbGxvdyB1c2VycyB0byBpbnRlcmFjdCB3aXRoIHRoZSBmaWVsZCBvciBjaGFuZ2UgaXRzIHZhbHVlLiBTZWVcbiAgICAgKiBbW1BERkZpZWxkLmVuYWJsZVJlYWRPbmx5XV0gYW5kIFtbUERGRmllbGQuZGlzYWJsZVJlYWRPbmx5XV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGlmIChmaWVsZC5pc1JlYWRPbmx5KCkpIGNvbnNvbGUubG9nKCdSZWFkIG9ubHkgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBpcyBhIHJlYWQgb25seSBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuaXNSZWFkT25seSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0ZpZWxkRmxhZ3MuUmVhZE9ubHkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJldmVudCBQREYgcmVhZGVycyBmcm9tIGFsbG93aW5nIHVzZXJzIHRvIGludGVyYWN0IHdpdGggdGhpcyBmaWVsZCBvclxuICAgICAqIGNoYW5nZSBpdHMgdmFsdWUuIFRoZSBmaWVsZCB3aWxsIG5vdCByZXNwb25kIHRvIG1vdXNlIG9yIGtleWJvYXJkIGlucHV0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBmaWVsZC5lbmFibGVSZWFkT25seSgpXG4gICAgICogYGBgXG4gICAgICogVXNlZnVsIGZvciBmaWVsZHMgd2hvc2UgdmFsdWVzIGFyZSBjb21wdXRlZCwgaW1wb3J0ZWQgZnJvbSBhIGRhdGFiYXNlLCBvclxuICAgICAqIHByZWZpbGxlZCBieSBzb2Z0d2FyZSBiZWZvcmUgYmVpbmcgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5lbmFibGVSZWFkT25seSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9GaWVsZEZsYWdzLlJlYWRPbmx5LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IHVzZXJzIHRvIGludGVyYWN0IHdpdGggdGhpcyBmaWVsZCBhbmQgY2hhbmdlIGl0cyB2YWx1ZSBpbiBQREZcbiAgICAgKiByZWFkZXJzIHZpYSBtb3VzZSBhbmQga2V5Ym9hcmQgaW5wdXQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBmaWVsZC5kaXNhYmxlUmVhZE9ubHkoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5kaXNhYmxlUmVhZE9ubHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvRmllbGRGbGFncy5SZWFkT25seSwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBmaWVsZCBtdXN0IGhhdmUgYSB2YWx1ZSB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC5cbiAgICAgKiBTZWUgW1tQREZGaWVsZC5lbmFibGVSZXF1aXJlZF1dIGFuZCBbW1BERkZpZWxkLmRpc2FibGVSZXF1aXJlZF1dLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBpZiAoZmllbGQuaXNSZXF1aXJlZCgpKSBjb25zb2xlLmxvZygnRmllbGQgaXMgcmVxdWlyZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgaXMgcmVxdWlyZWQuXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmlzUmVxdWlyZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9GaWVsZEZsYWdzLlJlcXVpcmVkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlcXVpcmUgdGhpcyBmaWVsZCB0byBoYXZlIGEgdmFsdWUgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmVuYWJsZVJlcXVpcmVkKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZW5hYmxlUmVxdWlyZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvRmllbGRGbGFncy5SZXF1aXJlZCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgcmVxdWlyZSB0aGlzIGZpZWxkIHRvIGhhdmUgYSB2YWx1ZSB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogZmllbGQuZGlzYWJsZVJlcXVpcmVkKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZGlzYWJsZVJlcXVpcmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0ZpZWxkRmxhZ3MuUmVxdWlyZWQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgZmllbGQncyB2YWx1ZSBzaG91bGQgYmUgZXhwb3J0ZWQgd2hlbiB0aGUgZm9ybSBpc1xuICAgICAqIHN1Ym1pdHRlZC4gU2VlIFtbUERGRmllbGQuZW5hYmxlRXhwb3J0aW5nXV0gYW5kXG4gICAgICogW1tQREZGaWVsZC5kaXNhYmxlRXhwb3J0aW5nXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGlmIChmaWVsZC5pc0V4cG9ydGVkKCkpIGNvbnNvbGUubG9nKCdFeHBvcnRpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmaWVsZCdzIHZhbHVlIHNob3VsZCBiZSBleHBvcnRlZC5cbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuaXNFeHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9GaWVsZEZsYWdzLk5vRXhwb3J0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBmaWVsZCdzIHZhbHVlIHNob3VsZCBiZSBleHBvcnRlZCB3aGVuIHRoZSBmb3JtIGlzXG4gICAgICogc3VibWl0dGVkIGluIGEgUERGIHJlYWRlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmVuYWJsZUV4cG9ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmVuYWJsZUV4cG9ydGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9GaWVsZEZsYWdzLk5vRXhwb3J0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgZmllbGQncyB2YWx1ZSBzaG91bGQgKipub3QqKiBiZSBleHBvcnRlZCB3aGVuIHRoZSBmb3JtXG4gICAgICogaXMgc3VibWl0dGVkIGluIGEgUERGIHJlYWRlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmRpc2FibGVFeHBvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5kaXNhYmxlRXhwb3J0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0ZpZWxkRmxhZ3MuTm9FeHBvcnQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnbmVlZHNBcHBlYXJhbmNlc1VwZGF0ZScpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKF9mb250KSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2RlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcycpO1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLm1hcmtBc0RpcnR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRvYy5nZXRGb3JtKCkubWFya0ZpZWxkQXNEaXJ0eSh0aGlzLnJlZik7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUubWFya0FzQ2xlYW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZG9jLmdldEZvcm0oKS5tYXJrRmllbGRBc0NsZWFuKHRoaXMucmVmKTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5pc0RpcnR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2MuZ2V0Rm9ybSgpLmZpZWxkSXNEaXJ0eSh0aGlzLnJlZik7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUuY3JlYXRlV2lkZ2V0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdGV4dENvbG9yID0gb3B0aW9ucy50ZXh0Q29sb3I7XG4gICAgICAgIHZhciBiYWNrZ3JvdW5kQ29sb3IgPSBvcHRpb25zLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgdmFyIGJvcmRlckNvbG9yID0gb3B0aW9ucy5ib3JkZXJDb2xvcjtcbiAgICAgICAgdmFyIGJvcmRlcldpZHRoID0gb3B0aW9ucy5ib3JkZXJXaWR0aDtcbiAgICAgICAgdmFyIGRlZ3JlZXNBbmdsZSA9IHRvRGVncmVlcyhvcHRpb25zLnJvdGF0ZSk7XG4gICAgICAgIHZhciBjYXB0aW9uID0gb3B0aW9ucy5jYXB0aW9uO1xuICAgICAgICB2YXIgeCA9IG9wdGlvbnMueDtcbiAgICAgICAgdmFyIHkgPSBvcHRpb25zLnk7XG4gICAgICAgIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGggKyBib3JkZXJXaWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ICsgYm9yZGVyV2lkdGg7XG4gICAgICAgIHZhciBoaWRkZW4gPSBCb29sZWFuKG9wdGlvbnMuaGlkZGVuKTtcbiAgICAgICAgdmFyIHBhZ2VSZWYgPSBvcHRpb25zLnBhZ2U7XG4gICAgICAgIGFzc2VydE11bHRpcGxlKGRlZ3JlZXNBbmdsZSwgJ2RlZ3JlZXNBbmdsZScsIDkwKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIGZpZWxkXG4gICAgICAgIHZhciB3aWRnZXQgPSBQREZXaWRnZXRBbm5vdGF0aW9uLmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0LCB0aGlzLnJlZik7XG4gICAgICAgIC8vIFNldCB3aWRnZXQgcHJvcGVydGllc1xuICAgICAgICB2YXIgcmVjdCA9IHJvdGF0ZVJlY3RhbmdsZSh7IHg6IHgsIHk6IHksIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfSwgYm9yZGVyV2lkdGgsIGRlZ3JlZXNBbmdsZSk7XG4gICAgICAgIHdpZGdldC5zZXRSZWN0YW5nbGUocmVjdCk7XG4gICAgICAgIGlmIChwYWdlUmVmKVxuICAgICAgICAgICAgd2lkZ2V0LnNldFAocGFnZVJlZik7XG4gICAgICAgIHZhciBhYyA9IHdpZGdldC5nZXRPckNyZWF0ZUFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICAgICAgaWYgKGJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgYWMuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yVG9Db21wb25lbnRzKGJhY2tncm91bmRDb2xvcikpO1xuICAgICAgICB9XG4gICAgICAgIGFjLnNldFJvdGF0aW9uKGRlZ3JlZXNBbmdsZSk7XG4gICAgICAgIGlmIChjYXB0aW9uKVxuICAgICAgICAgICAgYWMuc2V0Q2FwdGlvbnMoeyBub3JtYWw6IGNhcHRpb24gfSk7XG4gICAgICAgIGlmIChib3JkZXJDb2xvcilcbiAgICAgICAgICAgIGFjLnNldEJvcmRlckNvbG9yKGNvbG9yVG9Db21wb25lbnRzKGJvcmRlckNvbG9yKSk7XG4gICAgICAgIHZhciBicyA9IHdpZGdldC5nZXRPckNyZWF0ZUJvcmRlclN0eWxlKCk7XG4gICAgICAgIGlmIChib3JkZXJXaWR0aCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgYnMuc2V0V2lkdGgoYm9yZGVyV2lkdGgpO1xuICAgICAgICB3aWRnZXQuc2V0RmxhZ1RvKEFubm90YXRpb25GbGFncy5QcmludCwgdHJ1ZSk7XG4gICAgICAgIHdpZGdldC5zZXRGbGFnVG8oQW5ub3RhdGlvbkZsYWdzLkhpZGRlbiwgaGlkZGVuKTtcbiAgICAgICAgd2lkZ2V0LnNldEZsYWdUbyhBbm5vdGF0aW9uRmxhZ3MuSW52aXNpYmxlLCBmYWxzZSk7XG4gICAgICAgIC8vIFNldCBhY3JvZmllbGQgcHJvcGVydGllc1xuICAgICAgICBpZiAodGV4dENvbG9yKSB7XG4gICAgICAgICAgICB2YXIgZGEgPSAoX2EgPSB0aGlzLmFjcm9GaWVsZC5nZXREZWZhdWx0QXBwZWFyYW5jZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICAgICAgICAgIHZhciBuZXdEYSA9IGRhICsgJ1xcbicgKyBzZXRGaWxsaW5nQ29sb3IodGV4dENvbG9yKS50b1N0cmluZygpO1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RGVmYXVsdEFwcGVhcmFuY2UobmV3RGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aWRnZXQ7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZVdpdGhGb250ID0gZnVuY3Rpb24gKHdpZGdldCwgZm9udCwgX2EpIHtcbiAgICAgICAgdmFyIG5vcm1hbCA9IF9hLm5vcm1hbCwgcm9sbG92ZXIgPSBfYS5yb2xsb3ZlciwgZG93biA9IF9hLmRvd247XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZXMod2lkZ2V0LCB7XG4gICAgICAgICAgICBub3JtYWw6IHRoaXMuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIG5vcm1hbCwgZm9udCksXG4gICAgICAgICAgICByb2xsb3Zlcjogcm9sbG92ZXIgJiYgdGhpcy5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgcm9sbG92ZXIsIGZvbnQpLFxuICAgICAgICAgICAgZG93bjogZG93biAmJiB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCBkb3duLCBmb250KSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUudXBkYXRlT25PZmZXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgb25WYWx1ZSwgX2EpIHtcbiAgICAgICAgdmFyIG5vcm1hbCA9IF9hLm5vcm1hbCwgcm9sbG92ZXIgPSBfYS5yb2xsb3ZlciwgZG93biA9IF9hLmRvd247XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZXMod2lkZ2V0LCB7XG4gICAgICAgICAgICBub3JtYWw6IHRoaXMuY3JlYXRlQXBwZWFyYW5jZURpY3Qod2lkZ2V0LCBub3JtYWwsIG9uVmFsdWUpLFxuICAgICAgICAgICAgcm9sbG92ZXI6IHJvbGxvdmVyICYmIHRoaXMuY3JlYXRlQXBwZWFyYW5jZURpY3Qod2lkZ2V0LCByb2xsb3Zlciwgb25WYWx1ZSksXG4gICAgICAgICAgICBkb3duOiBkb3duICYmIHRoaXMuY3JlYXRlQXBwZWFyYW5jZURpY3Qod2lkZ2V0LCBkb3duLCBvblZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAod2lkZ2V0LCBfYSkge1xuICAgICAgICB2YXIgbm9ybWFsID0gX2Eubm9ybWFsLCByb2xsb3ZlciA9IF9hLnJvbGxvdmVyLCBkb3duID0gX2EuZG93bjtcbiAgICAgICAgd2lkZ2V0LnNldE5vcm1hbEFwcGVhcmFuY2Uobm9ybWFsKTtcbiAgICAgICAgaWYgKHJvbGxvdmVyKSB7XG4gICAgICAgICAgICB3aWRnZXQuc2V0Um9sbG92ZXJBcHBlYXJhbmNlKHJvbGxvdmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdpZGdldC5yZW1vdmVSb2xsb3ZlckFwcGVhcmFuY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG93bikge1xuICAgICAgICAgICAgd2lkZ2V0LnNldERvd25BcHBlYXJhbmNlKGRvd24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2lkZ2V0LnJlbW92ZURvd25BcHBlYXJhbmNlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gZG8gdGhpcy4uLj9cbiAgICAvLyBwcml2YXRlIGZvbyhmb250OiBQREZGb250LCBkaWN0OiBQREZEaWN0KSB7XG4gICAgLy8gICBpZiAoIWRpY3QubG9va3VwKFBERk5hbWUub2YoJ0RSJykpKSB7XG4gICAgLy8gICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ0RSJyksIGRpY3QuY29udGV4dC5vYmooe30pKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGNvbnN0IERSID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignRFInKSwgUERGRGljdCk7XG4gICAgLy8gICBpZiAoIURSLmxvb2t1cChQREZOYW1lLm9mKCdGb250JykpKSB7XG4gICAgLy8gICAgIERSLnNldChQREZOYW1lLm9mKCdGb250JyksIGRpY3QuY29udGV4dC5vYmooe30pKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGNvbnN0IEZvbnQgPSBEUi5sb29rdXAoUERGTmFtZS5vZignRm9udCcpLCBQREZEaWN0KTtcbiAgICAvLyAgIEZvbnQuc2V0KFBERk5hbWUub2YoZm9udC5uYW1lKSwgZm9udC5yZWYpO1xuICAgIC8vIH1cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSA9IGZ1bmN0aW9uICh3aWRnZXQsIGFwcGVhcmFuY2UsIGZvbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuYWNyb0ZpZWxkLmRpY3QuY29udGV4dDtcbiAgICAgICAgdmFyIF9iID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpLCB3aWR0aCA9IF9iLndpZHRoLCBoZWlnaHQgPSBfYi5oZWlnaHQ7XG4gICAgICAgIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gZG8gdGhpcy4uLj9cbiAgICAgICAgLy8gaWYgKGZvbnQpIHtcbiAgICAgICAgLy8gICB0aGlzLmZvbyhmb250LCB3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vICAgdGhpcy5mb28oZm9udCwgdGhpcy5kb2MuZ2V0Rm9ybSgpLmFjcm9Gb3JtLmRpY3QpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIEVORCBUT0RPXG4gICAgICAgIHZhciBSZXNvdXJjZXMgPSBmb250ICYmIHsgRm9udDogKF9hID0ge30sIF9hW2ZvbnQubmFtZV0gPSBmb250LnJlZiwgX2EpIH07XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250ZXh0LmZvcm1YT2JqZWN0KGFwcGVhcmFuY2UsIHtcbiAgICAgICAgICAgIFJlc291cmNlczogUmVzb3VyY2VzLFxuICAgICAgICAgICAgQkJveDogY29udGV4dC5vYmooWzAsIDAsIHdpZHRoLCBoZWlnaHRdKSxcbiAgICAgICAgICAgIE1hdHJpeDogY29udGV4dC5vYmooWzEsIDAsIDAsIDEsIDAsIDBdKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzdHJlYW1SZWYgPSBjb250ZXh0LnJlZ2lzdGVyKHN0cmVhbSk7XG4gICAgICAgIHJldHVybiBzdHJlYW1SZWY7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBGb3JtWE9iamVjdCBvZiB0aGUgc3VwcGxpZWQgaW1hZ2UgYW5kIGFkZCBpdCB0byBjb250ZXh0LlxuICAgICAqIFRoZSBGb3JtWE9iamVjdCBzaXplIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHdpZGdldCAoaW5jbHVkaW5nXG4gICAgICogdGhlIGFsaWdubWVudCkuXG4gICAgICogQHBhcmFtIHdpZGdldCBUaGUgd2lkZ2V0IHRoYXQgc2hvdWxkIGRpc3BsYXkgdGhlIGltYWdlLlxuICAgICAqIEBwYXJhbSBhbGlnbm1lbnQgVGhlIGFsaWdubWVudCBvZiB0aGUgaW1hZ2UuXG4gICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICogQHJldHVybnMgVGhlIHJlZiBmb3IgdGhlIEZvcm1YT2JqZWN0IHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBjb250ZXh0LlxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5jcmVhdGVJbWFnZUFwcGVhcmFuY2VTdHJlYW0gPSBmdW5jdGlvbiAod2lkZ2V0LCBpbWFnZSwgYWxpZ25tZW50KSB7XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBoYW5kbGUgaW1hZ2UgYm9yZGVycy5cbiAgICAgICAgLy8gTk9URTogQWNyb2JhdCBzZWVtcyB0byByZXNpemUgdGhlIGltYWdlIChtYXliZSBldmVuIHNrZXdpbmcgaXRzIGFzcGVjdFxuICAgICAgICAvLyAgICAgICByYXRpbykgdG8gZml0IHBlcmZlY3RseSB3aXRoaW4gdGhlIHdpZGdldCdzIHJlY3RhbmdsZS4gVGhpcyBtZXRob2RcbiAgICAgICAgLy8gICAgICAgZG9lcyBub3QgY3VycmVudGx5IGRvIHRoYXQuIFNob3VsZCB0aGVyZSBiZSBhbiBvcHRpb24gZm9yIHRoYXQ/XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIF9iO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuYWNyb0ZpZWxkLmRpY3QuY29udGV4dDtcbiAgICAgICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICAgICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICAgICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgICAgIHZhciBib3JkZXJXaWR0aCA9IChfYiA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgICAgIHZhciBhZGogPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbik7XG4gICAgICAgIHZhciBpbWFnZURpbXMgPSBpbWFnZS5zY2FsZVRvRml0KGFkai53aWR0aCAtIGJvcmRlcldpZHRoICogMiwgYWRqLmhlaWdodCAtIGJvcmRlcldpZHRoICogMik7XG4gICAgICAgIC8vIFN1cHBvcnQgYm9yZGVycyBvbiBpbWFnZXMgYW5kIG1heWJlIG90aGVyIHByb3BlcnRpZXNcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB4OiBib3JkZXJXaWR0aCxcbiAgICAgICAgICAgIHk6IGJvcmRlcldpZHRoLFxuICAgICAgICAgICAgd2lkdGg6IGltYWdlRGltcy53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaW1hZ2VEaW1zLmhlaWdodCxcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoYWxpZ25tZW50ID09PSBJbWFnZUFsaWdubWVudC5DZW50ZXIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMueCArPSAoYWRqLndpZHRoIC0gYm9yZGVyV2lkdGggKiAyKSAvIDIgLSBpbWFnZURpbXMud2lkdGggLyAyO1xuICAgICAgICAgICAgb3B0aW9ucy55ICs9IChhZGouaGVpZ2h0IC0gYm9yZGVyV2lkdGggKiAyKSAvIDIgLSBpbWFnZURpbXMuaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGlnbm1lbnQgPT09IEltYWdlQWxpZ25tZW50LlJpZ2h0KSB7XG4gICAgICAgICAgICBvcHRpb25zLnggPSBhZGoud2lkdGggLSBib3JkZXJXaWR0aCAtIGltYWdlRGltcy53aWR0aDtcbiAgICAgICAgICAgIG9wdGlvbnMueSA9IGFkai5oZWlnaHQgLSBib3JkZXJXaWR0aCAtIGltYWdlRGltcy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGltYWdlTmFtZSA9IHRoaXMuZG9jLmNvbnRleHQuYWRkUmFuZG9tU3VmZml4KCdJbWFnZScsIDEwKTtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2UgPSBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdJbWFnZShpbWFnZU5hbWUsIG9wdGlvbnMpKTtcbiAgICAgICAgLy8vLy8vLy8vLy8vXG4gICAgICAgIHZhciBSZXNvdXJjZXMgPSB7IFhPYmplY3Q6IChfYSA9IHt9LCBfYVtpbWFnZU5hbWVdID0gaW1hZ2UucmVmLCBfYSkgfTtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRleHQuZm9ybVhPYmplY3QoYXBwZWFyYW5jZSwge1xuICAgICAgICAgICAgUmVzb3VyY2VzOiBSZXNvdXJjZXMsXG4gICAgICAgICAgICBCQm94OiBjb250ZXh0Lm9iaihbMCwgMCwgcmVjdGFuZ2xlLndpZHRoLCByZWN0YW5nbGUuaGVpZ2h0XSksXG4gICAgICAgICAgICBNYXRyaXg6IGNvbnRleHQub2JqKFsxLCAwLCAwLCAxLCAwLCAwXSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGV4dC5yZWdpc3RlcihzdHJlYW0pO1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLmNyZWF0ZUFwcGVhcmFuY2VEaWN0ID0gZnVuY3Rpb24gKHdpZGdldCwgYXBwZWFyYW5jZSwgb25WYWx1ZSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuYWNyb0ZpZWxkLmRpY3QuY29udGV4dDtcbiAgICAgICAgdmFyIG9uU3RyZWFtUmVmID0gdGhpcy5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgYXBwZWFyYW5jZS5vbik7XG4gICAgICAgIHZhciBvZmZTdHJlYW1SZWYgPSB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCBhcHBlYXJhbmNlLm9mZik7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlRGljdCA9IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgYXBwZWFyYW5jZURpY3Quc2V0KG9uVmFsdWUsIG9uU3RyZWFtUmVmKTtcbiAgICAgICAgYXBwZWFyYW5jZURpY3Quc2V0KFBERk5hbWUub2YoJ09mZicpLCBvZmZTdHJlYW1SZWYpO1xuICAgICAgICByZXR1cm4gYXBwZWFyYW5jZURpY3Q7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRmllbGQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRmllbGQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZGaWVsZC5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEb2N1bWVudCBmcm9tIFwiLi4vUERGRG9jdW1lbnRcIjtcbmltcG9ydCBQREZCdXR0b24gZnJvbSBcIi4vUERGQnV0dG9uXCI7XG5pbXBvcnQgUERGQ2hlY2tCb3ggZnJvbSBcIi4vUERGQ2hlY2tCb3hcIjtcbmltcG9ydCBQREZEcm9wZG93biBmcm9tIFwiLi9QREZEcm9wZG93blwiO1xuaW1wb3J0IFBERk9wdGlvbkxpc3QgZnJvbSBcIi4vUERGT3B0aW9uTGlzdFwiO1xuaW1wb3J0IFBERlJhZGlvR3JvdXAgZnJvbSBcIi4vUERGUmFkaW9Hcm91cFwiO1xuaW1wb3J0IFBERlNpZ25hdHVyZSBmcm9tIFwiLi9QREZTaWduYXR1cmVcIjtcbmltcG9ydCBQREZUZXh0RmllbGQgZnJvbSBcIi4vUERGVGV4dEZpZWxkXCI7XG5pbXBvcnQgeyBOb1N1Y2hGaWVsZEVycm9yLCBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IsIEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yLCBJbnZhbGlkRmllbGROYW1lUGFydEVycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuLi9QREZGb250XCI7XG5pbXBvcnQgeyBTdGFuZGFyZEZvbnRzIH0gZnJvbSBcIi4uL1N0YW5kYXJkRm9udHNcIjtcbmltcG9ydCB7IHJvdGF0ZUluUGxhY2UgfSBmcm9tIFwiLi4vb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgZHJhd09iamVjdCwgcG9wR3JhcGhpY3NTdGF0ZSwgcHVzaEdyYXBoaWNzU3RhdGUsIHRyYW5zbGF0ZSwgfSBmcm9tIFwiLi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBQREZBY3JvRm9ybSwgUERGQWNyb0NoZWNrQm94LCBQREZBY3JvQ29tYm9Cb3gsIFBERkFjcm9MaXN0Qm94LCBQREZBY3JvUmFkaW9CdXR0b24sIFBERkFjcm9TaWduYXR1cmUsIFBERkFjcm9UZXh0LCBQREZBY3JvUHVzaEJ1dHRvbiwgUERGQWNyb05vblRlcm1pbmFsLCBQREZEaWN0LCBQREZSZWYsIGNyZWF0ZVBERkFjcm9GaWVsZHMsIFBERk5hbWUsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBDYWNoZSwgYXNzZXJ0T3JVbmRlZmluZWQgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgaW50ZXJhY3RpdmUgZm9ybSBvZiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqXG4gKiBJbnRlcmFjdGl2ZSBmb3JtcyAoc29tZXRpbWVzIGNhbGxlZCBfQWNyb0Zvcm1zXykgYXJlIGNvbGxlY3Rpb25zIG9mIGZpZWxkc1xuICogZGVzaWduZWQgdG8gZ2F0aGVyIGluZm9ybWF0aW9uIGZyb20gYSB1c2VyLiBBIFBERiBkb2N1bWVudCBtYXkgY29udGFpbnMgYW55XG4gKiBudW1iZXIgb2YgZmllbGRzIHRoYXQgYXBwZWFyIG9uIHZhcmlvdXMgcGFnZXMsIGFsbCBvZiB3aGljaCBtYWtlIHVwIGEgc2luZ2xlLFxuICogZ2xvYmFsIGludGVyYWN0aXZlIGZvcm0gc3Bhbm5pbmcgdGhlIGVudGlyZSBkb2N1bWVudC4gVGhpcyBtZWFucyB0aGF0XG4gKiBpbnN0YW5jZXMgb2YgW1tQREZEb2N1bWVudF1dIHNoYWxsIGNvbnRhaW4gYXQgbW9zdCBvbmUgW1tQREZGb3JtXV0uXG4gKlxuICogVGhlIGZpZWxkcyBvZiBhbiBpbnRlcmFjdGl2ZSBmb3JtIGFyZSByZXByZXNlbnRlZCBieSBbW1BERkZpZWxkXV0gaW5zdGFuY2VzLlxuICovXG52YXIgUERGRm9ybSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZGb3JtKGFjcm9Gb3JtLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5lbWJlZERlZmF1bHRGb250ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmRvYy5lbWJlZFN0YW5kYXJkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSk7XG4gICAgICAgIH07XG4gICAgICAgIGFzc2VydElzKGFjcm9Gb3JtLCAnYWNyb0Zvcm0nLCBbW1BERkFjcm9Gb3JtLCAnUERGQWNyb0Zvcm0nXV0pO1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICB0aGlzLmFjcm9Gb3JtID0gYWNyb0Zvcm07XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmRpcnR5RmllbGRzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmRlZmF1bHRGb250Q2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeSh0aGlzLmVtYmVkRGVmYXVsdEZvbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIFtbUERGRm9ybV1dIGhhcyBYRkEgZGF0YS4gTW9zdCBQREZzIHdpdGggZm9ybVxuICAgICAqIGZpZWxkcyBkbyBub3QgdXNlIFhGQSBhcyBpdCBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCBieSBQREYgcmVhZGVycy5cbiAgICAgKlxuICAgICAqID4gYHBkZi1saWJgIGRvZXMgbm90IHN1cHBvcnQgY3JlYXRpb24sIG1vZGlmaWNhdGlvbiwgb3IgcmVhZGluZyBvZiBYRkFcbiAgICAgKiA+IGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBpZiAoZm9ybS5oYXNYRkEoKSkgY29uc29sZS5sb2coJ1BERiBoYXMgWEZBIGRhdGEnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZm9ybSBoYXMgWEZBIGRhdGEuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuaGFzWEZBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRm9ybS5kaWN0LmhhcyhQREZOYW1lLm9mKCdYRkEnKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0IHRoZSBYRkEgZGF0YSBmcm9tIHRoaXMgW1tQREZGb3JtXV0gKGlmIGFueSBleGlzdHMpLiBUaGlzIHdpbGxcbiAgICAgKiBmb3JjZSByZWFkZXJzIHRvIGZhbGxiYWNrIHRvIHN0YW5kYXJkIGZpZWxkcyBpZiB0aGUgW1tQREZEb2N1bWVudF1dXG4gICAgICogY29udGFpbnMgYW55LiBGb3IgZXhhbXBsZTpcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBmb3JtLmRlbGV0ZVhGQSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZGVsZXRlWEZBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9Gb3JtLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ1hGQScpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhbGwgZmllbGRzIGNvbnRhaW5lZCBpbiB0aGlzIFtbUERGRm9ybV1dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZmllbGRzID0gZm9ybS5nZXRGaWVsZHMoKVxuICAgICAqIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgKiAgIGNvbnN0IHR5cGUgPSBmaWVsZC5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICogICBjb25zdCBuYW1lID0gZmllbGQuZ2V0TmFtZSgpXG4gICAgICogICBjb25zb2xlLmxvZyhgJHt0eXBlfTogJHtuYW1lfWApXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgZmllbGRzIGluIHRoaXMgZm9ybS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRGaWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhbGxGaWVsZHMgPSB0aGlzLmFjcm9Gb3JtLmdldEFsbEZpZWxkcygpO1xuICAgICAgICB2YXIgZmllbGRzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFsbEZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGFsbEZpZWxkc1tpZHhdLCBhY3JvRmllbGQgPSBfYVswXSwgcmVmID0gX2FbMV07XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBjb252ZXJ0VG9QREZGaWVsZChhY3JvRmllbGQsIHJlZiwgdGhpcy5kb2MpO1xuICAgICAgICAgICAgaWYgKGZpZWxkKVxuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGRzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGRNYXliZSgnUGFnZTEuRm9vLkJhclswXScpXG4gICAgICogaWYgKGZpZWxkKSBjb25zb2xlLmxvZygnRmllbGQgZXhpc3RzIScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgZmllbGQgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIG9uZSBleGlzdHMuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0RmllbGRNYXliZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZHMgPSB0aGlzLmdldEZpZWxkcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBmaWVsZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaWR4XTtcbiAgICAgICAgICAgIGlmIChmaWVsZC5nZXROYW1lKCkgPT09IG5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnUGFnZTEuRm9vLkJhclswXScpXG4gICAgICogYGBgXG4gICAgICogSWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIGZpZWxkIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIGZpZWxkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldEZpZWxkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZE1heWJlKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBOb1N1Y2hGaWVsZEVycm9yKG5hbWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBidXR0b24gZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ1BhZ2UxLkZvby5CdXR0b25bMF0nKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBidXR0b24gbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgYnV0dG9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldEJ1dHRvbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkJ1dHRvbilcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZCdXR0b24sIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY2hlY2sgYm94IGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdQYWdlMS5Gb28uQ2hlY2tCb3hbMF0nKVxuICAgICAqIGNoZWNrQm94LmNoZWNrKClcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSBjaGVjayBib3guXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgY2hlY2sgYm94IG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIGNoZWNrIGJveCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRDaGVja0JveCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkNoZWNrQm94KVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERkNoZWNrQm94LCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRyb3Bkb3duIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdQYWdlMS5Gb28uRHJvcGRvd25bMF0nKVxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSBkcm9wZG93bi5nZXRPcHRpb25zKClcbiAgICAgKiBkcm9wZG93bi5zZWxlY3Qob3B0aW9uc1swXSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSBkcm9wZG93bi5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBkcm9wZG93biBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBkcm9wZG93biB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXREcm9wZG93biA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkRyb3Bkb3duKVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERkRyb3Bkb3duLCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG9wdGlvbiBsaXN0IGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnUGFnZTEuRm9vLk9wdGlvbkxpc3RbMF0nKVxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25MaXN0LmdldE9wdGlvbnMoKVxuICAgICAqIG9wdGlvbkxpc3Quc2VsZWN0KG9wdGlvbnNbMF0pXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIG9yIGlmXG4gICAgICogdGhlIGZpZWxkIGV4aXN0cyBidXQgaXMgbm90IGFuIG9wdGlvbiBsaXN0LlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIG9wdGlvbiBsaXN0IG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGlvbiBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldE9wdGlvbkxpc3QgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZPcHRpb25MaXN0KVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERk9wdGlvbkxpc3QsIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmFkaW8gZ3JvdXAgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdQYWdlMS5Gb28uUmFkaW9Hcm91cFswXScpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IHJhZGlvR3JvdXAuZ2V0T3B0aW9ucygpXG4gICAgICogcmFkaW9Hcm91cC5zZWxlY3Qob3B0aW9uc1swXSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSByYWRpbyBncm91cC5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCByYWRpbyBncm91cCBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSByYWRpbyBncm91cCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRSYWRpb0dyb3VwID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGUmFkaW9Hcm91cClcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZSYWRpb0dyb3VwLCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNpZ25hdHVyZSBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHNpZ25hdHVyZSA9IGZvcm0uZ2V0U2lnbmF0dXJlKCdQYWdlMS5Gb28uU2lnbmF0dXJlWzBdJylcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgc2lnbmF0dXJlIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRTaWduYXR1cmUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZTaWduYXR1cmUpXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGU2lnbmF0dXJlLCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRleHQgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnUGFnZTEuRm9vLlRleHRGaWVsZFswXScpXG4gICAgICogdGV4dEZpZWxkLnNldFRleHQoJ0FyZSB5b3UgZGVzaWduZWQgdG8gYWN0IG9yIHRvIGJlIGFjdGVkIHVwb24/JylcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSB0ZXh0IGZpZWxkLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIHRleHQgZmllbGQgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdGV4dCBmaWVsZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRUZXh0RmllbGQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZUZXh0RmllbGQpXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGVGV4dEZpZWxkLCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYnV0dG9uIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uY3JlYXRlQnV0dG9uKCdjb29sLm5ldy5idXR0b24nKVxuICAgICAqXG4gICAgICogYnV0dG9uLmFkZFRvUGFnZSgnRG8gU3R1ZmYnLCBmb250LCBwYWdlKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGEgZmllbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgYnV0dG9uLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgYnV0dG9uIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZUJ1dHRvbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBuYW1lUGFydHMgPSBzcGxpdEZpZWxkTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzKG5hbWVQYXJ0cy5ub25UZXJtaW5hbCk7XG4gICAgICAgIHZhciBidXR0b24gPSBQREZBY3JvUHVzaEJ1dHRvbi5jcmVhdGUodGhpcy5kb2MuY29udGV4dCk7XG4gICAgICAgIGJ1dHRvbi5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW2J1dHRvbiwgYnV0dG9uLnJlZl0sIG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIHJldHVybiBQREZCdXR0b24ub2YoYnV0dG9uLCBidXR0b24ucmVmLCB0aGlzLmRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgY2hlY2sgYm94IGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5jcmVhdGVDaGVja0JveCgnY29vbC5uZXcuY2hlY2tCb3gnKVxuICAgICAqXG4gICAgICogY2hlY2tCb3guYWRkVG9QYWdlKHBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBjaGVjayBib3guXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBjaGVjayBib3ggZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlQ2hlY2tCb3ggPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbmFtZVBhcnRzID0gc3BsaXRGaWVsZE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyhuYW1lUGFydHMubm9uVGVybWluYWwpO1xuICAgICAgICB2YXIgY2hlY2tCb3ggPSBQREZBY3JvQ2hlY2tCb3guY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICBjaGVja0JveC5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW2NoZWNrQm94LCBjaGVja0JveC5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGQ2hlY2tCb3gub2YoY2hlY2tCb3gsIGNoZWNrQm94LnJlZiwgdGhpcy5kb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGRyb3Bkb3duIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5jcmVhdGVEcm9wZG93bignY29vbC5uZXcuZHJvcGRvd24nKVxuICAgICAqXG4gICAgICogZHJvcGRvd24uYWRkVG9QYWdlKGZvbnQsIHBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBkcm9wZG93bi5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IGRyb3Bkb3duIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZURyb3Bkb3duID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IHNwbGl0RmllbGROYW1lKG5hbWUpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMobmFtZVBhcnRzLm5vblRlcm1pbmFsKTtcbiAgICAgICAgdmFyIGNvbWJvQm94ID0gUERGQWNyb0NvbWJvQm94LmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgY29tYm9Cb3guc2V0UGFydGlhbE5hbWUobmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgYWRkRmllbGRUb1BhcmVudChwYXJlbnQsIFtjb21ib0JveCwgY29tYm9Cb3gucmVmXSwgbmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgcmV0dXJuIFBERkRyb3Bkb3duLm9mKGNvbWJvQm94LCBjb21ib0JveC5yZWYsIHRoaXMuZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBvcHRpb24gbGlzdCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5jcmVhdGVPcHRpb25MaXN0KCdjb29sLm5ldy5vcHRpb25MaXN0JylcbiAgICAgKlxuICAgICAqIG9wdGlvbkxpc3QuYWRkVG9QYWdlKGZvbnQsIHBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBvcHRpb24gbGlzdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IG9wdGlvbiBsaXN0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZU9wdGlvbkxpc3QgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbmFtZVBhcnRzID0gc3BsaXRGaWVsZE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyhuYW1lUGFydHMubm9uVGVybWluYWwpO1xuICAgICAgICB2YXIgbGlzdEJveCA9IFBERkFjcm9MaXN0Qm94LmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgbGlzdEJveC5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW2xpc3RCb3gsIGxpc3RCb3gucmVmXSwgbmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgcmV0dXJuIFBERk9wdGlvbkxpc3Qub2YobGlzdEJveCwgbGlzdEJveC5yZWYsIHRoaXMuZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyByYWRpbyBncm91cCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5jcmVhdGVSYWRpb0dyb3VwKCdjb29sLm5ldy5yYWRpb0dyb3VwJylcbiAgICAgKlxuICAgICAqIHJhZGlvR3JvdXAuYWRkT3B0aW9uVG9QYWdlKCdpcy1kb2cnLCBwYWdlLCB7IHk6IDAgfSlcbiAgICAgKiByYWRpb0dyb3VwLmFkZE9wdGlvblRvUGFnZSgnaXMtY2F0JywgcGFnZSwgeyB5OiA3NSB9KVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGEgZmllbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgcmFkaW8gZ3JvdXAuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyByYWRpbyBncm91cCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5jcmVhdGVSYWRpb0dyb3VwID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IHNwbGl0RmllbGROYW1lKG5hbWUpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMobmFtZVBhcnRzLm5vblRlcm1pbmFsKTtcbiAgICAgICAgdmFyIHJhZGlvQnV0dG9uID0gUERGQWNyb1JhZGlvQnV0dG9uLmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgcmFkaW9CdXR0b24uc2V0UGFydGlhbE5hbWUobmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgYWRkRmllbGRUb1BhcmVudChwYXJlbnQsIFtyYWRpb0J1dHRvbiwgcmFkaW9CdXR0b24ucmVmXSwgbmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgcmV0dXJuIFBERlJhZGlvR3JvdXAub2YocmFkaW9CdXR0b24sIHJhZGlvQnV0dG9uLnJlZiwgdGhpcy5kb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHRleHQgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5jcmVhdGVUZXh0RmllbGQoJ2Nvb2wubmV3LnRleHRGaWVsZCcpXG4gICAgICpcbiAgICAgKiB0ZXh0RmllbGQuYWRkVG9QYWdlKGZvbnQsIHBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyByYWRpbyBncm91cC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IHJhZGlvIGdyb3VwIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZVRleHRGaWVsZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBuYW1lUGFydHMgPSBzcGxpdEZpZWxkTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzKG5hbWVQYXJ0cy5ub25UZXJtaW5hbCk7XG4gICAgICAgIHZhciB0ZXh0ID0gUERGQWNyb1RleHQuY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICB0ZXh0LnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIGFkZEZpZWxkVG9QYXJlbnQocGFyZW50LCBbdGV4dCwgdGV4dC5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGVGV4dEZpZWxkLm9mKHRleHQsIHRleHQucmVmLCB0aGlzLmRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGbGF0dGVuIGFsbCBmaWVsZHMgaW4gdGhpcyBbW1BERkZvcm1dXS5cbiAgICAgKlxuICAgICAqIEZsYXR0ZW5pbmcgYSBmb3JtIGZpZWxkIHdpbGwgdGFrZSB0aGUgY3VycmVudCBhcHBlYXJhbmNlIGZvciBlYWNoIG9mIHRoYXRcbiAgICAgKiBmaWVsZCdzIHdpZGdldHMgYW5kIG1ha2UgdGhlbSBwYXJ0IG9mIHRoZWlyIHBhZ2UncyBjb250ZW50IHN0cmVhbS4gQWxsIGZvcm1cbiAgICAgKiBmaWVsZHMgYW5kIGFubm90YXRpb25zIGFzc29jaWF0ZWQgYXJlIHRoZW4gcmVtb3ZlZC4gTm90ZSB0aGF0IG9uY2UgYSBmb3JtXG4gICAgICogaGFzIGJlZW4gZmxhdHRlbmVkIGl0cyBmaWVsZHMgY2FuIG5vIGxvbmdlciBiZSBhY2Nlc3NlZCBvciBlZGl0ZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBvZnRlbiB1c2VkIGFmdGVyIGZpbGxpbmcgZm9ybSBmaWVsZHMgdG8gZW5zdXJlIGFcbiAgICAgKiBjb25zaXN0ZW50IGFwcGVhcmFuY2UgYWNyb3NzIGRpZmZlcmVudCBQREYgcmVhZGVycyBhbmQvb3IgcHJpbnRlcnMuXG4gICAgICogQW5vdGhlciBjb21tb24gdXNlIGNhc2UgaXMgdG8gY29weSBhIHRlbXBsYXRlIGRvY3VtZW50IHdpdGggZm9ybSBmaWVsZHNcbiAgICAgKiBpbnRvIGFub3RoZXIgZG9jdW1lbnQuIEluIHRoaXMgc2NlbmFyaW8geW91IHdvdWxkIGxvYWQgdGhlIHRlbXBsYXRlXG4gICAgICogZG9jdW1lbnQsIGZpbGwgaXRzIGZpZWxkcywgZmxhdHRlbiBpdCwgYW5kIHRoZW4gY29weSBpdHMgcGFnZXMgaW50byB0aGVcbiAgICAgKiByZWNpcGllbnQgZG9jdW1lbnQgLSB0aGUgZmlsbGVkIGZpZWxkcyB3aWxsIGJlIGNvcGllZCBvdmVyLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKTtcbiAgICAgKiBmb3JtLmZsYXR0ZW4oKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5mbGF0dGVuID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0geyB1cGRhdGVGaWVsZEFwcGVhcmFuY2VzOiB0cnVlIH07IH1cbiAgICAgICAgaWYgKG9wdGlvbnMudXBkYXRlRmllbGRBcHBlYXJhbmNlcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWVsZEFwcGVhcmFuY2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5GaWVsZHMgPSBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuRmllbGRzOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgIHZhciB3aWRnZXRzID0gZmllbGQuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBsZW5XaWRnZXRzID0gd2lkZ2V0cy5sZW5ndGg7IGogPCBsZW5XaWRnZXRzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tqXTtcbiAgICAgICAgICAgICAgICB2YXIgcGFnZSA9IHRoaXMuZmluZFdpZGdldFBhZ2Uod2lkZ2V0KTtcbiAgICAgICAgICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5maW5kV2lkZ2V0QXBwZWFyYW5jZVJlZihmaWVsZCwgd2lkZ2V0KTtcbiAgICAgICAgICAgICAgICB2YXIgeE9iamVjdEtleSA9IHBhZ2Uubm9kZS5uZXdYT2JqZWN0KCdGbGF0V2lkZ2V0Jywgd2lkZ2V0UmVmKTtcbiAgICAgICAgICAgICAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgICAgICAgICAgICAgIHZhciBvcGVyYXRvcnMgPSBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgICAgICAgICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZShyZWN0YW5nbGUueCwgcmVjdGFuZ2xlLnkpXG4gICAgICAgICAgICAgICAgXSwgcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogMCB9KSksIFtcbiAgICAgICAgICAgICAgICAgICAgZHJhd09iamVjdCh4T2JqZWN0S2V5KSxcbiAgICAgICAgICAgICAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICAgICAgICAgIF0pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBwYWdlLnB1c2hPcGVyYXRvcnMuYXBwbHkocGFnZSwgb3BlcmF0b3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRmllbGQoZmllbGQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBmaWVsZCBmcm9tIHRoaXMgW1tQREZGb3JtXV0uXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpO1xuICAgICAqIGNvbnN0IGFnZUZpZWxkID0gZm9ybS5nZXRGaWVsZHMoKS5maW5kKHggPT4geC5nZXROYW1lKCkgPT09ICdBZ2UnKTtcbiAgICAgKiBmb3JtLnJlbW92ZUZpZWxkKGFnZUZpZWxkKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5yZW1vdmVGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IGZpZWxkLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIHZhciBwYWdlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2ldO1xuICAgICAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZmluZFdpZGdldEFwcGVhcmFuY2VSZWYoZmllbGQsIHdpZGdldCk7XG4gICAgICAgICAgICB2YXIgcGFnZSA9IHRoaXMuZmluZFdpZGdldFBhZ2Uod2lkZ2V0KTtcbiAgICAgICAgICAgIHBhZ2VzLmFkZChwYWdlKTtcbiAgICAgICAgICAgIHBhZ2Uubm9kZS5yZW1vdmVBbm5vdCh3aWRnZXRSZWYpO1xuICAgICAgICB9XG4gICAgICAgIHBhZ2VzLmZvckVhY2goZnVuY3Rpb24gKHBhZ2UpIHsgcmV0dXJuIHBhZ2Uubm9kZS5yZW1vdmVBbm5vdChmaWVsZC5yZWYpOyB9KTtcbiAgICAgICAgdGhpcy5hY3JvRm9ybS5yZW1vdmVGaWVsZChmaWVsZC5hY3JvRmllbGQpO1xuICAgICAgICB2YXIgZmllbGRLaWRzID0gZmllbGQuYWNyb0ZpZWxkLm5vcm1hbGl6ZWRFbnRyaWVzKCkuS2lkcztcbiAgICAgICAgdmFyIGtpZHNDb3VudCA9IGZpZWxkS2lkcy5zaXplKCk7XG4gICAgICAgIGZvciAodmFyIGNoaWxkSW5kZXggPSAwOyBjaGlsZEluZGV4IDwga2lkc0NvdW50OyBjaGlsZEluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGZpZWxkS2lkcy5nZXQoY2hpbGRJbmRleCk7XG4gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBQREZSZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvYy5jb250ZXh0LmRlbGV0ZShjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2MuY29udGV4dC5kZWxldGUoZmllbGQucmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBhbGwgd2lkZ2V0cyBvZiBhbGwgZmllbGRzIGluIHRoaXNcbiAgICAgKiBbW1BERkZvcm1dXS4gQXBwZWFyYW5jZSBzdHJlYW1zIHdpbGwgb25seSBiZSBjcmVhdGVkIGZvciBhIHdpZGdldCBpZiBpdFxuICAgICAqIGRvZXMgbm90IGhhdmUgYW55IGV4aXN0aW5nIGFwcGVhcmFuY2Ugc3RyZWFtcywgb3IgdGhlIGZpZWxkJ3MgdmFsdWUgaGFzXG4gICAgICogY2hhbmdlZCAoZS5nLiBieSBjYWxsaW5nIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBvclxuICAgICAqIFtbUERGRHJvcGRvd24uc2VsZWN0XV0pLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb3VyaWVyID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkNvdXJpZXIpXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBmb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMoY291cmllcilcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqICoqSU1QT1JUQU5UOioqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYGZvbnRgIHBhcmFtZXRlciBpc1xuICAgICAqIFtbU3RhbmRhcmRGb250cy5IZWx2ZXRpY2FdXS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBXaW5BbnNpIGZvbnQuIFRoaXMgbWVhbnNcbiAgICAgKiB0aGF0IGVuY29kaW5nIGVycm9ycyB3aWxsIGJlIHRocm93biBpZiBhbnkgZmllbGRzIGNvbnRhaW4gdGV4dCB3aXRoXG4gICAgICogY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBXaW5BbnNpIGNoYXJhY3RlciBzZXQgKHRoZSBsYXRpbiBhbHBoYWJldCkuXG4gICAgICpcbiAgICAgKiBFbWJlZGRpbmcgYSBjdXN0b20gZm9udCBhbmQgcGFzc2luZyB0aGF0IGFzIHRoZSBgZm9udGBcbiAgICAgKiBwYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgd2l0aCBub24gV2luQW5zaVxuICAgICAqIGNoYXJhY3RlcnMgKGFzc3VtaW5nIHlvdXIgY3VzdG9tIGZvbnQgc3VwcG9ydHMgdGhlbSkuXG4gICAgICpcbiAgICAgKiA+ICoqTk9URToqKiBUaGUgW1tQREZEb2N1bWVudC5zYXZlXV0gbWV0aG9kIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCB0b1xuICAgICAqID4gdXBkYXRlIGFwcGVhcmFuY2VzIGF1dG9tYXRpY2FsbHkgaWYgYSBmb3JtIHdhcyBhY2Nlc3NlZCB2aWEgdGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LmdldEZvcm1dXSBtZXRob2QgcHJpb3IgdG8gc2F2aW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvbnQgT3B0aW9uYWxseSwgdGhlIGZvbnQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgbmV3IGFwcGVhcmFuY2VzLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBmb250ID0gZm9udCAhPT0gbnVsbCAmJiBmb250ICE9PSB2b2lkIDAgPyBmb250IDogdGhpcy5nZXREZWZhdWx0Rm9udCgpO1xuICAgICAgICB2YXIgZmllbGRzID0gdGhpcy5nZXRGaWVsZHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2lkeF07XG4gICAgICAgICAgICBpZiAoZmllbGQubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKGZvbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYXJrIGEgZmllbGQgYXMgZGlydHkuIFRoaXMgd2lsbCBjYXVzZSBpdHMgYXBwZWFyYW5jZSBzdHJlYW1zIHRvIGJlXG4gICAgICogdXBkYXRlZCBieSBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dLlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ2Zvby5iYXInKVxuICAgICAqIGZvcm0ubWFya0ZpZWxkQXNEaXJ0eShmaWVsZC5yZWYpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZpZWxkUmVmIFRoZSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIHRoYXQgc2hvdWxkIGJlIG1hcmtlZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5tYXJrRmllbGRBc0RpcnR5ID0gZnVuY3Rpb24gKGZpZWxkUmVmKSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKGZpZWxkUmVmLCAnZmllbGRSZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIHRoaXMuZGlydHlGaWVsZHMuYWRkKGZpZWxkUmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1hcmsgYSBmaWVsZCBhcyBkaXJ0eS4gVGhpcyB3aWxsIGNhdXNlIGl0cyBhcHBlYXJhbmNlIHN0cmVhbXMgdG8gbm90IGJlXG4gICAgICogdXBkYXRlZCBieSBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dLlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ2Zvby5iYXInKVxuICAgICAqIGZvcm0ubWFya0ZpZWxkQXNDbGVhbihmaWVsZC5yZWYpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZpZWxkUmVmIFRoZSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIHRoYXQgc2hvdWxkIGJlIG1hcmtlZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5tYXJrRmllbGRBc0NsZWFuID0gZnVuY3Rpb24gKGZpZWxkUmVmKSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKGZpZWxkUmVmLCAnZmllbGRSZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIHRoaXMuZGlydHlGaWVsZHMuZGVsZXRlKGZpZWxkUmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlzIHRoZSBzcGVjaWZpZWQgZmllbGQgaGFzIGJlZW4gbWFya2VkIGFzIGRpcnR5LlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ2Zvby5iYXInKVxuICAgICAqIGlmIChmb3JtLmZpZWxkSXNEaXJ0eShmaWVsZC5yZWYpKSBjb25zb2xlLmxvZygnRmllbGQgaXMgZGlydHknKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmaWVsZFJlZiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCB0aGF0IHNob3VsZCBiZSBjaGVja2VkLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgZmllbGQgaXMgZGlydHkuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZmllbGRJc0RpcnR5ID0gZnVuY3Rpb24gKGZpZWxkUmVmKSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKGZpZWxkUmVmLCAnZmllbGRSZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcnR5RmllbGRzLmhhcyhmaWVsZFJlZik7XG4gICAgfTtcbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXREZWZhdWx0Rm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEZvbnRDYWNoZS5hY2Nlc3MoKTtcbiAgICB9O1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZpbmRXaWRnZXRQYWdlID0gZnVuY3Rpb24gKHdpZGdldCkge1xuICAgICAgICB2YXIgcGFnZVJlZiA9IHdpZGdldC5QKCk7XG4gICAgICAgIHZhciBwYWdlID0gdGhpcy5kb2MuZ2V0UGFnZXMoKS5maW5kKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LnJlZiA9PT0gcGFnZVJlZjsgfSk7XG4gICAgICAgIGlmIChwYWdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LmdldE9iamVjdFJlZih3aWRnZXQuZGljdCk7XG4gICAgICAgICAgICBpZiAod2lkZ2V0UmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIFBERlJlZiBmb3IgUERGT2JqZWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWdlID0gdGhpcy5kb2MuZmluZFBhZ2VGb3JBbm5vdGF0aW9uUmVmKHdpZGdldFJlZik7XG4gICAgICAgICAgICBpZiAocGFnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgcGFnZSBmb3IgUERGUmVmIFwiICsgd2lkZ2V0UmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICB9O1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZpbmRXaWRnZXRBcHBlYXJhbmNlUmVmID0gZnVuY3Rpb24gKGZpZWxkLCB3aWRnZXQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgcmVmT3JEaWN0ID0gd2lkZ2V0LmdldE5vcm1hbEFwcGVhcmFuY2UoKTtcbiAgICAgICAgaWYgKHJlZk9yRGljdCBpbnN0YW5jZW9mIFBERkRpY3QgJiZcbiAgICAgICAgICAgIChmaWVsZCBpbnN0YW5jZW9mIFBERkNoZWNrQm94IHx8IGZpZWxkIGluc3RhbmNlb2YgUERGUmFkaW9Hcm91cCkpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGZpZWxkLmFjcm9GaWVsZC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFyIHJlZiA9IChfYSA9IHJlZk9yRGljdC5nZXQodmFsdWUpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiByZWZPckRpY3QuZ2V0KFBERk5hbWUub2YoJ09mZicpKTtcbiAgICAgICAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBQREZSZWYpIHtcbiAgICAgICAgICAgICAgICByZWZPckRpY3QgPSByZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocmVmT3JEaWN0IGluc3RhbmNlb2YgUERGUmVmKSkge1xuICAgICAgICAgICAgdmFyIG5hbWVfMSA9IGZpZWxkLmdldE5hbWUoKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBleHRyYWN0IGFwcGVhcmFuY2UgcmVmIGZvcjogXCIgKyBuYW1lXzEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZPckRpY3Q7XG4gICAgfTtcbiAgICBQREZGb3JtLnByb3RvdHlwZS5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMgPSBmdW5jdGlvbiAocGFydGlhbE5hbWVzKSB7XG4gICAgICAgIHZhciBub25UZXJtaW5hbCA9IFtcbiAgICAgICAgICAgIHRoaXMuYWNyb0Zvcm0sXG4gICAgICAgIF07XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHBhcnRpYWxOYW1lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBuYW1lUGFydCA9IHBhcnRpYWxOYW1lc1tpZHhdO1xuICAgICAgICAgICAgaWYgKCFuYW1lUGFydClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvcihuYW1lUGFydCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzEgPSBub25UZXJtaW5hbFswXSwgcGFyZW50UmVmID0gbm9uVGVybWluYWxbMV07XG4gICAgICAgICAgICB2YXIgcmVzID0gdGhpcy5maW5kTm9uVGVybWluYWwobmFtZVBhcnQsIHBhcmVudF8xKTtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICBub25UZXJtaW5hbCA9IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gUERGQWNyb05vblRlcm1pbmFsLmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICBub2RlLnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0KTtcbiAgICAgICAgICAgICAgICBub2RlLnNldFBhcmVudChwYXJlbnRSZWYpO1xuICAgICAgICAgICAgICAgIHZhciBub2RlUmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcihub2RlLmRpY3QpO1xuICAgICAgICAgICAgICAgIHBhcmVudF8xLmFkZEZpZWxkKG5vZGVSZWYpO1xuICAgICAgICAgICAgICAgIG5vblRlcm1pbmFsID0gW25vZGUsIG5vZGVSZWZdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub25UZXJtaW5hbDtcbiAgICB9O1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZpbmROb25UZXJtaW5hbCA9IGZ1bmN0aW9uIChwYXJ0aWFsTmFtZSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBmaWVsZHMgPSBwYXJlbnQgaW5zdGFuY2VvZiBQREZBY3JvRm9ybVxuICAgICAgICAgICAgPyB0aGlzLmFjcm9Gb3JtLmdldEZpZWxkcygpXG4gICAgICAgICAgICA6IGNyZWF0ZVBERkFjcm9GaWVsZHMocGFyZW50LktpZHMoKSk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGZpZWxkc1tpZHhdLCBmaWVsZCA9IF9hWzBdLCByZWYgPSBfYVsxXTtcbiAgICAgICAgICAgIGlmIChmaWVsZC5nZXRQYXJ0aWFsTmFtZSgpID09PSBwYXJ0aWFsTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9Ob25UZXJtaW5hbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtmaWVsZCwgcmVmXTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IocGFydGlhbE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuZ2V0Rm9ybV1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGRm9ybV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZGb3JtXV0gZnJvbSBhbiBleGlzdGluZyBhY3JvRm9ybSBhbmQgZW1iZWRkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvRm9ybSBUaGUgdW5kZXJseWluZyBgUERGQWNyb0Zvcm1gIGZvciB0aGlzIGZvcm0uXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIGZvcm0gd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGRm9ybS5vZiA9IGZ1bmN0aW9uIChhY3JvRm9ybSwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRm9ybShhY3JvRm9ybSwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZGb3JtO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkZvcm07XG52YXIgY29udmVydFRvUERGRmllbGQgPSBmdW5jdGlvbiAoZmllbGQsIHJlZiwgZG9jKSB7XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb1B1c2hCdXR0b24pXG4gICAgICAgIHJldHVybiBQREZCdXR0b24ub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvQ2hlY2tCb3gpXG4gICAgICAgIHJldHVybiBQREZDaGVja0JveC5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9Db21ib0JveClcbiAgICAgICAgcmV0dXJuIFBERkRyb3Bkb3duLm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb0xpc3RCb3gpXG4gICAgICAgIHJldHVybiBQREZPcHRpb25MaXN0Lm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb1RleHQpXG4gICAgICAgIHJldHVybiBQREZUZXh0RmllbGQub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvUmFkaW9CdXR0b24pIHtcbiAgICAgICAgcmV0dXJuIFBERlJhZGlvR3JvdXAub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICB9XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb1NpZ25hdHVyZSkge1xuICAgICAgICByZXR1cm4gUERGU2lnbmF0dXJlLm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xudmFyIHNwbGl0RmllbGROYW1lID0gZnVuY3Rpb24gKGZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgIGlmIChmdWxseVF1YWxpZmllZE5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUERGIGZpZWxkIG5hbWVzIG11c3Qgbm90IGJlIGVtcHR5IHN0cmluZ3MnKTtcbiAgICB9XG4gICAgdmFyIHBhcnRzID0gZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KCcuJyk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gcGFydHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGlmIChwYXJ0c1tpZHhdID09PSAnJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGVyaW9kcyBpbiBQREYgZmllbGQgbmFtZXMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgYXQgbGVhc3Qgb25lIGNoYXJhY3RlcjogXFxcIlwiICsgZnVsbHlRdWFsaWZpZWROYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpXG4gICAgICAgIHJldHVybiB7IG5vblRlcm1pbmFsOiBbXSwgdGVybWluYWw6IHBhcnRzWzBdIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbm9uVGVybWluYWw6IHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDEpLFxuICAgICAgICB0ZXJtaW5hbDogcGFydHNbcGFydHMubGVuZ3RoIC0gMV0sXG4gICAgfTtcbn07XG52YXIgYWRkRmllbGRUb1BhcmVudCA9IGZ1bmN0aW9uIChfYSwgX2IsIHBhcnRpYWxOYW1lKSB7XG4gICAgdmFyIHBhcmVudCA9IF9hWzBdLCBwYXJlbnRSZWYgPSBfYVsxXTtcbiAgICB2YXIgZmllbGQgPSBfYlswXSwgZmllbGRSZWYgPSBfYlsxXTtcbiAgICB2YXIgZW50cmllcyA9IHBhcmVudC5ub3JtYWxpemVkRW50cmllcygpO1xuICAgIHZhciBmaWVsZHMgPSBjcmVhdGVQREZBY3JvRmllbGRzKCdLaWRzJyBpbiBlbnRyaWVzID8gZW50cmllcy5LaWRzIDogZW50cmllcy5GaWVsZHMpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgaWYgKGZpZWxkc1tpZHhdWzBdLmdldFBhcnRpYWxOYW1lKCkgPT09IHBhcnRpYWxOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IocGFydGlhbE5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhcmVudC5hZGRGaWVsZChmaWVsZFJlZik7XG4gICAgZmllbGQuc2V0UGFyZW50KHBhcmVudFJlZik7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRm9ybS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuLi9QREZQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi4vUERGRm9udFwiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHRPcHRpb25MaXN0QXBwZWFyYW5jZVByb3ZpZGVyLCB9IGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUERGSGV4U3RyaW5nLCBQREZTdHJlYW0sIFBERkFjcm9MaXN0Qm94LCBBY3JvQ2hvaWNlRmxhZ3MsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRJc1N1YnNldCwgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydFBvc2l0aXZlLCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIG9wdGlvbiBsaXN0IGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZPcHRpb25MaXN0XV0gZmllbGRzIGFyZSBpbnRlcmFjdGl2ZSBsaXN0cyBvZiBvcHRpb25zLiBUaGUgcHVycG9zZSBvZiBhblxuICogb3B0aW9uIGxpc3QgaXMgdG8gZW5hYmxlIHVzZXJzIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBvcHRpb25zIGZyb20gYSBzZXQgb2ZcbiAqIHBvc3NpYmxlIG9wdGlvbnMuIFVzZXJzIGFyZSBhYmxlIHRvIHNlZSB0aGUgZnVsbCBzZXQgb2Ygb3B0aW9ucyB3aXRob3V0XG4gKiBmaXJzdCBoYXZpbmcgdG8gY2xpY2sgb24gdGhlIGZpZWxkICh0aG91Z2ggc2Nyb2xsaW5nIG1heSBiZSBuZWNlc3NhcnkpLlxuICogQ2xpY2tpbmcgYW4gb3B0aW9uIGluIHRoZSBsaXN0IHdpbGwgY2F1c2UgaXQgdG8gYmUgc2VsZWN0ZWQgYW5kIGRpc3BsYXllZFxuICogd2l0aCBhIGhpZ2hsaWdodGVkIGJhY2tncm91bmQuIFNvbWUgb3B0aW9uIGxpc3RzIGFsbG93IHVzZXJzIHRvIHNlbGVjdFxuICogbW9yZSB0aGFuIG9uZSBvcHRpb24gKHNlZSBbW1BERk9wdGlvbkxpc3QuaXNNdWx0aXNlbGVjdF1dKS5cbiAqL1xudmFyIFBERk9wdGlvbkxpc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk9wdGlvbkxpc3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGT3B0aW9uTGlzdChhY3JvTGlzdEJveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb0xpc3RCb3gsIHJlZiwgZG9jKSB8fCB0aGlzO1xuICAgICAgICBhc3NlcnRJcyhhY3JvTGlzdEJveCwgJ2Fjcm9MaXN0Qm94JywgW1tQREZBY3JvTGlzdEJveCwgJ1BERkFjcm9MaXN0Qm94J11dKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb0xpc3RCb3g7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb25zIGZvciB0aGlzIG9wdGlvbiBsaXN0LiBUaGVzZSBvcHRpb25zIHdpbGxcbiAgICAgKiBiZSBkaXNwbGF5ZWQgdG8gdXNlcnMgd2hvIHZpZXcgdGhpcyBvcHRpb24gbGlzdCBpbiBhIFBERiByZWFkZXIuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25MaXN0LmdldE9wdGlvbnMoKVxuICAgICAqIGNvbnNvbGUubG9nKCdPcHRpb24gTGlzdCBvcHRpb25zOicsIG9wdGlvbnMpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIG9wdGlvbnMgZm9yIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJhd09wdGlvbnMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBvcHRpb25zID0gbmV3IEFycmF5KHJhd09wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHJhd09wdGlvbnNbaWR4XSwgZGlzcGxheSA9IF9hLmRpc3BsYXksIHZhbHVlID0gX2EudmFsdWU7XG4gICAgICAgICAgICBvcHRpb25zW2lkeF0gPSAoZGlzcGxheSAhPT0gbnVsbCAmJiBkaXNwbGF5ICE9PSB2b2lkIDAgPyBkaXNwbGF5IDogdmFsdWUpLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2VsZWN0ZWQgb3B0aW9ucyBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdGhhdFxuICAgICAqIHdlcmUgc2VsZWN0ZWQgYnkgYSBodW1hbiB1c2VyIHZpYSBhIFBERiByZWFkZXIsIG9yIHByb2dyYW1hdGljYWxseSB2aWFcbiAgICAgKiBzb2Z0d2FyZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogY29uc3Qgc2VsZWN0aW9ucyA9IG9wdGlvbkxpc3QuZ2V0U2VsZWN0ZWQoKVxuICAgICAqIGNvbnNvbGUubG9nKCdPcHRpb24gTGlzdCBzZWxlY3Rpb25zOicsIHNlbGVjdGlvbnMpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIHNlbGVjdGVkIG9wdGlvbnMgZm9yIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZ2V0U2VsZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZXMoKTtcbiAgICAgICAgdmFyIHNlbGVjdGVkID0gbmV3IEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFtpZHhdID0gdmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxlY3RlZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGlzdCBvZiBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVGhlc2UgYXJlXG4gICAgICogdGhlIHZhbHVlcyB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlIGZvciB1c2VycyB0byBzZWxlY3Qgd2hlbiB0aGV5IHZpZXcgdGhpc1xuICAgICAqIG9wdGlvbiBsaXN0IGluIGEgUERGIHJlYWRlci4gTm90ZSB0aGF0IHByZWV4aXN0aW5nIG9wdGlvbnMgZm9yIHRoaXNcbiAgICAgKiBvcHRpb24gbGlzdCB3aWxsIGJlIHJlbW92ZWQuIE9ubHkgdGhlIHZhbHVlcyBwYXNzZWQgYXMgYG9wdGlvbnNgIHdpbGwgYmVcbiAgICAgKiBhdmFpbGFibGUgdG8gc2VsZWN0LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdwbGFuZXRzLm9wdGlvbkxpc3QnKVxuICAgICAqIG9wdGlvbkxpc3Quc2V0T3B0aW9ucyhbJ0VhcnRoJywgJ01hcnMnLCAnUGx1dG8nLCAnVmVudXMnXSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIG9wdGlvbiBsaXN0IGFzIGRpcnR5LCBjYXVzaW5nIGl0cyBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB0byBiZSB1cGRhdGVkIHdoZW4gZWl0aGVyIFtbUERGRG9jdW1lbnQuc2F2ZV1dIG9yXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBpcyBjYWxsZWQuIFRoZSB1cGRhdGVkIHN0cmVhbXMgd2lsbFxuICAgICAqIGRpc3BsYXkgdGhlIG9wdGlvbnMgdGhpcyBmaWVsZCBjb250YWlucyBpbnNpZGUgdGhlIHdpZGdldHMgb2YgdGhpcyB0ZXh0XG4gICAgICogZmllbGQgKHdpdGggc2VsZWN0ZWQgb3B0aW9ucyBoaWdobGlnaHRlZCkuXG4gICAgICpcbiAgICAgKiAqKklNUE9SVEFOVDoqKiBUaGUgZGVmYXVsdCBmb250IHVzZWQgdG8gdXBkYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyBpc1xuICAgICAqIFtbU3RhbmRhcmRGb250cy5IZWx2ZXRpY2FdXS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBXaW5BbnNpIGZvbnQuIFRoaXMgbWVhbnNcbiAgICAgKiB0aGF0IGVuY29kaW5nIGVycm9ycyB3aWxsIGJlIHRocm93biBpZiB0aGlzIGZpZWxkIGNvbnRhaW5zIGFueSBvcHRpb25zXG4gICAgICogd2l0aCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIFdpbkFuc2kgY2hhcmFjdGVyIHNldCAodGhlIGxhdGluIGFscGhhYmV0KS5cbiAgICAgKlxuICAgICAqIEVtYmVkZGluZyBhIGN1c3RvbSBmb250IGFuZCBwYXNzaW5nIGl0IHRvXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBvciBbW1BERk9wdGlvbkxpc3QudXBkYXRlQXBwZWFyYW5jZXNdXVxuICAgICAqIGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIHdpdGggY2hhcmFjdGVycyBvdXRzaWRlIHRoZVxuICAgICAqIGxhdGluIGFscGhhYmV0IChhc3N1bWluZyB0aGUgY3VzdG9tIGZvbnQgc3VwcG9ydHMgdGhlbSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5zZXRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucywgJ29wdGlvbnMnLCBbQXJyYXldKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB2YXIgb3B0aW9uT2JqZWN0cyA9IG5ldyBBcnJheShvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvcHRpb25PYmplY3RzW2lkeF0gPSB7IHZhbHVlOiBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uc1tpZHhdKSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldE9wdGlvbnMob3B0aW9uT2JqZWN0cyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgdG8gdGhlIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uIGxpc3QuIFVzZXJzXG4gICAgICogd2lsbCBiZSBhYmxlIHRvIHNlbGVjdCB0aGVzZSB2YWx1ZXMgaW4gYSBQREYgcmVhZGVyLiBJbiBhZGRpdGlvbiB0byB0aGVcbiAgICAgKiB2YWx1ZXMgcGFzc2VkIGFzIGBvcHRpb25zYCwgYW55IHByZWV4aXN0aW5nIG9wdGlvbnMgZm9yIHRoaXMgb3B0aW9uIGxpc3RcbiAgICAgKiB3aWxsIHN0aWxsIGJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgdG8gc2VsZWN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgncm9ja2V0cy5vcHRpb25MaXN0JylcbiAgICAgKiBvcHRpb25MaXN0LmFkZE9wdGlvbnMoWydTYXR1cm4gSVYnLCAnRmFsY29uIEhlYXZ5J10pXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgb3B0aW9uIGxpc3QgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5zZXRPcHRpb25zXV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTmV3IG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuYWRkT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMsICdvcHRpb25zJywgWydzdHJpbmcnLCBBcnJheV0pO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHZhciBvcHRpb25zQXJyID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBbb3B0aW9uc107XG4gICAgICAgIHZhciBleGlzdGluZ09wdGlvbnMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBuZXdPcHRpb25zID0gbmV3IEFycmF5KG9wdGlvbnNBcnIubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9uc0Fyci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG5ld09wdGlvbnNbaWR4XSA9IHsgdmFsdWU6IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zQXJyW2lkeF0pIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0T3B0aW9ucyhleGlzdGluZ09wdGlvbnMuY29uY2F0KG5ld09wdGlvbnMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlbGVjdCBvbmUgb3IgbW9yZSB2YWx1ZXMgZm9yIHRoaXMgb3B0aW9uIGxpc3QuIFRoaXMgb3BlcmF0aW9uIGlzIGFuYWxvZ291c1xuICAgICAqIHRvIGEgaHVtYW4gdXNlciBvcGVuaW5nIHRoZSBvcHRpb24gbGlzdCBpbiBhIFBERiByZWFkZXIgYW5kIGNsaWNraW5nIG9uIG9uZVxuICAgICAqIG9yIG1vcmUgdmFsdWVzIHRvIHNlbGVjdCB0aGVtLiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBzdGF0ZVxuICAgICAqIG9mIHRoZSBvcHRpb24gbGlzdCB0byBpbmRpY2F0ZSB3aGljaCB2YWx1ZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLiBQREZcbiAgICAgKiBsaWJyYXJpZXMgYW5kIHJlYWRlcnMgd2lsbCBiZSBhYmxlIHRvIGV4dHJhY3QgdGhlc2UgdmFsdWVzIGZyb20gdGhlIHNhdmVkXG4gICAgICogZG9jdW1lbnQgYW5kIGRldGVybWluZSB3aGljaCB2YWx1ZXMgd2VyZSBzZWxlY3RlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ2Jlc3Quc3VwZXJoZXJvZXMub3B0aW9uTGlzdCcpXG4gICAgICogb3B0aW9uTGlzdC5zZWxlY3QoWydPbmUgUHVuY2ggTWFuJywgJ0lyb24gTWFuJ10pXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgb3B0aW9uIGxpc3QgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5zZXRPcHRpb25zXV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICogQHBhcmFtIG1lcmdlIFdoZXRoZXIgb3Igbm90IGV4aXN0aW5nIHNlbGVjdGlvbnMgc2hvdWxkIGJlIHByZXNlcnZlZC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbiAob3B0aW9ucywgbWVyZ2UpIHtcbiAgICAgICAgaWYgKG1lcmdlID09PSB2b2lkIDApIHsgbWVyZ2UgPSBmYWxzZTsgfVxuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFsnc3RyaW5nJywgQXJyYXldKTtcbiAgICAgICAgYXNzZXJ0SXMobWVyZ2UsICdtZXJnZScsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgdmFyIG9wdGlvbnNBcnIgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IFtvcHRpb25zXTtcbiAgICAgICAgdmFyIHZhbGlkT3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICBhc3NlcnRJc1N1YnNldChvcHRpb25zQXJyLCAnb3B0aW9uJywgdmFsaWRPcHRpb25zKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICBpZiAob3B0aW9uc0Fyci5sZW5ndGggPiAxIHx8IChvcHRpb25zQXJyLmxlbmd0aCA9PT0gMSAmJiBtZXJnZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlTXVsdGlzZWxlY3QoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVzID0gbmV3IEFycmF5KG9wdGlvbnNBcnIubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9uc0Fyci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhbHVlc1tpZHhdID0gUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbnNBcnJbaWR4XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlcyhleGlzdGluZ1ZhbHVlcy5jb25jYXQodmFsdWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXModmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHNlbGVjdGVkIHZhbHVlcyBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVGhpcyBvcGVyYXRpb24gaXNcbiAgICAgKiBlcXVpdmFsZW50IHRvIHNlbGVjdGluZyBhbiBlbXB0eSBsaXN0LiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGVcbiAgICAgKiB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSBvcHRpb24gbGlzdCB0byBpbmRpY2F0ZSB0aGF0IG5vIHZhbHVlcyBoYXZlIGJlZW5cbiAgICAgKiBzZWxlY3RlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5jbGVhcigpXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgb3B0aW9uIGxpc3QgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5zZXRPcHRpb25zXV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWVzKFtdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZm9udCBzaXplIGZvciB0aGUgdGV4dCBpbiB0aGlzIGZpZWxkLiBUaGVyZSBuZWVkcyB0byBiZSBhXG4gICAgICogZGVmYXVsdCBhcHBlYXJhbmNlIHN0cmluZyAoREEpIHNldCB3aXRoIGEgZm9udCB2YWx1ZSBzcGVjaWZpZWRcbiAgICAgKiBmb3IgdGhpcyB0byB3b3JrLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5zZXRGb250U2l6ZSg0KTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGZvbnQgc2l6ZSB0byBzZXQgdGhlIGZvbnQgdG8uXG4gICAgICovXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmb250IHNpemUgZm9yIHRoaXMgZmllbGQuIExhcmdlciBmb250IHNpemVzIHdpbGwgcmVzdWx0IGluIGxhcmdlclxuICAgICAqIHRleHQgYmVpbmcgZGlzcGxheWVkIHdoZW4gUERGIHJlYWRlcnMgcmVuZGVyIHRoaXMgb3B0aW9uIGxpc3QuIEZvbnQgc2l6ZXNcbiAgICAgKiBtYXkgYmUgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBTdXBwbHlpbmcgYSBuZWdhdGl2ZSBmb250IHNpemVcbiAgICAgKiB3aWxsIGNhdXNlIHRoaXMgbWV0aG9kIHRvIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3Quc2V0Rm9udFNpemUoNClcbiAgICAgKiBvcHRpb25MaXN0LnNldEZvbnRTaXplKDE1LjcpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA+IFRoaXMgbWV0aG9kIGRlcGVuZHMgdXBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBhcHBlYXJhbmNlXG4gICAgICogPiAoYC9EQWApIHN0cmluZy4gSWYgdGhpcyBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBhcHBlYXJhbmNlIHN0cmluZyxcbiAgICAgKiA+IG9yIHRoYXQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYSBmb250IHNpemUgKHZpYSB0aGUgYFRmYCBvcGVyYXRvciksXG4gICAgICogPiB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRleHQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICBhc3NlcnRQb3NpdGl2ZShmb250U2l6ZSwgJ2ZvbnRTaXplJyk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9wdGlvbnMgb2YgdGhpcyBvcHRpb24gbGlzdCBhcmUgYWx3YXlzIGRpc3BsYXllZFxuICAgICAqIGluIGFscGhhYmV0aWNhbCBvcmRlciwgaXJyZXNwZWN0aXZlIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgb3B0aW9uc1xuICAgICAqIHdlcmUgYWRkZWQgdG8gdGhlIG9wdGlvbiBsaXN0LiBTZWUgW1tQREZPcHRpb25MaXN0LmVuYWJsZVNvcnRpbmddXSBhbmRcbiAgICAgKiBbW1BERk9wdGlvbkxpc3QuZGlzYWJsZVNvcnRpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIGlmIChvcHRpb25MaXN0LmlzU29ydGVkKCkpIGNvbnNvbGUubG9nKCdTb3J0aW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgb3B0aW9uIGxpc3QgaXMgc29ydGVkLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmlzU29ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbHdheXMgZGlzcGxheSB0aGUgb3B0aW9ucyBvZiB0aGlzIG9wdGlvbiBsaXN0IGluIGFscGhhYmV0aWNhbCBvcmRlcixcbiAgICAgKiBpcnJlc3BlY3RpdmUgb2YgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zIHdlcmUgYWRkZWQgdG8gdGhpcyBvcHRpb25cbiAgICAgKiBsaXN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmVuYWJsZVNvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmVuYWJsZVNvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWx3YXlzIGRpc3BsYXkgdGhlIG9wdGlvbnMgb2YgdGhpcyBvcHRpb24gbGlzdCBpbiBhbHBoYWJldGljYWxcbiAgICAgKiBvcmRlci4gSW5zdGVhZCwgZGlzcGxheSB0aGUgb3B0aW9ucyBpbiB3aGljaGV2ZXIgb3JkZXIgdGhleSB3ZXJlIGFkZGVkXG4gICAgICogdG8gdGhpcyBvcHRpb24gbGlzdC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZGlzYWJsZVNvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmRpc2FibGVTb3J0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLlNvcnQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIG11bHRpcGxlIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIGZyb20gdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKiBTZWUgW1tQREZPcHRpb25MaXN0LmVuYWJsZU11bHRpc2VsZWN0XV0gYW5kXG4gICAgICogW1tQREZPcHRpb25MaXN0LmRpc2FibGVNdWx0aXNlbGVjdF1dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogaWYgKG9wdGlvbkxpc3QuaXNNdWx0aXNlbGVjdCgpKSBjb25zb2xlLmxvZygnTXVsdGlzZWxlY3QgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuaXNNdWx0aXNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IHVzZXJzIHRvIHNlbGVjdCBtb3JlIHRoYW4gb25lIG9wdGlvbiBmcm9tIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZW5hYmxlTXVsdGlzZWxlY3QoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmVuYWJsZU11bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyB1c2VycyB0byBzZWxlY3QgbW9yZSB0aGFuIG9uZSBvcHRpb24gZnJvbSB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmRpc2FibGVNdWx0aXNlbGVjdCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZGlzYWJsZU11bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb3B0aW9uIHNlbGVjdGVkIGJ5IGEgdXNlciBpcyBzdG9yZWQsIG9yIFwiY29tbWl0dGVkXCIsXG4gICAgICogd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIG9wdGlvbi4gVGhlIGFsdGVybmF0aXZlIGlzIHRoYXQgdGhlIHVzZXInc1xuICAgICAqIHNlbGVjdGlvbiBpcyBzdG9yZWQgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhpcyBvcHRpb24gbGlzdCBmaWVsZCAoYnlcbiAgICAgKiBjbGlja2luZyBvdXRzaWRlIG9mIGl0IC0gb24gYW5vdGhlciBmaWVsZCwgZm9yIGV4YW1wbGUpLiBTZWVcbiAgICAgKiBbW1BERk9wdGlvbkxpc3QuZW5hYmxlU2VsZWN0T25DbGlja11dIGFuZFxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5kaXNhYmxlU2VsZWN0T25DbGlja11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogaWYgKG9wdGlvbkxpc3QuaXNTZWxlY3RPbkNsaWNrKCkpIGNvbnNvbGUubG9nKCdTZWxlY3Qgb24gY2xpY2sgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3Qgb3B0aW9ucyBhcmUgc2VsZWN0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhleSBhcmVcbiAgICAgKiAgICAgICAgICBjbGlja2VkLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmlzU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkNvbW1pdE9uU2VsQ2hhbmdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN0b3JlIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1c2VyIGNsaWNrcyB0aGVcbiAgICAgKiBvcHRpb24uIERvIG5vdCB3YWl0IGZvciB0aGUgdXNlciB0byBsZWF2ZSB0aGlzIG9wdGlvbiBsaXN0IGZpZWxkIChieVxuICAgICAqIGNsaWNraW5nIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmVuYWJsZVNlbGVjdE9uQ2xpY2soKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmVuYWJsZVNlbGVjdE9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV2FpdCB0byBzdG9yZSB0aGUgb3B0aW9uIHNlbGVjdGVkIGJ5IGEgdXNlciB1bnRpbCB0aGV5IGxlYXZlIHRoaXMgb3B0aW9uXG4gICAgICogbGlzdCBmaWVsZCAoYnkgY2xpY2tpbmcgb3V0c2lkZSBvZiBpdCAtIG9uIGFub3RoZXIgZmllbGQsIGZvciBleGFtcGxlKS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5kaXNhYmxlU2VsZWN0T25DbGljaygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZGlzYWJsZVNlbGVjdE9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNob3cgdGhpcyBvcHRpb24gbGlzdCBvbiB0aGUgc3BlY2lmaWVkIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdWJ1bnR1Rm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQodWJ1bnR1Rm9udEJ5dGVzKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmNyZWF0ZU9wdGlvbkxpc3QoJ2Jlc3QuZ3VuZGFtcycpXG4gICAgICogb3B0aW9uTGlzdC5zZXRPcHRpb25zKFsnRXhpYScsICdEeW5hbWVzJywgJ0t5cmlvcycsICdWaXJ0dWUnXSlcbiAgICAgKiBvcHRpb25MaXN0LnNlbGVjdChbJ0V4aWEnLCAnVmlydHVlJ10pXG4gICAgICpcbiAgICAgKiBvcHRpb25MaXN0LmFkZFRvUGFnZShwYWdlLCB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDIwMCxcbiAgICAgKiAgIGhlaWdodDogMTAwLFxuICAgICAqICAgdGV4dENvbG9yOiByZ2IoMSwgMCwgMCksXG4gICAgICogICBiYWNrZ3JvdW5kQ29sb3I6IHJnYigwLCAxLCAwKSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiByZ2IoMCwgMCwgMSksXG4gICAgICogICBib3JkZXJXaWR0aDogMixcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcyg5MCksXG4gICAgICogICBmb250OiB1YnVudHVGb250LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB3aWRnZXQgZm9yIHRoaXMgb3B0aW9uIGxpc3QgZmllbGQuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhpcyBvcHRpb24gbGlzdCB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhpcyBvcHRpb24gbGlzdCB3aWRnZXQuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuYWRkVG9QYWdlID0gZnVuY3Rpb24gKHBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIGlmICghKCd0ZXh0Q29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy50ZXh0Q29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdiYWNrZ3JvdW5kQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgPSByZ2IoMSwgMSwgMSk7XG4gICAgICAgIGlmICghKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYm9yZGVyV2lkdGgnIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDE7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyBvcHRpb24gbGlzdFxuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5jcmVhdGVXaWRnZXQoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwLFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwLFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDIwMCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDEwMCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9lID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9mID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXQod2lkZ2V0UmVmKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHZhciBmb250ID0gKF9nID0gb3B0aW9ucy5mb250KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB0aGlzLmRvYy5nZXRGb3JtKCkuZ2V0RGVmYXVsdEZvbnQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG9wdGlvbiBsaXN0IGhhcyBiZWVuIG1hcmtlZCBhcyBkaXJ0eSwgb3IgaWYgYW55IG9mXG4gICAgICogdGhpcyBvcHRpb24gbGlzdCdzIHdpZGdldHMgZG8gbm90IGhhdmUgYW4gYXBwZWFyYW5jZSBzdHJlYW0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBpZiAob3B0aW9uTGlzdC5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIGNvbnNvbGUubG9nKCdOZWVkcyB1cGRhdGUnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgb3B0aW9uIGxpc3QgbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5pc0RpcnR5KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIGhhc0FwcGVhcmFuY2VzID0gKChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsKSBpbnN0YW5jZW9mIFBERlN0cmVhbTtcbiAgICAgICAgICAgIGlmICghaGFzQXBwZWFyYW5jZXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBvcHRpb24gbGlzdCdzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBvcHRpb24gbGlzdHMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIG9wdGlvbiBsaXN0J3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBnaXZlbiBhcHBlYXJhbmNlIHByb3ZpZGVyLiBJZiBubyBgcHJvdmlkZXJgIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHRcbiAgICAgKiBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBvcHRpb24gbGlzdHMgd2lsbCBiZSB1c2VkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LnVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSwgKGZpZWxkLCB3aWRnZXQsIGZvbnQpID0+IHtcbiAgICAgKiAgIC4uLlxuICAgICAqICAgcmV0dXJuIGRyYXdPcHRpb25MaXN0KC4uLilcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUudXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQocHJvdmlkZXIsICdwcm92aWRlcicsIFtGdW5jdGlvbl0pO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250LCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNDbGVhbigpO1xuICAgIH07XG4gICAgLy8gZ2V0T3B0aW9uKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge31cbiAgICAvLyBnZXRTZWxlY3RlZEluZGljZXMoKTogbnVtYmVyW10ge31cbiAgICAvLyByZW1vdmVPcHRpb25zKG9wdGlvbjogc3RyaW5nIHwgc3RyaW5nW10pIHt9XG4gICAgLy8gcmVtb3ZlSW5kaWNlcyhvcHRpb246IG51bWJlcltdKSB7fVxuICAgIC8vIGRlc2VsZWN0KG9wdGlvbnM6IHN0cmluZyB8IHN0cmluZ1tdKSB7fVxuICAgIC8vIGRlc2VsZWN0SW5kaWNlcyhvcHRpb25JbmRpY2VzOiBudW1iZXJbXSkge31cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGFwUHJvdmlkZXIgPSBwcm92aWRlciAhPT0gbnVsbCAmJiBwcm92aWRlciAhPT0gdm9pZCAwID8gcHJvdmlkZXIgOiBkZWZhdWx0T3B0aW9uTGlzdEFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCwgZm9udCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VXaXRoRm9udCh3aWRnZXQsIGZvbnQsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldE9wdGlvbkxpc3RdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlXG4gICAgICogPiBhbiBpbnN0YW5jZSBvZiBbW1BERk9wdGlvbkxpc3RdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGT3B0aW9uTGlzdF1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb0xpc3RCb3ggYW5kXG4gICAgICogcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb0NvbWJvQm94IFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvTGlzdEJveGAgZm9yIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIG9wdGlvbiBsaXN0IHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3Qub2YgPSBmdW5jdGlvbiAoYWNyb0xpc3RCb3gsIHJlZiwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGT3B0aW9uTGlzdChhY3JvTGlzdEJveCwgcmVmLCBkb2MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9wdGlvbkxpc3Q7XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPcHRpb25MaXN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT3B0aW9uTGlzdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuLi9QREZQYWdlXCI7XG5pbXBvcnQgUERGRmllbGQsIHsgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucywgfSBmcm9tIFwiLi9QREZGaWVsZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQXBwZWFyYW5jZSwgZGVmYXVsdFJhZGlvR3JvdXBBcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZOYW1lLCBQREZIZXhTdHJpbmcsIFBERkRpY3QsIFBERkFjcm9SYWRpb0J1dHRvbiwgQWNyb0J1dHRvbkZsYWdzLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydElzT25lT2YgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIHJhZGlvIGdyb3VwIGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZSYWRpb0dyb3VwXV0gZmllbGRzIGFyZSBjb2xsZWN0aW9ucyBvZiByYWRpbyBidXR0b25zLiBUaGUgcHVycG9zZSBvZiBhXG4gKiByYWRpbyBncm91cCBpcyB0byBlbmFibGUgdXNlcnMgdG8gc2VsZWN0IG9uZSBvcHRpb24gZnJvbSBhIHNldCBvZiBtdXR1YWxseVxuICogZXhjbHVzaXZlIGNob2ljZXMuIEVhY2ggY2hvaWNlIGluIGEgcmFkaW8gZ3JvdXAgaXMgcmVwcmVzZW50ZWQgYnkgYSByYWRpb1xuICogYnV0dG9uLiBSYWRpbyBidXR0b25zIGVhY2ggaGF2ZSB0d28gc3RhdGVzOiBgb25gIGFuZCBgb2ZmYC4gQXQgbW9zdCBvbmVcbiAqIHJhZGlvIGJ1dHRvbiBpbiBhIGdyb3VwIG1heSBiZSBpbiB0aGUgYG9uYCBzdGF0ZSBhdCBhbnkgdGltZS4gVXNlcnMgY2FuXG4gKiBjbGljayBvbiBhIHJhZGlvIGJ1dHRvbiB0byBzZWxlY3QgaXQgKGFuZCB0aGVyZWJ5IGF1dG9tYXRpY2FsbHkgZGVzZWxlY3QgYW55XG4gKiBvdGhlciByYWRpbyBidXR0b24gdGhhdCBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBzZWxlY3RlZCkuIFNvbWUgcmFkaW9cbiAqIGdyb3VwcyBhbGxvdyB1c2VycyB0byB0b2dnbGUgYSBzZWxlY3RlZCByYWRpbyBidXR0b24gYG9mZmAgYnkgY2xpY2tpbmcgb25cbiAqIGl0IChzZWUgW1tQREZSYWRpb0dyb3VwLmlzT2ZmVG9nZ2xlYWJsZV1dKS5cbiAqXG4gKiBOb3RlIHRoYXQgc29tZSByYWRpbyBncm91cHMgYWxsb3cgbXVsdGlwbGUgcmFkaW8gYnV0dG9ucyB0byBiZSBpbiB0aGUgYG9uYFxuICogc3RhdGUgYXQgdGhlIHNhbWUgdHlwZSAqKmlmKiogdGhleSByZXByZXNlbnQgdGhlIHNhbWUgdW5kZXJseWluZyB2YWx1ZSAoc2VlXG4gKiBbW1BERlJhZGlvR3JvdXAuaXNNdXR1YWxseUV4Y2x1c2l2ZV1dKS5cbiAqL1xudmFyIFBERlJhZGlvR3JvdXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlJhZGlvR3JvdXAsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUmFkaW9Hcm91cChhY3JvUmFkaW9CdXR0b24sIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9SYWRpb0J1dHRvbiwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9SYWRpb0J1dHRvbiwgJ2Fjcm9SYWRpb0J1dHRvbicsIFtcbiAgICAgICAgICAgIFtQREZBY3JvUmFkaW9CdXR0b24sICdQREZBY3JvUmFkaW9CdXR0b24nXSxcbiAgICAgICAgXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9SYWRpb0J1dHRvbjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMgZm9yIHRoaXMgcmFkaW8gZ3JvdXAuIEVhY2ggb3B0aW9uIGlzXG4gICAgICogcmVwcmVzZW50ZWQgYnkgYSByYWRpbyBidXR0b24uIFRoZXNlIHJhZGlvIGJ1dHRvbnMgYXJlIGRpc3BsYXllZCBhdFxuICAgICAqIHZhcmlvdXMgbG9jYXRpb25zIGluIHRoZSBkb2N1bWVudCwgcG90ZW50aWFsbHkgb24gZGlmZmVyZW50IHBhZ2VzICh0aG91Z2hcbiAgICAgKiB0eXBpY2FsbHkgdGhleSBhcmUgc3RhY2tlZCBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseSBvbiB0aGUgc2FtZSBwYWdlKS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IHJhZGlvR3JvdXAuZ2V0T3B0aW9ucygpXG4gICAgICogY29uc29sZS5sb2coJ1JhZGlvIEdyb3VwIG9wdGlvbnM6Jywgb3B0aW9ucylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW9ucyBmb3IgdGhpcyByYWRpbyBncm91cC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZXhwb3J0VmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0RXhwb3J0VmFsdWVzKCk7XG4gICAgICAgIGlmIChleHBvcnRWYWx1ZXMpIHtcbiAgICAgICAgICAgIHZhciBleHBvcnRPcHRpb25zID0gbmV3IEFycmF5KGV4cG9ydFZhbHVlcy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZXhwb3J0VmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIGV4cG9ydE9wdGlvbnNbaWR4XSA9IGV4cG9ydFZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleHBvcnRPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvblZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9uVmFsdWVzKCk7XG4gICAgICAgIHZhciBvbk9wdGlvbnMgPSBuZXcgQXJyYXkob25WYWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb25PcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgb25PcHRpb25zW2lkeF0gPSBvblZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb25PcHRpb25zO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZWxlY3RlZCBvcHRpb24gZm9yIHRoaXMgcmFkaW8gZ3JvdXAuIFRoZSBzZWxlY3RlZCBvcHRpb24gaXNcbiAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgcmFkaW8gYnV0dG9uIGluIHRoaXMgZ3JvdXAgdGhhdCBpcyB0dXJuZWQgb24uIEF0IG1vc3RcbiAgICAgKiBvbmUgcmFkaW8gYnV0dG9uIGluIGEgZ3JvdXAgY2FuIGJlIHNlbGVjdGVkLiBJZiBubyBidXR0b25zIGluIHRoaXMgZ3JvdXBcbiAgICAgKiBhcmUgc2VsZWN0ZWQsIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiBjb25zdCBzZWxlY3RlZCA9IHJhZGlvR3JvdXAuZ2V0U2VsZWN0ZWQoKVxuICAgICAqIGNvbnNvbGUubG9nKCdTZWxlY3RlZCByYWRpbyBidXR0b246Jywgc2VsZWN0ZWQpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIHNlbGVjdGVkIG9wdGlvbiBmb3IgdGhpcyByYWRpbyBncm91cC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5nZXRTZWxlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWUoKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBQREZOYW1lLm9mKCdPZmYnKSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBleHBvcnRWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRFeHBvcnRWYWx1ZXMoKTtcbiAgICAgICAgaWYgKGV4cG9ydFZhbHVlcykge1xuICAgICAgICAgICAgdmFyIG9uVmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZXMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9uVmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIGlmIChvblZhbHVlc1tpZHhdID09PSB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydFZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLy8gLy8gVE9ETzogRmlndXJlIG91dCB3aHkgdGhpcyBzZWVtcyB0byBjcmFzaCBBY3JvYmF0LiBNYXliZSBpdCdzIGJlY2F1c2Ugd2VcbiAgICAvLyAvLyAgICAgICBhcmVuJ3QgcmVtb3ZpbmcgdGhlIHdpZGdldCByZWZlcmVuY2UgZnJvbSB0aGUgcGFnZSdzIEFubm90cz9cbiAgICAvLyByZW1vdmVPcHRpb24ob3B0aW9uOiBzdHJpbmcpIHtcbiAgICAvLyAgIGFzc2VydElzKG9wdGlvbiwgJ29wdGlvbicsIFsnc3RyaW5nJ10pO1xuICAgIC8vICAgLy8gVE9ETzogQXNzZXJ0IGlzIHZhbGlkIGBvcHRpb25gIVxuICAgIC8vICAgY29uc3Qgb25WYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPblZhbHVlcygpO1xuICAgIC8vICAgY29uc3QgZXhwb3J0VmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0RXhwb3J0VmFsdWVzKCk7XG4gICAgLy8gICBpZiAoZXhwb3J0VmFsdWVzKSB7XG4gICAgLy8gICAgIGZvciAobGV0IGlkeCA9IDAsIGxlbiA9IGV4cG9ydFZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAvLyAgICAgICBpZiAoZXhwb3J0VmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpID09PSBvcHRpb24pIHtcbiAgICAvLyAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZVdpZGdldChpZHgpO1xuICAgIC8vICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlRXhwb3J0VmFsdWUoaWR4KTtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIGZvciAobGV0IGlkeCA9IDAsIGxlbiA9IG9uVmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgIC8vICAgICAgIGNvbnN0IHZhbHVlID0gb25WYWx1ZXNbaWR4XTtcbiAgICAvLyAgICAgICBpZiAodmFsdWUuZGVjb2RlVGV4dCgpID09PSBvcHRpb24pIHtcbiAgICAvLyAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZVdpZGdldChpZHgpO1xuICAgIC8vICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlRXhwb3J0VmFsdWUoaWR4KTtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gICAgLyoqXG4gICAgICogU2VsZWN0IGFuIG9wdGlvbiBmb3IgdGhpcyByYWRpbyBncm91cC4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzIHRvIGFcbiAgICAgKiBodW1hbiB1c2VyIGNsaWNraW5nIG9uZSBvZiB0aGUgcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIHZpYSBhIFBERlxuICAgICAqIHJlYWRlciB0byB0b2dnbGUgaXQgb24uIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG9mXG4gICAgICogdGhlIHJhZGlvIGdyb3VwIHRvIGluZGljYXRlIHdoaWNoIG9wdGlvbiBoYXMgYmVlbiBzZWxlY3RlZC4gUERGIGxpYnJhcmllc1xuICAgICAqIGFuZCByZWFkZXJzIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IHRoaXMgdmFsdWUgZnJvbSB0aGUgc2F2ZWQgZG9jdW1lbnQgYW5kXG4gICAgICogZGV0ZXJtaW5lIHdoaWNoIG9wdGlvbiB3YXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ2Jlc3Quc3VwZXJoZXJvLnJhZGlvR3JvdXAnKVxuICAgICAqIHJhZGlvR3JvdXAuc2VsZWN0KCdPbmUgUHVuY2ggTWFuJylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHJhZGlvIGdyb3VwIGFzIGRpcnR5LCBjYXVzaW5nIGl0cyBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB0byBiZSB1cGRhdGVkIHdoZW4gZWl0aGVyIFtbUERGRG9jdW1lbnQuc2F2ZV1dIG9yXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBpcyBjYWxsZWQuIFRoZSB1cGRhdGVkIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHdpbGwgZGlzcGxheSBhIGRvdCBpbnNpZGUgdGhlIHdpZGdldCBvZiB0aGlzIGNoZWNrIGJveCBmaWVsZFxuICAgICAqIHRoYXQgcmVwcmVzZW50cyB0aGUgc2VsZWN0ZWQgb3B0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIHRvIGJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9uLCAnb3B0aW9uJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciB2YWxpZE9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihvcHRpb24sICdvcHRpb24nLCB2YWxpZE9wdGlvbnMpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHZhciBvblZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9uVmFsdWVzKCk7XG4gICAgICAgIHZhciBleHBvcnRWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRFeHBvcnRWYWx1ZXMoKTtcbiAgICAgICAgaWYgKGV4cG9ydFZhbHVlcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZXhwb3J0VmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRWYWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCkgPT09IG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZShvblZhbHVlc1tpZHhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvblZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvblZhbHVlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5kZWNvZGVUZXh0KCkgPT09IG9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhciBhbnkgc2VsZWN0ZWQgb3B0aW9uIGZvciB0aGlzIGRyb3Bkb3duLiBUaGlzIHdpbGwgcmVzdWx0IGluIGFsbFxuICAgICAqIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCBiZWluZyB0b2dnbGVkIG9mZi4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGVcbiAgICAgKiB0aGUgdW5kZXJseWluZyBzdGF0ZSBvZiB0aGUgZHJvcGRvd24gdG8gaW5kaWNhdGUgdGhhdCBubyByYWRpbyBidXR0b25zXG4gICAgICogaGF2ZSBiZWVuIHNlbGVjdGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiByYWRpb0dyb3VwLmNsZWFyKClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyByYWRpbyBncm91cCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZSYWRpb0dyb3VwLnNlbGVjdF1dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlKFBERk5hbWUub2YoJ09mZicpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHVzZXJzIGNhbiBjbGljayBvbiByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgdG8gdG9nZ2xlXG4gICAgICogdGhlbSBvZmYuIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGF0IG9uY2UgYSB1c2VyIGNsaWNrcyBvbiBhIHJhZGlvIGJ1dHRvblxuICAgICAqIHRvIHNlbGVjdCBpdCwgdGhlIG9ubHkgd2F5IHRvIGRlc2VsZWN0IGl0IGlzIGJ5IHNlbGVjdGluZyBvbiBhbm90aGVyIHJhZGlvXG4gICAgICogYnV0dG9uIGluIHRoZSBncm91cC4gU2VlIFtbUERGUmFkaW9Hcm91cC5lbmFibGVPZmZUb2dnbGluZ11dIGFuZFxuICAgICAqIFtbUERGUmFkaW9Hcm91cC5kaXNhYmxlT2ZmVG9nZ2xpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIGlmIChyYWRpb0dyb3VwLmlzT2ZmVG9nZ2xlYWJsZSgpKSBjb25zb2xlLmxvZygnT2ZmIHRvZ2dsaW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmlzT2ZmVG9nZ2xlYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9CdXR0b25GbGFncy5Ob1RvZ2dsZVRvT2ZmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IHVzZXJzIHRvIGNsaWNrIG9uIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCB0byB0b2dnbGVcbiAgICAgKiB0aGVtIG9mZi4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuZW5hYmxlT2ZmVG9nZ2xpbmcoKVxuICAgICAqIGBgYFxuICAgICAqID4gKipOT1RFOioqIFRoaXMgZmVhdHVyZSBpcyBkb2N1bWVudGVkIGluIHRoZSBQREYgc3BlY2lmaWNhdGlvblxuICAgICAqID4gKFRhYmxlIDIyNikuIEhvd2V2ZXIsIG1vc3QgUERGIHJlYWRlcnMgZG8gbm90IHJlc3BlY3QgdGhpcyBvcHRpb24gYW5kXG4gICAgICogPiBwcmV2ZW50IHVzZXJzIGZyb20gdG9nZ2xpbmcgcmFkaW8gYnV0dG9ucyBvZmYgZXZlbiB3aGVuIGl0IGlzIGVuYWJsZWQuXG4gICAgICogPiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcgKDkvNi8yMDIwKSBNYWMncyBQcmV2aWV3IHNvZnR3YXJlIGRpZFxuICAgICAqID4gcmVzcGVjdCB0aGUgb3B0aW9uLiBBZG9iZSBBY3JvYmF0LCBGb3hpdCBSZWFkZXIsIGFuZCBHb29nbGUgQ2hyb21lIGRpZFxuICAgICAqID4gbm90LlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmVuYWJsZU9mZlRvZ2dsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0J1dHRvbkZsYWdzLk5vVG9nZ2xlVG9PZmYsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdXNlcnMgZnJvbSBjbGlja2luZyBvbiBzZWxlY3RlZCByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgdG9cbiAgICAgKiB0b2dnbGUgdGhlbSBvZmYuIENsaWNraW5nIG9uIGEgc2VsZWN0ZWQgcmFkaW8gYnV0dG9uIHdpbGwgaGF2ZSBubyBlZmZlY3QuXG4gICAgICogVGhlIG9ubHkgd2F5IHRvIGRlc2VsZWN0IGEgc2VsZWN0ZWQgcmFkaW8gYnV0dG9uIGlzIHRvIGNsaWNrIG9uIGFcbiAgICAgKiBkaWZmZXJlbnQgcmFkaW8gYnV0dG9uIGluIHRoZSBncm91cC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuZGlzYWJsZU9mZlRvZ2dsaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5kaXNhYmxlT2ZmVG9nZ2xpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQnV0dG9uRmxhZ3MuTm9Ub2dnbGVUb09mZiwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuXG4gICAgICogVGhpcyBtZWFucyB0aGF0IHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIHJhZGlvIGJ1dHRvbiwgb25seSB0aGF0IHNwZWNpZmljXG4gICAgICogYnV0dG9uIHdpbGwgYmUgdHVybmVkIG9uLiBFdmVuIGlmIG90aGVyIHJhZGlvIGJ1dHRvbnMgaW4gdGhlIGdyb3VwXG4gICAgICogcmVwcmVzZW50IHRoZSBzYW1lIHZhbHVlLCB0aGV5IHdpbGwgbm90IGJlIGVuYWJsZWQuIFRoZSBhbHRlcm5hdGl2ZSB0b1xuICAgICAqIHRoaXMgaXMgdGhhdCBjbGlja2luZyBhIHJhZGlvIGJ1dHRvbiB3aWxsIHNlbGVjdCB0aGF0IGJ1dHRvbiBhbG9uZyB3aXRoXG4gICAgICogYW55IG90aGVyIHJhZGlvIGJ1dHRvbnMgaW4gdGhlIGdyb3VwIHRoYXQgc2hhcmUgdGhlIHNhbWUgdmFsdWUuIFNlZVxuICAgICAqIFtbUERGUmFkaW9Hcm91cC5lbmFibGVNdXR1YWxFeGNsdXNpb25dXSBhbmRcbiAgICAgKiBbW1BERlJhZGlvR3JvdXAuZGlzYWJsZU11dHVhbEV4Y2x1c2lvbl1dLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiBpZiAocmFkaW9Hcm91cC5pc011dHVhbGx5RXhjbHVzaXZlKCkpIGNvbnNvbGUubG9nKCdNdXR1YWwgZXhjbHVzaW9uIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmlzTXV0dWFsbHlFeGNsdXNpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQnV0dG9uRmxhZ3MuUmFkaW9zSW5Vbmlzb24pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgdXNlciBjbGlja3MgYSByYWRpbyBidXR0b24gaW4gdGhpcyBncm91cCBpdCB3aWxsIGJlIHNlbGVjdGVkLiBJblxuICAgICAqIGFkZGl0aW9uLCBhbnkgb3RoZXIgcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIHRoYXQgc2hhcmUgdGhlIHNhbWVcbiAgICAgKiB1bmRlcmx5aW5nIHZhbHVlIHdpbGwgYWxzbyBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuZW5hYmxlTXV0dWFsRXhjbHVzaW9uKClcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gbXVzdCBiZSBlbmFibGVkIHByaW9yIHRvIGFkZGluZyBvcHRpb25zIHRvIHRoZVxuICAgICAqIHJhZGlvIGdyb3VwLiBJdCBkb2VzIG5vdCBjdXJyZW50bHkgYXBwbHkgcmV0cm9hY3RpdmVseSB0byBleGlzdGluZ1xuICAgICAqIHJhZGlvIGJ1dHRvbnMgaW4gdGhlIGdyb3VwLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmVuYWJsZU11dHVhbEV4Y2x1c2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9CdXR0b25GbGFncy5SYWRpb3NJblVuaXNvbiwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgdXNlciBjbGlja3MgYSByYWRpbyBidXR0b24gaW4gdGhpcyBncm91cCBvbmx5IGl0IHdpbGwgYmUgc2VsZWN0ZWQuXG4gICAgICogTm8gb3RoZXIgcmFkaW8gYnV0dG9ucyBpbiB0aGUgZ3JvdXAgd2lsbCBiZSBzZWxlY3RlZCwgZXZlbiBpZiB0aGV5IHNoYXJlXG4gICAgICogdGhlIHNhbWUgdW5kZXJseWluZyB2YWx1ZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuZGlzYWJsZU11dHVhbEV4Y2x1c2lvbigpXG4gICAgICogYGBgXG4gICAgICogTm90ZSB0aGF0IHRoaXMgb3B0aW9uIG11c3QgYmUgZGlzYWJsZWQgcHJpb3IgdG8gYWRkaW5nIG9wdGlvbnMgdG8gdGhlXG4gICAgICogcmFkaW8gZ3JvdXAuIEl0IGRvZXMgbm90IGN1cnJlbnRseSBhcHBseSByZXRyb2FjdGl2ZWx5IHRvIGV4aXN0aW5nXG4gICAgICogcmFkaW8gYnV0dG9ucyBpbiB0aGUgZ3JvdXAuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuZGlzYWJsZU11dHVhbEV4Y2x1c2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9CdXR0b25GbGFncy5SYWRpb3NJblVuaXNvbiwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBuZXcgcmFkaW8gYnV0dG9uIHRvIHRoaXMgZ3JvdXAgb24gdGhlIHNwZWNpZmllZCBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmNyZWF0ZVJhZGlvR3JvdXAoJ2Jlc3QuZ3VuZGFtJylcbiAgICAgKlxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHdpZHRoOiAyNSxcbiAgICAgKiAgIGhlaWdodDogMjUsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiByYWRpb0dyb3VwLmFkZE9wdGlvblRvUGFnZSgnRXhpYScsIHBhZ2UsIHsgLi4ub3B0aW9ucywgeTogNTAgfSlcbiAgICAgKiByYWRpb0dyb3VwLmFkZE9wdGlvblRvUGFnZSgnRHluYW1lcycsIHBhZ2UsIHsgLi4ub3B0aW9ucywgeTogMTEwIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyByYWRpbyBidXR0b24gd2lkZ2V0IGZvciB0aGlzIHJhZGlvIGdyb3VwIGZpZWxkLlxuICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIG9wdGlvbiB0aGF0IHRoZSByYWRpbyBidXR0b24gd2lkZ2V0IHJlcHJlc2VudHMuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhlIHJhZGlvIGJ1dHRvbiB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhlIHJhZGlvIGJ1dHRvbiB3aWRnZXQuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuYWRkT3B0aW9uVG9QYWdlID0gZnVuY3Rpb24gKG9wdGlvbiwgcGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfajtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9uLCAnb3B0aW9uJywgWydzdHJpbmcnXSk7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyByYWRpbyBidXR0b25cbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwLFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAsXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiA1MCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogNTAsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IChfZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50ZXh0Q29sb3IpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHJnYigwLCAwLCAwKSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogKF9mID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcikgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogcmdiKDEsIDEsIDEpLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IChfZyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJDb2xvcikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogcmdiKDAsIDAsIDApLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfaCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMSxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9qID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGhpZGRlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhpZGRlbixcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UucmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIod2lkZ2V0LmRpY3QpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoaXMgZmllbGRcbiAgICAgICAgdmFyIGFwU3RhdGVWYWx1ZSA9IHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldFdpdGhPcHQod2lkZ2V0UmVmLCBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uKSwgIXRoaXMuaXNNdXR1YWxseUV4Y2x1c2l2ZSgpKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHdpZGdldC5zZXRBcHBlYXJhbmNlU3RhdGUoUERGTmFtZS5vZignT2ZmJykpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBhcFN0YXRlVmFsdWUpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoZSBnaXZlbiBwYWdlXG4gICAgICAgIHBhZ2Uubm9kZS5hZGRBbm5vdCh3aWRnZXRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYW55IG9mIHRoaXMgZ3JvdXAncyByYWRpbyBidXR0b24gd2lkZ2V0cyBkbyBub3QgaGF2ZSBhblxuICAgICAqIGFwcGVhcmFuY2Ugc3RyZWFtIGZvciB0aGVpciBjdXJyZW50IHN0YXRlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogaWYgKHJhZGlvR3JvdXAubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSBjb25zb2xlLmxvZygnTmVlZHMgdXBkYXRlJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIHJhZGlvIGdyb3VwIG5lZWRzIGFuIGFwcGVhcmFuY2UgdXBkYXRlLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VTdGF0ZSgpO1xuICAgICAgICAgICAgdmFyIG5vcm1hbCA9IChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsO1xuICAgICAgICAgICAgaWYgKCEobm9ybWFsIGluc3RhbmNlb2YgUERGRGljdCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoc3RhdGUgJiYgIW5vcm1hbC5oYXMoc3RhdGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgZ3JvdXAncyByYWRpbyBidXR0b24gd2lkZ2V0c1xuICAgICAqIHVzaW5nIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIHJhZGlvIGdyb3Vwcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoKTtcbiAgICB9O1xuICAgIC8vIHJnLnVwZGF0ZUFwcGVhcmFuY2VzKChmaWVsZDogYW55LCB3aWRnZXQ6IGFueSkgPT4ge1xuICAgIC8vICAgYXNzZXJ0KGZpZWxkID09PSByZyk7XG4gICAgLy8gICBhc3NlcnQod2lkZ2V0IGluc3RhbmNlb2YgUERGV2lkZ2V0QW5ub3RhdGlvbik7XG4gICAgLy8gICByZXR1cm4geyBvbjogWy4uLnJlY3RhbmdsZSwgLi4uY2lyY2xlXSwgb2ZmOiBbLi4ucmVjdGFuZ2xlLCAuLi5jaXJjbGVdIH07XG4gICAgLy8gfSk7XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBncm91cCdzIHJhZGlvIGJ1dHRvbiB3aWRnZXRzXG4gICAgICogdXNpbmcgdGhlIGdpdmVuIGFwcGVhcmFuY2UgcHJvdmlkZXIuIElmIG5vIGBwcm92aWRlcmAgaXMgcGFzc2VkLCB0aGVcbiAgICAgKiBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIHJhZGlvIGdyb3VwcyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiByYWRpb0dyb3VwLnVwZGF0ZUFwcGVhcmFuY2VzKChmaWVsZCwgd2lkZ2V0KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiB7XG4gICAgICogICAgIG5vcm1hbDogeyBvbjogZHJhd1JhZGlvQnV0dG9uKC4uLiksIG9mZjogZHJhd1JhZGlvQnV0dG9uKC4uLikgfSxcbiAgICAgKiAgICAgZG93bjogeyBvbjogZHJhd1JhZGlvQnV0dG9uKC4uLiksIG9mZjogZHJhd1JhZGlvQnV0dG9uKC4uLikgfSxcbiAgICAgKiAgIH1cbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBwcm92aWRlciBPcHRpb25hbGx5LCB0aGUgYXBwZWFyYW5jZSBwcm92aWRlciB0byBiZSB1c2VkIGZvclxuICAgICAqICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLnVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHByb3ZpZGVyLCAncHJvdmlkZXInLCBbRnVuY3Rpb25dKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIG9uVmFsdWUgPSB3aWRnZXQuZ2V0T25WYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKCFvblZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgb25WYWx1ZSwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgb25WYWx1ZSwgcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGFwUHJvdmlkZXIgPSBwcm92aWRlciAhPT0gbnVsbCAmJiBwcm92aWRlciAhPT0gdm9pZCAwID8gcHJvdmlkZXIgOiBkZWZhdWx0UmFkaW9Hcm91cEFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZU9uT2ZmV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIG9uVmFsdWUsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldE9wdGlvbkxpc3RdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERk9wdGlvbkxpc3RdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGT3B0aW9uTGlzdF1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb1JhZGlvQnV0dG9uXG4gICAgICogYW5kIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9SYWRpb0J1dHRvbiBUaGUgdW5kZXJseWluZyBgUERGQWNyb1JhZGlvQnV0dG9uYCBmb3IgdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW8gZ3JvdXAuXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyByYWRpbyBncm91cC5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIHJhZGlvIGdyb3VwIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAub2YgPSBmdW5jdGlvbiAoYWNyb1JhZGlvQnV0dG9uLCByZWYsIGRvYykgeyByZXR1cm4gbmV3IFBERlJhZGlvR3JvdXAoYWNyb1JhZGlvQnV0dG9uLCByZWYsIGRvYyk7IH07XG4gICAgcmV0dXJuIFBERlJhZGlvR3JvdXA7XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZSYWRpb0dyb3VwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUmFkaW9Hcm91cC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZGaWVsZCBmcm9tIFwiLi9QREZGaWVsZFwiO1xuaW1wb3J0IHsgUERGQWNyb1NpZ25hdHVyZSB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2lnbmF0dXJlIGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZTaWduYXR1cmVdXSBmaWVsZHMgYXJlIGRpZ2l0YWwgc2lnbmF0dXJlcy4gYHBkZi1saWJgIGRvZXMgbm90XG4gKiBjdXJyZW50bHkgcHJvdmlkZSBhbnkgc3BlY2lhbGl6ZWQgQVBJcyBmb3IgY3JlYXRpbmcgZGlnaXRhbCBzaWduYXR1cmVzIG9yXG4gKiByZWFkaW5nIHRoZSBjb250ZW50cyBvZiBleGlzdGluZyBkaWdpdGFsIHNpZ25hdHVyZXMuXG4gKi9cbnZhciBQREZTaWduYXR1cmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlNpZ25hdHVyZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZTaWduYXR1cmUoYWNyb1NpZ25hdHVyZSwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb1NpZ25hdHVyZSwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9TaWduYXR1cmUsICdhY3JvU2lnbmF0dXJlJywgW1xuICAgICAgICAgICAgW1BERkFjcm9TaWduYXR1cmUsICdQREZBY3JvU2lnbmF0dXJlJ10sXG4gICAgICAgIF0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvU2lnbmF0dXJlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlNpZ25hdHVyZS5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0U2lnbmF0dXJlXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZTaWduYXR1cmVdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGU2lnbmF0dXJlXV0gZnJvbSBhbiBleGlzdGluZyBhY3JvU2lnbmF0dXJlIGFuZFxuICAgICAqIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9TaWduYXR1cmUgVGhlIHVuZGVybHlpbmcgYFBERkFjcm9TaWduYXR1cmVgIGZvciB0aGlzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIHNpZ25hdHVyZSB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZTaWduYXR1cmUub2YgPSBmdW5jdGlvbiAoYWNyb1NpZ25hdHVyZSwgcmVmLCBkb2MpIHsgcmV0dXJuIG5ldyBQREZTaWduYXR1cmUoYWNyb1NpZ25hdHVyZSwgcmVmLCBkb2MpOyB9O1xuICAgIHJldHVybiBQREZTaWduYXR1cmU7XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZTaWduYXR1cmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZTaWduYXR1cmUuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi4vUERGUGFnZVwiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4uL1BERkZvbnRcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBub3JtYWxpemVBcHBlYXJhbmNlLCBkZWZhdWx0VGV4dEZpZWxkQXBwZWFyYW5jZVByb3ZpZGVyLCB9IGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUmljaFRleHRGaWVsZFJlYWRFcnJvciwgRXhjZWVkZWRNYXhMZW5ndGhFcnJvciwgSW52YWxpZE1heExlbmd0aEVycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IEltYWdlQWxpZ25tZW50IH0gZnJvbSBcIi4uL2ltYWdlL2FsaWdubWVudFwiO1xuaW1wb3J0IHsgVGV4dEFsaWdubWVudCB9IGZyb20gXCIuLi90ZXh0L2FsaWdubWVudFwiO1xuaW1wb3J0IHsgUERGSGV4U3RyaW5nLCBQREZTdHJlYW0sIFBERkFjcm9UZXh0LCBBY3JvVGV4dEZsYWdzLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0SXNPbmVPZiwgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydFBvc2l0aXZlLCBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkLCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgdGV4dCBmaWVsZCBvZiBhIFtbUERGRm9ybV1dLlxuICpcbiAqIFtbUERGVGV4dEZpZWxkXV0gZmllbGRzIGFyZSBib3hlcyB0aGF0IGRpc3BsYXkgdGV4dCBlbnRlcmVkIGJ5IHRoZSB1c2VyLiBUaGVcbiAqIHB1cnBvc2Ugb2YgYSB0ZXh0IGZpZWxkIGlzIHRvIGVuYWJsZSB1c2VycyB0byBlbnRlciB0ZXh0IG9yIHZpZXcgdGV4dCB2YWx1ZXNcbiAqIGluIHRoZSBkb2N1bWVudCBwcmVmaWxsZWQgYnkgc29mdHdhcmUuIFVzZXJzIGNhbiBjbGljayBvbiBhIHRleHQgZmllbGQgYW5kXG4gKiBpbnB1dCB0ZXh0IHZpYSB0aGVpciBrZXlib2FyZC4gU29tZSB0ZXh0IGZpZWxkcyBhbGxvdyBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0XG4gKiB0byBiZSBlbnRlcmVkIChzZWUgW1tQREZUZXh0RmllbGQuaXNNdWx0aWxpbmVdXSkuXG4gKi9cbnZhciBQREZUZXh0RmllbGQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlRleHRGaWVsZCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZUZXh0RmllbGQoYWNyb1RleHQsIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9UZXh0LCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb1RleHQsICdhY3JvVGV4dCcsIFtbUERGQWNyb1RleHQsICdQREZBY3JvVGV4dCddXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9UZXh0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGV4dCB0aGF0IHRoaXMgZmllbGQgY29udGFpbnMuIFRoaXMgdGV4dCBpcyB2aXNpYmxlIHRvIHVzZXJzIHdob1xuICAgICAqIHZpZXcgdGhpcyBmaWVsZCBpbiBhIFBERiByZWFkZXIuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGNvbnN0IHRleHQgPSB0ZXh0RmllbGQuZ2V0VGV4dCgpXG4gICAgICogY29uc29sZS5sb2coJ1RleHQgZmllbGQgY29udGVudHM6JywgdGV4dClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBpZiB0aGlzIHRleHQgZmllbGQgY29udGFpbnMgbm8gdW5kZXJseWluZyB2YWx1ZSwgYHVuZGVmaW5lZGBcbiAgICAgKiB3aWxsIGJlIHJldHVybmVkLiBUZXh0IGZpZWxkcyBtYXkgYWxzbyBjb250YWluIGFuIHVuZGVybHlpbmcgdmFsdWUgdGhhdFxuICAgICAqIGlzIHNpbXBseSBhbiBlbXB0eSBzdHJpbmcgKGAnJ2ApLiBUaGlzIGRldGFpbCBpcyBsYXJnZWx5IGlycmVsZXZhbnQgZm9yXG4gICAgICogbW9zdCBhcHBsaWNhdGlvbnMuIEluIGdlbmVyYWwsIHlvdSdsbCB3YW50IHRvIHRyZWF0IGJvdGggY2FzZXMgdGhlIHNhbWVcbiAgICAgKiB3YXkgYW5kIHNpbXBseSBjb25zaWRlciB0aGUgdGV4dCBmaWVsZCB0byBiZSBlbXB0eS4gSW4gZWl0aGVyIGNhc2UsIHRoZVxuICAgICAqIHRleHQgZmllbGQgd2lsbCBhcHBlYXIgZW1wdHkgdG8gdXNlcnMgd2hlbiB2aWV3ZWQgaW4gYSBQREYgcmVhZGVyLlxuICAgICAqXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgdGhpcyBpcyBhIHJpY2ggdGV4dCBmaWVsZC4gYHBkZi1saWJgIGRvZXMgbm90XG4gICAgICogc3VwcG9ydCByZWFkaW5nIHJpY2ggdGV4dCBmaWVsZHMuIE5vciBkbyBtb3N0IFBERiByZWFkZXJzIGFuZCB3cml0ZXJzLlxuICAgICAqIFJpY2ggdGV4dCBmaWVsZHMgYXJlIGJhc2VkIG9uIFhGQSAoWE1MIEZvcm1zIEFyY2hpdGVjdHVyZSkuIFJlbGF0aXZlbHkgZmV3XG4gICAgICogUERGcyB1c2UgcmljaCB0ZXh0IGZpZWxkcyBvciBYRkEuIFVubGlrZSBQREYgaXRzZWxmLCBYRkEgaXMgbm90IGFuIElTT1xuICAgICAqIHN0YW5kYXJkLiBYRkEgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBQREYgMi4wOlxuICAgICAqICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWEZBXG4gICAgICogKiBodHRwOi8vYmxvZy5wZGZzaGFyZWZvcm1zLmNvbS9wZGYtMi0wLXJlbGVhc2UtYmlkLWZhcmV3ZWxsLXhmYS1mb3Jtcy9cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB0ZXh0IGNvbnRhaW5lZCBpbiB0aGlzIHRleHQgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZSgpO1xuICAgICAgICBpZiAoIXZhbHVlICYmIHRoaXMuaXNSaWNoRm9ybWF0dGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSaWNoVGV4dEZpZWxkUmVhZEVycm9yKHRoaXMuZ2V0TmFtZSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZhbHVlLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgdGV4dCBmb3IgdGhpcyBmaWVsZC4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzIHRvIGEgaHVtYW4gdXNlclxuICAgICAqIGNsaWNraW5nIG9uIHRoZSB0ZXh0IGZpZWxkIGluIGEgUERGIHJlYWRlciBhbmQgdHlwaW5nIGluIHRleHQgdmlhIHRoZWlyXG4gICAgICoga2V5Ym9hcmQuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSB0ZXh0IGZpZWxkXG4gICAgICogdG8gaW5kaWNhdGUgd2hhdCB0ZXh0IGhhcyBiZWVuIHNldC4gUERGIGxpYnJhcmllcyBhbmQgcmVhZGVycyB3aWxsIGJlIGFibGVcbiAgICAgKiB0byBleHRyYWN0IHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBzYXZlZCBkb2N1bWVudCBhbmQgZGV0ZXJtaW5lIHdoYXQgdGV4dFxuICAgICAqIHdhcyBzZXQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdiZXN0LnN1cGVyaGVyby50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuc2V0VGV4dCgnT25lIFB1bmNoIE1hbicpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LCBjYXVzaW5nIGl0cyBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB0byBiZSB1cGRhdGVkIHdoZW4gZWl0aGVyIFtbUERGRG9jdW1lbnQuc2F2ZV1dIG9yXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBpcyBjYWxsZWQuIFRoZSB1cGRhdGVkIHN0cmVhbXMgd2lsbFxuICAgICAqIGRpc3BsYXkgdGhlIHRleHQgdGhpcyBmaWVsZCBjb250YWlucyBpbnNpZGUgdGhlIHdpZGdldHMgb2YgdGhpcyB0ZXh0XG4gICAgICogZmllbGQuXG4gICAgICpcbiAgICAgKiAqKklNUE9SVEFOVDoqKiBUaGUgZGVmYXVsdCBmb250IHVzZWQgdG8gdXBkYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyBpc1xuICAgICAqIFtbU3RhbmRhcmRGb250cy5IZWx2ZXRpY2FdXS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBXaW5BbnNpIGZvbnQuIFRoaXMgbWVhbnNcbiAgICAgKiB0aGF0IGVuY29kaW5nIGVycm9ycyB3aWxsIGJlIHRocm93biBpZiB0aGlzIGZpZWxkIGNvbnRhaW5zIHRleHQgb3V0c2lkZVxuICAgICAqIHRoZSBXaW5BbnNpIGNoYXJhY3RlciBzZXQgKHRoZSBsYXRpbiBhbHBoYWJldCkuXG4gICAgICpcbiAgICAgKiBFbWJlZGRpbmcgYSBjdXN0b20gZm9udCBhbmQgcGFzc2luZyBpdCB0b1xuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gb3IgW1tQREZUZXh0RmllbGQudXBkYXRlQXBwZWFyYW5jZXNdXVxuICAgICAqIGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIHdpdGggY2hhcmFjdGVycyBvdXRzaWRlIHRoZVxuICAgICAqIGxhdGluIGFscGhhYmV0IChhc3N1bWluZyB0aGUgY3VzdG9tIGZvbnQgc3VwcG9ydHMgdGhlbSkuXG4gICAgICpcbiAgICAgKiBJZiB0aGlzIGlzIGEgcmljaCB0ZXh0IGZpZWxkLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0YW5kYXJkIHRleHRcbiAgICAgKiBmaWVsZCBpbiBvcmRlciB0byBzZXQgdGhlIHRleHQuIGBwZGYtbGliYCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgcmljaFxuICAgICAqIHRleHQgc3RyaW5ncy4gTm9yIGRvIG1vc3QgUERGIHJlYWRlcnMgYW5kIHdyaXRlcnMuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLmdldFRleHRdXSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCByaWNoIHRleHQgZmllbGRzIGFuZFxuICAgICAqIHRoZWlyIGRlcHJlY2F0aW9uIGluIFBERiAyLjAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0aGlzIGZpZWxkIHNob3VsZCBjb250YWluLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuc2V0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHRleHQsICd0ZXh0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBtYXhMZW5ndGggPSB0aGlzLmdldE1heExlbmd0aCgpO1xuICAgICAgICBpZiAobWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgdGV4dCAmJiB0ZXh0Lmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IodGV4dC5sZW5ndGgsIG1heExlbmd0aCwgdGhpcy5nZXROYW1lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlUmljaEZvcm1hdHRpbmcoKTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlKFBERkhleFN0cmluZy5mcm9tVGV4dCh0ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFsaWdubWVudCBmb3IgdGhpcyB0ZXh0IGZpZWxkLiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlXG4gICAgICoganVzdGlmaWNhdGlvbiBvZiB0aGUgdGV4dCB3aGVuIGl0IGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBpbiBQREYgcmVhZGVycy5cbiAgICAgKiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgYWxpZ25tZW50czogbGVmdCwgY2VudGVyLCBhbmQgcmlnaHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogY29uc3QgYWxpZ25tZW50ID0gdGV4dEZpZWxkLmdldEFsaWdubWVudCgpXG4gICAgICogaWYgKGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5MZWZ0KSBjb25zb2xlLmxvZygnVGV4dCBpcyBsZWZ0IGp1c3RpZmllZCcpXG4gICAgICogaWYgKGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5DZW50ZXIpIGNvbnNvbGUubG9nKCdUZXh0IGlzIGNlbnRlcmVkJylcbiAgICAgKiBpZiAoYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LlJpZ2h0KSBjb25zb2xlLmxvZygnVGV4dCBpcyByaWdodCBqdXN0aWZpZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBhbGlnbm1lbnQgb2YgdGhpcyB0ZXh0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZ2V0QWxpZ25tZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcXVhZGRpbmcgPSB0aGlzLmFjcm9GaWVsZC5nZXRRdWFkZGluZygpO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgcmV0dXJuIChxdWFkZGluZyA9PT0gMCA/IFRleHRBbGlnbm1lbnQuTGVmdFxuICAgICAgICAgICAgOiBxdWFkZGluZyA9PT0gMSA/IFRleHRBbGlnbm1lbnQuQ2VudGVyXG4gICAgICAgICAgICAgICAgOiBxdWFkZGluZyA9PT0gMiA/IFRleHRBbGlnbm1lbnQuUmlnaHRcbiAgICAgICAgICAgICAgICAgICAgOiBUZXh0QWxpZ25tZW50LkxlZnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBhbGlnbm1lbnQgZm9yIHRoaXMgdGV4dCBmaWVsZC4gVGhpcyB3aWxsIGRldGVybWluZSB0aGVcbiAgICAgKiBqdXN0aWZpY2F0aW9uIG9mIHRoZSB0ZXh0IHdoZW4gaXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGluIFBERiByZWFkZXJzLlxuICAgICAqIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBhbGlnbm1lbnRzOiBsZWZ0LCBjZW50ZXIsIGFuZCByaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKlxuICAgICAqIC8vIFRleHQgd2lsbCBiZSBsZWZ0IGp1c3RpZmllZCB3aGVuIGRpc3BsYXllZFxuICAgICAqIHRleHRGaWVsZC5zZXRBbGlnbm1lbnQoVGV4dEFsaWdubWVudC5MZWZ0KVxuICAgICAqXG4gICAgICogLy8gVGV4dCB3aWxsIGJlIGNlbnRlcmVkIHdoZW4gZGlzcGxheWVkXG4gICAgICogdGV4dEZpZWxkLnNldEFsaWdubWVudChUZXh0QWxpZ25tZW50LkNlbnRlcilcbiAgICAgKlxuICAgICAqIC8vIFRleHQgd2lsbCBiZSByaWdodCBqdXN0aWZpZWQgd2hlbiBkaXNwbGF5ZWRcbiAgICAgKiB0ZXh0RmllbGQuc2V0QWxpZ25tZW50KFRleHRBbGlnbm1lbnQuUmlnaHQpXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqIEBwYXJhbSBhbGlnbm1lbnQgVGhlIGFsaWdubWVudCBmb3IgdGhpcyB0ZXh0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuc2V0QWxpZ25tZW50ID0gZnVuY3Rpb24gKGFsaWdubWVudCkge1xuICAgICAgICBhc3NlcnRJc09uZU9mKGFsaWdubWVudCwgJ2FsaWdubWVudCcsIFRleHRBbGlnbm1lbnQpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFF1YWRkaW5nKGFsaWdubWVudCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQuIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgbWF4aW11bVxuICAgICAqIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHR5cGVkIGludG8gdGhpcyBmaWVsZCBieSB0aGUgdXNlci4gSWZcbiAgICAgKiB0aGlzIGZpZWxkIGRvZXMgbm90IGhhdmUgYSBtYXhpbXVtIGxlbmd0aCwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBjb25zdCBtYXhMZW5ndGggPSB0ZXh0RmllbGQuZ2V0TWF4TGVuZ3RoKClcbiAgICAgKiBpZiAobWF4TGVuZ3RoID09PSB1bmRlZmluZWQpIGNvbnNvbGUubG9nKCdObyBtYXggbGVuZ3RoJylcbiAgICAgKiBlbHNlIGNvbnNvbGUubG9nKGBNYXggbGVuZ3RoIGlzICR7bWF4TGVuZ3RofWApXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGlzIGZpZWxkLCBvclxuICAgICAqICAgICAgICAgIGB1bmRlZmluZWRgIGlmIG5vIGxpbWl0IGV4aXN0cy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmdldE1heExlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmdldE1heExlbmd0aCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkLiBUaGlzIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnNcbiAgICAgKiB0aGF0IGNhbiBiZSB0eXBlZCBpbnRvIHRoaXMgZmllbGQgYnkgdGhlIHVzZXIuIFRoaXMgYWxzbyBsaW1pdHMgdGhlIGxlbmd0aFxuICAgICAqIG9mIHRoZSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXS4gVGhpcyBsaW1pdFxuICAgICAqIGNhbiBiZSByZW1vdmVkIGJ5IHBhc3NpbmcgYHVuZGVmaW5lZGAgYXMgYG1heExlbmd0aGAuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICpcbiAgICAgKiAvLyBBbGxvdyBiZXR3ZWVuIDAgYW5kIDUgY2hhcmFjdGVycyB0byBiZSBlbnRlcmVkXG4gICAgICogdGV4dEZpZWxkLnNldE1heExlbmd0aCg1KVxuICAgICAqXG4gICAgICogLy8gQWxsb3cgYW55IG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIGVudGVyZWRcbiAgICAgKiB0ZXh0RmllbGQuc2V0TWF4TGVuZ3RoKHVuZGVmaW5lZClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICogQHBhcmFtIG1heExlbmd0aCBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoaXMgZmllbGQsIG9yXG4gICAgICogICAgICAgICAgICAgICAgICBgdW5kZWZpbmVkYCB0byByZW1vdmUgdGhlIGxpbWl0LlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuc2V0TWF4TGVuZ3RoID0gZnVuY3Rpb24gKG1heExlbmd0aCkge1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG1heExlbmd0aCwgJ21heExlbmd0aCcsIDAsIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZU1heExlbmd0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRleHQgPSB0aGlzLmdldFRleHQoKTtcbiAgICAgICAgICAgIGlmICh0ZXh0ICYmIHRleHQubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRNYXhMZW5ndGhFcnJvcih0ZXh0Lmxlbmd0aCwgbWF4TGVuZ3RoLCB0aGlzLmdldE5hbWUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRNYXhMZW5ndGgobWF4TGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgdGhpcyB0ZXh0IGZpZWxkLiBUaGlzIGFsbG93cyBhbnkgbnVtYmVyIG9mXG4gICAgICogY2hhcmFjdGVycyB0byBiZSB0eXBlZCBpbnRvIHRoaXMgZmllbGQgYnkgdGhlIHVzZXIuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLnJlbW92ZU1heExlbmd0aCgpXG4gICAgICogYGBgXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgYHVuZGVmaW5lZGAgdG9cbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRNYXhMZW5ndGhdXS5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnJlbW92ZU1heExlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVNYXhMZW5ndGgoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc3BsYXkgYW4gaW1hZ2UgaW5zaWRlIHRoZSBib3VuZHMgb2YgdGhpcyB0ZXh0IGZpZWxkJ3Mgd2lkZ2V0cy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwbmdJbWFnZSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZyguLi4pXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLnNldEltYWdlKHBuZ0ltYWdlKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGFwcGVhcmFuY2VzIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyB0ZXh0IGZpZWxkJ3Mgd2lkZ2V0cy5cbiAgICAgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnNldEltYWdlID0gZnVuY3Rpb24gKGltYWdlKSB7XG4gICAgICAgIHZhciBmaWVsZEFsaWdubWVudCA9IHRoaXMuZ2V0QWxpZ25tZW50KCk7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB2YXIgYWxpZ25tZW50ID0gZmllbGRBbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuQ2VudGVyID8gSW1hZ2VBbGlnbm1lbnQuQ2VudGVyXG4gICAgICAgICAgICA6IGZpZWxkQWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LlJpZ2h0ID8gSW1hZ2VBbGlnbm1lbnQuUmlnaHRcbiAgICAgICAgICAgICAgICA6IEltYWdlQWxpZ25tZW50LkxlZnQ7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdHJlYW1SZWYgPSB0aGlzLmNyZWF0ZUltYWdlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIGltYWdlLCBhbGlnbm1lbnQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlcyh3aWRnZXQsIHsgbm9ybWFsOiBzdHJlYW1SZWYgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNDbGVhbigpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmb250IHNpemUgZm9yIHRoaXMgZmllbGQuIExhcmdlciBmb250IHNpemVzIHdpbGwgcmVzdWx0IGluIGxhcmdlclxuICAgICAqIHRleHQgYmVpbmcgZGlzcGxheWVkIHdoZW4gUERGIHJlYWRlcnMgcmVuZGVyIHRoaXMgdGV4dCBmaWVsZC4gRm9udCBzaXplc1xuICAgICAqIG1heSBiZSBpbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFN1cHBseWluZyBhIG5lZ2F0aXZlIGZvbnQgc2l6ZVxuICAgICAqIHdpbGwgY2F1c2UgdGhpcyBtZXRob2QgdG8gdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5zZXRGb250U2l6ZSg0KVxuICAgICAqIHRleHRGaWVsZC5zZXRGb250U2l6ZSgxNS43KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPiBUaGlzIG1ldGhvZCBkZXBlbmRzIHVwb24gdGhlIGV4aXN0ZW5jZSBvZiBhIGRlZmF1bHQgYXBwZWFyYW5jZVxuICAgICAqID4gKGAvREFgKSBzdHJpbmcuIElmIHRoaXMgZmllbGQgZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgYXBwZWFyYW5jZSBzdHJpbmcsXG4gICAgICogPiBvciB0aGF0IHN0cmluZyBkb2VzIG5vdCBjb250YWluIGEgZm9udCBzaXplICh2aWEgdGhlIGBUZmAgb3BlcmF0b3IpLFxuICAgICAqID4gdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvbnRTaXplIFRoZSBmb250IHNpemUgdG8gYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0ZXh0IGluIHRoaXMgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICBhc3NlcnRQb3NpdGl2ZShmb250U2l6ZSwgJ2ZvbnRTaXplJyk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgZWFjaCBsaW5lIG9mIHRleHQgaXMgc2hvd24gb24gYSBuZXcgbGluZSB3aGVuIHRoaXNcbiAgICAgKiBmaWVsZCBpcyBkaXNwbGF5ZWQgaW4gYSBQREYgcmVhZGVyLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhhdCBhbGwgbGluZXMgb2ZcbiAgICAgKiB0ZXh0IGFyZSBtZXJnZWQgb250byBhIHNpbmdsZSBsaW5lIHdoZW4gZGlzcGxheWVkLiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5lbmFibGVNdWx0aWxpbmVdXSBhbmQgW1tQREZUZXh0RmllbGQuZGlzYWJsZU11bHRpbGluZV1dLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5pc011bHRpbGluZSgpKSBjb25zb2xlLmxvZygnTXVsdGlsaW5lIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSBtdWx0aWxpbmUgdGV4dCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmlzTXVsdGlsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLk11bHRpbGluZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IGVhY2ggbGluZSBvZiB0ZXh0IG9uIGEgbmV3IGxpbmUgd2hlbiB0aGlzIGZpZWxkIGlzIGRpc3BsYXllZCBpbiBhXG4gICAgICogUERGIHJlYWRlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlTXVsdGlsaW5lKClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVNdWx0aWxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuTXVsdGlsaW5lLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc3BsYXkgZWFjaCBsaW5lIG9mIHRleHQgb24gdGhlIHNhbWUgbGluZSB3aGVuIHRoaXMgZmllbGQgaXMgZGlzcGxheWVkXG4gICAgICogaW4gYSBQREYgcmVhZGVyLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlTXVsdGlsaW5lKClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlTXVsdGlsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLk11bHRpbGluZSwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBpcyBhIHBhc3N3b3JkIHRleHQgZmllbGQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmllbGRcbiAgICAgKiBpcyBpbnRlbmRlZCBmb3Igc3RvcmluZyBhIHNlY3VyZSBwYXNzd29yZC4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuZW5hYmxlUGFzc3dvcmRdXSBhbmQgW1tQREZUZXh0RmllbGQuZGlzYWJsZVBhc3N3b3JkXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzUGFzc3dvcmQoKSkgY29uc29sZS5sb2coJ1Bhc3N3b3JkIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSBwYXNzd29yZCB0ZXh0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5QYXNzd29yZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgdGV4dCBmaWVsZCBpcyBpbnRlbmRlZCBmb3Igc3RvcmluZyBhIHNlY3VyZSBwYXNzd29yZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVQYXNzd29yZCgpXG4gICAgICogYGBgXG4gICAgICogVmFsdWVzIGVudGVyZWQgaW50byBwYXNzd29yZCB0ZXh0IGZpZWxkcyBzaG91bGQgbm90IGJlIGRpc3BsYXllZCBvbiB0aGVcbiAgICAgKiBzY3JlZW4gYnkgUERGIHJlYWRlcnMuIE1vc3QgUERGIHJlYWRlcnMgd2lsbCBkaXNwbGF5IHRoZSB2YWx1ZSBhc1xuICAgICAqIGFzdGVyaXNrcyBvciBidWxsZXRzLiBQREYgcmVhZGVycyBzaG91bGQgbmV2ZXIgc3RvcmUgdmFsdWVzIGVudGVyZWQgYnkgdGhlXG4gICAgICogdXNlciBpbnRvIHBhc3N3b3JkIHRleHQgZmllbGRzLiBTaW1pbGFybHksIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90XG4gICAgICogd3JpdGUgZGF0YSB0byBhIHBhc3N3b3JkIHRleHQgZmllbGQuXG4gICAgICpcbiAgICAgKiAqKlBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgY2F1c2UgZW50ZXJlZCB2YWx1ZXMgdG8gYmVcbiAgICAgKiBlbmNyeXB0ZWQgb3Igc2VjdXJlZCBpbiBhbnkgd2F5ISBJdCBzaW1wbHkgc2V0cyBhIGZsYWcgdGhhdCBQREYgc29mdHdhcmVcbiAgICAgKiBhbmQgcmVhZGVycyBjYW4gYWNjZXNzIHRvIGRldGVybWluZSB0aGUgX3B1cnBvc2VfIG9mIHRoaXMgZmllbGQuKipcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZVBhc3N3b3JkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5QYXNzd29yZCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgdGV4dCBmaWVsZCBpcyAqKm5vdCoqIGludGVuZGVkIGZvciBzdG9yaW5nIGEgc2VjdXJlXG4gICAgICogcGFzc3dvcmQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVQYXNzd29yZCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlUGFzc3dvcmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLlBhc3N3b3JkLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29udGVudHMgb2YgdGhpcyB0ZXh0IGZpZWxkIHJlcHJlc2VudCBhIGZpbGUgcGF0aC5cbiAgICAgKiBTZWUgW1tQREZUZXh0RmllbGQuZW5hYmxlRmlsZVNlbGVjdGlvbl1dIGFuZFxuICAgICAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVGaWxlU2VsZWN0aW9uXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5pc0ZpbGVTZWxlY3RvcigpKSBjb25zb2xlLmxvZygnSXMgYSBmaWxlIHNlbGVjdG9yJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkIHNob3VsZCBjb250YWluIGZpbGUgcGF0aHMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc0ZpbGVTZWxlY3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5GaWxlU2VsZWN0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyB0ZXh0IGZpZWxkIGlzIGludGVuZGVkIHRvIHN0b3JlIGEgZmlsZSBwYXRoLiBUaGVcbiAgICAgKiBjb250ZW50cyBvZiB0aGUgZmlsZSBzdG9yZWQgYXQgdGhhdCBwYXRoIHNob3VsZCBiZSBzdWJtaXR0ZWQgYXMgdGhlIHZhbHVlXG4gICAgICogb2YgdGhlIGZpZWxkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVGaWxlU2VsZWN0aW9uKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZUZpbGVTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkZpbGVTZWxlY3QsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIHRleHQgZmllbGQgaXMgKipub3QqKiBpbnRlbmRlZCB0byBzdG9yZSBhIGZpbGUgcGF0aC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlRmlsZVNlbGVjdGlvbigpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlRmlsZVNlbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuRmlsZVNlbGVjdCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGlzIGZpZWxkIHNob3VsZCBiZSBzcGVsbCBjaGVja2VkXG4gICAgICogYnkgUERGIHJlYWRlcnMuIFNlZSBbW1BERlRleHRGaWVsZC5lbmFibGVTcGVsbENoZWNraW5nXV0gYW5kXG4gICAgICogW1tQREZUZXh0RmllbGQuZGlzYWJsZVNwZWxsQ2hlY2tpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzU3BlbGxDaGVja2VkKCkpIGNvbnNvbGUubG9nKCdTcGVsbCBjaGVja2luZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkIHNob3VsZCBiZSBzcGVsbCBjaGVja2VkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNTcGVsbENoZWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLkRvTm90U3BlbGxDaGVjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBQREYgcmVhZGVycyB0byBzcGVsbCBjaGVjayB0aGUgdGV4dCBlbnRlcmVkIGluIHRoaXMgZmllbGQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlU3BlbGxDaGVja2luZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVTcGVsbENoZWNraW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5Eb05vdFNwZWxsQ2hlY2ssIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyBQREYgcmVhZGVycyB0byBzcGVsbCBjaGVjayB0aGUgdGV4dCBlbnRlcmVkIGluIHRoaXMgZmllbGQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGlzYWJsZVNwZWxsQ2hlY2tpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGlzYWJsZVNwZWxsQ2hlY2tpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkRvTm90U3BlbGxDaGVjaywgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBQREYgcmVhZGVycyBzaG91bGQgYWxsb3cgdGhlIHVzZXIgdG8gc2Nyb2xsIHRoZSB0ZXh0XG4gICAgICogZmllbGQgd2hlbiBpdHMgY29udGVudHMgZG8gbm90IGZpdCB3aXRoaW4gdGhlIGZpZWxkJ3MgdmlldyBib3VuZHMuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLmVuYWJsZVNjcm9sbGluZ11dIGFuZCBbW1BERlRleHRGaWVsZC5kaXNhYmxlU2Nyb2xsaW5nXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzU2Nyb2xsYWJsZSgpKSBjb25zb2xlLmxvZygnU2Nyb2xsaW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBmaWVsZCBpcyBzY3JvbGxhYmxlIGluIFBERiByZWFkZXJzLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNTY3JvbGxhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5Eb05vdFNjcm9sbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBQREYgcmVhZGVycyB0byBwcmVzZW50IGEgc2Nyb2xsIGJhciB0byB0aGUgdXNlciB3aGVuIHRoZSBjb250ZW50c1xuICAgICAqIG9mIHRoaXMgdGV4dCBmaWVsZCBkbyBub3QgZml0IHdpdGhpbiBpdHMgdmlldyBib3VuZHMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZVNjcm9sbGluZygpXG4gICAgICogYGBgXG4gICAgICogQSBob3Jpem9udGFsIHNjcm9sbCBiYXIgc2hvdWxkIGJlIHNob3duIGZvciBzaW5nbGVsaW5lIGZpZWxkcy4gQSB2ZXJ0aWNhbFxuICAgICAqIHNjcm9sbCBiYXIgc2hvdWxkIGJlIHNob3duIGZvciBtdWx0aWxpbmUgZmllbGRzLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlU2Nyb2xsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5Eb05vdFNjcm9sbCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IFBERiByZWFkZXJzIHRvIHByZXNlbnQgYSBzY3JvbGwgYmFyIHRvIHRoZSB1c2VyIHdoZW4gdGhlXG4gICAgICogY29udGVudHMgb2YgdGhpcyB0ZXh0IGZpZWxkIGRvIG5vdCBmaXQgd2l0aGluIGl0cyB2aWV3IGJvdW5kcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGlzYWJsZVNjcm9sbGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlU2Nyb2xsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5Eb05vdFNjcm9sbCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIGEgY29tYmVkIHRleHQgZmllbGQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmllbGRcbiAgICAgKiBpcyBzcGxpdCBpbnRvIGBuYCBlcXVhbCBzaXplIGNlbGxzIHdpdGggb25lIGNoYXJhY3RlciBpbiBlYWNoICh3aGVyZSBgbmBcbiAgICAgKiBpcyBlcXVhbCB0byB0aGUgbWF4IGxlbmd0aCBvZiB0aGUgdGV4dCBmaWVsZCkuIFRoZSByZXN1bHQgaXMgdGhhdCBhbGxcbiAgICAgKiBjaGFyYWN0ZXJzIGluIHRoaXMgZmllbGQgYXJlIGRpc3BsYXllZCBhbiBlcXVhbCBkaXN0YW5jZSBhcGFydCBmcm9tIG9uZVxuICAgICAqIGFub3RoZXIuIFNlZSBbW1BERlRleHRGaWVsZC5lbmFibGVDb21iaW5nXV0gYW5kXG4gICAgICogW1tQREZUZXh0RmllbGQuZGlzYWJsZUNvbWJpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzQ29tYmVkKCkpIGNvbnNvbGUubG9nKCdDb21iaW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCBpbiBvcmRlciBmb3IgYSB0ZXh0IGZpZWxkIHRvIGJlIGNvbWJlZCwgdGhlIGZvbGxvd2luZyBtdXN0IGJlXG4gICAgICogdHJ1ZSAoaW4gYWRkaXRpb24gdG8gZW5hYmxpbmcgY29tYmluZyk6XG4gICAgICogKiBJdCBtdXN0IG5vdCBiZSBhIG11bHRpbGluZSBmaWVsZCAoc2VlIFtbUERGVGV4dEZpZWxkLmlzTXVsdGlsaW5lXV0pXG4gICAgICogKiBJdCBtdXN0IG5vdCBiZSBhIHBhc3N3b3JkIGZpZWxkIChzZWUgW1tQREZUZXh0RmllbGQuaXNQYXNzd29yZF1dKVxuICAgICAqICogSXQgbXVzdCBub3QgYmUgYSBmaWxlIHNlbGVjdG9yIGZpZWxkIChzZWUgW1tQREZUZXh0RmllbGQuaXNGaWxlU2VsZWN0b3JdXSlcbiAgICAgKiAqIEl0IG11c3QgaGF2ZSBhIG1heCBsZW5ndGggZGVmaW5lZCAoc2VlIFtbUERGVGV4dEZpZWxkLnNldE1heExlbmd0aF1dKVxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgaXMgY29tYmVkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNDb21iZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLkNvbWIpICYmXG4gICAgICAgICAgICAhdGhpcy5pc011bHRpbGluZSgpICYmXG4gICAgICAgICAgICAhdGhpcy5pc1Bhc3N3b3JkKCkgJiZcbiAgICAgICAgICAgICF0aGlzLmlzRmlsZVNlbGVjdG9yKCkgJiZcbiAgICAgICAgICAgIHRoaXMuZ2V0TWF4TGVuZ3RoKCkgIT09IHVuZGVmaW5lZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTcGxpdCB0aGlzIGZpZWxkIGludG8gYG5gIGVxdWFsIHNpemUgY2VsbHMgd2l0aCBvbmUgY2hhcmFjdGVyIGluIGVhY2hcbiAgICAgKiAod2hlcmUgYG5gIGlzIGVxdWFsIHRvIHRoZSBtYXggbGVuZ3RoIG9mIHRoZSB0ZXh0IGZpZWxkKS4gVGhpcyB3aWxsIGNhdXNlXG4gICAgICogYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGZpZWxkIHRvIGJlIGRpc3BsYXllZCBhbiBlcXVhbCBkaXN0YW5jZSBhcGFydCBmcm9tXG4gICAgICogb25lIGFub3RoZXIuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZUNvbWJpbmcoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gY2FsbGluZyB0aGlzIG1ldGhvZCwgdGV4dCBmaWVsZHMgbXVzdCBoYXZlIGEgbWF4IGxlbmd0aFxuICAgICAqIGRlZmluZWQgaW4gb3JkZXIgdG8gYmUgY29tYmVkIChzZWUgW1tQREZUZXh0RmllbGQuc2V0TWF4TGVuZ3RoXV0pLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBhbHNvIGNhbGwgdGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzIGludGVybmFsbHk6XG4gICAgICogKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlTXVsdGlsaW5lXV1cbiAgICAgKiAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVQYXNzd29yZF1dXG4gICAgICogKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlRmlsZVNlbGVjdGlvbl1dXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVDb21iaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5nZXRNYXhMZW5ndGgoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgbXNnID0gXCJQREZUZXh0RmllbGRzIG11c3QgaGF2ZSBhIG1heCBsZW5ndGggaW4gb3JkZXIgdG8gYmUgY29tYmVkXCI7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZU11bHRpbGluZSgpO1xuICAgICAgICB0aGlzLmRpc2FibGVQYXNzd29yZCgpO1xuICAgICAgICB0aGlzLmRpc2FibGVGaWxlU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkNvbWIsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVHVybiBvZmYgY29tYmluZyBmb3IgdGhpcyB0ZXh0IGZpZWxkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlQ29tYmluZygpXG4gICAgICogYGBgXG4gICAgICogU2VlIFtbUERGVGV4dEZpZWxkLmlzQ29tYmVkXV0gYW5kIFtbUERGVGV4dEZpZWxkLmVuYWJsZUNvbWJpbmddXSBmb3IgbW9yZVxuICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgY29tYmluZyBpcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVDb21iaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkNvbWIsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgdGV4dCBmaWVsZCBjb250YWlucyByaWNoIHRleHQuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLmVuYWJsZVJpY2hGb3JtYXR0aW5nXV0gYW5kXG4gICAgICogW1tQREZUZXh0RmllbGQuZGlzYWJsZVJpY2hGb3JtYXR0aW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5pc1JpY2hGb3JtYXR0ZWQoKSkgY29uc29sZS5sb2coJ1JpY2ggZm9ybWF0dGluZyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkIGNvbnRhaW5zIHJpY2ggdGV4dC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmlzUmljaEZvcm1hdHRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5SaWNoVGV4dCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgZmllbGQgY29udGFpbnMgWEZBIGRhdGEgLSBvciByaWNoIHRleHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZVJpY2hGb3JtYXR0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgYHBkZi1saWJgIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBvciB3cml0aW5nIHJpY2ggdGV4dCBmaWVsZHMuXG4gICAgICogTm9yIGRvIG1vc3QgUERGIHJlYWRlcnMgYW5kIHdyaXRlcnMuIFJpY2ggdGV4dCBmaWVsZHMgYXJlIGJhc2VkIG9uIFhGQVxuICAgICAqIChYTUwgRm9ybXMgQXJjaGl0ZWN0dXJlKS4gUmVsYXRpdmVseSBmZXcgUERGcyB1c2UgcmljaCB0ZXh0IGZpZWxkcyBvciBYRkEuXG4gICAgICogVW5saWtlIFBERiBpdHNlbGYsIFhGQSBpcyBub3QgYW4gSVNPIHN0YW5kYXJkLiBYRkEgaGFzIGJlZW4gZGVwcmVjYXRlZCBpblxuICAgICAqIFBERiAyLjA6XG4gICAgICogKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YRkFcbiAgICAgKiAqIGh0dHA6Ly9ibG9nLnBkZnNoYXJlZm9ybXMuY29tL3BkZi0yLTAtcmVsZWFzZS1iaWQtZmFyZXdlbGwteGZhLWZvcm1zL1xuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlUmljaEZvcm1hdHRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLlJpY2hUZXh0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBpcyBhIHN0YW5kYXJkIHRleHQgZmllbGQgdGhhdCBkb2VzIG5vdCBYRkEgZGF0YSAocmljaFxuICAgICAqIHRleHQpLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlUmljaEZvcm1hdHRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGlzYWJsZVJpY2hGb3JtYXR0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5SaWNoVGV4dCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGlzIHRleHQgZmllbGQgb24gdGhlIHNwZWNpZmllZCBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHVidW50dUZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KHVidW50dUZvbnRCeXRlcylcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmNyZWF0ZVRleHRGaWVsZCgnYmVzdC5ndW5kYW0nKVxuICAgICAqIHRleHRGaWVsZC5zZXRUZXh0KCdFeGlhJylcbiAgICAgKlxuICAgICAqIHRleHRGaWVsZC5hZGRUb1BhZ2UocGFnZSwge1xuICAgICAqICAgeDogNTAsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHdpZHRoOiAyMDAsXG4gICAgICogICBoZWlnaHQ6IDEwMCxcbiAgICAgKiAgIHRleHRDb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgYmFja2dyb3VuZENvbG9yOiByZ2IoMCwgMSwgMCksXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAsIDAsIDEpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoOTApLFxuICAgICAqICAgZm9udDogdWJ1bnR1Rm9udCxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgd2lkZ2V0IGZvciB0aGlzIHRleHQgZmllbGQuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhpcyB0ZXh0IGZpZWxkIHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGlzIHRleHQgZmllbGQgd2lkZ2V0LlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuYWRkVG9QYWdlID0gZnVuY3Rpb24gKHBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIGlmICghKCd0ZXh0Q29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy50ZXh0Q29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdiYWNrZ3JvdW5kQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgPSByZ2IoMSwgMSwgMSk7XG4gICAgICAgIGlmICghKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYm9yZGVyV2lkdGgnIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDE7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyB0ZXh0IGZpZWxkXG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldCh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDAsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAsXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogNTAsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IG9wdGlvbnMudGV4dENvbG9yLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfZSA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDAsXG4gICAgICAgICAgICByb3RhdGU6IChfZiA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgaGlkZGVuOiBvcHRpb25zLmhpZGRlbixcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UucmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIod2lkZ2V0LmRpY3QpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoaXMgZmllbGRcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuYWRkV2lkZ2V0KHdpZGdldFJlZik7XG4gICAgICAgIC8vIFNldCBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIHdpZGdldFxuICAgICAgICB2YXIgZm9udCA9IChfZyA9IG9wdGlvbnMuZm9udCkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdGhpcy5kb2MuZ2V0Rm9ybSgpLmdldERlZmF1bHRGb250KCk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoZSBnaXZlbiBwYWdlXG4gICAgICAgIHBhZ2Uubm9kZS5hZGRBbm5vdCh3aWRnZXRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyB0ZXh0IGZpZWxkIGhhcyBiZWVuIG1hcmtlZCBhcyBkaXJ0eSwgb3IgaWYgYW55IG9mXG4gICAgICogdGhpcyB0ZXh0IGZpZWxkJ3Mgd2lkZ2V0cyBkbyBub3QgaGF2ZSBhbiBhcHBlYXJhbmNlIHN0cmVhbS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkgY29uc29sZS5sb2coJ05lZWRzIHVwZGF0ZScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyB0ZXh0IGZpZWxkIG5lZWRzIGFuIGFwcGVhcmFuY2UgdXBkYXRlLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5pc0RpcnR5KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIGhhc0FwcGVhcmFuY2VzID0gKChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsKSBpbnN0YW5jZW9mIFBERlN0cmVhbTtcbiAgICAgICAgICAgIGlmICghaGFzQXBwZWFyYW5jZXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyB0ZXh0IGZpZWxkJ3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIHRleHQgZmllbGRzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIHRleHQgZmllbGQncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGdpdmVuIGFwcGVhcmFuY2UgcHJvdmlkZXIuIElmIG5vIGBwcm92aWRlcmAgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdFxuICAgICAqIGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIHRleHQgZmllbGRzIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC51cGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EsIChmaWVsZCwgd2lkZ2V0LCBmb250KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiBkcmF3VGV4dEZpZWxkKC4uLilcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250LCBwcm92aWRlcikge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBmb250LCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHRUZXh0RmllbGRBcHBlYXJhbmNlUHJvdmlkZXI7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlcyA9IG5vcm1hbGl6ZUFwcGVhcmFuY2UoYXBQcm92aWRlcih0aGlzLCB3aWRnZXQsIGZvbnQpKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlV2l0aEZvbnQod2lkZ2V0LCBmb250LCBhcHBlYXJhbmNlcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRm9ybS5nZXRUZXh0RmllbGRdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERlRleHRGaWVsZF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZUZXh0RmllbGRdXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9UZXh0IGFuZCByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvVGV4dCBUaGUgdW5kZXJseWluZyBgUERGQWNyb1RleHRgIGZvciB0aGlzIHRleHQgZmllbGQuXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyB0ZXh0IGZpZWxkLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgdGV4dCBmaWVsZCB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQub2YgPSBmdW5jdGlvbiAoYWNyb1RleHQsIHJlZiwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGVGV4dEZpZWxkKGFjcm9UZXh0LCByZWYsIGRvYyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGVGV4dEZpZWxkO1xufShQREZGaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGVGV4dEZpZWxkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGVGV4dEZpZWxkLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduLCBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZHJhd0NoZWNrQm94LCByb3RhdGVJblBsYWNlLCBkcmF3UmFkaW9CdXR0b24sIGRyYXdCdXR0b24sIGRyYXdUZXh0RmllbGQsIGRyYXdPcHRpb25MaXN0LCB9IGZyb20gXCIuLi9vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyByZ2IsIGNvbXBvbmVudHNUb0NvbG9yLCBzZXRGaWxsaW5nQ29sb3IsIGdyYXlzY2FsZSwgY215aywgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyByZWR1Y2VSb3RhdGlvbiwgYWRqdXN0RGltc0ZvclJvdGF0aW9uIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgbGF5b3V0TXVsdGlsaW5lVGV4dCwgbGF5b3V0Q29tYmVkVGV4dCwgbGF5b3V0U2luZ2xlbGluZVRleHQsIH0gZnJvbSBcIi4uL3RleHQvbGF5b3V0XCI7XG5pbXBvcnQgeyBUZXh0QWxpZ25tZW50IH0gZnJvbSBcIi4uL3RleHQvYWxpZ25tZW50XCI7XG5pbXBvcnQgeyBzZXRGb250QW5kU2l6ZSB9IGZyb20gXCIuLi9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGZpbmRMYXN0TWF0Y2ggfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKioqKioqKioqKioqKioqKioqKiogQXBwZWFyYW5jZSBQcm92aWRlciBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgdmFyIG5vcm1hbGl6ZUFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgIGlmICgnbm9ybWFsJyBpbiBhcHBlYXJhbmNlKVxuICAgICAgICByZXR1cm4gYXBwZWFyYW5jZTtcbiAgICByZXR1cm4geyBub3JtYWw6IGFwcGVhcmFuY2UgfTtcbn07XG4vLyBFeGFtcGxlczpcbi8vICAgYC9IZWx2IDEyIFRmYCAtPiBbJy9IZWx2IDEyIFRmJywgJ0hlbHYnLCAnMTInXVxuLy8gICBgL0hlQm8gOC4wMCBUZmAgLT4gWycvSGVCbyA4IFRmJywgJ0hlQm8nLCAnOC4wMCddXG52YXIgdGZSZWdleCA9IC9cXC8oW15cXDBcXHRcXG5cXGZcXHJcXCBdKylbXFwwXFx0XFxuXFxmXFxyXFwgXSsoXFxkKlxcLlxcZCt8XFxkKylbXFwwXFx0XFxuXFxmXFxyXFwgXStUZi87XG52YXIgZ2V0RGVmYXVsdEZvbnRTaXplID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICB2YXIgZGEgPSAoX2EgPSBmaWVsZC5nZXREZWZhdWx0QXBwZWFyYW5jZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB2YXIgZGFNYXRjaCA9IChfYiA9IGZpbmRMYXN0TWF0Y2goZGEsIHRmUmVnZXgpLm1hdGNoKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXTtcbiAgICB2YXIgZGVmYXVsdEZvbnRTaXplID0gTnVtYmVyKGRhTWF0Y2hbMl0pO1xuICAgIHJldHVybiBpc0Zpbml0ZShkZWZhdWx0Rm9udFNpemUpID8gZGVmYXVsdEZvbnRTaXplIDogdW5kZWZpbmVkO1xufTtcbi8vIEV4YW1wbGVzOlxuLy8gICBgMC4zIGdgIC0+IFsnMC4zJywgJ2cnXVxuLy8gICBgMC4zIDEgLjMgcmdgIC0+IFsnMC4zJywgJzEnLCAnLjMnLCAncmcnXVxuLy8gICBgMC4zIDEgLjMgMCBrYCAtPiBbJzAuMycsICcxJywgJy4zJywgJzAnLCAnayddXG52YXIgY29sb3JSZWdleCA9IC8oXFxkKlxcLlxcZCt8XFxkKylbXFwwXFx0XFxuXFxmXFxyXFwgXSooXFxkKlxcLlxcZCt8XFxkKyk/W1xcMFxcdFxcblxcZlxcclxcIF0qKFxcZCpcXC5cXGQrfFxcZCspP1tcXDBcXHRcXG5cXGZcXHJcXCBdKihcXGQqXFwuXFxkK3xcXGQrKT9bXFwwXFx0XFxuXFxmXFxyXFwgXSsoZ3xyZ3xrKS87XG52YXIgZ2V0RGVmYXVsdENvbG9yID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBkYSA9IChfYSA9IGZpZWxkLmdldERlZmF1bHRBcHBlYXJhbmNlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIHZhciBkYU1hdGNoID0gZmluZExhc3RNYXRjaChkYSwgY29sb3JSZWdleCkubWF0Y2g7XG4gICAgdmFyIF9iID0gZGFNYXRjaCAhPT0gbnVsbCAmJiBkYU1hdGNoICE9PSB2b2lkIDAgPyBkYU1hdGNoIDogW10sIGMxID0gX2JbMV0sIGMyID0gX2JbMl0sIGMzID0gX2JbM10sIGM0ID0gX2JbNF0sIGNvbG9yU3BhY2UgPSBfYls1XTtcbiAgICBpZiAoY29sb3JTcGFjZSA9PT0gJ2cnICYmIGMxKSB7XG4gICAgICAgIHJldHVybiBncmF5c2NhbGUoTnVtYmVyKGMxKSk7XG4gICAgfVxuICAgIGlmIChjb2xvclNwYWNlID09PSAncmcnICYmIGMxICYmIGMyICYmIGMzKSB7XG4gICAgICAgIHJldHVybiByZ2IoTnVtYmVyKGMxKSwgTnVtYmVyKGMyKSwgTnVtYmVyKGMzKSk7XG4gICAgfVxuICAgIGlmIChjb2xvclNwYWNlID09PSAnaycgJiYgYzEgJiYgYzIgJiYgYzMgJiYgYzQpIHtcbiAgICAgICAgcmV0dXJuIGNteWsoTnVtYmVyKGMxKSwgTnVtYmVyKGMyKSwgTnVtYmVyKGMzKSwgTnVtYmVyKGM0KSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xudmFyIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGZpZWxkLCBjb2xvciwgZm9udCwgZm9udFNpemUpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKGZvbnRTaXplID09PSB2b2lkIDApIHsgZm9udFNpemUgPSAwOyB9XG4gICAgdmFyIGRhID0gW1xuICAgICAgICBzZXRGaWxsaW5nQ29sb3IoY29sb3IpLnRvU3RyaW5nKCksXG4gICAgICAgIHNldEZvbnRBbmRTaXplKChfYSA9IGZvbnQgPT09IG51bGwgfHwgZm9udCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9udC5uYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnZHVtbXlfX25vb3AnLCBmb250U2l6ZSkudG9TdHJpbmcoKSxcbiAgICBdLmpvaW4oJ1xcbicpO1xuICAgIGZpZWxkLnNldERlZmF1bHRBcHBlYXJhbmNlKGRhKTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHRDaGVja0JveEFwcGVhcmFuY2VQcm92aWRlciA9IGZ1bmN0aW9uIChjaGVja0JveCwgd2lkZ2V0KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcihjaGVja0JveC5hY3JvRmllbGQpO1xuICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2EgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9kID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9kLndpZHRoLCBoZWlnaHQgPSBfZC5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gKF9iID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBibGFjaztcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgZG93bkJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSwgMC44KTtcbiAgICAvLyBVcGRhdGUgY29sb3JcbiAgICB2YXIgdGV4dENvbG9yID0gKF9jID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yKSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHdpZGdldCwgdGV4dENvbG9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKGNoZWNrQm94LmFjcm9GaWVsZCwgdGV4dENvbG9yKTtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHg6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHk6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoLFxuICAgICAgICB0aGlja25lc3M6IDEuNSxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIG1hcmtDb2xvcjogdGV4dENvbG9yLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbm9ybWFsOiB7XG4gICAgICAgICAgICBvbjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3Q2hlY2tCb3goX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogdHJ1ZSB9KSkpLFxuICAgICAgICAgICAgb2ZmOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdDaGVja0JveChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvciwgZmlsbGVkOiBmYWxzZSB9KSkpLFxuICAgICAgICB9LFxuICAgICAgICBkb3duOiB7XG4gICAgICAgICAgICBvbjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3Q2hlY2tCb3goX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBkb3duQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IHRydWUgfSkpKSxcbiAgICAgICAgICAgIG9mZjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3Q2hlY2tCb3goX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBkb3duQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IGZhbHNlIH0pKSksXG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHRSYWRpb0dyb3VwQXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKHJhZGlvR3JvdXAsIHdpZGdldCkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIC8vIFRoZSBgL0RBYCBlbnRyeSBjYW4gYmUgYXQgdGhlIHdpZGdldCBvciBmaWVsZCBsZXZlbCAtIHNvIHdlIGhhbmRsZSBib3RoXG4gICAgdmFyIHdpZGdldENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkQ29sb3IgPSBnZXREZWZhdWx0Q29sb3IocmFkaW9Hcm91cC5hY3JvRmllbGQpO1xuICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2EgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9kID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9kLndpZHRoLCBoZWlnaHQgPSBfZC5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gKF9iID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBibGFjaztcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgZG93bkJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSwgMC44KTtcbiAgICAvLyBVcGRhdGUgY29sb3JcbiAgICB2YXIgdGV4dENvbG9yID0gKF9jID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yKSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHdpZGdldCwgdGV4dENvbG9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHJhZGlvR3JvdXAuYWNyb0ZpZWxkLCB0ZXh0Q29sb3IpO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgeDogd2lkdGggLyAyLFxuICAgICAgICB5OiBoZWlnaHQgLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIGRvdENvbG9yOiB0ZXh0Q29sb3IsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBub3JtYWw6IHtcbiAgICAgICAgICAgIG9uOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdSYWRpb0J1dHRvbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvciwgZmlsbGVkOiB0cnVlIH0pKSksXG4gICAgICAgICAgICBvZmY6IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd1JhZGlvQnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IGZhbHNlIH0pKSksXG4gICAgICAgIH0sXG4gICAgICAgIGRvd246IHtcbiAgICAgICAgICAgIG9uOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdSYWRpb0J1dHRvbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IGRvd25CYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogdHJ1ZSB9KSkpLFxuICAgICAgICAgICAgb2ZmOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdSYWRpb0J1dHRvbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IGRvd25CYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogZmFsc2UgfSkpKSxcbiAgICAgICAgfSxcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdEJ1dHRvbkFwcGVhcmFuY2VQcm92aWRlciA9IGZ1bmN0aW9uIChidXR0b24sIHdpZGdldCwgZm9udCkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcihidXR0b24uYWNyb0ZpZWxkKTtcbiAgICB2YXIgd2lkZ2V0Rm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZShidXR0b24uYWNyb0ZpZWxkKTtcbiAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgIHZhciBhcCA9IHdpZGdldC5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgdmFyIGNhcHRpb25zID0gYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldENhcHRpb25zKCk7XG4gICAgdmFyIG5vcm1hbFRleHQgPSAoX2EgPSBjYXB0aW9ucyA9PT0gbnVsbCB8fCBjYXB0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FwdGlvbnMubm9ybWFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB2YXIgZG93blRleHQgPSAoX2MgPSAoX2IgPSBjYXB0aW9ucyA9PT0gbnVsbCB8fCBjYXB0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FwdGlvbnMuZG93bikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbm9ybWFsVGV4dCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJyc7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gKF9kID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldFJvdGF0aW9uKCkpO1xuICAgIHZhciBfZiA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKSwgd2lkdGggPSBfZi53aWR0aCwgaGVpZ2h0ID0gX2YuaGVpZ2h0O1xuICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgdmFyIGJsYWNrID0gcmdiKDAsIDAsIDApO1xuICAgIHZhciBib3JkZXJDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCb3JkZXJDb2xvcigpKTtcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgZG93bkJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSwgMC44KTtcbiAgICB2YXIgYm91bmRzID0ge1xuICAgICAgICB4OiBib3JkZXJXaWR0aCxcbiAgICAgICAgeTogYm9yZGVyV2lkdGgsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoICogMixcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCAqIDIsXG4gICAgfTtcbiAgICB2YXIgbm9ybWFsTGF5b3V0ID0gbGF5b3V0U2luZ2xlbGluZVRleHQobm9ybWFsVGV4dCwge1xuICAgICAgICBhbGlnbm1lbnQ6IFRleHRBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgfSk7XG4gICAgdmFyIGRvd25MYXlvdXQgPSBsYXlvdXRTaW5nbGVsaW5lVGV4dChkb3duVGV4dCwge1xuICAgICAgICBhbGlnbm1lbnQ6IFRleHRBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgfSk7XG4gICAgLy8gVXBkYXRlIGZvbnQgc2l6ZSBhbmQgY29sb3JcbiAgICB2YXIgZm9udFNpemUgPSBNYXRoLm1pbihub3JtYWxMYXlvdXQuZm9udFNpemUsIGRvd25MYXlvdXQuZm9udFNpemUpO1xuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2UgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IgfHwgd2lkZ2V0Rm9udFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSh3aWRnZXQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UoYnV0dG9uLmFjcm9GaWVsZCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICB4OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB5OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIHRleHRDb2xvcjogdGV4dENvbG9yLFxuICAgICAgICBmb250OiBmb250Lm5hbWUsXG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vcm1hbDogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3QnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLCB0ZXh0TGluZXM6IFtub3JtYWxMYXlvdXQubGluZV0gfSkpKSxcbiAgICAgICAgZG93bjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3QnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogZG93bkJhY2tncm91bmRDb2xvciwgdGV4dExpbmVzOiBbZG93bkxheW91dC5saW5lXSB9KSkpLFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBkZWZhdWx0VGV4dEZpZWxkQXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKHRleHRGaWVsZCwgd2lkZ2V0LCBmb250KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIC8vIFRoZSBgL0RBYCBlbnRyeSBjYW4gYmUgYXQgdGhlIHdpZGdldCBvciBmaWVsZCBsZXZlbCAtIHNvIHdlIGhhbmRsZSBib3RoXG4gICAgdmFyIHdpZGdldENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkQ29sb3IgPSBnZXREZWZhdWx0Q29sb3IodGV4dEZpZWxkLmFjcm9GaWVsZCk7XG4gICAgdmFyIHdpZGdldEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkRm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUodGV4dEZpZWxkLmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciB0ZXh0ID0gKF9hID0gdGV4dEZpZWxkLmdldFRleHQoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gKF9iID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldFJvdGF0aW9uKCkpO1xuICAgIHZhciBfZSA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKSwgd2lkdGggPSBfZS53aWR0aCwgaGVpZ2h0ID0gX2UuaGVpZ2h0O1xuICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgdmFyIGJsYWNrID0gcmdiKDAsIDAsIDApO1xuICAgIHZhciBib3JkZXJDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCb3JkZXJDb2xvcigpKTtcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgdGV4dExpbmVzO1xuICAgIHZhciBmb250U2l6ZTtcbiAgICB2YXIgcGFkZGluZyA9IHRleHRGaWVsZC5pc0NvbWJlZCgpID8gMCA6IDE7XG4gICAgdmFyIGJvdW5kcyA9IHtcbiAgICAgICAgeDogYm9yZGVyV2lkdGggKyBwYWRkaW5nLFxuICAgICAgICB5OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSAoYm9yZGVyV2lkdGggKyBwYWRkaW5nKSAqIDIsXG4gICAgfTtcbiAgICBpZiAodGV4dEZpZWxkLmlzTXVsdGlsaW5lKCkpIHtcbiAgICAgICAgdmFyIGxheW91dCA9IGxheW91dE11bHRpbGluZVRleHQodGV4dCwge1xuICAgICAgICAgICAgYWxpZ25tZW50OiB0ZXh0RmllbGQuZ2V0QWxpZ25tZW50KCksXG4gICAgICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnQ6IGZvbnQsXG4gICAgICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHRMaW5lcyA9IGxheW91dC5saW5lcztcbiAgICAgICAgZm9udFNpemUgPSBsYXlvdXQuZm9udFNpemU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRleHRGaWVsZC5pc0NvbWJlZCgpKSB7XG4gICAgICAgIHZhciBsYXlvdXQgPSBsYXlvdXRDb21iZWRUZXh0KHRleHQsIHtcbiAgICAgICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgICAgIGJvdW5kczogYm91bmRzLFxuICAgICAgICAgICAgY2VsbENvdW50OiAoX2MgPSB0ZXh0RmllbGQuZ2V0TWF4TGVuZ3RoKCkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0ZXh0TGluZXMgPSBsYXlvdXQuY2VsbHM7XG4gICAgICAgIGZvbnRTaXplID0gbGF5b3V0LmZvbnRTaXplO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGxheW91dCA9IGxheW91dFNpbmdsZWxpbmVUZXh0KHRleHQsIHtcbiAgICAgICAgICAgIGFsaWdubWVudDogdGV4dEZpZWxkLmdldEFsaWdubWVudCgpLFxuICAgICAgICAgICAgZm9udFNpemU6IHdpZGdldEZvbnRTaXplICE9PSBudWxsICYmIHdpZGdldEZvbnRTaXplICE9PSB2b2lkIDAgPyB3aWRnZXRGb250U2l6ZSA6IGZpZWxkRm9udFNpemUsXG4gICAgICAgICAgICBmb250OiBmb250LFxuICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgIH0pO1xuICAgICAgICB0ZXh0TGluZXMgPSBbbGF5b3V0LmxpbmVdO1xuICAgICAgICBmb250U2l6ZSA9IGxheW91dC5mb250U2l6ZTtcbiAgICB9XG4gICAgLy8gVXBkYXRlIGZvbnQgc2l6ZSBhbmQgY29sb3JcbiAgICB2YXIgdGV4dENvbG9yID0gKF9kID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yIHx8IHdpZGdldEZvbnRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHRleHRGaWVsZC5hY3JvRmllbGQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgeDogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgeTogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlcldpZHRoOiBib3JkZXJXaWR0aCAhPT0gbnVsbCAmJiBib3JkZXJXaWR0aCAhPT0gdm9pZCAwID8gYm9yZGVyV2lkdGggOiAwLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIHRleHRDb2xvcjogdGV4dENvbG9yLFxuICAgICAgICBmb250OiBmb250Lm5hbWUsXG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvcixcbiAgICAgICAgdGV4dExpbmVzOiB0ZXh0TGluZXMsXG4gICAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgfTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3VGV4dEZpZWxkKG9wdGlvbnMpKTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHREcm9wZG93bkFwcGVhcmFuY2VQcm92aWRlciA9IGZ1bmN0aW9uIChkcm9wZG93biwgd2lkZ2V0LCBmb250KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcihkcm9wZG93bi5hY3JvRmllbGQpO1xuICAgIHZhciB3aWRnZXRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZSh3aWRnZXQpO1xuICAgIHZhciBmaWVsZEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKGRyb3Bkb3duLmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciB0ZXh0ID0gKF9hID0gZHJvcGRvd24uZ2V0U2VsZWN0ZWQoKVswXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gKF9iID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldFJvdGF0aW9uKCkpO1xuICAgIHZhciBfZCA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKSwgd2lkdGggPSBfZC53aWR0aCwgaGVpZ2h0ID0gX2QuaGVpZ2h0O1xuICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgdmFyIGJsYWNrID0gcmdiKDAsIDAsIDApO1xuICAgIHZhciBib3JkZXJDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCb3JkZXJDb2xvcigpKTtcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgcGFkZGluZyA9IDE7XG4gICAgdmFyIGJvdW5kcyA9IHtcbiAgICAgICAgeDogYm9yZGVyV2lkdGggKyBwYWRkaW5nLFxuICAgICAgICB5OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSAoYm9yZGVyV2lkdGggKyBwYWRkaW5nKSAqIDIsXG4gICAgfTtcbiAgICB2YXIgX2UgPSBsYXlvdXRTaW5nbGVsaW5lVGV4dCh0ZXh0LCB7XG4gICAgICAgIGFsaWdubWVudDogVGV4dEFsaWdubWVudC5MZWZ0LFxuICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgfSksIGxpbmUgPSBfZS5saW5lLCBmb250U2l6ZSA9IF9lLmZvbnRTaXplO1xuICAgIC8vIFVwZGF0ZSBmb250IHNpemUgYW5kIGNvbG9yXG4gICAgdmFyIHRleHRDb2xvciA9IChfYyA9IHdpZGdldENvbG9yICE9PSBudWxsICYmIHdpZGdldENvbG9yICE9PSB2b2lkIDAgPyB3aWRnZXRDb2xvciA6IGZpZWxkQ29sb3IpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGJsYWNrO1xuICAgIGlmICh3aWRnZXRDb2xvciB8fCB3aWRnZXRGb250U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHdpZGdldCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZShkcm9wZG93bi5hY3JvRmllbGQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgeDogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgeTogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlcldpZHRoOiBib3JkZXJXaWR0aCAhPT0gbnVsbCAmJiBib3JkZXJXaWR0aCAhPT0gdm9pZCAwID8gYm9yZGVyV2lkdGggOiAwLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIHRleHRDb2xvcjogdGV4dENvbG9yLFxuICAgICAgICBmb250OiBmb250Lm5hbWUsXG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvcixcbiAgICAgICAgdGV4dExpbmVzOiBbbGluZV0sXG4gICAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgfTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3VGV4dEZpZWxkKG9wdGlvbnMpKTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHRPcHRpb25MaXN0QXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKG9wdGlvbkxpc3QsIHdpZGdldCwgZm9udCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcihvcHRpb25MaXN0LmFjcm9GaWVsZCk7XG4gICAgdmFyIHdpZGdldEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkRm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUob3B0aW9uTGlzdC5hY3JvRmllbGQpO1xuICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2EgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9jID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9jLndpZHRoLCBoZWlnaHQgPSBfYy5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciBvcHRpb25zID0gb3B0aW9uTGlzdC5nZXRPcHRpb25zKCk7XG4gICAgdmFyIHNlbGVjdGVkID0gb3B0aW9uTGlzdC5nZXRTZWxlY3RlZCgpO1xuICAgIGlmIChvcHRpb25MaXN0LmlzU29ydGVkKCkpXG4gICAgICAgIG9wdGlvbnMuc29ydCgpO1xuICAgIHZhciB0ZXh0ID0gJyc7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdGV4dCArPSBvcHRpb25zW2lkeF07XG4gICAgICAgIGlmIChpZHggPCBsZW4gLSAxKVxuICAgICAgICAgICAgdGV4dCArPSAnXFxuJztcbiAgICB9XG4gICAgdmFyIHBhZGRpbmcgPSAxO1xuICAgIHZhciBib3VuZHMgPSB7XG4gICAgICAgIHg6IGJvcmRlcldpZHRoICsgcGFkZGluZyxcbiAgICAgICAgeTogYm9yZGVyV2lkdGggKyBwYWRkaW5nLFxuICAgICAgICB3aWR0aDogd2lkdGggLSAoYm9yZGVyV2lkdGggKyBwYWRkaW5nKSAqIDIsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gKGJvcmRlcldpZHRoICsgcGFkZGluZykgKiAyLFxuICAgIH07XG4gICAgdmFyIF9kID0gbGF5b3V0TXVsdGlsaW5lVGV4dCh0ZXh0LCB7XG4gICAgICAgIGFsaWdubWVudDogVGV4dEFsaWdubWVudC5MZWZ0LFxuICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgfSksIGxpbmVzID0gX2QubGluZXMsIGZvbnRTaXplID0gX2QuZm9udFNpemUsIGxpbmVIZWlnaHQgPSBfZC5saW5lSGVpZ2h0O1xuICAgIHZhciBzZWxlY3RlZExpbmVzID0gW107XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gbGluZXNbaWR4XTtcbiAgICAgICAgaWYgKHNlbGVjdGVkLmluY2x1ZGVzKGxpbmUudGV4dCkpXG4gICAgICAgICAgICBzZWxlY3RlZExpbmVzLnB1c2goaWR4KTtcbiAgICB9XG4gICAgdmFyIGJsdWUgPSByZ2IoMTUzIC8gMjU1LCAxOTMgLyAyNTUsIDIxOCAvIDI1NSk7XG4gICAgLy8gVXBkYXRlIGZvbnQgc2l6ZSBhbmQgY29sb3JcbiAgICB2YXIgdGV4dENvbG9yID0gKF9iID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yIHx8IHdpZGdldEZvbnRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKG9wdGlvbkxpc3QuYWNyb0ZpZWxkLCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd09wdGlvbkxpc3Qoe1xuICAgICAgICB4OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB5OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoICE9PSBudWxsICYmIGJvcmRlcldpZHRoICE9PSB2b2lkIDAgPyBib3JkZXJXaWR0aCA6IDAsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgdGV4dENvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IGZvbnQubmFtZSxcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLFxuICAgICAgICB0ZXh0TGluZXM6IGxpbmVzLFxuICAgICAgICBsaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0LFxuICAgICAgICBzZWxlY3RlZENvbG9yOiBibHVlLFxuICAgICAgICBzZWxlY3RlZExpbmVzOiBzZWxlY3RlZExpbmVzLFxuICAgICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIH0pKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHBlYXJhbmNlcy5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZCdXR0b24gfSBmcm9tIFwiLi9QREZCdXR0b25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQ2hlY2tCb3ggfSBmcm9tIFwiLi9QREZDaGVja0JveFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZEcm9wZG93biB9IGZyb20gXCIuL1BERkRyb3Bkb3duXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkZpZWxkIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRm9ybSB9IGZyb20gXCIuL1BERkZvcm1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT3B0aW9uTGlzdCB9IGZyb20gXCIuL1BERk9wdGlvbkxpc3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUmFkaW9Hcm91cCB9IGZyb20gXCIuL1BERlJhZGlvR3JvdXBcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGU2lnbmF0dXJlIH0gZnJvbSBcIi4vUERGU2lnbmF0dXJlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlRleHRGaWVsZCB9IGZyb20gXCIuL1BERlRleHRGaWVsZFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IHZhciBJbWFnZUFsaWdubWVudDtcbihmdW5jdGlvbiAoSW1hZ2VBbGlnbm1lbnQpIHtcbiAgICBJbWFnZUFsaWdubWVudFtJbWFnZUFsaWdubWVudFtcIkxlZnRcIl0gPSAwXSA9IFwiTGVmdFwiO1xuICAgIEltYWdlQWxpZ25tZW50W0ltYWdlQWxpZ25tZW50W1wiQ2VudGVyXCJdID0gMV0gPSBcIkNlbnRlclwiO1xuICAgIEltYWdlQWxpZ25tZW50W0ltYWdlQWxpZ25tZW50W1wiUmlnaHRcIl0gPSAyXSA9IFwiUmlnaHRcIjtcbn0pKEltYWdlQWxpZ25tZW50IHx8IChJbWFnZUFsaWdubWVudCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGlnbm1lbnQuanMubWFwIiwiZXhwb3J0ICogZnJvbSBcIi4vYWxpZ25tZW50XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9mb3JtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb2xvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29wZXJhdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29wZXJhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcm90YXRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zaXplc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUERGUGFnZU9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1BERkRvY3VtZW50T3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vU3RhbmRhcmRGb250c1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZEb2N1bWVudCB9IGZyb20gXCIuL1BERkRvY3VtZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkZvbnQgfSBmcm9tIFwiLi9QREZGb250XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkltYWdlIH0gZnJvbSBcIi4vUERGSW1hZ2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUGFnZSB9IGZyb20gXCIuL1BERlBhZ2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRW1iZWRkZWRQYWdlIH0gZnJvbSBcIi4vUERGRW1iZWRkZWRQYWdlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkphdmFTY3JpcHQgfSBmcm9tIFwiLi9QREZKYXZhU2NyaXB0XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBQREZOYW1lLCBQREZOdW1iZXIgfSBmcm9tIFwiLi4vY29yZVwiO1xuZXhwb3J0IHZhciBhc1BERk5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBuYW1lIGluc3RhbmNlb2YgUERGTmFtZSA/IG5hbWUgOiBQREZOYW1lLm9mKG5hbWUpO1xufTtcbmV4cG9ydCB2YXIgYXNQREZOdW1iZXIgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgcmV0dXJuIG51bSBpbnN0YW5jZW9mIFBERk51bWJlciA/IG51bSA6IFBERk51bWJlci5vZihudW0pO1xufTtcbmV4cG9ydCB2YXIgYXNOdW1iZXIgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgcmV0dXJuIG51bSBpbnN0YW5jZW9mIFBERk51bWJlciA/IG51bS5hc051bWJlcigpIDogbnVtO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdHMuanMubWFwIiwiaW1wb3J0IHsgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHNldEZpbGxpbmdDb2xvciwgc2V0U3Ryb2tpbmdDb2xvciB9IGZyb20gXCIuL2NvbG9yc1wiO1xuaW1wb3J0IHsgYmVnaW5UZXh0LCBjbG9zZVBhdGgsIGRyYXdPYmplY3QsIGVuZFRleHQsIGZpbGwsIGZpbGxBbmRTdHJva2UsIGxpbmVUbywgbW92ZVRvLCBuZXh0TGluZSwgcG9wR3JhcGhpY3NTdGF0ZSwgcHVzaEdyYXBoaWNzU3RhdGUsIHJvdGF0ZUFuZFNrZXdUZXh0UmFkaWFuc0FuZFRyYW5zbGF0ZSwgcm90YXRlUmFkaWFucywgc2NhbGUsIHNldEZvbnRBbmRTaXplLCBzZXRMaW5lSGVpZ2h0LCBzZXRMaW5lV2lkdGgsIHNob3dUZXh0LCBza2V3UmFkaWFucywgc3Ryb2tlLCB0cmFuc2xhdGUsIHNldExpbmVDYXAsIHJvdGF0ZURlZ3JlZXMsIHNldEdyYXBoaWNzU3RhdGUsIHNldERhc2hQYXR0ZXJuLCBiZWdpbk1hcmtlZENvbnRlbnQsIGVuZE1hcmtlZENvbnRlbnQsIGNsaXAsIGVuZFBhdGgsIGFwcGVuZEJlemllckN1cnZlLCB9IGZyb20gXCIuL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcywgdG9SYWRpYW5zIH0gZnJvbSBcIi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBzdmdQYXRoVG9PcGVyYXRvcnMgfSBmcm9tIFwiLi9zdmdQYXRoXCI7XG5pbXBvcnQgeyBhc051bWJlciB9IGZyb20gXCIuL29iamVjdHNcIjtcbmV4cG9ydCB2YXIgZHJhd1RleHQgPSBmdW5jdGlvbiAobGluZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIGJlZ2luVGV4dCgpLFxuICAgICAgICBzZXRGaWxsaW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIHNldEZvbnRBbmRTaXplKG9wdGlvbnMuZm9udCwgb3B0aW9ucy5zaXplKSxcbiAgICAgICAgcm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSksIHRvUmFkaWFucyhvcHRpb25zLnhTa2V3KSwgdG9SYWRpYW5zKG9wdGlvbnMueVNrZXcpLCBvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgICAgIHNob3dUZXh0KGxpbmUpLFxuICAgICAgICBlbmRUZXh0KCksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdMaW5lc09mVGV4dCA9IGZ1bmN0aW9uIChsaW5lcywgb3B0aW9ucykge1xuICAgIHZhciBvcGVyYXRvcnMgPSBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIGJlZ2luVGV4dCgpLFxuICAgICAgICBzZXRGaWxsaW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIHNldEZvbnRBbmRTaXplKG9wdGlvbnMuZm9udCwgb3B0aW9ucy5zaXplKSxcbiAgICAgICAgc2V0TGluZUhlaWdodChvcHRpb25zLmxpbmVIZWlnaHQpLFxuICAgICAgICByb3RhdGVBbmRTa2V3VGV4dFJhZGlhbnNBbmRUcmFuc2xhdGUodG9SYWRpYW5zKG9wdGlvbnMucm90YXRlKSwgdG9SYWRpYW5zKG9wdGlvbnMueFNrZXcpLCB0b1JhZGlhbnMob3B0aW9ucy55U2tldyksIG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgb3BlcmF0b3JzLnB1c2goc2hvd1RleHQobGluZXNbaWR4XSksIG5leHRMaW5lKCkpO1xuICAgIH1cbiAgICBvcGVyYXRvcnMucHVzaChlbmRUZXh0KCksIHBvcEdyYXBoaWNzU3RhdGUoKSk7XG4gICAgcmV0dXJuIG9wZXJhdG9ycztcbn07XG5leHBvcnQgdmFyIGRyYXdJbWFnZSA9IGZ1bmN0aW9uIChuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICAgICAgcm90YXRlUmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy5yb3RhdGUpKSxcbiAgICAgICAgc2NhbGUob3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQpLFxuICAgICAgICBza2V3UmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSksXG4gICAgICAgIGRyYXdPYmplY3QobmFtZSksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdQYWdlID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICByb3RhdGVSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSkpLFxuICAgICAgICBzY2FsZShvcHRpb25zLnhTY2FsZSwgb3B0aW9ucy55U2NhbGUpLFxuICAgICAgICBza2V3UmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSksXG4gICAgICAgIGRyYXdPYmplY3QobmFtZSksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdMaW5lID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgc2V0U3Ryb2tpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgc2V0TGluZVdpZHRoKG9wdGlvbnMudGhpY2tuZXNzKSxcbiAgICAgICAgc2V0RGFzaFBhdHRlcm4oKF9hID0gb3B0aW9ucy5kYXNoQXJyYXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdLCAoX2IgPSBvcHRpb25zLmRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCksXG4gICAgICAgIG1vdmVUbyhvcHRpb25zLnN0YXJ0LngsIG9wdGlvbnMuc3RhcnQueSksXG4gICAgICAgIG9wdGlvbnMubGluZUNhcCAmJiBzZXRMaW5lQ2FwKG9wdGlvbnMubGluZUNhcCksXG4gICAgICAgIG1vdmVUbyhvcHRpb25zLnN0YXJ0LngsIG9wdGlvbnMuc3RhcnQueSksXG4gICAgICAgIGxpbmVUbyhvcHRpb25zLmVuZC54LCBvcHRpb25zLmVuZC55KSxcbiAgICAgICAgc3Ryb2tlKCksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdSZWN0YW5nbGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBzZXRGaWxsaW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgJiYgc2V0U3Ryb2tpbmdDb2xvcihvcHRpb25zLmJvcmRlckNvbG9yKSxcbiAgICAgICAgc2V0TGluZVdpZHRoKG9wdGlvbnMuYm9yZGVyV2lkdGgpLFxuICAgICAgICBvcHRpb25zLmJvcmRlckxpbmVDYXAgJiYgc2V0TGluZUNhcChvcHRpb25zLmJvcmRlckxpbmVDYXApLFxuICAgICAgICBzZXREYXNoUGF0dGVybigoX2EgPSBvcHRpb25zLmJvcmRlckRhc2hBcnJheSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10sIChfYiA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwKSxcbiAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICAgICAgcm90YXRlUmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy5yb3RhdGUpKSxcbiAgICAgICAgc2tld1JhZGlhbnModG9SYWRpYW5zKG9wdGlvbnMueFNrZXcpLCB0b1JhZGlhbnMob3B0aW9ucy55U2tldykpLFxuICAgICAgICBtb3ZlVG8oMCwgMCksXG4gICAgICAgIGxpbmVUbygwLCBvcHRpb25zLmhlaWdodCksXG4gICAgICAgIGxpbmVUbyhvcHRpb25zLndpZHRoLCBvcHRpb25zLmhlaWdodCksXG4gICAgICAgIGxpbmVUbyhvcHRpb25zLndpZHRoLCAwKSxcbiAgICAgICAgY2xvc2VQYXRoKCksXG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIG9wdGlvbnMuYm9yZGVyV2lkdGggPyBmaWxsQW5kU3Ryb2tlKClcbiAgICAgICAgICAgIDogb3B0aW9ucy5jb2xvciA/IGZpbGwoKVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5ib3JkZXJDb2xvciA/IHN0cm9rZSgpXG4gICAgICAgICAgICAgICAgICAgIDogY2xvc2VQYXRoKCksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG52YXIgS0FQUEEgPSA0LjAgKiAoKE1hdGguc3FydCgyKSAtIDEuMCkgLyAzLjApO1xuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgdmFyIGRyYXdFbGxpcHNlUGF0aCA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICB2YXIgeCA9IGFzTnVtYmVyKGNvbmZpZy54KTtcbiAgICB2YXIgeSA9IGFzTnVtYmVyKGNvbmZpZy55KTtcbiAgICB2YXIgeFNjYWxlID0gYXNOdW1iZXIoY29uZmlnLnhTY2FsZSk7XG4gICAgdmFyIHlTY2FsZSA9IGFzTnVtYmVyKGNvbmZpZy55U2NhbGUpO1xuICAgIHggLT0geFNjYWxlO1xuICAgIHkgLT0geVNjYWxlO1xuICAgIHZhciBveCA9IHhTY2FsZSAqIEtBUFBBO1xuICAgIHZhciBveSA9IHlTY2FsZSAqIEtBUFBBO1xuICAgIHZhciB4ZSA9IHggKyB4U2NhbGUgKiAyO1xuICAgIHZhciB5ZSA9IHkgKyB5U2NhbGUgKiAyO1xuICAgIHZhciB4bSA9IHggKyB4U2NhbGU7XG4gICAgdmFyIHltID0geSArIHlTY2FsZTtcbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBtb3ZlVG8oeCwgeW0pLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4LCB5bSAtIG95LCB4bSAtIG94LCB5LCB4bSwgeSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhtICsgb3gsIHksIHhlLCB5bSAtIG95LCB4ZSwgeW0pLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4ZSwgeW0gKyBveSwgeG0gKyBveCwgeWUsIHhtLCB5ZSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhtIC0gb3gsIHllLCB4LCB5bSArIG95LCB4LCB5bSksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdO1xufTtcbnZhciBkcmF3RWxsaXBzZUN1cnZlcyA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICB2YXIgY2VudGVyWCA9IGFzTnVtYmVyKGNvbmZpZy54KTtcbiAgICB2YXIgY2VudGVyWSA9IGFzTnVtYmVyKGNvbmZpZy55KTtcbiAgICB2YXIgeFNjYWxlID0gYXNOdW1iZXIoY29uZmlnLnhTY2FsZSk7XG4gICAgdmFyIHlTY2FsZSA9IGFzTnVtYmVyKGNvbmZpZy55U2NhbGUpO1xuICAgIHZhciB4ID0gLXhTY2FsZTtcbiAgICB2YXIgeSA9IC15U2NhbGU7XG4gICAgdmFyIG94ID0geFNjYWxlICogS0FQUEE7XG4gICAgdmFyIG95ID0geVNjYWxlICogS0FQUEE7XG4gICAgdmFyIHhlID0geCArIHhTY2FsZSAqIDI7XG4gICAgdmFyIHllID0geSArIHlTY2FsZSAqIDI7XG4gICAgdmFyIHhtID0geCArIHhTY2FsZTtcbiAgICB2YXIgeW0gPSB5ICsgeVNjYWxlO1xuICAgIHJldHVybiBbXG4gICAgICAgIHRyYW5zbGF0ZShjZW50ZXJYLCBjZW50ZXJZKSxcbiAgICAgICAgcm90YXRlUmFkaWFucyh0b1JhZGlhbnMoY29uZmlnLnJvdGF0ZSkpLFxuICAgICAgICBtb3ZlVG8oeCwgeW0pLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4LCB5bSAtIG95LCB4bSAtIG94LCB5LCB4bSwgeSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhtICsgb3gsIHksIHhlLCB5bSAtIG95LCB4ZSwgeW0pLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4ZSwgeW0gKyBveSwgeG0gKyBveCwgeWUsIHhtLCB5ZSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhtIC0gb3gsIHllLCB4LCB5bSArIG95LCB4LCB5bSksXG4gICAgXTtcbn07XG5leHBvcnQgdmFyIGRyYXdFbGxpcHNlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciAmJiBzZXRTdHJva2luZ0NvbG9yKG9wdGlvbnMuYm9yZGVyQ29sb3IpLFxuICAgICAgICBzZXRMaW5lV2lkdGgob3B0aW9ucy5ib3JkZXJXaWR0aCksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyTGluZUNhcCAmJiBzZXRMaW5lQ2FwKG9wdGlvbnMuYm9yZGVyTGluZUNhcCksXG4gICAgICAgIHNldERhc2hQYXR0ZXJuKChfYSA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSwgKF9iID0gb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDApXG4gICAgXSwgKG9wdGlvbnMucm90YXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBkcmF3RWxsaXBzZVBhdGgoe1xuICAgICAgICAgICAgeDogb3B0aW9ucy54LFxuICAgICAgICAgICAgeTogb3B0aW9ucy55LFxuICAgICAgICAgICAgeFNjYWxlOiBvcHRpb25zLnhTY2FsZSxcbiAgICAgICAgICAgIHlTY2FsZTogb3B0aW9ucy55U2NhbGUsXG4gICAgICAgIH0pXG4gICAgICAgIDogZHJhd0VsbGlwc2VDdXJ2ZXMoe1xuICAgICAgICAgICAgeDogb3B0aW9ucy54LFxuICAgICAgICAgICAgeTogb3B0aW9ucy55LFxuICAgICAgICAgICAgeFNjYWxlOiBvcHRpb25zLnhTY2FsZSxcbiAgICAgICAgICAgIHlTY2FsZTogb3B0aW9ucy55U2NhbGUsXG4gICAgICAgICAgICByb3RhdGU6IChfYyA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBkZWdyZWVzKDApLFxuICAgICAgICB9KSksIFtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgb3B0aW9ucy5ib3JkZXJXaWR0aCA/IGZpbGxBbmRTdHJva2UoKVxuICAgICAgICAgICAgOiBvcHRpb25zLmNvbG9yID8gZmlsbCgpXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLmJvcmRlckNvbG9yID8gc3Ryb2tlKClcbiAgICAgICAgICAgICAgICAgICAgOiBjbG9zZVBhdGgoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0pLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdTdmdQYXRoID0gZnVuY3Rpb24gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICByb3RhdGVSYWRpYW5zKHRvUmFkaWFucygoX2EgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZGVncmVlcygwKSkpLFxuICAgICAgICAvLyBTVkcgcGF0aCBZIGF4aXMgaXMgb3Bwb3NpdGUgcGRmLWxpYidzXG4gICAgICAgIG9wdGlvbnMuc2NhbGUgPyBzY2FsZShvcHRpb25zLnNjYWxlLCAtb3B0aW9ucy5zY2FsZSkgOiBzY2FsZSgxLCAtMSksXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgc2V0RmlsbGluZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yICYmIHNldFN0cm9raW5nQ29sb3Iob3B0aW9ucy5ib3JkZXJDb2xvciksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyV2lkdGggJiYgc2V0TGluZVdpZHRoKG9wdGlvbnMuYm9yZGVyV2lkdGgpLFxuICAgICAgICBvcHRpb25zLmJvcmRlckxpbmVDYXAgJiYgc2V0TGluZUNhcChvcHRpb25zLmJvcmRlckxpbmVDYXApLFxuICAgICAgICBzZXREYXNoUGF0dGVybigoX2IgPSBvcHRpb25zLmJvcmRlckRhc2hBcnJheSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10sIChfYyA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwKVxuICAgIF0sIHN2Z1BhdGhUb09wZXJhdG9ycyhwYXRoKSwgW1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBvcHRpb25zLmJvcmRlcldpZHRoID8gZmlsbEFuZFN0cm9rZSgpXG4gICAgICAgICAgICA6IG9wdGlvbnMuY29sb3IgPyBmaWxsKClcbiAgICAgICAgICAgICAgICA6IG9wdGlvbnMuYm9yZGVyQ29sb3IgPyBzdHJva2UoKVxuICAgICAgICAgICAgICAgICAgICA6IGNsb3NlUGF0aCgpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXSkuZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd0NoZWNrTWFyayA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHNpemUgPSBhc051bWJlcihvcHRpb25zLnNpemUpO1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiBEZWZpbmUgQ2hlY2sgTWFyayBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8vIEEgY2hlY2sgbWFyayBpcyBkZWZpbmVkIGJ5IHRocmVlIHBvaW50cyBpbiBzb21lIGNvb3JkaW5hdGUgc3BhY2UuIEhlcmUsIHdlXG4gICAgLy8gZGVmaW5lIHRoZXNlIHBvaW50cyBpbiBhIHVuaXQgY29vcmRpbmF0ZSBzeXN0ZW0sIHdoZXJlIHRoZSByYW5nZSBvZiB0aGUgeFxuICAgIC8vIGFuZCB5IGF4aXMgYXJlIGJvdGggWy0xLCAxXS5cbiAgICAvL1xuICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBub3QgaGFyZCBjb2RlIGBwMXlgIGluIGNhc2Ugd2Ugd2lzaCB0byBjaGFuZ2UgdGhlXG4gICAgLy8gc2l6ZS9zaGFwZSBvZiB0aGUgY2hlY2sgbWFyayBpbiB0aGUgZnV0dXJlLiBXZSB3YW50IHRoZSBjaGVjayBtYXJrIHRvXG4gICAgLy8gYWx3YXlzIGZvcm0gYSByaWdodCBhbmdsZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIChwMS1wMilcbiAgICAvLyBhbmQgKHAzLXAyKSBzaG91bGQgYmUgemVybzpcbiAgICAvL1xuICAgIC8vICAgKHAxeC1wMngpICogKHAzeC1wMngpICsgKHAxeS1wMnkpICogKHAzeS1wMnkpID0gMFxuICAgIC8vXG4gICAgLy8gV2UgY2FuIG5vdyByZWppZ2dlciB0aGlzIGVxdWF0aW9uIHRvIHNvbHZlIGZvciBgcDF5YDpcbiAgICAvL1xuICAgIC8vICAgKHAxeS1wMnkpICogKHAzeS1wMnkpID0gLSgocDF4LXAyeCkgKiAocDN4LXAyeCkpXG4gICAgLy8gICAocDF5LXAyeSkgPSAtKChwMXgtcDJ4KSAqIChwM3gtcDJ4KSkgLyAocDN5LXAyeSlcbiAgICAvLyAgIHAxeSA9IC0oKHAxeC1wMngpICogKHAzeC1wMngpKSAvIChwM3ktcDJ5KSArIHAyeVxuICAgIC8vXG4gICAgLy8gVGhhbmtzIHRvIG15IGZyaWVuZCBKb2VsIFdhbGtlciAoaHR0cHM6Ly9naXRodWIuY29tL0pXYWxrZXIxOTk1KSBmb3JcbiAgICAvLyBkZXZpc2luZyB0aGUgYWJvdmUgZXF1YXRpb24gYW5kIHVuaXQgY29vcmRpbmF0ZSBzeXN0ZW0gYXBwcm9hY2ghXG4gICAgLy8gKHgsIHkpIGNvb3JkcyBvZiB0aGUgY2hlY2sgbWFyaydzIGJvdHRvbW1vc3QgcG9pbnRcbiAgICB2YXIgcDJ4ID0gLTEgKyAwLjc1O1xuICAgIHZhciBwMnkgPSAtMSArIDAuNTE7XG4gICAgLy8gKHgsIHkpIGNvb3JkcyBvZiB0aGUgY2hlY2sgbWFyaydzIHRvcG1vc3QgcG9pbnRcbiAgICB2YXIgcDN5ID0gMSAtIDAuNTI1O1xuICAgIHZhciBwM3ggPSAxIC0gMC4zMTtcbiAgICAvLyAoeCwgeSkgY29vcmRzIG9mIHRoZSBjaGVjayBtYXJrJ3MgY2VudGVyICh2ZXJ0aWNhbGx5KSBwb2ludFxuICAgIHZhciBwMXggPSAtMSArIDAuMzI1O1xuICAgIHZhciBwMXkgPSAtKChwMXggLSBwMngpICogKHAzeCAtIHAyeCkpIC8gKHAzeSAtIHAyeSkgKyBwMnk7XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBzZXRTdHJva2luZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBzZXRMaW5lV2lkdGgob3B0aW9ucy50aGlja25lc3MpLFxuICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICBtb3ZlVG8ocDF4ICogc2l6ZSwgcDF5ICogc2l6ZSksXG4gICAgICAgIGxpbmVUbyhwMnggKiBzaXplLCBwMnkgKiBzaXplKSxcbiAgICAgICAgbGluZVRvKHAzeCAqIHNpemUsIHAzeSAqIHNpemUpLFxuICAgICAgICBzdHJva2UoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciByb3RhdGVJblBsYWNlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5yb3RhdGlvbiA9PT0gMCA/IFtcbiAgICAgICAgdHJhbnNsYXRlKDAsIDApLFxuICAgICAgICByb3RhdGVEZWdyZWVzKDApXG4gICAgXVxuICAgICAgICA6IG9wdGlvbnMucm90YXRpb24gPT09IDkwID8gW1xuICAgICAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMud2lkdGgsIDApLFxuICAgICAgICAgICAgcm90YXRlRGVncmVlcyg5MClcbiAgICAgICAgXVxuICAgICAgICAgICAgOiBvcHRpb25zLnJvdGF0aW9uID09PSAxODAgPyBbXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMud2lkdGgsIG9wdGlvbnMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICByb3RhdGVEZWdyZWVzKDE4MClcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICA6IG9wdGlvbnMucm90YXRpb24gPT09IDI3MCA/IFtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlKDAsIG9wdGlvbnMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgcm90YXRlRGVncmVlcygyNzApXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICA6IFtdO1xufTsgLy8gSW52YWxpZCByb3RhdGlvbiAtIG5vb3BcbmV4cG9ydCB2YXIgZHJhd0NoZWNrQm94ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgb3V0bGluZSA9IGRyYXdSZWN0YW5nbGUoe1xuICAgICAgICB4OiBvcHRpb25zLngsXG4gICAgICAgIHk6IG9wdGlvbnMueSxcbiAgICAgICAgd2lkdGg6IG9wdGlvbnMud2lkdGgsXG4gICAgICAgIGhlaWdodDogb3B0aW9ucy5oZWlnaHQsXG4gICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIGlmICghb3B0aW9ucy5maWxsZWQpXG4gICAgICAgIHJldHVybiBvdXRsaW5lO1xuICAgIHZhciB3aWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmhlaWdodCk7XG4gICAgdmFyIGNoZWNrTWFya1NpemUgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDI7XG4gICAgdmFyIGNoZWNrTWFyayA9IGRyYXdDaGVja01hcmsoe1xuICAgICAgICB4OiB3aWR0aCAvIDIsXG4gICAgICAgIHk6IGhlaWdodCAvIDIsXG4gICAgICAgIHNpemU6IGNoZWNrTWFya1NpemUsXG4gICAgICAgIHRoaWNrbmVzczogb3B0aW9ucy50aGlja25lc3MsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLm1hcmtDb2xvcixcbiAgICB9KTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW3B1c2hHcmFwaGljc1N0YXRlKCldLCBvdXRsaW5lLCBjaGVja01hcmssIFtwb3BHcmFwaGljc1N0YXRlKCldKTtcbn07XG5leHBvcnQgdmFyIGRyYXdSYWRpb0J1dHRvbiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHdpZHRoID0gYXNOdW1iZXIob3B0aW9ucy53aWR0aCk7XG4gICAgdmFyIGhlaWdodCA9IGFzTnVtYmVyKG9wdGlvbnMuaGVpZ2h0KTtcbiAgICB2YXIgb3V0bGluZVNjYWxlID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCkgLyAyO1xuICAgIHZhciBvdXRsaW5lID0gZHJhd0VsbGlwc2Uoe1xuICAgICAgICB4OiBvcHRpb25zLngsXG4gICAgICAgIHk6IG9wdGlvbnMueSxcbiAgICAgICAgeFNjYWxlOiBvdXRsaW5lU2NhbGUsXG4gICAgICAgIHlTY2FsZTogb3V0bGluZVNjYWxlLFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgIH0pO1xuICAgIGlmICghb3B0aW9ucy5maWxsZWQpXG4gICAgICAgIHJldHVybiBvdXRsaW5lO1xuICAgIHZhciBkb3QgPSBkcmF3RWxsaXBzZSh7XG4gICAgICAgIHg6IG9wdGlvbnMueCxcbiAgICAgICAgeTogb3B0aW9ucy55LFxuICAgICAgICB4U2NhbGU6IG91dGxpbmVTY2FsZSAqIDAuNDUsXG4gICAgICAgIHlTY2FsZTogb3V0bGluZVNjYWxlICogMC40NSxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMuZG90Q29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiB1bmRlZmluZWQsXG4gICAgICAgIGJvcmRlcldpZHRoOiAwLFxuICAgIH0pO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbcHVzaEdyYXBoaWNzU3RhdGUoKV0sIG91dGxpbmUsIGRvdCwgW3BvcEdyYXBoaWNzU3RhdGUoKV0pO1xufTtcbmV4cG9ydCB2YXIgZHJhd0J1dHRvbiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHggPSBhc051bWJlcihvcHRpb25zLngpO1xuICAgIHZhciB5ID0gYXNOdW1iZXIob3B0aW9ucy55KTtcbiAgICB2YXIgd2lkdGggPSBhc051bWJlcihvcHRpb25zLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5oZWlnaHQpO1xuICAgIHZhciBiYWNrZ3JvdW5kID0gZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIHZhciBsaW5lcyA9IGRyYXdUZXh0TGluZXMob3B0aW9ucy50ZXh0TGluZXMsIHtcbiAgICAgICAgY29sb3I6IG9wdGlvbnMudGV4dENvbG9yLFxuICAgICAgICBmb250OiBvcHRpb25zLmZvbnQsXG4gICAgICAgIHNpemU6IG9wdGlvbnMuZm9udFNpemUsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbcHVzaEdyYXBoaWNzU3RhdGUoKV0sIGJhY2tncm91bmQsIGxpbmVzLCBbcG9wR3JhcGhpY3NTdGF0ZSgpXSk7XG59O1xuZXhwb3J0IHZhciBkcmF3VGV4dExpbmVzID0gZnVuY3Rpb24gKGxpbmVzLCBvcHRpb25zKSB7XG4gICAgdmFyIG9wZXJhdG9ycyA9IFtcbiAgICAgICAgYmVnaW5UZXh0KCksXG4gICAgICAgIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgc2V0Rm9udEFuZFNpemUob3B0aW9ucy5mb250LCBvcHRpb25zLnNpemUpLFxuICAgIF07XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBfYSA9IGxpbmVzW2lkeF0sIGVuY29kZWQgPSBfYS5lbmNvZGVkLCB4ID0gX2EueCwgeSA9IF9hLnk7XG4gICAgICAgIG9wZXJhdG9ycy5wdXNoKHJvdGF0ZUFuZFNrZXdUZXh0UmFkaWFuc0FuZFRyYW5zbGF0ZSh0b1JhZGlhbnMob3B0aW9ucy5yb3RhdGUpLCB0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSwgeCwgeSksIHNob3dUZXh0KGVuY29kZWQpKTtcbiAgICB9XG4gICAgb3BlcmF0b3JzLnB1c2goZW5kVGV4dCgpKTtcbiAgICByZXR1cm4gb3BlcmF0b3JzO1xufTtcbmV4cG9ydCB2YXIgZHJhd1RleHRGaWVsZCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHggPSBhc051bWJlcihvcHRpb25zLngpO1xuICAgIHZhciB5ID0gYXNOdW1iZXIob3B0aW9ucy55KTtcbiAgICB2YXIgd2lkdGggPSBhc051bWJlcihvcHRpb25zLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5oZWlnaHQpO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMuYm9yZGVyV2lkdGgpO1xuICAgIHZhciBwYWRkaW5nID0gYXNOdW1iZXIob3B0aW9ucy5wYWRkaW5nKTtcbiAgICB2YXIgY2xpcFggPSB4ICsgYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZztcbiAgICB2YXIgY2xpcFkgPSB5ICsgYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZztcbiAgICB2YXIgY2xpcFdpZHRoID0gd2lkdGggLSAoYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZykgKiAyO1xuICAgIHZhciBjbGlwSGVpZ2h0ID0gaGVpZ2h0IC0gKGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmcpICogMjtcbiAgICB2YXIgY2xpcHBpbmdBcmVhID0gW1xuICAgICAgICBtb3ZlVG8oY2xpcFgsIGNsaXBZKSxcbiAgICAgICAgbGluZVRvKGNsaXBYLCBjbGlwWSArIGNsaXBIZWlnaHQpLFxuICAgICAgICBsaW5lVG8oY2xpcFggKyBjbGlwV2lkdGgsIGNsaXBZICsgY2xpcEhlaWdodCksXG4gICAgICAgIGxpbmVUbyhjbGlwWCArIGNsaXBXaWR0aCwgY2xpcFkpLFxuICAgICAgICBjbG9zZVBhdGgoKSxcbiAgICAgICAgY2xpcCgpLFxuICAgICAgICBlbmRQYXRoKCksXG4gICAgXTtcbiAgICB2YXIgYmFja2dyb3VuZCA9IGRyYXdSZWN0YW5nbGUoe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMuY29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICB2YXIgbGluZXMgPSBkcmF3VGV4dExpbmVzKG9wdGlvbnMudGV4dExpbmVzLCB7XG4gICAgICAgIGNvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgZm9udDogb3B0aW9ucy5mb250LFxuICAgICAgICBzaXplOiBvcHRpb25zLmZvbnRTaXplLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICB2YXIgbWFya2VkQ29udGVudCA9IF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgYmVnaW5NYXJrZWRDb250ZW50KCdUeCcpLFxuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpXG4gICAgXSwgbGluZXMsIFtcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBlbmRNYXJrZWRDb250ZW50KCksXG4gICAgXSk7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKVxuICAgIF0sIGJhY2tncm91bmQsIGNsaXBwaW5nQXJlYSwgbWFya2VkQ29udGVudCwgW1xuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBkcmF3T3B0aW9uTGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHggPSBhc051bWJlcihvcHRpb25zLngpO1xuICAgIHZhciB5ID0gYXNOdW1iZXIob3B0aW9ucy55KTtcbiAgICB2YXIgd2lkdGggPSBhc051bWJlcihvcHRpb25zLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5oZWlnaHQpO1xuICAgIHZhciBsaW5lSGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5saW5lSGVpZ2h0KTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSBhc051bWJlcihvcHRpb25zLmJvcmRlcldpZHRoKTtcbiAgICB2YXIgcGFkZGluZyA9IGFzTnVtYmVyKG9wdGlvbnMucGFkZGluZyk7XG4gICAgdmFyIGNsaXBYID0geCArIGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGNsaXBZID0geSArIGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGNsaXBXaWR0aCA9IHdpZHRoIC0gKGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmcpICogMjtcbiAgICB2YXIgY2xpcEhlaWdodCA9IGhlaWdodCAtIChib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nKSAqIDI7XG4gICAgdmFyIGNsaXBwaW5nQXJlYSA9IFtcbiAgICAgICAgbW92ZVRvKGNsaXBYLCBjbGlwWSksXG4gICAgICAgIGxpbmVUbyhjbGlwWCwgY2xpcFkgKyBjbGlwSGVpZ2h0KSxcbiAgICAgICAgbGluZVRvKGNsaXBYICsgY2xpcFdpZHRoLCBjbGlwWSArIGNsaXBIZWlnaHQpLFxuICAgICAgICBsaW5lVG8oY2xpcFggKyBjbGlwV2lkdGgsIGNsaXBZKSxcbiAgICAgICAgY2xvc2VQYXRoKCksXG4gICAgICAgIGNsaXAoKSxcbiAgICAgICAgZW5kUGF0aCgpLFxuICAgIF07XG4gICAgdmFyIGJhY2tncm91bmQgPSBkcmF3UmVjdGFuZ2xlKHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeSxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgdmFyIGhpZ2hsaWdodHMgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLnNlbGVjdGVkTGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gb3B0aW9ucy50ZXh0TGluZXNbb3B0aW9ucy5zZWxlY3RlZExpbmVzW2lkeF1dO1xuICAgICAgICBoaWdobGlnaHRzLnB1c2guYXBwbHkoaGlnaGxpZ2h0cywgZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgICAgICB4OiBsaW5lLnggLSBwYWRkaW5nLFxuICAgICAgICAgICAgeTogbGluZS55IC0gKGxpbmVIZWlnaHQgLSBsaW5lLmhlaWdodCkgLyAyLFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGxpbmUuaGVpZ2h0ICsgKGxpbmVIZWlnaHQgLSBsaW5lLmhlaWdodCkgLyAyLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDAsXG4gICAgICAgICAgICBjb2xvcjogb3B0aW9ucy5zZWxlY3RlZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgdmFyIGxpbmVzID0gZHJhd1RleHRMaW5lcyhvcHRpb25zLnRleHRMaW5lcywge1xuICAgICAgICBjb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IG9wdGlvbnMuZm9udCxcbiAgICAgICAgc2l6ZTogb3B0aW9ucy5mb250U2l6ZSxcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgdmFyIG1hcmtlZENvbnRlbnQgPSBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgIGJlZ2luTWFya2VkQ29udGVudCgnVHgnKSxcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKVxuICAgIF0sIGxpbmVzLCBbXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgZW5kTWFya2VkQ29udGVudCgpLFxuICAgIF0pO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKClcbiAgICBdLCBiYWNrZ3JvdW5kLCBoaWdobGlnaHRzLCBjbGlwcGluZ0FyZWEsIG1hcmtlZENvbnRlbnQsIFtcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0pO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvbnMuanMubWFwIiwiaW1wb3J0IHsgYXNOdW1iZXIsIGFzUERGTmFtZSwgYXNQREZOdW1iZXIgfSBmcm9tIFwiLi9vYmplY3RzXCI7XG5pbXBvcnQgeyBkZWdyZWVzVG9SYWRpYW5zIH0gZnJvbSBcIi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZPcGVyYXRvciwgUERGT3BlcmF0b3JOYW1lcyBhcyBPcHMsIH0gZnJvbSBcIi4uL2NvcmVcIjtcbi8qID09PT09PT09PT09PT09PT09PT09IENsaXBwaW5nIFBhdGggT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIGNsaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQ2xpcE5vblplcm8pOyB9O1xuZXhwb3J0IHZhciBjbGlwRXZlbk9kZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5DbGlwRXZlbk9kZCk7IH07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBHcmFwaGljcyBTdGF0ZSBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbnZhciBjb3MgPSBNYXRoLmNvcywgc2luID0gTWF0aC5zaW4sIHRhbiA9IE1hdGgudGFuO1xuZXhwb3J0IHZhciBjb25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeCA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Db25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeCwgW1xuICAgICAgICBhc1BERk51bWJlcihhKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYiksXG4gICAgICAgIGFzUERGTnVtYmVyKGMpLFxuICAgICAgICBhc1BERk51bWJlcihkKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZSksXG4gICAgICAgIGFzUERGTnVtYmVyKGYpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgdHJhbnNsYXRlID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MpIHtcbiAgICByZXR1cm4gY29uY2F0VHJhbnNmb3JtYXRpb25NYXRyaXgoMSwgMCwgMCwgMSwgeFBvcywgeVBvcyk7XG59O1xuZXhwb3J0IHZhciBzY2FsZSA9IGZ1bmN0aW9uICh4UG9zLCB5UG9zKSB7XG4gICAgcmV0dXJuIGNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4KHhQb3MsIDAsIDAsIHlQb3MsIDAsIDApO1xufTtcbmV4cG9ydCB2YXIgcm90YXRlUmFkaWFucyA9IGZ1bmN0aW9uIChhbmdsZSkge1xuICAgIHJldHVybiBjb25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeChjb3MoYXNOdW1iZXIoYW5nbGUpKSwgc2luKGFzTnVtYmVyKGFuZ2xlKSksIC1zaW4oYXNOdW1iZXIoYW5nbGUpKSwgY29zKGFzTnVtYmVyKGFuZ2xlKSksIDAsIDApO1xufTtcbmV4cG9ydCB2YXIgcm90YXRlRGVncmVlcyA9IGZ1bmN0aW9uIChhbmdsZSkge1xuICAgIHJldHVybiByb3RhdGVSYWRpYW5zKGRlZ3JlZXNUb1JhZGlhbnMoYXNOdW1iZXIoYW5nbGUpKSk7XG59O1xuZXhwb3J0IHZhciBza2V3UmFkaWFucyA9IGZ1bmN0aW9uICh4U2tld0FuZ2xlLCB5U2tld0FuZ2xlKSB7XG4gICAgcmV0dXJuIGNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4KDEsIHRhbihhc051bWJlcih4U2tld0FuZ2xlKSksIHRhbihhc051bWJlcih5U2tld0FuZ2xlKSksIDEsIDAsIDApO1xufTtcbmV4cG9ydCB2YXIgc2tld0RlZ3JlZXMgPSBmdW5jdGlvbiAoeFNrZXdBbmdsZSwgeVNrZXdBbmdsZSkge1xuICAgIHJldHVybiBza2V3UmFkaWFucyhkZWdyZWVzVG9SYWRpYW5zKGFzTnVtYmVyKHhTa2V3QW5nbGUpKSwgZGVncmVlc1RvUmFkaWFucyhhc051bWJlcih5U2tld0FuZ2xlKSkpO1xufTtcbmV4cG9ydCB2YXIgc2V0RGFzaFBhdHRlcm4gPSBmdW5jdGlvbiAoZGFzaEFycmF5LCBkYXNoUGhhc2UpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldExpbmVEYXNoUGF0dGVybiwgW1xuICAgICAgICBcIltcIiArIGRhc2hBcnJheS5tYXAoYXNQREZOdW1iZXIpLmpvaW4oJyAnKSArIFwiXVwiLFxuICAgICAgICBhc1BERk51bWJlcihkYXNoUGhhc2UpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgcmVzdG9yZURhc2hQYXR0ZXJuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gc2V0RGFzaFBhdHRlcm4oW10sIDApOyB9O1xuZXhwb3J0IHZhciBMaW5lQ2FwU3R5bGU7XG4oZnVuY3Rpb24gKExpbmVDYXBTdHlsZSkge1xuICAgIExpbmVDYXBTdHlsZVtMaW5lQ2FwU3R5bGVbXCJCdXR0XCJdID0gMF0gPSBcIkJ1dHRcIjtcbiAgICBMaW5lQ2FwU3R5bGVbTGluZUNhcFN0eWxlW1wiUm91bmRcIl0gPSAxXSA9IFwiUm91bmRcIjtcbiAgICBMaW5lQ2FwU3R5bGVbTGluZUNhcFN0eWxlW1wiUHJvamVjdGluZ1wiXSA9IDJdID0gXCJQcm9qZWN0aW5nXCI7XG59KShMaW5lQ2FwU3R5bGUgfHwgKExpbmVDYXBTdHlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIHNldExpbmVDYXAgPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldExpbmVDYXBTdHlsZSwgW2FzUERGTnVtYmVyKHN0eWxlKV0pO1xufTtcbmV4cG9ydCB2YXIgTGluZUpvaW5TdHlsZTtcbihmdW5jdGlvbiAoTGluZUpvaW5TdHlsZSkge1xuICAgIExpbmVKb2luU3R5bGVbTGluZUpvaW5TdHlsZVtcIk1pdGVyXCJdID0gMF0gPSBcIk1pdGVyXCI7XG4gICAgTGluZUpvaW5TdHlsZVtMaW5lSm9pblN0eWxlW1wiUm91bmRcIl0gPSAxXSA9IFwiUm91bmRcIjtcbiAgICBMaW5lSm9pblN0eWxlW0xpbmVKb2luU3R5bGVbXCJCZXZlbFwiXSA9IDJdID0gXCJCZXZlbFwiO1xufSkoTGluZUpvaW5TdHlsZSB8fCAoTGluZUpvaW5TdHlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIHNldExpbmVKb2luID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRMaW5lSm9pblN0eWxlLCBbYXNQREZOdW1iZXIoc3R5bGUpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRHcmFwaGljc1N0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRHcmFwaGljc1N0YXRlUGFyYW1zLCBbYXNQREZOYW1lKHN0YXRlKV0pO1xufTtcbmV4cG9ydCB2YXIgcHVzaEdyYXBoaWNzU3RhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuUHVzaEdyYXBoaWNzU3RhdGUpOyB9O1xuZXhwb3J0IHZhciBwb3BHcmFwaGljc1N0YXRlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlBvcEdyYXBoaWNzU3RhdGUpOyB9O1xuZXhwb3J0IHZhciBzZXRMaW5lV2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldExpbmVXaWR0aCwgW2FzUERGTnVtYmVyKHdpZHRoKV0pO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IFBhdGggQ29uc3RydWN0aW9uIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBhcHBlbmRCZXppZXJDdXJ2ZSA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5BcHBlbmRCZXppZXJDdXJ2ZSwgW1xuICAgICAgICBhc1BERk51bWJlcih4MSksXG4gICAgICAgIGFzUERGTnVtYmVyKHkxKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeDIpLFxuICAgICAgICBhc1BERk51bWJlcih5MiksXG4gICAgICAgIGFzUERGTnVtYmVyKHgzKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeTMpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgYXBwZW5kUXVhZHJhdGljQ3VydmUgPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkN1cnZlVG9SZXBsaWNhdGVJbml0aWFsUG9pbnQsIFtcbiAgICAgICAgYXNQREZOdW1iZXIoeDEpLFxuICAgICAgICBhc1BERk51bWJlcih5MSksXG4gICAgICAgIGFzUERGTnVtYmVyKHgyKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeTIpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgY2xvc2VQYXRoID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkNsb3NlUGF0aCk7IH07XG5leHBvcnQgdmFyIG1vdmVUbyA9IGZ1bmN0aW9uICh4UG9zLCB5UG9zKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Nb3ZlVG8sIFthc1BERk51bWJlcih4UG9zKSwgYXNQREZOdW1iZXIoeVBvcyldKTtcbn07XG5leHBvcnQgdmFyIGxpbmVUbyA9IGZ1bmN0aW9uICh4UG9zLCB5UG9zKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5MaW5lVG8sIFthc1BERk51bWJlcih4UG9zKSwgYXNQREZOdW1iZXIoeVBvcyldKTtcbn07XG4vKipcbiAqIEBwYXJhbSB4UG9zIHggY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGVcbiAqIEBwYXJhbSB5UG9zIHkgY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGVcbiAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlXG4gKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlXG4gKi9cbmV4cG9ydCB2YXIgcmVjdGFuZ2xlID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkFwcGVuZFJlY3RhbmdsZSwgW1xuICAgICAgICBhc1BERk51bWJlcih4UG9zKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeVBvcyksXG4gICAgICAgIGFzUERGTnVtYmVyKHdpZHRoKSxcbiAgICAgICAgYXNQREZOdW1iZXIoaGVpZ2h0KSxcbiAgICBdKTtcbn07XG4vKipcbiAqIEBwYXJhbSB4UG9zIHggY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBzcXVhcmVcbiAqIEBwYXJhbSB5UG9zIHkgY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBzcXVhcmVcbiAqIEBwYXJhbSBzaXplIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNxdWFyZVxuICovXG5leHBvcnQgdmFyIHNxdWFyZSA9IGZ1bmN0aW9uICh4UG9zLCB5UG9zLCBzaXplKSB7XG4gICAgcmV0dXJuIHJlY3RhbmdsZSh4UG9zLCB5UG9zLCBzaXplLCBzaXplKTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBQYXRoIFBhaW50aW5nIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBzdHJva2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU3Ryb2tlUGF0aCk7IH07XG5leHBvcnQgdmFyIGZpbGwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuRmlsbE5vblplcm8pOyB9O1xuZXhwb3J0IHZhciBmaWxsQW5kU3Ryb2tlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkZpbGxOb25aZXJvQW5kU3Ryb2tlKTsgfTtcbmV4cG9ydCB2YXIgZW5kUGF0aCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5FbmRQYXRoKTsgfTtcbi8qID09PT09PT09PT09PT09PT09PT09IFRleHQgUG9zaXRpb25pbmcgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIG5leHRMaW5lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLk5leHRMaW5lKTsgfTtcbmV4cG9ydCB2YXIgbW92ZVRleHQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTW92ZVRleHQsIFthc1BERk51bWJlcih4KSwgYXNQREZOdW1iZXIoeSldKTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBUZXh0IFNob3dpbmcgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIHNob3dUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNob3dUZXh0LCBbdGV4dF0pO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IFRleHQgU3RhdGUgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIGJlZ2luVGV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5CZWdpblRleHQpOyB9O1xuZXhwb3J0IHZhciBlbmRUZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkVuZFRleHQpOyB9O1xuZXhwb3J0IHZhciBzZXRGb250QW5kU2l6ZSA9IGZ1bmN0aW9uIChuYW1lLCBzaXplKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0Rm9udEFuZFNpemUsIFthc1BERk5hbWUobmFtZSksIGFzUERGTnVtYmVyKHNpemUpXSk7IH07XG5leHBvcnQgdmFyIHNldENoYXJhY3RlclNwYWNpbmcgPSBmdW5jdGlvbiAoc3BhY2luZykge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0Q2hhcmFjdGVyU3BhY2luZywgW2FzUERGTnVtYmVyKHNwYWNpbmcpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRXb3JkU3BhY2luZyA9IGZ1bmN0aW9uIChzcGFjaW5nKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRXb3JkU3BhY2luZywgW2FzUERGTnVtYmVyKHNwYWNpbmcpXSk7XG59O1xuLyoqIEBwYXJhbSBzcXVlZXplIGhvcml6b250YWwgY2hhcmFjdGVyIHNwYWNpbmcgKi9cbmV4cG9ydCB2YXIgc2V0Q2hhcmFjdGVyU3F1ZWV6ZSA9IGZ1bmN0aW9uIChzcXVlZXplKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRUZXh0SG9yaXpvbnRhbFNjYWxpbmcsIFthc1BERk51bWJlcihzcXVlZXplKV0pO1xufTtcbmV4cG9ydCB2YXIgc2V0TGluZUhlaWdodCA9IGZ1bmN0aW9uIChsaW5lSGVpZ2h0KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRUZXh0TGluZUhlaWdodCwgW2FzUERGTnVtYmVyKGxpbmVIZWlnaHQpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRUZXh0UmlzZSA9IGZ1bmN0aW9uIChyaXNlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRUZXh0UmlzZSwgW2FzUERGTnVtYmVyKHJpc2UpXSk7XG59O1xuZXhwb3J0IHZhciBUZXh0UmVuZGVyaW5nTW9kZTtcbihmdW5jdGlvbiAoVGV4dFJlbmRlcmluZ01vZGUpIHtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIkZpbGxcIl0gPSAwXSA9IFwiRmlsbFwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiT3V0bGluZVwiXSA9IDFdID0gXCJPdXRsaW5lXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJGaWxsQW5kT3V0bGluZVwiXSA9IDJdID0gXCJGaWxsQW5kT3V0bGluZVwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiSW52aXNpYmxlXCJdID0gM10gPSBcIkludmlzaWJsZVwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiRmlsbEFuZENsaXBcIl0gPSA0XSA9IFwiRmlsbEFuZENsaXBcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIk91dGxpbmVBbmRDbGlwXCJdID0gNV0gPSBcIk91dGxpbmVBbmRDbGlwXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJGaWxsQW5kT3V0bGluZUFuZENsaXBcIl0gPSA2XSA9IFwiRmlsbEFuZE91dGxpbmVBbmRDbGlwXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJDbGlwXCJdID0gN10gPSBcIkNsaXBcIjtcbn0pKFRleHRSZW5kZXJpbmdNb2RlIHx8IChUZXh0UmVuZGVyaW5nTW9kZSA9IHt9KSk7XG5leHBvcnQgdmFyIHNldFRleHRSZW5kZXJpbmdNb2RlID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFRleHRSZW5kZXJpbmdNb2RlLCBbYXNQREZOdW1iZXIobW9kZSldKTtcbn07XG5leHBvcnQgdmFyIHNldFRleHRNYXRyaXggPSBmdW5jdGlvbiAoYSwgYiwgYywgZCwgZSwgZikge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0VGV4dE1hdHJpeCwgW1xuICAgICAgICBhc1BERk51bWJlcihhKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYiksXG4gICAgICAgIGFzUERGTnVtYmVyKGMpLFxuICAgICAgICBhc1BERk51bWJlcihkKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZSksXG4gICAgICAgIGFzUERGTnVtYmVyKGYpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgcm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlID0gZnVuY3Rpb24gKHJvdGF0aW9uQW5nbGUsIHhTa2V3QW5nbGUsIHlTa2V3QW5nbGUsIHgsIHkpIHtcbiAgICByZXR1cm4gc2V0VGV4dE1hdHJpeChjb3MoYXNOdW1iZXIocm90YXRpb25BbmdsZSkpLCBzaW4oYXNOdW1iZXIocm90YXRpb25BbmdsZSkpICsgdGFuKGFzTnVtYmVyKHhTa2V3QW5nbGUpKSwgLXNpbihhc051bWJlcihyb3RhdGlvbkFuZ2xlKSkgKyB0YW4oYXNOdW1iZXIoeVNrZXdBbmdsZSkpLCBjb3MoYXNOdW1iZXIocm90YXRpb25BbmdsZSkpLCB4LCB5KTtcbn07XG5leHBvcnQgdmFyIHJvdGF0ZUFuZFNrZXdUZXh0RGVncmVlc0FuZFRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChyb3RhdGlvbkFuZ2xlLCB4U2tld0FuZ2xlLCB5U2tld0FuZ2xlLCB4LCB5KSB7XG4gICAgcmV0dXJuIHJvdGF0ZUFuZFNrZXdUZXh0UmFkaWFuc0FuZFRyYW5zbGF0ZShkZWdyZWVzVG9SYWRpYW5zKGFzTnVtYmVyKHJvdGF0aW9uQW5nbGUpKSwgZGVncmVlc1RvUmFkaWFucyhhc051bWJlcih4U2tld0FuZ2xlKSksIGRlZ3JlZXNUb1JhZGlhbnMoYXNOdW1iZXIoeVNrZXdBbmdsZSkpLCB4LCB5KTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBYT2JqZWN0IE9wZXJhdG9yID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIGRyYXdPYmplY3QgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuRHJhd09iamVjdCwgW2FzUERGTmFtZShuYW1lKV0pO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IENvbG9yIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBzZXRGaWxsaW5nR3JheXNjYWxlQ29sb3IgPSBmdW5jdGlvbiAoZ3JheSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTm9uU3Ryb2tpbmdDb2xvckdyYXksIFthc1BERk51bWJlcihncmF5KV0pO1xufTtcbmV4cG9ydCB2YXIgc2V0U3Ryb2tpbmdHcmF5c2NhbGVDb2xvciA9IGZ1bmN0aW9uIChncmF5KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TdHJva2luZ0NvbG9yR3JheSwgW2FzUERGTnVtYmVyKGdyYXkpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRGaWxsaW5nUmdiQ29sb3IgPSBmdW5jdGlvbiAocmVkLCBncmVlbiwgYmx1ZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTm9uU3Ryb2tpbmdDb2xvclJnYiwgW1xuICAgICAgICBhc1BERk51bWJlcihyZWQpLFxuICAgICAgICBhc1BERk51bWJlcihncmVlbiksXG4gICAgICAgIGFzUERGTnVtYmVyKGJsdWUpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgc2V0U3Ryb2tpbmdSZ2JDb2xvciA9IGZ1bmN0aW9uIChyZWQsIGdyZWVuLCBibHVlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TdHJva2luZ0NvbG9yUmdiLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKHJlZCksXG4gICAgICAgIGFzUERGTnVtYmVyKGdyZWVuKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYmx1ZSksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBzZXRGaWxsaW5nQ215a0NvbG9yID0gZnVuY3Rpb24gKGN5YW4sIG1hZ2VudGEsIHllbGxvdywga2V5KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Ob25TdHJva2luZ0NvbG9yQ215aywgW1xuICAgICAgICBhc1BERk51bWJlcihjeWFuKSxcbiAgICAgICAgYXNQREZOdW1iZXIobWFnZW50YSksXG4gICAgICAgIGFzUERGTnVtYmVyKHllbGxvdyksXG4gICAgICAgIGFzUERGTnVtYmVyKGtleSksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBzZXRTdHJva2luZ0NteWtDb2xvciA9IGZ1bmN0aW9uIChjeWFuLCBtYWdlbnRhLCB5ZWxsb3csIGtleSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU3Ryb2tpbmdDb2xvckNteWssIFtcbiAgICAgICAgYXNQREZOdW1iZXIoY3lhbiksXG4gICAgICAgIGFzUERGTnVtYmVyKG1hZ2VudGEpLFxuICAgICAgICBhc1BERk51bWJlcih5ZWxsb3cpLFxuICAgICAgICBhc1BERk51bWJlcihrZXkpLFxuICAgIF0pO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IE1hcmtlZCBDb250ZW50IE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBiZWdpbk1hcmtlZENvbnRlbnQgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5CZWdpbk1hcmtlZENvbnRlbnQsIFthc1BERk5hbWUodGFnKV0pO1xufTtcbmV4cG9ydCB2YXIgZW5kTWFya2VkQ29udGVudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5FbmRNYXJrZWRDb250ZW50KTsgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdG9ycy5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnRJcywgZXJyb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmV4cG9ydCB2YXIgUm90YXRpb25UeXBlcztcbihmdW5jdGlvbiAoUm90YXRpb25UeXBlcykge1xuICAgIFJvdGF0aW9uVHlwZXNbXCJEZWdyZWVzXCJdID0gXCJkZWdyZWVzXCI7XG4gICAgUm90YXRpb25UeXBlc1tcIlJhZGlhbnNcIl0gPSBcInJhZGlhbnNcIjtcbn0pKFJvdGF0aW9uVHlwZXMgfHwgKFJvdGF0aW9uVHlwZXMgPSB7fSkpO1xuZXhwb3J0IHZhciByYWRpYW5zID0gZnVuY3Rpb24gKHJhZGlhbkFuZ2xlKSB7XG4gICAgYXNzZXJ0SXMocmFkaWFuQW5nbGUsICdyYWRpYW5BbmdsZScsIFsnbnVtYmVyJ10pO1xuICAgIHJldHVybiB7IHR5cGU6IFJvdGF0aW9uVHlwZXMuUmFkaWFucywgYW5nbGU6IHJhZGlhbkFuZ2xlIH07XG59O1xuZXhwb3J0IHZhciBkZWdyZWVzID0gZnVuY3Rpb24gKGRlZ3JlZUFuZ2xlKSB7XG4gICAgYXNzZXJ0SXMoZGVncmVlQW5nbGUsICdkZWdyZWVBbmdsZScsIFsnbnVtYmVyJ10pO1xuICAgIHJldHVybiB7IHR5cGU6IFJvdGF0aW9uVHlwZXMuRGVncmVlcywgYW5nbGU6IGRlZ3JlZUFuZ2xlIH07XG59O1xudmFyIFJhZGlhbnMgPSBSb3RhdGlvblR5cGVzLlJhZGlhbnMsIERlZ3JlZXMgPSBSb3RhdGlvblR5cGVzLkRlZ3JlZXM7XG5leHBvcnQgdmFyIGRlZ3JlZXNUb1JhZGlhbnMgPSBmdW5jdGlvbiAoZGVncmVlKSB7IHJldHVybiAoZGVncmVlICogTWF0aC5QSSkgLyAxODA7IH07XG5leHBvcnQgdmFyIHJhZGlhbnNUb0RlZ3JlZXMgPSBmdW5jdGlvbiAocmFkaWFuKSB7IHJldHVybiAocmFkaWFuICogMTgwKSAvIE1hdGguUEk7IH07XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB2YXIgdG9SYWRpYW5zID0gZnVuY3Rpb24gKHJvdGF0aW9uKSB7XG4gICAgcmV0dXJuIHJvdGF0aW9uLnR5cGUgPT09IFJhZGlhbnMgPyByb3RhdGlvbi5hbmdsZVxuICAgICAgICA6IHJvdGF0aW9uLnR5cGUgPT09IERlZ3JlZXMgPyBkZWdyZWVzVG9SYWRpYW5zKHJvdGF0aW9uLmFuZ2xlKVxuICAgICAgICAgICAgOiBlcnJvcihcIkludmFsaWQgcm90YXRpb246IFwiICsgSlNPTi5zdHJpbmdpZnkocm90YXRpb24pKTtcbn07XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB2YXIgdG9EZWdyZWVzID0gZnVuY3Rpb24gKHJvdGF0aW9uKSB7XG4gICAgcmV0dXJuIHJvdGF0aW9uLnR5cGUgPT09IFJhZGlhbnMgPyByYWRpYW5zVG9EZWdyZWVzKHJvdGF0aW9uLmFuZ2xlKVxuICAgICAgICA6IHJvdGF0aW9uLnR5cGUgPT09IERlZ3JlZXMgPyByb3RhdGlvbi5hbmdsZVxuICAgICAgICAgICAgOiBlcnJvcihcIkludmFsaWQgcm90YXRpb246IFwiICsgSlNPTi5zdHJpbmdpZnkocm90YXRpb24pKTtcbn07XG5leHBvcnQgdmFyIHJlZHVjZVJvdGF0aW9uID0gZnVuY3Rpb24gKGRlZ3JlZUFuZ2xlKSB7XG4gICAgaWYgKGRlZ3JlZUFuZ2xlID09PSB2b2lkIDApIHsgZGVncmVlQW5nbGUgPSAwOyB9XG4gICAgdmFyIHF1YWRyYW50cyA9IChkZWdyZWVBbmdsZSAvIDkwKSAlIDQ7XG4gICAgaWYgKHF1YWRyYW50cyA9PT0gMClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKHF1YWRyYW50cyA9PT0gMSlcbiAgICAgICAgcmV0dXJuIDkwO1xuICAgIGlmIChxdWFkcmFudHMgPT09IDIpXG4gICAgICAgIHJldHVybiAxODA7XG4gICAgaWYgKHF1YWRyYW50cyA9PT0gMylcbiAgICAgICAgcmV0dXJuIDI3MDtcbiAgICByZXR1cm4gMDsgLy8gYGRlZ3JlZUFuZ2xlYCBpcyBub3QgYSBtdWx0aXBsZSBvZiA5MFxufTtcbmV4cG9ydCB2YXIgYWRqdXN0RGltc0ZvclJvdGF0aW9uID0gZnVuY3Rpb24gKGRpbXMsIGRlZ3JlZUFuZ2xlKSB7XG4gICAgaWYgKGRlZ3JlZUFuZ2xlID09PSB2b2lkIDApIHsgZGVncmVlQW5nbGUgPSAwOyB9XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oZGVncmVlQW5nbGUpO1xuICAgIHJldHVybiByb3RhdGlvbiA9PT0gOTAgfHwgcm90YXRpb24gPT09IDI3MFxuICAgICAgICA/IHsgd2lkdGg6IGRpbXMuaGVpZ2h0LCBoZWlnaHQ6IGRpbXMud2lkdGggfVxuICAgICAgICA6IHsgd2lkdGg6IGRpbXMud2lkdGgsIGhlaWdodDogZGltcy5oZWlnaHQgfTtcbn07XG5leHBvcnQgdmFyIHJvdGF0ZVJlY3RhbmdsZSA9IGZ1bmN0aW9uIChyZWN0YW5nbGUsIGJvcmRlcldpZHRoLCBkZWdyZWVBbmdsZSkge1xuICAgIGlmIChib3JkZXJXaWR0aCA9PT0gdm9pZCAwKSB7IGJvcmRlcldpZHRoID0gMDsgfVxuICAgIGlmIChkZWdyZWVBbmdsZSA9PT0gdm9pZCAwKSB7IGRlZ3JlZUFuZ2xlID0gMDsgfVxuICAgIHZhciB4ID0gcmVjdGFuZ2xlLngsIHkgPSByZWN0YW5nbGUueSwgdyA9IHJlY3RhbmdsZS53aWR0aCwgaCA9IHJlY3RhbmdsZS5oZWlnaHQ7XG4gICAgdmFyIHIgPSByZWR1Y2VSb3RhdGlvbihkZWdyZWVBbmdsZSk7XG4gICAgdmFyIGIgPSBib3JkZXJXaWR0aCAvIDI7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgaWYgKHIgPT09IDApXG4gICAgICAgIHJldHVybiB7IHg6IHggLSBiLCB5OiB5IC0gYiwgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xuICAgIGVsc2UgaWYgKHIgPT09IDkwKVxuICAgICAgICByZXR1cm4geyB4OiB4IC0gaCArIGIsIHk6IHkgLSBiLCB3aWR0aDogaCwgaGVpZ2h0OiB3IH07XG4gICAgZWxzZSBpZiAociA9PT0gMTgwKVxuICAgICAgICByZXR1cm4geyB4OiB4IC0gdyArIGIsIHk6IHkgLSBoICsgYiwgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xuICAgIGVsc2UgaWYgKHIgPT09IDI3MClcbiAgICAgICAgcmV0dXJuIHsgeDogeCAtIGIsIHk6IHkgLSB3ICsgYiwgd2lkdGg6IGgsIGhlaWdodDogdyB9O1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHsgeDogeCAtIGIsIHk6IHkgLSBiLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm90YXRpb25zLmpzLm1hcCIsImV4cG9ydCB2YXIgUGFnZVNpemVzID0ge1xuICAgICc0QTAnOiBbNDc2Ny44NywgNjc0MC43OV0sXG4gICAgJzJBMCc6IFszMzcwLjM5LCA0NzY3Ljg3XSxcbiAgICBBMDogWzIzODMuOTQsIDMzNzAuMzldLFxuICAgIEExOiBbMTY4My43OCwgMjM4My45NF0sXG4gICAgQTI6IFsxMTkwLjU1LCAxNjgzLjc4XSxcbiAgICBBMzogWzg0MS44OSwgMTE5MC41NV0sXG4gICAgQTQ6IFs1OTUuMjgsIDg0MS44OV0sXG4gICAgQTU6IFs0MTkuNTMsIDU5NS4yOF0sXG4gICAgQTY6IFsyOTcuNjQsIDQxOS41M10sXG4gICAgQTc6IFsyMDkuNzYsIDI5Ny42NF0sXG4gICAgQTg6IFsxNDcuNCwgMjA5Ljc2XSxcbiAgICBBOTogWzEwNC44OCwgMTQ3LjRdLFxuICAgIEExMDogWzczLjcsIDEwNC44OF0sXG4gICAgQjA6IFsyODM0LjY1LCA0MDA4LjE5XSxcbiAgICBCMTogWzIwMDQuMDksIDI4MzQuNjVdLFxuICAgIEIyOiBbMTQxNy4zMiwgMjAwNC4wOV0sXG4gICAgQjM6IFsxMDAwLjYzLCAxNDE3LjMyXSxcbiAgICBCNDogWzcwOC42NiwgMTAwMC42M10sXG4gICAgQjU6IFs0OTguOSwgNzA4LjY2XSxcbiAgICBCNjogWzM1NC4zMywgNDk4LjldLFxuICAgIEI3OiBbMjQ5LjQ1LCAzNTQuMzNdLFxuICAgIEI4OiBbMTc1Ljc1LCAyNDkuNDVdLFxuICAgIEI5OiBbMTI0LjcyLCAxNzUuNzVdLFxuICAgIEIxMDogWzg3Ljg3LCAxMjQuNzJdLFxuICAgIEMwOiBbMjU5OS4zNywgMzY3Ni41NF0sXG4gICAgQzE6IFsxODM2Ljg1LCAyNTk5LjM3XSxcbiAgICBDMjogWzEyOTguMjcsIDE4MzYuODVdLFxuICAgIEMzOiBbOTE4LjQzLCAxMjk4LjI3XSxcbiAgICBDNDogWzY0OS4xMywgOTE4LjQzXSxcbiAgICBDNTogWzQ1OS4yMSwgNjQ5LjEzXSxcbiAgICBDNjogWzMyMy4xNSwgNDU5LjIxXSxcbiAgICBDNzogWzIyOS42MSwgMzIzLjE1XSxcbiAgICBDODogWzE2MS41NywgMjI5LjYxXSxcbiAgICBDOTogWzExMy4zOSwgMTYxLjU3XSxcbiAgICBDMTA6IFs3OS4zNywgMTEzLjM5XSxcbiAgICBSQTA6IFsyNDM3LjgsIDM0NTguMjddLFxuICAgIFJBMTogWzE3MjkuMTMsIDI0MzcuOF0sXG4gICAgUkEyOiBbMTIxOC45LCAxNzI5LjEzXSxcbiAgICBSQTM6IFs4NjQuNTcsIDEyMTguOV0sXG4gICAgUkE0OiBbNjA5LjQ1LCA4NjQuNTddLFxuICAgIFNSQTA6IFsyNTUxLjE4LCAzNjI4LjM1XSxcbiAgICBTUkExOiBbMTgxNC4xNywgMjU1MS4xOF0sXG4gICAgU1JBMjogWzEyNzUuNTksIDE4MTQuMTddLFxuICAgIFNSQTM6IFs5MDcuMDksIDEyNzUuNTldLFxuICAgIFNSQTQ6IFs2MzcuOCwgOTA3LjA5XSxcbiAgICBFeGVjdXRpdmU6IFs1MjEuODYsIDc1Ni4wXSxcbiAgICBGb2xpbzogWzYxMi4wLCA5MzYuMF0sXG4gICAgTGVnYWw6IFs2MTIuMCwgMTAwOC4wXSxcbiAgICBMZXR0ZXI6IFs2MTIuMCwgNzkyLjBdLFxuICAgIFRhYmxvaWQ6IFs3OTIuMCwgMTIyNC4wXSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaXplcy5qcy5tYXAiLCIvLyBPcmlnaW5hdGVkIGZyb20gcGRma2l0IENvcHlyaWdodCAoYykgMjAxNCBEZXZvbiBHb3ZldHRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdC9ibG9iLzFlNjJlNmZmZTI0YjM3OGViODkwZGY1MDdhNDc2MTBmNGM0YTdiMjQvbGliL3BhdGguanNcbi8vIE1JVCBMSUNFTlNFXG4vLyBVcGRhdGVkIGZvciBwZGYtbGliICYgVHlwZVNjcmlwdCBieSBKZXJlbXkgTWVzc2VuZ2VyXG5pbXBvcnQgeyBhcHBlbmRCZXppZXJDdXJ2ZSwgYXBwZW5kUXVhZHJhdGljQ3VydmUsIGNsb3NlUGF0aCwgbGluZVRvLCBtb3ZlVG8sIH0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG52YXIgY3ggPSAwO1xudmFyIGN5ID0gMDtcbnZhciBweCA9IDA7XG52YXIgcHkgPSAwO1xudmFyIHN4ID0gMDtcbnZhciBzeSA9IDA7XG52YXIgcGFyYW1ldGVycyA9IG5ldyBNYXAoW1xuICAgIFsnQScsIDddLFxuICAgIFsnYScsIDddLFxuICAgIFsnQycsIDZdLFxuICAgIFsnYycsIDZdLFxuICAgIFsnSCcsIDFdLFxuICAgIFsnaCcsIDFdLFxuICAgIFsnTCcsIDJdLFxuICAgIFsnbCcsIDJdLFxuICAgIFsnTScsIDJdLFxuICAgIFsnbScsIDJdLFxuICAgIFsnUScsIDRdLFxuICAgIFsncScsIDRdLFxuICAgIFsnUycsIDRdLFxuICAgIFsncycsIDRdLFxuICAgIFsnVCcsIDJdLFxuICAgIFsndCcsIDJdLFxuICAgIFsnVicsIDFdLFxuICAgIFsndicsIDFdLFxuICAgIFsnWicsIDBdLFxuICAgIFsneicsIDBdLFxuXSk7XG52YXIgcGFyc2UgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIHZhciBjbWQ7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGN1ckFyZyA9ICcnO1xuICAgIHZhciBmb3VuZERlY2ltYWwgPSBmYWxzZTtcbiAgICB2YXIgcGFyYW1zID0gMDtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHBhdGhfMSA9IHBhdGg7IF9pIDwgcGF0aF8xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgYyA9IHBhdGhfMVtfaV07XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLmhhcyhjKSkge1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1ldGVycy5nZXQoYyk7XG4gICAgICAgICAgICBpZiAoY21kKSB7XG4gICAgICAgICAgICAgICAgLy8gc2F2ZSBleGlzdGluZyBjb21tYW5kXG4gICAgICAgICAgICAgICAgaWYgKGN1ckFyZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGhdID0gK2N1ckFyZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0W3JldC5sZW5ndGhdID0geyBjbWQ6IGNtZCwgYXJnczogYXJncyB9O1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBjdXJBcmcgPSAnJztcbiAgICAgICAgICAgICAgICBmb3VuZERlY2ltYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNtZCA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoWycgJywgJywnXS5pbmNsdWRlcyhjKSB8fFxuICAgICAgICAgICAgKGMgPT09ICctJyAmJiBjdXJBcmcubGVuZ3RoID4gMCAmJiBjdXJBcmdbY3VyQXJnLmxlbmd0aCAtIDFdICE9PSAnZScpIHx8XG4gICAgICAgICAgICAoYyA9PT0gJy4nICYmIGZvdW5kRGVjaW1hbCkpIHtcbiAgICAgICAgICAgIGlmIChjdXJBcmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IHBhcmFtcykge1xuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSByZXVzZWQgY29tbWFuZHNcbiAgICAgICAgICAgICAgICByZXRbcmV0Lmxlbmd0aF0gPSB7IGNtZDogY21kLCBhcmdzOiBhcmdzIH07XG4gICAgICAgICAgICAgICAgYXJncyA9IFsrY3VyQXJnXTtcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXNzdW1lZCBjb21tYW5kc1xuICAgICAgICAgICAgICAgIGlmIChjbWQgPT09ICdNJykge1xuICAgICAgICAgICAgICAgICAgICBjbWQgPSAnTCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjbWQgPT09ICdtJykge1xuICAgICAgICAgICAgICAgICAgICBjbWQgPSAnbCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aF0gPSArY3VyQXJnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm91bmREZWNpbWFsID0gYyA9PT0gJy4nO1xuICAgICAgICAgICAgLy8gZml4IGZvciBuZWdhdGl2ZSBudW1iZXJzIG9yIHJlcGVhdGVkIGRlY2ltYWxzIHdpdGggbm8gZGVsaW1ldGVyIGJldHdlZW4gY29tbWFuZHNcbiAgICAgICAgICAgIGN1ckFyZyA9IFsnLScsICcuJ10uaW5jbHVkZXMoYykgPyBjIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjdXJBcmcgKz0gYztcbiAgICAgICAgICAgIGlmIChjID09PSAnLicpIHtcbiAgICAgICAgICAgICAgICBmb3VuZERlY2ltYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGFkZCB0aGUgbGFzdCBjb21tYW5kXG4gICAgaWYgKGN1ckFyZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gcGFyYW1zKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgcmV1c2VkIGNvbW1hbmRzXG4gICAgICAgICAgICByZXRbcmV0Lmxlbmd0aF0gPSB7IGNtZDogY21kLCBhcmdzOiBhcmdzIH07XG4gICAgICAgICAgICBhcmdzID0gWytjdXJBcmddO1xuICAgICAgICAgICAgLy8gaGFuZGxlIGFzc3VtZWQgY29tbWFuZHNcbiAgICAgICAgICAgIGlmIChjbWQgPT09ICdNJykge1xuICAgICAgICAgICAgICAgIGNtZCA9ICdMJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjbWQgPT09ICdtJykge1xuICAgICAgICAgICAgICAgIGNtZCA9ICdsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGhdID0gK2N1ckFyZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXRbcmV0Lmxlbmd0aF0gPSB7IGNtZDogY21kLCBhcmdzOiBhcmdzIH07XG4gICAgcmV0dXJuIHJldDtcbn07XG52YXIgYXBwbHkgPSBmdW5jdGlvbiAoY29tbWFuZHMpIHtcbiAgICAvLyBjdXJyZW50IHBvaW50LCBjb250cm9sIHBvaW50LCBhbmQgc3VicGF0aCBzdGFydGluZyBwb2ludFxuICAgIGN4ID0gY3kgPSBweCA9IHB5ID0gc3ggPSBzeSA9IDA7XG4gICAgLy8gcnVuIHRoZSBjb21tYW5kc1xuICAgIHZhciBjbWRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYyA9IGNvbW1hbmRzW2ldO1xuICAgICAgICBpZiAoYy5jbWQgJiYgdHlwZW9mIHJ1bm5lcnNbYy5jbWRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgY21kID0gcnVubmVyc1tjLmNtZF0oYy5hcmdzKTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNtZCkpIHtcbiAgICAgICAgICAgICAgICBjbWRzID0gY21kcy5jb25jYXQoY21kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNtZHMucHVzaChjbWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbWRzO1xufTtcbnZhciBydW5uZXJzID0ge1xuICAgIE06IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN4ID0gYVswXTtcbiAgICAgICAgY3kgPSBhWzFdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgc3ggPSBjeDtcbiAgICAgICAgc3kgPSBjeTtcbiAgICAgICAgcmV0dXJuIG1vdmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgbTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggKz0gYVswXTtcbiAgICAgICAgY3kgKz0gYVsxXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHN4ID0gY3g7XG4gICAgICAgIHN5ID0gY3k7XG4gICAgICAgIHJldHVybiBtb3ZlVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIEM6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN4ID0gYVs0XTtcbiAgICAgICAgY3kgPSBhWzVdO1xuICAgICAgICBweCA9IGFbMl07XG4gICAgICAgIHB5ID0gYVszXTtcbiAgICAgICAgcmV0dXJuIGFwcGVuZEJlemllckN1cnZlKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0pO1xuICAgIH0sXG4gICAgYzogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIGNtZCA9IGFwcGVuZEJlemllckN1cnZlKGFbMF0gKyBjeCwgYVsxXSArIGN5LCBhWzJdICsgY3gsIGFbM10gKyBjeSwgYVs0XSArIGN4LCBhWzVdICsgY3kpO1xuICAgICAgICBweCA9IGN4ICsgYVsyXTtcbiAgICAgICAgcHkgPSBjeSArIGFbM107XG4gICAgICAgIGN4ICs9IGFbNF07XG4gICAgICAgIGN5ICs9IGFbNV07XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICBTOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBpZiAocHggPT09IG51bGwgfHwgcHkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHB4ID0gY3g7XG4gICAgICAgICAgICBweSA9IGN5O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRCZXppZXJDdXJ2ZShjeCAtIChweCAtIGN4KSwgY3kgLSAocHkgLSBjeSksIGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xuICAgICAgICBweCA9IGFbMF07XG4gICAgICAgIHB5ID0gYVsxXTtcbiAgICAgICAgY3ggPSBhWzJdO1xuICAgICAgICBjeSA9IGFbM107XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICBzOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBpZiAocHggPT09IG51bGwgfHwgcHkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHB4ID0gY3g7XG4gICAgICAgICAgICBweSA9IGN5O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRCZXppZXJDdXJ2ZShjeCAtIChweCAtIGN4KSwgY3kgLSAocHkgLSBjeSksIGN4ICsgYVswXSwgY3kgKyBhWzFdLCBjeCArIGFbMl0sIGN5ICsgYVszXSk7XG4gICAgICAgIHB4ID0gY3ggKyBhWzBdO1xuICAgICAgICBweSA9IGN5ICsgYVsxXTtcbiAgICAgICAgY3ggKz0gYVsyXTtcbiAgICAgICAgY3kgKz0gYVszXTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIFE6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHB4ID0gYVswXTtcbiAgICAgICAgcHkgPSBhWzFdO1xuICAgICAgICBjeCA9IGFbMl07XG4gICAgICAgIGN5ID0gYVszXTtcbiAgICAgICAgcmV0dXJuIGFwcGVuZFF1YWRyYXRpY0N1cnZlKGFbMF0sIGFbMV0sIGN4LCBjeSk7XG4gICAgfSxcbiAgICBxOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgY21kID0gYXBwZW5kUXVhZHJhdGljQ3VydmUoYVswXSArIGN4LCBhWzFdICsgY3ksIGFbMl0gKyBjeCwgYVszXSArIGN5KTtcbiAgICAgICAgcHggPSBjeCArIGFbMF07XG4gICAgICAgIHB5ID0gY3kgKyBhWzFdO1xuICAgICAgICBjeCArPSBhWzJdO1xuICAgICAgICBjeSArPSBhWzNdO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgVDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgaWYgKHB4ID09PSBudWxsIHx8IHB5ID09PSBudWxsKSB7XG4gICAgICAgICAgICBweCA9IGN4O1xuICAgICAgICAgICAgcHkgPSBjeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHB4ID0gY3ggLSAocHggLSBjeCk7XG4gICAgICAgICAgICBweSA9IGN5IC0gKHB5IC0gY3kpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRRdWFkcmF0aWNDdXJ2ZShweCwgcHksIGFbMF0sIGFbMV0pO1xuICAgICAgICBweCA9IGN4IC0gKHB4IC0gY3gpO1xuICAgICAgICBweSA9IGN5IC0gKHB5IC0gY3kpO1xuICAgICAgICBjeCA9IGFbMF07XG4gICAgICAgIGN5ID0gYVsxXTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIHQ6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGlmIChweCA9PT0gbnVsbCB8fCBweSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHggPSBjeDtcbiAgICAgICAgICAgIHB5ID0gY3k7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBweCA9IGN4IC0gKHB4IC0gY3gpO1xuICAgICAgICAgICAgcHkgPSBjeSAtIChweSAtIGN5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY21kID0gYXBwZW5kUXVhZHJhdGljQ3VydmUocHgsIHB5LCBjeCArIGFbMF0sIGN5ICsgYVsxXSk7XG4gICAgICAgIGN4ICs9IGFbMF07XG4gICAgICAgIGN5ICs9IGFbMV07XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICBBOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgY21kcyA9IHNvbHZlQXJjKGN4LCBjeSwgYSk7XG4gICAgICAgIGN4ID0gYVs1XTtcbiAgICAgICAgY3kgPSBhWzZdO1xuICAgICAgICByZXR1cm4gY21kcztcbiAgICB9LFxuICAgIGE6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGFbNV0gKz0gY3g7XG4gICAgICAgIGFbNl0gKz0gY3k7XG4gICAgICAgIHZhciBjbWRzID0gc29sdmVBcmMoY3gsIGN5LCBhKTtcbiAgICAgICAgY3ggPSBhWzVdO1xuICAgICAgICBjeSA9IGFbNl07XG4gICAgICAgIHJldHVybiBjbWRzO1xuICAgIH0sXG4gICAgTDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggPSBhWzBdO1xuICAgICAgICBjeSA9IGFbMV07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICByZXR1cm4gbGluZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBsOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCArPSBhWzBdO1xuICAgICAgICBjeSArPSBhWzFdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxpbmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgSDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggPSBhWzBdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxpbmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgaDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggKz0gYVswXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHJldHVybiBsaW5lVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIFY6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN5ID0gYVswXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHJldHVybiBsaW5lVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIHY6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN5ICs9IGFbMF07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICByZXR1cm4gbGluZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBaOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjbWQgPSBjbG9zZVBhdGgoKTtcbiAgICAgICAgY3ggPSBzeDtcbiAgICAgICAgY3kgPSBzeTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIHo6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNtZCA9IGNsb3NlUGF0aCgpO1xuICAgICAgICBjeCA9IHN4O1xuICAgICAgICBjeSA9IHN5O1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG59O1xudmFyIHNvbHZlQXJjID0gZnVuY3Rpb24gKHgsIHksIGNvb3Jkcykge1xuICAgIHZhciByeCA9IGNvb3Jkc1swXSwgcnkgPSBjb29yZHNbMV0sIHJvdCA9IGNvb3Jkc1syXSwgbGFyZ2UgPSBjb29yZHNbM10sIHN3ZWVwID0gY29vcmRzWzRdLCBleCA9IGNvb3Jkc1s1XSwgZXkgPSBjb29yZHNbNl07XG4gICAgdmFyIHNlZ3MgPSBhcmNUb1NlZ21lbnRzKGV4LCBleSwgcngsIHJ5LCBsYXJnZSwgc3dlZXAsIHJvdCwgeCwgeSk7XG4gICAgdmFyIGNtZHMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHNlZ3NfMSA9IHNlZ3M7IF9pIDwgc2Vnc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgc2VnID0gc2Vnc18xW19pXTtcbiAgICAgICAgdmFyIGJleiA9IHNlZ21lbnRUb0Jlemllci5hcHBseSh2b2lkIDAsIHNlZyk7XG4gICAgICAgIGNtZHMucHVzaChhcHBlbmRCZXppZXJDdXJ2ZS5hcHBseSh2b2lkIDAsIGJleikpO1xuICAgIH1cbiAgICByZXR1cm4gY21kcztcbn07XG4vLyBmcm9tIElua3NjYXBlIHN2Z3RvcGRmLCB0aGFua3MhXG52YXIgYXJjVG9TZWdtZW50cyA9IGZ1bmN0aW9uICh4LCB5LCByeCwgcnksIGxhcmdlLCBzd2VlcCwgcm90YXRlWCwgb3gsIG95KSB7XG4gICAgdmFyIHRoID0gcm90YXRlWCAqIChNYXRoLlBJIC8gMTgwKTtcbiAgICB2YXIgc2luVGggPSBNYXRoLnNpbih0aCk7XG4gICAgdmFyIGNvc1RoID0gTWF0aC5jb3ModGgpO1xuICAgIHJ4ID0gTWF0aC5hYnMocngpO1xuICAgIHJ5ID0gTWF0aC5hYnMocnkpO1xuICAgIHB4ID0gY29zVGggKiAob3ggLSB4KSAqIDAuNSArIHNpblRoICogKG95IC0geSkgKiAwLjU7XG4gICAgcHkgPSBjb3NUaCAqIChveSAtIHkpICogMC41IC0gc2luVGggKiAob3ggLSB4KSAqIDAuNTtcbiAgICB2YXIgcGwgPSAocHggKiBweCkgLyAocnggKiByeCkgKyAocHkgKiBweSkgLyAocnkgKiByeSk7XG4gICAgaWYgKHBsID4gMSkge1xuICAgICAgICBwbCA9IE1hdGguc3FydChwbCk7XG4gICAgICAgIHJ4ICo9IHBsO1xuICAgICAgICByeSAqPSBwbDtcbiAgICB9XG4gICAgdmFyIGEwMCA9IGNvc1RoIC8gcng7XG4gICAgdmFyIGEwMSA9IHNpblRoIC8gcng7XG4gICAgdmFyIGExMCA9IC1zaW5UaCAvIHJ5O1xuICAgIHZhciBhMTEgPSBjb3NUaCAvIHJ5O1xuICAgIHZhciB4MCA9IGEwMCAqIG94ICsgYTAxICogb3k7XG4gICAgdmFyIHkwID0gYTEwICogb3ggKyBhMTEgKiBveTtcbiAgICB2YXIgeDEgPSBhMDAgKiB4ICsgYTAxICogeTtcbiAgICB2YXIgeTEgPSBhMTAgKiB4ICsgYTExICogeTtcbiAgICB2YXIgZCA9ICh4MSAtIHgwKSAqICh4MSAtIHgwKSArICh5MSAtIHkwKSAqICh5MSAtIHkwKTtcbiAgICB2YXIgc2ZhY3RvclNxID0gMSAvIGQgLSAwLjI1O1xuICAgIGlmIChzZmFjdG9yU3EgPCAwKSB7XG4gICAgICAgIHNmYWN0b3JTcSA9IDA7XG4gICAgfVxuICAgIHZhciBzZmFjdG9yID0gTWF0aC5zcXJ0KHNmYWN0b3JTcSk7XG4gICAgaWYgKHN3ZWVwID09PSBsYXJnZSkge1xuICAgICAgICBzZmFjdG9yID0gLXNmYWN0b3I7XG4gICAgfVxuICAgIHZhciB4YyA9IDAuNSAqICh4MCArIHgxKSAtIHNmYWN0b3IgKiAoeTEgLSB5MCk7XG4gICAgdmFyIHljID0gMC41ICogKHkwICsgeTEpICsgc2ZhY3RvciAqICh4MSAtIHgwKTtcbiAgICB2YXIgdGgwID0gTWF0aC5hdGFuMih5MCAtIHljLCB4MCAtIHhjKTtcbiAgICB2YXIgdGgxID0gTWF0aC5hdGFuMih5MSAtIHljLCB4MSAtIHhjKTtcbiAgICB2YXIgdGhBcmMgPSB0aDEgLSB0aDA7XG4gICAgaWYgKHRoQXJjIDwgMCAmJiBzd2VlcCA9PT0gMSkge1xuICAgICAgICB0aEFyYyArPSAyICogTWF0aC5QSTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhBcmMgPiAwICYmIHN3ZWVwID09PSAwKSB7XG4gICAgICAgIHRoQXJjIC09IDIgKiBNYXRoLlBJO1xuICAgIH1cbiAgICB2YXIgc2VnbWVudHMgPSBNYXRoLmNlaWwoTWF0aC5hYnModGhBcmMgLyAoTWF0aC5QSSAqIDAuNSArIDAuMDAxKSkpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlZ21lbnRzOyBpKyspIHtcbiAgICAgICAgdmFyIHRoMiA9IHRoMCArIChpICogdGhBcmMpIC8gc2VnbWVudHM7XG4gICAgICAgIHZhciB0aDMgPSB0aDAgKyAoKGkgKyAxKSAqIHRoQXJjKSAvIHNlZ21lbnRzO1xuICAgICAgICByZXN1bHRbaV0gPSBbeGMsIHljLCB0aDIsIHRoMywgcngsIHJ5LCBzaW5UaCwgY29zVGhdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBzZWdtZW50VG9CZXppZXIgPSBmdW5jdGlvbiAoY3gxLCBjeTEsIHRoMCwgdGgxLCByeCwgcnksIHNpblRoLCBjb3NUaCkge1xuICAgIHZhciBhMDAgPSBjb3NUaCAqIHJ4O1xuICAgIHZhciBhMDEgPSAtc2luVGggKiByeTtcbiAgICB2YXIgYTEwID0gc2luVGggKiByeDtcbiAgICB2YXIgYTExID0gY29zVGggKiByeTtcbiAgICB2YXIgdGhIYWxmID0gMC41ICogKHRoMSAtIHRoMCk7XG4gICAgdmFyIHQgPSAoKDggLyAzKSAqIE1hdGguc2luKHRoSGFsZiAqIDAuNSkgKiBNYXRoLnNpbih0aEhhbGYgKiAwLjUpKSAvXG4gICAgICAgIE1hdGguc2luKHRoSGFsZik7XG4gICAgdmFyIHgxID0gY3gxICsgTWF0aC5jb3ModGgwKSAtIHQgKiBNYXRoLnNpbih0aDApO1xuICAgIHZhciB5MSA9IGN5MSArIE1hdGguc2luKHRoMCkgKyB0ICogTWF0aC5jb3ModGgwKTtcbiAgICB2YXIgeDMgPSBjeDEgKyBNYXRoLmNvcyh0aDEpO1xuICAgIHZhciB5MyA9IGN5MSArIE1hdGguc2luKHRoMSk7XG4gICAgdmFyIHgyID0geDMgKyB0ICogTWF0aC5zaW4odGgxKTtcbiAgICB2YXIgeTIgPSB5MyAtIHQgKiBNYXRoLmNvcyh0aDEpO1xuICAgIHZhciByZXN1bHQgPSBbXG4gICAgICAgIGEwMCAqIHgxICsgYTAxICogeTEsXG4gICAgICAgIGExMCAqIHgxICsgYTExICogeTEsXG4gICAgICAgIGEwMCAqIHgyICsgYTAxICogeTIsXG4gICAgICAgIGExMCAqIHgyICsgYTExICogeTIsXG4gICAgICAgIGEwMCAqIHgzICsgYTAxICogeTMsXG4gICAgICAgIGExMCAqIHgzICsgYTExICogeTMsXG4gICAgXTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCB2YXIgc3ZnUGF0aFRvT3BlcmF0b3JzID0gZnVuY3Rpb24gKHBhdGgpIHsgcmV0dXJuIGFwcGx5KHBhcnNlKHBhdGgpKTsgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN2Z1BhdGguanMubWFwIiwiZXhwb3J0IHZhciBUZXh0QWxpZ25tZW50O1xuKGZ1bmN0aW9uIChUZXh0QWxpZ25tZW50KSB7XG4gICAgVGV4dEFsaWdubWVudFtUZXh0QWxpZ25tZW50W1wiTGVmdFwiXSA9IDBdID0gXCJMZWZ0XCI7XG4gICAgVGV4dEFsaWdubWVudFtUZXh0QWxpZ25tZW50W1wiQ2VudGVyXCJdID0gMV0gPSBcIkNlbnRlclwiO1xuICAgIFRleHRBbGlnbm1lbnRbVGV4dEFsaWdubWVudFtcIlJpZ2h0XCJdID0gMl0gPSBcIlJpZ2h0XCI7XG59KShUZXh0QWxpZ25tZW50IHx8IChUZXh0QWxpZ25tZW50ID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsaWdubWVudC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9hbGlnbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xheW91dFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgQ29tYmVkVGV4dExheW91dEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgVGV4dEFsaWdubWVudCB9IGZyb20gXCIuL2FsaWdubWVudFwiO1xuaW1wb3J0IHsgY2xlYW5UZXh0LCBsaW5lU3BsaXQsIG1lcmdlTGluZXMsIGNoYXJBdEluZGV4LCBjaGFyU3BsaXQsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgTUlOX0ZPTlRfU0laRSA9IDQ7XG52YXIgTUFYX0ZPTlRfU0laRSA9IDUwMDtcbnZhciBjb21wdXRlRm9udFNpemUgPSBmdW5jdGlvbiAobGluZXMsIGZvbnQsIGJvdW5kcywgbXVsdGlsaW5lKSB7XG4gICAgaWYgKG11bHRpbGluZSA9PT0gdm9pZCAwKSB7IG11bHRpbGluZSA9IGZhbHNlOyB9XG4gICAgdmFyIGZvbnRTaXplID0gTUlOX0ZPTlRfU0laRTtcbiAgICB3aGlsZSAoZm9udFNpemUgPCBNQVhfRk9OVF9TSVpFKSB7XG4gICAgICAgIHZhciBsaW5lc1VzZWQgPSAwO1xuICAgICAgICBmb3IgKHZhciBsaW5lSWR4ID0gMCwgbGluZUxlbiA9IGxpbmVzLmxlbmd0aDsgbGluZUlkeCA8IGxpbmVMZW47IGxpbmVJZHgrKykge1xuICAgICAgICAgICAgbGluZXNVc2VkICs9IDE7XG4gICAgICAgICAgICB2YXIgbGluZSA9IGxpbmVzW2xpbmVJZHhdO1xuICAgICAgICAgICAgdmFyIHdvcmRzID0gbGluZS5zcGxpdCgnICcpO1xuICAgICAgICAgICAgLy8gTGF5b3V0IHRoZSB3b3JkcyB1c2luZyB0aGUgY3VycmVudCBgZm9udFNpemVgLCBsaW5lIHdyYXBwaW5nXG4gICAgICAgICAgICAvLyB3aGVuZXZlciB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpbmUuXG4gICAgICAgICAgICB2YXIgc3BhY2VJbkxpbmVSZW1haW5pbmcgPSBib3VuZHMud2lkdGg7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3b3Jkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNMYXN0V29yZCA9IGlkeCA9PT0gbGVuIC0gMTtcbiAgICAgICAgICAgICAgICB2YXIgd29yZCA9IGlzTGFzdFdvcmQgPyB3b3Jkc1tpZHhdIDogd29yZHNbaWR4XSArICcgJztcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGhPZldvcmQgPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKHdvcmQsIGZvbnRTaXplKTtcbiAgICAgICAgICAgICAgICBzcGFjZUluTGluZVJlbWFpbmluZyAtPSB3aWR0aE9mV29yZDtcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2VJbkxpbmVSZW1haW5pbmcgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lc1VzZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgc3BhY2VJbkxpbmVSZW1haW5pbmcgPSBib3VuZHMud2lkdGggLSB3aWR0aE9mV29yZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmV0dXJuIGlmIHdlIGV4Y2VlZGVkIHRoZSBhbGxvd2VkIHdpZHRoXG4gICAgICAgIGlmICghbXVsdGlsaW5lICYmIGxpbmVzVXNlZCA+IGxpbmVzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmb250U2l6ZSAtIDE7XG4gICAgICAgIHZhciBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHZhciBsaW5lSGVpZ2h0ID0gaGVpZ2h0ICsgaGVpZ2h0ICogMC4yO1xuICAgICAgICB2YXIgdG90YWxIZWlnaHQgPSBsaW5lSGVpZ2h0ICogbGluZXNVc2VkO1xuICAgICAgICAvLyBSZXR1cm4gaWYgd2UgZXhjZWVkZWQgdGhlIGFsbG93ZWQgaGVpZ2h0XG4gICAgICAgIGlmICh0b3RhbEhlaWdodCA+IE1hdGguYWJzKGJvdW5kcy5oZWlnaHQpKVxuICAgICAgICAgICAgcmV0dXJuIGZvbnRTaXplIC0gMTtcbiAgICAgICAgZm9udFNpemUgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGZvbnRTaXplO1xufTtcbnZhciBjb21wdXRlQ29tYmVkRm9udFNpemUgPSBmdW5jdGlvbiAobGluZSwgZm9udCwgYm91bmRzLCBjZWxsQ291bnQpIHtcbiAgICB2YXIgY2VsbFdpZHRoID0gYm91bmRzLndpZHRoIC8gY2VsbENvdW50O1xuICAgIHZhciBjZWxsSGVpZ2h0ID0gYm91bmRzLmhlaWdodDtcbiAgICB2YXIgZm9udFNpemUgPSBNSU5fRk9OVF9TSVpFO1xuICAgIHZhciBjaGFycyA9IGNoYXJTcGxpdChsaW5lKTtcbiAgICB3aGlsZSAoZm9udFNpemUgPCBNQVhfRk9OVF9TSVpFKSB7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGNoYXJzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGMgPSBjaGFyc1tpZHhdO1xuICAgICAgICAgICAgdmFyIHRvb0xvbmcgPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKGMsIGZvbnRTaXplKSA+IGNlbGxXaWR0aCAqIDAuNzU7XG4gICAgICAgICAgICBpZiAodG9vTG9uZylcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9udFNpemUgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZShmb250U2l6ZSwgeyBkZXNjZW5kZXI6IGZhbHNlIH0pO1xuICAgICAgICBpZiAoaGVpZ2h0ID4gY2VsbEhlaWdodClcbiAgICAgICAgICAgIHJldHVybiBmb250U2l6ZSAtIDE7XG4gICAgICAgIGZvbnRTaXplICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBmb250U2l6ZTtcbn07XG52YXIgbGFzdEluZGV4T2ZXaGl0ZXNwYWNlID0gZnVuY3Rpb24gKGxpbmUpIHtcbiAgICBmb3IgKHZhciBpZHggPSBsaW5lLmxlbmd0aDsgaWR4ID4gMDsgaWR4LS0pIHtcbiAgICAgICAgaWYgKC9cXHMvLnRlc3QobGluZVtpZHhdKSlcbiAgICAgICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xudmFyIHNwbGl0T3V0TGluZXMgPSBmdW5jdGlvbiAoaW5wdXQsIG1heFdpZHRoLCBmb250LCBmb250U2l6ZSkge1xuICAgIHZhciBfYTtcbiAgICB2YXIgbGFzdFdoaXRlc3BhY2VJZHggPSBpbnB1dC5sZW5ndGg7XG4gICAgd2hpbGUgKGxhc3RXaGl0ZXNwYWNlSWR4ID4gMCkge1xuICAgICAgICB2YXIgbGluZSA9IGlucHV0LnN1YnN0cmluZygwLCBsYXN0V2hpdGVzcGFjZUlkeCk7XG4gICAgICAgIHZhciBlbmNvZGVkID0gZm9udC5lbmNvZGVUZXh0KGxpbmUpO1xuICAgICAgICB2YXIgd2lkdGggPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKGxpbmUsIGZvbnRTaXplKTtcbiAgICAgICAgaWYgKHdpZHRoIDwgbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHZhciByZW1haW5kZXIgPSBpbnB1dC5zdWJzdHJpbmcobGFzdFdoaXRlc3BhY2VJZHgpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7IGxpbmU6IGxpbmUsIGVuY29kZWQ6IGVuY29kZWQsIHdpZHRoOiB3aWR0aCwgcmVtYWluZGVyOiByZW1haW5kZXIgfTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0V2hpdGVzcGFjZUlkeCA9IChfYSA9IGxhc3RJbmRleE9mV2hpdGVzcGFjZShsaW5lKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICB9XG4gICAgLy8gV2Ugd2VyZSB1bmFibGUgdG8gc3BsaXQgdGhlIGlucHV0IGVub3VnaCB0byBnZXQgYSBjaHVuayB0aGF0IHdvdWxkIGZpdFxuICAgIC8vIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBtYXhXaWR0aGAgc28gd2UnbGwganVzdCByZXR1cm4gZXZlcnl0aGluZ1xuICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IGlucHV0LFxuICAgICAgICBlbmNvZGVkOiBmb250LmVuY29kZVRleHQoaW5wdXQpLFxuICAgICAgICB3aWR0aDogZm9udC53aWR0aE9mVGV4dEF0U2l6ZShpbnB1dCwgZm9udFNpemUpLFxuICAgICAgICByZW1haW5kZXI6IHVuZGVmaW5lZCxcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgbGF5b3V0TXVsdGlsaW5lVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBfYSkge1xuICAgIHZhciBhbGlnbm1lbnQgPSBfYS5hbGlnbm1lbnQsIGZvbnRTaXplID0gX2EuZm9udFNpemUsIGZvbnQgPSBfYS5mb250LCBib3VuZHMgPSBfYS5ib3VuZHM7XG4gICAgdmFyIGxpbmVzID0gbGluZVNwbGl0KGNsZWFuVGV4dCh0ZXh0KSk7XG4gICAgaWYgKGZvbnRTaXplID09PSB1bmRlZmluZWQgfHwgZm9udFNpemUgPT09IDApIHtcbiAgICAgICAgZm9udFNpemUgPSBjb21wdXRlRm9udFNpemUobGluZXMsIGZvbnQsIGJvdW5kcywgdHJ1ZSk7XG4gICAgfVxuICAgIHZhciBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZShmb250U2l6ZSk7XG4gICAgdmFyIGxpbmVIZWlnaHQgPSBoZWlnaHQgKyBoZWlnaHQgKiAwLjI7XG4gICAgdmFyIHRleHRMaW5lcyA9IFtdO1xuICAgIHZhciBtaW5YID0gYm91bmRzLng7XG4gICAgdmFyIG1pblkgPSBib3VuZHMueTtcbiAgICB2YXIgbWF4WCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoO1xuICAgIHZhciBtYXhZID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0O1xuICAgIHZhciB5ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0O1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgcHJldlJlbWFpbmRlciA9IGxpbmVzW2lkeF07XG4gICAgICAgIHdoaWxlIChwcmV2UmVtYWluZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBfYiA9IHNwbGl0T3V0TGluZXMocHJldlJlbWFpbmRlciwgYm91bmRzLndpZHRoLCBmb250LCBmb250U2l6ZSksIGxpbmUgPSBfYi5saW5lLCBlbmNvZGVkID0gX2IuZW5jb2RlZCwgd2lkdGggPSBfYi53aWR0aCwgcmVtYWluZGVyID0gX2IucmVtYWluZGVyO1xuICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICB2YXIgeCA9IChhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuTGVmdCA/IGJvdW5kcy54XG4gICAgICAgICAgICAgICAgOiBhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuQ2VudGVyID8gYm91bmRzLnggKyAoYm91bmRzLndpZHRoIC8gMikgLSAod2lkdGggLyAyKVxuICAgICAgICAgICAgICAgICAgICA6IGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5SaWdodCA/IGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC0gd2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYm91bmRzLngpO1xuICAgICAgICAgICAgeSAtPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgaWYgKHggPCBtaW5YKVxuICAgICAgICAgICAgICAgIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKVxuICAgICAgICAgICAgICAgIG1pblkgPSB5O1xuICAgICAgICAgICAgaWYgKHggKyB3aWR0aCA+IG1heFgpXG4gICAgICAgICAgICAgICAgbWF4WCA9IHggKyB3aWR0aDtcbiAgICAgICAgICAgIGlmICh5ICsgaGVpZ2h0ID4gbWF4WSlcbiAgICAgICAgICAgICAgICBtYXhZID0geSArIGhlaWdodDtcbiAgICAgICAgICAgIHRleHRMaW5lcy5wdXNoKHsgdGV4dDogbGluZSwgZW5jb2RlZDogZW5jb2RlZCwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgeDogeCwgeTogeSB9KTtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJpbSBsaW5lcyB0aGF0IHdlIGhhZCB0byBzcGxpdCBvdXJzZWx2ZXMuIFNvIHdlIHdvbid0IHRyaW0gbGluZXNcbiAgICAgICAgICAgIC8vIHRoYXQgdGhlIHVzZXIgcHJvdmlkZWQgdGhlbXNlbHZlcyB3aXRoIHdoaXRlc3BhY2UuXG4gICAgICAgICAgICBwcmV2UmVtYWluZGVyID0gcmVtYWluZGVyID09PSBudWxsIHx8IHJlbWFpbmRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVtYWluZGVyLnRyaW0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgIGxpbmVIZWlnaHQ6IGxpbmVIZWlnaHQsXG4gICAgICAgIGxpbmVzOiB0ZXh0TGluZXMsXG4gICAgICAgIGJvdW5kczoge1xuICAgICAgICAgICAgeDogbWluWCxcbiAgICAgICAgICAgIHk6IG1pblksXG4gICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgICAgICB9LFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBsYXlvdXRDb21iZWRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIF9hKSB7XG4gICAgdmFyIGZvbnRTaXplID0gX2EuZm9udFNpemUsIGZvbnQgPSBfYS5mb250LCBib3VuZHMgPSBfYS5ib3VuZHMsIGNlbGxDb3VudCA9IF9hLmNlbGxDb3VudDtcbiAgICB2YXIgbGluZSA9IG1lcmdlTGluZXMoY2xlYW5UZXh0KHRleHQpKTtcbiAgICBpZiAobGluZS5sZW5ndGggPiBjZWxsQ291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbWJlZFRleHRMYXlvdXRFcnJvcihsaW5lLmxlbmd0aCwgY2VsbENvdW50KTtcbiAgICB9XG4gICAgaWYgKGZvbnRTaXplID09PSB1bmRlZmluZWQgfHwgZm9udFNpemUgPT09IDApIHtcbiAgICAgICAgZm9udFNpemUgPSBjb21wdXRlQ29tYmVkRm9udFNpemUobGluZSwgZm9udCwgYm91bmRzLCBjZWxsQ291bnQpO1xuICAgIH1cbiAgICB2YXIgY2VsbFdpZHRoID0gYm91bmRzLndpZHRoIC8gY2VsbENvdW50O1xuICAgIHZhciBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZShmb250U2l6ZSwgeyBkZXNjZW5kZXI6IGZhbHNlIH0pO1xuICAgIHZhciB5ID0gYm91bmRzLnkgKyAoYm91bmRzLmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyKTtcbiAgICB2YXIgY2VsbHMgPSBbXTtcbiAgICB2YXIgbWluWCA9IGJvdW5kcy54O1xuICAgIHZhciBtaW5ZID0gYm91bmRzLnk7XG4gICAgdmFyIG1heFggPSBib3VuZHMueCArIGJvdW5kcy53aWR0aDtcbiAgICB2YXIgbWF4WSA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDtcbiAgICB2YXIgY2VsbE9mZnNldCA9IDA7XG4gICAgdmFyIGNoYXJPZmZzZXQgPSAwO1xuICAgIHdoaWxlIChjZWxsT2Zmc2V0IDwgY2VsbENvdW50KSB7XG4gICAgICAgIHZhciBfYiA9IGNoYXJBdEluZGV4KGxpbmUsIGNoYXJPZmZzZXQpLCBjaGFyID0gX2JbMF0sIGNoYXJMZW5ndGggPSBfYlsxXTtcbiAgICAgICAgdmFyIGVuY29kZWQgPSBmb250LmVuY29kZVRleHQoY2hhcik7XG4gICAgICAgIHZhciB3aWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoY2hhciwgZm9udFNpemUpO1xuICAgICAgICB2YXIgY2VsbENlbnRlciA9IGJvdW5kcy54ICsgKGNlbGxXaWR0aCAqIGNlbGxPZmZzZXQgKyBjZWxsV2lkdGggLyAyKTtcbiAgICAgICAgdmFyIHggPSBjZWxsQ2VudGVyIC0gd2lkdGggLyAyO1xuICAgICAgICBpZiAoeCA8IG1pblgpXG4gICAgICAgICAgICBtaW5YID0geDtcbiAgICAgICAgaWYgKHkgPCBtaW5ZKVxuICAgICAgICAgICAgbWluWSA9IHk7XG4gICAgICAgIGlmICh4ICsgd2lkdGggPiBtYXhYKVxuICAgICAgICAgICAgbWF4WCA9IHggKyB3aWR0aDtcbiAgICAgICAgaWYgKHkgKyBoZWlnaHQgPiBtYXhZKVxuICAgICAgICAgICAgbWF4WSA9IHkgKyBoZWlnaHQ7XG4gICAgICAgIGNlbGxzLnB1c2goeyB0ZXh0OiBsaW5lLCBlbmNvZGVkOiBlbmNvZGVkLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCB4OiB4LCB5OiB5IH0pO1xuICAgICAgICBjZWxsT2Zmc2V0ICs9IDE7XG4gICAgICAgIGNoYXJPZmZzZXQgKz0gY2hhckxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBjZWxsczogY2VsbHMsXG4gICAgICAgIGJvdW5kczoge1xuICAgICAgICAgICAgeDogbWluWCxcbiAgICAgICAgICAgIHk6IG1pblksXG4gICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgICAgICB9LFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBsYXlvdXRTaW5nbGVsaW5lVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBfYSkge1xuICAgIHZhciBhbGlnbm1lbnQgPSBfYS5hbGlnbm1lbnQsIGZvbnRTaXplID0gX2EuZm9udFNpemUsIGZvbnQgPSBfYS5mb250LCBib3VuZHMgPSBfYS5ib3VuZHM7XG4gICAgdmFyIGxpbmUgPSBtZXJnZUxpbmVzKGNsZWFuVGV4dCh0ZXh0KSk7XG4gICAgaWYgKGZvbnRTaXplID09PSB1bmRlZmluZWQgfHwgZm9udFNpemUgPT09IDApIHtcbiAgICAgICAgZm9udFNpemUgPSBjb21wdXRlRm9udFNpemUoW2xpbmVdLCBmb250LCBib3VuZHMpO1xuICAgIH1cbiAgICB2YXIgZW5jb2RlZCA9IGZvbnQuZW5jb2RlVGV4dChsaW5lKTtcbiAgICB2YXIgd2lkdGggPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKGxpbmUsIGZvbnRTaXplKTtcbiAgICB2YXIgaGVpZ2h0ID0gZm9udC5oZWlnaHRBdFNpemUoZm9udFNpemUsIHsgZGVzY2VuZGVyOiBmYWxzZSB9KTtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICB2YXIgeCA9IChhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuTGVmdCA/IGJvdW5kcy54XG4gICAgICAgIDogYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LkNlbnRlciA/IGJvdW5kcy54ICsgKGJvdW5kcy53aWR0aCAvIDIpIC0gKHdpZHRoIC8gMilcbiAgICAgICAgICAgIDogYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LlJpZ2h0ID8gYm91bmRzLnggKyBib3VuZHMud2lkdGggLSB3aWR0aFxuICAgICAgICAgICAgICAgIDogYm91bmRzLngpO1xuICAgIHZhciB5ID0gYm91bmRzLnkgKyAoYm91bmRzLmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgIGxpbmU6IHsgdGV4dDogbGluZSwgZW5jb2RlZDogZW5jb2RlZCwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgeDogeCwgeTogeSB9LFxuICAgICAgICBib3VuZHM6IHsgeDogeCwgeTogeSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9LFxuICAgIH07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGF5b3V0LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgcGFrbyBmcm9tICdwYWtvJztcbmltcG9ydCBQREZIZWFkZXIgZnJvbSBcIi4vZG9jdW1lbnQvUERGSGVhZGVyXCI7XG5pbXBvcnQgeyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkJvb2wgZnJvbSBcIi4vb2JqZWN0cy9QREZCb29sXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bGwgZnJvbSBcIi4vb2JqZWN0cy9QREZOdWxsXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL29iamVjdHMvUERGT2JqZWN0XCI7XG5pbXBvcnQgUERGUmF3U3RyZWFtIGZyb20gXCIuL29iamVjdHMvUERGUmF3U3RyZWFtXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGT3BlcmF0b3IgZnJvbSBcIi4vb3BlcmF0b3JzL1BERk9wZXJhdG9yXCI7XG5pbXBvcnQgT3BzIGZyb20gXCIuL29wZXJhdG9ycy9QREZPcGVyYXRvck5hbWVzXCI7XG5pbXBvcnQgUERGQ29udGVudFN0cmVhbSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERkNvbnRlbnRTdHJlYW1cIjtcbmltcG9ydCB7IHR5cGVkQXJyYXlGb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFNpbXBsZVJORyB9IGZyb20gXCIuLi91dGlscy9ybmdcIjtcbnZhciBieUFzY2VuZGluZ09iamVjdE51bWJlciA9IGZ1bmN0aW9uIChfYSwgX2IpIHtcbiAgICB2YXIgYSA9IF9hWzBdO1xuICAgIHZhciBiID0gX2JbMF07XG4gICAgcmV0dXJuIGEub2JqZWN0TnVtYmVyIC0gYi5vYmplY3ROdW1iZXI7XG59O1xudmFyIFBERkNvbnRleHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGQ29udGV4dCgpIHtcbiAgICAgICAgdGhpcy5sYXJnZXN0T2JqZWN0TnVtYmVyID0gMDtcbiAgICAgICAgdGhpcy5oZWFkZXIgPSBQREZIZWFkZXIuZm9yVmVyc2lvbigxLCA3KTtcbiAgICAgICAgdGhpcy50cmFpbGVySW5mbyA9IHt9O1xuICAgICAgICB0aGlzLmluZGlyZWN0T2JqZWN0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5ybmcgPSBTaW1wbGVSTkcud2l0aFNlZWQoMSk7XG4gICAgfVxuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmFzc2lnbiA9IGZ1bmN0aW9uIChyZWYsIG9iamVjdCkge1xuICAgICAgICB0aGlzLmluZGlyZWN0T2JqZWN0cy5zZXQocmVmLCBvYmplY3QpO1xuICAgICAgICBpZiAocmVmLm9iamVjdE51bWJlciA+IHRoaXMubGFyZ2VzdE9iamVjdE51bWJlcikge1xuICAgICAgICAgICAgdGhpcy5sYXJnZXN0T2JqZWN0TnVtYmVyID0gcmVmLm9iamVjdE51bWJlcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUubmV4dFJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sYXJnZXN0T2JqZWN0TnVtYmVyICs9IDE7XG4gICAgICAgIHJldHVybiBQREZSZWYub2YodGhpcy5sYXJnZXN0T2JqZWN0TnVtYmVyKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5uZXh0UmVmKCk7XG4gICAgICAgIHRoaXMuYXNzaWduKHJlZiwgb2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIHJlZjtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kaXJlY3RPYmplY3RzLmRlbGV0ZShyZWYpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUubG9va3VwTWF5YmUgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHZhciB0eXBlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdHlwZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogYHByZXNlcnZlUERGTnVsbGAgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBTaG91bGQgYmVcbiAgICAgICAgLy8gcmVtb3ZlZCBpbiBuZXh0IGJyZWFraW5nIEFQSSBjaGFuZ2UuXG4gICAgICAgIHZhciBwcmVzZXJ2ZVBERk51bGwgPSB0eXBlcy5pbmNsdWRlcyhQREZOdWxsKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlZiBpbnN0YW5jZW9mIFBERlJlZiA/IHRoaXMuaW5kaXJlY3RPYmplY3RzLmdldChyZWYpIDogcmVmO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCAocmVzdWx0ID09PSBQREZOdWxsICYmICFwcmVzZXJ2ZVBERk51bGwpKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdHlwZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2lkeF07XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gUERGTnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IFBERk51bGwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgdHlwZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvcih0eXBlcywgcmVzdWx0KTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0eXBlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gcmVmIGluc3RhbmNlb2YgUERGUmVmID8gdGhpcy5pbmRpcmVjdE9iamVjdHMuZ2V0KHJlZikgOiByZWY7XG4gICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0eXBlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gdHlwZXNbaWR4XTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBQREZOdWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gUERGTnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiB0eXBlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yKHR5cGVzLCByZXN1bHQpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZ2V0T2JqZWN0UmVmID0gZnVuY3Rpb24gKHBkZk9iamVjdCkge1xuICAgICAgICB2YXIgZW50cmllcyA9IEFycmF5LmZyb20odGhpcy5pbmRpcmVjdE9iamVjdHMuZW50cmllcygpKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwgcmVmID0gX2FbMF0sIG9iamVjdCA9IF9hWzFdO1xuICAgICAgICAgICAgaWYgKG9iamVjdCA9PT0gcGRmT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZW51bWVyYXRlSW5kaXJlY3RPYmplY3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmluZGlyZWN0T2JqZWN0cy5lbnRyaWVzKCkpLnNvcnQoYnlBc2NlbmRpbmdPYmplY3ROdW1iZXIpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUub2JqID0gZnVuY3Rpb24gKGxpdGVyYWwpIHtcbiAgICAgICAgaWYgKGxpdGVyYWwgaW5zdGFuY2VvZiBQREZPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXRlcmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpdGVyYWwgPT09IG51bGwgfHwgbGl0ZXJhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGTnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbGl0ZXJhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBQREZOYW1lLm9mKGxpdGVyYWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsaXRlcmFsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIFBERk51bWJlci5vZihsaXRlcmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbGl0ZXJhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gbGl0ZXJhbCA/IFBERkJvb2wuVHJ1ZSA6IFBERkJvb2wuRmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShsaXRlcmFsKSkge1xuICAgICAgICAgICAgdmFyIGFycmF5ID0gUERGQXJyYXkud2l0aENvbnRleHQodGhpcyk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaXRlcmFsLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIGFycmF5LnB1c2godGhpcy5vYmoobGl0ZXJhbFtpZHhdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgZGljdCA9IFBERkRpY3Qud2l0aENvbnRleHQodGhpcyk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGxpdGVyYWwpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2V5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpZHhdO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGxpdGVyYWxba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZihrZXkpLCB0aGlzLm9iaih2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpY3Q7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLnN0cmVhbSA9IGZ1bmN0aW9uIChjb250ZW50cywgZGljdCkge1xuICAgICAgICBpZiAoZGljdCA9PT0gdm9pZCAwKSB7IGRpY3QgPSB7fTsgfVxuICAgICAgICByZXR1cm4gUERGUmF3U3RyZWFtLm9mKHRoaXMub2JqKGRpY3QpLCB0eXBlZEFycmF5Rm9yKGNvbnRlbnRzKSk7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5mbGF0ZVN0cmVhbSA9IGZ1bmN0aW9uIChjb250ZW50cywgZGljdCkge1xuICAgICAgICBpZiAoZGljdCA9PT0gdm9pZCAwKSB7IGRpY3QgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0ocGFrby5kZWZsYXRlKHR5cGVkQXJyYXlGb3IoY29udGVudHMpKSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRpY3QpLCB7IEZpbHRlcjogJ0ZsYXRlRGVjb2RlJyB9KSk7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5jb250ZW50U3RyZWFtID0gZnVuY3Rpb24gKG9wZXJhdG9ycywgZGljdCkge1xuICAgICAgICBpZiAoZGljdCA9PT0gdm9pZCAwKSB7IGRpY3QgPSB7fTsgfVxuICAgICAgICByZXR1cm4gUERGQ29udGVudFN0cmVhbS5vZih0aGlzLm9iaihkaWN0KSwgb3BlcmF0b3JzKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmZvcm1YT2JqZWN0ID0gZnVuY3Rpb24gKG9wZXJhdG9ycywgZGljdCkge1xuICAgICAgICBpZiAoZGljdCA9PT0gdm9pZCAwKSB7IGRpY3QgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50U3RyZWFtKG9wZXJhdG9ycywgX19hc3NpZ24oX19hc3NpZ24oeyBCQm94OiB0aGlzLm9iaihbMCwgMCwgMCwgMF0pLCBNYXRyaXg6IHRoaXMub2JqKFsxLCAwLCAwLCAxLCAwLCAwXSkgfSwgZGljdCksIHsgVHlwZTogJ1hPYmplY3QnLCBTdWJ0eXBlOiAnRm9ybScgfSkpO1xuICAgIH07XG4gICAgLypcbiAgICAgKiBSZWZlcmVuY2UgdG8gUERGQ29udGVudFN0cmVhbSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIFBERk9wZXJhdG9yOiBgcWAuXG4gICAgICogVXNlZCBieSBbW1BERlBhZ2VMZWFmXV0gaW5zdGFuY2VzIHRvIGVuc3VyZSB0aGF0IHdoZW4gY29udGVudCBzdHJlYW1zIGFyZVxuICAgICAqIGFkZGVkIHRvIGEgbW9kaWZpZWQgUERGLCB0aGV5IHN0YXJ0IGluIHRoZSBkZWZhdWx0LCB1bmNoYW5nZWQgZ3JhcGhpY3NcbiAgICAgKiBzdGF0ZS5cbiAgICAgKi9cbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5nZXRQdXNoR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHVzaEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5vYmooe30pO1xuICAgICAgICB2YXIgb3AgPSBQREZPcGVyYXRvci5vZihPcHMuUHVzaEdyYXBoaWNzU3RhdGUpO1xuICAgICAgICB2YXIgc3RyZWFtID0gUERGQ29udGVudFN0cmVhbS5vZihkaWN0LCBbb3BdKTtcbiAgICAgICAgdGhpcy5wdXNoR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWYgPSB0aGlzLnJlZ2lzdGVyKHN0cmVhbSk7XG4gICAgICAgIHJldHVybiB0aGlzLnB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZjtcbiAgICB9O1xuICAgIC8qXG4gICAgICogUmVmZXJlbmNlIHRvIFBERkNvbnRlbnRTdHJlYW0gdGhhdCBjb250YWlucyBhIHNpbmdsZSBQREZPcGVyYXRvcjogYFFgLlxuICAgICAqIFVzZWQgYnkgW1tQREZQYWdlTGVhZl1dIGluc3RhbmNlcyB0byBlbnN1cmUgdGhhdCB3aGVuIGNvbnRlbnQgc3RyZWFtcyBhcmVcbiAgICAgKiBhZGRlZCB0byBhIG1vZGlmaWVkIFBERiwgdGhleSBzdGFydCBpbiB0aGUgZGVmYXVsdCwgdW5jaGFuZ2VkIGdyYXBoaWNzXG4gICAgICogc3RhdGUuXG4gICAgICovXG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZ2V0UG9wR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3BHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGljdCA9IHRoaXMub2JqKHt9KTtcbiAgICAgICAgdmFyIG9wID0gUERGT3BlcmF0b3Iub2YoT3BzLlBvcEdyYXBoaWNzU3RhdGUpO1xuICAgICAgICB2YXIgc3RyZWFtID0gUERGQ29udGVudFN0cmVhbS5vZihkaWN0LCBbb3BdKTtcbiAgICAgICAgdGhpcy5wb3BHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZiA9IHRoaXMucmVnaXN0ZXIoc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9wR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWY7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5hZGRSYW5kb21TdWZmaXggPSBmdW5jdGlvbiAocHJlZml4LCBzdWZmaXhMZW5ndGgpIHtcbiAgICAgICAgaWYgKHN1ZmZpeExlbmd0aCA9PT0gdm9pZCAwKSB7IHN1ZmZpeExlbmd0aCA9IDQ7IH1cbiAgICAgICAgcmV0dXJuIHByZWZpeCArIFwiLVwiICsgTWF0aC5mbG9vcih0aGlzLnJuZy5uZXh0SW50KCkgKiBNYXRoLnBvdygxMCwgc3VmZml4TGVuZ3RoKSk7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBQREZDb250ZXh0KCk7IH07XG4gICAgcmV0dXJuIFBERkNvbnRleHQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ29udGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNvbnRleHQuanMubWFwIiwiaW1wb3J0IFBERkFycmF5IGZyb20gXCIuL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuL29iamVjdHMvUERGU3RyZWFtXCI7XG5pbXBvcnQgUERGUGFnZUxlYWYgZnJvbSBcIi4vc3RydWN0dXJlcy9QREZQYWdlTGVhZlwiO1xuLyoqXG4gKiBQREZPYmplY3RDb3BpZXIgY29waWVzIFBERk9iamVjdHMgZnJvbSBhIHNyYyBjb250ZXh0IHRvIGEgZGVzdCBjb250ZXh0LlxuICogVGhlIHByaW1hcnkgdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gY29weSBwYWdlcyBiZXR3ZWVuIFBERnMuXG4gKlxuICogX0NvcHlpbmdfIGFuIG9iamVjdCB3aXRoIGEgUERGT2JqZWN0Q29waWVyIGlzIGRpZmZlcmVudCBmcm9tIF9jbG9uaW5nXyBhblxuICogb2JqZWN0IHdpdGggaXRzIFtbUERGT2JqZWN0LmNsb25lXV0gbWV0aG9kOlxuICpcbiAqIGBgYFxuICogICBjb25zdCBzcmM6IFBERkNvbnRleHQgPSAuLi5cbiAqICAgY29uc3QgZGVzdDogUERGQ29udGV4dCA9IC4uLlxuICogICBjb25zdCBvcmlnaW5hbE9iamVjdDogUERGT2JqZWN0ID0gLi4uXG4gKiAgIGNvbnN0IGNvcGllZE9iamVjdCA9IFBERk9iamVjdENvcGllci5mb3Ioc3JjLCBkZXN0KS5jb3B5KG9yaWdpbmFsT2JqZWN0KTtcbiAqICAgY29uc3QgY2xvbmVkT2JqZWN0ID0gb3JpZ2luYWxPYmplY3QuY2xvbmUoKTtcbiAqIGBgYFxuICpcbiAqIENvcHlpbmcgYW4gb2JqZWN0IGlzIGVxdWl2YWxlbnQgdG8gY2xvbmluZyBpdCBhbmQgdGhlbiBjb3B5aW5nIG92ZXIgYW55IG90aGVyXG4gKiBvYmplY3RzIHRoYXQgaXQgcmVmZXJlbmNlcy4gTm90ZSB0aGF0IG9ubHkgZGljdGlvbmFyaWVzLCBhcnJheXMsIGFuZCBzdHJlYW1zXG4gKiAob3Igc3RydWN0dXJlcyBidWlsZCBmcm9tIHRoZW0pIGNhbiBjb250YWluIGluZGlyZWN0IHJlZmVyZW5jZXMgdG8gb3RoZXJcbiAqIG9iamVjdHMuIENvcHlpbmcgYSBQREZPYmplY3QgdGhhdCBpcyBub3QgYSBkaWN0aW9uYXJ5LCBhcnJheSwgb3Igc3RyZWFtIGlzXG4gKiBzdXBwb3J0ZWQsIGJ1dCBpcyBlcXVpdmFsZW50IHRvIGNsb25pbmcgaXQuXG4gKi9cbnZhciBQREZPYmplY3RDb3BpZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGT2JqZWN0Q29waWVyKHNyYywgZGVzdCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnRyYXZlcnNlZE9iamVjdHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0aGlzLmNvcHkgPSBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAob2JqZWN0IGluc3RhbmNlb2YgUERGUGFnZUxlYWYgPyBfdGhpcy5jb3B5UERGUGFnZShvYmplY3QpXG4gICAgICAgICAgICA6IG9iamVjdCBpbnN0YW5jZW9mIFBERkRpY3QgPyBfdGhpcy5jb3B5UERGRGljdChvYmplY3QpXG4gICAgICAgICAgICAgICAgOiBvYmplY3QgaW5zdGFuY2VvZiBQREZBcnJheSA/IF90aGlzLmNvcHlQREZBcnJheShvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIDogb2JqZWN0IGluc3RhbmNlb2YgUERGU3RyZWFtID8gX3RoaXMuY29weVBERlN0cmVhbShvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9iamVjdCBpbnN0YW5jZW9mIFBERlJlZiA/IF90aGlzLmNvcHlQREZJbmRpcmVjdE9iamVjdChvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvYmplY3QuY2xvbmUoKSk7IH07XG4gICAgICAgIHRoaXMuY29weVBERlBhZ2UgPSBmdW5jdGlvbiAob3JpZ2luYWxQYWdlKSB7XG4gICAgICAgICAgICB2YXIgY2xvbmVkUGFnZSA9IG9yaWdpbmFsUGFnZS5jbG9uZSgpO1xuICAgICAgICAgICAgLy8gTW92ZSBhbnkgZW50cmllcyB0aGF0IHRoZSBvcmlnaW5hbFBhZ2UgaXMgaW5oZXJpdGluZyBmcm9tIGl0cyBwYXJlbnRcbiAgICAgICAgICAgIC8vIHRyZWUgbm9kZXMgZGlyZWN0bHkgaW50byBvcmlnaW5hbFBhZ2Ugc28gdGhleSBhcmUgcHJlc2VydmVkIGR1cmluZ1xuICAgICAgICAgICAgLy8gdGhlIGNvcHkuXG4gICAgICAgICAgICB2YXIgSW5oZXJpdGFibGVFbnRyaWVzID0gUERGUGFnZUxlYWYuSW5oZXJpdGFibGVFbnRyaWVzO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gSW5oZXJpdGFibGVFbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKEluaGVyaXRhYmxlRW50cmllc1tpZHhdKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjbG9uZWRQYWdlLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjbG9uZWRQYWdlLmdldChrZXkpICYmIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICBjbG9uZWRQYWdlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcGFyZW50IHJlZmVyZW5jZSB0byBwcmV2ZW50IHRoZSB3aG9sZSBkb25vciBkb2N1bWVudCdzIHBhZ2VcbiAgICAgICAgICAgIC8vIHRyZWUgZnJvbSBiZWluZyBjb3BpZWQgd2hlbiB3ZSBvbmx5IG5lZWQgYSBzaW5nbGUgcGFnZS5cbiAgICAgICAgICAgIGNsb25lZFBhZ2UuZGVsZXRlKFBERk5hbWUub2YoJ1BhcmVudCcpKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jb3B5UERGRGljdChjbG9uZWRQYWdlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb3B5UERGRGljdCA9IGZ1bmN0aW9uIChvcmlnaW5hbERpY3QpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy50cmF2ZXJzZWRPYmplY3RzLmhhcyhvcmlnaW5hbERpY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuZ2V0KG9yaWdpbmFsRGljdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2xvbmVkRGljdCA9IG9yaWdpbmFsRGljdC5jbG9uZShfdGhpcy5kZXN0KTtcbiAgICAgICAgICAgIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuc2V0KG9yaWdpbmFsRGljdCwgY2xvbmVkRGljdCk7XG4gICAgICAgICAgICB2YXIgZW50cmllcyA9IG9yaWdpbmFsRGljdC5lbnRyaWVzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICAgICAgY2xvbmVkRGljdC5zZXQoa2V5LCBfdGhpcy5jb3B5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xvbmVkRGljdDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb3B5UERGQXJyYXkgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSkge1xuICAgICAgICAgICAgaWYgKF90aGlzLnRyYXZlcnNlZE9iamVjdHMuaGFzKG9yaWdpbmFsQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuZ2V0KG9yaWdpbmFsQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNsb25lZEFycmF5ID0gb3JpZ2luYWxBcnJheS5jbG9uZShfdGhpcy5kZXN0KTtcbiAgICAgICAgICAgIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuc2V0KG9yaWdpbmFsQXJyYXksIGNsb25lZEFycmF5KTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9yaWdpbmFsQXJyYXkuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gb3JpZ2luYWxBcnJheS5nZXQoaWR4KTtcbiAgICAgICAgICAgICAgICBjbG9uZWRBcnJheS5zZXQoaWR4LCBfdGhpcy5jb3B5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xvbmVkQXJyYXk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29weVBERlN0cmVhbSA9IGZ1bmN0aW9uIChvcmlnaW5hbFN0cmVhbSkge1xuICAgICAgICAgICAgaWYgKF90aGlzLnRyYXZlcnNlZE9iamVjdHMuaGFzKG9yaWdpbmFsU3RyZWFtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLmdldChvcmlnaW5hbFN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2xvbmVkU3RyZWFtID0gb3JpZ2luYWxTdHJlYW0uY2xvbmUoX3RoaXMuZGVzdCk7XG4gICAgICAgICAgICBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLnNldChvcmlnaW5hbFN0cmVhbSwgY2xvbmVkU3RyZWFtKTtcbiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gb3JpZ2luYWxTdHJlYW0uZGljdC5lbnRyaWVzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICAgICAgY2xvbmVkU3RyZWFtLmRpY3Quc2V0KGtleSwgX3RoaXMuY29weSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsb25lZFN0cmVhbTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb3B5UERGSW5kaXJlY3RPYmplY3QgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICB2YXIgYWxyZWFkeU1hcHBlZCA9IF90aGlzLnRyYXZlcnNlZE9iamVjdHMuaGFzKHJlZik7XG4gICAgICAgICAgICBpZiAoIWFscmVhZHlNYXBwZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3UmVmID0gX3RoaXMuZGVzdC5uZXh0UmVmKCk7XG4gICAgICAgICAgICAgICAgX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5zZXQocmVmLCBuZXdSZWYpO1xuICAgICAgICAgICAgICAgIHZhciBkZXJlZmVyZW5jZWRWYWx1ZSA9IF90aGlzLnNyYy5sb29rdXAocmVmKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVyZWZlcmVuY2VkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZCA9IF90aGlzLmNvcHkoZGVyZWZlcmVuY2VkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kZXN0LmFzc2lnbihuZXdSZWYsIGNsb25lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuZ2V0KHJlZik7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3JjID0gc3JjO1xuICAgICAgICB0aGlzLmRlc3QgPSBkZXN0O1xuICAgIH1cbiAgICBQREZPYmplY3RDb3BpZXIuZm9yID0gZnVuY3Rpb24gKHNyYywgZGVzdCkge1xuICAgICAgICByZXR1cm4gbmV3IFBERk9iamVjdENvcGllcihzcmMsIGRlc3QpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9iamVjdENvcGllcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPYmplY3RDb3BpZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPYmplY3RDb3BpZXIuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvVGVybWluYWxcIjtcbmltcG9ydCB7IEluZGV4T3V0T2ZCb3VuZHNFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZBY3JvQnV0dG9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvQnV0dG9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9CdXR0b24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUuT3B0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ09wdCcpLCBQREZTdHJpbmcsIFBERkhleFN0cmluZywgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUuc2V0T3B0ID0gZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ09wdCcpLCB0aGlzLmRpY3QuY29udGV4dC5vYmoob3B0KSk7XG4gICAgfTtcbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5nZXRFeHBvcnRWYWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvcHQgPSB0aGlzLk9wdCgpO1xuICAgICAgICBpZiAoIW9wdClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChvcHQgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgb3B0IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gW29wdF07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHQuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBvcHQubG9va3VwKGlkeCk7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9O1xuICAgIFBERkFjcm9CdXR0b24ucHJvdG90eXBlLnJlbW92ZUV4cG9ydFZhbHVlID0gZnVuY3Rpb24gKGlkeCkge1xuICAgICAgICB2YXIgb3B0ID0gdGhpcy5PcHQoKTtcbiAgICAgICAgaWYgKCFvcHQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChvcHQgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgb3B0IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoaWR4ICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXJyb3IoaWR4LCAwLCAwKTtcbiAgICAgICAgICAgIHRoaXMuc2V0T3B0KFtdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+IG9wdC5zaXplKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0Vycm9yKGlkeCwgMCwgb3B0LnNpemUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHQucmVtb3ZlKGlkeCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEVuZm9yY2UgdXNlIHVzZSBvZiAvT3B0IGV2ZW4gaWYgaXQgaXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUubm9ybWFsaXplRXhwb3J0VmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHZhciBleHBvcnRWYWx1ZXMgPSAoX2EgPSB0aGlzLmdldEV4cG9ydFZhbHVlcygpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgdmFyIE9wdCA9IFtdO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBleHBvcnRWYWwgPSAoX2IgPSBleHBvcnRWYWx1ZXNbaWR4XSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogUERGSGV4U3RyaW5nLmZyb21UZXh0KChfZCA9IChfYyA9IHdpZGdldC5nZXRPblZhbHVlKCkpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5kZWNvZGVUZXh0KCkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICcnKTtcbiAgICAgICAgICAgIE9wdC5wdXNoKGV4cG9ydFZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRPcHQoT3B0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldXNlcyBleGlzdGluZyBvcHQgaWYgb25lIGV4aXN0cyB3aXRoIHRoZSBzYW1lIHZhbHVlIChhc3N1bWluZ1xuICAgICAqIGB1c2VFeGlzdGluZ0lkeGAgaXMgYHRydWVgKS4gUmV0dXJucyBpbmRleCBvZiBleGlzdGluZyAob3IgbmV3KSBvcHQuXG4gICAgICovXG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUuYWRkT3B0ID0gZnVuY3Rpb24gKG9wdCwgdXNlRXhpc3RpbmdPcHRJZHgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZUV4cG9ydFZhbHVlcygpO1xuICAgICAgICB2YXIgb3B0VGV4dCA9IG9wdC5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHZhciBleGlzdGluZ0lkeDtcbiAgICAgICAgaWYgKHVzZUV4aXN0aW5nT3B0SWR4KSB7XG4gICAgICAgICAgICB2YXIgZXhwb3J0VmFsdWVzID0gKF9hID0gdGhpcy5nZXRFeHBvcnRWYWx1ZXMoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBleHBvcnRWYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGV4cG9ydFZhbCA9IGV4cG9ydFZhbHVlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRWYWwuZGVjb2RlVGV4dCgpID09PSBvcHRUZXh0KVxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkeCA9IGlkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgT3B0ID0gdGhpcy5PcHQoKTtcbiAgICAgICAgT3B0LnB1c2gob3B0KTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nSWR4ICE9PSBudWxsICYmIGV4aXN0aW5nSWR4ICE9PSB2b2lkIDAgPyBleGlzdGluZ0lkeCA6IE9wdC5zaXplKCkgLSAxO1xuICAgIH07XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUuYWRkV2lkZ2V0V2l0aE9wdCA9IGZ1bmN0aW9uICh3aWRnZXQsIG9wdCwgdXNlRXhpc3RpbmdPcHRJZHgpIHtcbiAgICAgICAgdmFyIG9wdElkeCA9IHRoaXMuYWRkT3B0KG9wdCwgdXNlRXhpc3RpbmdPcHRJZHgpO1xuICAgICAgICB2YXIgYXBTdGF0ZVZhbHVlID0gUERGTmFtZS5vZihTdHJpbmcob3B0SWR4KSk7XG4gICAgICAgIHRoaXMuYWRkV2lkZ2V0KHdpZGdldCk7XG4gICAgICAgIHJldHVybiBhcFN0YXRlVmFsdWU7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0J1dHRvbjtcbn0oUERGQWNyb1Rlcm1pbmFsKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvQnV0dG9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0J1dHRvbi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvQnV0dG9uIGZyb20gXCIuL1BERkFjcm9CdXR0b25cIjtcbmltcG9ydCB7IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFjcm9DaGVja0JveCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb0NoZWNrQm94LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9DaGVja0JveCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvQ2hlY2tCb3gucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIG9uVmFsdWUgPSAoX2EgPSB0aGlzLmdldE9uVmFsdWUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUERGTmFtZS5vZignWWVzJyk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gb25WYWx1ZSAmJiB2YWx1ZSAhPT0gUERGTmFtZS5vZignT2ZmJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVicpLCB2YWx1ZSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gd2lkZ2V0LmdldE9uVmFsdWUoKSA9PT0gdmFsdWUgPyB2YWx1ZSA6IFBERk5hbWUub2YoJ09mZicpO1xuICAgICAgICAgICAgd2lkZ2V0LnNldEFwcGVhcmFuY2VTdGF0ZShzdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFjcm9DaGVja0JveC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2ID0gdGhpcy5WKCk7XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgUERGTmFtZSlcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICByZXR1cm4gUERGTmFtZS5vZignT2ZmJyk7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hlY2tCb3gucHJvdG90eXBlLmdldE9uVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmdldFdpZGdldHMoKVswXTtcbiAgICAgICAgcmV0dXJuIHdpZGdldCA9PT0gbnVsbCB8fCB3aWRnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpZGdldC5nZXRPblZhbHVlKCk7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hlY2tCb3guZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0NoZWNrQm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hlY2tCb3guY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBGVDogJ0J0bicsXG4gICAgICAgICAgICBLaWRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGRpY3QpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9DaGVja0JveChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9DaGVja0JveDtcbn0oUERGQWNyb0J1dHRvbikpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb0NoZWNrQm94O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0NoZWNrQm94LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFjcm9UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvVGVybWluYWxcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgeyBBY3JvQ2hvaWNlRmxhZ3MgfSBmcm9tIFwiLi9mbGFnc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IsIE11bHRpU2VsZWN0VmFsdWVFcnJvciwgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGQWNyb0Nob2ljZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb0Nob2ljZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvQ2hvaWNlKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLnNldFZhbHVlcyA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuQ29tYm8pICYmXG4gICAgICAgICAgICAhdGhpcy5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5FZGl0KSAmJlxuICAgICAgICAgICAgIXRoaXMudmFsdWVzQXJlVmFsaWQodmFsdWVzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignVicpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdWJyksIHZhbHVlc1swXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE11bHRpU2VsZWN0VmFsdWVFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdWJyksIHRoaXMuZGljdC5jb250ZXh0Lm9iaih2YWx1ZXMpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkSW5kaWNlcyh2YWx1ZXMpO1xuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUudmFsdWVzQXJlVmFsaWQgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGlkeCwgbGVuKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmZpbmQoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHZhbCA9PT0gKG8uZGlzcGxheSB8fCBvLnZhbHVlKS5kZWNvZGVUZXh0KCk7IH0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBzdGF0ZV8xID0gX2xvb3BfMShpZHgsIGxlbik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0YXRlXzEgPT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlXzEudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS51cGRhdGVTZWxlY3RlZEluZGljZXMgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIGluZGljZXMgPSBuZXcgQXJyYXkodmFsdWVzLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICAgICAgdmFyIF9sb29wXzIgPSBmdW5jdGlvbiAoaWR4LCBsZW4pIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICAgICAgICAgIGluZGljZXNbaWR4XSA9IG9wdGlvbnMuZmluZEluZGV4KGZ1bmN0aW9uIChvKSB7IHJldHVybiB2YWwgPT09IChvLmRpc3BsYXkgfHwgby52YWx1ZSkuZGVjb2RlVGV4dCgpOyB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgX2xvb3BfMihpZHgsIGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0knKSwgdGhpcy5kaWN0LmNvbnRleHQub2JqKGluZGljZXMuc29ydCgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ0knKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLlYoKTtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgdiBpbnN0YW5jZW9mIFBERkhleFN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBbdl07XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHYuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdi5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUuT3B0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ09wdCcpLCBQREZTdHJpbmcsIFBERkhleFN0cmluZywgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBuZXdPcHQgPSBuZXcgQXJyYXkob3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gb3B0aW9uc1tpZHhdLCB2YWx1ZSA9IF9hLnZhbHVlLCBkaXNwbGF5ID0gX2EuZGlzcGxheTtcbiAgICAgICAgICAgIG5ld09wdFtpZHhdID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKFt2YWx1ZSwgZGlzcGxheSB8fCB2YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignT3B0JyksIHRoaXMuZGljdC5jb250ZXh0Lm9iaihuZXdPcHQpKTtcbiAgICB9O1xuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBPcHQgPSB0aGlzLk9wdCgpO1xuICAgICAgICAvLyBOb3Qgc3VwcG9zZWQgdG8gaGFwcGVuIC0gT3B0IF9zaG91bGRfIGFsd2F5cyBiZSBgUERGQXJyYXkgfCB1bmRlZmluZWRgXG4gICAgICAgIGlmIChPcHQgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgT3B0IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gW3sgdmFsdWU6IE9wdCwgZGlzcGxheTogT3B0IH1dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPcHQgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gT3B0LnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gT3B0Lmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgICAgIC8vIElmIGBpdGVtYCBpcyBhIHN0cmluZywgdXNlIHRoYXQgYXMgYm90aCB0aGUgZXhwb3J0IGFuZCB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgaXRlbSBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh7IHZhbHVlOiBpdGVtLCBkaXNwbGF5OiBpdGVtIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBgaXRlbWAgaXMgYW4gYXJyYXkgb2Ygb25lLCB0cmVhdCBpdCB0aGUgc2FtZSBhcyBqdXN0IGEgc3RyaW5nLFxuICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgYW4gYXJyYXkgb2YgdHdvIHRoZW4gYGl0ZW1bMF1gIGlzIHRoZSBleHBvcnQgdmFsdWUgYW5kXG4gICAgICAgICAgICAgICAgLy8gYGl0ZW1bMV1gIGlzIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zaXplKCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBpdGVtLmxvb2t1cCgwLCBQREZTdHJpbmcsIFBERkhleFN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2Vjb25kID0gaXRlbS5sb29rdXBNYXliZSgxLCBQREZTdHJpbmcsIFBERkhleFN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh7IHZhbHVlOiBmaXJzdCwgZGlzcGxheTogc2Vjb25kIHx8IGZpcnN0IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0Nob2ljZTtcbn0oUERGQWNyb1Rlcm1pbmFsKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvQ2hvaWNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0Nob2ljZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBY3JvQ2hvaWNlIGZyb20gXCIuL1BERkFjcm9DaG9pY2VcIjtcbmltcG9ydCB7IEFjcm9DaG9pY2VGbGFncyB9IGZyb20gXCIuL2ZsYWdzXCI7XG52YXIgUERGQWNyb0NvbWJvQm94ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvQ29tYm9Cb3gsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb0NvbWJvQm94KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9Db21ib0JveC5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvQ29tYm9Cb3goZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9Db21ib0JveC5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnQ2gnLFxuICAgICAgICAgICAgRmY6IEFjcm9DaG9pY2VGbGFncy5Db21ibyxcbiAgICAgICAgICAgIEtpZHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0NvbWJvQm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0NvbWJvQm94O1xufShQREZBY3JvQ2hvaWNlKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvQ29tYm9Cb3g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvQ29tYm9Cb3guanMubWFwIiwiaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IHsgZmluZExhc3RNYXRjaCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgTWlzc2luZ0RBRW50cnlFcnJvciwgTWlzc2luZ1RmT3BlcmF0b3JFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbi8vIEV4YW1wbGVzOlxuLy8gICBgL0hlbHYgMTIgVGZgIC0+IFsnSGVsdicsICcxMiddXG4vLyAgIGAvSGVCbyA4LjAwIFRmYCAtPiBbJ0hlQm8nLCAnOC4wMCddXG4vLyAgIGAvSGVCbyBUZmAgLT4gWydIZUJvJywgdW5kZWZpbmVkXVxudmFyIHRmUmVnZXggPSAvXFwvKFteXFwwXFx0XFxuXFxmXFxyXFwgXSspW1xcMFxcdFxcblxcZlxcclxcIF0qKFxcZCpcXC5cXGQrfFxcZCspP1tcXDBcXHRcXG5cXGZcXHJcXCBdK1RmLztcbnZhciBQREZBY3JvRmllbGQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGQWNyb0ZpZWxkKGRpY3QsIHJlZikge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICB9XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5UID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ1QnKSwgUERGU3RyaW5nLCBQREZIZXhTdHJpbmcpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5GZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG51bWJlck9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLm9mKCdGZicpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5jb250ZXh0Lmxvb2t1cE1heWJlKG51bWJlck9yUmVmLCBQREZOdW1iZXIpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5WID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5vZignVicpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5jb250ZXh0Lmxvb2t1cCh2YWx1ZU9yUmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuS2lkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdLaWRzJyksIFBERkFycmF5KTtcbiAgICB9O1xuICAgIC8vIFBhcmVudCgpOiBQREZEaWN0IHwgdW5kZWZpbmVkIHtcbiAgICAvLyAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignUGFyZW50JyksIFBERkRpY3QpO1xuICAgIC8vIH1cbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLkRBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGEgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0RBJykpO1xuICAgICAgICBpZiAoZGEgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgZGEgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gZGE7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldEtpZHMgPSBmdW5jdGlvbiAoa2lkcykge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0tpZHMnKSwgdGhpcy5kaWN0LmNvbnRleHQub2JqKGtpZHMpKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBjb25zdCBwYXJlbnQgPSB0aGlzLlBhcmVudCgpO1xuICAgICAgICAvLyBpZiAoIXBhcmVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBQREZBY3JvRmllbGQocGFyZW50KTtcbiAgICAgICAgdmFyIHBhcmVudFJlZiA9IHRoaXMuZGljdC5nZXQoUERGTmFtZS5vZignUGFyZW50JykpO1xuICAgICAgICBpZiAocGFyZW50UmVmIGluc3RhbmNlb2YgUERGUmVmKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzEgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1BhcmVudCcpLCBQREZEaWN0KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUERGQWNyb0ZpZWxkKHBhcmVudF8xLCBwYXJlbnRSZWYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ1BhcmVudCcpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdQYXJlbnQnKSwgcGFyZW50KTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKTtcbiAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJ0aWFsTmFtZSgpO1xuICAgICAgICByZXR1cm4gcGFyZW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpICsgXCIuXCIgKyB0aGlzLmdldFBhcnRpYWxOYW1lKCk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmdldFBhcnRpYWxOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLlQoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0UGFydGlhbE5hbWUgPSBmdW5jdGlvbiAocGFydGlhbE5hbWUpIHtcbiAgICAgICAgaWYgKCFwYXJ0aWFsTmFtZSlcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignVCcpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdUJyksIFBERkhleFN0cmluZy5mcm9tVGV4dChwYXJ0aWFsTmFtZSkpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXREZWZhdWx0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignREEnKSwgUERGU3RyaW5nLm9mKGFwcGVhcmFuY2UpKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0RGVmYXVsdEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBEQSA9IHRoaXMuREEoKTtcbiAgICAgICAgaWYgKERBIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gREEuZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEQSA9PT0gbnVsbCB8fCBEQSA9PT0gdm9pZCAwID8gdm9pZCAwIDogREEuYXNTdHJpbmcoKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0Rm9udFNpemUgPSBmdW5jdGlvbiAoZm9udFNpemUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgbmFtZSA9IChfYSA9IHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgICAgICB2YXIgZGEgPSB0aGlzLmdldERlZmF1bHRBcHBlYXJhbmNlKCk7XG4gICAgICAgIGlmICghZGEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0RBRW50cnlFcnJvcihuYW1lKTtcbiAgICAgICAgdmFyIGRhTWF0Y2ggPSBmaW5kTGFzdE1hdGNoKGRhLCB0ZlJlZ2V4KTtcbiAgICAgICAgaWYgKCFkYU1hdGNoLm1hdGNoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdUZk9wZXJhdG9yRXJyb3IobmFtZSk7XG4gICAgICAgIHZhciBkYVN0YXJ0ID0gZGEuc2xpY2UoMCwgZGFNYXRjaC5wb3MgLSBkYU1hdGNoLm1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgIHZhciBkYUVuZCA9IGRhTWF0Y2gucG9zIDw9IGRhLmxlbmd0aCA/IGRhLnNsaWNlKGRhTWF0Y2gucG9zKSA6ICcnO1xuICAgICAgICB2YXIgZm9udE5hbWUgPSBkYU1hdGNoLm1hdGNoWzFdO1xuICAgICAgICB2YXIgbW9kaWZpZWREYSA9IGRhU3RhcnQgKyBcIiAvXCIgKyBmb250TmFtZSArIFwiIFwiICsgZm9udFNpemUgKyBcIiBUZiBcIiArIGRhRW5kO1xuICAgICAgICB0aGlzLnNldERlZmF1bHRBcHBlYXJhbmNlKG1vZGlmaWVkRGEpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5nZXRGbGFncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuRmYoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldEZsYWdzID0gZnVuY3Rpb24gKGZsYWdzKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRmYnKSwgUERGTnVtYmVyLm9mKGZsYWdzKSk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmhhc0ZsYWcgPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLmdldEZsYWdzKCk7XG4gICAgICAgIHJldHVybiAoZmxhZ3MgJiBmbGFnKSAhPT0gMDtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0RmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgdGhpcy5zZXRGbGFncyhmbGFncyB8IGZsYWcpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5jbGVhckZsYWcgPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLmdldEZsYWdzKCk7XG4gICAgICAgIHRoaXMuc2V0RmxhZ3MoZmxhZ3MgJiB+ZmxhZyk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldEZsYWdUbyA9IGZ1bmN0aW9uIChmbGFnLCBlbmFibGUpIHtcbiAgICAgICAgaWYgKGVuYWJsZSlcbiAgICAgICAgICAgIHRoaXMuc2V0RmxhZyhmbGFnKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5jbGVhckZsYWcoZmxhZyk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmdldEluaGVyaXRhYmxlQXR0cmlidXRlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZTtcbiAgICAgICAgdGhpcy5hc2NlbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICghYXR0cmlidXRlKVxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IG5vZGUuZGljdC5nZXQobmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXR0cmlidXRlO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5hc2NlbmQgPSBmdW5jdGlvbiAodmlzaXRvcikge1xuICAgICAgICB2aXNpdG9yKHRoaXMpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIHBhcmVudC5hc2NlbmQodmlzaXRvcik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0ZpZWxkO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9GaWVsZDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9GaWVsZC5qcy5tYXAiLCJpbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvTm9uVGVybWluYWwgZnJvbSBcIi4vUERGQWNyb05vblRlcm1pbmFsXCI7XG5pbXBvcnQgeyBjcmVhdGVQREZBY3JvRmllbGQsIGNyZWF0ZVBERkFjcm9GaWVsZHMsIH0gZnJvbSBcIi4vdXRpbHNcIjtcbnZhciBQREZBY3JvRm9ybSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZBY3JvRm9ybShkaWN0KSB7XG4gICAgICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgfVxuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5GaWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaWVsZHMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0ZpZWxkcycpKTtcbiAgICAgICAgaWYgKGZpZWxkcyBpbnN0YW5jZW9mIFBERkFycmF5KVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5nZXRGaWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBGaWVsZHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRmllbGRzO1xuICAgICAgICB2YXIgZmllbGRzID0gbmV3IEFycmF5KEZpZWxkcy5zaXplKCkpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBGaWVsZHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgcmVmID0gRmllbGRzLmdldChpZHgpO1xuICAgICAgICAgICAgdmFyIGRpY3QgPSBGaWVsZHMubG9va3VwKGlkeCwgUERGRGljdCk7XG4gICAgICAgICAgICBmaWVsZHNbaWR4XSA9IFtjcmVhdGVQREZBY3JvRmllbGQoZGljdCwgcmVmKSwgcmVmXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGRzO1xuICAgIH07XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLmdldEFsbEZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFsbEZpZWxkcyA9IFtdO1xuICAgICAgICB2YXIgcHVzaEZpZWxkcyA9IGZ1bmN0aW9uIChmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmICghZmllbGRzKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaWR4XTtcbiAgICAgICAgICAgICAgICBhbGxGaWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkTW9kZWwgPSBmaWVsZFswXTtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRNb2RlbCBpbnN0YW5jZW9mIFBERkFjcm9Ob25UZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICBwdXNoRmllbGRzKGNyZWF0ZVBERkFjcm9GaWVsZHMoZmllbGRNb2RlbC5LaWRzKCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHB1c2hGaWVsZHModGhpcy5nZXRGaWVsZHMoKSk7XG4gICAgICAgIHJldHVybiBhbGxGaWVsZHM7XG4gICAgfTtcbiAgICBQREZBY3JvRm9ybS5wcm90b3R5cGUuYWRkRmllbGQgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgdmFyIEZpZWxkcyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5GaWVsZHM7XG4gICAgICAgIEZpZWxkcyA9PT0gbnVsbCB8fCBGaWVsZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICB9O1xuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5yZW1vdmVGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gZmllbGQuZ2V0UGFyZW50KCk7XG4gICAgICAgIHZhciBmaWVsZHMgPSBwYXJlbnQgPT09IHVuZGVmaW5lZCA/IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5GaWVsZHMgOiBwYXJlbnQuS2lkcygpO1xuICAgICAgICB2YXIgaW5kZXggPSBmaWVsZHMgPT09IG51bGwgfHwgZmllbGRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWVsZHMuaW5kZXhPZihmaWVsZC5yZWYpO1xuICAgICAgICBpZiAoZmllbGRzID09PSB1bmRlZmluZWQgfHwgaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJpZWQgdG8gcmVtb3ZlIGluZXhpc3RlbnQgZmllbGQgXCIgKyBmaWVsZC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRzLnJlbW92ZShpbmRleCk7XG4gICAgICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCAmJiBmaWVsZHMuc2l6ZSgpID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZpZWxkKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5ub3JtYWxpemVkRW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEZpZWxkcyA9IHRoaXMuRmllbGRzKCk7XG4gICAgICAgIGlmICghRmllbGRzKSB7XG4gICAgICAgICAgICBGaWVsZHMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooW10pO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdGaWVsZHMnKSwgRmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBGaWVsZHM6IEZpZWxkcyB9O1xuICAgIH07XG4gICAgUERGQWNyb0Zvcm0uZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCkgeyByZXR1cm4gbmV3IFBERkFjcm9Gb3JtKGRpY3QpOyB9O1xuICAgIFBERkFjcm9Gb3JtLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooeyBGaWVsZHM6IFtdIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9Gb3JtKGRpY3QpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9Gb3JtO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9Gb3JtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0Zvcm0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQWNyb0Nob2ljZSBmcm9tIFwiLi9QREZBY3JvQ2hvaWNlXCI7XG52YXIgUERGQWNyb0xpc3RCb3ggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9MaXN0Qm94LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9MaXN0Qm94KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9MaXN0Qm94LmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9MaXN0Qm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvTGlzdEJveC5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnQ2gnLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvTGlzdEJveChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9MaXN0Qm94O1xufShQREZBY3JvQ2hvaWNlKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvTGlzdEJveDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9MaXN0Qm94LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9GaWVsZCBmcm9tIFwiLi9QREZBY3JvRmllbGRcIjtcbnZhciBQREZBY3JvTm9uVGVybWluYWwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9Ob25UZXJtaW5hbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvTm9uVGVybWluYWwoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb05vblRlcm1pbmFsLnByb3RvdHlwZS5hZGRGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5LaWRzO1xuICAgICAgICBLaWRzID09PSBudWxsIHx8IEtpZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEtpZHMucHVzaChmaWVsZCk7XG4gICAgfTtcbiAgICBQREZBY3JvTm9uVGVybWluYWwucHJvdG90eXBlLm5vcm1hbGl6ZWRFbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICBpZiAoIUtpZHMpIHtcbiAgICAgICAgICAgIEtpZHMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooW10pO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdLaWRzJyksIEtpZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IEtpZHM6IEtpZHMgfTtcbiAgICB9O1xuICAgIFBERkFjcm9Ob25UZXJtaW5hbC5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvTm9uVGVybWluYWwoZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9Ob25UZXJtaW5hbC5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb05vblRlcm1pbmFsKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb05vblRlcm1pbmFsO1xufShQREZBY3JvRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9Ob25UZXJtaW5hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9Ob25UZXJtaW5hbC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBY3JvQnV0dG9uIGZyb20gXCIuL1BERkFjcm9CdXR0b25cIjtcbmltcG9ydCB7IEFjcm9CdXR0b25GbGFncyB9IGZyb20gXCIuL2ZsYWdzXCI7XG52YXIgUERGQWNyb1B1c2hCdXR0b24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9QdXNoQnV0dG9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9QdXNoQnV0dG9uKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9QdXNoQnV0dG9uLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9QdXNoQnV0dG9uKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvUHVzaEJ1dHRvbi5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnQnRuJyxcbiAgICAgICAgICAgIEZmOiBBY3JvQnV0dG9uRmxhZ3MuUHVzaEJ1dHRvbixcbiAgICAgICAgICAgIEtpZHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1B1c2hCdXR0b24oZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvUHVzaEJ1dHRvbjtcbn0oUERGQWNyb0J1dHRvbikpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb1B1c2hCdXR0b247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvUHVzaEJ1dHRvbi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvQnV0dG9uIGZyb20gXCIuL1BERkFjcm9CdXR0b25cIjtcbmltcG9ydCB7IEFjcm9CdXR0b25GbGFncyB9IGZyb20gXCIuL2ZsYWdzXCI7XG5pbXBvcnQgeyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZBY3JvUmFkaW9CdXR0b24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9SYWRpb0J1dHRvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvUmFkaW9CdXR0b24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb1JhZGlvQnV0dG9uLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgb25WYWx1ZXMgPSB0aGlzLmdldE9uVmFsdWVzKCk7XG4gICAgICAgIGlmICghb25WYWx1ZXMuaW5jbHVkZXModmFsdWUpICYmIHZhbHVlICE9PSBQREZOYW1lLm9mKCdPZmYnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdWJyksIHZhbHVlKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB3aWRnZXQuZ2V0T25WYWx1ZSgpID09PSB2YWx1ZSA/IHZhbHVlIDogUERGTmFtZS5vZignT2ZmJyk7XG4gICAgICAgICAgICB3aWRnZXQuc2V0QXBwZWFyYW5jZVN0YXRlKHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQWNyb1JhZGlvQnV0dG9uLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLlYoKTtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQREZOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIHJldHVybiBQREZOYW1lLm9mKCdPZmYnKTtcbiAgICB9O1xuICAgIFBERkFjcm9SYWRpb0J1dHRvbi5wcm90b3R5cGUuZ2V0T25WYWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzKCk7XG4gICAgICAgIHZhciBvblZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIG9uVmFsdWUgPSB3aWRnZXRzW2lkeF0uZ2V0T25WYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKG9uVmFsdWUpXG4gICAgICAgICAgICAgICAgb25WYWx1ZXMucHVzaChvblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb25WYWx1ZXM7XG4gICAgfTtcbiAgICBQREZBY3JvUmFkaW9CdXR0b24uZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1JhZGlvQnV0dG9uKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvUmFkaW9CdXR0b24uY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBGVDogJ0J0bicsXG4gICAgICAgICAgICBGZjogQWNyb0J1dHRvbkZsYWdzLlJhZGlvLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvUmFkaW9CdXR0b24oZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvUmFkaW9CdXR0b247XG59KFBERkFjcm9CdXR0b24pKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9SYWRpb0J1dHRvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9SYWRpb0J1dHRvbi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBY3JvVGVybWluYWwgZnJvbSBcIi4vUERGQWNyb1Rlcm1pbmFsXCI7XG52YXIgUERGQWNyb1NpZ25hdHVyZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb1NpZ25hdHVyZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvU2lnbmF0dXJlKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9TaWduYXR1cmUuZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1NpZ25hdHVyZShkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9TaWduYXR1cmU7XG59KFBERkFjcm9UZXJtaW5hbCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb1NpZ25hdHVyZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9TaWduYXR1cmUuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb0ZpZWxkIGZyb20gXCIuL1BERkFjcm9GaWVsZFwiO1xuaW1wb3J0IFBERldpZGdldEFubm90YXRpb24gZnJvbSBcIi4uL2Fubm90YXRpb24vUERGV2lkZ2V0QW5ub3RhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhPdXRPZkJvdW5kc0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFjcm9UZXJtaW5hbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb1Rlcm1pbmFsLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9UZXJtaW5hbCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvVGVybWluYWwucHJvdG90eXBlLkZUID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbmFtZU9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLm9mKCdGVCcpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5jb250ZXh0Lmxvb2t1cChuYW1lT3JSZWYsIFBERk5hbWUpO1xuICAgIH07XG4gICAgUERGQWNyb1Rlcm1pbmFsLnByb3RvdHlwZS5nZXRXaWRnZXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2lkRGljdHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyBpdHNlbGYgYSB3aWRnZXRcbiAgICAgICAgaWYgKCFraWREaWN0cylcbiAgICAgICAgICAgIHJldHVybiBbUERGV2lkZ2V0QW5ub3RhdGlvbi5mcm9tRGljdCh0aGlzLmRpY3QpXTtcbiAgICAgICAgLy8gVGhpcyBmaWVsZCdzIGtpZHMgYXJlIGl0cyB3aWRnZXRzXG4gICAgICAgIHZhciB3aWRnZXRzID0gbmV3IEFycmF5KGtpZERpY3RzLnNpemUoKSk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGtpZERpY3RzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGRpY3QgPSBraWREaWN0cy5sb29rdXAoaWR4LCBQREZEaWN0KTtcbiAgICAgICAgICAgIHdpZGdldHNbaWR4XSA9IFBERldpZGdldEFubm90YXRpb24uZnJvbURpY3QoZGljdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpZGdldHM7XG4gICAgfTtcbiAgICBQREZBY3JvVGVybWluYWwucHJvdG90eXBlLmFkZFdpZGdldCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuS2lkcztcbiAgICAgICAgS2lkcy5wdXNoKHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvVGVybWluYWwucHJvdG90eXBlLnJlbW92ZVdpZGdldCA9IGZ1bmN0aW9uIChpZHgpIHtcbiAgICAgICAgdmFyIGtpZERpY3RzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIGlmICgha2lkRGljdHMpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgaXRzZWxmIGEgd2lkZ2V0XG4gICAgICAgICAgICBpZiAoaWR4ICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXJyb3IoaWR4LCAwLCAwKTtcbiAgICAgICAgICAgIHRoaXMuc2V0S2lkcyhbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGlzIGZpZWxkJ3Mga2lkcyBhcmUgaXRzIHdpZGdldHNcbiAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+IGtpZERpY3RzLnNpemUoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXJyb3IoaWR4LCAwLCBraWREaWN0cy5zaXplKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2lkRGljdHMucmVtb3ZlKGlkeCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFjcm9UZXJtaW5hbC5wcm90b3R5cGUubm9ybWFsaXplZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIC8vIElmIHRoaXMgZmllbGQgaXMgaXRzZWxmIGEgd2lkZ2V0IChiZWNhdXNlIGl0IHdhcyBvbmx5IHJlbmRlcmVkIG9uY2UgaW5cbiAgICAgICAgLy8gdGhlIGRvY3VtZW50LCBzbyB0aGUgZmllbGQgYW5kIHdpZGdldCBwcm9wZXJ0aWVzIHdlcmUgbWVyZ2VkKSB0aGVuIHdlXG4gICAgICAgIC8vIGFkZCBpdHNlbGYgdG8gdGhlIGBLaWRzYCBhcnJheS4gVGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHRyeVxuICAgICAgICAvLyBzcGxpdHRpbmcgYXBhcnQgdGhlIHdpZGdldCBwcm9wZXJ0aWVzIGFuZCBjcmVhdGluZyBhIHNlcGFyYXRlIG9iamVjdFxuICAgICAgICAvLyBmb3IgdGhlbS5cbiAgICAgICAgaWYgKCFLaWRzKSB7XG4gICAgICAgICAgICBLaWRzID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKFt0aGlzLnJlZl0pO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdLaWRzJyksIEtpZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IEtpZHM6IEtpZHMgfTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXJtaW5hbC5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvVGVybWluYWwoZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvVGVybWluYWw7XG59KFBERkFjcm9GaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb1Rlcm1pbmFsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb1Rlcm1pbmFsLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvVGVybWluYWxcIjtcbnZhciBQREZBY3JvVGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb1RleHQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb1RleHQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLk1heExlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1heExlbiA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignTWF4TGVuJykpO1xuICAgICAgICBpZiAobWF4TGVuIGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIG1heExlbjtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5RID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUScpKTtcbiAgICAgICAgaWYgKHEgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gcTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5zZXRNYXhMZW5ndGggPSBmdW5jdGlvbiAobWF4TGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignTWF4TGVuJyksIFBERk51bWJlci5vZihtYXhMZW5ndGgpKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5yZW1vdmVNYXhMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignTWF4TGVuJykpO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLmdldE1heExlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5NYXhMZW4oKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuc2V0UXVhZGRpbmcgPSBmdW5jdGlvbiAocXVhZGRpbmcpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdRJyksIFBERk51bWJlci5vZihxdWFkZGluZykpO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLmdldFF1YWRkaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLlEoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdWJyksIHZhbHVlKTtcbiAgICAgICAgLy8gY29uc3Qgd2lkZ2V0cyA9IHRoaXMuZ2V0V2lkZ2V0cygpO1xuICAgICAgICAvLyBmb3IgKGxldCBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAvLyAgIGNvbnN0IHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgLy8gICBjb25zdCBzdGF0ZSA9IHdpZGdldC5nZXRPblZhbHVlKCkgPT09IHZhbHVlID8gdmFsdWUgOiBQREZOYW1lLm9mKCdPZmYnKTtcbiAgICAgICAgLy8gICB3aWRnZXQuc2V0QXBwZWFyYW5jZVN0YXRlKHN0YXRlKTtcbiAgICAgICAgLy8gfVxuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLnJlbW92ZVZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ1YnKSk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2ID0gdGhpcy5WKCk7XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IHYgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikgeyByZXR1cm4gbmV3IFBERkFjcm9UZXh0KGRpY3QsIHJlZik7IH07XG4gICAgUERGQWNyb1RleHQuY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBGVDogJ1R4JyxcbiAgICAgICAgICAgIEtpZHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1RleHQoZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvVGV4dDtcbn0oUERGQWNyb1Rlcm1pbmFsKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvVGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9UZXh0LmpzLm1hcCIsInZhciBmbGFnID0gZnVuY3Rpb24gKGJpdEluZGV4KSB7IHJldHVybiAxIDw8IGJpdEluZGV4OyB9O1xuLyoqIEZyb20gUERGIHNwZWMgdGFibGUgMjIxICovXG5leHBvcnQgdmFyIEFjcm9GaWVsZEZsYWdzO1xuKGZ1bmN0aW9uIChBY3JvRmllbGRGbGFncykge1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIHVzZXIgbWF5IG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gQW55IGFzc29jaWF0ZWRcbiAgICAgKiB3aWRnZXQgYW5ub3RhdGlvbnMgd2lsbCBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgdXNlcjsgdGhhdCBpcywgdGhleSB3aWxsIG5vdFxuICAgICAqIHJlc3BvbmQgdG8gbW91c2UgY2xpY2tzIG9yIGNoYW5nZSB0aGVpciBhcHBlYXJhbmNlIGluIHJlc3BvbnNlIHRvIG1vdXNlXG4gICAgICogbW90aW9ucy4gVGhpcyBmbGFnIGlzIHVzZWZ1bCBmb3IgZmllbGRzIHdob3NlIHZhbHVlcyBhcmUgY29tcHV0ZWQgb3JcbiAgICAgKiBpbXBvcnRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQWNyb0ZpZWxkRmxhZ3NbQWNyb0ZpZWxkRmxhZ3NbXCJSZWFkT25seVwiXSA9IGZsYWcoMSAtIDEpXSA9IFwiUmVhZE9ubHlcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBoYXZlIGEgdmFsdWUgYXQgdGhlIHRpbWUgaXQgaXMgZXhwb3J0ZWQgYnkgYVxuICAgICAqIHN1Ym1pdC1mb3JtIGFjdGlvbiAoc2VlIDEyLjcuNS4yLCBcIlN1Ym1pdC1Gb3JtIEFjdGlvblwiKS5cbiAgICAgKi9cbiAgICBBY3JvRmllbGRGbGFnc1tBY3JvRmllbGRGbGFnc1tcIlJlcXVpcmVkXCJdID0gZmxhZygyIC0gMSldID0gXCJSZXF1aXJlZFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBleHBvcnRlZCBieSBhIHN1Ym1pdC1mb3JtIGFjdGlvblxuICAgICAqIChzZWUgMTIuNy41LjIsIFwiU3VibWl0LUZvcm0gQWN0aW9uXCIpLlxuICAgICAqL1xuICAgIEFjcm9GaWVsZEZsYWdzW0Fjcm9GaWVsZEZsYWdzW1wiTm9FeHBvcnRcIl0gPSBmbGFnKDMgLSAxKV0gPSBcIk5vRXhwb3J0XCI7XG59KShBY3JvRmllbGRGbGFncyB8fCAoQWNyb0ZpZWxkRmxhZ3MgPSB7fSkpO1xuLyoqIEZyb20gUERGIHNwZWMgdGFibGUgMjI2ICovXG5leHBvcnQgdmFyIEFjcm9CdXR0b25GbGFncztcbihmdW5jdGlvbiAoQWNyb0J1dHRvbkZsYWdzKSB7XG4gICAgLyoqXG4gICAgICogKFJhZGlvIGJ1dHRvbnMgb25seSkgSWYgc2V0LCBleGFjdGx5IG9uZSByYWRpbyBidXR0b24gc2hhbGwgYmUgc2VsZWN0ZWQgYXRcbiAgICAgKiBhbGwgdGltZXM7IHNlbGVjdGluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJ1dHRvbiBoYXMgbm8gZWZmZWN0LiBJZiBjbGVhcixcbiAgICAgKiBjbGlja2luZyB0aGUgc2VsZWN0ZWQgYnV0dG9uIGRlc2VsZWN0cyBpdCwgbGVhdmluZyBubyBidXR0b24gc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQWNyb0J1dHRvbkZsYWdzW0Fjcm9CdXR0b25GbGFnc1tcIk5vVG9nZ2xlVG9PZmZcIl0gPSBmbGFnKDE1IC0gMSldID0gXCJOb1RvZ2dsZVRvT2ZmXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBzZXQgb2YgcmFkaW8gYnV0dG9uczsgaWYgY2xlYXIsIHRoZSBmaWVsZCBpcyBhIGNoZWNrXG4gICAgICogYm94LiBUaGlzIGZsYWcgbWF5IGJlIHNldCBvbmx5IGlmIHRoZSBQdXNoYnV0dG9uIGZsYWcgaXMgY2xlYXIuXG4gICAgICovXG4gICAgQWNyb0J1dHRvbkZsYWdzW0Fjcm9CdXR0b25GbGFnc1tcIlJhZGlvXCJdID0gZmxhZygxNiAtIDEpXSA9IFwiUmFkaW9cIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHB1c2hidXR0b24gdGhhdCBkb2VzIG5vdCByZXRhaW4gYSBwZXJtYW5lbnQgdmFsdWUuXG4gICAgICovXG4gICAgQWNyb0J1dHRvbkZsYWdzW0Fjcm9CdXR0b25GbGFnc1tcIlB1c2hCdXR0b25cIl0gPSBmbGFnKDE3IC0gMSldID0gXCJQdXNoQnV0dG9uXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBhIGdyb3VwIG9mIHJhZGlvIGJ1dHRvbnMgd2l0aGluIGEgcmFkaW8gYnV0dG9uIGZpZWxkIHRoYXQgdXNlIHRoZVxuICAgICAqIHNhbWUgdmFsdWUgZm9yIHRoZSBvbiBzdGF0ZSB3aWxsIHR1cm4gb24gYW5kIG9mZiBpbiB1bmlzb247IHRoYXQgaXMgaWYgb25lXG4gICAgICogaXMgY2hlY2tlZCwgdGhleSBhcmUgYWxsIGNoZWNrZWQuIElmIGNsZWFyLCB0aGUgYnV0dG9ucyBhcmUgbXV0dWFsbHlcbiAgICAgKiBleGNsdXNpdmUgKHRoZSBzYW1lIGJlaGF2aW9yIGFzIEhUTUwgcmFkaW8gYnV0dG9ucykuXG4gICAgICovXG4gICAgQWNyb0J1dHRvbkZsYWdzW0Fjcm9CdXR0b25GbGFnc1tcIlJhZGlvc0luVW5pc29uXCJdID0gZmxhZygyNiAtIDEpXSA9IFwiUmFkaW9zSW5Vbmlzb25cIjtcbn0pKEFjcm9CdXR0b25GbGFncyB8fCAoQWNyb0J1dHRvbkZsYWdzID0ge30pKTtcbi8qKiBGcm9tIFBERiBzcGVjIHRhYmxlIDIyOCAqL1xuZXhwb3J0IHZhciBBY3JvVGV4dEZsYWdzO1xuKGZ1bmN0aW9uIChBY3JvVGV4dEZsYWdzKSB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgbGluZXMgb2YgdGV4dDsgaWYgY2xlYXIsIHRoZSBmaWVsZCdzXG4gICAgICogdGV4dCBzaGFsbCBiZSByZXN0cmljdGVkIHRvIGEgc2luZ2xlIGxpbmUuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiTXVsdGlsaW5lXCJdID0gZmxhZygxMyAtIDEpXSA9IFwiTXVsdGlsaW5lXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgaW50ZW5kZWQgZm9yIGVudGVyaW5nIGEgc2VjdXJlIHBhc3N3b3JkIHRoYXQgc2hvdWxkXG4gICAgICogbm90IGJlIGVjaG9lZCB2aXNpYmx5IHRvIHRoZSBzY3JlZW4uIENoYXJhY3RlcnMgdHlwZWQgZnJvbSB0aGUga2V5Ym9hcmRcbiAgICAgKiBzaGFsbCBpbnN0ZWFkIGJlIGVjaG9lZCBpbiBzb21lIHVucmVhZGFibGUgZm9ybSwgc3VjaCBhcyBhc3Rlcmlza3Mgb3JcbiAgICAgKiBidWxsZXQgY2hhcmFjdGVycy5cbiAgICAgKiA+IE5PVEUgICBUbyBwcm90ZWN0IHBhc3N3b3JkIGNvbmZpZGVudGlhbGl0eSwgcmVhZGVycyBzaG91bGQgbmV2ZXIgc3RvcmVcbiAgICAgKiA+ICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHRleHQgZmllbGQgaW4gdGhlIFBERiBmaWxlIGlmIHRoaXMgZmxhZyBpcyBzZXQuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiUGFzc3dvcmRcIl0gPSBmbGFnKDE0IC0gMSldID0gXCJQYXNzd29yZFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgcmVwcmVzZW50cyB0aGUgcGF0aG5hbWUgb2YgYSBmaWxlXG4gICAgICogd2hvc2UgY29udGVudHMgc2hhbGwgYmUgc3VibWl0dGVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiRmlsZVNlbGVjdFwiXSA9IGZsYWcoMjEgLSAxKV0gPSBcIkZpbGVTZWxlY3RcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsLWNoZWNrZWQuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiRG9Ob3RTcGVsbENoZWNrXCJdID0gZmxhZygyMyAtIDEpXSA9IFwiRG9Ob3RTcGVsbENoZWNrXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgbm90IHNjcm9sbCAoaG9yaXpvbnRhbGx5IGZvciBzaW5nbGUtbGluZSBmaWVsZHMsXG4gICAgICogdmVydGljYWxseSBmb3IgbXVsdGlwbGUtbGluZSBmaWVsZHMpIHRvIGFjY29tbW9kYXRlIG1vcmUgdGV4dCB0aGFuIGZpdHNcbiAgICAgKiB3aXRoaW4gaXRzIGFubm90YXRpb24gcmVjdGFuZ2xlLiBPbmNlIHRoZSBmaWVsZCBpcyBmdWxsLCBubyBmdXJ0aGVyIHRleHRcbiAgICAgKiBzaGFsbCBiZSBhY2NlcHRlZCBmb3IgaW50ZXJhY3RpdmUgZm9ybSBmaWxsaW5nOyBmb3Igbm9uLWludGVyYWN0aXZlIGZvcm1cbiAgICAgKiBmaWxsaW5nLCB0aGUgZmlsbGVyIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGFkZCBtb3JlIGNoYXJhY3RlciB0aGFuIHdpbGxcbiAgICAgKiB2aXNpYmx5IGZpdCBpbiB0aGUgZGVmaW5lZCBhcmVhLlxuICAgICAqL1xuICAgIEFjcm9UZXh0RmxhZ3NbQWNyb1RleHRGbGFnc1tcIkRvTm90U2Nyb2xsXCJdID0gZmxhZygyNCAtIDEpXSA9IFwiRG9Ob3RTY3JvbGxcIjtcbiAgICAvKipcbiAgICAgKiBNYXkgYmUgc2V0IG9ubHkgaWYgdGhlIE1heExlbiBlbnRyeSBpcyBwcmVzZW50IGluIHRoZSB0ZXh0IGZpZWxkIGRpY3Rpb25hcnlcbiAgICAgKiAoc2VlIFRhYmxlIDIyOSkgYW5kIGlmIHRoZSBNdWx0aWxpbmUsIFBhc3N3b3JkLCBhbmQgRmlsZVNlbGVjdCBmbGFncyBhcmVcbiAgICAgKiBjbGVhci4gSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgYmUgYXV0b21hdGljYWxseSBkaXZpZGVkIGludG8gYXMgbWFueVxuICAgICAqIGVxdWFsbHkgc3BhY2VkIHBvc2l0aW9ucywgb3IgY29tYnMsIGFzIHRoZSB2YWx1ZSBvZiBNYXhMZW4sIGFuZCB0aGUgdGV4dFxuICAgICAqIGlzIGxhaWQgb3V0IGludG8gdGhvc2UgY29tYnMuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiQ29tYlwiXSA9IGZsYWcoMjUgLSAxKV0gPSBcIkNvbWJcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHNoYWxsIGJlIGEgcmljaCB0ZXh0IHN0cmluZ1xuICAgICAqIChzZWUgMTIuNy4zLjQsIFwiUmljaCBUZXh0IFN0cmluZ3NcIikuIElmIHRoZSBmaWVsZCBoYXMgYSB2YWx1ZSwgdGhlIFJWXG4gICAgICogZW50cnkgb2YgdGhlIGZpZWxkIGRpY3Rpb25hcnkgKFRhYmxlIDIyMikgc2hhbGwgc3BlY2lmeSB0aGUgcmljaCB0ZXh0XG4gICAgICogc3RyaW5nLlxuICAgICAqL1xuICAgIEFjcm9UZXh0RmxhZ3NbQWNyb1RleHRGbGFnc1tcIlJpY2hUZXh0XCJdID0gZmxhZygyNiAtIDEpXSA9IFwiUmljaFRleHRcIjtcbn0pKEFjcm9UZXh0RmxhZ3MgfHwgKEFjcm9UZXh0RmxhZ3MgPSB7fSkpO1xuLyoqIEZyb20gUERGIHNwZWMgdGFibGUgMjMwICovXG5leHBvcnQgdmFyIEFjcm9DaG9pY2VGbGFncztcbihmdW5jdGlvbiAoQWNyb0Nob2ljZUZsYWdzKSB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBjb21ibyBib3g7IGlmIGNsZWFyLCB0aGUgZmllbGQgaXMgYSBsaXN0IGJveC5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiQ29tYm9cIl0gPSBmbGFnKDE4IC0gMSldID0gXCJDb21ib1wiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGNvbWJvIGJveCBzaGFsbCBpbmNsdWRlIGFuIGVkaXRhYmxlIHRleHQgYm94IGFzIHdlbGwgYXMgYVxuICAgICAqIGRyb3AtZG93biBsaXN0OyBpZiBjbGVhciwgaXQgc2hhbGwgaW5jbHVkZSBvbmx5IGEgZHJvcC1kb3duIGxpc3QuIFRoaXNcbiAgICAgKiBmbGFnIHNoYWxsIGJlIHVzZWQgb25seSBpZiB0aGUgQ29tYm8gZmxhZyBpcyBzZXQuXG4gICAgICovXG4gICAgQWNyb0Nob2ljZUZsYWdzW0Fjcm9DaG9pY2VGbGFnc1tcIkVkaXRcIl0gPSBmbGFnKDE5IC0gMSldID0gXCJFZGl0XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQncyBvcHRpb24gaXRlbXMgc2hhbGwgYmUgc29ydGVkIGFscGhhYmV0aWNhbGx5LiBUaGlzIGZsYWdcbiAgICAgKiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IHdyaXRlcnMsIG5vdCBieSByZWFkZXJzLiBDb25mb3JtaW5nIHJlYWRlcnMgc2hhbGxcbiAgICAgKiBkaXNwbGF5IHRoZSBvcHRpb25zIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VyIGluIHRoZSBPcHQgYXJyYXlcbiAgICAgKiAoc2VlIFRhYmxlIDIzMSkuXG4gICAgICovXG4gICAgQWNyb0Nob2ljZUZsYWdzW0Fjcm9DaG9pY2VGbGFnc1tcIlNvcnRcIl0gPSBmbGFnKDIwIC0gMSldID0gXCJTb3J0XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBtb3JlIHRoYW4gb25lIG9mIHRoZSBmaWVsZCdzIG9wdGlvbiBpdGVtcyBtYXkgYmUgc2VsZWN0ZWRcbiAgICAgKiBzaW11bHRhbmVvdXNseTsgaWYgY2xlYXIsIGF0IG1vc3Qgb25lIGl0ZW0gc2hhbGwgYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQWNyb0Nob2ljZUZsYWdzW0Fjcm9DaG9pY2VGbGFnc1tcIk11bHRpU2VsZWN0XCJdID0gZmxhZygyMiAtIDEpXSA9IFwiTXVsdGlTZWxlY3RcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsLWNoZWNrZWQuIFRoaXMgZmxhZ1xuICAgICAqIHNoYWxsIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUgQ29tYm8gYW5kIEVkaXQgZmxhZ3MgYXJlIGJvdGggc2V0LlxuICAgICAqL1xuICAgIEFjcm9DaG9pY2VGbGFnc1tBY3JvQ2hvaWNlRmxhZ3NbXCJEb05vdFNwZWxsQ2hlY2tcIl0gPSBmbGFnKDIzIC0gMSldID0gXCJEb05vdFNwZWxsQ2hlY2tcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBuZXcgdmFsdWUgc2hhbGwgYmUgY29tbWl0dGVkIGFzIHNvb24gYXMgYSBzZWxlY3Rpb24gaXMgbWFkZVxuICAgICAqIChjb21tb25seSB3aXRoIHRoZSBwb2ludGluZyBkZXZpY2UpLiBJbiB0aGlzIGNhc2UsIHN1cHBseWluZyBhIHZhbHVlIGZvclxuICAgICAqIGEgZmllbGQgaW52b2x2ZXMgdGhyZWUgYWN0aW9uczogc2VsZWN0aW5nIHRoZSBmaWVsZCBmb3IgZmlsbC1pbixcbiAgICAgKiBzZWxlY3RpbmcgYSBjaG9pY2UgZm9yIHRoZSBmaWxsLWluIHZhbHVlLCBhbmQgbGVhdmluZyB0aGF0IGZpZWxkLCB3aGljaFxuICAgICAqIGZpbmFsaXplcyBvciBcImNvbW1pdHNcIiB0aGUgZGF0YSBjaG9pY2UgYW5kIHRyaWdnZXJzIGFueSBhY3Rpb25zIGFzc29jaWF0ZWRcbiAgICAgKiB3aXRoIHRoZSBlbnRyeSBvciBjaGFuZ2luZyBvZiB0aGlzIGRhdGEuIElmIHRoaXMgZmxhZyBpcyBvbiwgdGhlblxuICAgICAqIHByb2Nlc3NpbmcgZG9lcyBub3Qgd2FpdCBmb3IgbGVhdmluZyB0aGUgZmllbGQgYWN0aW9uIHRvIG9jY3VyLCBidXRcbiAgICAgKiBpbW1lZGlhdGVseSBwcm9jZWVkcyB0byB0aGUgdGhpcmQgc3RlcC5cbiAgICAgKlxuICAgICAqIFRoaXMgb3B0aW9uIGVuYWJsZXMgYXBwbGljYXRpb25zIHRvIHBlcmZvcm0gYW4gYWN0aW9uIG9uY2UgYSBzZWxlY3Rpb24gaXNcbiAgICAgKiBtYWRlLCB3aXRob3V0IHJlcXVpcmluZyB0aGUgdXNlciB0byBleGl0IHRoZSBmaWVsZC4gSWYgY2xlYXIsIHRoZSBuZXdcbiAgICAgKiB2YWx1ZSBpcyBub3QgY29tbWl0dGVkIHVudGlsIHRoZSB1c2VyIGV4aXRzIHRoZSBmaWVsZC5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiQ29tbWl0T25TZWxDaGFuZ2VcIl0gPSBmbGFnKDI3IC0gMSldID0gXCJDb21taXRPblNlbENoYW5nZVwiO1xufSkoQWNyb0Nob2ljZUZsYWdzIHx8IChBY3JvQ2hvaWNlRmxhZ3MgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxhZ3MuanMubWFwIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvQnV0dG9uIH0gZnJvbSBcIi4vUERGQWNyb0J1dHRvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvQ2hlY2tCb3ggfSBmcm9tIFwiLi9QREZBY3JvQ2hlY2tCb3hcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0Nob2ljZSB9IGZyb20gXCIuL1BERkFjcm9DaG9pY2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0NvbWJvQm94IH0gZnJvbSBcIi4vUERGQWNyb0NvbWJvQm94XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9GaWVsZCB9IGZyb20gXCIuL1BERkFjcm9GaWVsZFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvRm9ybSB9IGZyb20gXCIuL1BERkFjcm9Gb3JtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9MaXN0Qm94IH0gZnJvbSBcIi4vUERGQWNyb0xpc3RCb3hcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb05vblRlcm1pbmFsIH0gZnJvbSBcIi4vUERGQWNyb05vblRlcm1pbmFsXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9QdXNoQnV0dG9uIH0gZnJvbSBcIi4vUERGQWNyb1B1c2hCdXR0b25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb1JhZGlvQnV0dG9uIH0gZnJvbSBcIi4vUERGQWNyb1JhZGlvQnV0dG9uXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9TaWduYXR1cmUgfSBmcm9tIFwiLi9QREZBY3JvU2lnbmF0dXJlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9UZXJtaW5hbCB9IGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvVGV4dCB9IGZyb20gXCIuL1BERkFjcm9UZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mbGFnc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGQWNyb1Rlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xuaW1wb3J0IFBERkFjcm9Ob25UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvTm9uVGVybWluYWxcIjtcbmltcG9ydCBQREZBY3JvU2lnbmF0dXJlIGZyb20gXCIuL1BERkFjcm9TaWduYXR1cmVcIjtcbmltcG9ydCBQREZBY3JvVGV4dCBmcm9tIFwiLi9QREZBY3JvVGV4dFwiO1xuaW1wb3J0IFBERkFjcm9QdXNoQnV0dG9uIGZyb20gXCIuL1BERkFjcm9QdXNoQnV0dG9uXCI7XG5pbXBvcnQgUERGQWNyb1JhZGlvQnV0dG9uIGZyb20gXCIuL1BERkFjcm9SYWRpb0J1dHRvblwiO1xuaW1wb3J0IFBERkFjcm9DaGVja0JveCBmcm9tIFwiLi9QREZBY3JvQ2hlY2tCb3hcIjtcbmltcG9ydCBQREZBY3JvQ29tYm9Cb3ggZnJvbSBcIi4vUERGQWNyb0NvbWJvQm94XCI7XG5pbXBvcnQgUERGQWNyb0xpc3RCb3ggZnJvbSBcIi4vUERGQWNyb0xpc3RCb3hcIjtcbmltcG9ydCB7IEFjcm9CdXR0b25GbGFncywgQWNyb0Nob2ljZUZsYWdzIH0gZnJvbSBcIi4vZmxhZ3NcIjtcbmV4cG9ydCB2YXIgY3JlYXRlUERGQWNyb0ZpZWxkcyA9IGZ1bmN0aW9uIChraWREaWN0cykge1xuICAgIGlmICgha2lkRGljdHMpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB2YXIga2lkcyA9IFtdO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGtpZERpY3RzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgcmVmID0ga2lkRGljdHMuZ2V0KGlkeCk7XG4gICAgICAgIHZhciBkaWN0ID0ga2lkRGljdHMubG9va3VwKGlkeCk7XG4gICAgICAgIC8vIGlmIChkaWN0IGluc3RhbmNlb2YgUERGRGljdCkga2lkcy5wdXNoKFBERkFjcm9GaWVsZC5mcm9tRGljdChkaWN0KSk7XG4gICAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBQREZSZWYgJiYgZGljdCBpbnN0YW5jZW9mIFBERkRpY3QpIHtcbiAgICAgICAgICAgIGtpZHMucHVzaChbY3JlYXRlUERGQWNyb0ZpZWxkKGRpY3QsIHJlZiksIHJlZl0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBraWRzO1xufTtcbmV4cG9ydCB2YXIgY3JlYXRlUERGQWNyb0ZpZWxkID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgIHZhciBpc05vblRlcm1pbmFsID0gaXNOb25UZXJtaW5hbEFjcm9GaWVsZChkaWN0KTtcbiAgICBpZiAoaXNOb25UZXJtaW5hbClcbiAgICAgICAgcmV0dXJuIFBERkFjcm9Ob25UZXJtaW5hbC5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIHJldHVybiBjcmVhdGVQREZBY3JvVGVybWluYWwoZGljdCwgcmVmKTtcbn07XG4vLyBUT0RPOiBNYXliZSBqdXN0IGNoZWNrIGlmIHRoZSBkaWN0IGlzICpub3QqIGEgd2lkZ2V0PyBUaGF0IG1pZ2h0IGJlIGJldHRlci5cbi8vIEFjY29yZGluZyB0byB0aGUgUERGIHNwZWM6XG4vL1xuLy8gICA+IEEgZmllbGQncyBjaGlsZHJlbiBpbiB0aGUgaGllcmFyY2h5IG1heSBhbHNvIGluY2x1ZGUgd2lkZ2V0IGFubm90YXRpb25zXG4vLyAgID4gdGhhdCBkZWZpbmUgaXRzIGFwcGVhcmFuY2Ugb24gdGhlIHBhZ2UuIEEgZmllbGQgdGhhdCBoYXMgY2hpbGRyZW4gdGhhdFxuLy8gICA+IGFyZSBmaWVsZHMgaXMgY2FsbGVkIGEgbm9uLXRlcm1pbmFsIGZpZWxkLiBBIGZpZWxkIHRoYXQgZG9lcyBub3QgaGF2ZVxuLy8gICA+IGNoaWxkcmVuIHRoYXQgYXJlIGZpZWxkcyBpcyBjYWxsZWQgYSB0ZXJtaW5hbCBmaWVsZC5cbi8vXG4vLyBUaGUgc3BlYyBpcyBub3QgZW50aXJlbHkgY2xlYXIgYWJvdXQgaG93IHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW5cbi8vIGRpY3Rpb25hcnkgcmVwcmVzZW50cyBhbiBhY3JvZmllbGQgb3IgYSB3aWRnZXQgYW5ub3RhdGlvbi4gU28gd2Ugd2lsbCBhc3N1bWVcbi8vIHRoYXQgYSBkaWN0aW9uYXJ5IGlzIGFuIGFjcm9maWVsZCBpZiBpdCBpcyBhIG1lbWJlciBvZiB0aGUgYC9LaWRzYCBhcnJheVxuLy8gYW5kIGl0IGNvbnRhaW5zIGEgYC9UYCBlbnRyeSAod2lkZ2V0cyBkbyBub3QgaGF2ZSBgL1RgIGVudHJpZXMpLiBUaGlzIGlzbid0XG4vLyBhIGJ1bGxldCBwcm9vZiBzb2x1dGlvbiwgYmVjYXVzZSB0aGUgYC9UYCBlbnRyeSBpcyB0ZWNobmljYWxseSBkZWZpbmVkIGFzXG4vLyBvcHRpb25hbCBmb3IgYWNyb2ZpZWxkcyBieSB0aGUgUERGIHNwZWMuIEJ1dCBpbiBwcmFjdGljZSBhbGwgYWNyb2ZpZWxkcyBzZWVtXG4vLyB0byBoYXZlIGEgYC9UYCBlbnRyeSBkZWZpbmVkLlxudmFyIGlzTm9uVGVybWluYWxBY3JvRmllbGQgPSBmdW5jdGlvbiAoZGljdCkge1xuICAgIHZhciBraWRzID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignS2lkcycpKTtcbiAgICBpZiAoa2lkcyBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGtpZHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIga2lkID0ga2lkcy5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgIHZhciBraWRJc0ZpZWxkID0ga2lkIGluc3RhbmNlb2YgUERGRGljdCAmJiBraWQuaGFzKFBERk5hbWUub2YoJ1QnKSk7XG4gICAgICAgICAgICBpZiAoa2lkSXNGaWVsZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xudmFyIGNyZWF0ZVBERkFjcm9UZXJtaW5hbCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICB2YXIgZnROYW1lT3JSZWYgPSBnZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShkaWN0LCBQREZOYW1lLm9mKCdGVCcpKTtcbiAgICB2YXIgdHlwZSA9IGRpY3QuY29udGV4dC5sb29rdXAoZnROYW1lT3JSZWYsIFBERk5hbWUpO1xuICAgIGlmICh0eXBlID09PSBQREZOYW1lLm9mKCdCdG4nKSlcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVBERkFjcm9CdXR0b24oZGljdCwgcmVmKTtcbiAgICBpZiAodHlwZSA9PT0gUERGTmFtZS5vZignQ2gnKSlcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVBERkFjcm9DaG9pY2UoZGljdCwgcmVmKTtcbiAgICBpZiAodHlwZSA9PT0gUERGTmFtZS5vZignVHgnKSlcbiAgICAgICAgcmV0dXJuIFBERkFjcm9UZXh0LmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgaWYgKHR5cGUgPT09IFBERk5hbWUub2YoJ1NpZycpKVxuICAgICAgICByZXR1cm4gUERGQWNyb1NpZ25hdHVyZS5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIC8vIFdlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGxpbmUuIEJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2Ygd2VpcmQgUERGcyBvdXRcbiAgICAvLyB0aGVyZS4gU28sIGp1c3QgdG8gYmUgc2FmZSwgd2UnbGwgdHJ5IHRvIGhhbmRsZSB0aGluZ3MgZ3JhY2VmdWxseSBpbnN0ZWFkXG4gICAgLy8gb2YgdGhyb3dpbmcgYW4gZXJyb3IuXG4gICAgcmV0dXJuIFBERkFjcm9UZXJtaW5hbC5mcm9tRGljdChkaWN0LCByZWYpO1xufTtcbnZhciBjcmVhdGVQREZBY3JvQnV0dG9uID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgIHZhciBfYTtcbiAgICB2YXIgZmZOdW1iZXJPclJlZiA9IGdldEluaGVyaXRhYmxlQXR0cmlidXRlKGRpY3QsIFBERk5hbWUub2YoJ0ZmJykpO1xuICAgIHZhciBmZk51bWJlciA9IGRpY3QuY29udGV4dC5sb29rdXBNYXliZShmZk51bWJlck9yUmVmLCBQREZOdW1iZXIpO1xuICAgIHZhciBmbGFncyA9IChfYSA9IGZmTnVtYmVyID09PSBudWxsIHx8IGZmTnVtYmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmZk51bWJlci5hc051bWJlcigpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIGlmIChmbGFnSXNTZXQoZmxhZ3MsIEFjcm9CdXR0b25GbGFncy5QdXNoQnV0dG9uKSkge1xuICAgICAgICByZXR1cm4gUERGQWNyb1B1c2hCdXR0b24uZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZmxhZ0lzU2V0KGZsYWdzLCBBY3JvQnV0dG9uRmxhZ3MuUmFkaW8pKSB7XG4gICAgICAgIHJldHVybiBQREZBY3JvUmFkaW9CdXR0b24uZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBQREZBY3JvQ2hlY2tCb3guZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICB9XG59O1xudmFyIGNyZWF0ZVBERkFjcm9DaG9pY2UgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBmZk51bWJlck9yUmVmID0gZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoZGljdCwgUERGTmFtZS5vZignRmYnKSk7XG4gICAgdmFyIGZmTnVtYmVyID0gZGljdC5jb250ZXh0Lmxvb2t1cE1heWJlKGZmTnVtYmVyT3JSZWYsIFBERk51bWJlcik7XG4gICAgdmFyIGZsYWdzID0gKF9hID0gZmZOdW1iZXIgPT09IG51bGwgfHwgZmZOdW1iZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZmTnVtYmVyLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgaWYgKGZsYWdJc1NldChmbGFncywgQWNyb0Nob2ljZUZsYWdzLkNvbWJvKSkge1xuICAgICAgICByZXR1cm4gUERGQWNyb0NvbWJvQm94LmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gUERGQWNyb0xpc3RCb3guZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICB9XG59O1xudmFyIGZsYWdJc1NldCA9IGZ1bmN0aW9uIChmbGFncywgZmxhZykge1xuICAgIHJldHVybiAoZmxhZ3MgJiBmbGFnKSAhPT0gMDtcbn07XG52YXIgZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoc3RhcnROb2RlLCBuYW1lKSB7XG4gICAgdmFyIGF0dHJpYnV0ZTtcbiAgICBhc2NlbmQoc3RhcnROb2RlLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAoIWF0dHJpYnV0ZSlcbiAgICAgICAgICAgIGF0dHJpYnV0ZSA9IG5vZGUuZ2V0KG5hbWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhdHRyaWJ1dGU7XG59O1xudmFyIGFzY2VuZCA9IGZ1bmN0aW9uIChzdGFydE5vZGUsIHZpc2l0b3IpIHtcbiAgICB2aXNpdG9yKHN0YXJ0Tm9kZSk7XG4gICAgdmFyIFBhcmVudCA9IHN0YXJ0Tm9kZS5sb29rdXBNYXliZShQREZOYW1lLm9mKCdQYXJlbnQnKSwgUERGRGljdCk7XG4gICAgaWYgKFBhcmVudClcbiAgICAgICAgYXNjZW5kKFBhcmVudCwgdmlzaXRvcik7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwiaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG52YXIgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuUiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFIgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1InKSk7XG4gICAgICAgIGlmIChSIGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIFI7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5CQyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJDID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdCQycpKTtcbiAgICAgICAgaWYgKEJDIGluc3RhbmNlb2YgUERGQXJyYXkpXG4gICAgICAgICAgICByZXR1cm4gQkM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5CRyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJHID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdCRycpKTtcbiAgICAgICAgaWYgKEJHIGluc3RhbmNlb2YgUERGQXJyYXkpXG4gICAgICAgICAgICByZXR1cm4gQkc7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5DQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIENBID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdDQScpKTtcbiAgICAgICAgaWYgKENBIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nIHx8IENBIGluc3RhbmNlb2YgUERGU3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIENBO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuUkMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBSQyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUkMnKSk7XG4gICAgICAgIGlmIChSQyBpbnN0YW5jZW9mIFBERkhleFN0cmluZyB8fCBSQyBpbnN0YW5jZW9mIFBERlN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBSQztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLkFDID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQUMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0FDJykpO1xuICAgICAgICBpZiAoQUMgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcgfHwgQUMgaW5zdGFuY2VvZiBQREZTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gQUM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5nZXRSb3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5SKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc051bWJlcigpO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuZ2V0Qm9yZGVyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCQyA9IHRoaXMuQkMoKTtcbiAgICAgICAgaWYgKCFCQylcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEJDID09PSBudWxsIHx8IEJDID09PSB2b2lkIDAgPyB2b2lkIDAgOiBCQy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSBCQy5nZXQoaWR4KTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudC5hc051bWJlcigpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLmdldEJhY2tncm91bmRDb2xvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJHID0gdGhpcy5CRygpO1xuICAgICAgICBpZiAoIUJHKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gQkcgPT09IG51bGwgfHwgQkcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEJHLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IEJHLmdldChpZHgpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFBERk51bWJlcilcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50LmFzTnVtYmVyKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuZ2V0Q2FwdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBDQSA9IHRoaXMuQ0EoKTtcbiAgICAgICAgdmFyIFJDID0gdGhpcy5SQygpO1xuICAgICAgICB2YXIgQUMgPSB0aGlzLkFDKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub3JtYWw6IENBID09PSBudWxsIHx8IENBID09PSB2b2lkIDAgPyB2b2lkIDAgOiBDQS5kZWNvZGVUZXh0KCksXG4gICAgICAgICAgICByb2xsb3ZlcjogUkMgPT09IG51bGwgfHwgUkMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IFJDLmRlY29kZVRleHQoKSxcbiAgICAgICAgICAgIGRvd246IEFDID09PSBudWxsIHx8IEFDID09PSB2b2lkIDAgPyB2b2lkIDAgOiBBQy5kZWNvZGVUZXh0KCksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5zZXRSb3RhdGlvbiA9IGZ1bmN0aW9uIChyb3RhdGlvbikge1xuICAgICAgICB2YXIgUiA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihyb3RhdGlvbik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUicpLCBSKTtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLnNldEJvcmRlckNvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBCQyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihjb2xvcik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQkMnKSwgQkMpO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuc2V0QmFja2dyb3VuZENvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBCRyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihjb2xvcik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQkcnKSwgQkcpO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuc2V0Q2FwdGlvbnMgPSBmdW5jdGlvbiAoY2FwdGlvbnMpIHtcbiAgICAgICAgdmFyIENBID0gUERGSGV4U3RyaW5nLmZyb21UZXh0KGNhcHRpb25zLm5vcm1hbCk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQ0EnKSwgQ0EpO1xuICAgICAgICBpZiAoY2FwdGlvbnMucm9sbG92ZXIpIHtcbiAgICAgICAgICAgIHZhciBSQyA9IFBERkhleFN0cmluZy5mcm9tVGV4dChjYXB0aW9ucy5yb2xsb3Zlcik7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1JDJyksIFJDKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignUkMnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcHRpb25zLmRvd24pIHtcbiAgICAgICAgICAgIHZhciBBQyA9IFBERkhleFN0cmluZy5mcm9tVGV4dChjYXB0aW9ucy5kb3duKTtcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQUMnKSwgQUMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdBQycpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyhkaWN0KTtcbiAgICB9O1xuICAgIHJldHVybiBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3M7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmpzLm1hcCIsImltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG4vLyBUT0RPOiBBbHNvIGhhbmRsZSB0aGUgYC9TYCBhbmQgYC9EYCBlbnRyaWVzXG52YXIgQm9yZGVyU3R5bGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQm9yZGVyU3R5bGUoZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICBCb3JkZXJTdHlsZS5wcm90b3R5cGUuVyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFcgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1cnKSk7XG4gICAgICAgIGlmIChXIGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIFc7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBCb3JkZXJTdHlsZS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLlcoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDE7XG4gICAgfTtcbiAgICBCb3JkZXJTdHlsZS5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgICAgICAgdmFyIFcgPSB0aGlzLmRpY3QuY29udGV4dC5vYmood2lkdGgpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1cnKSwgVyk7XG4gICAgfTtcbiAgICBCb3JkZXJTdHlsZS5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7IHJldHVybiBuZXcgQm9yZGVyU3R5bGUoZGljdCk7IH07XG4gICAgcmV0dXJuIEJvcmRlclN0eWxlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEJvcmRlclN0eWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Qm9yZGVyU3R5bGUuanMubWFwIiwiaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERlN0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG52YXIgUERGQW5ub3RhdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZBbm5vdGF0aW9uKGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgLy8gVGhpcyBpcyB0ZWNobmljYWxseSByZXF1aXJlZCBieSB0aGUgUERGIHNwZWNcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5SZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdSZWN0JyksIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLkFQID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ0FQJyksIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuRiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG51bWJlck9yUmVmID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdGJykpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmNvbnRleHQubG9va3VwTWF5YmUobnVtYmVyT3JSZWYsIFBERk51bWJlcik7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRSZWN0YW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIFJlY3QgPSB0aGlzLlJlY3QoKTtcbiAgICAgICAgcmV0dXJuIChfYSA9IFJlY3QgPT09IG51bGwgfHwgUmVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogUmVjdC5hc1JlY3RhbmdsZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldFJlY3RhbmdsZSA9IGZ1bmN0aW9uIChyZWN0KSB7XG4gICAgICAgIHZhciB4ID0gcmVjdC54LCB5ID0gcmVjdC55LCB3aWR0aCA9IHJlY3Qud2lkdGgsIGhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgICAgICB2YXIgUmVjdCA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUmVjdCcpLCBSZWN0KTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmdldEFwcGVhcmFuY2VTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFTID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdBUycpKTtcbiAgICAgICAgaWYgKEFTIGluc3RhbmNlb2YgUERGTmFtZSlcbiAgICAgICAgICAgIHJldHVybiBBUztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldEFwcGVhcmFuY2VTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0FTJyksIHN0YXRlKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldEFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGFwcGVhcmFuY2VzKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQVAnKSwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuZW5zdXJlQVAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBUCA9IHRoaXMuQVAoKTtcbiAgICAgICAgaWYgKCFBUCkge1xuICAgICAgICAgICAgQVAgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooe30pO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdBUCcpLCBBUCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFQO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0Tm9ybWFsQXBwZWFyYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5lbnN1cmVBUCgpO1xuICAgICAgICB2YXIgTiA9IEFQLmdldChQREZOYW1lLm9mKCdOJykpO1xuICAgICAgICBpZiAoTiBpbnN0YW5jZW9mIFBERlJlZiB8fCBOIGluc3RhbmNlb2YgUERGRGljdClcbiAgICAgICAgICAgIHJldHVybiBOO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIE4gdHlwZTogXCIgKyAoTiA9PT0gbnVsbCB8fCBOID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOLmNvbnN0cnVjdG9yLm5hbWUpKTtcbiAgICB9O1xuICAgIC8qKiBAcGFyYW0gYXBwZWFyYW5jZSBBIFBERkRpY3Qgb3IgUERGU3RyZWFtIChkaXJlY3Qgb3IgcmVmKSAqL1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldE5vcm1hbEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLmVuc3VyZUFQKCk7XG4gICAgICAgIEFQLnNldChQREZOYW1lLm9mKCdOJyksIGFwcGVhcmFuY2UpO1xuICAgIH07XG4gICAgLyoqIEBwYXJhbSBhcHBlYXJhbmNlIEEgUERGRGljdCBvciBQREZTdHJlYW0gKGRpcmVjdCBvciByZWYpICovXG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0Um9sbG92ZXJBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5lbnN1cmVBUCgpO1xuICAgICAgICBBUC5zZXQoUERGTmFtZS5vZignUicpLCBhcHBlYXJhbmNlKTtcbiAgICB9O1xuICAgIC8qKiBAcGFyYW0gYXBwZWFyYW5jZSBBIFBERkRpY3Qgb3IgUERGU3RyZWFtIChkaXJlY3Qgb3IgcmVmKSAqL1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldERvd25BcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5lbnN1cmVBUCgpO1xuICAgICAgICBBUC5zZXQoUERGTmFtZS5vZignRCcpLCBhcHBlYXJhbmNlKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnJlbW92ZVJvbGxvdmVyQXBwZWFyYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5BUCgpO1xuICAgICAgICBBUCA9PT0gbnVsbCB8fCBBUCA9PT0gdm9pZCAwID8gdm9pZCAwIDogQVAuZGVsZXRlKFBERk5hbWUub2YoJ1InKSk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5yZW1vdmVEb3duQXBwZWFyYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5BUCgpO1xuICAgICAgICBBUCA9PT0gbnVsbCB8fCBBUCA9PT0gdm9pZCAwID8gdm9pZCAwIDogQVAuZGVsZXRlKFBERk5hbWUub2YoJ0QnKSk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5BUCgpO1xuICAgICAgICBpZiAoIUFQKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIE4gPSBBUC5sb29rdXAoUERGTmFtZS5vZignTicpLCBQREZEaWN0LCBQREZTdHJlYW0pO1xuICAgICAgICB2YXIgUiA9IEFQLmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ1InKSwgUERGRGljdCwgUERGU3RyZWFtKTtcbiAgICAgICAgdmFyIEQgPSBBUC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdEJyksIFBERkRpY3QsIFBERlN0cmVhbSk7XG4gICAgICAgIHJldHVybiB7IG5vcm1hbDogTiwgcm9sbG92ZXI6IFIsIGRvd246IEQgfTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmdldEZsYWdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5GKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc051bWJlcigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0RmxhZ3MgPSBmdW5jdGlvbiAoZmxhZ3MpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdGJyksIFBERk51bWJlci5vZihmbGFncykpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuaGFzRmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgcmV0dXJuIChmbGFncyAmIGZsYWcpICE9PSAwO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0RmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgdGhpcy5zZXRGbGFncyhmbGFncyB8IGZsYWcpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuY2xlYXJGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5nZXRGbGFncygpO1xuICAgICAgICB0aGlzLnNldEZsYWdzKGZsYWdzICYgfmZsYWcpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0RmxhZ1RvID0gZnVuY3Rpb24gKGZsYWcsIGVuYWJsZSkge1xuICAgICAgICBpZiAoZW5hYmxlKVxuICAgICAgICAgICAgdGhpcy5zZXRGbGFnKGZsYWcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmNsZWFyRmxhZyhmbGFnKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24uZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCkgeyByZXR1cm4gbmV3IFBERkFubm90YXRpb24oZGljdCk7IH07XG4gICAgcmV0dXJuIFBERkFubm90YXRpb247XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQW5ub3RhdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFubm90YXRpb24uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgQm9yZGVyU3R5bGUgZnJvbSBcIi4vQm9yZGVyU3R5bGVcIjtcbmltcG9ydCBQREZBbm5vdGF0aW9uIGZyb20gXCIuL1BERkFubm90YXRpb25cIjtcbmltcG9ydCBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzIGZyb20gXCIuL0FwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3NcIjtcbnZhciBQREZXaWRnZXRBbm5vdGF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZXaWRnZXRBbm5vdGF0aW9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERldpZGdldEFubm90YXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuTUsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBNSyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignTUsnKSk7XG4gICAgICAgIGlmIChNSyBpbnN0YW5jZW9mIFBERkRpY3QpXG4gICAgICAgICAgICByZXR1cm4gTUs7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5CUyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJTID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdCUycpKTtcbiAgICAgICAgaWYgKEJTIGluc3RhbmNlb2YgUERGRGljdClcbiAgICAgICAgICAgIHJldHVybiBCUztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLkRBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGEgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0RBJykpO1xuICAgICAgICBpZiAoZGEgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgZGEgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gZGE7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5QID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgUCA9IHRoaXMuZGljdC5nZXQoUERGTmFtZS5vZignUCcpKTtcbiAgICAgICAgaWYgKFAgaW5zdGFuY2VvZiBQREZSZWYpXG4gICAgICAgICAgICByZXR1cm4gUDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLnNldFAgPSBmdW5jdGlvbiAocGFnZSkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1AnKSwgcGFnZSk7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXREZWZhdWx0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignREEnKSwgUERGU3RyaW5nLm9mKGFwcGVhcmFuY2UpKTtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldERlZmF1bHRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgREEgPSB0aGlzLkRBKCk7XG4gICAgICAgIGlmIChEQSBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIERBLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREEgPT09IG51bGwgfHwgREEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IERBLmFzU3RyaW5nKCk7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTUsgPSB0aGlzLk1LKCk7XG4gICAgICAgIGlmIChNSylcbiAgICAgICAgICAgIHJldHVybiBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmZyb21EaWN0KE1LKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldE9yQ3JlYXRlQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE1LID0gdGhpcy5NSygpO1xuICAgICAgICBpZiAoTUspXG4gICAgICAgICAgICByZXR1cm4gQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5mcm9tRGljdChNSyk7XG4gICAgICAgIHZhciBhYyA9IEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MuZnJvbURpY3QodGhpcy5kaWN0LmNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignTUsnKSwgYWMuZGljdCk7XG4gICAgICAgIHJldHVybiBhYztcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldEJvcmRlclN0eWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQlMgPSB0aGlzLkJTKCk7XG4gICAgICAgIGlmIChCUylcbiAgICAgICAgICAgIHJldHVybiBCb3JkZXJTdHlsZS5mcm9tRGljdChCUyk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRPckNyZWF0ZUJvcmRlclN0eWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQlMgPSB0aGlzLkJTKCk7XG4gICAgICAgIGlmIChCUylcbiAgICAgICAgICAgIHJldHVybiBCb3JkZXJTdHlsZS5mcm9tRGljdChCUyk7XG4gICAgICAgIHZhciBicyA9IEJvcmRlclN0eWxlLmZyb21EaWN0KHRoaXMuZGljdC5jb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0JTJyksIGJzLmRpY3QpO1xuICAgICAgICByZXR1cm4gYnM7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRPblZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBub3JtYWwgPSAoX2EgPSB0aGlzLmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWw7XG4gICAgICAgIGlmIChub3JtYWwgaW5zdGFuY2VvZiBQREZEaWN0KSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IG5vcm1hbC5rZXlzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBrZXlzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gUERGTmFtZS5vZignT2ZmJykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24uZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCkge1xuICAgICAgICByZXR1cm4gbmV3IFBERldpZGdldEFubm90YXRpb24oZGljdCk7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBUeXBlOiAnQW5ub3QnLFxuICAgICAgICAgICAgU3VidHlwZTogJ1dpZGdldCcsXG4gICAgICAgICAgICBSZWN0OiBbMCwgMCwgMCwgMF0sXG4gICAgICAgICAgICBQYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgUERGV2lkZ2V0QW5ub3RhdGlvbihkaWN0KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZXaWRnZXRBbm5vdGF0aW9uO1xufShQREZBbm5vdGF0aW9uKSk7XG5leHBvcnQgZGVmYXVsdCBQREZXaWRnZXRBbm5vdGF0aW9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGV2lkZ2V0QW5ub3RhdGlvbi5qcy5tYXAiLCJ2YXIgZmxhZyA9IGZ1bmN0aW9uIChiaXRJbmRleCkgeyByZXR1cm4gMSA8PCBiaXRJbmRleDsgfTtcbi8qKiBGcm9tIFBERiBzcGVjIHRhYmxlIDE2NSAqL1xuZXhwb3J0IHZhciBBbm5vdGF0aW9uRmxhZ3M7XG4oZnVuY3Rpb24gKEFubm90YXRpb25GbGFncykge1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGRpc3BsYXkgdGhlIGFubm90YXRpb24gaWYgaXQgZG9lcyBub3QgYmVsb25nIHRvIG9uZSBvZiB0aGVcbiAgICAgKiBzdGFuZGFyZCBhbm5vdGF0aW9uIHR5cGVzIGFuZCBubyBhbm5vdGF0aW9uIGhhbmRsZXIgaXMgYXZhaWxhYmxlLiBJZiBjbGVhcixcbiAgICAgKiBkaXNwbGF5IHN1Y2ggYW4gdW5rbm93biBhbm5vdGF0aW9uIHVzaW5nIGFuIGFwcGVhcmFuY2Ugc3RyZWFtIHNwZWNpZmllZCBieVxuICAgICAqIGl0cyBhcHBlYXJhbmNlIGRpY3Rpb25hcnksIGlmIGFueS5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiSW52aXNpYmxlXCJdID0gZmxhZygxIC0gMSldID0gXCJJbnZpc2libGVcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBkaXNwbGF5IG9yIHByaW50IHRoZSBhbm5vdGF0aW9uIG9yIGFsbG93IGl0IHRvIGludGVyYWN0IHdpdGhcbiAgICAgKiB0aGUgdXNlciwgcmVnYXJkbGVzcyBvZiBpdHMgYW5ub3RhdGlvbiB0eXBlIG9yIHdoZXRoZXIgYW4gYW5ub3RhdGlvblxuICAgICAqIGhhbmRsZXIgaXMgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogSW4gY2FzZXMgd2hlcmUgc2NyZWVuIHNwYWNlIGlzIGxpbWl0ZWQsIHRoZSBhYmlsaXR5IHRvIGhpZGUgYW5kIHNob3dcbiAgICAgKiBhbm5vdGF0aW9ucyBzZWxlY3RpdmVseSBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGFwcGVhcmFuY2Ugc3RyZWFtc1xuICAgICAqIHRvIGRpc3BsYXkgYXV4aWxpYXJ5IHBvcC11cCBpbmZvcm1hdGlvbiBzaW1pbGFyIGluIGZ1bmN0aW9uIHRvIG9ubGluZSBoZWxwXG4gICAgICogc3lzdGVtcy5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiSGlkZGVuXCJdID0gZmxhZygyIC0gMSldID0gXCJIaWRkZW5cIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHByaW50IHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIHBhZ2UgaXMgcHJpbnRlZC4gSWYgY2xlYXIsIG5ldmVyXG4gICAgICogcHJpbnQgdGhlIGFubm90YXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYW5ub3RhdGlvbnMgcmVwcmVzZW50aW5nIGludGVyYWN0aXZlIHB1c2hidXR0b25zLFxuICAgICAqIHdoaWNoIHdvdWxkIHNlcnZlIG5vIG1lYW5pbmdmdWwgcHVycG9zZSBvbiB0aGUgcHJpbnRlZCBwYWdlLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJQcmludFwiXSA9IGZsYWcoMyAtIDEpXSA9IFwiUHJpbnRcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBzY2FsZSB0aGUgYW5ub3RhdGlvbuKAmXMgYXBwZWFyYW5jZSB0byBtYXRjaCB0aGUgbWFnbmlmaWNhdGlvblxuICAgICAqIG9mIHRoZSBwYWdlLiBUaGUgbG9jYXRpb24gb2YgdGhlIGFubm90YXRpb24gb24gdGhlIHBhZ2UgKGRlZmluZWQgYnkgdGhlXG4gICAgICogdXBwZXItbGVmdCBjb3JuZXIgb2YgaXRzIGFubm90YXRpb24gcmVjdGFuZ2xlKSBzaGFsbCByZW1haW4gZml4ZWQsXG4gICAgICogcmVnYXJkbGVzcyBvZiB0aGUgcGFnZSBtYWduaWZpY2F0aW9uLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJOb1pvb21cIl0gPSBmbGFnKDQgLSAxKV0gPSBcIk5vWm9vbVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IHJvdGF0ZSB0aGUgYW5ub3RhdGlvbuKAmXMgYXBwZWFyYW5jZSB0byBtYXRjaCB0aGUgcm90YXRpb24gb2ZcbiAgICAgKiB0aGUgcGFnZS4gVGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBhbm5vdGF0aW9uIHJlY3RhbmdsZSBzaGFsbCByZW1haW4gaW5cbiAgICAgKiBhIGZpeGVkIGxvY2F0aW9uIG9uIHRoZSBwYWdlLCByZWdhcmRsZXNzIG9mIHRoZSBwYWdlIHJvdGF0aW9uLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJOb1JvdGF0ZVwiXSA9IGZsYWcoNSAtIDEpXSA9IFwiTm9Sb3RhdGVcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBkaXNwbGF5IHRoZSBhbm5vdGF0aW9uIG9uIHRoZSBzY3JlZW4gb3IgYWxsb3cgaXQgdG8gaW50ZXJhY3RcbiAgICAgKiB3aXRoIHRoZSB1c2VyLiBUaGUgYW5ub3RhdGlvbiBtYXkgYmUgcHJpbnRlZCAoZGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5nIG9mXG4gICAgICogdGhlIFByaW50IGZsYWcpIGJ1dCBzaG91bGQgYmUgY29uc2lkZXJlZCBoaWRkZW4gZm9yIHB1cnBvc2VzIG9mIG9uLXNjcmVlblxuICAgICAqIGRpc3BsYXkgYW5kIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIk5vVmlld1wiXSA9IGZsYWcoNiAtIDEpXSA9IFwiTm9WaWV3XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3QgYWxsb3cgdGhlIGFubm90YXRpb24gdG8gaW50ZXJhY3Qgd2l0aCB0aGUgdXNlci4gVGhlXG4gICAgICogYW5ub3RhdGlvbiBtYXkgYmUgZGlzcGxheWVkIG9yIHByaW50ZWQgKGRlcGVuZGluZyBvbiB0aGUgc2V0dGluZ3Mgb2YgdGhlXG4gICAgICogTm9WaWV3IGFuZCBQcmludCBmbGFncykgYnV0IHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBjbGlja3Mgb3IgY2hhbmdlXG4gICAgICogaXRzIGFwcGVhcmFuY2UgaW4gcmVzcG9uc2UgdG8gbW91c2UgbW90aW9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgZmxhZyBzaGFsbCBiZSBpZ25vcmVkIGZvciB3aWRnZXQgYW5ub3RhdGlvbnM7IGl0cyBmdW5jdGlvbiBpc1xuICAgICAqIHN1YnN1bWVkIGJ5IHRoZSBSZWFkT25seSBmbGFnIG9mIHRoZSBhc3NvY2lhdGVkIGZvcm0gZmllbGQuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIlJlYWRPbmx5XCJdID0gZmxhZyg3IC0gMSldID0gXCJSZWFkT25seVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGFsbG93IHRoZSBhbm5vdGF0aW9uIHRvIGJlIGRlbGV0ZWQgb3IgaXRzIHByb3BlcnRpZXNcbiAgICAgKiAoaW5jbHVkaW5nIHBvc2l0aW9uIGFuZCBzaXplKSB0byBiZSBtb2RpZmllZCBieSB0aGUgdXNlci4gSG93ZXZlciwgdGhpc1xuICAgICAqIGZsYWcgZG9lcyBub3QgcmVzdHJpY3QgY2hhbmdlcyB0byB0aGUgYW5ub3RhdGlvbuKAmXMgY29udGVudHMsIHN1Y2ggYXMgdGhlXG4gICAgICogdmFsdWUgb2YgYSBmb3JtIGZpZWxkLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJMb2NrZWRcIl0gPSBmbGFnKDggLSAxKV0gPSBcIkxvY2tlZFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgaW52ZXJ0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgTm9WaWV3IGZsYWcgZm9yIGNlcnRhaW4gZXZlbnRzLlxuICAgICAqXG4gICAgICogQSB0eXBpY2FsIHVzZSBpcyB0byBoYXZlIGFuIGFubm90YXRpb24gdGhhdCBhcHBlYXJzIG9ubHkgd2hlbiBhIG1vdXNlXG4gICAgICogY3Vyc29yIGlzIGhlbGQgb3ZlciBpdC5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiVG9nZ2xlTm9WaWV3XCJdID0gZmxhZyg5IC0gMSldID0gXCJUb2dnbGVOb1ZpZXdcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBhbGxvdyB0aGUgY29udGVudHMgb2YgdGhlIGFubm90YXRpb24gdG8gYmUgbW9kaWZpZWQgYnkgdGhlXG4gICAgICogdXNlci4gVGhpcyBmbGFnIGRvZXMgbm90IHJlc3RyaWN0IGRlbGV0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIG9yIGNoYW5nZXMgdG9cbiAgICAgKiBvdGhlciBhbm5vdGF0aW9uIHByb3BlcnRpZXMsIHN1Y2ggYXMgcG9zaXRpb24gYW5kIHNpemUuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIkxvY2tlZENvbnRlbnRzXCJdID0gZmxhZygxMCAtIDEpXSA9IFwiTG9ja2VkQ29udGVudHNcIjtcbn0pKEFubm90YXRpb25GbGFncyB8fCAoQW5ub3RhdGlvbkZsYWdzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsYWdzLmpzLm1hcCIsImV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQW5ub3RhdGlvbiB9IGZyb20gXCIuL1BERkFubm90YXRpb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGV2lkZ2V0QW5ub3RhdGlvbiB9IGZyb20gXCIuL1BERldpZGdldEFubm90YXRpb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyB9IGZyb20gXCIuL0FwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZsYWdzXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIHBhZFN0YXJ0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIEVudHJpZXMgc2hvdWxkIGJlIGFkZGVkIHVzaW5nIHRoZSBbW2FkZEVudHJ5XV0gYW5kIFtbYWRkRGVsZXRlZEVudHJ5XV1cbiAqIG1ldGhvZHMgKippbiBvcmRlciBvZiBhc2NlbmRpbmcgb2JqZWN0IG51bWJlcioqLlxuICovXG52YXIgUERGQ3Jvc3NSZWZTZWN0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkNyb3NzUmVmU2VjdGlvbihmaXJzdEVudHJ5KSB7XG4gICAgICAgIHRoaXMuc3Vic2VjdGlvbnMgPSBmaXJzdEVudHJ5ID8gW1tmaXJzdEVudHJ5XV0gOiBbXTtcbiAgICAgICAgdGhpcy5jaHVua0lkeCA9IDA7XG4gICAgICAgIHRoaXMuY2h1bmtMZW5ndGggPSBmaXJzdEVudHJ5ID8gMSA6IDA7XG4gICAgfVxuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuYWRkRW50cnkgPSBmdW5jdGlvbiAocmVmLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoeyByZWY6IHJlZiwgb2Zmc2V0OiBvZmZzZXQsIGRlbGV0ZWQ6IGZhbHNlIH0pO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5hZGREZWxldGVkRW50cnkgPSBmdW5jdGlvbiAocmVmLCBuZXh0RnJlZU9iamVjdE51bWJlcikge1xuICAgICAgICB0aGlzLmFwcGVuZCh7IHJlZjogcmVmLCBvZmZzZXQ6IG5leHRGcmVlT2JqZWN0TnVtYmVyLCBkZWxldGVkOiB0cnVlIH0pO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNlY3Rpb24gPSBcInhyZWZcXG5cIjtcbiAgICAgICAgZm9yICh2YXIgcmFuZ2VJZHggPSAwLCByYW5nZUxlbiA9IHRoaXMuc3Vic2VjdGlvbnMubGVuZ3RoOyByYW5nZUlkeCA8IHJhbmdlTGVuOyByYW5nZUlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLnN1YnNlY3Rpb25zW3JhbmdlSWR4XTtcbiAgICAgICAgICAgIHNlY3Rpb24gKz0gcmFuZ2VbMF0ucmVmLm9iamVjdE51bWJlciArIFwiIFwiICsgcmFuZ2UubGVuZ3RoICsgXCJcXG5cIjtcbiAgICAgICAgICAgIGZvciAodmFyIGVudHJ5SWR4ID0gMCwgZW50cnlMZW4gPSByYW5nZS5sZW5ndGg7IGVudHJ5SWR4IDwgZW50cnlMZW47IGVudHJ5SWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSByYW5nZVtlbnRyeUlkeF07XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSBwYWRTdGFydChTdHJpbmcoZW50cnkub2Zmc2V0KSwgMTAsICcwJyk7XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSAnICc7XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSBwYWRTdGFydChTdHJpbmcoZW50cnkucmVmLmdlbmVyYXRpb25OdW1iZXIpLCA1LCAnMCcpO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gJyAnO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gZW50cnkuZGVsZXRlZCA/ICdmJyA6ICduJztcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9ICcgXFxuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VjdGlvbjtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzaXplID0gNTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5zdWJzZWN0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBzdWJzZWN0aW9uID0gdGhpcy5zdWJzZWN0aW9uc1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN1YnNlY3Rpb25MZW5ndGggPSBzdWJzZWN0aW9uLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBmaXJzdEVudHJ5ID0gc3Vic2VjdGlvblswXTtcbiAgICAgICAgICAgIHNpemUgKz0gMjtcbiAgICAgICAgICAgIHNpemUgKz0gU3RyaW5nKGZpcnN0RW50cnkucmVmLm9iamVjdE51bWJlcikubGVuZ3RoO1xuICAgICAgICAgICAgc2l6ZSArPSBTdHJpbmcoc3Vic2VjdGlvbkxlbmd0aCkubGVuZ3RoO1xuICAgICAgICAgICAgc2l6ZSArPSAyMCAqIHN1YnNlY3Rpb25MZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMueDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBvZmZzZXQgKz0gdGhpcy5jb3B5U3Vic2VjdGlvbnNJbnRvQnVmZmVyKHRoaXMuc3Vic2VjdGlvbnMsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLmNvcHlTdWJzZWN0aW9uc0ludG9CdWZmZXIgPSBmdW5jdGlvbiAoc3Vic2VjdGlvbnMsIGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB2YXIgbGVuZ3RoID0gc3Vic2VjdGlvbnMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgc3Vic2VjdGlvbiA9IHRoaXMuc3Vic2VjdGlvbnNbaWR4XTtcbiAgICAgICAgICAgIHZhciBmaXJzdE9iamVjdE51bWJlciA9IFN0cmluZyhzdWJzZWN0aW9uWzBdLnJlZi5vYmplY3ROdW1iZXIpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKGZpcnN0T2JqZWN0TnVtYmVyLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgdmFyIHJhbmdlTGVuZ3RoID0gU3RyaW5nKHN1YnNlY3Rpb24ubGVuZ3RoKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihyYW5nZUxlbmd0aCwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMuY29weUVudHJpZXNJbnRvQnVmZmVyKHN1YnNlY3Rpb24sIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuY29weUVudHJpZXNJbnRvQnVmZmVyID0gZnVuY3Rpb24gKGVudHJpZXMsIGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpZHhdO1xuICAgICAgICAgICAgdmFyIGVudHJ5T2Zmc2V0ID0gcGFkU3RhcnQoU3RyaW5nKGVudHJ5Lm9mZnNldCksIDEwLCAnMCcpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKGVudHJ5T2Zmc2V0LCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgdmFyIGVudHJ5R2VuID0gcGFkU3RhcnQoU3RyaW5nKGVudHJ5LnJlZi5nZW5lcmF0aW9uTnVtYmVyKSwgNSwgJzAnKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihlbnRyeUdlbiwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBlbnRyeS5kZWxldGVkID8gQ2hhckNvZGVzLmYgOiBDaGFyQ29kZXMubjtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDIwICogbGVuZ3RoO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoY3VyckVudHJ5KSB7XG4gICAgICAgIGlmICh0aGlzLmNodW5rTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNlY3Rpb25zLnB1c2goW2N1cnJFbnRyeV0pO1xuICAgICAgICAgICAgdGhpcy5jaHVua0lkeCA9IDA7XG4gICAgICAgICAgICB0aGlzLmNodW5rTGVuZ3RoID0gMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLnN1YnNlY3Rpb25zW3RoaXMuY2h1bmtJZHhdO1xuICAgICAgICB2YXIgcHJldkVudHJ5ID0gY2h1bmtbdGhpcy5jaHVua0xlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY3VyckVudHJ5LnJlZi5vYmplY3ROdW1iZXIgLSBwcmV2RW50cnkucmVmLm9iamVjdE51bWJlciA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2VjdGlvbnMucHVzaChbY3VyckVudHJ5XSk7XG4gICAgICAgICAgICB0aGlzLmNodW5rSWR4ICs9IDE7XG4gICAgICAgICAgICB0aGlzLmNodW5rTGVuZ3RoID0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goY3VyckVudHJ5KTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtMZW5ndGggKz0gMTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZDcm9zc1JlZlNlY3Rpb24oe1xuICAgICAgICAgICAgcmVmOiBQREZSZWYub2YoMCwgNjU1MzUpLFxuICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgZGVsZXRlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24uY3JlYXRlRW1wdHkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUERGQ3Jvc3NSZWZTZWN0aW9uKCk7IH07XG4gICAgcmV0dXJuIFBERkNyb3NzUmVmU2VjdGlvbjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZDcm9zc1JlZlNlY3Rpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDcm9zc1JlZlNlY3Rpb24uanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY2hhckZyb21Db2RlLCBjb3B5U3RyaW5nSW50b0J1ZmZlciB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERkhlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZIZWFkZXIobWFqb3IsIG1pbm9yKSB7XG4gICAgICAgIHRoaXMubWFqb3IgPSBTdHJpbmcobWFqb3IpO1xuICAgICAgICB0aGlzLm1pbm9yID0gU3RyaW5nKG1pbm9yKTtcbiAgICB9XG4gICAgUERGSGVhZGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJjID0gY2hhckZyb21Db2RlKDEyOSk7XG4gICAgICAgIHJldHVybiBcIiVQREYtXCIgKyB0aGlzLm1ham9yICsgXCIuXCIgKyB0aGlzLm1pbm9yICsgXCJcXG4lXCIgKyBiYyArIGJjICsgYmMgKyBiYztcbiAgICB9O1xuICAgIFBERkhlYWRlci5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAxMiArIHRoaXMubWFqb3IubGVuZ3RoICsgdGhpcy5taW5vci5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZIZWFkZXIucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUGVyY2VudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5QO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuRjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5EYXNoO1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5tYWpvciwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlBlcmlvZDtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMubWlub3IsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlBlcmNlbnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSAxMjk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSAxMjk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSAxMjk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSAxMjk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGSGVhZGVyLmZvclZlcnNpb24gPSBmdW5jdGlvbiAobWFqb3IsIG1pbm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGSGVhZGVyKG1ham9yLCBtaW5vcik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGSGVhZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkhlYWRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkhlYWRlci5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERlRyYWlsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGVHJhaWxlcihsYXN0WFJlZk9mZnNldCkge1xuICAgICAgICB0aGlzLmxhc3RYUmVmT2Zmc2V0ID0gU3RyaW5nKGxhc3RYUmVmT2Zmc2V0KTtcbiAgICB9XG4gICAgUERGVHJhaWxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcInN0YXJ0eHJlZlxcblwiICsgdGhpcy5sYXN0WFJlZk9mZnNldCArIFwiXFxuJSVFT0ZcIjtcbiAgICB9O1xuICAgIFBERlRyYWlsZXIucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMTYgKyB0aGlzLmxhc3RYUmVmT2Zmc2V0Lmxlbmd0aDtcbiAgICB9O1xuICAgIFBERlRyYWlsZXIucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucztcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmE7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLng7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmY7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMubGFzdFhSZWZPZmZzZXQsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlBlcmNlbnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUGVyY2VudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5FO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk87XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuRjtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZUcmFpbGVyLmZvckxhc3RDcm9zc1JlZlNlY3Rpb25PZmZzZXQgPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGVHJhaWxlcihvZmZzZXQpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlRyYWlsZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGVHJhaWxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlRyYWlsZXIuanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xudmFyIFBERlRyYWlsZXJEaWN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERlRyYWlsZXJEaWN0KGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgUERGVHJhaWxlckRpY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJ0cmFpbGVyXFxuXCIgKyB0aGlzLmRpY3QudG9TdHJpbmcoKTtcbiAgICB9O1xuICAgIFBERlRyYWlsZXJEaWN0LnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDggKyB0aGlzLmRpY3Quc2l6ZUluQnl0ZXMoKTtcbiAgICB9O1xuICAgIFBERlRyYWlsZXJEaWN0LnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5hO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMuZGljdC5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZUcmFpbGVyRGljdC5vZiA9IGZ1bmN0aW9uIChkaWN0KSB7IHJldHVybiBuZXcgUERGVHJhaWxlckRpY3QoZGljdCk7IH07XG4gICAgcmV0dXJuIFBERlRyYWlsZXJEaWN0O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlRyYWlsZXJEaWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGVHJhaWxlckRpY3QuanMubWFwIiwiaW1wb3J0IHsgdG9IZXhTdHJpbmcsIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGggfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IGhhc1N1cnJvZ2F0ZXMsIGhpZ2hTdXJyb2dhdGUsIGlzV2l0aGluQk1QLCBsb3dTdXJyb2dhdGUsIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3VuaWNvZGVcIjtcbi8qKiBgZ2x5cGhzYCBzaG91bGQgYmUgYW4gYXJyYXkgb2YgdW5pcXVlIGdseXBocyAqL1xuZXhwb3J0IHZhciBjcmVhdGVDbWFwID0gZnVuY3Rpb24gKGdseXBocywgZ2x5cGhJZCkge1xuICAgIHZhciBiZkNoYXJzID0gbmV3IEFycmF5KGdseXBocy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2lkeF07XG4gICAgICAgIHZhciBpZCA9IGNtYXBIZXhGb3JtYXQoY21hcEhleFN0cmluZyhnbHlwaElkKGdseXBoKSkpO1xuICAgICAgICB2YXIgdW5pY29kZSA9IGNtYXBIZXhGb3JtYXQuYXBwbHkodm9pZCAwLCBnbHlwaC5jb2RlUG9pbnRzLm1hcChjbWFwQ29kZVBvaW50Rm9ybWF0KSk7XG4gICAgICAgIGJmQ2hhcnNbaWR4XSA9IFtpZCwgdW5pY29kZV07XG4gICAgfVxuICAgIHJldHVybiBmaWxsQ21hcFRlbXBsYXRlKGJmQ2hhcnMpO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVGVtcGxhdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG52YXIgZmlsbENtYXBUZW1wbGF0ZSA9IGZ1bmN0aW9uIChiZkNoYXJzKSB7IHJldHVybiBcIi9DSURJbml0IC9Qcm9jU2V0IGZpbmRyZXNvdXJjZSBiZWdpblxcbjEyIGRpY3QgYmVnaW5cXG5iZWdpbmNtYXBcXG4vQ0lEU3lzdGVtSW5mbyA8PFxcbiAgL1JlZ2lzdHJ5IChBZG9iZSlcXG4gIC9PcmRlcmluZyAoVUNTKVxcbiAgL1N1cHBsZW1lbnQgMFxcbj4+IGRlZlxcbi9DTWFwTmFtZSAvQWRvYmUtSWRlbnRpdHktVUNTIGRlZlxcbi9DTWFwVHlwZSAyIGRlZlxcbjEgYmVnaW5jb2Rlc3BhY2VyYW5nZVxcbjwwMDAwPjxmZmZmPlxcbmVuZGNvZGVzcGFjZXJhbmdlXFxuXCIgKyBiZkNoYXJzLmxlbmd0aCArIFwiIGJlZ2luYmZjaGFyXFxuXCIgKyBiZkNoYXJzLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgZ2x5cGhJZCA9IF9hWzBdLCBjb2RlUG9pbnQgPSBfYVsxXTtcbiAgICByZXR1cm4gZ2x5cGhJZCArIFwiIFwiICsgY29kZVBvaW50O1xufSkuam9pbignXFxuJykgKyBcIlxcbmVuZGJmY2hhclxcbmVuZGNtYXBcXG5DTWFwTmFtZSBjdXJyZW50ZGljdCAvQ01hcCBkZWZpbmVyZXNvdXJjZSBwb3BcXG5lbmRcXG5lbmRcIjsgfTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVXRpbGl0aWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG52YXIgY21hcEhleEZvcm1hdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFsdWVzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHJldHVybiBcIjxcIiArIHZhbHVlcy5qb2luKCcnKSArIFwiPlwiO1xufTtcbnZhciBjbWFwSGV4U3RyaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0b0hleFN0cmluZ09mTWluTGVuZ3RoKHZhbHVlLCA0KTsgfTtcbnZhciBjbWFwQ29kZVBvaW50Rm9ybWF0ID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIGlmIChpc1dpdGhpbkJNUChjb2RlUG9pbnQpKVxuICAgICAgICByZXR1cm4gY21hcEhleFN0cmluZyhjb2RlUG9pbnQpO1xuICAgIGlmIChoYXNTdXJyb2dhdGVzKGNvZGVQb2ludCkpIHtcbiAgICAgICAgdmFyIGhzID0gaGlnaFN1cnJvZ2F0ZShjb2RlUG9pbnQpO1xuICAgICAgICB2YXIgbHMgPSBsb3dTdXJyb2dhdGUoY29kZVBvaW50KTtcbiAgICAgICAgcmV0dXJuIFwiXCIgKyBjbWFwSGV4U3RyaW5nKGhzKSArIGNtYXBIZXhTdHJpbmcobHMpO1xuICAgIH1cbiAgICB2YXIgaGV4ID0gdG9IZXhTdHJpbmcoY29kZVBvaW50KTtcbiAgICB2YXIgbXNnID0gXCIweFwiICsgaGV4ICsgXCIgaXMgbm90IGEgdmFsaWQgVVRGLTggb3IgVVRGLTE2IGNvZGVwb2ludC5cIjtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DTWFwLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGNyZWF0ZUNtYXAgfSBmcm9tIFwiLi9DTWFwXCI7XG5pbXBvcnQgeyBkZXJpdmVGb250RmxhZ3MgfSBmcm9tIFwiLi9Gb250RmxhZ3NcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IHsgYnlBc2NlbmRpbmdJZCwgQ2FjaGUsIHNvcnRlZFVuaXEsIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIEEgbm90ZSBvZiB0aGFua3MgdG8gdGhlIGRldmVsb3BlcnMgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0LCBhc1xuICogdGhpcyBjbGFzcyBib3Jyb3dzIGZyb206XG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZvbmdvdmV0dC9wZGZraXQvYmxvYi9lNzFlZGFiMGRkNDY1N2I1YTc2NzgwNGJhODZjOTRjNThkMDFmYmNhL2xpYi9pbWFnZS9qcGVnLmNvZmZlZVxuICovXG52YXIgQ3VzdG9tRm9udEVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEN1c3RvbUZvbnRFbWJlZGRlcihmb250LCBmb250RGF0YSwgY3VzdG9tTmFtZSwgZm9udEZlYXR1cmVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuYWxsR2x5cGhzSW5Gb250U29ydGVkQnlJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBnbHlwaHMgPSBuZXcgQXJyYXkoX3RoaXMuZm9udC5jaGFyYWN0ZXJTZXQubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZVBvaW50ID0gX3RoaXMuZm9udC5jaGFyYWN0ZXJTZXRbaWR4XTtcbiAgICAgICAgICAgICAgICBnbHlwaHNbaWR4XSA9IF90aGlzLmZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoY29kZVBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWRVbmlxKGdseXBocy5zb3J0KGJ5QXNjZW5kaW5nSWQpLCBmdW5jdGlvbiAoZykgeyByZXR1cm4gZy5pZDsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgICAgIHRoaXMuc2NhbGUgPSAxMDAwIC8gdGhpcy5mb250LnVuaXRzUGVyRW07XG4gICAgICAgIHRoaXMuZm9udERhdGEgPSBmb250RGF0YTtcbiAgICAgICAgdGhpcy5mb250TmFtZSA9IHRoaXMuZm9udC5wb3N0c2NyaXB0TmFtZSB8fCAnRm9udCc7XG4gICAgICAgIHRoaXMuY3VzdG9tTmFtZSA9IGN1c3RvbU5hbWU7XG4gICAgICAgIHRoaXMuZm9udEZlYXR1cmVzID0gZm9udEZlYXR1cmVzO1xuICAgICAgICB0aGlzLmJhc2VGb250TmFtZSA9ICcnO1xuICAgICAgICB0aGlzLmdseXBoQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeSh0aGlzLmFsbEdseXBoc0luRm9udFNvcnRlZEJ5SWQpO1xuICAgIH1cbiAgICBDdXN0b21Gb250RW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKGZvbnRraXQsIGZvbnREYXRhLCBjdXN0b21OYW1lLCBmb250RmVhdHVyZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZvbnQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGZvbnRraXQuY3JlYXRlKGZvbnREYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IEN1c3RvbUZvbnRFbWJlZGRlcihmb250LCBmb250RGF0YSwgY3VzdG9tTmFtZSwgZm9udEZlYXR1cmVzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW5jb2RlIHRoZSBKYXZhU2NyaXB0IHN0cmluZyBpbnRvIHRoaXMgZm9udC4gKEphdmFTY3JpcHQgZW5jb2RlcyBzdHJpbmdzIGluXG4gICAgICogVW5pY29kZSwgYnV0IGVtYmVkZGVkIGZvbnRzIHVzZSB0aGVpciBvd24gY3VzdG9tIGVuY29kaW5ncylcbiAgICAgKi9cbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVuY29kZVRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5mb250LmxheW91dCh0ZXh0LCB0aGlzLmZvbnRGZWF0dXJlcykuZ2x5cGhzO1xuICAgICAgICB2YXIgaGV4Q29kZXMgPSBuZXcgQXJyYXkoZ2x5cGhzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGhleENvZGVzW2lkeF0gPSB0b0hleFN0cmluZ09mTWluTGVuZ3RoKGdseXBoc1tpZHhdLmlkLCA0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUERGSGV4U3RyaW5nLm9mKGhleENvZGVzLmpvaW4oJycpKTtcbiAgICB9O1xuICAgIC8vIFRoZSBhZHZhbmNlV2lkdGggdGFrZXMgaW50byBhY2NvdW50IGtlcm5pbmcgYXV0b21hdGljYWxseSwgc28gd2UgZG9uJ3RcbiAgICAvLyBoYXZlIHRvIGRvIHRoYXQgbWFudWFsbHkgbGlrZSB3ZSBkbyBmb3IgdGhlIHN0YW5kYXJkIGZvbnRzLlxuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUud2lkdGhPZlRleHRBdFNpemUgPSBmdW5jdGlvbiAodGV4dCwgc2l6ZSkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5mb250LmxheW91dCh0ZXh0LCB0aGlzLmZvbnRGZWF0dXJlcykuZ2x5cGhzO1xuICAgICAgICB2YXIgdG90YWxXaWR0aCA9IDA7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gZ2x5cGhzW2lkeF0uYWR2YW5jZVdpZHRoICogdGhpcy5zY2FsZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2NhbGUgPSBzaXplIC8gMTAwMDtcbiAgICAgICAgcmV0dXJuIHRvdGFsV2lkdGggKiBzY2FsZTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuaGVpZ2h0T2ZGb250QXRTaXplID0gZnVuY3Rpb24gKHNpemUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIF9hID0gb3B0aW9ucy5kZXNjZW5kZXIsIGRlc2NlbmRlciA9IF9hID09PSB2b2lkIDAgPyB0cnVlIDogX2E7XG4gICAgICAgIHZhciBfYiA9IHRoaXMuZm9udCwgYXNjZW50ID0gX2IuYXNjZW50LCBkZXNjZW50ID0gX2IuZGVzY2VudCwgYmJveCA9IF9iLmJib3g7XG4gICAgICAgIHZhciB5VG9wID0gKGFzY2VudCB8fCBiYm94Lm1heFkpICogdGhpcy5zY2FsZTtcbiAgICAgICAgdmFyIHlCb3R0b20gPSAoZGVzY2VudCB8fCBiYm94Lm1pblkpICogdGhpcy5zY2FsZTtcbiAgICAgICAgdmFyIGhlaWdodCA9IHlUb3AgLSB5Qm90dG9tO1xuICAgICAgICBpZiAoIWRlc2NlbmRlcilcbiAgICAgICAgICAgIGhlaWdodCAtPSBNYXRoLmFicyhkZXNjZW50KSB8fCAwO1xuICAgICAgICByZXR1cm4gKGhlaWdodCAvIDEwMDApICogc2l6ZTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuc2l6ZU9mRm9udEF0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmZvbnQsIGFzY2VudCA9IF9hLmFzY2VudCwgZGVzY2VudCA9IF9hLmRlc2NlbnQsIGJib3ggPSBfYS5iYm94O1xuICAgICAgICB2YXIgeVRvcCA9IChhc2NlbnQgfHwgYmJveC5tYXhZKSAqIHRoaXMuc2NhbGU7XG4gICAgICAgIHZhciB5Qm90dG9tID0gKGRlc2NlbnQgfHwgYmJveC5taW5ZKSAqIHRoaXMuc2NhbGU7XG4gICAgICAgIHJldHVybiAoMTAwMCAqIGhlaWdodCkgLyAoeVRvcCAtIHlCb3R0b20pO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICB0aGlzLmJhc2VGb250TmFtZSA9XG4gICAgICAgICAgICB0aGlzLmN1c3RvbU5hbWUgfHwgY29udGV4dC5hZGRSYW5kb21TdWZmaXgodGhpcy5mb250TmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkRm9udERpY3QoY29udGV4dCwgcmVmKTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRGb250RGljdCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNpZEZvbnREaWN0UmVmLCB1bmljb2RlQ01hcFJlZiwgZm9udERpY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRDSURGb250RGljdChjb250ZXh0KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpZEZvbnREaWN0UmVmID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZUNNYXBSZWYgPSB0aGlzLmVtYmVkVW5pY29kZUNtYXAoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250RGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnRm9udCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogJ1R5cGUwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRm9udDogdGhpcy5iYXNlRm9udE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2Rpbmc6ICdJZGVudGl0eS1IJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjZW5kYW50Rm9udHM6IFtjaWRGb250RGljdFJlZl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9Vbmljb2RlOiB1bmljb2RlQ01hcFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwgZm9udERpY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZWZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoZm9udERpY3QpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmlzQ0ZGID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb250LmNmZjtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRDSURGb250RGljdCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmb250RGVzY3JpcHRvclJlZiwgY2lkRm9udERpY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRGb250RGVzY3JpcHRvcihjb250ZXh0KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdG9yUmVmID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2lkRm9udERpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0ZvbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6IHRoaXMuaXNDRkYoKSA/ICdDSURGb250VHlwZTAnIDogJ0NJREZvbnRUeXBlMicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lEVG9HSURNYXA6ICdJZGVudGl0eScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUZvbnQ6IHRoaXMuYmFzZUZvbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJRFN5c3RlbUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0cnk6IFBERlN0cmluZy5vZignQWRvYmUnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJpbmc6IFBERlN0cmluZy5vZignSWRlbnRpdHknKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcGxlbWVudDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnREZXNjcmlwdG9yOiBmb250RGVzY3JpcHRvclJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXOiB0aGlzLmNvbXB1dGVXaWR0aHMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoY2lkRm9udERpY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkRm9udERlc2NyaXB0b3IgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZm9udFN0cmVhbVJlZiwgc2NhbGUsIF9hLCBpdGFsaWNBbmdsZSwgYXNjZW50LCBkZXNjZW50LCBjYXBIZWlnaHQsIHhIZWlnaHQsIF9iLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCBmb250RGVzY3JpcHRvcjtcbiAgICAgICAgICAgIHZhciBfYztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEZvbnRTdHJlYW0oY29udGV4dCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U3RyZWFtUmVmID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzLmZvbnQsIGl0YWxpY0FuZ2xlID0gX2EuaXRhbGljQW5nbGUsIGFzY2VudCA9IF9hLmFzY2VudCwgZGVzY2VudCA9IF9hLmRlc2NlbnQsIGNhcEhlaWdodCA9IF9hLmNhcEhlaWdodCwgeEhlaWdodCA9IF9hLnhIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IHRoaXMuZm9udC5iYm94LCBtaW5YID0gX2IubWluWCwgbWluWSA9IF9iLm1pblksIG1heFggPSBfYi5tYXhYLCBtYXhZID0gX2IubWF4WTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdG9yID0gY29udGV4dC5vYmooKF9jID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnRm9udERlc2NyaXB0b3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250TmFtZTogdGhpcy5iYXNlRm9udE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOiBkZXJpdmVGb250RmxhZ3ModGhpcy5mb250KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udEJCb3g6IFttaW5YICogc2NhbGUsIG1pblkgKiBzY2FsZSwgbWF4WCAqIHNjYWxlLCBtYXhZICogc2NhbGVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGFsaWNBbmdsZTogaXRhbGljQW5nbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY2VudDogYXNjZW50ICogc2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NlbnQ6IGRlc2NlbnQgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwSGVpZ2h0OiAoY2FwSGVpZ2h0IHx8IGFzY2VudCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEhlaWdodDogKHhIZWlnaHQgfHwgMCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgaG93IHRvIGNvbXB1dGUvZmluZCB0aGlzLCBub3IgaXMgYW55Ym9keSBlbHNlIHJlYWxseTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU0ODUxNzkvc3RlbXYtdmFsdWUtb2YtdGhlLXRydWV0eXBlLWZvbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RlbVY6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jW3RoaXMuaXNDRkYoKSA/ICdGb250RmlsZTMnIDogJ0ZvbnRGaWxlMiddID0gZm9udFN0cmVhbVJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoZm9udERlc2NyaXB0b3IpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLnNlcmlhbGl6ZUZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5mb250RGF0YV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkRm9udFN0cmVhbSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmb250U3RyZWFtLCBfYSwgX2I7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IChfYSA9IGNvbnRleHQpLmZsYXRlU3RyZWFtO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZXJpYWxpemVGb250KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U3RyZWFtID0gX2IuYXBwbHkoX2EsIFtfYy5zZW50KCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogdGhpcy5pc0NGRigpID8gJ0NJREZvbnRUeXBlMEMnIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKGZvbnRTdHJlYW0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkVW5pY29kZUNtYXAgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgY21hcCA9IGNyZWF0ZUNtYXAodGhpcy5nbHlwaENhY2hlLmFjY2VzcygpLCB0aGlzLmdseXBoSWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHZhciBjbWFwU3RyZWFtID0gY29udGV4dC5mbGF0ZVN0cmVhbShjbWFwKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVnaXN0ZXIoY21hcFN0cmVhbSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmdseXBoSWQgPSBmdW5jdGlvbiAoZ2x5cGgpIHtcbiAgICAgICAgcmV0dXJuIGdseXBoID8gZ2x5cGguaWQgOiAtMTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuY29tcHV0ZVdpZHRocyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdseXBocyA9IHRoaXMuZ2x5cGhDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIHdpZHRocyA9IFtdO1xuICAgICAgICB2YXIgY3VyclNlY3Rpb24gPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGN1cnJHbHlwaCA9IGdseXBoc1tpZHhdO1xuICAgICAgICAgICAgdmFyIHByZXZHbHlwaCA9IGdseXBoc1tpZHggLSAxXTtcbiAgICAgICAgICAgIHZhciBjdXJyR2x5cGhJZCA9IHRoaXMuZ2x5cGhJZChjdXJyR2x5cGgpO1xuICAgICAgICAgICAgdmFyIHByZXZHbHlwaElkID0gdGhpcy5nbHlwaElkKHByZXZHbHlwaCk7XG4gICAgICAgICAgICBpZiAoaWR4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgd2lkdGhzLnB1c2goY3VyckdseXBoSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VyckdseXBoSWQgLSBwcmV2R2x5cGhJZCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHdpZHRocy5wdXNoKGN1cnJTZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB3aWR0aHMucHVzaChjdXJyR2x5cGhJZCk7XG4gICAgICAgICAgICAgICAgY3VyclNlY3Rpb24gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJTZWN0aW9uLnB1c2goY3VyckdseXBoLmFkdmFuY2VXaWR0aCAqIHRoaXMuc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIHdpZHRocy5wdXNoKGN1cnJTZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHdpZHRocztcbiAgICB9O1xuICAgIHJldHVybiBDdXN0b21Gb250RW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQ3VzdG9tRm9udEVtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3VzdG9tRm9udEVtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IEN1c3RvbUZvbnRFbWJlZGRlciBmcm9tIFwiLi9DdXN0b21Gb250RW1iZWRkZXJcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgeyBDYWNoZSwgbWVyZ2VVaW50OEFycmF5cywgdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBBIG5vdGUgb2YgdGhhbmtzIHRvIHRoZSBkZXZlbG9wZXJzIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdCwgYXNcbiAqIHRoaXMgY2xhc3MgYm9ycm93cyBmcm9tOlxuICogICBodHRwczovL2dpdGh1Yi5jb20vZGV2b25nb3ZldHQvcGRma2l0L2Jsb2IvZTcxZWRhYjBkZDQ2NTdiNWE3Njc4MDRiYTg2Yzk0YzU4ZDAxZmJjYS9saWIvaW1hZ2UvanBlZy5jb2ZmZWVcbiAqL1xudmFyIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlcihmb250LCBmb250RGF0YSwgY3VzdG9tRm9udE5hbWUsIGZvbnRGZWF0dXJlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBmb250LCBmb250RGF0YSwgY3VzdG9tRm9udE5hbWUsIGZvbnRGZWF0dXJlcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3Vic2V0ID0gX3RoaXMuZm9udC5jcmVhdGVTdWJzZXQoKTtcbiAgICAgICAgX3RoaXMuZ2x5cGhzID0gW107XG4gICAgICAgIF90aGlzLmdseXBoQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeShmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5nbHlwaHM7IH0pO1xuICAgICAgICBfdGhpcy5nbHlwaElkTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoZm9udGtpdCwgZm9udERhdGEsIGN1c3RvbUZvbnROYW1lLCBmb250RmVhdHVyZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZvbnQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGZvbnRraXQuY3JlYXRlKGZvbnREYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlcihmb250LCBmb250RGF0YSwgY3VzdG9tRm9udE5hbWUsIGZvbnRGZWF0dXJlcyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5wcm90b3R5cGUuZW5jb2RlVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmZvbnQubGF5b3V0KHRleHQsIHRoaXMuZm9udEZlYXR1cmVzKS5nbHlwaHM7XG4gICAgICAgIHZhciBoZXhDb2RlcyA9IG5ldyBBcnJheShnbHlwaHMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3Vic2V0R2x5cGhJZCA9IHRoaXMuc3Vic2V0LmluY2x1ZGVHbHlwaChnbHlwaCk7XG4gICAgICAgICAgICB0aGlzLmdseXBoc1tzdWJzZXRHbHlwaElkIC0gMV0gPSBnbHlwaDtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhJZE1hcC5zZXQoZ2x5cGguaWQsIHN1YnNldEdseXBoSWQpO1xuICAgICAgICAgICAgaGV4Q29kZXNbaWR4XSA9IHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgoc3Vic2V0R2x5cGhJZCwgNCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nbHlwaENhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgcmV0dXJuIFBERkhleFN0cmluZy5vZihoZXhDb2Rlcy5qb2luKCcnKSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIucHJvdG90eXBlLmlzQ0ZGID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzZXQuY2ZmO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLnByb3RvdHlwZS5nbHlwaElkID0gZnVuY3Rpb24gKGdseXBoKSB7XG4gICAgICAgIHJldHVybiBnbHlwaCA/IHRoaXMuZ2x5cGhJZE1hcC5nZXQoZ2x5cGguaWQpIDogLTE7XG4gICAgfTtcbiAgICBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIucHJvdG90eXBlLnNlcmlhbGl6ZUZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcGFydHMgPSBbXTtcbiAgICAgICAgICAgIF90aGlzLnN1YnNldFxuICAgICAgICAgICAgICAgIC5lbmNvZGVTdHJlYW0oKVxuICAgICAgICAgICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChieXRlcykgeyByZXR1cm4gcGFydHMucHVzaChieXRlcyk7IH0pXG4gICAgICAgICAgICAgICAgLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNvbHZlKG1lcmdlVWludDhBcnJheXMocGFydHMpKTsgfSlcbiAgICAgICAgICAgICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikgeyByZXR1cm4gcmVqZWN0KGVycik7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXI7XG59KEN1c3RvbUZvbnRFbWJlZGRlcikpO1xuZXhwb3J0IGRlZmF1bHQgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuLyoqXG4gKiBGcm9tIHRoZSBQREYtQTMgc3BlY2lmaWNhdGlvbiwgc2VjdGlvbiAqKjMuMS4gUmVxdWlyZW1lbnRzIC0gR2VuZXJhbCoqLlxuICogU2VlOlxuICogKiBodHRwczovL3d3dy5wZGZhLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAxOC8xMC9QREYyMF9BTjAwMi1BRi5wZGZcbiAqL1xuZXhwb3J0IHZhciBBRlJlbGF0aW9uc2hpcDtcbihmdW5jdGlvbiAoQUZSZWxhdGlvbnNoaXApIHtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIlNvdXJjZVwiXSA9IFwiU291cmNlXCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJEYXRhXCJdID0gXCJEYXRhXCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJBbHRlcm5hdGl2ZVwiXSA9IFwiQWx0ZXJuYXRpdmVcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIlN1cHBsZW1lbnRcIl0gPSBcIlN1cHBsZW1lbnRcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIkVuY3J5cHRlZFBheWxvYWRcIl0gPSBcIkVuY3J5cHRlZFBheWxvYWRcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIkZvcm1EYXRhXCJdID0gXCJFbmNyeXB0ZWRQYXlsb2FkXCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJTY2hlbWFcIl0gPSBcIlNjaGVtYVwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiVW5zcGVjaWZpZWRcIl0gPSBcIlVuc3BlY2lmaWVkXCI7XG59KShBRlJlbGF0aW9uc2hpcCB8fCAoQUZSZWxhdGlvbnNoaXAgPSB7fSkpO1xudmFyIEZpbGVFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGaWxlRW1iZWRkZXIoZmlsZURhdGEsIGZpbGVOYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHRoaXMuZmlsZURhdGEgPSBmaWxlRGF0YTtcbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICBGaWxlRW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKGJ5dGVzLCBmaWxlTmFtZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gbmV3IEZpbGVFbWJlZGRlcihieXRlcywgZmlsZU5hbWUsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgRmlsZUVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIG1pbWVUeXBlLCBkZXNjcmlwdGlvbiwgY3JlYXRpb25EYXRlLCBtb2RpZmljYXRpb25EYXRlLCBhZlJlbGF0aW9uc2hpcCwgZW1iZWRkZWRGaWxlU3RyZWFtLCBlbWJlZGRlZEZpbGVTdHJlYW1SZWYsIGZpbGVTcGVjRGljdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBfYSA9IHRoaXMub3B0aW9ucywgbWltZVR5cGUgPSBfYS5taW1lVHlwZSwgZGVzY3JpcHRpb24gPSBfYS5kZXNjcmlwdGlvbiwgY3JlYXRpb25EYXRlID0gX2EuY3JlYXRpb25EYXRlLCBtb2RpZmljYXRpb25EYXRlID0gX2EubW9kaWZpY2F0aW9uRGF0ZSwgYWZSZWxhdGlvbnNoaXAgPSBfYS5hZlJlbGF0aW9uc2hpcDtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZEZpbGVTdHJlYW0gPSBjb250ZXh0LmZsYXRlU3RyZWFtKHRoaXMuZmlsZURhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0VtYmVkZGVkRmlsZScsXG4gICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6IG1pbWVUeXBlICE9PSBudWxsICYmIG1pbWVUeXBlICE9PSB2b2lkIDAgPyBtaW1lVHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBTaXplOiB0aGlzLmZpbGVEYXRhLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0aW9uRGF0ZTogY3JlYXRpb25EYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQREZTdHJpbmcuZnJvbURhdGUoY3JlYXRpb25EYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgTW9kRGF0ZTogbW9kaWZpY2F0aW9uRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUERGU3RyaW5nLmZyb21EYXRlKG1vZGlmaWNhdGlvbkRhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWRGaWxlU3RyZWFtUmVmID0gY29udGV4dC5yZWdpc3RlcihlbWJlZGRlZEZpbGVTdHJlYW0pO1xuICAgICAgICAgICAgICAgIGZpbGVTcGVjRGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0ZpbGVzcGVjJyxcbiAgICAgICAgICAgICAgICAgICAgRjogUERGU3RyaW5nLm9mKHRoaXMuZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBVRjogUERGSGV4U3RyaW5nLmZyb21UZXh0KHRoaXMuZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBFRjogeyBGOiBlbWJlZGRlZEZpbGVTdHJlYW1SZWYgfSxcbiAgICAgICAgICAgICAgICAgICAgRGVzYzogZGVzY3JpcHRpb24gPyBQREZIZXhTdHJpbmcuZnJvbVRleHQoZGVzY3JpcHRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBBRlJlbGF0aW9uc2hpcDogYWZSZWxhdGlvbnNoaXAgIT09IG51bGwgJiYgYWZSZWxhdGlvbnNoaXAgIT09IHZvaWQgMCA/IGFmUmVsYXRpb25zaGlwIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCBmaWxlU3BlY0RpY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKGZpbGVTcGVjRGljdCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gRmlsZUVtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEZpbGVFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGVFbWJlZGRlci5qcy5tYXAiLCIvLyBwcmV0dGllci1pZ25vcmVcbnZhciBtYWtlRm9udEZsYWdzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgZmxhZ3MgPSAwO1xuICAgIHZhciBmbGlwQml0ID0gZnVuY3Rpb24gKGJpdCkgeyBmbGFncyB8PSAoMSA8PCAoYml0IC0gMSkpOyB9O1xuICAgIGlmIChvcHRpb25zLmZpeGVkUGl0Y2gpXG4gICAgICAgIGZsaXBCaXQoMSk7XG4gICAgaWYgKG9wdGlvbnMuc2VyaWYpXG4gICAgICAgIGZsaXBCaXQoMik7XG4gICAgaWYgKG9wdGlvbnMuc3ltYm9saWMpXG4gICAgICAgIGZsaXBCaXQoMyk7XG4gICAgaWYgKG9wdGlvbnMuc2NyaXB0KVxuICAgICAgICBmbGlwQml0KDQpO1xuICAgIGlmIChvcHRpb25zLm5vbnN5bWJvbGljKVxuICAgICAgICBmbGlwQml0KDYpO1xuICAgIGlmIChvcHRpb25zLml0YWxpYylcbiAgICAgICAgZmxpcEJpdCg3KTtcbiAgICBpZiAob3B0aW9ucy5hbGxDYXApXG4gICAgICAgIGZsaXBCaXQoMTcpO1xuICAgIGlmIChvcHRpb25zLnNtYWxsQ2FwKVxuICAgICAgICBmbGlwQml0KDE4KTtcbiAgICBpZiAob3B0aW9ucy5mb3JjZUJvbGQpXG4gICAgICAgIGZsaXBCaXQoMTkpO1xuICAgIHJldHVybiBmbGFncztcbn07XG4vLyBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQvYmxvYi84M2Y1ZjcyNDMxNzJhMDE3YWRjZjZhN2ZhYTU1NDdjNTU5ODJjNTdiL2xpYi9mb250L2VtYmVkZGVkLmpzI0wxMjMtTDEyOVxuZXhwb3J0IHZhciBkZXJpdmVGb250RmxhZ3MgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgIHZhciBmYW1pbHlDbGFzcyA9IGZvbnRbJ09TLzInXSA/IGZvbnRbJ09TLzInXS5zRmFtaWx5Q2xhc3MgOiAwO1xuICAgIHZhciBmbGFncyA9IG1ha2VGb250RmxhZ3Moe1xuICAgICAgICBmaXhlZFBpdGNoOiBmb250LnBvc3QuaXNGaXhlZFBpdGNoLFxuICAgICAgICBzZXJpZjogMSA8PSBmYW1pbHlDbGFzcyAmJiBmYW1pbHlDbGFzcyA8PSA3LFxuICAgICAgICBzeW1ib2xpYzogdHJ1ZSxcbiAgICAgICAgc2NyaXB0OiBmYW1pbHlDbGFzcyA9PT0gMTAsXG4gICAgICAgIGl0YWxpYzogZm9udC5oZWFkLm1hY1N0eWxlLml0YWxpYyxcbiAgICB9KTtcbiAgICByZXR1cm4gZmxhZ3M7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rm9udEZsYWdzLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG52YXIgSmF2YVNjcmlwdEVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEphdmFTY3JpcHRFbWJlZGRlcihzY3JpcHQsIHNjcmlwdE5hbWUpIHtcbiAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7XG4gICAgICAgIHRoaXMuc2NyaXB0TmFtZSA9IHNjcmlwdE5hbWU7XG4gICAgfVxuICAgIEphdmFTY3JpcHRFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoc2NyaXB0LCBzY3JpcHROYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdEVtYmVkZGVyKHNjcmlwdCwgc2NyaXB0TmFtZSk7XG4gICAgfTtcbiAgICBKYXZhU2NyaXB0RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBqc0FjdGlvbkRpY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAganNBY3Rpb25EaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnQWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgUzogJ0phdmFTY3JpcHQnLFxuICAgICAgICAgICAgICAgICAgICBKUzogUERGSGV4U3RyaW5nLmZyb21UZXh0KHRoaXMuc2NyaXB0KSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwganNBY3Rpb25EaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcihqc0FjdGlvbkRpY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEphdmFTY3JpcHRFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBKYXZhU2NyaXB0RW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1KYXZhU2NyaXB0RW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgTUFSS0VSUyA9IFtcbiAgICAweGZmYzAsIDB4ZmZjMSwgMHhmZmMyLFxuICAgIDB4ZmZjMywgMHhmZmM1LCAweGZmYzYsXG4gICAgMHhmZmM3LCAweGZmYzgsIDB4ZmZjOSxcbiAgICAweGZmY2EsIDB4ZmZjYiwgMHhmZmNjLFxuICAgIDB4ZmZjZCwgMHhmZmNlLCAweGZmY2YsXG5dO1xudmFyIENvbG9yU3BhY2U7XG4oZnVuY3Rpb24gKENvbG9yU3BhY2UpIHtcbiAgICBDb2xvclNwYWNlW1wiRGV2aWNlR3JheVwiXSA9IFwiRGV2aWNlR3JheVwiO1xuICAgIENvbG9yU3BhY2VbXCJEZXZpY2VSR0JcIl0gPSBcIkRldmljZVJHQlwiO1xuICAgIENvbG9yU3BhY2VbXCJEZXZpY2VDTVlLXCJdID0gXCJEZXZpY2VDTVlLXCI7XG59KShDb2xvclNwYWNlIHx8IChDb2xvclNwYWNlID0ge30pKTtcbnZhciBDaGFubmVsVG9Db2xvclNwYWNlID0ge1xuICAgIDE6IENvbG9yU3BhY2UuRGV2aWNlR3JheSxcbiAgICAzOiBDb2xvclNwYWNlLkRldmljZVJHQixcbiAgICA0OiBDb2xvclNwYWNlLkRldmljZUNNWUssXG59O1xuLyoqXG4gKiBBIG5vdGUgb2YgdGhhbmtzIHRvIHRoZSBkZXZlbG9wZXJzIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdCwgYXNcbiAqIHRoaXMgY2xhc3MgYm9ycm93cyBmcm9tOlxuICogICBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQvYmxvYi9hNmFmNzY0NjdjZTA2YmQ2YTJhZjRhYTcyNzFjY2FjOWZmMTUyYTdkL2xpYi9pbWFnZS9qcGVnLmpzXG4gKi9cbnZhciBKcGVnRW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSnBlZ0VtYmVkZGVyKGltYWdlRGF0YSwgYml0c1BlckNvbXBvbmVudCwgd2lkdGgsIGhlaWdodCwgY29sb3JTcGFjZSkge1xuICAgICAgICB0aGlzLmltYWdlRGF0YSA9IGltYWdlRGF0YTtcbiAgICAgICAgdGhpcy5iaXRzUGVyQ29tcG9uZW50ID0gYml0c1BlckNvbXBvbmVudDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5jb2xvclNwYWNlID0gY29sb3JTcGFjZTtcbiAgICB9XG4gICAgSnBlZ0VtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChpbWFnZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRhdGFWaWV3LCBzb2ksIHBvcywgbWFya2VyLCBiaXRzUGVyQ29tcG9uZW50LCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsQnl0ZSwgY2hhbm5lbE5hbWUsIGNvbG9yU3BhY2U7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoaW1hZ2VEYXRhLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgc29pID0gZGF0YVZpZXcuZ2V0VWludDE2KDApO1xuICAgICAgICAgICAgICAgIGlmIChzb2kgIT09IDB4ZmZkOClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTT0kgbm90IGZvdW5kIGluIEpQRUcnKTtcbiAgICAgICAgICAgICAgICBwb3MgPSAyO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBkYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGRhdGFWaWV3LmdldFVpbnQxNihwb3MpO1xuICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1BUktFUlMuaW5jbHVkZXMobWFya2VyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBwb3MgKz0gZGF0YVZpZXcuZ2V0VWludDE2KHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghTUFSS0VSUy5pbmNsdWRlcyhtYXJrZXIpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSlBFRycpO1xuICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICAgICAgICAgIGJpdHNQZXJDb21wb25lbnQgPSBkYXRhVmlldy5nZXRVaW50OChwb3MrKyk7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gZGF0YVZpZXcuZ2V0VWludDE2KHBvcyk7XG4gICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICAgICAgd2lkdGggPSBkYXRhVmlldy5nZXRVaW50MTYocG9zKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICAgICAgICBjaGFubmVsQnl0ZSA9IGRhdGFWaWV3LmdldFVpbnQ4KHBvcysrKTtcbiAgICAgICAgICAgICAgICBjaGFubmVsTmFtZSA9IENoYW5uZWxUb0NvbG9yU3BhY2VbY2hhbm5lbEJ5dGVdO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbE5hbWUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBKUEVHIGNoYW5uZWwuJyk7XG4gICAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IGNoYW5uZWxOYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgSnBlZ0VtYmVkZGVyKGltYWdlRGF0YSwgYml0c1BlckNvbXBvbmVudCwgd2lkdGgsIGhlaWdodCwgY29sb3JTcGFjZSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSnBlZ0VtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgeE9iamVjdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB4T2JqZWN0ID0gY29udGV4dC5zdHJlYW0odGhpcy5pbWFnZURhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgVHlwZTogJ1hPYmplY3QnLFxuICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlOiAnSW1hZ2UnLFxuICAgICAgICAgICAgICAgICAgICBCaXRzUGVyQ29tcG9uZW50OiB0aGlzLmJpdHNQZXJDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIFdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBIZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlOiB0aGlzLmNvbG9yU3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIEZpbHRlcjogJ0RDVERlY29kZScsXG4gICAgICAgICAgICAgICAgICAgIC8vIENNWUsgSlBFRyBzdHJlYW1zIGluIFBERiBhcmUgdHlwaWNhbGx5IHN0b3JlZCBjb21wbGVtZW50ZWQsXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGggMSBhcyAnb2ZmJyBhbmQgMCBhcyAnb24nIChQREYgMzIwMDAtMToyMDA4LCA4LjYuNC40KS5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gU3RhbmRhbG9uZSBDTVlLIEpQRUcgKHVzdWFsbHkgZXhwb3J0ZWQgYnkgUGhvdG9zaG9wKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmVkIGludmVyc2UsIHdpdGggMCBhcyAnb2ZmJyBhbmQgMSBhcyAnb24nLCBsaWtlIFJHQi5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHlpbmcgYSBzd2FwIGhlcmUgYXMgYSBoZWRnZSB0aGF0IG1vc3QgYnl0ZXMgcGFzc2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoaXMgbWV0aG9kIHdpbGwgYmVuZWZpdCBmcm9tIGl0LlxuICAgICAgICAgICAgICAgICAgICBEZWNvZGU6IHRoaXMuY29sb3JTcGFjZSA9PT0gQ29sb3JTcGFjZS5EZXZpY2VDTVlLXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFsxLCAwLCAxLCAwLCAxLCAwLCAxLCAwXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIHhPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKHhPYmplY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEpwZWdFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBKcGVnRW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1KcGVnRW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yLCBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZSYXdTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGUmF3U3RyZWFtXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmVhbVwiO1xuaW1wb3J0IHsgZGVjb2RlUERGUmF3U3RyZWFtIH0gZnJvbSBcIi4uL3N0cmVhbXMvZGVjb2RlXCI7XG5pbXBvcnQgUERGQ29udGVudFN0cmVhbSBmcm9tIFwiLi4vc3RydWN0dXJlcy9QREZDb250ZW50U3RyZWFtXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBtZXJnZUludG9UeXBlZEFycmF5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgZnVsbFBhZ2VCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgdmFyIG1lZGlhQm94ID0gcGFnZS5NZWRpYUJveCgpO1xuICAgIHZhciB3aWR0aCA9IG1lZGlhQm94Lmxvb2t1cCgyLCBQREZOdW1iZXIpLmFzTnVtYmVyKCkgLVxuICAgICAgICBtZWRpYUJveC5sb29rdXAoMCwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgIHZhciBoZWlnaHQgPSBtZWRpYUJveC5sb29rdXAoMywgUERGTnVtYmVyKS5hc051bWJlcigpIC1cbiAgICAgICAgbWVkaWFCb3gubG9va3VwKDEsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICByZXR1cm4geyBsZWZ0OiAwLCBib3R0b206IDAsIHJpZ2h0OiB3aWR0aCwgdG9wOiBoZWlnaHQgfTtcbn07XG4vLyBSZXR1cm5zIHRoZSBpZGVudGl0eSBtYXRyaXgsIG1vZGlmaWVkIHRvIHBvc2l0aW9uIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlblxuLy8gYm91bmRpbmcgYm94IGF0ICgwLCAwKS5cbnZhciBib3VuZGluZ0JveEFkanVzdGVkTWF0cml4ID0gZnVuY3Rpb24gKGJiKSB7IHJldHVybiBbMSwgMCwgMCwgMSwgLWJiLmxlZnQsIC1iYi5ib3R0b21dOyB9O1xudmFyIFBERlBhZ2VFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZQYWdlRW1iZWRkZXIocGFnZSwgYm91bmRpbmdCb3gsIHRyYW5zZm9ybWF0aW9uTWF0cml4KSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgICAgIHZhciBiYiA9IGJvdW5kaW5nQm94ICE9PSBudWxsICYmIGJvdW5kaW5nQm94ICE9PSB2b2lkIDAgPyBib3VuZGluZ0JveCA6IGZ1bGxQYWdlQm91bmRpbmdCb3gocGFnZSk7XG4gICAgICAgIHRoaXMud2lkdGggPSBiYi5yaWdodCAtIGJiLmxlZnQ7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gYmIudG9wIC0gYmIuYm90dG9tO1xuICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID0gYmI7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtYXRpb25NYXRyaXggPSB0cmFuc2Zvcm1hdGlvbk1hdHJpeCAhPT0gbnVsbCAmJiB0cmFuc2Zvcm1hdGlvbk1hdHJpeCAhPT0gdm9pZCAwID8gdHJhbnNmb3JtYXRpb25NYXRyaXggOiBib3VuZGluZ0JveEFkanVzdGVkTWF0cml4KGJiKTtcbiAgICB9XG4gICAgUERGUGFnZUVtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChwYWdlLCBib3VuZGluZ0JveCwgdHJhbnNmb3JtYXRpb25NYXRyaXgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUERGUGFnZUVtYmVkZGVyKHBhZ2UsIGJvdW5kaW5nQm94LCB0cmFuc2Zvcm1hdGlvbk1hdHJpeCldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGUGFnZUVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIENvbnRlbnRzLCBSZXNvdXJjZXMsIGRlY29kZWRDb250ZW50cywgX2IsIGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCwgeE9iamVjdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBfYSA9IHRoaXMucGFnZS5ub3JtYWxpemVkRW50cmllcygpLCBDb250ZW50cyA9IF9hLkNvbnRlbnRzLCBSZXNvdXJjZXMgPSBfYS5SZXNvdXJjZXM7XG4gICAgICAgICAgICAgICAgaWYgKCFDb250ZW50cylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQYWdlQ29udGVudHNFbWJlZGRpbmdFcnJvcigpO1xuICAgICAgICAgICAgICAgIGRlY29kZWRDb250ZW50cyA9IHRoaXMuZGVjb2RlQ29udGVudHMoQ29udGVudHMpO1xuICAgICAgICAgICAgICAgIF9iID0gdGhpcy5ib3VuZGluZ0JveCwgbGVmdCA9IF9iLmxlZnQsIGJvdHRvbSA9IF9iLmJvdHRvbSwgcmlnaHQgPSBfYi5yaWdodCwgdG9wID0gX2IudG9wO1xuICAgICAgICAgICAgICAgIHhPYmplY3QgPSBjb250ZXh0LmZsYXRlU3RyZWFtKGRlY29kZWRDb250ZW50cywge1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnWE9iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6ICdGb3JtJyxcbiAgICAgICAgICAgICAgICAgICAgRm9ybVR5cGU6IDEsXG4gICAgICAgICAgICAgICAgICAgIEJCb3g6IFtsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3BdLFxuICAgICAgICAgICAgICAgICAgICBNYXRyaXg6IHRoaXMudHJhbnNmb3JtYXRpb25NYXRyaXgsXG4gICAgICAgICAgICAgICAgICAgIFJlc291cmNlczogUmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCB4T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcih4T2JqZWN0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIGBjb250ZW50c2AgaXMgYW4gYXJyYXkgb2Ygc3RyZWFtcyB3aGljaCBhcmUgbWVyZ2VkIHRvIGluY2x1ZGUgdGhlbSBpbiB0aGUgWE9iamVjdC5cbiAgICAvLyBUaGlzIG1ldGhvZHMgZXh0cmFjdHMgZWFjaCBzdHJlYW0gYW5kIGpvaW5zIHRoZW0gd2l0aCBhIG5ld2xpbmUgY2hhcmFjdGVyLlxuICAgIFBERlBhZ2VFbWJlZGRlci5wcm90b3R5cGUuZGVjb2RlQ29udGVudHMgPSBmdW5jdGlvbiAoY29udGVudHMpIHtcbiAgICAgICAgdmFyIG5ld2xpbmUgPSBVaW50OEFycmF5Lm9mKENoYXJDb2Rlcy5OZXdsaW5lKTtcbiAgICAgICAgdmFyIGRlY29kZWRDb250ZW50cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBjb250ZW50cy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBzdHJlYW0gPSBjb250ZW50cy5sb29rdXAoaWR4LCBQREZTdHJlYW0pO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgUERGUmF3U3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGRlY29kZVBERlJhd1N0cmVhbShzdHJlYW0pLmRlY29kZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtIGluc3RhbmNlb2YgUERGQ29udGVudFN0cmVhbSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzdHJlYW0uZ2V0VW5lbmNvZGVkQ29udGVudHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3Ioc3RyZWFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlY29kZWRDb250ZW50cy5wdXNoKGNvbnRlbnQsIG5ld2xpbmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXJnZUludG9UeXBlZEFycmF5LmFwcGx5KHZvaWQgMCwgZGVjb2RlZENvbnRlbnRzKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZQYWdlRW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUGFnZUVtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUGFnZUVtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFBORyB9IGZyb20gXCIuLi8uLi91dGlscy9wbmdcIjtcbi8qKlxuICogQSBub3RlIG9mIHRoYW5rcyB0byB0aGUgZGV2ZWxvcGVycyBvZiBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQsIGFzXG4gKiB0aGlzIGNsYXNzIGJvcnJvd3MgZnJvbTpcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL2Rldm9uZ292ZXR0L3BkZmtpdC9ibG9iL2U3MWVkYWIwZGQ0NjU3YjVhNzY3ODA0YmE4NmM5NGM1OGQwMWZiY2EvbGliL2ltYWdlL3BuZy5jb2ZmZWVcbiAqL1xudmFyIFBuZ0VtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBuZ0VtYmVkZGVyKHBuZykge1xuICAgICAgICB0aGlzLmltYWdlID0gcG5nO1xuICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSBwbmcuYml0c1BlckNvbXBvbmVudDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHBuZy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBwbmcuaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbG9yU3BhY2UgPSAnRGV2aWNlUkdCJztcbiAgICB9XG4gICAgUG5nRW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKGltYWdlRGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcG5nO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHBuZyA9IFBORy5sb2FkKGltYWdlRGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQbmdFbWJlZGRlcihwbmcpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBuZ0VtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgU01hc2ssIHhPYmplY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgU01hc2sgPSB0aGlzLmVtYmVkQWxwaGFDaGFubmVsKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHhPYmplY3QgPSBjb250ZXh0LmZsYXRlU3RyZWFtKHRoaXMuaW1hZ2UucmdiQ2hhbm5lbCwge1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnWE9iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6ICdJbWFnZScsXG4gICAgICAgICAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQ6IHRoaXMuaW1hZ2UuYml0c1BlckNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgV2lkdGg6IHRoaXMuaW1hZ2Uud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIEhlaWdodDogdGhpcy5pbWFnZS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2U6IHRoaXMuY29sb3JTcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgU01hc2s6IFNNYXNrLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCB4T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcih4T2JqZWN0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBuZ0VtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEFscGhhQ2hhbm5lbCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5pbWFnZS5hbHBoYUNoYW5uZWwpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgeE9iamVjdCA9IGNvbnRleHQuZmxhdGVTdHJlYW0odGhpcy5pbWFnZS5hbHBoYUNoYW5uZWwsIHtcbiAgICAgICAgICAgIFR5cGU6ICdYT2JqZWN0JyxcbiAgICAgICAgICAgIFN1YnR5cGU6ICdJbWFnZScsXG4gICAgICAgICAgICBIZWlnaHQ6IHRoaXMuaW1hZ2UuaGVpZ2h0LFxuICAgICAgICAgICAgV2lkdGg6IHRoaXMuaW1hZ2Uud2lkdGgsXG4gICAgICAgICAgICBCaXRzUGVyQ29tcG9uZW50OiB0aGlzLmltYWdlLmJpdHNQZXJDb21wb25lbnQsXG4gICAgICAgICAgICBDb2xvclNwYWNlOiAnRGV2aWNlR3JheScsXG4gICAgICAgICAgICBEZWNvZGU6IFswLCAxXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LnJlZ2lzdGVyKHhPYmplY3QpO1xuICAgIH07XG4gICAgcmV0dXJuIFBuZ0VtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBuZ0VtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG5nRW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgRW5jb2RpbmdzLCBGb250LCBGb250TmFtZXMsIH0gZnJvbSAnQHBkZi1saWIvc3RhbmRhcmQtZm9udHMnO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCB7IHRvQ29kZVBvaW50LCB0b0hleFN0cmluZyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBBIG5vdGUgb2YgdGhhbmtzIHRvIHRoZSBkZXZlbG9wZXJzIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdCwgYXNcbiAqIHRoaXMgY2xhc3MgYm9ycm93cyBmcm9tOlxuICogICBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQvYmxvYi9mOTFiZGQ2MWMxNjRhNzJlYTA2YmUxYTQzZGMwYTQxMmFmYzM5MjVmL2xpYi9mb250L2FmbS5jb2ZmZWVcbiAqL1xudmFyIFN0YW5kYXJkRm9udEVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0YW5kYXJkRm9udEVtYmVkZGVyKGZvbnROYW1lLCBjdXN0b21OYW1lKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0aGlzLmVuY29kaW5nID0gKGZvbnROYW1lID09PSBGb250TmFtZXMuWmFwZkRpbmdiYXRzID8gRW5jb2RpbmdzLlphcGZEaW5nYmF0c1xuICAgICAgICAgICAgOiBmb250TmFtZSA9PT0gRm9udE5hbWVzLlN5bWJvbCA/IEVuY29kaW5ncy5TeW1ib2xcbiAgICAgICAgICAgICAgICA6IEVuY29kaW5ncy5XaW5BbnNpKTtcbiAgICAgICAgdGhpcy5mb250ID0gRm9udC5sb2FkKGZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5mb250TmFtZSA9IHRoaXMuZm9udC5Gb250TmFtZTtcbiAgICAgICAgdGhpcy5jdXN0b21OYW1lID0gY3VzdG9tTmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIHRoZSBKYXZhU2NyaXB0IHN0cmluZyBpbnRvIHRoaXMgZm9udC4gKEphdmFTY3JpcHQgZW5jb2RlcyBzdHJpbmdzIGluXG4gICAgICogVW5pY29kZSwgYnV0IHN0YW5kYXJkIGZvbnRzIHVzZSBlaXRoZXIgV2luQW5zaSwgWmFwZkRpbmdiYXRzLCBvciBTeW1ib2xcbiAgICAgKiBlbmNvZGluZ3MpXG4gICAgICovXG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLmVuY29kZVRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5lbmNvZGVUZXh0QXNHbHlwaHModGV4dCk7XG4gICAgICAgIHZhciBoZXhDb2RlcyA9IG5ldyBBcnJheShnbHlwaHMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgaGV4Q29kZXNbaWR4XSA9IHRvSGV4U3RyaW5nKGdseXBoc1tpZHhdLmNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQREZIZXhTdHJpbmcub2YoaGV4Q29kZXMuam9pbignJykpO1xuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLndpZHRoT2ZUZXh0QXRTaXplID0gZnVuY3Rpb24gKHRleHQsIHNpemUpIHtcbiAgICAgICAgdmFyIGdseXBocyA9IHRoaXMuZW5jb2RlVGV4dEFzR2x5cGhzKHRleHQpO1xuICAgICAgICB2YXIgdG90YWxXaWR0aCA9IDA7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBsZWZ0ID0gZ2x5cGhzW2lkeF0ubmFtZTtcbiAgICAgICAgICAgIHZhciByaWdodCA9IChnbHlwaHNbaWR4ICsgMV0gfHwge30pLm5hbWU7XG4gICAgICAgICAgICB2YXIga2VybkFtb3VudCA9IHRoaXMuZm9udC5nZXRYQXhpc0tlcm5pbmdGb3JQYWlyKGxlZnQsIHJpZ2h0KSB8fCAwO1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSB0aGlzLndpZHRoT2ZHbHlwaChsZWZ0KSArIGtlcm5BbW91bnQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNjYWxlID0gc2l6ZSAvIDEwMDA7XG4gICAgICAgIHJldHVybiB0b3RhbFdpZHRoICogc2NhbGU7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUuaGVpZ2h0T2ZGb250QXRTaXplID0gZnVuY3Rpb24gKHNpemUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIF9hID0gb3B0aW9ucy5kZXNjZW5kZXIsIGRlc2NlbmRlciA9IF9hID09PSB2b2lkIDAgPyB0cnVlIDogX2E7XG4gICAgICAgIHZhciBfYiA9IHRoaXMuZm9udCwgQXNjZW5kZXIgPSBfYi5Bc2NlbmRlciwgRGVzY2VuZGVyID0gX2IuRGVzY2VuZGVyLCBGb250QkJveCA9IF9iLkZvbnRCQm94O1xuICAgICAgICB2YXIgeVRvcCA9IEFzY2VuZGVyIHx8IEZvbnRCQm94WzNdO1xuICAgICAgICB2YXIgeUJvdHRvbSA9IERlc2NlbmRlciB8fCBGb250QkJveFsxXTtcbiAgICAgICAgdmFyIGhlaWdodCA9IHlUb3AgLSB5Qm90dG9tO1xuICAgICAgICBpZiAoIWRlc2NlbmRlcilcbiAgICAgICAgICAgIGhlaWdodCArPSBEZXNjZW5kZXIgfHwgMDtcbiAgICAgICAgcmV0dXJuIChoZWlnaHQgLyAxMDAwKSAqIHNpemU7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUuc2l6ZU9mRm9udEF0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmZvbnQsIEFzY2VuZGVyID0gX2EuQXNjZW5kZXIsIERlc2NlbmRlciA9IF9hLkRlc2NlbmRlciwgRm9udEJCb3ggPSBfYS5Gb250QkJveDtcbiAgICAgICAgdmFyIHlUb3AgPSBBc2NlbmRlciB8fCBGb250QkJveFszXTtcbiAgICAgICAgdmFyIHlCb3R0b20gPSBEZXNjZW5kZXIgfHwgRm9udEJCb3hbMV07XG4gICAgICAgIHJldHVybiAoMTAwMCAqIGhlaWdodCkgLyAoeVRvcCAtIHlCb3R0b20pO1xuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHZhciBmb250RGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIFR5cGU6ICdGb250JyxcbiAgICAgICAgICAgIFN1YnR5cGU6ICdUeXBlMScsXG4gICAgICAgICAgICBCYXNlRm9udDogdGhpcy5jdXN0b21OYW1lIHx8IHRoaXMuZm9udE5hbWUsXG4gICAgICAgICAgICBFbmNvZGluZzogdGhpcy5lbmNvZGluZyA9PT0gRW5jb2RpbmdzLldpbkFuc2kgPyAnV2luQW5zaUVuY29kaW5nJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwgZm9udERpY3QpO1xuICAgICAgICAgICAgcmV0dXJuIHJlZjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlZ2lzdGVyKGZvbnREaWN0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLndpZHRoT2ZHbHlwaCA9IGZ1bmN0aW9uIChnbHlwaE5hbWUpIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0byAyNTAgaWYgZm9udCBkb2Vzbid0IHNwZWNpZnkgYSB3aWR0aFxuICAgICAgICByZXR1cm4gdGhpcy5mb250LmdldFdpZHRoT2ZHbHlwaChnbHlwaE5hbWUpIHx8IDI1MDtcbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbmNvZGVUZXh0QXNHbHlwaHMgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB2YXIgY29kZVBvaW50cyA9IEFycmF5LmZyb20odGV4dCk7XG4gICAgICAgIHZhciBnbHlwaHMgPSBuZXcgQXJyYXkoY29kZVBvaW50cy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNvZGVQb2ludCA9IHRvQ29kZVBvaW50KGNvZGVQb2ludHNbaWR4XSk7XG4gICAgICAgICAgICBnbHlwaHNbaWR4XSA9IHRoaXMuZW5jb2RpbmcuZW5jb2RlVW5pY29kZUNvZGVQb2ludChjb2RlUG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnbHlwaHM7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoZm9udE5hbWUsIGN1c3RvbU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZEZvbnRFbWJlZGRlcihmb250TmFtZSwgY3VzdG9tTmFtZSk7XG4gICAgfTtcbiAgICByZXR1cm4gU3RhbmRhcmRGb250RW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgU3RhbmRhcmRGb250RW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGFuZGFyZEZvbnRFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFycmF5QXNTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbnZhciBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoY2xhc3NOYW1lLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIk1ldGhvZCBcIiArIGNsYXNzTmFtZSArIFwiLlwiICsgbWV0aG9kTmFtZSArIFwiKCkgbm90IGltcGxlbWVudGVkXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9O1xudmFyIFByaXZhdGVDb25zdHJ1Y3RvckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQcml2YXRlQ29uc3RydWN0b3JFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQcml2YXRlQ29uc3RydWN0b3JFcnJvcihjbGFzc05hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQ2Fubm90IGNvbnN0cnVjdCBcIiArIGNsYXNzTmFtZSArIFwiIC0gaXQgaGFzIGEgcHJpdmF0ZSBjb25zdHJ1Y3RvclwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBQcml2YXRlQ29uc3RydWN0b3JFcnJvciB9O1xudmFyIFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvcihleHBlY3RlZCwgYWN0dWFsKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBuYW1lID0gZnVuY3Rpb24gKHQpIHsgdmFyIF9hLCBfYjsgcmV0dXJuIChfYSA9IHQgPT09IG51bGwgfHwgdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdC5uYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoX2IgPSB0ID09PSBudWxsIHx8IHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHQuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5uYW1lOyB9O1xuICAgICAgICB2YXIgZXhwZWN0ZWRUeXBlcyA9IEFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpXG4gICAgICAgICAgICA/IGV4cGVjdGVkLm1hcChuYW1lKVxuICAgICAgICAgICAgOiBbbmFtZShleHBlY3RlZCldO1xuICAgICAgICB2YXIgbXNnID0gXCJFeHBlY3RlZCBpbnN0YW5jZSBvZiBcIiArIGV4cGVjdGVkVHlwZXMuam9pbignIG9yICcpICsgXCIsIFwiICtcbiAgICAgICAgICAgIChcImJ1dCBnb3QgaW5zdGFuY2Ugb2YgXCIgKyAoYWN0dWFsID8gbmFtZShhY3R1YWwpIDogYWN0dWFsKSk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvciB9O1xudmFyIFVuc3VwcG9ydGVkRW5jb2RpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVuc3VwcG9ydGVkRW5jb2RpbmdFcnJvcihlbmNvZGluZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gZW5jb2RpbmcgKyBcIiBzdHJlYW0gZW5jb2Rpbmcgbm90IHN1cHBvcnRlZFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yIH07XG52YXIgUmVwYXJzZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZXBhcnNlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVwYXJzZUVycm9yKGNsYXNzTmFtZSwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJDYW5ub3QgY2FsbCBcIiArIGNsYXNzTmFtZSArIFwiLlwiICsgbWV0aG9kTmFtZSArIFwiKCkgbW9yZSB0aGFuIG9uY2VcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFJlcGFyc2VFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFJlcGFyc2VFcnJvciB9O1xudmFyIE1pc3NpbmdDYXRhbG9nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdDYXRhbG9nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ0NhdGFsb2dFcnJvcihyZWYpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiTWlzc2luZyBjYXRhbG9nIChyZWY9XCIgKyByZWYgKyBcIilcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdDYXRhbG9nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nQ2F0YWxvZ0Vycm9yIH07XG52YXIgTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJDYW4ndCBlbWJlZCBwYWdlIHdpdGggbWlzc2luZyBDb250ZW50c1wiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yIH07XG52YXIgVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yKHN0cmVhbSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHN0cmVhbVR5cGUgPSAoX2MgPSAoX2IgPSAoX2EgPSBzdHJlYW0gPT09IG51bGwgfHwgc3RyZWFtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHJlYW0uY29udHJ1Y3RvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0cmVhbSA9PT0gbnVsbCB8fCBzdHJlYW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0cmVhbS5uYW1lKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBzdHJlYW07XG4gICAgICAgIHZhciBtc2cgPSBcIlVucmVjb2duaXplZCBzdHJlYW0gdHlwZTogXCIgKyBzdHJlYW1UeXBlO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yIH07XG52YXIgUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGb3VuZCBtaXNtYXRjaGVkIGNvbnRleHRzIHdoaWxlIGVtYmVkZGluZyBwYWdlcy4gQWxsIHBhZ2VzIGluIHRoZSBhcnJheSBwYXNzZWQgdG8gYFBERkRvY3VtZW50LmVtYmVkUGFnZXMoKWAgbXVzdCBiZSBmcm9tIHRoZSBzYW1lIGRvY3VtZW50LlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBQYWdlRW1iZWRkaW5nTWlzbWF0Y2hlZENvbnRleHRFcnJvciB9O1xudmFyIFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvcihzaXplKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBjb252ZXJ0IFBERkFycmF5IHdpdGggXCIgKyBzaXplICsgXCIgZWxlbWVudHMgdG8gcmVjdGFuZ2xlLCBidXQgbXVzdCBoYXZlIGV4YWN0bHkgNCBlbGVtZW50cy5cIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvciB9O1xudmFyIEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvcih2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBdHRlbXB0ZWQgdG8gY29udmVydCBcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIiB0byBhIGRhdGUsIGJ1dCBpdCBkb2VzIG5vdCBtYXRjaCB0aGUgUERGIGRhdGUgc3RyaW5nIGZvcm1hdC5cIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yIH07XG52YXIgSW52YWxpZFRhcmdldEluZGV4RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEludmFsaWRUYXJnZXRJbmRleEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEludmFsaWRUYXJnZXRJbmRleEVycm9yKHRhcmdldEluZGV4LCBDb3VudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJJbnZhbGlkIHRhcmdldEluZGV4IHNwZWNpZmllZDogdGFyZ2V0SW5kZXg9XCIgKyB0YXJnZXRJbmRleCArIFwiIG11c3QgYmUgbGVzcyB0aGFuIENvdW50PVwiICsgQ291bnQ7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEludmFsaWRUYXJnZXRJbmRleEVycm9yIH07XG52YXIgQ29ycnVwdFBhZ2VUcmVlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvcnJ1cHRQYWdlVHJlZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvcnJ1cHRQYWdlVHJlZUVycm9yKHRhcmdldEluZGV4LCBvcGVyYXRpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIFwiICsgb3BlcmF0aW9uICsgXCIgYXQgdGFyZ2V0SW5kZXg9XCIgKyB0YXJnZXRJbmRleCArIFwiIGR1ZSB0byBjb3JydXB0IHBhZ2UgdHJlZTogSXQgaXMgbGlrZWx5IHRoYXQgb25lIG9yIG1vcmUgJ0NvdW50JyBlbnRyaWVzIGFyZSBpbnZhbGlkXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBDb3JydXB0UGFnZVRyZWVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IENvcnJ1cHRQYWdlVHJlZUVycm9yIH07XG52YXIgSW5kZXhPdXRPZkJvdW5kc0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbmRleE91dE9mQm91bmRzRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW5kZXhPdXRPZkJvdW5kc0Vycm9yKGluZGV4LCBtaW4sIG1heCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJpbmRleCBzaG91bGQgYmUgYXQgbGVhc3QgXCIgKyBtaW4gKyBcIiBhbmQgYXQgbW9zdCBcIiArIG1heCArIFwiLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgaW5kZXg7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbmRleE91dE9mQm91bmRzRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBJbmRleE91dE9mQm91bmRzRXJyb3IgfTtcbnZhciBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBzZXQgaW52YWxpZCBmaWVsZCB2YWx1ZVwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciB9O1xudmFyIE11bHRpU2VsZWN0VmFsdWVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTXVsdGlTZWxlY3RWYWx1ZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE11bHRpU2VsZWN0VmFsdWVFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIHNlbGVjdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIHNpbmdsZS1zZWxlY3QgZmllbGRcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE11bHRpU2VsZWN0VmFsdWVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE11bHRpU2VsZWN0VmFsdWVFcnJvciB9O1xudmFyIE1pc3NpbmdEQUVudHJ5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdEQUVudHJ5RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ0RBRW50cnlFcnJvcihmaWVsZE5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiTm8gL0RBIChkZWZhdWx0IGFwcGVhcmFuY2UpIGVudHJ5IGZvdW5kIGZvciBmaWVsZDogXCIgKyBmaWVsZE5hbWU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nREFFbnRyeUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ0RBRW50cnlFcnJvciB9O1xudmFyIE1pc3NpbmdUZk9wZXJhdG9yRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdUZk9wZXJhdG9yRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ1RmT3BlcmF0b3JFcnJvcihmaWVsZE5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiTm8gVGYgb3BlcmF0b3IgZm91bmQgZm9yIERBIG9mIGZpZWxkOiBcIiArIGZpZWxkTmFtZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdUZk9wZXJhdG9yRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nVGZPcGVyYXRvckVycm9yIH07XG52YXIgTnVtYmVyUGFyc2luZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOdW1iZXJQYXJzaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTnVtYmVyUGFyc2luZ0Vycm9yKHBvcywgdmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHBhcnNlIG51bWJlciBcIiArXG4gICAgICAgICAgICAoXCIobGluZTpcIiArIHBvcy5saW5lICsgXCIgY29sOlwiICsgcG9zLmNvbHVtbiArIFwiIG9mZnNldD1cIiArIHBvcy5vZmZzZXQgKyBcIik6IFxcXCJcIiArIHZhbHVlICsgXCJcXFwiXCIpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTnVtYmVyUGFyc2luZ0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTnVtYmVyUGFyc2luZ0Vycm9yIH07XG52YXIgUERGUGFyc2luZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZQYXJzaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUGFyc2luZ0Vycm9yKHBvcywgZGV0YWlscykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgUERGIGRvY3VtZW50IFwiICtcbiAgICAgICAgICAgIChcIihsaW5lOlwiICsgcG9zLmxpbmUgKyBcIiBjb2w6XCIgKyBwb3MuY29sdW1uICsgXCIgb2Zmc2V0PVwiICsgcG9zLm9mZnNldCArIFwiKTogXCIgKyBkZXRhaWxzKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBERlBhcnNpbmdFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFBERlBhcnNpbmdFcnJvciB9O1xudmFyIE5leHRCeXRlQXNzZXJ0aW9uRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE5leHRCeXRlQXNzZXJ0aW9uRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTmV4dEJ5dGVBc3NlcnRpb25FcnJvcihwb3MsIGV4cGVjdGVkQnl0ZSwgYWN0dWFsQnl0ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJFeHBlY3RlZCBuZXh0IGJ5dGUgdG8gYmUgXCIgKyBleHBlY3RlZEJ5dGUgKyBcIiBidXQgaXQgd2FzIGFjdHVhbGx5IFwiICsgYWN0dWFsQnl0ZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTmV4dEJ5dGVBc3NlcnRpb25FcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yIH07XG52YXIgUERGT2JqZWN0UGFyc2luZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZPYmplY3RQYXJzaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGT2JqZWN0UGFyc2luZ0Vycm9yKHBvcywgYnl0ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgUERGIG9iamVjdCBzdGFydGluZyB3aXRoIHRoZSBmb2xsb3dpbmcgYnl0ZTogXCIgKyBieXRlO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQREZPYmplY3RQYXJzaW5nRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgUERGT2JqZWN0UGFyc2luZ0Vycm9yIH07XG52YXIgUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yKHBvcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgaW52YWxpZCBQREYgb2JqZWN0XCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBERkludmFsaWRPYmplY3RQYXJzaW5nRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvciB9O1xudmFyIFBERlN0cmVhbVBhcnNpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGU3RyZWFtUGFyc2luZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlN0cmVhbVBhcnNpbmdFcnJvcihwb3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHBhcnNlIFBERiBzdHJlYW1cIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUERGU3RyZWFtUGFyc2luZ0Vycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IFBERlN0cmVhbVBhcnNpbmdFcnJvciB9O1xudmFyIFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvcihwb3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHBhcnNlIFBERiBsaXRlcmFsIHN0cmluZyBkdWUgdG8gdW5iYWxhbmNlZCBwYXJlbnRoZXNpc1wiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvciB9O1xudmFyIFN0YWxsZWRQYXJzZXJFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3RhbGxlZFBhcnNlckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN0YWxsZWRQYXJzZXJFcnJvcihwb3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiUGFyc2VyIHN0YWxsZWRcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gU3RhbGxlZFBhcnNlckVycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IFN0YWxsZWRQYXJzZXJFcnJvciB9O1xudmFyIE1pc3NpbmdQREZIZWFkZXJFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ1BERkhlYWRlckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdQREZIZWFkZXJFcnJvcihwb3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiTm8gUERGIGhlYWRlciBmb3VuZFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nUERGSGVhZGVyRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ1BERkhlYWRlckVycm9yIH07XG52YXIgTWlzc2luZ0tleXdvcmRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0tleXdvcmRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nS2V5d29yZEVycm9yKHBvcywga2V5d29yZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJEaWQgbm90IGZpbmQgZXhwZWN0ZWQga2V5d29yZCAnXCIgKyBhcnJheUFzU3RyaW5nKGtleXdvcmQpICsgXCInXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdLZXl3b3JkRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ0tleXdvcmRFcnJvciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDaGFyQ29kZXMgfSBmcm9tIFwiLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkNvbnRleHQgfSBmcm9tIFwiLi9QREZDb250ZXh0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9iamVjdENvcGllciB9IGZyb20gXCIuL1BERk9iamVjdENvcGllclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZXcml0ZXIgfSBmcm9tIFwiLi93cml0ZXJzL1BERldyaXRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZTdHJlYW1Xcml0ZXIgfSBmcm9tIFwiLi93cml0ZXJzL1BERlN0cmVhbVdyaXRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZIZWFkZXIgfSBmcm9tIFwiLi9kb2N1bWVudC9QREZIZWFkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGVHJhaWxlciB9IGZyb20gXCIuL2RvY3VtZW50L1BERlRyYWlsZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGVHJhaWxlckRpY3QgfSBmcm9tIFwiLi9kb2N1bWVudC9QREZUcmFpbGVyRGljdFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZDcm9zc1JlZlNlY3Rpb24gfSBmcm9tIFwiLi9kb2N1bWVudC9QREZDcm9zc1JlZlNlY3Rpb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3RhbmRhcmRGb250RW1iZWRkZXIgfSBmcm9tIFwiLi9lbWJlZGRlcnMvU3RhbmRhcmRGb250RW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3VzdG9tRm9udEVtYmVkZGVyIH0gZnJvbSBcIi4vZW1iZWRkZXJzL0N1c3RvbUZvbnRFbWJlZGRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIgfSBmcm9tIFwiLi9lbWJlZGRlcnMvQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZpbGVFbWJlZGRlciwgQUZSZWxhdGlvbnNoaXAsIH0gZnJvbSBcIi4vZW1iZWRkZXJzL0ZpbGVFbWJlZGRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBKcGVnRW1iZWRkZXIgfSBmcm9tIFwiLi9lbWJlZGRlcnMvSnBlZ0VtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBuZ0VtYmVkZGVyIH0gZnJvbSBcIi4vZW1iZWRkZXJzL1BuZ0VtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlBhZ2VFbWJlZGRlciwgfSBmcm9tIFwiLi9lbWJlZGRlcnMvUERGUGFnZUVtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFZpZXdlclByZWZlcmVuY2VzLCBOb25GdWxsU2NyZWVuUGFnZU1vZGUsIFJlYWRpbmdEaXJlY3Rpb24sIFByaW50U2NhbGluZywgRHVwbGV4LCB9IGZyb20gXCIuL2ludGVyYWN0aXZlL1ZpZXdlclByZWZlcmVuY2VzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9iamVjdCB9IGZyb20gXCIuL29iamVjdHMvUERGT2JqZWN0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkJvb2wgfSBmcm9tIFwiLi9vYmplY3RzL1BERkJvb2xcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGTnVtYmVyIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGU3RyaW5nIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGSGV4U3RyaW5nIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGTmFtZSB9IGZyb20gXCIuL29iamVjdHMvUERGTmFtZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZOdWxsIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZOdWxsXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFycmF5IH0gZnJvbSBcIi4vb2JqZWN0cy9QREZBcnJheVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZEaWN0IH0gZnJvbSBcIi4vb2JqZWN0cy9QREZEaWN0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlJlZiB9IGZyb20gXCIuL29iamVjdHMvUERGUmVmXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkludmFsaWRPYmplY3QgfSBmcm9tIFwiLi9vYmplY3RzL1BERkludmFsaWRPYmplY3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGU3RyZWFtIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUmF3U3RyZWFtIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZSYXdTdHJlYW1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQ2F0YWxvZyB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGQ2F0YWxvZ1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZDb250ZW50U3RyZWFtIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZDb250ZW50U3RyZWFtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkNyb3NzUmVmU3RyZWFtIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZDcm9zc1JlZlN0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPYmplY3RTdHJlYW0gfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERk9iamVjdFN0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZQYWdlVHJlZSB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGUGFnZVRyZWVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUGFnZUxlYWYgfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERlBhZ2VMZWFmXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkZsYXRlU3RyZWFtIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZGbGF0ZVN0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPcGVyYXRvciB9IGZyb20gXCIuL29wZXJhdG9ycy9QREZPcGVyYXRvclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPcGVyYXRvck5hbWVzIH0gZnJvbSBcIi4vb3BlcmF0b3JzL1BERk9wZXJhdG9yTmFtZXNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT2JqZWN0UGFyc2VyIH0gZnJvbSBcIi4vcGFyc2VyL1BERk9iamVjdFBhcnNlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPYmplY3RTdHJlYW1QYXJzZXIgfSBmcm9tIFwiLi9wYXJzZXIvUERGT2JqZWN0U3RyZWFtUGFyc2VyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlBhcnNlciB9IGZyb20gXCIuL3BhcnNlci9QREZQYXJzZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGWFJlZlN0cmVhbVBhcnNlciB9IGZyb20gXCIuL3BhcnNlci9QREZYUmVmU3RyZWFtUGFyc2VyXCI7XG5leHBvcnQgeyBkZWNvZGVQREZSYXdTdHJlYW0gfSBmcm9tIFwiLi9zdHJlYW1zL2RlY29kZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYW5ub3RhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYWNyb2Zvcm1cIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkJvb2wgZnJvbSBcIi4uL29iamVjdHMvUERGQm9vbFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCB7IGFzc2VydEVhY2hJcywgYXNzZXJ0SW50ZWdlciwgYXNzZXJ0SXNPbmVPZiwgYXNzZXJ0UmFuZ2UsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgYXNFbnVtID0gZnVuY3Rpb24gKHJhd1ZhbHVlLCBlbnVtVHlwZSkge1xuICAgIGlmIChyYXdWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBlbnVtVHlwZVtyYXdWYWx1ZV07XG59O1xuZXhwb3J0IHZhciBOb25GdWxsU2NyZWVuUGFnZU1vZGU7XG4oZnVuY3Rpb24gKE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSkge1xuICAgIC8qKlxuICAgICAqIEFmdGVyIGV4aXRpbmcgRnVsbFNjcmVlbiBtb2RlLCBuZWl0aGVyIHRoZSBkb2N1bWVudCBvdXRsaW5lIG5vciB0aHVtYm5haWxcbiAgICAgKiBpbWFnZXMgc2hvdWxkIGJlIHZpc2libGUuXG4gICAgICovXG4gICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlW1wiVXNlTm9uZVwiXSA9IFwiVXNlTm9uZVwiO1xuICAgIC8qKiBBZnRlciBleGl0aW5nIEZ1bGxTY3JlZW4gbW9kZSwgdGhlIGRvY3VtZW50IG91dGxpbmUgc2hvdWxkIGJlIHZpc2libGUuICovXG4gICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlW1wiVXNlT3V0bGluZXNcIl0gPSBcIlVzZU91dGxpbmVzXCI7XG4gICAgLyoqIEFmdGVyIGV4aXRpbmcgRnVsbFNjcmVlbiBtb2RlLCB0aHVtYm5haWwgaW1hZ2VzIHNob3VsZCBiZSB2aXNpYmxlLiAqL1xuICAgIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZVtcIlVzZVRodW1ic1wiXSA9IFwiVXNlVGh1bWJzXCI7XG4gICAgLyoqXG4gICAgICogQWZ0ZXIgZXhpdGluZyBGdWxsU2NyZWVuIG1vZGUsIHRoZSBvcHRpb25hbCBjb250ZW50IGdyb3VwIHBhbmVsIHNob3VsZCBiZVxuICAgICAqIHZpc2libGUuXG4gICAgICovXG4gICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlW1wiVXNlT0NcIl0gPSBcIlVzZU9DXCI7XG59KShOb25GdWxsU2NyZWVuUGFnZU1vZGUgfHwgKE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSA9IHt9KSk7XG5leHBvcnQgdmFyIFJlYWRpbmdEaXJlY3Rpb247XG4oZnVuY3Rpb24gKFJlYWRpbmdEaXJlY3Rpb24pIHtcbiAgICAvKiogVGhlIHByZWRvbWluYW50IHJlYWRpbmcgb3JkZXIgaXMgTGVmdCB0byBSaWdodC4gKi9cbiAgICBSZWFkaW5nRGlyZWN0aW9uW1wiTDJSXCJdID0gXCJMMlJcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZG9taW5hbnQgcmVhZGluZyBvcmRlciBpcyBSaWdodCB0byBsZWZ0IChpbmNsdWRpbmcgdmVydGljYWwgd3JpdGluZ1xuICAgICAqIHN5c3RlbXMsIHN1Y2ggYXMgQ2hpbmVzZSwgSmFwYW5lc2UgYW5kIEtvcmVhbikuXG4gICAgICovXG4gICAgUmVhZGluZ0RpcmVjdGlvbltcIlIyTFwiXSA9IFwiUjJMXCI7XG59KShSZWFkaW5nRGlyZWN0aW9uIHx8IChSZWFkaW5nRGlyZWN0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgUHJpbnRTY2FsaW5nO1xuKGZ1bmN0aW9uIChQcmludFNjYWxpbmcpIHtcbiAgICAvKiogTm8gcGFnZSBzY2FsaW5nLiAqL1xuICAgIFByaW50U2NhbGluZ1tcIk5vbmVcIl0gPSBcIk5vbmVcIjtcbiAgICAvKiBVc2UgdGhlIFBERiByZWFkZXIncyBkZWZhdWx0IHByaW50IHNjYWxpbmcuICovXG4gICAgUHJpbnRTY2FsaW5nW1wiQXBwRGVmYXVsdFwiXSA9IFwiQXBwRGVmYXVsdFwiO1xufSkoUHJpbnRTY2FsaW5nIHx8IChQcmludFNjYWxpbmcgPSB7fSkpO1xuZXhwb3J0IHZhciBEdXBsZXg7XG4oZnVuY3Rpb24gKER1cGxleCkge1xuICAgIC8qKiBUaGUgUERGIHJlYWRlciBzaG91bGQgcHJpbnQgc2luZ2xlLXNpZGVkLiAqL1xuICAgIER1cGxleFtcIlNpbXBsZXhcIl0gPSBcIlNpbXBsZXhcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgUERGIHJlYWRlciBzaG91bGQgcHJpbnQgZG91YmxlIHNpZGVkIGFuZCBmbGlwIG9uIHRoZSBzaG9ydCBlZGdlIG9mIHRoZVxuICAgICAqIHNoZWV0LlxuICAgICAqL1xuICAgIER1cGxleFtcIkR1cGxleEZsaXBTaG9ydEVkZ2VcIl0gPSBcIkR1cGxleEZsaXBTaG9ydEVkZ2VcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgUERGIHJlYWRlciBzaG91bGQgcHJpbnQgZG91YmxlIHNpZGVkIGFuZCBmbGlwIG9uIHRoZSBsb25nIGVkZ2Ugb2YgdGhlXG4gICAgICogc2hlZXQuXG4gICAgICovXG4gICAgRHVwbGV4W1wiRHVwbGV4RmxpcExvbmdFZGdlXCJdID0gXCJEdXBsZXhGbGlwTG9uZ0VkZ2VcIjtcbn0pKER1cGxleCB8fCAoRHVwbGV4ID0ge30pKTtcbnZhciBWaWV3ZXJQcmVmZXJlbmNlcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIGZ1bmN0aW9uIFZpZXdlclByZWZlcmVuY2VzKGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmxvb2t1cEJvb2wgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciByZXR1cm5PYmogPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2Yoa2V5KSk7XG4gICAgICAgIGlmIChyZXR1cm5PYmogaW5zdGFuY2VvZiBQREZCb29sKVxuICAgICAgICAgICAgcmV0dXJuIHJldHVybk9iajtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5sb29rdXBOYW1lID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgcmV0dXJuT2JqID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKGtleSkpO1xuICAgICAgICBpZiAocmV0dXJuT2JqIGluc3RhbmNlb2YgUERGTmFtZSlcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5IaWRlVG9vbGJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnSGlkZVRvb2xiYXInKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkhpZGVNZW51YmFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdIaWRlTWVudWJhcicpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuSGlkZVdpbmRvd1VJID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdIaWRlV2luZG93VUknKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkZpdFdpbmRvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnRml0V2luZG93Jyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5DZW50ZXJXaW5kb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ0NlbnRlcldpbmRvdycpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuRGlzcGxheURvY1RpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdEaXNwbGF5RG9jVGl0bGUnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTmFtZSgnTm9uRnVsbFNjcmVlblBhZ2VNb2RlJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5EaXJlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE5hbWUoJ0RpcmVjdGlvbicpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuUHJpbnRTY2FsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBOYW1lKCdQcmludFNjYWxpbmcnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkR1cGxleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTmFtZSgnRHVwbGV4Jyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5QaWNrVHJheUJ5UERGU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnUGlja1RyYXlCeVBERlNpemUnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLlByaW50UGFnZVJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgUHJpbnRQYWdlUmFuZ2UgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1ByaW50UGFnZVJhbmdlJykpO1xuICAgICAgICBpZiAoUHJpbnRQYWdlUmFuZ2UgaW5zdGFuY2VvZiBQREZBcnJheSlcbiAgICAgICAgICAgIHJldHVybiBQcmludFBhZ2VSYW5nZTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLk51bUNvcGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE51bUNvcGllcyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignTnVtQ29waWVzJykpO1xuICAgICAgICBpZiAoTnVtQ29waWVzIGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIE51bUNvcGllcztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCBoaWRlIHRoZSB0b29sYmFyIG1lbnVzIHdoZW4gZGlzcGxheWluZ1xuICAgICAqIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdG9vbGJhcnMgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0SGlkZVRvb2xiYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkhpZGVUb29sYmFyKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBQREYgcmVhZGVycyBzaG91bGQgaGlkZSB0aGUgbWVudSBiYXIgd2hlbiBkaXNwbGF5aW5nIHRoaXNcbiAgICAgKiBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgbWVudSBiYXIgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0SGlkZU1lbnViYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkhpZGVNZW51YmFyKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBQREYgcmVhZGVycyBzaG91bGQgaGlkZSB0aGUgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgaW5cbiAgICAgKiB0aGUgZG9jdW1lbnQncyB3aW5kb3cgKHN1Y2ggYXMgc2Nyb2xsIGJhcnMgYW5kIG5hdmlnYXRpb24gY29udHJvbHMpLFxuICAgICAqIGxlYXZpbmcgb25seSB0aGUgZG9jdW1lbnQncyBjb250ZW50cyBkaXNwbGF5ZWQuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0SGlkZVdpbmRvd1VJID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5IaWRlV2luZG93VUkoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCByZXNpemUgdGhlIGRvY3VtZW50J3Mgd2luZG93IHRvIGZpdFxuICAgICAqIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBkaXNwbGF5ZWQgcGFnZS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgd2luZG93IHNob3VsZCBiZSByZXNpemVkIHRvIGZpdC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0Rml0V2luZG93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5GaXRXaW5kb3coKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCBwb3NpdGlvbiB0aGUgZG9jdW1lbnQncyB3aW5kb3cgaW4gdGhlXG4gICAgICogY2VudGVyIG9mIHRoZSBzY3JlZW4uXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdG8gY2VudGVyIHRoZSBkb2N1bWVudCB3aW5kb3cuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldENlbnRlcldpbmRvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuQ2VudGVyV2luZG93KCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgd2luZG93J3MgdGl0bGUgYmFyIHNob3VsZCBkaXNwbGF5IHRoZSBkb2N1bWVudFxuICAgICAqIGBUaXRsZWAsIHRha2VuIGZyb20gdGhlIGRvY3VtZW50IG1ldGFkYXRhIChzZWUgW1tQREZEb2N1bWVudC5nZXRUaXRsZV1dKS5cbiAgICAgKiBSZXR1cm5zIGBmYWxzZWAgaWYgdGhlIHRpdGxlIGJhciBzaG91bGQgaW5zdGVhZCBkaXNwbGF5IHRoZSBmaWxlbmFtZSBvZiB0aGVcbiAgICAgKiBQREYgZmlsZS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRvIGRpc3BsYXkgdGhlIGRvY3VtZW50IHRpdGxlLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXREaXNwbGF5RG9jVGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkRpc3BsYXlEb2NUaXRsZSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGFnZSBtb2RlLCB3aGljaCB0ZWxscyB0aGUgUERGIHJlYWRlciBob3cgdG8gZGlzcGxheSB0aGVcbiAgICAgKiBkb2N1bWVudCBhZnRlciBleGl0aW5nIGZ1bGwtc2NyZWVuIG1vZGUuXG4gICAgICogQHJldHVybnMgVGhlIHBhZ2UgbW9kZSBhZnRlciBleGl0aW5nIGZ1bGwtc2NyZWVuIG1vZGUuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdmFyIG1vZGUgPSAoX2EgPSB0aGlzLk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb2RlVGV4dCgpO1xuICAgICAgICByZXR1cm4gKF9iID0gYXNFbnVtKG1vZGUsIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IE5vbkZ1bGxTY3JlZW5QYWdlTW9kZS5Vc2VOb25lO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJlZG9taW5hbnQgcmVhZGluZyBvcmRlciBmb3IgdGV4dC5cbiAgICAgKiBAcmV0dXJucyBUaGUgdGV4dCByZWFkaW5nIG9yZGVyLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRSZWFkaW5nRGlyZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gKF9hID0gdGhpcy5EaXJlY3Rpb24oKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29kZVRleHQoKTtcbiAgICAgICAgcmV0dXJuIChfYiA9IGFzRW51bShkaXJlY3Rpb24sIFJlYWRpbmdEaXJlY3Rpb24pKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBSZWFkaW5nRGlyZWN0aW9uLkwyUjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBhZ2Ugc2NhbGluZyBvcHRpb24gdGhhdCB0aGUgUERGIHJlYWRlciBzaG91bGQgc2VsZWN0IHdoZW4gdGhlXG4gICAgICogcHJpbnQgZGlhbG9nIGlzIGRpc3BsYXllZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcGFnZSBzY2FsaW5nIG9wdGlvbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0UHJpbnRTY2FsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB2YXIgc2NhbGluZyA9IChfYSA9IHRoaXMuUHJpbnRTY2FsaW5nKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHJldHVybiAoX2IgPSBhc0VudW0oc2NhbGluZywgUHJpbnRTY2FsaW5nKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogUHJpbnRTY2FsaW5nLkFwcERlZmF1bHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwYXBlciBoYW5kbGluZyBvcHRpb24gdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHByaW50aW5nIHRoZVxuICAgICAqIGZpbGUgZnJvbSB0aGUgcHJpbnQgZGlhbG9nLlxuICAgICAqIEByZXR1cm5zIFRoZSBwYXBlciBoYW5kbGluZyBvcHRpb24uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldER1cGxleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgZHVwbGV4ID0gKF9hID0gdGhpcy5EdXBsZXgoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29kZVRleHQoKTtcbiAgICAgICAgcmV0dXJuIGFzRW51bShkdXBsZXgsIER1cGxleCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgUERGIHBhZ2Ugc2l6ZSBzaG91bGQgYmUgdXNlZCB0byBzZWxlY3QgdGhlIGlucHV0XG4gICAgICogcGFwZXIgdHJheS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgUERGIHBhZ2Ugc2l6ZSBzaG91bGQgYmUgdXNlZCB0byBzZWxlY3QgdGhlXG4gICAgICogICAgICAgICAgaW5wdXQgcGFwZXIgdHJheS5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0UGlja1RyYXlCeVBERlNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuUGlja1RyYXlCeVBERlNpemUoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBwYWdlIG51bWJlciByYW5nZXMsIHdoaWNoIGFyZSB0aGUgdmFsdWVzIHVzZWQgdG9cbiAgICAgKiBpbml0aWFsaXplIHRoZSBwcmludCBkaWFsb2cgYm94IHdoZW4gdGhlIGZpbGUgaXMgcHJpbnRlZC4gRWFjaCByYW5nZVxuICAgICAqIHNwZWNpZmllcyB0aGUgZmlyc3QgKGBzdGFydGApIGFuZCBsYXN0IChgZW5kYCkgcGFnZXMgaW4gYSBzdWItcmFuZ2Ugb2ZcbiAgICAgKiBwYWdlcyB0byBiZSBwcmludGVkLiBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgUERGIGZpbGUgaXMgZGVub3RlZCBieSAwLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgdmlld2VyUHJlZnMgPSBwZGZEb2MuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKClcbiAgICAgKiBjb25zdCBpbmNsdWRlc1BhZ2UzID0gdmlld2VyUHJlZnNcbiAgICAgKiAgIC5nZXRQcmludFJhbmdlcygpXG4gICAgICogICAuc29tZShwciA9PiBwci5zdGFydCA9PCAyICYmIHByLmVuZCA+PSAyKVxuICAgICAqIGlmIChpbmNsdWRlc1BhZ2UzKSBjb25zb2xlLmxvZygncHJpbnRSYW5nZSBpbmNsdWRlcyBwYWdlIDMnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIG9iamVjdHMsIGVhY2ggd2l0aCB0aGUgcHJvcGVydGllcyBgc3RhcnRgIGFuZCBgZW5kYCxcbiAgICAgKiAgICAgICAgICBkZW5vdGluZyBwYWdlIGluZGljZXMuIElmIG5vdCwgc3BlY2lmaWVkIGFuIGVtcHR5IGFycmF5IGlzXG4gICAgICogICAgICAgICAgcmV0dXJuZWQuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldFByaW50UGFnZVJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcm5nID0gdGhpcy5QcmludFBhZ2VSYW5nZSgpO1xuICAgICAgICBpZiAoIXJuZylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgdmFyIHBhZ2VSYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBybmcuc2l6ZSgpOyBpICs9IDIpIHtcbiAgICAgICAgICAgIC8vIERlc3BpdGUgdGhlIHNwZWMgY2xlYXJseSBzdGF0aW5nIHRoYXQgXCJUaGUgZmlyc3QgcGFnZSBvZiB0aGUgUERGIGZpbGVcbiAgICAgICAgICAgIC8vIHNoYWxsIGJlIGRvbm90ZWQgYnkgMVwiLCBzZXZlcmFsIHRlc3QgUERGcyAoc3BlYyAxLjcpIGNyZWF0ZWQgaW5cbiAgICAgICAgICAgIC8vIEFjcm9iYXQgWEkgMTEuMCBhbmQgYWxzbyByZWFkIHdpdGggUmVhZGVyIERDIDIwMjAuMDEzIGluZGljYXRlIHRoaXMgaXNcbiAgICAgICAgICAgIC8vIGFjdHVhbGx5IGEgMCBiYXNlZCBpbmRleC5cbiAgICAgICAgICAgIHZhciBzdGFydCA9IHJuZy5sb29rdXAoaSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICAgICAgdmFyIGVuZCA9IHJuZy5sb29rdXAoaSArIDEsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIHBhZ2VSYW5nZXMucHVzaCh7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2VSYW5nZXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIGJlIHByaW50ZWQgd2hlbiB0aGUgcHJpbnQgZGlhbG9nIGlzIG9wZW5lZFxuICAgICAqIGZvciB0aGlzIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IG51bWJlciBvZiBjb3BpZXMgdG8gYmUgcHJpbnRlZC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0TnVtQ29waWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5OdW1Db3BpZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDE7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIHJlYWRlcidzIHRvb2xiYXJzIHNob3VsZCBiZSBoaWRkZW4gd2hpbGUgdGhlXG4gICAgICogZG9jdW1lbnQgaXMgYWN0aXZlLlxuICAgICAqIEBwYXJhbSBoaWRlVG9vbGJhciBgdHJ1ZWAgaWYgdGhlIHRvb2xiYXIgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0SGlkZVRvb2xiYXIgPSBmdW5jdGlvbiAoaGlkZVRvb2xiYXIpIHtcbiAgICAgICAgdmFyIEhpZGVUb29sYmFyID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGhpZGVUb29sYmFyKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdIaWRlVG9vbGJhcicpLCBIaWRlVG9vbGJhcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIHJlYWRlcidzIG1lbnUgYmFyIHNob3VsZCBiZSBoaWRkZW4gd2hpbGUgdGhlXG4gICAgICogZG9jdW1lbnQgaXMgYWN0aXZlLlxuICAgICAqIEBwYXJhbSBoaWRlTWVudWJhciBgdHJ1ZWAgaWYgdGhlIG1lbnUgYmFyIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldEhpZGVNZW51YmFyID0gZnVuY3Rpb24gKGhpZGVNZW51YmFyKSB7XG4gICAgICAgIHZhciBIaWRlTWVudWJhciA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihoaWRlTWVudWJhcik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignSGlkZU1lbnViYXInKSwgSGlkZU1lbnViYXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIFBERiByZWFkZXIgc2hvdWxkIGhpZGUgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgaW4gdGhlXG4gICAgICogZG9jdW1lbnQncyB3aW5kb3cgKHN1Y2ggYXMgc2Nyb2xsIGJhcnMgYW5kIG5hdmlnYXRpb24gY29udHJvbHMpLCBsZWF2aW5nXG4gICAgICogb25seSB0aGUgZG9jdW1lbnQncyBjb250ZW50cyBkaXNwbGF5ZWQuXG4gICAgICogQHBhcmFtIGhpZGVXaW5kb3dVSSBgdHJ1ZWAgaWYgdGhlIHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldEhpZGVXaW5kb3dVSSA9IGZ1bmN0aW9uIChoaWRlV2luZG93VUkpIHtcbiAgICAgICAgdmFyIEhpZGVXaW5kb3dVSSA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihoaWRlV2luZG93VUkpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0hpZGVXaW5kb3dVSScpLCBIaWRlV2luZG93VUkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIFBERiByZWFkZXIgc2hvdWxkIHJlc2l6ZSB0aGUgZG9jdW1lbnQncyB3aW5kb3cgdG8gZml0XG4gICAgICogdGhlIHNpemUgb2YgdGhlIGZpcnN0IGRpc3BsYXllZCBwYWdlLlxuICAgICAqIEBwYXJhbSBmaXRXaW5kb3cgYHRydWVgIGlmIHRoZSB3aW5kb3cgc2hvdWxkIGJlIHJlc2l6ZWQuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldEZpdFdpbmRvdyA9IGZ1bmN0aW9uIChmaXRXaW5kb3cpIHtcbiAgICAgICAgdmFyIEZpdFdpbmRvdyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihmaXRXaW5kb3cpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0ZpdFdpbmRvdycpLCBGaXRXaW5kb3cpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIFBERiByZWFkZXIgc2hvdWxkIHBvc2l0aW9uIHRoZSBkb2N1bWVudCdzIHdpbmRvdyBpbiB0aGVcbiAgICAgKiBjZW50ZXIgb2YgdGhlIHNjcmVlbi5cbiAgICAgKiBAcGFyYW0gY2VudGVyV2luZG93IGB0cnVlYCBpZiB0aGUgd2luZG93IHNob3VsZCBiZSBjZW50ZXJlZC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0Q2VudGVyV2luZG93ID0gZnVuY3Rpb24gKGNlbnRlcldpbmRvdykge1xuICAgICAgICB2YXIgQ2VudGVyV2luZG93ID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGNlbnRlcldpbmRvdyk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQ2VudGVyV2luZG93JyksIENlbnRlcldpbmRvdyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgd2luZG93J3MgdGl0bGUgYmFyIHNob3VsZCBkaXNwbGF5IHRoZSBkb2N1bWVudCBgVGl0bGVgXG4gICAgICogdGFrZW4gZnJvbSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgKHNlZSBbW1BERkRvY3VtZW50LnNldFRpdGxlXV0pLiBJZlxuICAgICAqIGBmYWxzZWAsIHRoZSB0aXRsZSBiYXIgc2hvdWxkIGluc3RlYWQgZGlzcGxheSB0aGUgUERGIGZpbGVuYW1lLlxuICAgICAqIEBwYXJhbSBkaXNwbGF5VGl0bGUgYHRydWVgIGlmIHRoZSBkb2N1bWVudCB0aXRsZSBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXREaXNwbGF5RG9jVGl0bGUgPSBmdW5jdGlvbiAoZGlzcGxheVRpdGxlKSB7XG4gICAgICAgIHZhciBEaXNwbGF5RG9jVGl0bGUgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooZGlzcGxheVRpdGxlKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdEaXNwbGF5RG9jVGl0bGUnKSwgRGlzcGxheURvY1RpdGxlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSBob3cgdGhlIFBERiByZWFkZXIgc2hvdWxkIGRpc3BsYXkgdGhlIGRvY3VtZW50IHVwb24gZXhpdGluZ1xuICAgICAqIGZ1bGwtc2NyZWVuIG1vZGUuIFRoaXMgZW50cnkgaXMgbWVhbmluZ2Z1bCBvbmx5IGlmIHRoZSB2YWx1ZSBvZiB0aGVcbiAgICAgKiBgUGFnZU1vZGVgIGVudHJ5IGluIHRoZSBkb2N1bWVudCdzIFtbUERGQ2F0YWxvZ11dIGlzIGBGdWxsU2NyZWVuYC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQsIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSwgUERGTmFtZSB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqXG4gICAgICogLy8gU2V0IHRoZSBQYWdlTW9kZVxuICAgICAqIHBkZkRvYy5jYXRhbG9nLnNldChQREZOYW1lLm9mKCdQYWdlTW9kZScpLFBERk5hbWUub2YoJ0Z1bGxTY3JlZW4nKSlcbiAgICAgKlxuICAgICAqIC8vIFNldCB3aGF0IGhhcHBlbnMgd2hlbiBmdWxsLXNjcmVlbiBpcyBjbG9zZWRcbiAgICAgKiBjb25zdCB2aWV3ZXJQcmVmcyA9IHBkZkRvYy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKVxuICAgICAqIHZpZXdlclByZWZzLnNldE5vbkZ1bGxTY3JlZW5QYWdlTW9kZShOb25GdWxsU2NyZWVuUGFnZU1vZGUuVXNlT3V0bGluZXMpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9uRnVsbFNjcmVlblBhZ2VNb2RlIEhvdyB0aGUgZG9jdW1lbnQgc2hvdWxkIGJlIGRpc3BsYXllZCB1cG9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0aW5nIGZ1bGwgc2NyZWVuIG1vZGUuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSA9IGZ1bmN0aW9uIChub25GdWxsU2NyZWVuUGFnZU1vZGUpIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihub25GdWxsU2NyZWVuUGFnZU1vZGUsICdub25GdWxsU2NyZWVuUGFnZU1vZGUnLCBOb25GdWxsU2NyZWVuUGFnZU1vZGUpO1xuICAgICAgICB2YXIgbW9kZSA9IFBERk5hbWUub2Yobm9uRnVsbFNjcmVlblBhZ2VNb2RlKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdOb25GdWxsU2NyZWVuUGFnZU1vZGUnKSwgbW9kZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgdGhlIHByZWRvbWluYW50IHJlYWRpbmcgb3JkZXIgZm9yIHRleHQuXG4gICAgICpcbiAgICAgKiBUaGlzIGVudHJ5IGhhcyBubyBkaXJlY3QgZWZmZWN0IG9uIHRoZSBkb2N1bWVudCdzIGNvbnRlbnRzIG9yIHBhZ2VcbiAgICAgKiBudW1iZXJpbmcsIGJ1dCBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIHBvc2l0aW9uaW5nIG9mIHBhZ2VzXG4gICAgICogd2hlbiBkaXNwbGF5ZWQgc2lkZSBieSBzaWRlIG9yIHByaW50ZWQgbi11cC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQsIFJlYWRpbmdEaXJlY3Rpb24gfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCB2aWV3ZXJQcmVmcyA9IHBkZkRvYy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKVxuICAgICAqIHZpZXdlclByZWZzLnNldFJlYWRpbmdEaXJlY3Rpb24oUmVhZGluZ0RpcmVjdGlvbi5SMkwpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVhZGluZ0RpcmVjdGlvbiBUaGUgcmVhZGluZyBvcmRlciBmb3IgdGV4dC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0UmVhZGluZ0RpcmVjdGlvbiA9IGZ1bmN0aW9uIChyZWFkaW5nRGlyZWN0aW9uKSB7XG4gICAgICAgIGFzc2VydElzT25lT2YocmVhZGluZ0RpcmVjdGlvbiwgJ3JlYWRpbmdEaXJlY3Rpb24nLCBSZWFkaW5nRGlyZWN0aW9uKTtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IFBERk5hbWUub2YocmVhZGluZ0RpcmVjdGlvbik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRGlyZWN0aW9uJyksIGRpcmVjdGlvbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgdGhlIHBhZ2Ugc2NhbGluZyBvcHRpb24gdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBhIHByaW50IGRpYWxvZ1xuICAgICAqIGlzIGRpc3BsYXllZCBmb3IgdGhpcyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQsIFByaW50U2NhbGluZyB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICogdmlld2VyUHJlZnMuc2V0UHJpbnRTY2FsaW5nKFByaW50U2NhbGluZy5Ob25lKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHByaW50U2NhbGluZyBUaGUgcHJpbnQgc2NhbGluZyBvcHRpb24uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldFByaW50U2NhbGluZyA9IGZ1bmN0aW9uIChwcmludFNjYWxpbmcpIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihwcmludFNjYWxpbmcsICdwcmludFNjYWxpbmcnLCBQcmludFNjYWxpbmcpO1xuICAgICAgICB2YXIgc2NhbGluZyA9IFBERk5hbWUub2YocHJpbnRTY2FsaW5nKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdQcmludFNjYWxpbmcnKSwgc2NhbGluZyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgdGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbiB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0IGluIHRoZVxuICAgICAqIHByaW50IGRpYWxvZy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQsIER1cGxleCB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICogdmlld2VyUHJlZnMuc2V0RHVwbGV4KER1cGxleC5EdXBsZXhGbGlwU2hvcnRFZGdlKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGR1cGxleCBUaGUgZG91YmxlIG9yIHNpbmdsZSBzaWRlZCBwcmludGluZyBvcHRpb24uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldER1cGxleCA9IGZ1bmN0aW9uIChkdXBsZXgpIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihkdXBsZXgsICdkdXBsZXgnLCBEdXBsZXgpO1xuICAgICAgICB2YXIgZHVwID0gUERGTmFtZS5vZihkdXBsZXgpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0R1cGxleCcpLCBkdXApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIFBERiBkb2N1bWVudCdzIHBhZ2Ugc2l6ZSBzaG91bGQgYmUgdXNlZCB0byBzZWxlY3QgdGhlXG4gICAgICogaW5wdXQgcGFwZXIgdHJheSB3aGVuIHByaW50aW5nLiBUaGlzIHNldHRpbmcgaW5mbHVlbmNlcyBvbmx5IHRoZSBwcmVzZXRcbiAgICAgKiB2YWx1ZXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgcHJpbnQgZGlhbG9nIHByZXNlbnRlZCBieSBhIFBERiByZWFkZXIuXG4gICAgICpcbiAgICAgKiBJZiBQaWNrVHJheUJ5UERGU2l6ZSBpcyB0cnVlLCB0aGUgY2hlY2sgYm94IGluIHRoZSBwcmludCBkaWFsb2cgYXNzb2NpYXRlZFxuICAgICAqIHdpdGggaW5wdXQgcGFwZXIgdHJheSBzaG91bGQgYmUgY2hlY2tlZC4gVGhpcyBzZXR0aW5nIGhhcyBubyBlZmZlY3Qgb25cbiAgICAgKiBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIHBpY2sgdGhlIGlucHV0IHRyYXlcbiAgICAgKiBieSBzaXplLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBpY2tUcmF5QnlQREZTaXplIGB0cnVlYCBpZiB0aGUgZG9jdW1lbnQncyBwYWdlIHNpemUgc2hvdWxkIGJlIHVzZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VsZWN0IHRoZSBpbnB1dCBwYXBlciB0cmF5LlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRQaWNrVHJheUJ5UERGU2l6ZSA9IGZ1bmN0aW9uIChwaWNrVHJheUJ5UERGU2l6ZSkge1xuICAgICAgICB2YXIgUGlja1RyYXlCeVBERlNpemUgPSB0aGlzLmRpY3QuY29udGV4dC5vYmoocGlja1RyYXlCeVBERlNpemUpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1BpY2tUcmF5QnlQREZTaXplJyksIFBpY2tUcmF5QnlQREZTaXplKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgcGFnZSBudW1iZXJzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJpbnQgZGlhbG9nIGJveCB3aGVuIHRoZVxuICAgICAqIGZpbGUgaXMgcHJpbnRlZC4gVGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIFBERiBmaWxlIGlzIGRlbm90ZWQgYnkgMC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCB2aWV3ZXJQcmVmcyA9IHBkZkRvYy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKVxuICAgICAqXG4gICAgICogLy8gV2UgY2FuIHNldCB0aGUgZGVmYXVsdCBwcmludCByYW5nZSB0byBvbmx5IHRoZSBmaXJzdCBwYWdlXG4gICAgICogdmlld2VyUHJlZnMuc2V0UHJpbnRQYWdlUmFuZ2UoeyBzdGFydDogMCwgZW5kOiAwIH0pXG4gICAgICpcbiAgICAgKiAvLyBPciB3ZSBjYW4gc3VwcGx5IG5vbmNvbnRpZ3VvdXMgcmFuZ2VzIChlLmcuIHBhZ2VzIDEsIDMsIGFuZCA1LTcpXG4gICAgICogdmlld2VyUHJlZnMuc2V0UHJpbnRQYWdlUmFuZ2UoW1xuICAgICAqICAgeyBzdGFydDogMCwgZW5kOiAwIH0sXG4gICAgICogICB7IHN0YXJ0OiAyLCBlbmQ6IDIgfSxcbiAgICAgKiAgIHsgc3RhcnQ6IDQsIGVuZDogNiB9LFxuICAgICAqIF0pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJpbnRQYWdlUmFuZ2UgQW4gb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMsIGVhY2ggd2l0aCB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBgc3RhcnRgIGFuZCBgZW5kYCwgZGVub3RpbmcgYSByYW5nZSBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGluZGljZXMuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldFByaW50UGFnZVJhbmdlID0gZnVuY3Rpb24gKHByaW50UGFnZVJhbmdlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcmludFBhZ2VSYW5nZSkpXG4gICAgICAgICAgICBwcmludFBhZ2VSYW5nZSA9IFtwcmludFBhZ2VSYW5nZV07XG4gICAgICAgIHZhciBmbGF0UmFuZ2UgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gcHJpbnRQYWdlUmFuZ2UubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBmbGF0UmFuZ2UucHVzaChwcmludFBhZ2VSYW5nZVtpZHhdLnN0YXJ0KTtcbiAgICAgICAgICAgIGZsYXRSYW5nZS5wdXNoKHByaW50UGFnZVJhbmdlW2lkeF0uZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRFYWNoSXMoZmxhdFJhbmdlLCAncHJpbnRQYWdlUmFuZ2UnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIHBhZ2VSYW5nZXMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooZmxhdFJhbmdlKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdQcmludFBhZ2VSYW5nZScpLCBwYWdlUmFuZ2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgZGVmYXVsdCBudW1iZXIgb2YgY29waWVzIHRvIGJlIHByaW50ZWQgd2hlbiB0aGUgcHJpbnQgZGlhbG9nIGlzXG4gICAgICogb3BlbmVkIGZvciB0aGlzIGZpbGUuXG4gICAgICogQHBhcmFtIG51bUNvcGllcyBUaGUgZGVmYXVsdCBudW1iZXIgb2YgY29waWVzLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXROdW1Db3BpZXMgPSBmdW5jdGlvbiAobnVtQ29waWVzKSB7XG4gICAgICAgIGFzc2VydFJhbmdlKG51bUNvcGllcywgJ251bUNvcGllcycsIDEsIE51bWJlci5NQVhfVkFMVUUpO1xuICAgICAgICBhc3NlcnRJbnRlZ2VyKG51bUNvcGllcywgJ251bUNvcGllcycpO1xuICAgICAgICB2YXIgTnVtQ29waWVzID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKG51bUNvcGllcyk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignTnVtQ29waWVzJyksIE51bUNvcGllcyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3ZXJQcmVmZXJlbmNlcyhkaWN0KTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMuY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIHJldHVybiBuZXcgVmlld2VyUHJlZmVyZW5jZXMoZGljdCk7XG4gICAgfTtcbiAgICByZXR1cm4gVmlld2VyUHJlZmVyZW5jZXM7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgVmlld2VyUHJlZmVyZW5jZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaWV3ZXJQcmVmZXJlbmNlcy5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMsIF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuL1BERk51bWJlclwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZBcnJheSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQXJyYXksIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQXJyYXkoY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5hcnJheSA9IFtdO1xuICAgICAgICBfdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZBcnJheS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIHRoaXMuYXJyYXkucHVzaChvYmplY3QpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChpbmRleCwgb2JqZWN0KSB7XG4gICAgICAgIHRoaXMuYXJyYXkuc3BsaWNlKGluZGV4LCAwLCBvYmplY3QpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuYXJyYXkuaW5kZXhPZihvYmplY3QpO1xuICAgICAgICByZXR1cm4gaW5kZXggPT09IC0xID8gdW5kZWZpbmVkIDogaW5kZXg7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHRoaXMuYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoaWR4LCBvYmplY3QpIHtcbiAgICAgICAgdGhpcy5hcnJheVtpZHhdID0gb2JqZWN0O1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJheVtpbmRleF07XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUubG9va3VwTWF5YmUgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLmNvbnRleHQpLmxvb2t1cE1heWJlLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5cyhbdGhpcy5nZXQoaW5kZXgpXSwgdHlwZXMpKTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLmNvbnRleHQpLmxvb2t1cC5hcHBseShfYSwgX19zcHJlYWRBcnJheXMoW3RoaXMuZ2V0KGluZGV4KV0sIHR5cGVzKSk7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuYXNSZWN0YW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNpemUoKSAhPT0gNClcbiAgICAgICAgICAgIHRocm93IG5ldyBQREZBcnJheUlzTm90UmVjdGFuZ2xlRXJyb3IodGhpcy5zaXplKCkpO1xuICAgICAgICB2YXIgbG93ZXJMZWZ0WCA9IHRoaXMubG9va3VwKDAsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgdmFyIGxvd2VyTGVmdFkgPSB0aGlzLmxvb2t1cCgxLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIHZhciB1cHBlclJpZ2h0WCA9IHRoaXMubG9va3VwKDIsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgdmFyIHVwcGVyUmlnaHRZID0gdGhpcy5sb29rdXAoMywgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICB2YXIgeCA9IGxvd2VyTGVmdFg7XG4gICAgICAgIHZhciB5ID0gbG93ZXJMZWZ0WTtcbiAgICAgICAgdmFyIHdpZHRoID0gdXBwZXJSaWdodFggLSBsb3dlckxlZnRYO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gdXBwZXJSaWdodFkgLSBsb3dlckxlZnRZO1xuICAgICAgICByZXR1cm4geyB4OiB4LCB5OiB5LCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuYXNBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkuc2xpY2UoKTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBjbG9uZSA9IFBERkFycmF5LndpdGhDb250ZXh0KGNvbnRleHQgfHwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGNsb25lLnB1c2godGhpcy5hcnJheVtpZHhdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheVN0cmluZyA9ICdbICc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBhcnJheVN0cmluZyArPSB0aGlzLmdldChpZHgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBhcnJheVN0cmluZyArPSAnICc7XG4gICAgICAgIH1cbiAgICAgICAgYXJyYXlTdHJpbmcgKz0gJ10nO1xuICAgICAgICByZXR1cm4gYXJyYXlTdHJpbmc7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzaXplID0gMztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHNpemUgKz0gdGhpcy5nZXQoaWR4KS5zaXplSW5CeXRlcygpICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkxlZnRTcXVhcmVCcmFja2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMuZ2V0KGlkeCkuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUmlnaHRTcXVhcmVCcmFja2V0O1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5zY2FsZVBERk51bWJlcnMgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIFBERk51bWJlcikge1xuICAgICAgICAgICAgICAgIHZhciBmYWN0b3IgPSBpZHggJSAyID09PSAwID8geCA6IHk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoaWR4LCBQREZOdW1iZXIub2YoZWwuYXNOdW1iZXIoKSAqIGZhY3RvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZBcnJheS53aXRoQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7IHJldHVybiBuZXcgUERGQXJyYXkoY29udGV4dCk7IH07XG4gICAgcmV0dXJuIFBERkFycmF5O1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFycmF5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQXJyYXkuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQcml2YXRlQ29uc3RydWN0b3JFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgRU5GT1JDRVIgPSB7fTtcbnZhciBQREZCb29sID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZCb29sLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkJvb2woZW5mb3JjZXIsIHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbmZvcmNlciAhPT0gRU5GT1JDRVIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IoJ1BERkJvb2wnKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkJvb2wucHJvdG90eXBlLmFzQm9vbGVhbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBQREZCb29sLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQREZCb29sLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICB9O1xuICAgIFBERkJvb2wucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA/IDQgOiA1O1xuICAgIH07XG4gICAgUERGQm9vbC5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy51O1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmY7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmE7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmw7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnM7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgICAgICByZXR1cm4gNTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQm9vbC5UcnVlID0gbmV3IFBERkJvb2woRU5GT1JDRVIsIHRydWUpO1xuICAgIFBERkJvb2wuRmFsc2UgPSBuZXcgUERGQm9vbChFTkZPUkNFUiwgZmFsc2UpO1xuICAgIHJldHVybiBQREZCb29sO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkJvb2w7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZCb29sLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcywgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdWxsIGZyb20gXCIuL1BERk51bGxcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgUERGRGljdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGRGljdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZEaWN0KG1hcCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kaWN0ID0gbWFwO1xuICAgICAgICBfdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZEaWN0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmRpY3Qua2V5cygpKTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kaWN0LnZhbHVlcygpKTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGljdC5lbnRyaWVzKCkpO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChrZXksIHZhbHVlKTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXksIFxuICAgIC8vIFRPRE86IGBwcmVzZXJ2ZVBERk51bGxgIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gU2hvdWxkIGJlXG4gICAgLy8gcmVtb3ZlZCBpbiBuZXh0IGJyZWFraW5nIEFQSSBjaGFuZ2UuXG4gICAgcHJlc2VydmVQREZOdWxsKSB7XG4gICAgICAgIGlmIChwcmVzZXJ2ZVBERk51bGwgPT09IHZvaWQgMCkgeyBwcmVzZXJ2ZVBERk51bGwgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRpY3QuZ2V0KGtleSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gUERGTnVsbCAmJiAhcHJlc2VydmVQREZOdWxsKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRpY3QuZ2V0KGtleSk7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBQREZOdWxsO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUubG9va3VwTWF5YmUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0eXBlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBgcHJlc2VydmVQREZOdWxsYCBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNob3VsZCBiZVxuICAgICAgICAvLyByZW1vdmVkIGluIG5leHQgYnJlYWtpbmcgQVBJIGNoYW5nZS5cbiAgICAgICAgdmFyIHByZXNlcnZlUERGTnVsbCA9IHR5cGVzLmluY2x1ZGVzKFBERk51bGwpO1xuICAgICAgICB2YXIgdmFsdWUgPSAoX2EgPSB0aGlzLmNvbnRleHQpLmxvb2t1cE1heWJlLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5cyhbdGhpcy5nZXQoa2V5LCBwcmVzZXJ2ZVBERk51bGwpXSwgdHlwZXMpKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBQREZOdWxsICYmICFwcmVzZXJ2ZVBERk51bGwpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0eXBlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBgcHJlc2VydmVQREZOdWxsYCBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNob3VsZCBiZVxuICAgICAgICAvLyByZW1vdmVkIGluIG5leHQgYnJlYWtpbmcgQVBJIGNoYW5nZS5cbiAgICAgICAgdmFyIHByZXNlcnZlUERGTnVsbCA9IHR5cGVzLmluY2x1ZGVzKFBERk51bGwpO1xuICAgICAgICB2YXIgdmFsdWUgPSAoX2EgPSB0aGlzLmNvbnRleHQpLmxvb2t1cC5hcHBseShfYSwgX19zcHJlYWRBcnJheXMoW3RoaXMuZ2V0KGtleSwgcHJlc2VydmVQREZOdWxsKV0sIHR5cGVzKSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gUERGTnVsbCAmJiAhcHJlc2VydmVQREZOdWxsKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmRlbGV0ZShrZXkpO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuYXNNYXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwKHRoaXMuZGljdCk7XG4gICAgfTtcbiAgICAvKiogR2VuZXJhdGUgYSByYW5kb20ga2V5IHRoYXQgZG9lc24ndCBleGlzdCBpbiBjdXJyZW50IGtleSBzZXQgKi9cbiAgICBQREZEaWN0LnByb3RvdHlwZS51bmlxdWVLZXkgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIGlmICh0YWcgPT09IHZvaWQgMCkgeyB0YWcgPSAnJzsgfVxuICAgICAgICB2YXIgZXhpc3RpbmdLZXlzID0gdGhpcy5rZXlzKCk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKHRoaXMuY29udGV4dC5hZGRSYW5kb21TdWZmaXgodGFnLCAxMCkpO1xuICAgICAgICB3aGlsZSAoZXhpc3RpbmdLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIGtleSA9IFBERk5hbWUub2YodGhpcy5jb250ZXh0LmFkZFJhbmRvbVN1ZmZpeCh0YWcsIDEwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNsb25lID0gUERGRGljdC53aXRoQ29udGV4dChjb250ZXh0IHx8IHRoaXMuY29udGV4dCk7XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgY2xvbmUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGljdFN0cmluZyA9ICc8PFxcbic7XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgZGljdFN0cmluZyArPSBrZXkudG9TdHJpbmcoKSArICcgJyArIHZhbHVlLnRvU3RyaW5nKCkgKyAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICBkaWN0U3RyaW5nICs9ICc+Pic7XG4gICAgICAgIHJldHVybiBkaWN0U3RyaW5nO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzaXplID0gNTtcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBzaXplICs9IGtleS5zaXplSW5CeXRlcygpICsgdmFsdWUuc2l6ZUluQnl0ZXMoKSArIDI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkxlc3NUaGFuO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkxlc3NUaGFuO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGtleS5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdmFsdWUuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5HcmVhdGVyVGhhbjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5HcmVhdGVyVGhhbjtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZEaWN0LndpdGhDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHsgcmV0dXJuIG5ldyBQREZEaWN0KG5ldyBNYXAoKSwgY29udGV4dCk7IH07XG4gICAgUERGRGljdC5mcm9tTWFwV2l0aENvbnRleHQgPSBmdW5jdGlvbiAobWFwLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRGljdChtYXAsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkRpY3Q7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRGljdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkRpY3QuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgsIHV0ZjE2RGVjb2RlLCB1dGYxNkVuY29kZSwgcGRmRG9jRW5jb2RpbmdEZWNvZGUsIHBhcnNlRGF0ZSwgaGFzVXRmMTZCT00sIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkhleFN0cmluZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGSGV4U3RyaW5nLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkhleFN0cmluZyh2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuYXNCeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQXBwZW5kIGEgemVybyBpZiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpcyBvZGQuIFNlZSBQREYgc3BlYyA3LjMuNC4zXG4gICAgICAgIHZhciBoZXggPSB0aGlzLnZhbHVlICsgKHRoaXMudmFsdWUubGVuZ3RoICUgMiA9PT0gMSA/ICcwJyA6ICcnKTtcbiAgICAgICAgdmFyIGhleExlbmd0aCA9IGhleC5sZW5ndGg7XG4gICAgICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGhleC5sZW5ndGggLyAyKTtcbiAgICAgICAgdmFyIGhleE9mZnNldCA9IDA7XG4gICAgICAgIHZhciBieXRlc09mZnNldCA9IDA7XG4gICAgICAgIC8vIEludGVycHJldCBlYWNoIHBhaXIgb2YgaGV4IGRpZ2l0cyBhcyBhIHNpbmdsZSBieXRlXG4gICAgICAgIHdoaWxlIChoZXhPZmZzZXQgPCBoZXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyhoZXhPZmZzZXQsIGhleE9mZnNldCArIDIpLCAxNik7XG4gICAgICAgICAgICBieXRlc1tieXRlc09mZnNldF0gPSBieXRlO1xuICAgICAgICAgICAgaGV4T2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBieXRlc09mZnNldCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuZGVjb2RlVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5hc0J5dGVzKCk7XG4gICAgICAgIGlmIChoYXNVdGYxNkJPTShieXRlcykpXG4gICAgICAgICAgICByZXR1cm4gdXRmMTZEZWNvZGUoYnl0ZXMpO1xuICAgICAgICByZXR1cm4gcGRmRG9jRW5jb2RpbmdEZWNvZGUoYnl0ZXMpO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5kZWNvZGVEYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGV4dCA9IHRoaXMuZGVjb2RlVGV4dCgpO1xuICAgICAgICB2YXIgZGF0ZSA9IHBhcnNlRGF0ZSh0ZXh0KTtcbiAgICAgICAgaWYgKCFkYXRlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IodGV4dCk7XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5hc1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUERGSGV4U3RyaW5nLm9mKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiPFwiICsgdGhpcy52YWx1ZSArIFwiPlwiO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubGVuZ3RoICsgMjtcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkxlc3NUaGFuO1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy52YWx1ZSwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggKyAyO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLm9mID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBuZXcgUERGSGV4U3RyaW5nKHZhbHVlKTsgfTtcbiAgICBQREZIZXhTdHJpbmcuZnJvbVRleHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGVuY29kZWQgPSB1dGYxNkVuY29kZSh2YWx1ZSk7XG4gICAgICAgIHZhciBoZXggPSAnJztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW5jb2RlZC5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGhleCArPSB0b0hleFN0cmluZ09mTWluTGVuZ3RoKGVuY29kZWRbaWR4XSwgNCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZIZXhTdHJpbmcoaGV4KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZIZXhTdHJpbmc7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGSGV4U3RyaW5nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGSGV4U3RyaW5nLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbnZhciBQREZJbnZhbGlkT2JqZWN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZJbnZhbGlkT2JqZWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkludmFsaWRPYmplY3QoZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZJbnZhbGlkT2JqZWN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFBERkludmFsaWRPYmplY3Qub2YodGhpcy5kYXRhLnNsaWNlKCkpO1xuICAgIH07XG4gICAgUERGSW52YWxpZE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlBERkludmFsaWRPYmplY3QoXCIgKyB0aGlzLmRhdGEubGVuZ3RoICsgXCIgYnl0ZXMpXCI7XG4gICAgfTtcbiAgICBQREZJbnZhbGlkT2JqZWN0LnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZJbnZhbGlkT2JqZWN0LnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gdGhpcy5kYXRhW2lkeF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9O1xuICAgIFBERkludmFsaWRPYmplY3Qub2YgPSBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gbmV3IFBERkludmFsaWRPYmplY3QoZGF0YSk7IH07XG4gICAgcmV0dXJuIFBERkludmFsaWRPYmplY3Q7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGSW52YWxpZE9iamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkludmFsaWRPYmplY3QuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQcml2YXRlQ29uc3RydWN0b3JFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBJc0lycmVndWxhciB9IGZyb20gXCIuLi9zeW50YXgvSXJyZWd1bGFyXCI7XG5pbXBvcnQgeyBjaGFyRnJvbUhleENvZGUsIGNvcHlTdHJpbmdJbnRvQnVmZmVyLCB0b0NoYXJDb2RlLCB0b0hleFN0cmluZywgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBkZWNvZGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC8jKFtcXGRBQkNERUZdezJ9KS9nLCBmdW5jdGlvbiAoXywgaGV4KSB7IHJldHVybiBjaGFyRnJvbUhleENvZGUoaGV4KTsgfSk7XG59O1xudmFyIGlzUmVndWxhckNoYXIgPSBmdW5jdGlvbiAoY2hhckNvZGUpIHtcbiAgICByZXR1cm4gY2hhckNvZGUgPj0gQ2hhckNvZGVzLkV4Y2xhbWF0aW9uUG9pbnQgJiZcbiAgICAgICAgY2hhckNvZGUgPD0gQ2hhckNvZGVzLlRpbGRlICYmXG4gICAgICAgICFJc0lycmVndWxhcltjaGFyQ29kZV07XG59O1xudmFyIEVORk9SQ0VSID0ge307XG52YXIgcG9vbCA9IG5ldyBNYXAoKTtcbnZhciBQREZOYW1lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZOYW1lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk5hbWUoZW5mb3JjZXIsIG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGVuZm9yY2VyICE9PSBFTkZPUkNFUilcbiAgICAgICAgICAgIHRocm93IG5ldyBQcml2YXRlQ29uc3RydWN0b3JFcnJvcignUERGTmFtZScpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIHZhciBlbmNvZGVkTmFtZSA9ICcvJztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbmFtZS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjaGFyYWN0ZXIgPSBuYW1lW2lkeF07XG4gICAgICAgICAgICB2YXIgY29kZSA9IHRvQ2hhckNvZGUoY2hhcmFjdGVyKTtcbiAgICAgICAgICAgIGVuY29kZWROYW1lICs9IGlzUmVndWxhckNoYXIoY29kZSkgPyBjaGFyYWN0ZXIgOiBcIiNcIiArIHRvSGV4U3RyaW5nKGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmVuY29kZWROYW1lID0gZW5jb2RlZE5hbWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGTmFtZS5wcm90b3R5cGUuYXNCeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gW107XG4gICAgICAgIHZhciBoZXggPSAnJztcbiAgICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHB1c2hCeXRlID0gZnVuY3Rpb24gKGJ5dGUpIHtcbiAgICAgICAgICAgIGlmIChieXRlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgYnl0ZXMucHVzaChieXRlKTtcbiAgICAgICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMSwgbGVuID0gdGhpcy5lbmNvZGVkTmFtZS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjaGFyID0gdGhpcy5lbmNvZGVkTmFtZVtpZHhdO1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0b0NoYXJDb2RlKGNoYXIpO1xuICAgICAgICAgICAgdmFyIG5leHRDaGFyID0gdGhpcy5lbmNvZGVkTmFtZVtpZHggKyAxXTtcbiAgICAgICAgICAgIGlmICghZXNjYXBlZCkge1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuSGFzaClcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShieXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgoYnl0ZSA+PSBDaGFyQ29kZXMuWmVybyAmJiBieXRlIDw9IENoYXJDb2Rlcy5OaW5lKSB8fFxuICAgICAgICAgICAgICAgICAgICAoYnl0ZSA+PSBDaGFyQ29kZXMuYSAmJiBieXRlIDw9IENoYXJDb2Rlcy5mKSB8fFxuICAgICAgICAgICAgICAgICAgICAoYnl0ZSA+PSBDaGFyQ29kZXMuQSAmJiBieXRlIDw9IENoYXJDb2Rlcy5GKSkge1xuICAgICAgICAgICAgICAgICAgICBoZXggKz0gY2hhcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhleC5sZW5ndGggPT09IDIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICEoKG5leHRDaGFyID49ICcwJyAmJiBuZXh0Q2hhciA8PSAnOScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRDaGFyID49ICdhJyAmJiBuZXh0Q2hhciA8PSAnZicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRDaGFyID49ICdBJyAmJiBuZXh0Q2hhciA8PSAnRicpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUocGFyc2VJbnQoaGV4LCAxNikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGV4ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKGJ5dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICAgIH07XG4gICAgLy8gVE9ETzogVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGB1dGY4RGVjb2RlKClgXG4gICAgLy8gVE9ETzogUG9seWZpbGwgQXJyYXkuZnJvbT9cbiAgICBQREZOYW1lLnByb3RvdHlwZS5kZWNvZGVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmFzQnl0ZXMoKTtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBBcnJheS5mcm9tKGJ5dGVzKSk7XG4gICAgfTtcbiAgICBQREZOYW1lLnByb3RvdHlwZS5hc1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZE5hbWU7XG4gICAgfTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgW1tQREZOYW1lLmFzU3RyaW5nXV0gKi9cbiAgICBQREZOYW1lLnByb3RvdHlwZS52YWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZE5hbWU7XG4gICAgfTtcbiAgICBQREZOYW1lLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQREZOYW1lLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZE5hbWU7XG4gICAgfTtcbiAgICBQREZOYW1lLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZE5hbWUubGVuZ3RoO1xuICAgIH07XG4gICAgUERGTmFtZS5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5lbmNvZGVkTmFtZSwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVkTmFtZS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZOYW1lLm9mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGRlY29kZWRWYWx1ZSA9IGRlY29kZU5hbWUobmFtZSk7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHBvb2wuZ2V0KGRlY29kZWRWYWx1ZSk7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IFBERk5hbWUoRU5GT1JDRVIsIGRlY29kZWRWYWx1ZSk7XG4gICAgICAgICAgICBwb29sLnNldChkZWNvZGVkVmFsdWUsIGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZSBtZW1iZXItb3JkZXJpbmcgKi9cbiAgICBQREZOYW1lLkxlbmd0aCA9IFBERk5hbWUub2YoJ0xlbmd0aCcpO1xuICAgIFBERk5hbWUuRmxhdGVEZWNvZGUgPSBQREZOYW1lLm9mKCdGbGF0ZURlY29kZScpO1xuICAgIFBERk5hbWUuUmVzb3VyY2VzID0gUERGTmFtZS5vZignUmVzb3VyY2VzJyk7XG4gICAgUERGTmFtZS5Gb250ID0gUERGTmFtZS5vZignRm9udCcpO1xuICAgIFBERk5hbWUuWE9iamVjdCA9IFBERk5hbWUub2YoJ1hPYmplY3QnKTtcbiAgICBQREZOYW1lLkV4dEdTdGF0ZSA9IFBERk5hbWUub2YoJ0V4dEdTdGF0ZScpO1xuICAgIFBERk5hbWUuQ29udGVudHMgPSBQREZOYW1lLm9mKCdDb250ZW50cycpO1xuICAgIFBERk5hbWUuVHlwZSA9IFBERk5hbWUub2YoJ1R5cGUnKTtcbiAgICBQREZOYW1lLlBhcmVudCA9IFBERk5hbWUub2YoJ1BhcmVudCcpO1xuICAgIFBERk5hbWUuTWVkaWFCb3ggPSBQREZOYW1lLm9mKCdNZWRpYUJveCcpO1xuICAgIFBERk5hbWUuUGFnZSA9IFBERk5hbWUub2YoJ1BhZ2UnKTtcbiAgICBQREZOYW1lLkFubm90cyA9IFBERk5hbWUub2YoJ0Fubm90cycpO1xuICAgIFBERk5hbWUuVHJpbUJveCA9IFBERk5hbWUub2YoJ1RyaW1Cb3gnKTtcbiAgICBQREZOYW1lLkFydEJveCA9IFBERk5hbWUub2YoJ0FydEJveCcpO1xuICAgIFBERk5hbWUuQmxlZWRCb3ggPSBQREZOYW1lLm9mKCdCbGVlZEJveCcpO1xuICAgIFBERk5hbWUuQ3JvcEJveCA9IFBERk5hbWUub2YoJ0Nyb3BCb3gnKTtcbiAgICBQREZOYW1lLlJvdGF0ZSA9IFBERk5hbWUub2YoJ1JvdGF0ZScpO1xuICAgIFBERk5hbWUuVGl0bGUgPSBQREZOYW1lLm9mKCdUaXRsZScpO1xuICAgIFBERk5hbWUuQXV0aG9yID0gUERGTmFtZS5vZignQXV0aG9yJyk7XG4gICAgUERGTmFtZS5TdWJqZWN0ID0gUERGTmFtZS5vZignU3ViamVjdCcpO1xuICAgIFBERk5hbWUuQ3JlYXRvciA9IFBERk5hbWUub2YoJ0NyZWF0b3InKTtcbiAgICBQREZOYW1lLktleXdvcmRzID0gUERGTmFtZS5vZignS2V5d29yZHMnKTtcbiAgICBQREZOYW1lLlByb2R1Y2VyID0gUERGTmFtZS5vZignUHJvZHVjZXInKTtcbiAgICBQREZOYW1lLkNyZWF0aW9uRGF0ZSA9IFBERk5hbWUub2YoJ0NyZWF0aW9uRGF0ZScpO1xuICAgIFBERk5hbWUuTW9kRGF0ZSA9IFBERk5hbWUub2YoJ01vZERhdGUnKTtcbiAgICByZXR1cm4gUERGTmFtZTtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZOYW1lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGTmFtZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgUERGTnVsbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGTnVsbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZOdWxsKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERk51bGwucHJvdG90eXBlLmFzTnVsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBQREZOdWxsLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQREZOdWxsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9O1xuICAgIFBERk51bGwucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gNDtcbiAgICB9O1xuICAgIFBERk51bGwucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5uO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5sO1xuICAgICAgICByZXR1cm4gNDtcbiAgICB9O1xuICAgIHJldHVybiBQREZOdWxsO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IG5ldyBQREZOdWxsKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZOdWxsLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIG51bWJlclRvU3RyaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2luZGV4XCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xudmFyIFBERk51bWJlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGTnVtYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk51bWJlcih2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5udW1iZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBfdGhpcy5zdHJpbmdWYWx1ZSA9IG51bWJlclRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZOdW1iZXIucHJvdG90eXBlLmFzTnVtYmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXJWYWx1ZTtcbiAgICB9O1xuICAgIC8qKiBAZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBbW1BERk51bWJlci5hc051bWJlcl1dICovXG4gICAgUERGTnVtYmVyLnByb3RvdHlwZS52YWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtYmVyVmFsdWU7XG4gICAgfTtcbiAgICBQREZOdW1iZXIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUERGTnVtYmVyLm9mKHRoaXMubnVtYmVyVmFsdWUpO1xuICAgIH07XG4gICAgUERGTnVtYmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nVmFsdWU7XG4gICAgfTtcbiAgICBQREZOdW1iZXIucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdWYWx1ZS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZOdW1iZXIucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMuc3RyaW5nVmFsdWUsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nVmFsdWUubGVuZ3RoO1xuICAgIH07XG4gICAgUERGTnVtYmVyLm9mID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBuZXcgUERGTnVtYmVyKHZhbHVlKTsgfTtcbiAgICByZXR1cm4gUERGTnVtYmVyO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk51bWJlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk51bWJlci5qcy5tYXAiLCJpbXBvcnQgeyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERk9iamVjdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZPYmplY3QoKSB7XG4gICAgfVxuICAgIFBERk9iamVjdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoX2NvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnY2xvbmUnKTtcbiAgICB9O1xuICAgIFBERk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ3RvU3RyaW5nJyk7XG4gICAgfTtcbiAgICBQREZPYmplY3QucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdzaXplSW5CeXRlcycpO1xuICAgIH07XG4gICAgUERGT2JqZWN0LnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKF9idWZmZXIsIF9vZmZzZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnY29weUJ5dGVzSW50bycpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9iamVjdDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPYmplY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPYmplY3QuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuL1BERlN0cmVhbVwiO1xuaW1wb3J0IHsgYXJyYXlBc1N0cmluZyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERlJhd1N0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUmF3U3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlJhd1N0cmVhbShkaWN0LCBjb250ZW50cykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkaWN0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb250ZW50cyA9IGNvbnRlbnRzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlJhd1N0cmVhbS5wcm90b3R5cGUuYXNVaW50OEFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50cy5zbGljZSgpO1xuICAgIH07XG4gICAgUERGUmF3U3RyZWFtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBQREZSYXdTdHJlYW0ub2YodGhpcy5kaWN0LmNsb25lKGNvbnRleHQpLCB0aGlzLmNvbnRlbnRzLnNsaWNlKCkpO1xuICAgIH07XG4gICAgUERGUmF3U3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5QXNTdHJpbmcodGhpcy5jb250ZW50cyk7XG4gICAgfTtcbiAgICBQREZSYXdTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50cztcbiAgICB9O1xuICAgIFBERlJhd1N0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50cy5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZSYXdTdHJlYW0ub2YgPSBmdW5jdGlvbiAoZGljdCwgY29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZSYXdTdHJlYW0oZGljdCwgY29udGVudHMpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlJhd1N0cmVhbTtcbn0oUERGU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBQREZSYXdTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZSYXdTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQcml2YXRlQ29uc3RydWN0b3JFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIEVORk9SQ0VSID0ge307XG52YXIgcG9vbCA9IG5ldyBNYXAoKTtcbnZhciBQREZSZWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlJlZiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZSZWYoZW5mb3JjZXIsIG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZW5mb3JjZXIgIT09IEVORk9SQ0VSKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yKCdQREZSZWYnKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vYmplY3ROdW1iZXIgPSBvYmplY3ROdW1iZXI7XG4gICAgICAgIF90aGlzLmdlbmVyYXRpb25OdW1iZXIgPSBnZW5lcmF0aW9uTnVtYmVyO1xuICAgICAgICBfdGhpcy50YWcgPSBvYmplY3ROdW1iZXIgKyBcIiBcIiArIGdlbmVyYXRpb25OdW1iZXIgKyBcIiBSXCI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGUmVmLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQREZSZWYucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWc7XG4gICAgfTtcbiAgICBQREZSZWYucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWcubGVuZ3RoO1xuICAgIH07XG4gICAgUERGUmVmLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLnRhZywgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy50YWcubGVuZ3RoO1xuICAgIH07XG4gICAgUERGUmVmLm9mID0gZnVuY3Rpb24gKG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlcikge1xuICAgICAgICBpZiAoZ2VuZXJhdGlvbk51bWJlciA9PT0gdm9pZCAwKSB7IGdlbmVyYXRpb25OdW1iZXIgPSAwOyB9XG4gICAgICAgIHZhciB0YWcgPSBvYmplY3ROdW1iZXIgKyBcIiBcIiArIGdlbmVyYXRpb25OdW1iZXIgKyBcIiBSXCI7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHBvb2wuZ2V0KHRhZyk7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IFBERlJlZihFTkZPUkNFUiwgb2JqZWN0TnVtYmVyLCBnZW5lcmF0aW9uTnVtYmVyKTtcbiAgICAgICAgICAgIHBvb2wuc2V0KHRhZywgaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICAgIHJldHVybiBQREZSZWY7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUmVmO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUmVmLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4vUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xudmFyIFBERlN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGU3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlN0cmVhbShkaWN0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmRpY3QgPSBkaWN0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlN0cmVhbS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoX2NvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnY2xvbmUnKTtcbiAgICB9O1xuICAgIFBERlN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2dldENvbnRlbnRzU3RyaW5nJyk7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdnZXRDb250ZW50cycpO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2dldENvbnRlbnRzU2l6ZScpO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS51cGRhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGVudHNTaXplID0gdGhpcy5nZXRDb250ZW50c1NpemUoKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLkxlbmd0aCwgUERGTnVtYmVyLm9mKGNvbnRlbnRzU2l6ZSkpO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEaWN0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Quc2l6ZUluQnl0ZXMoKSArIHRoaXMuZ2V0Q29udGVudHNTaXplKCkgKyAxODtcbiAgICB9O1xuICAgIFBERlN0cmVhbS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGljdCgpO1xuICAgICAgICB2YXIgc3RyZWFtU3RyaW5nID0gdGhpcy5kaWN0LnRvU3RyaW5nKCk7XG4gICAgICAgIHN0cmVhbVN0cmluZyArPSAnXFxuc3RyZWFtXFxuJztcbiAgICAgICAgc3RyZWFtU3RyaW5nICs9IHRoaXMuZ2V0Q29udGVudHNTdHJpbmcoKTtcbiAgICAgICAgc3RyZWFtU3RyaW5nICs9ICdcXG5lbmRzdHJlYW0nO1xuICAgICAgICByZXR1cm4gc3RyZWFtU3RyaW5nO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGljdCgpO1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMuZGljdC5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnM7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5tO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuZ2V0Q29udGVudHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gY29udGVudHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gY29udGVudHNbaWR4XTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5uO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucztcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5hO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm07XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgcmV0dXJuIFBERlN0cmVhbTtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIHBhZFN0YXJ0LCB1dGYxNkRlY29kZSwgcGRmRG9jRW5jb2RpbmdEZWNvZGUsIHRvQ2hhckNvZGUsIHBhcnNlRGF0ZSwgaGFzVXRmMTZCT00sIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERlN0cmluZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGU3RyaW5nLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlN0cmluZyh2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlN0cmluZy5wcm90b3R5cGUuYXNCeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gW107XG4gICAgICAgIHZhciBvY3RhbCA9ICcnO1xuICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgcHVzaEJ5dGUgPSBmdW5jdGlvbiAoYnl0ZSkge1xuICAgICAgICAgICAgaWYgKGJ5dGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBieXRlcy5wdXNoKGJ5dGUpO1xuICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnZhbHVlLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNoYXIgPSB0aGlzLnZhbHVlW2lkeF07XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRvQ2hhckNvZGUoY2hhcik7XG4gICAgICAgICAgICB2YXIgbmV4dENoYXIgPSB0aGlzLnZhbHVlW2lkeCArIDFdO1xuICAgICAgICAgICAgaWYgKCFlc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5CYWNrU2xhc2gpXG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoYnl0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLk5ld2xpbmUpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkNhcnJpYWdlUmV0dXJuKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZSgpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5uKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuTmV3bGluZSk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLnIpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5DYXJyaWFnZVJldHVybik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLnQpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5UYWIpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5iKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuQmFja3NwYWNlKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMuZilcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLkZvcm1GZWVkKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMuTGVmdFBhcmVuKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuTGVmdFBhcmVuKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMuUmlnaHRQYXJlbilcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLlJpZ2h0UGFyZW4pO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5CYWNrc3BhY2UpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5CYWNrU2xhc2gpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPj0gQ2hhckNvZGVzLlplcm8gJiYgYnl0ZSA8PSBDaGFyQ29kZXMuU2V2ZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgb2N0YWwgKz0gY2hhcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9jdGFsLmxlbmd0aCA9PT0gMyB8fCAhKG5leHRDaGFyID49ICcwJyAmJiBuZXh0Q2hhciA8PSAnNycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShwYXJzZUludChvY3RhbCwgOCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2N0YWwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoYnl0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShieXRlcyk7XG4gICAgfTtcbiAgICBQREZTdHJpbmcucHJvdG90eXBlLmRlY29kZVRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBieXRlcyA9IHRoaXMuYXNCeXRlcygpO1xuICAgICAgICBpZiAoaGFzVXRmMTZCT00oYnl0ZXMpKVxuICAgICAgICAgICAgcmV0dXJuIHV0ZjE2RGVjb2RlKGJ5dGVzKTtcbiAgICAgICAgcmV0dXJuIHBkZkRvY0VuY29kaW5nRGVjb2RlKGJ5dGVzKTtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuZGVjb2RlRGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRleHQgPSB0aGlzLmRlY29kZVRleHQoKTtcbiAgICAgICAgdmFyIGRhdGUgPSBwYXJzZURhdGUodGV4dCk7XG4gICAgICAgIGlmICghZGF0ZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yKHRleHQpO1xuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuYXNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFBERlN0cmluZy5vZih0aGlzLnZhbHVlKTtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIihcIiArIHRoaXMudmFsdWUgKyBcIilcIjtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmxlbmd0aCArIDI7XG4gICAgfTtcbiAgICBQREZTdHJpbmcucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5MZWZ0UGFyZW47XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLnZhbHVlLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUmlnaHRQYXJlbjtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubGVuZ3RoICsgMjtcbiAgICB9O1xuICAgIC8vIFRoZSBQREYgc3BlYyBhbGxvd3MgbmV3bGluZXMgYW5kIHBhcmVucyB0byBhcHBlYXIgZGlyZWN0bHkgd2l0aGluIGEgbGl0ZXJhbFxuICAgIC8vIHN0cmluZy4gVGhlc2UgY2hhcmFjdGVyIF9tYXlfIGJlIGVzY2FwZWQuIEJ1dCB0aGV5IGRvIG5vdCBfaGF2ZV8gdG8gYmUuIFNvXG4gICAgLy8gZm9yIHNpbXBsaWNpdHksIHdlIHdpbGwgbm90IGJvdGhlciBlc2NhcGluZyB0aGVtLlxuICAgIFBERlN0cmluZy5vZiA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gbmV3IFBERlN0cmluZyh2YWx1ZSk7IH07XG4gICAgUERGU3RyaW5nLmZyb21EYXRlID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIHllYXIgPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSwgNCwgJzAnKTtcbiAgICAgICAgdmFyIG1vbnRoID0gcGFkU3RhcnQoU3RyaW5nKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLCAyLCAnMCcpO1xuICAgICAgICB2YXIgZGF5ID0gcGFkU3RhcnQoU3RyaW5nKGRhdGUuZ2V0VVRDRGF0ZSgpKSwgMiwgJzAnKTtcbiAgICAgICAgdmFyIGhvdXJzID0gcGFkU3RhcnQoU3RyaW5nKGRhdGUuZ2V0VVRDSG91cnMoKSksIDIsICcwJyk7XG4gICAgICAgIHZhciBtaW5zID0gcGFkU3RhcnQoU3RyaW5nKGRhdGUuZ2V0VVRDTWludXRlcygpKSwgMiwgJzAnKTtcbiAgICAgICAgdmFyIHNlY3MgPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENTZWNvbmRzKCkpLCAyLCAnMCcpO1xuICAgICAgICByZXR1cm4gbmV3IFBERlN0cmluZyhcIkQ6XCIgKyB5ZWFyICsgbW9udGggKyBkYXkgKyBob3VycyArIG1pbnMgKyBzZWNzICsgXCJaXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlN0cmluZztcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZTdHJpbmc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZTdHJpbmcuanMubWFwIiwiaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGT3BlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGT3BlcmF0b3IobmFtZSwgYXJncykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIHx8IFtdO1xuICAgIH1cbiAgICBQREZPcGVyYXRvci5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgYXJncyA9IG5ldyBBcnJheSh0aGlzLmFyZ3MubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJncy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBhcmcgPSB0aGlzLmFyZ3NbaWR4XTtcbiAgICAgICAgICAgIGFyZ3NbaWR4XSA9IGFyZyBpbnN0YW5jZW9mIFBERk9iamVjdCA/IGFyZy5jbG9uZShjb250ZXh0KSA6IGFyZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YodGhpcy5uYW1lLCBhcmdzKTtcbiAgICB9O1xuICAgIFBERk9wZXJhdG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuYXJncy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhbHVlICs9IFN0cmluZyh0aGlzLmFyZ3NbaWR4XSkgKyAnICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgKz0gdGhpcy5uYW1lO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZPcGVyYXRvci5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzaXplID0gMDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5hcmdzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGFyZyA9IHRoaXMuYXJnc1tpZHhdO1xuICAgICAgICAgICAgc2l6ZSArPSAoYXJnIGluc3RhbmNlb2YgUERGT2JqZWN0ID8gYXJnLnNpemVJbkJ5dGVzKCkgOiBhcmcubGVuZ3RoKSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgc2l6ZSArPSB0aGlzLm5hbWUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFBERk9wZXJhdG9yLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLmFyZ3MubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgYXJnID0gdGhpcy5hcmdzW2lkeF07XG4gICAgICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgUERGT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFyZy5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihhcmcsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMubmFtZSwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERk9wZXJhdG9yLm9mID0gZnVuY3Rpb24gKG5hbWUsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZPcGVyYXRvcihuYW1lLCBhcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZPcGVyYXRvcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPcGVyYXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9wZXJhdG9yLmpzLm1hcCIsInZhciBQREZPcGVyYXRvck5hbWVzO1xuKGZ1bmN0aW9uIChQREZPcGVyYXRvck5hbWVzKSB7XG4gICAgLy8gTm9uIFN0cm9raW5nIENvbG9yIE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJOb25TdHJva2luZ0NvbG9yXCJdID0gXCJzY1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJOb25TdHJva2luZ0NvbG9yTlwiXSA9IFwic2NuXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JSZ2JcIl0gPSBcInJnXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JHcmF5XCJdID0gXCJnXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JDbXlrXCJdID0gXCJrXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JzcGFjZVwiXSA9IFwiY3NcIjtcbiAgICAvLyBTdHJva2luZyBDb2xvciBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU3Ryb2tpbmdDb2xvclwiXSA9IFwiU0NcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU3Ryb2tpbmdDb2xvck5cIl0gPSBcIlNDTlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yUmdiXCJdID0gXCJSR1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yR3JheVwiXSA9IFwiR1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yQ215a1wiXSA9IFwiS1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yc3BhY2VcIl0gPSBcIkNTXCI7XG4gICAgLy8gTWFya2VkIENvbnRlbnQgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkJlZ2luTWFya2VkQ29udGVudFNlcXVlbmNlXCJdID0gXCJCRENcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQmVnaW5NYXJrZWRDb250ZW50XCJdID0gXCJCTUNcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRW5kTWFya2VkQ29udGVudFwiXSA9IFwiRU1DXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk1hcmtlZENvbnRlbnRQb2ludFdpdGhQcm9wc1wiXSA9IFwiRFBcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTWFya2VkQ29udGVudFBvaW50XCJdID0gXCJNUFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJEcmF3T2JqZWN0XCJdID0gXCJEb1wiO1xuICAgIC8vIEdyYXBoaWNzIFN0YXRlIE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDb25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeFwiXSA9IFwiY21cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiUG9wR3JhcGhpY3NTdGF0ZVwiXSA9IFwiUVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJQdXNoR3JhcGhpY3NTdGF0ZVwiXSA9IFwicVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRGbGF0bmVzc1wiXSA9IFwiaVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRHcmFwaGljc1N0YXRlUGFyYW1zXCJdID0gXCJnc1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRMaW5lQ2FwU3R5bGVcIl0gPSBcIkpcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0TGluZURhc2hQYXR0ZXJuXCJdID0gXCJkXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldExpbmVKb2luU3R5bGVcIl0gPSBcImpcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0TGluZU1pdGVyTGltaXRcIl0gPSBcIk1cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0TGluZVdpZHRoXCJdID0gXCJ3XCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFRleHRNYXRyaXhcIl0gPSBcIlRtXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFJlbmRlcmluZ0ludGVudFwiXSA9IFwicmlcIjtcbiAgICAvLyBHcmFwaGljcyBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQXBwZW5kUmVjdGFuZ2xlXCJdID0gXCJyZVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpbklubGluZUltYWdlXCJdID0gXCJCSVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpbklubGluZUltYWdlRGF0YVwiXSA9IFwiSURcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRW5kSW5saW5lSW1hZ2VcIl0gPSBcIkVJXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsaXBFdmVuT2RkXCJdID0gXCJXKlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDbGlwTm9uWmVyb1wiXSA9IFwiV1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDbG9zZUFuZFN0cm9rZVwiXSA9IFwic1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDbG9zZUZpbGxFdmVuT2RkQW5kU3Ryb2tlXCJdID0gXCJiKlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDbG9zZUZpbGxOb25aZXJvQW5kU3Ryb2tlXCJdID0gXCJiXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsb3NlUGF0aFwiXSA9IFwiaFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJBcHBlbmRCZXppZXJDdXJ2ZVwiXSA9IFwiY1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDdXJ2ZVRvUmVwbGljYXRlRmluYWxQb2ludFwiXSA9IFwieVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDdXJ2ZVRvUmVwbGljYXRlSW5pdGlhbFBvaW50XCJdID0gXCJ2XCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkVuZFBhdGhcIl0gPSBcIm5cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRmlsbEV2ZW5PZGRBbmRTdHJva2VcIl0gPSBcIkIqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkZpbGxFdmVuT2RkXCJdID0gXCJmKlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJGaWxsTm9uWmVyb0FuZFN0cm9rZVwiXSA9IFwiQlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJGaWxsTm9uWmVyb1wiXSA9IFwiZlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJMZWdhY3lGaWxsTm9uWmVyb1wiXSA9IFwiRlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJMaW5lVG9cIl0gPSBcImxcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTW92ZVRvXCJdID0gXCJtXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNoYWRpbmdGaWxsXCJdID0gXCJzaFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2VQYXRoXCJdID0gXCJTXCI7XG4gICAgLy8gVGV4dCBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQmVnaW5UZXh0XCJdID0gXCJCVFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJFbmRUZXh0XCJdID0gXCJFVFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJNb3ZlVGV4dFwiXSA9IFwiVGRcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTW92ZVRleHRTZXRMZWFkaW5nXCJdID0gXCJURFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJOZXh0TGluZVwiXSA9IFwiVCpcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0Q2hhcmFjdGVyU3BhY2luZ1wiXSA9IFwiVGNcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0Rm9udEFuZFNpemVcIl0gPSBcIlRmXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFRleHRIb3Jpem9udGFsU2NhbGluZ1wiXSA9IFwiVHpcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0VGV4dExpbmVIZWlnaHRcIl0gPSBcIlRMXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFRleHRSZW5kZXJpbmdNb2RlXCJdID0gXCJUclwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRUZXh0UmlzZVwiXSA9IFwiVHNcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0V29yZFNwYWNpbmdcIl0gPSBcIlR3XCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNob3dUZXh0XCJdID0gXCJUalwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTaG93VGV4dEFkanVzdGVkXCJdID0gXCJUSlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTaG93VGV4dExpbmVcIl0gPSBcIidcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2hvd1RleHRMaW5lQW5kU3BhY2VcIl0gPSBcIlxcXCJcIjtcbiAgICAvLyBUeXBlMyBGb250IE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJUeXBlM0QwXCJdID0gXCJkMFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJUeXBlM0QxXCJdID0gXCJkMVwiO1xuICAgIC8vIENvbXBhdGliaWxpdHkgU2VjdGlvbiBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQmVnaW5Db21wYXRpYmlsaXR5U2VjdGlvblwiXSA9IFwiQlhcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRW5kQ29tcGF0aWJpbGl0eVNlY3Rpb25cIl0gPSBcIkVYXCI7XG59KShQREZPcGVyYXRvck5hbWVzIHx8IChQREZPcGVyYXRvck5hbWVzID0ge30pKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9wZXJhdG9yTmFtZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPcGVyYXRvck5hbWVzLmpzLm1hcCIsImltcG9ydCB7IE51bWJlclBhcnNpbmdFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IElzRGlnaXQsIElzTnVtZXJpYyB9IGZyb20gXCIuLi9zeW50YXgvTnVtZXJpY1wiO1xuaW1wb3J0IHsgSXNXaGl0ZXNwYWNlIH0gZnJvbSBcIi4uL3N5bnRheC9XaGl0ZXNwYWNlXCI7XG5pbXBvcnQgeyBjaGFyRnJvbUNvZGUgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBOZXdsaW5lID0gQ2hhckNvZGVzLk5ld2xpbmUsIENhcnJpYWdlUmV0dXJuID0gQ2hhckNvZGVzLkNhcnJpYWdlUmV0dXJuO1xuLy8gVE9ETzogVGhyb3cgZXJyb3IgaWYgZW9mIGlzIHJlYWNoZWQgYmVmb3JlIGZpbmlzaGluZyBvYmplY3QgcGFyc2UuLi5cbnZhciBCYXNlUGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VQYXJzZXIoYnl0ZXMsIGNhcE51bWJlcnMpIHtcbiAgICAgICAgaWYgKGNhcE51bWJlcnMgPT09IHZvaWQgMCkgeyBjYXBOdW1iZXJzID0gZmFsc2U7IH1cbiAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzO1xuICAgICAgICB0aGlzLmNhcE51bWJlcnMgPSBjYXBOdW1iZXJzO1xuICAgIH1cbiAgICBCYXNlUGFyc2VyLnByb3RvdHlwZS5wYXJzZVJhd0ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoIUlzRGlnaXRbYnl0ZV0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB2YWx1ZSArPSBjaGFyRnJvbUNvZGUodGhpcy5ieXRlcy5uZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmICghdmFsdWUgfHwgIWlzRmluaXRlKG51bWJlclZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlclBhcnNpbmdFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyVmFsdWU7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBNYXliZSBoYW5kbGUgZXhwb25lbnRpYWwgZm9ybWF0P1xuICAgIC8vIFRPRE86IENvbXBhcmUgcGVyZm9ybWFuY2Ugb2Ygc3RyaW5nIGNvbmNhdGVuYXRpb24gdG8gY2hhckZyb21Db2RlKC4uLmJ5dGVzKVxuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnBhcnNlUmF3TnVtYmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgLy8gUGFyc2UgaW50ZWdlci1wYXJ0LCB0aGUgbGVhZGluZyAoKyB8IC0gfCAuIHwgMC05KVxuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKCFJc051bWVyaWNbYnl0ZV0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB2YWx1ZSArPSBjaGFyRnJvbUNvZGUodGhpcy5ieXRlcy5uZXh0KCkpO1xuICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5QZXJpb2QpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGFyc2UgZGVjaW1hbC1wYXJ0LCB0aGUgdHJhaWxpbmcgKDAtOSlcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIGlmICghSXNEaWdpdFtieXRlXSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHZhbHVlICs9IGNoYXJGcm9tQ29kZSh0aGlzLmJ5dGVzLm5leHQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG51bWJlclZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAhaXNGaW5pdGUobnVtYmVyVmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyUGFyc2luZ0Vycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW1iZXJWYWx1ZSA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYXBOdW1iZXJzKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IFwiUGFyc2VkIG51bWJlciB0aGF0IGlzIHRvbyBsYXJnZSBmb3Igc29tZSBQREYgcmVhZGVyczogXCIgKyB2YWx1ZSArIFwiLCB1c2luZyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiBpbnN0ZWFkLlwiO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBtc2cgPSBcIlBhcnNlZCBudW1iZXIgdGhhdCBpcyB0b28gbGFyZ2UgZm9yIHNvbWUgUERGIHJlYWRlcnM6IFwiICsgdmFsdWUgKyBcIiwgbm90IGNhcHBpbmcuXCI7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bWJlclZhbHVlO1xuICAgIH07XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUuc2tpcFdoaXRlc3BhY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkgJiYgSXNXaGl0ZXNwYWNlW3RoaXMuYnl0ZXMucGVlaygpXSkge1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnNraXBMaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKGJ5dGUgPT09IE5ld2xpbmUgfHwgYnl0ZSA9PT0gQ2FycmlhZ2VSZXR1cm4pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnNraXBDb21tZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5ieXRlcy5wZWVrKCkgIT09IENoYXJDb2Rlcy5QZXJjZW50KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKGJ5dGUgPT09IE5ld2xpbmUgfHwgYnl0ZSA9PT0gQ2FycmlhZ2VSZXR1cm4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2UoKTtcbiAgICAgICAgd2hpbGUgKHRoaXMuc2tpcENvbW1lbnQoKSlcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2UoKTtcbiAgICB9O1xuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLm1hdGNoS2V5d29yZCA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2V5d29yZC5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ5dGVzLmRvbmUoKSB8fCB0aGlzLmJ5dGVzLm5leHQoKSAhPT0ga2V5d29yZFtpZHhdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8oaW5pdGlhbE9mZnNldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgcmV0dXJuIEJhc2VQYXJzZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQmFzZVBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhc2VQYXJzZXIuanMubWFwIiwiaW1wb3J0IHsgTmV4dEJ5dGVBc3NlcnRpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IGRlY29kZVBERlJhd1N0cmVhbSB9IGZyb20gXCIuLi9zdHJlYW1zL2RlY29kZVwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuLy8gVE9ETzogU2VlIGhvdyBsaW5lL2NvbCB0cmFja2luZyBhZmZlY3RzIHBlcmZvcm1hbmNlXG52YXIgQnl0ZVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCeXRlU3RyZWFtKGJ5dGVzKSB7XG4gICAgICAgIHRoaXMuaWR4ID0gMDtcbiAgICAgICAgdGhpcy5saW5lID0gMDtcbiAgICAgICAgdGhpcy5jb2x1bW4gPSAwO1xuICAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5ieXRlcy5sZW5ndGg7XG4gICAgfVxuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLm1vdmVUbyA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5pZHggPSBvZmZzZXQ7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXNbdGhpcy5pZHgrK107XG4gICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTmV3bGluZSkge1xuICAgICAgICAgICAgdGhpcy5saW5lICs9IDE7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbiArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUuYXNzZXJ0TmV4dCA9IGZ1bmN0aW9uIChleHBlY3RlZCkge1xuICAgICAgICBpZiAodGhpcy5wZWVrKCkgIT09IGV4cGVjdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTmV4dEJ5dGVBc3NlcnRpb25FcnJvcih0aGlzLnBvc2l0aW9uKCksIGV4cGVjdGVkLCB0aGlzLnBlZWsoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5pZHhdO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUucGVla0FoZWFkID0gZnVuY3Rpb24gKHN0ZXBzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMuaWR4ICsgc3RlcHNdO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUucGVla0F0ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc1tvZmZzZXRdO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUuZG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWR4ID49IHRoaXMubGVuZ3RoO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZHg7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUucG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7IGxpbmU6IHRoaXMubGluZSwgY29sdW1uOiB0aGlzLmNvbHVtbiwgb2Zmc2V0OiB0aGlzLmlkeCB9O1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5vZiA9IGZ1bmN0aW9uIChieXRlcykgeyByZXR1cm4gbmV3IEJ5dGVTdHJlYW0oYnl0ZXMpOyB9O1xuICAgIEJ5dGVTdHJlYW0uZnJvbVBERlJhd1N0cmVhbSA9IGZ1bmN0aW9uIChyYXdTdHJlYW0pIHtcbiAgICAgICAgcmV0dXJuIEJ5dGVTdHJlYW0ub2YoZGVjb2RlUERGUmF3U3RyZWFtKHJhd1N0cmVhbSkuZGVjb2RlKCkpO1xuICAgIH07XG4gICAgcmV0dXJuIEJ5dGVTdHJlYW07XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQnl0ZVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJ5dGVTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQREZPYmplY3RQYXJzaW5nRXJyb3IsIFBERlN0cmVhbVBhcnNpbmdFcnJvciwgVW5iYWxhbmNlZFBhcmVudGhlc2lzRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGQm9vbCBmcm9tIFwiLi4vb2JqZWN0cy9QREZCb29sXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bGwgZnJvbSBcIi4uL29iamVjdHMvUERGTnVsbFwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZSYXdTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGUmF3U3RyZWFtXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBCYXNlUGFyc2VyIGZyb20gXCIuL0Jhc2VQYXJzZXJcIjtcbmltcG9ydCBCeXRlU3RyZWFtIGZyb20gXCIuL0J5dGVTdHJlYW1cIjtcbmltcG9ydCBQREZDYXRhbG9nIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERkNhdGFsb2dcIjtcbmltcG9ydCBQREZQYWdlTGVhZiBmcm9tIFwiLi4vc3RydWN0dXJlcy9QREZQYWdlTGVhZlwiO1xuaW1wb3J0IFBERlBhZ2VUcmVlIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERlBhZ2VUcmVlXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBJc0RlbGltaXRlciB9IGZyb20gXCIuLi9zeW50YXgvRGVsaW1pdGVyc1wiO1xuaW1wb3J0IHsgS2V5d29yZHMgfSBmcm9tIFwiLi4vc3ludGF4L0tleXdvcmRzXCI7XG5pbXBvcnQgeyBJc0RpZ2l0LCBJc051bWVyaWMgfSBmcm9tIFwiLi4vc3ludGF4L051bWVyaWNcIjtcbmltcG9ydCB7IElzV2hpdGVzcGFjZSB9IGZyb20gXCIuLi9zeW50YXgvV2hpdGVzcGFjZVwiO1xuaW1wb3J0IHsgY2hhckZyb21Db2RlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vLyBUT0RPOiBUaHJvdyBlcnJvciBpZiBlb2YgaXMgcmVhY2hlZCBiZWZvcmUgZmluaXNoaW5nIG9iamVjdCBwYXJzZS4uLlxudmFyIFBERk9iamVjdFBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGT2JqZWN0UGFyc2VyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk9iamVjdFBhcnNlcihieXRlU3RyZWFtLCBjb250ZXh0LCBjYXBOdW1iZXJzKSB7XG4gICAgICAgIGlmIChjYXBOdW1iZXJzID09PSB2b2lkIDApIHsgY2FwTnVtYmVycyA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGJ5dGVTdHJlYW0sIGNhcE51bWJlcnMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIFRPRE86IElzIGl0IHBvc3NpYmxlIHRvIHJlZHVjZSBkdXBsaWNhdGUgcGFyc2luZyBmb3IgcmVmIGxvb2thaGVhZHM/XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy50cnVlKSlcbiAgICAgICAgICAgIHJldHVybiBQREZCb29sLlRydWU7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5mYWxzZSkpXG4gICAgICAgICAgICByZXR1cm4gUERGQm9vbC5GYWxzZTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLm51bGwpKVxuICAgICAgICAgICAgcmV0dXJuIFBERk51bGw7XG4gICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTGVzc1RoYW4gJiZcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMucGVla0FoZWFkKDEpID09PSBDaGFyQ29kZXMuTGVzc1RoYW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGljdE9yU3RyZWFtKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZXNzVGhhbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlSGV4U3RyaW5nKCk7XG4gICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTGVmdFBhcmVuKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VTdHJpbmcoKTtcbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5Gb3J3YXJkU2xhc2gpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU5hbWUoKTtcbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZWZ0U3F1YXJlQnJhY2tldClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlQXJyYXkoKTtcbiAgICAgICAgaWYgKElzTnVtZXJpY1tieXRlXSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVtYmVyT3JSZWYoKTtcbiAgICAgICAgdGhyb3cgbmV3IFBERk9iamVjdFBhcnNpbmdFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCksIGJ5dGUpO1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZU51bWJlck9yUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZmlyc3ROdW0gPSB0aGlzLnBhcnNlUmF3TnVtYmVyKCk7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgbG9va2FoZWFkU3RhcnQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICBpZiAoSXNEaWdpdFt0aGlzLmJ5dGVzLnBlZWsoKV0pIHtcbiAgICAgICAgICAgIHZhciBzZWNvbmROdW0gPSB0aGlzLnBhcnNlUmF3TnVtYmVyKCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ5dGVzLnBlZWsoKSA9PT0gQ2hhckNvZGVzLlIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLlIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQREZSZWYub2YoZmlyc3ROdW0sIHNlY29uZE51bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8obG9va2FoZWFkU3RhcnQpO1xuICAgICAgICByZXR1cm4gUERGTnVtYmVyLm9mKGZpcnN0TnVtKTtcbiAgICB9O1xuICAgIC8vIFRPRE86IE1heWJlIHVwZGF0ZSBQREZIZXhTdHJpbmcub2YoKSBsb2dpYyB0byByZW1vdmUgd2hpdGVzcGFjZSBhbmQgdmFsaWRhdGUgaW5wdXQ/XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZUhleFN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuTGVzc1RoYW4pO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpICYmIHRoaXMuYnl0ZXMucGVlaygpICE9PSBDaGFyQ29kZXMuR3JlYXRlclRoYW4pIHtcbiAgICAgICAgICAgIHZhbHVlICs9IGNoYXJGcm9tQ29kZSh0aGlzLmJ5dGVzLm5leHQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5HcmVhdGVyVGhhbik7XG4gICAgICAgIHJldHVybiBQREZIZXhTdHJpbmcub2YodmFsdWUpO1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5lc3RpbmdMdmwgPSAwO1xuICAgICAgICB2YXIgaXNFc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICAgICAgdmFsdWUgKz0gY2hhckZyb21Db2RlKGJ5dGUpO1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHVuZXNjYXBlZCBwYXJlbnRoZXNpc1xuICAgICAgICAgICAgaWYgKCFpc0VzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkxlZnRQYXJlbilcbiAgICAgICAgICAgICAgICAgICAgbmVzdGluZ0x2bCArPSAxO1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuUmlnaHRQYXJlbilcbiAgICAgICAgICAgICAgICAgICAgbmVzdGluZ0x2bCAtPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJhY2sgd2hldGhlciBjdXJyZW50IGNoYXJhY3RlciBpcyBiZWluZyBlc2NhcGVkIG9yIG5vdFxuICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5CYWNrU2xhc2gpIHtcbiAgICAgICAgICAgICAgICBpc0VzY2FwZWQgPSAhaXNFc2NhcGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNFc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgaXNFc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPbmNlIChpZikgdGhlIHVuZXNjYXBlZCBwYXJlbnRoZXNpcyBiYWxhbmNlIG91dCwgcmV0dXJuIHRoZWlyIGNvbnRlbnRzXG4gICAgICAgICAgICBpZiAobmVzdGluZ0x2bCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb3V0ZXIgcGFyZW5zIHNvIHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlIGNvbnRlbnRzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBERlN0cmluZy5vZih2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCkpO1xuICAgIH07XG4gICAgLy8gVE9ETzogQ29tcGFyZSBwZXJmb3JtYW5jZSBvZiBzdHJpbmcgY29uY2F0ZW5hdGlvbiB0byBjaGFyRnJvbUNvZGUoLi4uYnl0ZXMpXG4gICAgLy8gVE9ETzogTWF5YmUgcHJlYWxsb2NhdGUgc21hbGwgVWludDhBcnJheSBpZiBjYW4gdXNlIGNoYXJGcm9tQ29kZT9cbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5Gb3J3YXJkU2xhc2gpO1xuICAgICAgICB2YXIgbmFtZSA9ICcnO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKElzV2hpdGVzcGFjZVtieXRlXSB8fCBJc0RlbGltaXRlcltieXRlXSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIG5hbWUgKz0gY2hhckZyb21Db2RlKGJ5dGUpO1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBERk5hbWUub2YobmFtZSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuTGVmdFNxdWFyZUJyYWNrZXQpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIHBkZkFycmF5ID0gUERGQXJyYXkud2l0aENvbnRleHQodGhpcy5jb250ZXh0KTtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnl0ZXMucGVlaygpICE9PSBDaGFyQ29kZXMuUmlnaHRTcXVhcmVCcmFja2V0KSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VPYmplY3QoKTtcbiAgICAgICAgICAgIHBkZkFycmF5LnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLlJpZ2h0U3F1YXJlQnJhY2tldCk7XG4gICAgICAgIHJldHVybiBwZGZBcnJheTtcbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkxlc3NUaGFuKTtcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5MZXNzVGhhbik7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgZGljdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSAmJlxuICAgICAgICAgICAgdGhpcy5ieXRlcy5wZWVrKCkgIT09IENoYXJDb2Rlcy5HcmVhdGVyVGhhbiAmJlxuICAgICAgICAgICAgdGhpcy5ieXRlcy5wZWVrQWhlYWQoMSkgIT09IENoYXJDb2Rlcy5HcmVhdGVyVGhhbikge1xuICAgICAgICAgICAgdmFyIGtleSA9IHRoaXMucGFyc2VOYW1lKCk7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnBhcnNlT2JqZWN0KCk7XG4gICAgICAgICAgICBkaWN0LnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkdyZWF0ZXJUaGFuKTtcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5HcmVhdGVyVGhhbik7XG4gICAgICAgIHZhciBUeXBlID0gZGljdC5nZXQoUERGTmFtZS5vZignVHlwZScpKTtcbiAgICAgICAgaWYgKFR5cGUgPT09IFBERk5hbWUub2YoJ0NhdGFsb2cnKSkge1xuICAgICAgICAgICAgcmV0dXJuIFBERkNhdGFsb2cuZnJvbU1hcFdpdGhDb250ZXh0KGRpY3QsIHRoaXMuY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoVHlwZSA9PT0gUERGTmFtZS5vZignUGFnZXMnKSkge1xuICAgICAgICAgICAgcmV0dXJuIFBERlBhZ2VUcmVlLmZyb21NYXBXaXRoQ29udGV4dChkaWN0LCB0aGlzLmNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFR5cGUgPT09IFBERk5hbWUub2YoJ1BhZ2UnKSkge1xuICAgICAgICAgICAgcmV0dXJuIFBERlBhZ2VMZWFmLmZyb21NYXBXaXRoQ29udGV4dChkaWN0LCB0aGlzLmNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBERkRpY3QuZnJvbU1hcFdpdGhDb250ZXh0KGRpY3QsIHRoaXMuY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VEaWN0T3JTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuYnl0ZXMucG9zaXRpb24oKTtcbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLnBhcnNlRGljdCgpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdHJlYW1FT0YxKSAmJlxuICAgICAgICAgICAgIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbUVPRjIpICYmXG4gICAgICAgICAgICAhdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RyZWFtRU9GMykgJiZcbiAgICAgICAgICAgICF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdHJlYW1FT0Y0KSAmJlxuICAgICAgICAgICAgIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkaWN0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgIHZhciBlbmQ7XG4gICAgICAgIHZhciBMZW5ndGggPSBkaWN0LmdldChQREZOYW1lLm9mKCdMZW5ndGgnKSk7XG4gICAgICAgIGlmIChMZW5ndGggaW5zdGFuY2VvZiBQREZOdW1iZXIpIHtcbiAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgTGVuZ3RoLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhlbmQpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVuZHN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhzdGFydCk7XG4gICAgICAgICAgICAgICAgZW5kID0gdGhpcy5maW5kRW5kT2ZTdHJlYW1GYWxsYmFjayhzdGFydFBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmZpbmRFbmRPZlN0cmVhbUZhbGxiYWNrKHN0YXJ0UG9zKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudHMgPSB0aGlzLmJ5dGVzLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgICByZXR1cm4gUERGUmF3U3RyZWFtLm9mKGRpY3QsIGNvbnRlbnRzKTtcbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUuZmluZEVuZE9mU3RyZWFtRmFsbGJhY2sgPSBmdW5jdGlvbiAoc3RhcnRQb3MpIHtcbiAgICAgICAgLy8gTW92ZSB0byBlbmQgb2Ygc3RyZWFtLCB3aGlsZSBoYW5kbGluZyBuZXN0ZWQgc3RyZWFtc1xuICAgICAgICB2YXIgbmVzdGluZ0x2bCA9IDE7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICBuZXN0aW5nTHZsICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5FT0YxZW5kc3RyZWFtKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLkVPRjJlbmRzdHJlYW0pIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuRU9GM2VuZHN0cmVhbSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lbmRzdHJlYW0pKSB7XG4gICAgICAgICAgICAgICAgbmVzdGluZ0x2bCAtPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmVzdGluZ0x2bCA9PT0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAobmVzdGluZ0x2bCAhPT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBQREZTdHJlYW1QYXJzaW5nRXJyb3Ioc3RhcnRQb3MpO1xuICAgICAgICByZXR1cm4gZW5kO1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLmZvckJ5dGVzID0gZnVuY3Rpb24gKGJ5dGVzLCBjb250ZXh0LCBjYXBOdW1iZXJzKSB7IHJldHVybiBuZXcgUERGT2JqZWN0UGFyc2VyKEJ5dGVTdHJlYW0ub2YoYnl0ZXMpLCBjb250ZXh0LCBjYXBOdW1iZXJzKTsgfTtcbiAgICBQREZPYmplY3RQYXJzZXIuZm9yQnl0ZVN0cmVhbSA9IGZ1bmN0aW9uIChieXRlU3RyZWFtLCBjb250ZXh0LCBjYXBOdW1iZXJzKSB7XG4gICAgICAgIGlmIChjYXBOdW1iZXJzID09PSB2b2lkIDApIHsgY2FwTnVtYmVycyA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiBuZXcgUERGT2JqZWN0UGFyc2VyKGJ5dGVTdHJlYW0sIGNvbnRleHQsIGNhcE51bWJlcnMpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9iamVjdFBhcnNlcjtcbn0oQmFzZVBhcnNlcikpO1xuZXhwb3J0IGRlZmF1bHQgUERGT2JqZWN0UGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT2JqZWN0UGFyc2VyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUmVwYXJzZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgQnl0ZVN0cmVhbSBmcm9tIFwiLi9CeXRlU3RyZWFtXCI7XG5pbXBvcnQgUERGT2JqZWN0UGFyc2VyIGZyb20gXCIuL1BERk9iamVjdFBhcnNlclwiO1xuaW1wb3J0IHsgd2FpdEZvclRpY2sgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZPYmplY3RTdHJlYW1QYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk9iamVjdFN0cmVhbVBhcnNlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZPYmplY3RTdHJlYW1QYXJzZXIocmF3U3RyZWFtLCBzaG91bGRXYWl0Rm9yVGljaykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBCeXRlU3RyZWFtLmZyb21QREZSYXdTdHJlYW0ocmF3U3RyZWFtKSwgcmF3U3RyZWFtLmRpY3QuY29udGV4dCkgfHwgdGhpcztcbiAgICAgICAgdmFyIGRpY3QgPSByYXdTdHJlYW0uZGljdDtcbiAgICAgICAgX3RoaXMuYWxyZWFkeVBhcnNlZCA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5zaG91bGRXYWl0Rm9yVGljayA9IHNob3VsZFdhaXRGb3JUaWNrIHx8IChmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfSk7XG4gICAgICAgIF90aGlzLmZpcnN0T2Zmc2V0ID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignRmlyc3QnKSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICBfdGhpcy5vYmplY3RDb3VudCA9IGRpY3QubG9va3VwKFBERk5hbWUub2YoJ04nKSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERk9iamVjdFN0cmVhbVBhcnNlci5wcm90b3R5cGUucGFyc2VJbnRvQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldHNBbmRPYmplY3ROdW1iZXJzLCBpZHgsIGxlbiwgX2EsIG9iamVjdE51bWJlciwgb2Zmc2V0LCBvYmplY3QsIHJlZjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFscmVhZHlQYXJzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVwYXJzZUVycm9yKCdQREZPYmplY3RTdHJlYW1QYXJzZXInLCAncGFyc2VJbnRvQ29udGV4dCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5UGFyc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNBbmRPYmplY3ROdW1iZXJzID0gdGhpcy5wYXJzZU9mZnNldHNBbmRPYmplY3ROdW1iZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBvZmZzZXRzQW5kT2JqZWN0TnVtYmVycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBvZmZzZXRzQW5kT2JqZWN0TnVtYmVyc1tpZHhdLCBvYmplY3ROdW1iZXIgPSBfYS5vYmplY3ROdW1iZXIsIG9mZnNldCA9IF9hLm9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKHRoaXMuZmlyc3RPZmZzZXQgKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5wYXJzZU9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gUERGUmVmLm9mKG9iamVjdE51bWJlciwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYXNzaWduKHJlZiwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRXYWl0Rm9yVGljaygpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbVBhcnNlci5wcm90b3R5cGUucGFyc2VPZmZzZXRzQW5kT2JqZWN0TnVtYmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9mZnNldHNBbmRPYmplY3ROdW1iZXJzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub2JqZWN0Q291bnQ7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgdmFyIG9iamVjdE51bWJlciA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgIG9mZnNldHNBbmRPYmplY3ROdW1iZXJzLnB1c2goeyBvYmplY3ROdW1iZXI6IG9iamVjdE51bWJlciwgb2Zmc2V0OiBvZmZzZXQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldHNBbmRPYmplY3ROdW1iZXJzO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtUGFyc2VyLmZvclN0cmVhbSA9IGZ1bmN0aW9uIChyYXdTdHJlYW0sIHNob3VsZFdhaXRGb3JUaWNrKSB7IHJldHVybiBuZXcgUERGT2JqZWN0U3RyZWFtUGFyc2VyKHJhd1N0cmVhbSwgc2hvdWxkV2FpdEZvclRpY2spOyB9O1xuICAgIHJldHVybiBQREZPYmplY3RTdHJlYW1QYXJzZXI7XG59KFBERk9iamVjdFBhcnNlcikpO1xuZXhwb3J0IGRlZmF1bHQgUERGT2JqZWN0U3RyZWFtUGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT2JqZWN0U3RyZWFtUGFyc2VyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkNyb3NzUmVmU2VjdGlvbiBmcm9tIFwiLi4vZG9jdW1lbnQvUERGQ3Jvc3NSZWZTZWN0aW9uXCI7XG5pbXBvcnQgUERGSGVhZGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZIZWFkZXJcIjtcbmltcG9ydCBQREZUcmFpbGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZUcmFpbGVyXCI7XG5pbXBvcnQgeyBNaXNzaW5nS2V5d29yZEVycm9yLCBNaXNzaW5nUERGSGVhZGVyRXJyb3IsIFBERkludmFsaWRPYmplY3RQYXJzaW5nRXJyb3IsIFJlcGFyc2VFcnJvciwgU3RhbGxlZFBhcnNlckVycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZJbnZhbGlkT2JqZWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkludmFsaWRPYmplY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZSYXdTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGUmF3U3RyZWFtXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IEJ5dGVTdHJlYW0gZnJvbSBcIi4vQnl0ZVN0cmVhbVwiO1xuaW1wb3J0IFBERk9iamVjdFBhcnNlciBmcm9tIFwiLi9QREZPYmplY3RQYXJzZXJcIjtcbmltcG9ydCBQREZPYmplY3RTdHJlYW1QYXJzZXIgZnJvbSBcIi4vUERGT2JqZWN0U3RyZWFtUGFyc2VyXCI7XG5pbXBvcnQgUERGWFJlZlN0cmVhbVBhcnNlciBmcm9tIFwiLi9QREZYUmVmU3RyZWFtUGFyc2VyXCI7XG5pbXBvcnQgUERGQ29udGV4dCBmcm9tIFwiLi4vUERGQ29udGV4dFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgS2V5d29yZHMgfSBmcm9tIFwiLi4vc3ludGF4L0tleXdvcmRzXCI7XG5pbXBvcnQgeyBJc0RpZ2l0IH0gZnJvbSBcIi4uL3N5bnRheC9OdW1lcmljXCI7XG5pbXBvcnQgeyB3YWl0Rm9yVGljayB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERlBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUGFyc2VyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlBhcnNlcihwZGZCeXRlcywgb2JqZWN0c1BlclRpY2ssIHRocm93T25JbnZhbGlkT2JqZWN0LCBjYXBOdW1iZXJzKSB7XG4gICAgICAgIGlmIChvYmplY3RzUGVyVGljayA9PT0gdm9pZCAwKSB7IG9iamVjdHNQZXJUaWNrID0gSW5maW5pdHk7IH1cbiAgICAgICAgaWYgKHRocm93T25JbnZhbGlkT2JqZWN0ID09PSB2b2lkIDApIHsgdGhyb3dPbkludmFsaWRPYmplY3QgPSBmYWxzZTsgfVxuICAgICAgICBpZiAoY2FwTnVtYmVycyA9PT0gdm9pZCAwKSB7IGNhcE51bWJlcnMgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBCeXRlU3RyZWFtLm9mKHBkZkJ5dGVzKSwgUERGQ29udGV4dC5jcmVhdGUoKSwgY2FwTnVtYmVycykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuYWxyZWFkeVBhcnNlZCA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5wYXJzZWRPYmplY3RzID0gMDtcbiAgICAgICAgX3RoaXMuc2hvdWxkV2FpdEZvclRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5wYXJzZWRPYmplY3RzICs9IDE7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMucGFyc2VkT2JqZWN0cyAlIF90aGlzLm9iamVjdHNQZXJUaWNrID09PSAwO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5vYmplY3RzUGVyVGljayA9IG9iamVjdHNQZXJUaWNrO1xuICAgICAgICBfdGhpcy50aHJvd09uSW52YWxpZE9iamVjdCA9IHRocm93T25JbnZhbGlkT2JqZWN0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlBhcnNlci5wcm90b3R5cGUucGFyc2VEb2N1bWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHByZXZPZmZzZXQsIG9mZnNldDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFscmVhZHlQYXJzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVwYXJzZUVycm9yKCdQREZQYXJzZXInLCAncGFyc2VEb2N1bWVudCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5UGFyc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5oZWFkZXIgPSB0aGlzLnBhcnNlSGVhZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMuYnl0ZXMuZG9uZSgpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucGFyc2VEb2N1bWVudFNlY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSBwcmV2T2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0YWxsZWRQYXJzZXJFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldk9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heWJlUmVjb3ZlclJvb3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQubG9va3VwKFBERlJlZi5vZigwKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbW92aW5nIHBhcnNlZCBvYmplY3Q6IDAgMCBSJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRlbGV0ZShQREZSZWYub2YoMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY29udGV4dF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5tYXliZVJlY292ZXJSb290ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXNWYWxpZENhdGFsb2cgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgUERGRGljdCAmJlxuICAgICAgICAgICAgICAgIG9iai5sb29rdXAoUERGTmFtZS5vZignVHlwZScpKSA9PT0gUERGTmFtZS5vZignQ2F0YWxvZycpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgY2F0YWxvZyA9IHRoaXMuY29udGV4dC5sb29rdXAodGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QpO1xuICAgICAgICBpZiAoIWlzVmFsaWRDYXRhbG9nKGNhdGFsb2cpKSB7XG4gICAgICAgICAgICB2YXIgaW5kaXJlY3RPYmplY3RzID0gdGhpcy5jb250ZXh0LmVudW1lcmF0ZUluZGlyZWN0T2JqZWN0cygpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gaW5kaXJlY3RPYmplY3RzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IGluZGlyZWN0T2JqZWN0c1tpZHhdLCByZWYgPSBfYVswXSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgICAgICAgICAgaWYgKGlzVmFsaWRDYXRhbG9nKG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QgPSByZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnBhcnNlSGVhZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuaGVhZGVyKSkge1xuICAgICAgICAgICAgICAgIHZhciBtYWpvciA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLlBlcmlvZCk7XG4gICAgICAgICAgICAgICAgdmFyIG1pbm9yID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICAgICAgICAgIHZhciBoZWFkZXIgPSBQREZIZWFkZXIuZm9yVmVyc2lvbihtYWpvciwgbWlub3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcEJpbmFyeUhlYWRlckNvbW1lbnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQREZIZWFkZXJFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCkpO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZUluZGlyZWN0T2JqZWN0SGVhZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIG9iamVjdE51bWJlciA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBnZW5lcmF0aW9uTnVtYmVyID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5vYmopKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0tleXdvcmRFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCksIEtleXdvcmRzLm9iaik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBERlJlZi5vZihvYmplY3ROdW1iZXIsIGdlbmVyYXRpb25OdW1iZXIpO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5tYXRjaEluZGlyZWN0T2JqZWN0SGVhZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3RIZWFkZXIoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhpbml0aWFsT2Zmc2V0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZUluZGlyZWN0T2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVmLCBvYmplY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5wYXJzZU9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVuZG9iaikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93IG5ldyBNaXNzaW5nS2V5d29yZEVycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSwgS2V5d29yZHMuZW5kb2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IExvZyBhIHdhcm5pbmcgaWYgdGhpcyBmYWlscy4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW5kb2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFBERlJhd1N0cmVhbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdUeXBlJykpID09PSBQREZOYW1lLm9mKCdPYmpTdG0nKSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUERGT2JqZWN0U3RyZWFtUGFyc2VyLmZvclN0cmVhbShvYmplY3QsIHRoaXMuc2hvdWxkV2FpdEZvclRpY2spLnBhcnNlSW50b0NvbnRleHQoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUERGUmF3U3RyZWFtICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1R5cGUnKSkgPT09IFBERk5hbWUub2YoJ1hSZWYnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERlhSZWZTdHJlYW1QYXJzZXIuZm9yU3RyZWFtKG9iamVjdCkucGFyc2VJbnRvQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFzc2lnbihyZWYsIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVE9ETzogSW1wcm92ZSBhbmQgY2xlYW4gdGhpcyB1cFxuICAgIFBERlBhcnNlci5wcm90b3R5cGUudHJ5VG9QYXJzZUludmFsaWRJbmRpcmVjdE9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5ieXRlcy5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgbXNnID0gXCJUcnlpbmcgdG8gcGFyc2UgaW52YWxpZCBvYmplY3Q6IFwiICsgSlNPTi5zdHJpbmdpZnkoc3RhcnRQb3MpICsgXCIpXCI7XG4gICAgICAgIGlmICh0aGlzLnRocm93T25JbnZhbGlkT2JqZWN0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5wYXJzZUluZGlyZWN0T2JqZWN0SGVhZGVyKCk7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkludmFsaWQgb2JqZWN0IHJlZjogXCIgKyByZWYpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgdmFyIGZhaWxlZCA9IHRydWU7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lbmRvYmopKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZhaWxlZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvcihzdGFydFBvcyk7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpIC0gS2V5d29yZHMuZW5kb2JqLmxlbmd0aDtcbiAgICAgICAgdmFyIG9iamVjdCA9IFBERkludmFsaWRPYmplY3Qub2YodGhpcy5ieXRlcy5zbGljZShzdGFydCwgZW5kKSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5hc3NpZ24ocmVmLCBvYmplY3QpO1xuICAgICAgICByZXR1cm4gcmVmO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZUluZGlyZWN0T2JqZWN0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQsIGVfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISghdGhpcy5ieXRlcy5kb25lKCkgJiYgSXNEaWdpdFt0aGlzLmJ5dGVzLnBlZWsoKV0pKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxPZmZzZXQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzIsIDQsICwgNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5wYXJzZUluZGlyZWN0T2JqZWN0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQWRkIHRyYWNpbmcvbG9nZ2luZyBtZWNoYW5pc20gdG8gdHJhY2sgd2hlbiB0aGlzIGhhcHBlbnMhXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhpbml0aWFsT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9QYXJzZUludmFsaWRJbmRpcmVjdE9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ2FuIHRoaXMgYmUgZG9uZSBvbmx5IHdoZW4gbmVlZGVkLCB0byBhdm9pZCBoYXJtaW5nIHBlcmZvcm1hbmNlP1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwSmliYmVyaXNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEZvclRpY2soKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB3YWl0Rm9yVGljaygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLm1heWJlUGFyc2VDcm9zc1JlZlNlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnhyZWYpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIG9iamVjdE51bWJlciA9IC0xO1xuICAgICAgICB2YXIgeHJlZiA9IFBERkNyb3NzUmVmU2VjdGlvbi5jcmVhdGVFbXB0eSgpO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpICYmIElzRGlnaXRbdGhpcy5ieXRlcy5wZWVrKCldKSB7XG4gICAgICAgICAgICB2YXIgZmlyc3RJbnQgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgIHZhciBzZWNvbmRJbnQgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLm4gfHwgYnl0ZSA9PT0gQ2hhckNvZGVzLmYpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVmID0gUERGUmVmLm9mKG9iamVjdE51bWJlciwgc2Vjb25kSW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ieXRlcy5uZXh0KCkgPT09IENoYXJDb2Rlcy5uKSB7XG4gICAgICAgICAgICAgICAgICAgIHhyZWYuYWRkRW50cnkocmVmLCBmaXJzdEludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmNvbnRleHQuZGVsZXRlKHJlZik7XG4gICAgICAgICAgICAgICAgICAgIHhyZWYuYWRkRGVsZXRlZEVudHJ5KHJlZiwgZmlyc3RJbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvYmplY3ROdW1iZXIgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9iamVjdE51bWJlciA9IGZpcnN0SW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHhyZWY7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLm1heWJlUGFyc2VUcmFpbGVyRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMudHJhaWxlcikpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgZGljdCA9IHRoaXMucGFyc2VEaWN0KCk7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LnRyYWlsZXJJbmZvID0ge1xuICAgICAgICAgICAgUm9vdDogZGljdC5nZXQoUERGTmFtZS5vZignUm9vdCcpKSB8fCBjb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QsXG4gICAgICAgICAgICBFbmNyeXB0OiBkaWN0LmdldChQREZOYW1lLm9mKCdFbmNyeXB0JykpIHx8IGNvbnRleHQudHJhaWxlckluZm8uRW5jcnlwdCxcbiAgICAgICAgICAgIEluZm86IGRpY3QuZ2V0KFBERk5hbWUub2YoJ0luZm8nKSkgfHwgY29udGV4dC50cmFpbGVySW5mby5JbmZvLFxuICAgICAgICAgICAgSUQ6IGRpY3QuZ2V0KFBERk5hbWUub2YoJ0lEJykpIHx8IGNvbnRleHQudHJhaWxlckluZm8uSUQsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLm1heWJlUGFyc2VUcmFpbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdGFydHhyZWYpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZSgpO1xuICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lb2YpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW9mKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHJldHVybiBQREZUcmFpbGVyLmZvckxhc3RDcm9zc1JlZlNlY3Rpb25PZmZzZXQob2Zmc2V0KTtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUucGFyc2VEb2N1bWVudFNlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5wYXJzZUluZGlyZWN0T2JqZWN0cygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXliZVBhcnNlQ3Jvc3NSZWZTZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heWJlUGFyc2VUcmFpbGVyRGljdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXliZVBhcnNlVHJhaWxlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ2FuIHRoaXMgYmUgZG9uZSBvbmx5IHdoZW4gbmVlZGVkLCB0byBhdm9pZCBoYXJtaW5nIHBlcmZvcm1hbmNlP1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwSmliYmVyaXNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyBvcGVyYXRpb24gaXMgbm90IG5lY2Vzc2FyeSBmb3IgdmFsaWQgUERGIGZpbGVzLiBCdXQgc29tZSBpbnZhbGlkIFBERnNcbiAgICAgKiBjb250YWluIGppYmJlcmlzaCBpbiBiZXR3ZWVuIGluZGlyZWN0IG9iamVjdHMuIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvXG4gICAgICogc2tpcCBwYXN0IHRoYXQgamliYmVyaXNoLCBzaG91bGQgaXQgZXhpc3QsIHVudGlsIGl0IHJlYWNoZXMgdGhlIG5leHRcbiAgICAgKiBpbmRpcmVjdCBvYmplY3QgaGVhZGVyLCBhbiB4cmVmIHRhYmxlIHNlY3Rpb24sIG9yIHRoZSBmaWxlIHRyYWlsZXIuXG4gICAgICovXG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5za2lwSmliYmVyaXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIHZhciBpc0FscGhhTnVtZXJpYyA9IGJ5dGUgPj0gQ2hhckNvZGVzLlNwYWNlICYmIGJ5dGUgPD0gQ2hhckNvZGVzLlRpbGRlO1xuICAgICAgICAgICAgaWYgKGlzQWxwaGFOdW1lcmljKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnhyZWYpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnRyYWlsZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0YXJ0eHJlZikgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaEluZGlyZWN0T2JqZWN0SGVhZGVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8oaW5pdGlhbE9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTa2lwcyB0aGUgYmluYXJ5IGNvbW1lbnQgZm9sbG93aW5nIGEgUERGIGhlYWRlci4gVGhlIHNwZWNpZmljYXRpb25cbiAgICAgKiBkZWZpbmVzIHRoaXMgYmluYXJ5IGNvbW1lbnQgKHNlY3Rpb24gNy41LjIgRmlsZSBIZWFkZXIpIGFzIGEgc2VxdWVuY2Ugb2YgNFxuICAgICAqIG9yIG1vcmUgYnl0ZXMgdGhhdCBhcmUgMTI4IG9yIGdyZWF0ZXIsIGFuZCB3aGljaCBhcmUgcHJlY2VkZWQgYnkgYSBcIiVcIi5cbiAgICAgKlxuICAgICAqIFRoaXMgd291bGQgaW1wbHkgdGhhdCB0byBzdHJpcCBvdXQgdGhpcyBiaW5hcnkgY29tbWVudCwgd2UgY291bGQgY2hlY2sgZm9yXG4gICAgICogYSBzZXF1ZW5jZSBvZiBieXRlcyBzdGFydGluZyB3aXRoIFwiJVwiLCBhbmQgcmVtb3ZlIGFsbCBzdWJzZXF1ZW50IGJ5dGVzIHRoYXRcbiAgICAgKiBhcmUgMTI4IG9yIGdyZWF0ZXIuIFRoaXMgd29ya3MgZm9yIG1hbnkgZG9jdW1lbnRzIHRoYXQgcHJvcGVybHkgY29tcGx5IHdpdGhcbiAgICAgKiB0aGUgc3BlYy4gQnV0IGluIHRoZSB3aWxkLCB0aGVyZSBhcmUgUERGcyB0aGF0IG9taXQgdGhlIGxlYWRpbmcgXCIlXCIsIGFuZFxuICAgICAqIGluY2x1ZGUgYnl0ZXMgdGhhdCBhcmUgbGVzcyB0aGFuIDEyOCAoZS5nLiAwIG9yIDEpLiBTbyBpbiBvcmRlciB0byBwYXJzZVxuICAgICAqIHRoZXNlIGhlYWRlcnMgY29ycmVjdGx5LCB3ZSBqdXN0IHRocm93IG91dCBhbGwgYnl0ZXMgbGVhZGluZyB1cCB0byB0aGVcbiAgICAgKiBmaXJzdCBpbmRpcmVjdCBvYmplY3QgaGVhZGVyLlxuICAgICAqL1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUuc2tpcEJpbmFyeUhlYWRlckNvbW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICAgICAgdGhpcy5wYXJzZUluZGlyZWN0T2JqZWN0SGVhZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhpbml0aWFsT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGUGFyc2VyLmZvckJ5dGVzV2l0aE9wdGlvbnMgPSBmdW5jdGlvbiAocGRmQnl0ZXMsIG9iamVjdHNQZXJUaWNrLCB0aHJvd09uSW52YWxpZE9iamVjdCwgY2FwTnVtYmVycykge1xuICAgICAgICByZXR1cm4gbmV3IFBERlBhcnNlcihwZGZCeXRlcywgb2JqZWN0c1BlclRpY2ssIHRocm93T25JbnZhbGlkT2JqZWN0LCBjYXBOdW1iZXJzKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZQYXJzZXI7XG59KFBERk9iamVjdFBhcnNlcikpO1xuZXhwb3J0IGRlZmF1bHQgUERGUGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUGFyc2VyLmpzLm1hcCIsImltcG9ydCB7IFJlcGFyc2VFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgQnl0ZVN0cmVhbSBmcm9tIFwiLi9CeXRlU3RyZWFtXCI7XG52YXIgUERGWFJlZlN0cmVhbVBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZYUmVmU3RyZWFtUGFyc2VyKHJhd1N0cmVhbSkge1xuICAgICAgICB0aGlzLmFscmVhZHlQYXJzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaWN0ID0gcmF3U3RyZWFtLmRpY3Q7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBCeXRlU3RyZWFtLmZyb21QREZSYXdTdHJlYW0ocmF3U3RyZWFtKTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5kaWN0LmNvbnRleHQ7XG4gICAgICAgIHZhciBTaXplID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdTaXplJyksIFBERk51bWJlcik7XG4gICAgICAgIHZhciBJbmRleCA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignSW5kZXgnKSk7XG4gICAgICAgIGlmIChJbmRleCBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNlY3Rpb25zID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBJbmRleC5zaXplKCk7IGlkeCA8IGxlbjsgaWR4ICs9IDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3RPYmplY3ROdW1iZXIgPSBJbmRleC5sb29rdXAoaWR4ICsgMCwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGhfMSA9IEluZGV4Lmxvb2t1cChpZHggKyAxLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzZWN0aW9ucy5wdXNoKHsgZmlyc3RPYmplY3ROdW1iZXI6IGZpcnN0T2JqZWN0TnVtYmVyLCBsZW5ndGg6IGxlbmd0aF8xIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdWJzZWN0aW9ucyA9IFt7IGZpcnN0T2JqZWN0TnVtYmVyOiAwLCBsZW5ndGg6IFNpemUuYXNOdW1iZXIoKSB9XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgVyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignVycpLCBQREZBcnJheSk7XG4gICAgICAgIHRoaXMuYnl0ZVdpZHRocyA9IFstMSwgLTEsIC0xXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gVy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHRoaXMuYnl0ZVdpZHRoc1tpZHhdID0gVy5sb29rdXAoaWR4LCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUERGWFJlZlN0cmVhbVBhcnNlci5wcm90b3R5cGUucGFyc2VJbnRvQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxyZWFkeVBhcnNlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlcGFyc2VFcnJvcignUERGWFJlZlN0cmVhbVBhcnNlcicsICdwYXJzZUludG9Db250ZXh0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbHJlYWR5UGFyc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvID0ge1xuICAgICAgICAgICAgUm9vdDogdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdSb290JykpLFxuICAgICAgICAgICAgRW5jcnlwdDogdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdFbmNyeXB0JykpLFxuICAgICAgICAgICAgSW5mbzogdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdJbmZvJykpLFxuICAgICAgICAgICAgSUQ6IHRoaXMuZGljdC5nZXQoUERGTmFtZS5vZignSUQnKSksXG4gICAgICAgIH07XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5wYXJzZUVudHJpZXMoKTtcbiAgICAgICAgLy8gZm9yIChsZXQgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgLy8gY29uc3QgZW50cnkgPSBlbnRyaWVzW2lkeF07XG4gICAgICAgIC8vIGlmIChlbnRyeS5kZWxldGVkKSB0aGlzLmNvbnRleHQuZGVsZXRlKGVudHJ5LnJlZik7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfTtcbiAgICBQREZYUmVmU3RyZWFtUGFyc2VyLnByb3RvdHlwZS5wYXJzZUVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgICAgIHZhciBfYSA9IHRoaXMuYnl0ZVdpZHRocywgdHlwZUZpZWxkV2lkdGggPSBfYVswXSwgb2Zmc2V0RmllbGRXaWR0aCA9IF9hWzFdLCBnZW5GaWVsZFdpZHRoID0gX2FbMl07XG4gICAgICAgIGZvciAodmFyIHN1YnNlY3Rpb25JZHggPSAwLCBzdWJzZWN0aW9uTGVuID0gdGhpcy5zdWJzZWN0aW9ucy5sZW5ndGg7IHN1YnNlY3Rpb25JZHggPCBzdWJzZWN0aW9uTGVuOyBzdWJzZWN0aW9uSWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYiA9IHRoaXMuc3Vic2VjdGlvbnNbc3Vic2VjdGlvbklkeF0sIGZpcnN0T2JqZWN0TnVtYmVyID0gX2IuZmlyc3RPYmplY3ROdW1iZXIsIGxlbmd0aF8yID0gX2IubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgb2JqSWR4ID0gMDsgb2JqSWR4IDwgbGVuZ3RoXzI7IG9iaklkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHR5cGVGaWVsZFdpZHRoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAodHlwZSA8PCA4KSB8IHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvZmZzZXRGaWVsZFdpZHRoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IChvZmZzZXQgPDwgOCkgfCB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGdlbmVyYXRpb25OdW1iZXIgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdlbkZpZWxkV2lkdGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbk51bWJlciA9IChnZW5lcmF0aW9uTnVtYmVyIDw8IDgpIHwgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGB0eXBlYCBmaWVsZCBpcyBhYnNlbnQsIGl0IGRlZmF1bHRzIHRvIDFcbiAgICAgICAgICAgICAgICBpZiAodHlwZUZpZWxkV2lkdGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAxO1xuICAgICAgICAgICAgICAgIHZhciBvYmplY3ROdW1iZXIgPSBmaXJzdE9iamVjdE51bWJlciArIG9iaklkeDtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZjogUERGUmVmLm9mKG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVkOiB0eXBlID09PSAwLFxuICAgICAgICAgICAgICAgICAgICBpbk9iamVjdFN0cmVhbTogdHlwZSA9PT0gMixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfTtcbiAgICBQREZYUmVmU3RyZWFtUGFyc2VyLmZvclN0cmVhbSA9IGZ1bmN0aW9uIChyYXdTdHJlYW0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZYUmVmU3RyZWFtUGFyc2VyKHJhd1N0cmVhbSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGWFJlZlN0cmVhbVBhcnNlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZYUmVmU3RyZWFtUGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGWFJlZlN0cmVhbVBhcnNlci5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIEFzY2lpODVTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgQXNjaWk4NVN0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBEZWNvZGVTdHJlYW0gZnJvbSBcIi4vRGVjb2RlU3RyZWFtXCI7XG52YXIgaXNTcGFjZSA9IGZ1bmN0aW9uIChjaCkge1xuICAgIHJldHVybiBjaCA9PT0gMHgyMCB8fCBjaCA9PT0gMHgwOSB8fCBjaCA9PT0gMHgwZCB8fCBjaCA9PT0gMHgwYTtcbn07XG52YXIgQXNjaWk4NVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXNjaWk4NVN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBc2NpaTg1U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgX3RoaXMuaW5wdXQgPSBuZXcgVWludDhBcnJheSg1KTtcbiAgICAgICAgLy8gTW9zdCBzdHJlYW1zIGluY3JlYXNlIGluIHNpemUgd2hlbiBkZWNvZGVkLCBidXQgQXNjaWk4NSBzdHJlYW1zXG4gICAgICAgIC8vIHR5cGljYWxseSBzaHJpbmsgYnkgfjIwJS5cbiAgICAgICAgaWYgKG1heWJlTGVuZ3RoKSB7XG4gICAgICAgICAgICBtYXliZUxlbmd0aCA9IDAuOCAqIG1heWJlTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQXNjaWk4NVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgVElMREFfQ0hBUiA9IDB4N2U7IC8vICd+J1xuICAgICAgICB2YXIgWl9MT1dFUl9DSEFSID0gMHg3YTsgLy8gJ3onXG4gICAgICAgIHZhciBFT0YgPSAtMTtcbiAgICAgICAgdmFyIHN0cmVhbSA9IHRoaXMuc3RyZWFtO1xuICAgICAgICB2YXIgYyA9IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgIHdoaWxlIChpc1NwYWNlKGMpKSB7XG4gICAgICAgICAgICBjID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHtcbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgIHZhciBpO1xuICAgICAgICAvLyBzcGVjaWFsIGNvZGUgZm9yIHpcbiAgICAgICAgaWYgKGMgPT09IFpfTE9XRVJfQ0hBUikge1xuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgNCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCArIGldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLmlucHV0O1xuICAgICAgICAgICAgaW5wdXRbMF0gPSBjO1xuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7ICsraSkge1xuICAgICAgICAgICAgICAgIGMgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChpc1NwYWNlKGMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnB1dFtpXSA9IGM7XG4gICAgICAgICAgICAgICAgaWYgKGMgPT09IEVPRiB8fCBjID09PSBUSUxEQV9DSEFSKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIGkgLSAxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IGkgLSAxO1xuICAgICAgICAgICAgLy8gcGFydGlhbCBlbmRpbmc7XG4gICAgICAgICAgICBpZiAoaSA8IDUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFtpXSA9IDB4MjEgKyA4NDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHQgPSAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkge1xuICAgICAgICAgICAgICAgIHQgPSB0ICogODUgKyAoaW5wdXRbaV0gLSAweDIxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDM7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCArIGldID0gdCAmIDB4ZmY7XG4gICAgICAgICAgICAgICAgdCA+Pj0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEFzY2lpODVTdHJlYW07XG59KERlY29kZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgQXNjaWk4NVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzY2lpODVTdHJlYW0uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBBc2NpaUhleFN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBBc2NpaUhleFN0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBEZWNvZGVTdHJlYW0gZnJvbSBcIi4vRGVjb2RlU3RyZWFtXCI7XG52YXIgQXNjaWlIZXhTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFzY2lpSGV4U3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFzY2lpSGV4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgX3RoaXMuZmlyc3REaWdpdCA9IC0xO1xuICAgICAgICAvLyBNb3N0IHN0cmVhbXMgaW5jcmVhc2UgaW4gc2l6ZSB3aGVuIGRlY29kZWQsIGJ1dCBBc2NpaUhleCBzdHJlYW1zIHNocmlua1xuICAgICAgICAvLyBieSA1MCUuXG4gICAgICAgIGlmIChtYXliZUxlbmd0aCkge1xuICAgICAgICAgICAgbWF5YmVMZW5ndGggPSAwLjUgKiBtYXliZUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFzY2lpSGV4U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBVUFNUUkVBTV9CTE9DS19TSVpFID0gODAwMDtcbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZXMoVVBTVFJFQU1fQkxPQ0tfU0laRSk7XG4gICAgICAgIGlmICghYnl0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1heERlY29kZUxlbmd0aCA9IChieXRlcy5sZW5ndGggKyAxKSA+PiAxO1xuICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBtYXhEZWNvZGVMZW5ndGgpO1xuICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHZhciBmaXJzdERpZ2l0ID0gdGhpcy5maXJzdERpZ2l0O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSBieXRlc1tpXTtcbiAgICAgICAgICAgIHZhciBkaWdpdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHtcbiAgICAgICAgICAgICAgICAvLyAnMCctJzknXG4gICAgICAgICAgICAgICAgZGlnaXQgPSBjaCAmIDB4MGY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDQ2KSB8fCAoY2ggPj0gMHg2MSAmJiBjaCA8PSAweDY2KSkge1xuICAgICAgICAgICAgICAgIC8vICdBJy0nWicsICdhJy0neidcbiAgICAgICAgICAgICAgICBkaWdpdCA9IChjaCAmIDB4MGYpICsgOTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAweDNlKSB7XG4gICAgICAgICAgICAgICAgLy8gJz4nXG4gICAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZ25vcmluZ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0RGlnaXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgZmlyc3REaWdpdCA9IGRpZ2l0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IChmaXJzdERpZ2l0IDw8IDQpIHwgZGlnaXQ7XG4gICAgICAgICAgICAgICAgZmlyc3REaWdpdCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaXJzdERpZ2l0ID49IDAgJiYgdGhpcy5lb2YpIHtcbiAgICAgICAgICAgIC8vIGluY29tcGxldGUgYnl0ZVxuICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGZpcnN0RGlnaXQgPDwgNDtcbiAgICAgICAgICAgIGZpcnN0RGlnaXQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpcnN0RGlnaXQgPSBmaXJzdERpZ2l0O1xuICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDtcbiAgICB9O1xuICAgIHJldHVybiBBc2NpaUhleFN0cmVhbTtcbn0oRGVjb2RlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBBc2NpaUhleFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzY2lpSGV4U3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgU3RyZWFtIGZyb20gXCIuL1N0cmVhbVwiO1xuLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBEZWNvZGVTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgRGVjb2RlU3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbi8vIExvdHMgb2YgRGVjb2RlU3RyZWFtcyBhcmUgY3JlYXRlZCB3aG9zZSBidWZmZXJzIGFyZSBuZXZlciB1c2VkLiAgRm9yIHRoZXNlXG4vLyB3ZSBzaGFyZSBhIHNpbmdsZSBlbXB0eSBidWZmZXIuIFRoaXMgaXMgKGEpIHNwYWNlLWVmZmljaWVudCBhbmQgKGIpIGF2b2lkc1xuLy8gaGF2aW5nIHNwZWNpYWwgY2FzZXMgdGhhdCB3b3VsZCBiZSByZXF1aXJlZCBpZiB3ZSB1c2VkIHxudWxsfCBmb3IgYW4gZW1wdHlcbi8vIGJ1ZmZlci5cbnZhciBlbXB0eUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuLyoqXG4gKiBTdXBlciBjbGFzcyBmb3IgdGhlIGRlY29kaW5nIHN0cmVhbXNcbiAqL1xudmFyIERlY29kZVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWNvZGVTdHJlYW0obWF5YmVNaW5CdWZmZXJMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuZW9mID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gZW1wdHlCdWZmZXI7XG4gICAgICAgIHRoaXMubWluQnVmZmVyTGVuZ3RoID0gNTEyO1xuICAgICAgICBpZiAobWF5YmVNaW5CdWZmZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGZpcnN0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGFzIGJpZyBhcyBtYXliZU1pbkJ1ZmZlckxlbmd0aC5cbiAgICAgICAgICAgIHdoaWxlICh0aGlzLm1pbkJ1ZmZlckxlbmd0aCA8IG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggKj0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSwgXCJpc0VtcHR5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB3aGlsZSAoIXRoaXMuZW9mICYmIHRoaXMuYnVmZmVyTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUuZ2V0Qnl0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gcG9zKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXTtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUuZ2V0VWludDE2ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChiMCA8PCA4KSArIGIxO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5nZXRJbnQzMiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjIgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIzID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5nZXRCeXRlcyA9IGZ1bmN0aW9uIChsZW5ndGgsIGZvcmNlQ2xhbXBlZCkge1xuICAgICAgICBpZiAoZm9yY2VDbGFtcGVkID09PSB2b2lkIDApIHsgZm9yY2VDbGFtcGVkID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIGVuZDtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyBsZW5ndGgpO1xuICAgICAgICAgICAgZW5kID0gcG9zICsgbGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA8IGVuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYnVmRW5kID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gYnVmRW5kKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gYnVmRW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLmVvZikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgdmFyIHN1YmFycmF5ID0gdGhpcy5idWZmZXIuc3ViYXJyYXkocG9zLCBlbmQpO1xuICAgICAgICAvLyBgdGhpcy5idWZmZXJgIGlzIGVpdGhlciBhIGBVaW50OEFycmF5YCBvciBgVWludDhDbGFtcGVkQXJyYXlgIGhlcmUuXG4gICAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgJiYgIShzdWJhcnJheSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KVxuICAgICAgICAgICAgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpXG4gICAgICAgICAgICA6IHN1YmFycmF5O1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5wZWVrQnl0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBlZWtlZEJ5dGUgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdGhpcy5wb3MtLTtcbiAgICAgICAgcmV0dXJuIHBlZWtlZEJ5dGU7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnBlZWtCeXRlcyA9IGZ1bmN0aW9uIChsZW5ndGgsIGZvcmNlQ2xhbXBlZCkge1xuICAgICAgICBpZiAoZm9yY2VDbGFtcGVkID09PSB2b2lkIDApIHsgZm9yY2VDbGFtcGVkID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7XG4gICAgICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgaWYgKCFuKSB7XG4gICAgICAgICAgICBuID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyArPSBuO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5tYWtlU3ViU3RyZWFtID0gZnVuY3Rpb24gKHN0YXJ0LCBsZW5ndGggLyogZGljdCAqLykge1xuICAgICAgICB2YXIgZW5kID0gc3RhcnQgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlICh0aGlzLmJ1ZmZlckxlbmd0aCA8PSBlbmQgJiYgIXRoaXMuZW9mKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnVmZmVyLCBzdGFydCwgbGVuZ3RoIC8qIGRpY3QgKi8pO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5lb2YpXG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuc3ViYXJyYXkoMCwgdGhpcy5idWZmZXJMZW5ndGgpO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ3JlYWRCbG9jaycpO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5lbnN1cmVCdWZmZXIgPSBmdW5jdGlvbiAocmVxdWVzdGVkKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgaWYgKHJlcXVlc3RlZCA8PSBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2l6ZSA9IHRoaXMubWluQnVmZmVyTGVuZ3RoO1xuICAgICAgICB3aGlsZSAoc2l6ZSA8IHJlcXVlc3RlZCkge1xuICAgICAgICAgICAgc2l6ZSAqPSAyO1xuICAgICAgICB9XG4gICAgICAgIHZhciBidWZmZXIyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICAgIGJ1ZmZlcjIuc2V0KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiAodGhpcy5idWZmZXIgPSBidWZmZXIyKTtcbiAgICB9O1xuICAgIHJldHVybiBEZWNvZGVTdHJlYW07XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgRGVjb2RlU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVjb2RlU3RyZWFtLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgMTk5Ni0yMDAzIEdseXBoICYgQ29nLCBMTENcbiAqXG4gKiBUaGUgZmxhdGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBKYXZhU2NyaXB0IHBvcnRcbiAqIG9mIFhQREYncyBpbXBsZW1lbnRhdGlvbiwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2VcbiAqIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBGbGF0ZVN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBGbGF0ZVN0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG4vKiB0c2xpbnQ6ZGlzYWJsZSAgbm8tY29uZGl0aW9uYWwtYXNzaWdubWVudCAqL1xuaW1wb3J0IERlY29kZVN0cmVhbSBmcm9tIFwiLi9EZWNvZGVTdHJlYW1cIjtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGNvZGVMZW5Db2RlTWFwID0gbmV3IEludDMyQXJyYXkoW1xuICAgIDE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVcbl0pO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgbGVuZ3RoRGVjb2RlID0gbmV3IEludDMyQXJyYXkoW1xuICAgIDB4MDAwMDMsIDB4MDAwMDQsIDB4MDAwMDUsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMDgsIDB4MDAwMDksIDB4MDAwMGEsXG4gICAgMHgxMDAwYiwgMHgxMDAwZCwgMHgxMDAwZiwgMHgxMDAxMSwgMHgyMDAxMywgMHgyMDAxNywgMHgyMDAxYiwgMHgyMDAxZixcbiAgICAweDMwMDIzLCAweDMwMDJiLCAweDMwMDMzLCAweDMwMDNiLCAweDQwMDQzLCAweDQwMDUzLCAweDQwMDYzLCAweDQwMDczLFxuICAgIDB4NTAwODMsIDB4NTAwYTMsIDB4NTAwYzMsIDB4NTAwZTMsIDB4MDAxMDIsIDB4MDAxMDIsIDB4MDAxMDJcbl0pO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgZGlzdERlY29kZSA9IG5ldyBJbnQzMkFycmF5KFtcbiAgICAweDAwMDAxLCAweDAwMDAyLCAweDAwMDAzLCAweDAwMDA0LCAweDEwMDA1LCAweDEwMDA3LCAweDIwMDA5LCAweDIwMDBkLFxuICAgIDB4MzAwMTEsIDB4MzAwMTksIDB4NDAwMjEsIDB4NDAwMzEsIDB4NTAwNDEsIDB4NTAwNjEsIDB4NjAwODEsIDB4NjAwYzEsXG4gICAgMHg3MDEwMSwgMHg3MDE4MSwgMHg4MDIwMSwgMHg4MDMwMSwgMHg5MDQwMSwgMHg5MDYwMSwgMHhhMDgwMSwgMHhhMGMwMSxcbiAgICAweGIxMDAxLCAweGIxODAxLCAweGMyMDAxLCAweGMzMDAxLCAweGQ0MDAxLCAweGQ2MDAxXG5dKTtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGZpeGVkTGl0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbXG4gICAgICAgIDB4NzAxMDAsIDB4ODAwNTAsIDB4ODAwMTAsIDB4ODAxMTgsIDB4NzAxMTAsIDB4ODAwNzAsIDB4ODAwMzAsIDB4OTAwYzAsXG4gICAgICAgIDB4NzAxMDgsIDB4ODAwNjAsIDB4ODAwMjAsIDB4OTAwYTAsIDB4ODAwMDAsIDB4ODAwODAsIDB4ODAwNDAsIDB4OTAwZTAsXG4gICAgICAgIDB4NzAxMDQsIDB4ODAwNTgsIDB4ODAwMTgsIDB4OTAwOTAsIDB4NzAxMTQsIDB4ODAwNzgsIDB4ODAwMzgsIDB4OTAwZDAsXG4gICAgICAgIDB4NzAxMGMsIDB4ODAwNjgsIDB4ODAwMjgsIDB4OTAwYjAsIDB4ODAwMDgsIDB4ODAwODgsIDB4ODAwNDgsIDB4OTAwZjAsXG4gICAgICAgIDB4NzAxMDIsIDB4ODAwNTQsIDB4ODAwMTQsIDB4ODAxMWMsIDB4NzAxMTIsIDB4ODAwNzQsIDB4ODAwMzQsIDB4OTAwYzgsXG4gICAgICAgIDB4NzAxMGEsIDB4ODAwNjQsIDB4ODAwMjQsIDB4OTAwYTgsIDB4ODAwMDQsIDB4ODAwODQsIDB4ODAwNDQsIDB4OTAwZTgsXG4gICAgICAgIDB4NzAxMDYsIDB4ODAwNWMsIDB4ODAwMWMsIDB4OTAwOTgsIDB4NzAxMTYsIDB4ODAwN2MsIDB4ODAwM2MsIDB4OTAwZDgsXG4gICAgICAgIDB4NzAxMGUsIDB4ODAwNmMsIDB4ODAwMmMsIDB4OTAwYjgsIDB4ODAwMGMsIDB4ODAwOGMsIDB4ODAwNGMsIDB4OTAwZjgsXG4gICAgICAgIDB4NzAxMDEsIDB4ODAwNTIsIDB4ODAwMTIsIDB4ODAxMWEsIDB4NzAxMTEsIDB4ODAwNzIsIDB4ODAwMzIsIDB4OTAwYzQsXG4gICAgICAgIDB4NzAxMDksIDB4ODAwNjIsIDB4ODAwMjIsIDB4OTAwYTQsIDB4ODAwMDIsIDB4ODAwODIsIDB4ODAwNDIsIDB4OTAwZTQsXG4gICAgICAgIDB4NzAxMDUsIDB4ODAwNWEsIDB4ODAwMWEsIDB4OTAwOTQsIDB4NzAxMTUsIDB4ODAwN2EsIDB4ODAwM2EsIDB4OTAwZDQsXG4gICAgICAgIDB4NzAxMGQsIDB4ODAwNmEsIDB4ODAwMmEsIDB4OTAwYjQsIDB4ODAwMGEsIDB4ODAwOGEsIDB4ODAwNGEsIDB4OTAwZjQsXG4gICAgICAgIDB4NzAxMDMsIDB4ODAwNTYsIDB4ODAwMTYsIDB4ODAxMWUsIDB4NzAxMTMsIDB4ODAwNzYsIDB4ODAwMzYsIDB4OTAwY2MsXG4gICAgICAgIDB4NzAxMGIsIDB4ODAwNjYsIDB4ODAwMjYsIDB4OTAwYWMsIDB4ODAwMDYsIDB4ODAwODYsIDB4ODAwNDYsIDB4OTAwZWMsXG4gICAgICAgIDB4NzAxMDcsIDB4ODAwNWUsIDB4ODAwMWUsIDB4OTAwOWMsIDB4NzAxMTcsIDB4ODAwN2UsIDB4ODAwM2UsIDB4OTAwZGMsXG4gICAgICAgIDB4NzAxMGYsIDB4ODAwNmUsIDB4ODAwMmUsIDB4OTAwYmMsIDB4ODAwMGUsIDB4ODAwOGUsIDB4ODAwNGUsIDB4OTAwZmMsXG4gICAgICAgIDB4NzAxMDAsIDB4ODAwNTEsIDB4ODAwMTEsIDB4ODAxMTksIDB4NzAxMTAsIDB4ODAwNzEsIDB4ODAwMzEsIDB4OTAwYzIsXG4gICAgICAgIDB4NzAxMDgsIDB4ODAwNjEsIDB4ODAwMjEsIDB4OTAwYTIsIDB4ODAwMDEsIDB4ODAwODEsIDB4ODAwNDEsIDB4OTAwZTIsXG4gICAgICAgIDB4NzAxMDQsIDB4ODAwNTksIDB4ODAwMTksIDB4OTAwOTIsIDB4NzAxMTQsIDB4ODAwNzksIDB4ODAwMzksIDB4OTAwZDIsXG4gICAgICAgIDB4NzAxMGMsIDB4ODAwNjksIDB4ODAwMjksIDB4OTAwYjIsIDB4ODAwMDksIDB4ODAwODksIDB4ODAwNDksIDB4OTAwZjIsXG4gICAgICAgIDB4NzAxMDIsIDB4ODAwNTUsIDB4ODAwMTUsIDB4ODAxMWQsIDB4NzAxMTIsIDB4ODAwNzUsIDB4ODAwMzUsIDB4OTAwY2EsXG4gICAgICAgIDB4NzAxMGEsIDB4ODAwNjUsIDB4ODAwMjUsIDB4OTAwYWEsIDB4ODAwMDUsIDB4ODAwODUsIDB4ODAwNDUsIDB4OTAwZWEsXG4gICAgICAgIDB4NzAxMDYsIDB4ODAwNWQsIDB4ODAwMWQsIDB4OTAwOWEsIDB4NzAxMTYsIDB4ODAwN2QsIDB4ODAwM2QsIDB4OTAwZGEsXG4gICAgICAgIDB4NzAxMGUsIDB4ODAwNmQsIDB4ODAwMmQsIDB4OTAwYmEsIDB4ODAwMGQsIDB4ODAwOGQsIDB4ODAwNGQsIDB4OTAwZmEsXG4gICAgICAgIDB4NzAxMDEsIDB4ODAwNTMsIDB4ODAwMTMsIDB4ODAxMWIsIDB4NzAxMTEsIDB4ODAwNzMsIDB4ODAwMzMsIDB4OTAwYzYsXG4gICAgICAgIDB4NzAxMDksIDB4ODAwNjMsIDB4ODAwMjMsIDB4OTAwYTYsIDB4ODAwMDMsIDB4ODAwODMsIDB4ODAwNDMsIDB4OTAwZTYsXG4gICAgICAgIDB4NzAxMDUsIDB4ODAwNWIsIDB4ODAwMWIsIDB4OTAwOTYsIDB4NzAxMTUsIDB4ODAwN2IsIDB4ODAwM2IsIDB4OTAwZDYsXG4gICAgICAgIDB4NzAxMGQsIDB4ODAwNmIsIDB4ODAwMmIsIDB4OTAwYjYsIDB4ODAwMGIsIDB4ODAwOGIsIDB4ODAwNGIsIDB4OTAwZjYsXG4gICAgICAgIDB4NzAxMDMsIDB4ODAwNTcsIDB4ODAwMTcsIDB4ODAxMWYsIDB4NzAxMTMsIDB4ODAwNzcsIDB4ODAwMzcsIDB4OTAwY2UsXG4gICAgICAgIDB4NzAxMGIsIDB4ODAwNjcsIDB4ODAwMjcsIDB4OTAwYWUsIDB4ODAwMDcsIDB4ODAwODcsIDB4ODAwNDcsIDB4OTAwZWUsXG4gICAgICAgIDB4NzAxMDcsIDB4ODAwNWYsIDB4ODAwMWYsIDB4OTAwOWUsIDB4NzAxMTcsIDB4ODAwN2YsIDB4ODAwM2YsIDB4OTAwZGUsXG4gICAgICAgIDB4NzAxMGYsIDB4ODAwNmYsIDB4ODAwMmYsIDB4OTAwYmUsIDB4ODAwMGYsIDB4ODAwOGYsIDB4ODAwNGYsIDB4OTAwZmUsXG4gICAgICAgIDB4NzAxMDAsIDB4ODAwNTAsIDB4ODAwMTAsIDB4ODAxMTgsIDB4NzAxMTAsIDB4ODAwNzAsIDB4ODAwMzAsIDB4OTAwYzEsXG4gICAgICAgIDB4NzAxMDgsIDB4ODAwNjAsIDB4ODAwMjAsIDB4OTAwYTEsIDB4ODAwMDAsIDB4ODAwODAsIDB4ODAwNDAsIDB4OTAwZTEsXG4gICAgICAgIDB4NzAxMDQsIDB4ODAwNTgsIDB4ODAwMTgsIDB4OTAwOTEsIDB4NzAxMTQsIDB4ODAwNzgsIDB4ODAwMzgsIDB4OTAwZDEsXG4gICAgICAgIDB4NzAxMGMsIDB4ODAwNjgsIDB4ODAwMjgsIDB4OTAwYjEsIDB4ODAwMDgsIDB4ODAwODgsIDB4ODAwNDgsIDB4OTAwZjEsXG4gICAgICAgIDB4NzAxMDIsIDB4ODAwNTQsIDB4ODAwMTQsIDB4ODAxMWMsIDB4NzAxMTIsIDB4ODAwNzQsIDB4ODAwMzQsIDB4OTAwYzksXG4gICAgICAgIDB4NzAxMGEsIDB4ODAwNjQsIDB4ODAwMjQsIDB4OTAwYTksIDB4ODAwMDQsIDB4ODAwODQsIDB4ODAwNDQsIDB4OTAwZTksXG4gICAgICAgIDB4NzAxMDYsIDB4ODAwNWMsIDB4ODAwMWMsIDB4OTAwOTksIDB4NzAxMTYsIDB4ODAwN2MsIDB4ODAwM2MsIDB4OTAwZDksXG4gICAgICAgIDB4NzAxMGUsIDB4ODAwNmMsIDB4ODAwMmMsIDB4OTAwYjksIDB4ODAwMGMsIDB4ODAwOGMsIDB4ODAwNGMsIDB4OTAwZjksXG4gICAgICAgIDB4NzAxMDEsIDB4ODAwNTIsIDB4ODAwMTIsIDB4ODAxMWEsIDB4NzAxMTEsIDB4ODAwNzIsIDB4ODAwMzIsIDB4OTAwYzUsXG4gICAgICAgIDB4NzAxMDksIDB4ODAwNjIsIDB4ODAwMjIsIDB4OTAwYTUsIDB4ODAwMDIsIDB4ODAwODIsIDB4ODAwNDIsIDB4OTAwZTUsXG4gICAgICAgIDB4NzAxMDUsIDB4ODAwNWEsIDB4ODAwMWEsIDB4OTAwOTUsIDB4NzAxMTUsIDB4ODAwN2EsIDB4ODAwM2EsIDB4OTAwZDUsXG4gICAgICAgIDB4NzAxMGQsIDB4ODAwNmEsIDB4ODAwMmEsIDB4OTAwYjUsIDB4ODAwMGEsIDB4ODAwOGEsIDB4ODAwNGEsIDB4OTAwZjUsXG4gICAgICAgIDB4NzAxMDMsIDB4ODAwNTYsIDB4ODAwMTYsIDB4ODAxMWUsIDB4NzAxMTMsIDB4ODAwNzYsIDB4ODAwMzYsIDB4OTAwY2QsXG4gICAgICAgIDB4NzAxMGIsIDB4ODAwNjYsIDB4ODAwMjYsIDB4OTAwYWQsIDB4ODAwMDYsIDB4ODAwODYsIDB4ODAwNDYsIDB4OTAwZWQsXG4gICAgICAgIDB4NzAxMDcsIDB4ODAwNWUsIDB4ODAwMWUsIDB4OTAwOWQsIDB4NzAxMTcsIDB4ODAwN2UsIDB4ODAwM2UsIDB4OTAwZGQsXG4gICAgICAgIDB4NzAxMGYsIDB4ODAwNmUsIDB4ODAwMmUsIDB4OTAwYmQsIDB4ODAwMGUsIDB4ODAwOGUsIDB4ODAwNGUsIDB4OTAwZmQsXG4gICAgICAgIDB4NzAxMDAsIDB4ODAwNTEsIDB4ODAwMTEsIDB4ODAxMTksIDB4NzAxMTAsIDB4ODAwNzEsIDB4ODAwMzEsIDB4OTAwYzMsXG4gICAgICAgIDB4NzAxMDgsIDB4ODAwNjEsIDB4ODAwMjEsIDB4OTAwYTMsIDB4ODAwMDEsIDB4ODAwODEsIDB4ODAwNDEsIDB4OTAwZTMsXG4gICAgICAgIDB4NzAxMDQsIDB4ODAwNTksIDB4ODAwMTksIDB4OTAwOTMsIDB4NzAxMTQsIDB4ODAwNzksIDB4ODAwMzksIDB4OTAwZDMsXG4gICAgICAgIDB4NzAxMGMsIDB4ODAwNjksIDB4ODAwMjksIDB4OTAwYjMsIDB4ODAwMDksIDB4ODAwODksIDB4ODAwNDksIDB4OTAwZjMsXG4gICAgICAgIDB4NzAxMDIsIDB4ODAwNTUsIDB4ODAwMTUsIDB4ODAxMWQsIDB4NzAxMTIsIDB4ODAwNzUsIDB4ODAwMzUsIDB4OTAwY2IsXG4gICAgICAgIDB4NzAxMGEsIDB4ODAwNjUsIDB4ODAwMjUsIDB4OTAwYWIsIDB4ODAwMDUsIDB4ODAwODUsIDB4ODAwNDUsIDB4OTAwZWIsXG4gICAgICAgIDB4NzAxMDYsIDB4ODAwNWQsIDB4ODAwMWQsIDB4OTAwOWIsIDB4NzAxMTYsIDB4ODAwN2QsIDB4ODAwM2QsIDB4OTAwZGIsXG4gICAgICAgIDB4NzAxMGUsIDB4ODAwNmQsIDB4ODAwMmQsIDB4OTAwYmIsIDB4ODAwMGQsIDB4ODAwOGQsIDB4ODAwNGQsIDB4OTAwZmIsXG4gICAgICAgIDB4NzAxMDEsIDB4ODAwNTMsIDB4ODAwMTMsIDB4ODAxMWIsIDB4NzAxMTEsIDB4ODAwNzMsIDB4ODAwMzMsIDB4OTAwYzcsXG4gICAgICAgIDB4NzAxMDksIDB4ODAwNjMsIDB4ODAwMjMsIDB4OTAwYTcsIDB4ODAwMDMsIDB4ODAwODMsIDB4ODAwNDMsIDB4OTAwZTcsXG4gICAgICAgIDB4NzAxMDUsIDB4ODAwNWIsIDB4ODAwMWIsIDB4OTAwOTcsIDB4NzAxMTUsIDB4ODAwN2IsIDB4ODAwM2IsIDB4OTAwZDcsXG4gICAgICAgIDB4NzAxMGQsIDB4ODAwNmIsIDB4ODAwMmIsIDB4OTAwYjcsIDB4ODAwMGIsIDB4ODAwOGIsIDB4ODAwNGIsIDB4OTAwZjcsXG4gICAgICAgIDB4NzAxMDMsIDB4ODAwNTcsIDB4ODAwMTcsIDB4ODAxMWYsIDB4NzAxMTMsIDB4ODAwNzcsIDB4ODAwMzcsIDB4OTAwY2YsXG4gICAgICAgIDB4NzAxMGIsIDB4ODAwNjcsIDB4ODAwMjcsIDB4OTAwYWYsIDB4ODAwMDcsIDB4ODAwODcsIDB4ODAwNDcsIDB4OTAwZWYsXG4gICAgICAgIDB4NzAxMDcsIDB4ODAwNWYsIDB4ODAwMWYsIDB4OTAwOWYsIDB4NzAxMTcsIDB4ODAwN2YsIDB4ODAwM2YsIDB4OTAwZGYsXG4gICAgICAgIDB4NzAxMGYsIDB4ODAwNmYsIDB4ODAwMmYsIDB4OTAwYmYsIDB4ODAwMGYsIDB4ODAwOGYsIDB4ODAwNGYsIDB4OTAwZmZcbiAgICBdKSwgOV07XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBmaXhlZERpc3RDb2RlVGFiID0gW25ldyBJbnQzMkFycmF5KFtcbiAgICAgICAgMHg1MDAwMCwgMHg1MDAxMCwgMHg1MDAwOCwgMHg1MDAxOCwgMHg1MDAwNCwgMHg1MDAxNCwgMHg1MDAwYywgMHg1MDAxYyxcbiAgICAgICAgMHg1MDAwMiwgMHg1MDAxMiwgMHg1MDAwYSwgMHg1MDAxYSwgMHg1MDAwNiwgMHg1MDAxNiwgMHg1MDAwZSwgMHgwMDAwMCxcbiAgICAgICAgMHg1MDAwMSwgMHg1MDAxMSwgMHg1MDAwOSwgMHg1MDAxOSwgMHg1MDAwNSwgMHg1MDAxNSwgMHg1MDAwZCwgMHg1MDAxZCxcbiAgICAgICAgMHg1MDAwMywgMHg1MDAxMywgMHg1MDAwYiwgMHg1MDAxYiwgMHg1MDAwNywgMHg1MDAxNywgMHg1MDAwZiwgMHgwMDAwMFxuICAgIF0pLCA1XTtcbnZhciBGbGF0ZVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmxhdGVTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmxhdGVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXliZUxlbmd0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICB2YXIgY21mID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGZsZyA9IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgIGlmIChjbWYgPT09IC0xIHx8IGZsZyA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogXCIgKyBjbWYgKyBcIiwgXCIgKyBmbGcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoY21mICYgMHgwZikgIT09IDB4MDgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIGluIGZsYXRlIHN0cmVhbTogXCIgKyBjbWYgKyBcIiwgXCIgKyBmbGcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoKGNtZiA8PCA4KSArIGZsZykgJSAzMSAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIEZDSEVDSyBpbiBmbGF0ZSBzdHJlYW06IFwiICsgY21mICsgXCIsIFwiICsgZmxnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxnICYgMHgyMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkRJQ1QgYml0IHNldCBpbiBmbGF0ZSBzdHJlYW06IFwiICsgY21mICsgXCIsIFwiICsgZmxnKTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5jb2RlU2l6ZSA9IDA7XG4gICAgICAgIF90aGlzLmNvZGVCdWYgPSAwO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgIHZhciBsZW47XG4gICAgICAgIHZhciBzdHIgPSB0aGlzLnN0cmVhbTtcbiAgICAgICAgLy8gcmVhZCBibG9jayBoZWFkZXJcbiAgICAgICAgdmFyIGhkciA9IHRoaXMuZ2V0Qml0cygzKTtcbiAgICAgICAgaWYgKGhkciAmIDEpIHtcbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBoZHIgPj49IDE7XG4gICAgICAgIGlmIChoZHIgPT09IDApIHtcbiAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBibG9ja1xuICAgICAgICAgICAgdmFyIGIgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYmxvY2tMZW4gPSBiO1xuICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvY2tMZW4gfD0gYiA8PCA4O1xuICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNoZWNrID0gYjtcbiAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoZWNrIHw9IGIgPDwgODtcbiAgICAgICAgICAgIGlmIChjaGVjayAhPT0gKH5ibG9ja0xlbiAmIDB4ZmZmZikgJiYgKGJsb2NrTGVuICE9PSAwIHx8IGNoZWNrICE9PSAwKSkge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yaW5nIGVycm9yIGZvciBiYWQgXCJlbXB0eVwiIGJsb2NrIChzZWUgaXNzdWUgMTI3NylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCB1bmNvbXByZXNzZWQgYmxvY2sgbGVuZ3RoIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb2RlQnVmID0gMDtcbiAgICAgICAgICAgIHRoaXMuY29kZVNpemUgPSAwO1xuICAgICAgICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgYmxvY2tMZW4pO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGJ1ZmZlckxlbmd0aCArIGJsb2NrTGVuO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBlbmQ7XG4gICAgICAgICAgICBpZiAoYmxvY2tMZW4gPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyLnBlZWtCeXRlKCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gYnVmZmVyTGVuZ3RoOyBuIDwgZW5kOyArK24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBidWZmZXJbbl0gPSBiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGl0Q29kZVRhYmxlO1xuICAgICAgICB2YXIgZGlzdENvZGVUYWJsZTtcbiAgICAgICAgaWYgKGhkciA9PT0gMSkge1xuICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBibG9jaywgZml4ZWQgY29kZXNcbiAgICAgICAgICAgIGxpdENvZGVUYWJsZSA9IGZpeGVkTGl0Q29kZVRhYjtcbiAgICAgICAgICAgIGRpc3RDb2RlVGFibGUgPSBmaXhlZERpc3RDb2RlVGFiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhkciA9PT0gMikge1xuICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBibG9jaywgZHluYW1pYyBjb2Rlc1xuICAgICAgICAgICAgdmFyIG51bUxpdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMjU3O1xuICAgICAgICAgICAgdmFyIG51bURpc3RDb2RlcyA9IHRoaXMuZ2V0Qml0cyg1KSArIDE7XG4gICAgICAgICAgICB2YXIgbnVtQ29kZUxlbkNvZGVzID0gdGhpcy5nZXRCaXRzKDQpICsgNDtcbiAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBjb2RlIGxlbmd0aHMgY29kZSB0YWJsZVxuICAgICAgICAgICAgdmFyIGNvZGVMZW5Db2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KGNvZGVMZW5Db2RlTWFwLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgaSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Db2RlTGVuQ29kZXM7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvZGVMZW5Db2RlTGVuZ3Roc1tjb2RlTGVuQ29kZU1hcFtpXV0gPSB0aGlzLmdldEJpdHMoMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29kZUxlbkNvZGVUYWIgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5Db2RlTGVuZ3Rocyk7XG4gICAgICAgICAgICAvLyBidWlsZCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgY29kZSB0YWJsZXNcbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIHZhciBjb2RlcyA9IG51bUxpdENvZGVzICsgbnVtRGlzdENvZGVzO1xuICAgICAgICAgICAgdmFyIGNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZXMpO1xuICAgICAgICAgICAgdmFyIGJpdHNMZW5ndGggPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIgYml0c09mZnNldCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciB3aGF0ID0gdm9pZCAwO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCBjb2Rlcykge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlID0gdGhpcy5nZXRDb2RlKGNvZGVMZW5Db2RlVGFiKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgYml0c0xlbmd0aCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJpdHNPZmZzZXQgPSAzO1xuICAgICAgICAgICAgICAgICAgICB3aGF0ID0gbGVuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2RlID09PSAxNykge1xuICAgICAgICAgICAgICAgICAgICBiaXRzTGVuZ3RoID0gMztcbiAgICAgICAgICAgICAgICAgICAgYml0c09mZnNldCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIHdoYXQgPSBsZW4gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2RlID09PSAxOCkge1xuICAgICAgICAgICAgICAgICAgICBiaXRzTGVuZ3RoID0gNztcbiAgICAgICAgICAgICAgICAgICAgYml0c09mZnNldCA9IDExO1xuICAgICAgICAgICAgICAgICAgICB3aGF0ID0gbGVuID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSBsZW4gPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJlcGVhdExlbmd0aCA9IHRoaXMuZ2V0Qml0cyhiaXRzTGVuZ3RoKSArIGJpdHNPZmZzZXQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJlcGVhdExlbmd0aC0tID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVuZ3Roc1tpKytdID0gd2hhdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXRDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KDAsIG51bUxpdENvZGVzKSk7XG4gICAgICAgICAgICBkaXN0Q29kZVRhYmxlID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShjb2RlTGVuZ3Rocy5zdWJhcnJheShudW1MaXRDb2RlcywgY29kZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBibG9jayB0eXBlIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgICB2YXIgbGltaXQgPSBidWZmZXIgPyBidWZmZXIubGVuZ3RoIDogMDtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGNvZGUxID0gdGhpcy5nZXRDb2RlKGxpdENvZGVUYWJsZSk7XG4gICAgICAgICAgICBpZiAoY29kZTEgPCAyNTYpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zICsgMSA+PSBsaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmZXJbcG9zKytdID0gY29kZTE7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZTEgPT09IDI1Nikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gcG9zO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvZGUxIC09IDI1NztcbiAgICAgICAgICAgIGNvZGUxID0gbGVuZ3RoRGVjb2RlW2NvZGUxXTtcbiAgICAgICAgICAgIHZhciBjb2RlMiA9IGNvZGUxID4+IDE2O1xuICAgICAgICAgICAgaWYgKGNvZGUyID4gMCkge1xuICAgICAgICAgICAgICAgIGNvZGUyID0gdGhpcy5nZXRCaXRzKGNvZGUyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxlbiA9IChjb2RlMSAmIDB4ZmZmZikgKyBjb2RlMjtcbiAgICAgICAgICAgIGNvZGUxID0gdGhpcy5nZXRDb2RlKGRpc3RDb2RlVGFibGUpO1xuICAgICAgICAgICAgY29kZTEgPSBkaXN0RGVjb2RlW2NvZGUxXTtcbiAgICAgICAgICAgIGNvZGUyID0gY29kZTEgPj4gMTY7XG4gICAgICAgICAgICBpZiAoY29kZTIgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29kZTIgPSB0aGlzLmdldEJpdHMoY29kZTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRpc3QgPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7XG4gICAgICAgICAgICBpZiAocG9zICsgbGVuID49IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuKTtcbiAgICAgICAgICAgICAgICBsaW1pdCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGxlbjsgKytrLCArK3Bvcykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGRpc3RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Qml0cyA9IGZ1bmN0aW9uIChiaXRzKSB7XG4gICAgICAgIHZhciBzdHIgPSB0aGlzLnN0cmVhbTtcbiAgICAgICAgdmFyIGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTtcbiAgICAgICAgdmFyIGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7XG4gICAgICAgIHZhciBiO1xuICAgICAgICB3aGlsZSAoY29kZVNpemUgPCBiaXRzKSB7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTtcbiAgICAgICAgICAgIGNvZGVTaXplICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgYiA9IGNvZGVCdWYgJiAoKDEgPDwgYml0cykgLSAxKTtcbiAgICAgICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBiaXRzO1xuICAgICAgICB0aGlzLmNvZGVTaXplID0gY29kZVNpemUgLT0gYml0cztcbiAgICAgICAgcmV0dXJuIGI7XG4gICAgfTtcbiAgICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Q29kZSA9IGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICB2YXIgc3RyID0gdGhpcy5zdHJlYW07XG4gICAgICAgIHZhciBjb2RlcyA9IHRhYmxlWzBdO1xuICAgICAgICB2YXIgbWF4TGVuID0gdGFibGVbMV07XG4gICAgICAgIHZhciBjb2RlU2l6ZSA9IHRoaXMuY29kZVNpemU7XG4gICAgICAgIHZhciBjb2RlQnVmID0gdGhpcy5jb2RlQnVmO1xuICAgICAgICB2YXIgYjtcbiAgICAgICAgd2hpbGUgKGNvZGVTaXplIDwgbWF4TGVuKSB7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBwcmVtYXR1cmUgZW5kIG9mIHN0cmVhbS4gY29kZSBtaWdodCBob3dldmVyIHN0aWxsIGJlIHZhbGlkLlxuICAgICAgICAgICAgICAgIC8vIGNvZGVTaXplIDwgY29kZUxlbiBjaGVjayBiZWxvdyBndWFyZHMgYWdhaW5zdCBpbmNvbXBsZXRlIGNvZGVWYWwuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlQnVmIHw9IGIgPDwgY29kZVNpemU7XG4gICAgICAgICAgICBjb2RlU2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb2RlID0gY29kZXNbY29kZUJ1ZiAmICgoMSA8PCBtYXhMZW4pIC0gMSldO1xuICAgICAgICBpZiAodHlwZW9mIGNvZGVzID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZMQVRFOicsIGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb2RlTGVuID0gY29kZSA+PiAxNjtcbiAgICAgICAgdmFyIGNvZGVWYWwgPSBjb2RlICYgMHhmZmZmO1xuICAgICAgICBpZiAoY29kZUxlbiA8IDEgfHwgY29kZVNpemUgPCBjb2RlTGVuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvZGVCdWYgPSBjb2RlQnVmID4+IGNvZGVMZW47XG4gICAgICAgIHRoaXMuY29kZVNpemUgPSBjb2RlU2l6ZSAtIGNvZGVMZW47XG4gICAgICAgIHJldHVybiBjb2RlVmFsO1xuICAgIH07XG4gICAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdlbmVyYXRlSHVmZm1hblRhYmxlID0gZnVuY3Rpb24gKGxlbmd0aHMpIHtcbiAgICAgICAgdmFyIG4gPSBsZW5ndGhzLmxlbmd0aDtcbiAgICAgICAgLy8gZmluZCBtYXggY29kZSBsZW5ndGhcbiAgICAgICAgdmFyIG1heExlbiA9IDA7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgICBpZiAobGVuZ3Roc1tpXSA+IG1heExlbikge1xuICAgICAgICAgICAgICAgIG1heExlbiA9IGxlbmd0aHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYnVpbGQgdGhlIHRhYmxlXG4gICAgICAgIHZhciBzaXplID0gMSA8PCBtYXhMZW47XG4gICAgICAgIHZhciBjb2RlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpO1xuICAgICAgICBmb3IgKHZhciBsZW4gPSAxLCBjb2RlID0gMCwgc2tpcCA9IDI7IGxlbiA8PSBtYXhMZW47ICsrbGVuLCBjb2RlIDw8PSAxLCBza2lwIDw8PSAxKSB7XG4gICAgICAgICAgICBmb3IgKHZhciB2YWwgPSAwOyB2YWwgPCBuOyArK3ZhbCkge1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGhzW3ZhbF0gPT09IGxlbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBiaXQtcmV2ZXJzZSB0aGUgY29kZVxuICAgICAgICAgICAgICAgICAgICB2YXIgY29kZTIgPSAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTIgPSAoY29kZTIgPDwgMSkgfCAodCAmIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA+Pj0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBmaWxsIHRoZSB0YWJsZSBlbnRyaWVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGNvZGUyOyBpIDwgc2l6ZTsgaSArPSBza2lwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc1tpXSA9IChsZW4gPDwgMTYpIHwgdmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICsrY29kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtjb2RlcywgbWF4TGVuXTtcbiAgICB9O1xuICAgIHJldHVybiBGbGF0ZVN0cmVhbTtcbn0oRGVjb2RlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBGbGF0ZVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsYXRlU3RyZWFtLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBUaGUgTFpXU3RyZWFtIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBUeXBlU2NyaXB0IHBvcnQgb2YgdGhlXG4gKiBKYXZhU2NyaXB0IExaV1N0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBEZWNvZGVTdHJlYW0gZnJvbSBcIi4vRGVjb2RlU3RyZWFtXCI7XG52YXIgTFpXU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhMWldTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTFpXU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIF90aGlzLmNhY2hlZERhdGEgPSAwO1xuICAgICAgICBfdGhpcy5iaXRzQ2FjaGVkID0gMDtcbiAgICAgICAgdmFyIG1heEx6d0RpY3Rpb25hcnlTaXplID0gNDA5NjtcbiAgICAgICAgdmFyIGx6d1N0YXRlID0ge1xuICAgICAgICAgICAgZWFybHlDaGFuZ2U6IGVhcmx5Q2hhbmdlLFxuICAgICAgICAgICAgY29kZUxlbmd0aDogOSxcbiAgICAgICAgICAgIG5leHRDb2RlOiAyNTgsXG4gICAgICAgICAgICBkaWN0aW9uYXJ5VmFsdWVzOiBuZXcgVWludDhBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksXG4gICAgICAgICAgICBkaWN0aW9uYXJ5TGVuZ3RoczogbmV3IFVpbnQxNkFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlQcmV2Q29kZXM6IG5ldyBVaW50MTZBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksXG4gICAgICAgICAgICBjdXJyZW50U2VxdWVuY2U6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDogMCxcbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeVZhbHVlc1tpXSA9IGk7XG4gICAgICAgICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5TGVuZ3Roc1tpXSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMubHp3U3RhdGUgPSBsendTdGF0ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBMWldTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IDUxMjtcbiAgICAgICAgdmFyIGVzdGltYXRlZERlY29kZWRTaXplID0gYmxvY2tTaXplICogMjtcbiAgICAgICAgdmFyIGRlY29kZWRTaXplRGVsdGEgPSBibG9ja1NpemU7XG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgajtcbiAgICAgICAgdmFyIHE7XG4gICAgICAgIHZhciBsendTdGF0ZSA9IHRoaXMubHp3U3RhdGU7XG4gICAgICAgIGlmICghbHp3U3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gZW9mIHdhcyBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIHZhciBlYXJseUNoYW5nZSA9IGx6d1N0YXRlLmVhcmx5Q2hhbmdlO1xuICAgICAgICB2YXIgbmV4dENvZGUgPSBsendTdGF0ZS5uZXh0Q29kZTtcbiAgICAgICAgdmFyIGRpY3Rpb25hcnlWYWx1ZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzO1xuICAgICAgICB2YXIgZGljdGlvbmFyeUxlbmd0aHMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5TGVuZ3RocztcbiAgICAgICAgdmFyIGRpY3Rpb25hcnlQcmV2Q29kZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5UHJldkNvZGVzO1xuICAgICAgICB2YXIgY29kZUxlbmd0aCA9IGx6d1N0YXRlLmNvZGVMZW5ndGg7XG4gICAgICAgIHZhciBwcmV2Q29kZSA9IGx6d1N0YXRlLnByZXZDb2RlO1xuICAgICAgICB2YXIgY3VycmVudFNlcXVlbmNlID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlO1xuICAgICAgICB2YXIgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoO1xuICAgICAgICB2YXIgZGVjb2RlZExlbmd0aCA9IDA7XG4gICAgICAgIHZhciBjdXJyZW50QnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIGVzdGltYXRlZERlY29kZWRTaXplKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29kZSA9IHRoaXMucmVhZEJpdHMoY29kZUxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgaGFzUHJldiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoIWNvZGUgfHwgY29kZSA8IDI1Nikge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVswXSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gMjU4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPCBuZXh0Q29kZSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBkaWN0aW9uYXJ5TGVuZ3Roc1tjb2RlXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoIC0gMSwgcSA9IGNvZGU7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VxdWVuY2Vbal0gPSBkaWN0aW9uYXJ5VmFsdWVzW3FdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcSA9IGRpY3Rpb25hcnlQcmV2Q29kZXNbcV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVtjdXJyZW50U2VxdWVuY2VMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2VbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA9PT0gMjU2KSB7XG4gICAgICAgICAgICAgICAgY29kZUxlbmd0aCA9IDk7XG4gICAgICAgICAgICAgICAgbmV4dENvZGUgPSAyNTg7XG4gICAgICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5sendTdGF0ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNQcmV2KSB7XG4gICAgICAgICAgICAgICAgZGljdGlvbmFyeVByZXZDb2Rlc1tuZXh0Q29kZV0gPSBwcmV2Q29kZTtcbiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5TGVuZ3Roc1tuZXh0Q29kZV0gPSBkaWN0aW9uYXJ5TGVuZ3Roc1twcmV2Q29kZV0gKyAxO1xuICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlWYWx1ZXNbbmV4dENvZGVdID0gY3VycmVudFNlcXVlbmNlWzBdO1xuICAgICAgICAgICAgICAgIG5leHRDb2RlKys7XG4gICAgICAgICAgICAgICAgY29kZUxlbmd0aCA9XG4gICAgICAgICAgICAgICAgICAgIChuZXh0Q29kZSArIGVhcmx5Q2hhbmdlKSAmIChuZXh0Q29kZSArIGVhcmx5Q2hhbmdlIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY29kZUxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBNYXRoLm1pbihNYXRoLmxvZyhuZXh0Q29kZSArIGVhcmx5Q2hhbmdlKSAvIDAuNjkzMTQ3MTgwNTU5OTQ1MyArIDEsIDEyKSB8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2Q29kZSA9IGNvZGU7XG4gICAgICAgICAgICBkZWNvZGVkTGVuZ3RoICs9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZERlY29kZWRTaXplICs9IGRlY29kZWRTaXplRGVsdGE7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoZXN0aW1hdGVkRGVjb2RlZFNpemUgPCBkZWNvZGVkTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIGVzdGltYXRlZERlY29kZWRTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJyZW50U2VxdWVuY2VMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltjdXJyZW50QnVmZmVyTGVuZ3RoKytdID0gY3VycmVudFNlcXVlbmNlW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGx6d1N0YXRlLm5leHRDb2RlID0gbmV4dENvZGU7XG4gICAgICAgIGx6d1N0YXRlLmNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoO1xuICAgICAgICBsendTdGF0ZS5wcmV2Q29kZSA9IHByZXZDb2RlO1xuICAgICAgICBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGggPSBjdXJyZW50U2VxdWVuY2VMZW5ndGg7XG4gICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gY3VycmVudEJ1ZmZlckxlbmd0aDtcbiAgICB9O1xuICAgIExaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJpdHMgPSBmdW5jdGlvbiAobikge1xuICAgICAgICB2YXIgYml0c0NhY2hlZCA9IHRoaXMuYml0c0NhY2hlZDtcbiAgICAgICAgdmFyIGNhY2hlZERhdGEgPSB0aGlzLmNhY2hlZERhdGE7XG4gICAgICAgIHdoaWxlIChiaXRzQ2FjaGVkIDwgbikge1xuICAgICAgICAgICAgdmFyIGMgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgICAgICBpZiAoYyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWNoZWREYXRhID0gKGNhY2hlZERhdGEgPDwgOCkgfCBjO1xuICAgICAgICAgICAgYml0c0NhY2hlZCArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYml0c0NhY2hlZCA9IGJpdHNDYWNoZWQgLT0gbjtcbiAgICAgICAgdGhpcy5jYWNoZWREYXRhID0gY2FjaGVkRGF0YTtcbiAgICAgICAgcmV0dXJuIChjYWNoZWREYXRhID4+PiBiaXRzQ2FjaGVkKSAmICgoMSA8PCBuKSAtIDEpO1xuICAgIH07XG4gICAgcmV0dXJuIExaV1N0cmVhbTtcbn0oRGVjb2RlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBMWldTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MWldTdHJlYW0uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBSdW5MZW5ndGhTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgUnVuTGVuZ3RoU3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IERlY29kZVN0cmVhbSBmcm9tIFwiLi9EZWNvZGVTdHJlYW1cIjtcbnZhciBSdW5MZW5ndGhTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJ1bkxlbmd0aFN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXliZUxlbmd0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJ1bkxlbmd0aFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBUaGUgcmVwZWF0SGVhZGVyIGhhcyBmb2xsb3dpbmcgZm9ybWF0LiBUaGUgZmlyc3QgYnl0ZSBkZWZpbmVzIHR5cGUgb2YgcnVuXG4gICAgICAgIC8vIGFuZCBhbW91bnQgb2YgYnl0ZXMgdG8gcmVwZWF0L2NvcHk6IG4gPSAwIHRocm91Z2ggMTI3IC0gY29weSBuZXh0IG4gYnl0ZXNcbiAgICAgICAgLy8gKGluIGFkZGl0aW9uIHRvIHRoZSBzZWNvbmQgYnl0ZSBmcm9tIHRoZSBoZWFkZXIpLCBuID0gMTI5IHRocm91Z2ggMjU1IC1cbiAgICAgICAgLy8gZHVwbGljYXRlIHRoZSBzZWNvbmQgYnl0ZSBmcm9tIHRoZSBoZWFkZXIgKDI1NyAtIG4pIHRpbWVzLCBuID0gMTI4IC0gZW5kLlxuICAgICAgICB2YXIgcmVwZWF0SGVhZGVyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZXMoMik7XG4gICAgICAgIGlmICghcmVwZWF0SGVhZGVyIHx8IHJlcGVhdEhlYWRlci5sZW5ndGggPCAyIHx8IHJlcGVhdEhlYWRlclswXSA9PT0gMTI4KSB7XG4gICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ1ZmZlcjtcbiAgICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICB2YXIgbiA9IHJlcGVhdEhlYWRlclswXTtcbiAgICAgICAgaWYgKG4gPCAxMjgpIHtcbiAgICAgICAgICAgIC8vIGNvcHkgbiBieXRlc1xuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpO1xuICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IHJlcGVhdEhlYWRlclsxXTtcbiAgICAgICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLnN0cmVhbS5nZXRCeXRlcyhuKTtcbiAgICAgICAgICAgICAgICBidWZmZXIuc2V0KHNvdXJjZSwgYnVmZmVyTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBidWZmZXJMZW5ndGggKz0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG4gPSAyNTcgLSBuO1xuICAgICAgICAgICAgdmFyIGIgPSByZXBlYXRIZWFkZXJbMV07XG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuICsgMSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICAgIH07XG4gICAgcmV0dXJuIFJ1bkxlbmd0aFN0cmVhbTtcbn0oRGVjb2RlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBSdW5MZW5ndGhTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SdW5MZW5ndGhTdHJlYW0uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgU3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbnZhciBTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3RyZWFtKGJ1ZmZlciwgc3RhcnQsIGxlbmd0aCkge1xuICAgICAgICB0aGlzLmJ5dGVzID0gYnVmZmVyO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgICAgICB0aGlzLmVuZCA9ICEhc3RhcnQgJiYgISFsZW5ndGggPyBzdGFydCArIGxlbmd0aCA6IHRoaXMuYnl0ZXMubGVuZ3RoO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyZWFtLnByb3RvdHlwZSwgXCJsZW5ndGhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVuZCAtIHRoaXMuc3RhcnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyZWFtLnByb3RvdHlwZSwgXCJpc0VtcHR5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDA7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLmdldEJ5dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMucG9zKytdO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5nZXRVaW50MTYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgaWYgKGIwID09PSAtMSB8fCBiMSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLmdldEludDMyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMiA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjMgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7XG4gICAgfTtcbiAgICAvLyBSZXR1cm5zIHN1YmFycmF5IG9mIG9yaWdpbmFsIGJ1ZmZlciwgc2hvdWxkIG9ubHkgYmUgcmVhZC5cbiAgICBTdHJlYW0ucHJvdG90eXBlLmdldEJ5dGVzID0gZnVuY3Rpb24gKGxlbmd0aCwgZm9yY2VDbGFtcGVkKSB7XG4gICAgICAgIGlmIChmb3JjZUNsYW1wZWQgPT09IHZvaWQgMCkgeyBmb3JjZUNsYW1wZWQgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzO1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICAgIHZhciBzdHJFbmQgPSB0aGlzLmVuZDtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBzdWJhcnJheSA9IGJ5dGVzLnN1YmFycmF5KHBvcywgc3RyRW5kKTtcbiAgICAgICAgICAgIC8vIGB0aGlzLmJ5dGVzYCBpcyBhbHdheXMgYSBgVWludDhBcnJheWAgaGVyZS5cbiAgICAgICAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgZW5kID0gcG9zICsgbGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHN0ckVuZCkge1xuICAgICAgICAgICAgICAgIGVuZCA9IHN0ckVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICAgICAgdmFyIHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpO1xuICAgICAgICAgICAgLy8gYHRoaXMuYnl0ZXNgIGlzIGFsd2F5cyBhIGBVaW50OEFycmF5YCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSkgOiBzdWJhcnJheTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5wZWVrQnl0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBlZWtlZEJ5dGUgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdGhpcy5wb3MtLTtcbiAgICAgICAgcmV0dXJuIHBlZWtlZEJ5dGU7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnBlZWtCeXRlcyA9IGZ1bmN0aW9uIChsZW5ndGgsIGZvcmNlQ2xhbXBlZCkge1xuICAgICAgICBpZiAoZm9yY2VDbGFtcGVkID09PSB2b2lkIDApIHsgZm9yY2VDbGFtcGVkID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7XG4gICAgICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgaWYgKCFuKSB7XG4gICAgICAgICAgICBuID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyArPSBuO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5tb3ZlU3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvcztcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUubWFrZVN1YlN0cmVhbSA9IGZ1bmN0aW9uIChzdGFydCwgbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnl0ZXMsIHN0YXJ0LCBsZW5ndGgpO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzO1xuICAgIH07XG4gICAgcmV0dXJuIFN0cmVhbTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvciwgVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBBc2NpaTg1U3RyZWFtIGZyb20gXCIuL0FzY2lpODVTdHJlYW1cIjtcbmltcG9ydCBBc2NpaUhleFN0cmVhbSBmcm9tIFwiLi9Bc2NpaUhleFN0cmVhbVwiO1xuaW1wb3J0IEZsYXRlU3RyZWFtIGZyb20gXCIuL0ZsYXRlU3RyZWFtXCI7XG5pbXBvcnQgTFpXU3RyZWFtIGZyb20gXCIuL0xaV1N0cmVhbVwiO1xuaW1wb3J0IFJ1bkxlbmd0aFN0cmVhbSBmcm9tIFwiLi9SdW5MZW5ndGhTdHJlYW1cIjtcbmltcG9ydCBTdHJlYW0gZnJvbSBcIi4vU3RyZWFtXCI7XG52YXIgZGVjb2RlU3RyZWFtID0gZnVuY3Rpb24gKHN0cmVhbSwgZW5jb2RpbmcsIHBhcmFtcykge1xuICAgIGlmIChlbmNvZGluZyA9PT0gUERGTmFtZS5vZignRmxhdGVEZWNvZGUnKSkge1xuICAgICAgICByZXR1cm4gbmV3IEZsYXRlU3RyZWFtKHN0cmVhbSk7XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyA9PT0gUERGTmFtZS5vZignTFpXRGVjb2RlJykpIHtcbiAgICAgICAgdmFyIGVhcmx5Q2hhbmdlID0gMTtcbiAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIFBERkRpY3QpIHtcbiAgICAgICAgICAgIHZhciBFYXJseUNoYW5nZSA9IHBhcmFtcy5sb29rdXAoUERGTmFtZS5vZignRWFybHlDaGFuZ2UnKSk7XG4gICAgICAgICAgICBpZiAoRWFybHlDaGFuZ2UgaW5zdGFuY2VvZiBQREZOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBlYXJseUNoYW5nZSA9IEVhcmx5Q2hhbmdlLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMWldTdHJlYW0oc3RyZWFtLCB1bmRlZmluZWQsIGVhcmx5Q2hhbmdlKTtcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nID09PSBQREZOYW1lLm9mKCdBU0NJSTg1RGVjb2RlJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBc2NpaTg1U3RyZWFtKHN0cmVhbSk7XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyA9PT0gUERGTmFtZS5vZignQVNDSUlIZXhEZWNvZGUnKSkge1xuICAgICAgICByZXR1cm4gbmV3IEFzY2lpSGV4U3RyZWFtKHN0cmVhbSk7XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyA9PT0gUERGTmFtZS5vZignUnVuTGVuZ3RoRGVjb2RlJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSdW5MZW5ndGhTdHJlYW0oc3RyZWFtKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRW5jb2RpbmdFcnJvcihlbmNvZGluZy5hc1N0cmluZygpKTtcbn07XG5leHBvcnQgdmFyIGRlY29kZVBERlJhd1N0cmVhbSA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBkaWN0ID0gX2EuZGljdCwgY29udGVudHMgPSBfYS5jb250ZW50cztcbiAgICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbShjb250ZW50cyk7XG4gICAgdmFyIEZpbHRlciA9IGRpY3QubG9va3VwKFBERk5hbWUub2YoJ0ZpbHRlcicpKTtcbiAgICB2YXIgRGVjb2RlUGFybXMgPSBkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdEZWNvZGVQYXJtcycpKTtcbiAgICBpZiAoRmlsdGVyIGluc3RhbmNlb2YgUERGTmFtZSkge1xuICAgICAgICBzdHJlYW0gPSBkZWNvZGVTdHJlYW0oc3RyZWFtLCBGaWx0ZXIsIERlY29kZVBhcm1zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoRmlsdGVyIGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gRmlsdGVyLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgc3RyZWFtID0gZGVjb2RlU3RyZWFtKHN0cmVhbSwgRmlsdGVyLmxvb2t1cChpZHgsIFBERk5hbWUpLCBEZWNvZGVQYXJtcyAmJiBEZWNvZGVQYXJtcy5sb29rdXBNYXliZShpZHgsIFBERkRpY3QpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICghIUZpbHRlcikge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvcihbUERGTmFtZSwgUERGQXJyYXldLCBGaWx0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlY29kZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCB7IFBERkFjcm9Gb3JtIH0gZnJvbSBcIi4uL2Fjcm9mb3JtXCI7XG5pbXBvcnQgVmlld2VyUHJlZmVyZW5jZXMgZnJvbSAnLi4vaW50ZXJhY3RpdmUvVmlld2VyUHJlZmVyZW5jZXMnO1xudmFyIFBERkNhdGFsb2cgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkNhdGFsb2csIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQ2F0YWxvZygpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5QYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwKFBERk5hbWUub2YoJ1BhZ2VzJyksIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuQWNyb0Zvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ0Fjcm9Gb3JtJyksIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuZ2V0QWNyb0Zvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5BY3JvRm9ybSgpO1xuICAgICAgICBpZiAoIWRpY3QpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gUERGQWNyb0Zvcm0uZnJvbURpY3QoZGljdCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5nZXRPckNyZWF0ZUFjcm9Gb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYWNyb0Zvcm0gPSB0aGlzLmdldEFjcm9Gb3JtKCk7XG4gICAgICAgIGlmICghYWNyb0Zvcm0pIHtcbiAgICAgICAgICAgIGFjcm9Gb3JtID0gUERGQWNyb0Zvcm0uY3JlYXRlKHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgICB2YXIgYWNyb0Zvcm1SZWYgPSB0aGlzLmNvbnRleHQucmVnaXN0ZXIoYWNyb0Zvcm0uZGljdCk7XG4gICAgICAgICAgICB0aGlzLnNldChQREZOYW1lLm9mKCdBY3JvRm9ybScpLCBhY3JvRm9ybVJlZik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjcm9Gb3JtO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuVmlld2VyUHJlZmVyZW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ1ZpZXdlclByZWZlcmVuY2VzJyksIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuZ2V0Vmlld2VyUHJlZmVyZW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5WaWV3ZXJQcmVmZXJlbmNlcygpO1xuICAgICAgICBpZiAoIWRpY3QpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gVmlld2VyUHJlZmVyZW5jZXMuZnJvbURpY3QoZGljdCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmlld2VyUHJlZnMgPSB0aGlzLmdldFZpZXdlclByZWZlcmVuY2VzKCk7XG4gICAgICAgIGlmICghdmlld2VyUHJlZnMpIHtcbiAgICAgICAgICAgIHZpZXdlclByZWZzID0gVmlld2VyUHJlZmVyZW5jZXMuY3JlYXRlKHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgICB2YXIgdmlld2VyUHJlZnNSZWYgPSB0aGlzLmNvbnRleHQucmVnaXN0ZXIodmlld2VyUHJlZnMuZGljdCk7XG4gICAgICAgICAgICB0aGlzLnNldChQREZOYW1lLm9mKCdWaWV3ZXJQcmVmZXJlbmNlcycpLCB2aWV3ZXJQcmVmc1JlZik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXdlclByZWZzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgZ2l2ZW4gcmVmIGFzIGEgbGVhZiBub2RlIG9mIHRoaXMgY2F0YWxvZydzIHBhZ2UgdHJlZSBhdCB0aGVcbiAgICAgKiBzcGVjaWZpZWQgaW5kZXggKHplcm8tYmFzZWQpLiBBbHNvIGluY3JlbWVudHMgdGhlIGBDb3VudGAgb2YgZWFjaCBub2RlIGluXG4gICAgICogdGhlIHBhZ2UgdHJlZSBoaWVyYXJjaHkgdG8gYWNjb21vZGF0ZSB0aGUgbmV3IHBhZ2UuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSByZWYgb2YgdGhlIFBERlBhZ2VUcmVlIG5vZGUgaW50byB3aGljaCBgbGVhZlJlZmAgd2FzIGluc2VydGVkLlxuICAgICAqL1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLmluc2VydExlYWZOb2RlID0gZnVuY3Rpb24gKGxlYWZSZWYsIGluZGV4KSB7XG4gICAgICAgIHZhciBwYWdlc1JlZiA9IHRoaXMuZ2V0KFBERk5hbWUub2YoJ1BhZ2VzJykpO1xuICAgICAgICB2YXIgbWF5YmVQYXJlbnRSZWYgPSB0aGlzLlBhZ2VzKCkuaW5zZXJ0TGVhZk5vZGUobGVhZlJlZiwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gbWF5YmVQYXJlbnRSZWYgfHwgcGFnZXNSZWY7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5yZW1vdmVMZWFmTm9kZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB0aGlzLlBhZ2VzKCkucmVtb3ZlTGVhZk5vZGUoaW5kZXgpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy53aXRoQ29udGV4dEFuZFBhZ2VzID0gZnVuY3Rpb24gKGNvbnRleHQsIHBhZ2VzKSB7XG4gICAgICAgIHZhciBkaWN0ID0gbmV3IE1hcCgpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdUeXBlJyksIFBERk5hbWUub2YoJ0NhdGFsb2cnKSk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ1BhZ2VzJyksIHBhZ2VzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZDYXRhbG9nKGRpY3QsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5mcm9tTWFwV2l0aENvbnRleHQgPSBmdW5jdGlvbiAobWFwLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQ2F0YWxvZyhtYXAsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkNhdGFsb2c7XG59KFBERkRpY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkNhdGFsb2c7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDYXRhbG9nLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkZsYXRlU3RyZWFtIGZyb20gXCIuL1BERkZsYXRlU3RyZWFtXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgUERGQ29udGVudFN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQ29udGVudFN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZDb250ZW50U3RyZWFtKGRpY3QsIG9wZXJhdG9ycywgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRpY3QsIGVuY29kZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMub3BlcmF0b3JzID0gb3BlcmF0b3JzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkNvbnRlbnRTdHJlYW0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgb3BlcmF0b3JzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgKF9hID0gdGhpcy5vcGVyYXRvcnMpLnB1c2guYXBwbHkoX2EsIG9wZXJhdG9ycyk7XG4gICAgfTtcbiAgICBQREZDb250ZW50U3RyZWFtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBvcGVyYXRvcnMgPSBuZXcgQXJyYXkodGhpcy5vcGVyYXRvcnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvcGVyYXRvcnNbaWR4XSA9IHRoaXMub3BlcmF0b3JzW2lkeF0uY2xvbmUoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gdGhpcywgZGljdCA9IF9hLmRpY3QsIGVuY29kZSA9IF9hLmVuY29kZTtcbiAgICAgICAgcmV0dXJuIFBERkNvbnRlbnRTdHJlYW0ub2YoZGljdC5jbG9uZShjb250ZXh0KSwgb3BlcmF0b3JzLCBlbmNvZGUpO1xuICAgIH07XG4gICAgUERGQ29udGVudFN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhbHVlICs9IHRoaXMub3BlcmF0b3JzW2lkeF0gKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERkNvbnRlbnRTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRVbmVuY29kZWRDb250ZW50c1NpemUoKSk7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG9mZnNldCArPSB0aGlzLm9wZXJhdG9yc1tpZHhdLmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfTtcbiAgICBQREZDb250ZW50U3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50c1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzaXplID0gMDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBzaXplICs9IHRoaXMub3BlcmF0b3JzW2lkeF0uc2l6ZUluQnl0ZXMoKSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcbiAgICBQREZDb250ZW50U3RyZWFtLm9mID0gZnVuY3Rpb24gKGRpY3QsIG9wZXJhdG9ycywgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBuZXcgUERGQ29udGVudFN0cmVhbShkaWN0LCBvcGVyYXRvcnMsIGVuY29kZSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQ29udGVudFN0cmVhbTtcbn0oUERGRmxhdGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IFBERkNvbnRlbnRTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDb250ZW50U3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZGbGF0ZVN0cmVhbSBmcm9tIFwiLi9QREZGbGF0ZVN0cmVhbVwiO1xuaW1wb3J0IHsgYnl0ZXNGb3IsIENhY2hlLCByZXZlcnNlQXJyYXksIHNpemVJbkJ5dGVzLCBzdW0gfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmV4cG9ydCB2YXIgRW50cnlUeXBlO1xuKGZ1bmN0aW9uIChFbnRyeVR5cGUpIHtcbiAgICBFbnRyeVR5cGVbRW50cnlUeXBlW1wiRGVsZXRlZFwiXSA9IDBdID0gXCJEZWxldGVkXCI7XG4gICAgRW50cnlUeXBlW0VudHJ5VHlwZVtcIlVuY29tcHJlc3NlZFwiXSA9IDFdID0gXCJVbmNvbXByZXNzZWRcIjtcbiAgICBFbnRyeVR5cGVbRW50cnlUeXBlW1wiQ29tcHJlc3NlZFwiXSA9IDJdID0gXCJDb21wcmVzc2VkXCI7XG59KShFbnRyeVR5cGUgfHwgKEVudHJ5VHlwZSA9IHt9KSk7XG4vKipcbiAqIEVudHJpZXMgc2hvdWxkIGJlIGFkZGVkIHVzaW5nIHRoZSBbW2FkZERlbGV0ZWRFbnRyeV1dLFxuICogW1thZGRVbmNvbXByZXNzZWRFbnRyeV1dLCBhbmQgW1thZGRDb21wcmVzc2VkRW50cnldXSBtZXRob2RzXG4gKiAqKmluIG9yZGVyIG9mIGFzY2VuZGluZyBvYmplY3QgbnVtYmVyKiouXG4gKi9cbnZhciBQREZDcm9zc1JlZlN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQ3Jvc3NSZWZTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQ3Jvc3NSZWZTdHJlYW0oZGljdCwgZW50cmllcywgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRpY3QsIGVuY29kZSkgfHwgdGhpcztcbiAgICAgICAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBpbnRlZ2VyIHBhaXJzIGZvciBlYWNoIHN1YnNlY3Rpb24gb2YgdGhlIGNyb3NzIHJlZlxuICAgICAgICAvLyBzZWN0aW9uLCB3aGVyZSBlYWNoIGludGVnZXIgcGFpciByZXByZXNlbnRzOlxuICAgICAgICAvLyAgIGZpcnN0T2JqZWN0TnVtYmVyKE9mU2VjdGlvbiksIGxlbmd0aChPZlNlY3Rpb24pXG4gICAgICAgIF90aGlzLmNvbXB1dGVJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdWJzZWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgdmFyIHN1YnNlY3Rpb25MZW5ndGggPSAwO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gX3RoaXMuZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VyckVudHJ5ID0gX3RoaXMuZW50cmllc1tpZHhdO1xuICAgICAgICAgICAgICAgIHZhciBwcmV2RW50cnkgPSBfdGhpcy5lbnRyaWVzW2lkeCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChpZHggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbnMucHVzaChjdXJyRW50cnkucmVmLm9iamVjdE51bWJlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJFbnRyeS5yZWYub2JqZWN0TnVtYmVyIC0gcHJldkVudHJ5LnJlZi5vYmplY3ROdW1iZXIgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNlY3Rpb25zLnB1c2goc3Vic2VjdGlvbkxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNlY3Rpb25zLnB1c2goY3VyckVudHJ5LnJlZi5vYmplY3ROdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzZWN0aW9uTGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3Vic2VjdGlvbkxlbmd0aCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Vic2VjdGlvbnMucHVzaChzdWJzZWN0aW9uTGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiBzdWJzZWN0aW9ucztcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuY29tcHV0ZUVudHJ5VHVwbGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVudHJ5VHVwbGVzID0gbmV3IEFycmF5KF90aGlzLmVudHJpZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IF90aGlzLmVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cmllc1tpZHhdO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09PSBFbnRyeVR5cGUuRGVsZXRlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGVudHJ5LnR5cGUsIG5leHRGcmVlT2JqZWN0TnVtYmVyID0gZW50cnkubmV4dEZyZWVPYmplY3ROdW1iZXIsIHJlZiA9IGVudHJ5LnJlZjtcbiAgICAgICAgICAgICAgICAgICAgZW50cnlUdXBsZXNbaWR4XSA9IFt0eXBlLCBuZXh0RnJlZU9iamVjdE51bWJlciwgcmVmLmdlbmVyYXRpb25OdW1iZXJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gRW50cnlUeXBlLlVuY29tcHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGVudHJ5LnR5cGUsIG9mZnNldCA9IGVudHJ5Lm9mZnNldCwgcmVmID0gZW50cnkucmVmO1xuICAgICAgICAgICAgICAgICAgICBlbnRyeVR1cGxlc1tpZHhdID0gW3R5cGUsIG9mZnNldCwgcmVmLmdlbmVyYXRpb25OdW1iZXJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gRW50cnlUeXBlLkNvbXByZXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBlbnRyeS50eXBlLCBvYmplY3RTdHJlYW1SZWYgPSBlbnRyeS5vYmplY3RTdHJlYW1SZWYsIGluZGV4ID0gZW50cnkuaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5VHVwbGVzW2lkeF0gPSBbdHlwZSwgb2JqZWN0U3RyZWFtUmVmLm9iamVjdE51bWJlciwgaW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnRyeVR1cGxlcztcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuY29tcHV0ZU1heEVudHJ5Qnl0ZVdpZHRocyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlbnRyeVR1cGxlcyA9IF90aGlzLmVudHJ5VHVwbGVzQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgICAgICB2YXIgd2lkdGhzID0gWzAsIDAsIDBdO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cnlUdXBsZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gZW50cnlUdXBsZXNbaWR4XSwgZmlyc3QgPSBfYVswXSwgc2Vjb25kID0gX2FbMV0sIHRoaXJkID0gX2FbMl07XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0U2l6ZSA9IHNpemVJbkJ5dGVzKGZpcnN0KTtcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kU2l6ZSA9IHNpemVJbkJ5dGVzKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXJkU2l6ZSA9IHNpemVJbkJ5dGVzKHRoaXJkKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RTaXplID4gd2lkdGhzWzBdKVxuICAgICAgICAgICAgICAgICAgICB3aWR0aHNbMF0gPSBmaXJzdFNpemU7XG4gICAgICAgICAgICAgICAgaWYgKHNlY29uZFNpemUgPiB3aWR0aHNbMV0pXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoc1sxXSA9IHNlY29uZFNpemU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXJkU2l6ZSA+IHdpZHRoc1syXSlcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhzWzJdID0gdGhpcmRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdpZHRocztcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuZW50cmllcyA9IGVudHJpZXMgfHwgW107XG4gICAgICAgIF90aGlzLmVudHJ5VHVwbGVzQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeShfdGhpcy5jb21wdXRlRW50cnlUdXBsZXMpO1xuICAgICAgICBfdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeShfdGhpcy5jb21wdXRlTWF4RW50cnlCeXRlV2lkdGhzKTtcbiAgICAgICAgX3RoaXMuaW5kZXhDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KF90aGlzLmNvbXB1dGVJbmRleCk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ1R5cGUnKSwgUERGTmFtZS5vZignWFJlZicpKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuYWRkRGVsZXRlZEVudHJ5ID0gZnVuY3Rpb24gKHJlZiwgbmV4dEZyZWVPYmplY3ROdW1iZXIpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBFbnRyeVR5cGUuRGVsZXRlZDtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goeyB0eXBlOiB0eXBlLCByZWY6IHJlZiwgbmV4dEZyZWVPYmplY3ROdW1iZXI6IG5leHRGcmVlT2JqZWN0TnVtYmVyIH0pO1xuICAgICAgICB0aGlzLmVudHJ5VHVwbGVzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuaW5kZXhDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuY29udGVudHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuYWRkVW5jb21wcmVzc2VkRW50cnkgPSBmdW5jdGlvbiAocmVmLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBFbnRyeVR5cGUuVW5jb21wcmVzc2VkO1xuICAgICAgICB0aGlzLmVudHJpZXMucHVzaCh7IHR5cGU6IHR5cGUsIHJlZjogcmVmLCBvZmZzZXQ6IG9mZnNldCB9KTtcbiAgICAgICAgdGhpcy5lbnRyeVR1cGxlc0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLmluZGV4Q2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLmNvbnRlbnRzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmFkZENvbXByZXNzZWRFbnRyeSA9IGZ1bmN0aW9uIChyZWYsIG9iamVjdFN0cmVhbVJlZiwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBFbnRyeVR5cGUuQ29tcHJlc3NlZDtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goeyB0eXBlOiB0eXBlLCByZWY6IHJlZiwgb2JqZWN0U3RyZWFtUmVmOiBvYmplY3RTdHJlYW1SZWYsIGluZGV4OiBpbmRleCB9KTtcbiAgICAgICAgdGhpcy5lbnRyeVR1cGxlc0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLmluZGV4Q2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLmNvbnRlbnRzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgZGljdCA9IF9hLmRpY3QsIGVudHJpZXMgPSBfYS5lbnRyaWVzLCBlbmNvZGUgPSBfYS5lbmNvZGU7XG4gICAgICAgIHJldHVybiBQREZDcm9zc1JlZlN0cmVhbS5vZihkaWN0LmNsb25lKGNvbnRleHQpLCBlbnRyaWVzLnNsaWNlKCksIGVuY29kZSk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbnRyeVR1cGxlcyA9IHRoaXMuZW50cnlUdXBsZXNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIGJ5dGVXaWR0aHMgPSB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIGZvciAodmFyIGVudHJ5SWR4ID0gMCwgZW50cmllc0xlbiA9IGVudHJ5VHVwbGVzLmxlbmd0aDsgZW50cnlJZHggPCBlbnRyaWVzTGVuOyBlbnRyeUlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyeVR1cGxlc1tlbnRyeUlkeF0sIGZpcnN0ID0gX2FbMF0sIHNlY29uZCA9IF9hWzFdLCB0aGlyZCA9IF9hWzJdO1xuICAgICAgICAgICAgdmFyIGZpcnN0Qnl0ZXMgPSByZXZlcnNlQXJyYXkoYnl0ZXNGb3IoZmlyc3QpKTtcbiAgICAgICAgICAgIHZhciBzZWNvbmRCeXRlcyA9IHJldmVyc2VBcnJheShieXRlc0ZvcihzZWNvbmQpKTtcbiAgICAgICAgICAgIHZhciB0aGlyZEJ5dGVzID0gcmV2ZXJzZUFycmF5KGJ5dGVzRm9yKHRoaXJkKSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSBieXRlV2lkdGhzWzBdIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gKGZpcnN0Qnl0ZXNbaWR4XSB8fCAwKS50b1N0cmluZygyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IGJ5dGVXaWR0aHNbMV0gLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAoc2Vjb25kQnl0ZXNbaWR4XSB8fCAwKS50b1N0cmluZygyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IGJ5dGVXaWR0aHNbMl0gLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAodGhpcmRCeXRlc1tpZHhdIHx8IDApLnRvU3RyaW5nKDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVudHJ5VHVwbGVzID0gdGhpcy5lbnRyeVR1cGxlc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgYnl0ZVdpZHRocyA9IHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRVbmVuY29kZWRDb250ZW50c1NpemUoKSk7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKHZhciBlbnRyeUlkeCA9IDAsIGVudHJpZXNMZW4gPSBlbnRyeVR1cGxlcy5sZW5ndGg7IGVudHJ5SWR4IDwgZW50cmllc0xlbjsgZW50cnlJZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cnlUdXBsZXNbZW50cnlJZHhdLCBmaXJzdCA9IF9hWzBdLCBzZWNvbmQgPSBfYVsxXSwgdGhpcmQgPSBfYVsyXTtcbiAgICAgICAgICAgIHZhciBmaXJzdEJ5dGVzID0gcmV2ZXJzZUFycmF5KGJ5dGVzRm9yKGZpcnN0KSk7XG4gICAgICAgICAgICB2YXIgc2Vjb25kQnl0ZXMgPSByZXZlcnNlQXJyYXkoYnl0ZXNGb3Ioc2Vjb25kKSk7XG4gICAgICAgICAgICB2YXIgdGhpcmRCeXRlcyA9IHJldmVyc2VBcnJheShieXRlc0Zvcih0aGlyZCkpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1swXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBmaXJzdEJ5dGVzW2lkeF0gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IGJ5dGVXaWR0aHNbMV0gLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gc2Vjb25kQnl0ZXNbaWR4XSB8fCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1syXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSB0aGlyZEJ5dGVzW2lkeF0gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVXaWR0aHMgPSB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIGVudHJ5V2lkdGggPSBzdW0oYnl0ZVdpZHRocyk7XG4gICAgICAgIHJldHVybiBlbnRyeVdpZHRoICogdGhpcy5lbnRyaWVzLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS51cGRhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLnVwZGF0ZURpY3QuY2FsbCh0aGlzKTtcbiAgICAgICAgdmFyIGJ5dGVXaWR0aHMgPSB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleENhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuZGljdC5jb250ZXh0O1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1cnKSwgY29udGV4dC5vYmooYnl0ZVdpZHRocykpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0luZGV4JyksIGNvbnRleHQub2JqKGluZGV4KSk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5jcmVhdGUgPSBmdW5jdGlvbiAoZGljdCwgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHZhciBzdHJlYW0gPSBuZXcgUERGQ3Jvc3NSZWZTdHJlYW0oZGljdCwgW10sIGVuY29kZSk7XG4gICAgICAgIHN0cmVhbS5hZGREZWxldGVkRW50cnkoUERGUmVmLm9mKDAsIDY1NTM1KSwgMCk7XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5vZiA9IGZ1bmN0aW9uIChkaWN0LCBlbnRyaWVzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZDcm9zc1JlZlN0cmVhbShkaWN0LCBlbnRyaWVzLCBlbmNvZGUpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkNyb3NzUmVmU3RyZWFtO1xufShQREZGbGF0ZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ3Jvc3NSZWZTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDcm9zc1JlZlN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBwYWtvIGZyb20gJ3Bha28nO1xuaW1wb3J0IHsgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGU3RyZWFtXCI7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERkZsYXRlU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZGbGF0ZVN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZGbGF0ZVN0cmVhbShkaWN0LCBlbmNvZGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGljdCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29tcHV0ZUNvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVuZW5jb2RlZENvbnRlbnRzID0gX3RoaXMuZ2V0VW5lbmNvZGVkQ29udGVudHMoKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5lbmNvZGUgPyBwYWtvLmRlZmxhdGUodW5lbmNvZGVkQ29udGVudHMpIDogdW5lbmNvZGVkQ29udGVudHM7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmVuY29kZSA9IGVuY29kZTtcbiAgICAgICAgaWYgKGVuY29kZSlcbiAgICAgICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ0ZpbHRlcicpLCBQREZOYW1lLm9mKCdGbGF0ZURlY29kZScpKTtcbiAgICAgICAgX3RoaXMuY29udGVudHNDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KF90aGlzLmNvbXB1dGVDb250ZW50cyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50c0NhY2hlLmFjY2VzcygpO1xuICAgIH07XG4gICAgUERGRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudHNDYWNoZS5hY2Nlc3MoKS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2dldFVuZW5jb2RlZENvbnRlbnRzJyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRmxhdGVTdHJlYW07XG59KFBERlN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRmxhdGVTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZGbGF0ZVN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGRmxhdGVTdHJlYW0gZnJvbSBcIi4vUERGRmxhdGVTdHJlYW1cIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyLCBsYXN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGT2JqZWN0U3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZPYmplY3RTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGT2JqZWN0U3RyZWFtKGNvbnRleHQsIG9iamVjdHMsIGVuY29kZSkge1xuICAgICAgICBpZiAoZW5jb2RlID09PSB2b2lkIDApIHsgZW5jb2RlID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb250ZXh0Lm9iaih7fSksIGVuY29kZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMub2JqZWN0cyA9IG9iamVjdHM7XG4gICAgICAgIF90aGlzLm9mZnNldHMgPSBfdGhpcy5jb21wdXRlT2JqZWN0T2Zmc2V0cygpO1xuICAgICAgICBfdGhpcy5vZmZzZXRzU3RyaW5nID0gX3RoaXMuY29tcHV0ZU9mZnNldHNTdHJpbmcoKTtcbiAgICAgICAgX3RoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVHlwZScpLCBQREZOYW1lLm9mKCdPYmpTdG0nKSk7XG4gICAgICAgIF90aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ04nKSwgUERGTnVtYmVyLm9mKF90aGlzLm9iamVjdHMubGVuZ3RoKSk7XG4gICAgICAgIF90aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0ZpcnN0JyksIFBERk51bWJlci5vZihfdGhpcy5vZmZzZXRzU3RyaW5nLmxlbmd0aCkpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuZ2V0T2JqZWN0c0NvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gUERGT2JqZWN0U3RyZWFtLndpdGhDb250ZXh0QW5kT2JqZWN0cyhjb250ZXh0IHx8IHRoaXMuZGljdC5jb250ZXh0LCB0aGlzLm9iamVjdHMuc2xpY2UoKSwgdGhpcy5lbmNvZGUpO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5vZmZzZXRzU3RyaW5nO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9iamVjdHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLm9iamVjdHNbaWR4XSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgICAgICB2YWx1ZSArPSBvYmplY3QgKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0aGlzLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSgpKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMub2Zmc2V0c1N0cmluZywgYnVmZmVyLCAwKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vYmplY3RzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5vYmplY3RzW2lkeF0sIG9iamVjdCA9IF9hWzFdO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IG9iamVjdC5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50c1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5vZmZzZXRzU3RyaW5nLmxlbmd0aCArXG4gICAgICAgICAgICBsYXN0KHRoaXMub2Zmc2V0cylbMV0gK1xuICAgICAgICAgICAgbGFzdCh0aGlzLm9iamVjdHMpWzFdLnNpemVJbkJ5dGVzKCkgK1xuICAgICAgICAgICAgMSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmNvbXB1dGVPZmZzZXRzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2Zmc2V0c1N0cmluZyA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9mZnNldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLm9mZnNldHNbaWR4XSwgb2JqZWN0TnVtYmVyID0gX2FbMF0sIG9mZnNldCA9IF9hWzFdO1xuICAgICAgICAgICAgb2Zmc2V0c1N0cmluZyArPSBvYmplY3ROdW1iZXIgKyBcIiBcIiArIG9mZnNldCArIFwiIFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZmZzZXRzU3RyaW5nO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5jb21wdXRlT2JqZWN0T2Zmc2V0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIHZhciBvZmZzZXRzID0gbmV3IEFycmF5KHRoaXMub2JqZWN0cy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9iamVjdHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLm9iamVjdHNbaWR4XSwgcmVmID0gX2FbMF0sIG9iamVjdCA9IF9hWzFdO1xuICAgICAgICAgICAgb2Zmc2V0c1tpZHhdID0gW3JlZi5vYmplY3ROdW1iZXIsIG9mZnNldF07XG4gICAgICAgICAgICBvZmZzZXQgKz0gb2JqZWN0LnNpemVJbkJ5dGVzKCkgKyAxOyAvLyAnXFxuJ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZmZzZXRzO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLndpdGhDb250ZXh0QW5kT2JqZWN0cyA9IGZ1bmN0aW9uIChjb250ZXh0LCBvYmplY3RzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZPYmplY3RTdHJlYW0oY29udGV4dCwgb2JqZWN0cywgZW5jb2RlKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZPYmplY3RTdHJlYW07XG59KFBERkZsYXRlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPYmplY3RTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPYmplY3RTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmVhbVwiO1xudmFyIFBERlBhZ2VMZWFmID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZQYWdlTGVhZiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZQYWdlTGVhZihtYXAsIGNvbnRleHQsIGF1dG9Ob3JtYWxpemVDVE0pIHtcbiAgICAgICAgaWYgKGF1dG9Ob3JtYWxpemVDVE0gPT09IHZvaWQgMCkgeyBhdXRvTm9ybWFsaXplQ1RNID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXAsIGNvbnRleHQpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm5vcm1hbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuYXV0b05vcm1hbGl6ZUNUTSA9IGF1dG9Ob3JtYWxpemVDVE07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNsb25lID0gUERGUGFnZUxlYWYuZnJvbU1hcFdpdGhDb250ZXh0KG5ldyBNYXAoKSwgY29udGV4dCB8fCB0aGlzLmNvbnRleHQsIHRoaXMuYXV0b05vcm1hbGl6ZUNUTSk7XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgY2xvbmUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5QYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUuUGFyZW50LCBQREZEaWN0KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5Db250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwKFBERk5hbWUub2YoJ0NvbnRlbnRzJykpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLkFubm90cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5Bbm5vdHMsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5CbGVlZEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5CbGVlZEJveCwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLlRyaW1Cb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUuVHJpbUJveCwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLkFydEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5BcnRCb3gsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5SZXNvdXJjZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaWN0T3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUuUmVzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5sb29rdXBNYXliZShkaWN0T3JSZWYsIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLk1lZGlhQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyYXlPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5NZWRpYUJveCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQubG9va3VwKGFycmF5T3JSZWYsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5Dcm9wQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyYXlPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5Dcm9wQm94KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5sb29rdXBNYXliZShhcnJheU9yUmVmLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuUm90YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbnVtYmVyT3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUuUm90YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5sb29rdXBNYXliZShudW1iZXJPclJlZiwgUERGTnVtYmVyKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGU7XG4gICAgICAgIHRoaXMuYXNjZW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZSlcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBub2RlLmdldChuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24gKHBhcmVudFJlZikge1xuICAgICAgICB0aGlzLnNldChQREZOYW1lLlBhcmVudCwgcGFyZW50UmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5hZGRDb250ZW50U3RyZWFtID0gZnVuY3Rpb24gKGNvbnRlbnRTdHJlYW1SZWYpIHtcbiAgICAgICAgdmFyIENvbnRlbnRzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkNvbnRlbnRzIHx8IHRoaXMuY29udGV4dC5vYmooW10pO1xuICAgICAgICB0aGlzLnNldChQREZOYW1lLkNvbnRlbnRzLCBDb250ZW50cyk7XG4gICAgICAgIENvbnRlbnRzLnB1c2goY29udGVudFN0cmVhbVJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUud3JhcENvbnRlbnRTdHJlYW1zID0gZnVuY3Rpb24gKHN0YXJ0U3RyZWFtLCBlbmRTdHJlYW0pIHtcbiAgICAgICAgdmFyIENvbnRlbnRzID0gdGhpcy5Db250ZW50cygpO1xuICAgICAgICBpZiAoQ29udGVudHMgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgQ29udGVudHMuaW5zZXJ0KDAsIHN0YXJ0U3RyZWFtKTtcbiAgICAgICAgICAgIENvbnRlbnRzLnB1c2goZW5kU3RyZWFtKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5hZGRBbm5vdCA9IGZ1bmN0aW9uIChhbm5vdFJlZikge1xuICAgICAgICB2YXIgQW5ub3RzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkFubm90cztcbiAgICAgICAgQW5ub3RzLnB1c2goYW5ub3RSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLnJlbW92ZUFubm90ID0gZnVuY3Rpb24gKGFubm90UmVmKSB7XG4gICAgICAgIHZhciBBbm5vdHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuQW5ub3RzO1xuICAgICAgICB2YXIgaW5kZXggPSBBbm5vdHMuaW5kZXhPZihhbm5vdFJlZik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBBbm5vdHMucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLnNldEZvbnREaWN0aW9uYXJ5ID0gZnVuY3Rpb24gKG5hbWUsIGZvbnREaWN0UmVmKSB7XG4gICAgICAgIHZhciBGb250ID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkZvbnQ7XG4gICAgICAgIEZvbnQuc2V0KG5hbWUsIGZvbnREaWN0UmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdGb250RGljdGlvbmFyeUtleSA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgdmFyIEZvbnQgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRm9udDtcbiAgICAgICAgcmV0dXJuIEZvbnQudW5pcXVlS2V5KHRhZyk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubmV3Rm9udERpY3Rpb25hcnkgPSBmdW5jdGlvbiAodGFnLCBmb250RGljdFJlZikge1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5uZXdGb250RGljdGlvbmFyeUtleSh0YWcpO1xuICAgICAgICB0aGlzLnNldEZvbnREaWN0aW9uYXJ5KGtleSwgZm9udERpY3RSZWYpO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLnNldFhPYmplY3QgPSBmdW5jdGlvbiAobmFtZSwgeE9iamVjdFJlZikge1xuICAgICAgICB2YXIgWE9iamVjdCA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5YT2JqZWN0O1xuICAgICAgICBYT2JqZWN0LnNldChuYW1lLCB4T2JqZWN0UmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdYT2JqZWN0S2V5ID0gZnVuY3Rpb24gKHRhZykge1xuICAgICAgICB2YXIgWE9iamVjdCA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5YT2JqZWN0O1xuICAgICAgICByZXR1cm4gWE9iamVjdC51bmlxdWVLZXkodGFnKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdYT2JqZWN0ID0gZnVuY3Rpb24gKHRhZywgeE9iamVjdFJlZikge1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5uZXdYT2JqZWN0S2V5KHRhZyk7XG4gICAgICAgIHRoaXMuc2V0WE9iamVjdChrZXksIHhPYmplY3RSZWYpO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLnNldEV4dEdTdGF0ZSA9IGZ1bmN0aW9uIChuYW1lLCBleHRHU3RhdGVSZWYpIHtcbiAgICAgICAgdmFyIEV4dEdTdGF0ZSA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5FeHRHU3RhdGU7XG4gICAgICAgIEV4dEdTdGF0ZS5zZXQobmFtZSwgZXh0R1N0YXRlUmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdFeHRHU3RhdGVLZXkgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHZhciBFeHRHU3RhdGUgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRXh0R1N0YXRlO1xuICAgICAgICByZXR1cm4gRXh0R1N0YXRlLnVuaXF1ZUtleSh0YWcpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld0V4dEdTdGF0ZSA9IGZ1bmN0aW9uICh0YWcsIGV4dEdTdGF0ZVJlZikge1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5uZXdFeHRHU3RhdGVLZXkodGFnKTtcbiAgICAgICAgdGhpcy5zZXRFeHRHU3RhdGUoa2V5LCBleHRHU3RhdGVSZWYpO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLmFzY2VuZCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgICAgIHZpc2l0b3IodGhpcyk7XG4gICAgICAgIHZhciBQYXJlbnQgPSB0aGlzLlBhcmVudCgpO1xuICAgICAgICBpZiAoUGFyZW50KVxuICAgICAgICAgICAgUGFyZW50LmFzY2VuZCh2aXNpdG9yKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICB2YXIgY29udGVudHNSZWYgPSB0aGlzLmdldChQREZOYW1lLkNvbnRlbnRzKTtcbiAgICAgICAgdmFyIGNvbnRlbnRzID0gdGhpcy5jb250ZXh0Lmxvb2t1cChjb250ZW50c1JlZik7XG4gICAgICAgIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIFBERlN0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoUERGTmFtZS5Db250ZW50cywgY29udGV4dC5vYmooW2NvbnRlbnRzUmVmXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF1dG9Ob3JtYWxpemVDVE0pIHtcbiAgICAgICAgICAgIHRoaXMud3JhcENvbnRlbnRTdHJlYW1zKHRoaXMuY29udGV4dC5nZXRQdXNoR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW0oKSwgdGhpcy5jb250ZXh0LmdldFBvcEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IENsb25lIGBSZXNvdXJjZXNgIGlmIGl0IGlzIGluaGVyaXRlZFxuICAgICAgICB2YXIgZGljdE9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLlJlc291cmNlcyk7XG4gICAgICAgIHZhciBSZXNvdXJjZXMgPSBjb250ZXh0Lmxvb2t1cE1heWJlKGRpY3RPclJlZiwgUERGRGljdCkgfHwgY29udGV4dC5vYmooe30pO1xuICAgICAgICB0aGlzLnNldChQREZOYW1lLlJlc291cmNlcywgUmVzb3VyY2VzKTtcbiAgICAgICAgLy8gVE9ETzogQ2xvbmUgYEZvbnRgIGlmIGl0IGlzIGluaGVyaXRlZFxuICAgICAgICB2YXIgRm9udCA9IFJlc291cmNlcy5sb29rdXBNYXliZShQREZOYW1lLkZvbnQsIFBERkRpY3QpIHx8IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgUmVzb3VyY2VzLnNldChQREZOYW1lLkZvbnQsIEZvbnQpO1xuICAgICAgICAvLyBUT0RPOiBDbG9uZSBgWE9iamVjdGAgaWYgaXQgaXMgaW5oZXJpdGVkXG4gICAgICAgIHZhciBYT2JqZWN0ID0gUmVzb3VyY2VzLmxvb2t1cE1heWJlKFBERk5hbWUuWE9iamVjdCwgUERGRGljdCkgfHwgY29udGV4dC5vYmooe30pO1xuICAgICAgICBSZXNvdXJjZXMuc2V0KFBERk5hbWUuWE9iamVjdCwgWE9iamVjdCk7XG4gICAgICAgIC8vIFRPRE86IENsb25lIGBFeHRHU3RhdGVgIGlmIGl0IGlzIGluaGVyaXRlZFxuICAgICAgICB2YXIgRXh0R1N0YXRlID0gUmVzb3VyY2VzLmxvb2t1cE1heWJlKFBERk5hbWUuRXh0R1N0YXRlLCBQREZEaWN0KSB8fCBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIFJlc291cmNlcy5zZXQoUERGTmFtZS5FeHRHU3RhdGUsIEV4dEdTdGF0ZSk7XG4gICAgICAgIHZhciBBbm5vdHMgPSB0aGlzLkFubm90cygpIHx8IGNvbnRleHQub2JqKFtdKTtcbiAgICAgICAgdGhpcy5zZXQoUERGTmFtZS5Bbm5vdHMsIEFubm90cyk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplZCA9IHRydWU7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubm9ybWFsaXplZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubm9ybWFsaXplKCk7XG4gICAgICAgIHZhciBBbm5vdHMgPSB0aGlzLkFubm90cygpO1xuICAgICAgICB2YXIgUmVzb3VyY2VzID0gdGhpcy5SZXNvdXJjZXMoKTtcbiAgICAgICAgdmFyIENvbnRlbnRzID0gdGhpcy5Db250ZW50cygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgQW5ub3RzOiBBbm5vdHMsXG4gICAgICAgICAgICBSZXNvdXJjZXM6IFJlc291cmNlcyxcbiAgICAgICAgICAgIENvbnRlbnRzOiBDb250ZW50cyxcbiAgICAgICAgICAgIEZvbnQ6IFJlc291cmNlcy5sb29rdXAoUERGTmFtZS5Gb250LCBQREZEaWN0KSxcbiAgICAgICAgICAgIFhPYmplY3Q6IFJlc291cmNlcy5sb29rdXAoUERGTmFtZS5YT2JqZWN0LCBQREZEaWN0KSxcbiAgICAgICAgICAgIEV4dEdTdGF0ZTogUmVzb3VyY2VzLmxvb2t1cChQREZOYW1lLkV4dEdTdGF0ZSwgUERGRGljdCksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5Jbmhlcml0YWJsZUVudHJpZXMgPSBbXG4gICAgICAgICdSZXNvdXJjZXMnLFxuICAgICAgICAnTWVkaWFCb3gnLFxuICAgICAgICAnQ3JvcEJveCcsXG4gICAgICAgICdSb3RhdGUnLFxuICAgIF07XG4gICAgUERGUGFnZUxlYWYud2l0aENvbnRleHRBbmRQYXJlbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBkaWN0ID0gbmV3IE1hcCgpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLlR5cGUsIFBERk5hbWUuUGFnZSk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUuUGFyZW50LCBwYXJlbnQpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLlJlc291cmNlcywgY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5NZWRpYUJveCwgY29udGV4dC5vYmooWzAsIDAsIDYxMiwgNzkyXSkpO1xuICAgICAgICByZXR1cm4gbmV3IFBERlBhZ2VMZWFmKGRpY3QsIGNvbnRleHQsIGZhbHNlKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLmZyb21NYXBXaXRoQ29udGV4dCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQsIGF1dG9Ob3JtYWxpemVDVE0pIHtcbiAgICAgICAgaWYgKGF1dG9Ob3JtYWxpemVDVE0gPT09IHZvaWQgMCkgeyBhdXRvTm9ybWFsaXplQ1RNID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gbmV3IFBERlBhZ2VMZWFmKG1hcCwgY29udGV4dCwgYXV0b05vcm1hbGl6ZUNUTSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGUGFnZUxlYWY7XG59KFBERkRpY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlBhZ2VMZWFmO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUGFnZUxlYWYuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGUGFnZUxlYWYgZnJvbSBcIi4vUERGUGFnZUxlYWZcIjtcbmltcG9ydCB7IEludmFsaWRUYXJnZXRJbmRleEVycm9yLCBDb3JydXB0UGFnZVRyZWVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZQYWdlVHJlZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUGFnZVRyZWUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUGFnZVRyZWUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLlBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwKFBERk5hbWUub2YoJ1BhcmVudCcpKTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5LaWRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXAoUERGTmFtZS5vZignS2lkcycpLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cChQREZOYW1lLm9mKCdDb3VudCcpLCBQREZOdW1iZXIpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLnB1c2hUcmVlTm9kZSA9IGZ1bmN0aW9uICh0cmVlUmVmKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIEtpZHMucHVzaCh0cmVlUmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5wdXNoTGVhZk5vZGUgPSBmdW5jdGlvbiAobGVhZlJlZikge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICB0aGlzLmluc2VydExlYWZLaWQoS2lkcy5zaXplKCksIGxlYWZSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgZ2l2ZW4gcmVmIGFzIGEgbGVhZiBub2RlIG9mIHRoaXMgcGFnZSB0cmVlIGF0IHRoZSBzcGVjaWZpZWRcbiAgICAgKiBpbmRleCAoemVyby1iYXNlZCkuIEFsc28gaW5jcmVtZW50cyB0aGUgYENvdW50YCBvZiBlYWNoIHBhZ2UgdHJlZSBpbiB0aGVcbiAgICAgKiBoaWVyYXJjaHkgdG8gYWNjb21vZGF0ZSB0aGUgbmV3IHBhZ2UuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSByZWYgb2YgdGhlIFBERlBhZ2VUcmVlIG5vZGUgaW50byB3aGljaCBgbGVhZlJlZmAgd2FzIGluc2VydGVkLFxuICAgICAqIG9yIGB1bmRlZmluZWRgIGlmIGl0IHdhcyBpbnNlcnRlZCBpbnRvIHRoZSByb290IG5vZGUgKHRoZSBQREZQYWdlVHJlZSB1cG9uXG4gICAgICogd2hpY2ggdGhlIG1ldGhvZCB3YXMgZmlyc3QgY2FsbGVkKS5cbiAgICAgKi9cbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuaW5zZXJ0TGVhZk5vZGUgPSBmdW5jdGlvbiAobGVhZlJlZiwgdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgdmFyIENvdW50ID0gdGhpcy5Db3VudCgpLmFzTnVtYmVyKCk7XG4gICAgICAgIGlmICh0YXJnZXRJbmRleCA+IENvdW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRhcmdldEluZGV4RXJyb3IodGFyZ2V0SW5kZXgsIENvdW50KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCA9IHRhcmdldEluZGV4O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBLaWRzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgaWYgKGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJbnNlcnQgcGFnZSBhbmQgcmV0dXJuXG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMZWFmS2lkKGlkeCwgbGVhZlJlZik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBraWRSZWYgPSBLaWRzLmdldChpZHgpO1xuICAgICAgICAgICAgdmFyIGtpZCA9IHRoaXMuY29udGV4dC5sb29rdXAoa2lkUmVmKTtcbiAgICAgICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBQREZQYWdlVHJlZSkge1xuICAgICAgICAgICAgICAgIGlmIChraWQuQ291bnQoKS5hc051bWJlcigpID4gbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaWcgaW5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChraWQuaW5zZXJ0TGVhZk5vZGUobGVhZlJlZiwgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCkgfHwga2lkUmVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb25cbiAgICAgICAgICAgICAgICAgICAgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCAtPSBraWQuQ291bnQoKS5hc051bWJlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBQREZQYWdlTGVhZikge1xuICAgICAgICAgICAgICAgIC8vIE1vdmUgb25cbiAgICAgICAgICAgICAgICBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0IC09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgPT09IDApIHtcbiAgICAgICAgICAgIC8vIEluc2VydCBwYWdlIGF0IHRoZSBlbmQgYW5kIHJldHVyblxuICAgICAgICAgICAgdGhpcy5pbnNlcnRMZWFmS2lkKEtpZHMuc2l6ZSgpLCBsZWFmUmVmKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlIGlmIGB0YXJnZXRJbmRleGAgaXMgdmFsaWRcbiAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRQYWdlVHJlZUVycm9yKHRhcmdldEluZGV4LCAnaW5zZXJ0TGVhZk5vZGUnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGxlYWYgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ICh6ZXJvLWJhc2VkKSBmcm9tIHRoaXMgcGFnZVxuICAgICAqIHRyZWUuIEFsc28gZGVjcmVtZW50cyB0aGUgYENvdW50YCBvZiBlYWNoIHBhZ2UgdHJlZSBpbiB0aGUgaGllcmFyY2h5IHRvXG4gICAgICogYWNjb3VudCBmb3IgdGhlIHJlbW92ZWQgcGFnZS5cbiAgICAgKlxuICAgICAqIElmIGBwcnVuZWAgaXMgdHJ1ZSwgdGhlbiBpbnRlcm1lZGlhdGUgdHJlZSBub2RlcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGVcbiAgICAgKiB0cmVlIGlmIHRoZXkgY29udGFpbiAwIGNoaWxkcmVuIGFmdGVyIHRoZSBsZWFmIG5vZGUgaXMgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUucmVtb3ZlTGVhZk5vZGUgPSBmdW5jdGlvbiAodGFyZ2V0SW5kZXgsIHBydW5lKSB7XG4gICAgICAgIGlmIChwcnVuZSA9PT0gdm9pZCAwKSB7IHBydW5lID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICB2YXIgQ291bnQgPSB0aGlzLkNvdW50KCkuYXNOdW1iZXIoKTtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IENvdW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRhcmdldEluZGV4RXJyb3IodGFyZ2V0SW5kZXgsIENvdW50KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCA9IHRhcmdldEluZGV4O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBLaWRzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGtpZFJlZiA9IEtpZHMuZ2V0KGlkeCk7XG4gICAgICAgICAgICB2YXIga2lkID0gdGhpcy5jb250ZXh0Lmxvb2t1cChraWRSZWYpO1xuICAgICAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtpZC5Db3VudCgpLmFzTnVtYmVyKCkgPiBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERpZyBpblxuICAgICAgICAgICAgICAgICAgICBraWQucmVtb3ZlTGVhZk5vZGUobGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCwgcHJ1bmUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJ1bmUgJiYga2lkLktpZHMoKS5zaXplKCkgPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBLaWRzLnJlbW92ZShpZHgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uXG4gICAgICAgICAgICAgICAgICAgIGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgLT0ga2lkLkNvdW50KCkuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUERGUGFnZUxlYWYpIHtcbiAgICAgICAgICAgICAgICBpZiAobGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcGFnZSBhbmQgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlS2lkKGlkeCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb25cbiAgICAgICAgICAgICAgICAgICAgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgaWYgYHRhcmdldEluZGV4YCBpcyB2YWxpZFxuICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFBhZ2VUcmVlRXJyb3IodGFyZ2V0SW5kZXgsICdyZW1vdmVMZWFmTm9kZScpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLmFzY2VuZCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgICAgIHZpc2l0b3IodGhpcyk7XG4gICAgICAgIHZhciBQYXJlbnQgPSB0aGlzLlBhcmVudCgpO1xuICAgICAgICBpZiAoUGFyZW50KVxuICAgICAgICAgICAgUGFyZW50LmFzY2VuZCh2aXNpdG9yKTtcbiAgICB9O1xuICAgIC8qKiBQZXJmb3JtcyBhIFBvc3QtT3JkZXIgdHJhdmVyc2FsIG9mIHRoaXMgcGFnZSB0cmVlICovXG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLnRyYXZlcnNlID0gZnVuY3Rpb24gKHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gS2lkcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBraWRSZWYgPSBLaWRzLmdldChpZHgpO1xuICAgICAgICAgICAgdmFyIGtpZCA9IHRoaXMuY29udGV4dC5sb29rdXAoa2lkUmVmKTtcbiAgICAgICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBQREZQYWdlVHJlZSlcbiAgICAgICAgICAgICAgICBraWQudHJhdmVyc2UodmlzaXRvcik7XG4gICAgICAgICAgICB2aXNpdG9yKGtpZCwga2lkUmVmKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLmluc2VydExlYWZLaWQgPSBmdW5jdGlvbiAoa2lkSWR4LCBsZWFmUmVmKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIHRoaXMuYXNjZW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICB2YXIgbmV3Q291bnQgPSBub2RlLkNvdW50KCkuYXNOdW1iZXIoKSArIDE7XG4gICAgICAgICAgICBub2RlLnNldChQREZOYW1lLm9mKCdDb3VudCcpLCBQREZOdW1iZXIub2YobmV3Q291bnQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEtpZHMuaW5zZXJ0KGtpZElkeCwgbGVhZlJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUucmVtb3ZlS2lkID0gZnVuY3Rpb24gKGtpZElkeCkge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICB2YXIga2lkID0gS2lkcy5sb29rdXAoa2lkSWR4KTtcbiAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VMZWFmKSB7XG4gICAgICAgICAgICB0aGlzLmFzY2VuZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdDb3VudCA9IG5vZGUuQ291bnQoKS5hc051bWJlcigpIC0gMTtcbiAgICAgICAgICAgICAgICBub2RlLnNldChQREZOYW1lLm9mKCdDb3VudCcpLCBQREZOdW1iZXIub2YobmV3Q291bnQpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIEtpZHMucmVtb3ZlKGtpZElkeCk7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS53aXRoQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBuZXcgTWFwKCk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ1R5cGUnKSwgUERGTmFtZS5vZignUGFnZXMnKSk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ0tpZHMnKSwgY29udGV4dC5vYmooW10pKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignQ291bnQnKSwgY29udGV4dC5vYmooMCkpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignUGFyZW50JyksIHBhcmVudCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZVRyZWUoZGljdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5mcm9tTWFwV2l0aENvbnRleHQgPSBmdW5jdGlvbiAobWFwLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZVRyZWUobWFwLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZQYWdlVHJlZTtcbn0oUERGRGljdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUGFnZVRyZWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYWdlVHJlZS5qcy5tYXAiLCJ2YXIgQ2hhckNvZGVzO1xuKGZ1bmN0aW9uIChDaGFyQ29kZXMpIHtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTnVsbFwiXSA9IDBdID0gXCJOdWxsXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkJhY2tzcGFjZVwiXSA9IDhdID0gXCJCYWNrc3BhY2VcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiVGFiXCJdID0gOV0gPSBcIlRhYlwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJOZXdsaW5lXCJdID0gMTBdID0gXCJOZXdsaW5lXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkZvcm1GZWVkXCJdID0gMTJdID0gXCJGb3JtRmVlZFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJDYXJyaWFnZVJldHVyblwiXSA9IDEzXSA9IFwiQ2FycmlhZ2VSZXR1cm5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiU3BhY2VcIl0gPSAzMl0gPSBcIlNwYWNlXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkV4Y2xhbWF0aW9uUG9pbnRcIl0gPSAzM10gPSBcIkV4Y2xhbWF0aW9uUG9pbnRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiSGFzaFwiXSA9IDM1XSA9IFwiSGFzaFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJQZXJjZW50XCJdID0gMzddID0gXCJQZXJjZW50XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxlZnRQYXJlblwiXSA9IDQwXSA9IFwiTGVmdFBhcmVuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlJpZ2h0UGFyZW5cIl0gPSA0MV0gPSBcIlJpZ2h0UGFyZW5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUGx1c1wiXSA9IDQzXSA9IFwiUGx1c1wiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJNaW51c1wiXSA9IDQ1XSA9IFwiTWludXNcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRGFzaFwiXSA9IDQ1XSA9IFwiRGFzaFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJQZXJpb2RcIl0gPSA0Nl0gPSBcIlBlcmlvZFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJGb3J3YXJkU2xhc2hcIl0gPSA0N10gPSBcIkZvcndhcmRTbGFzaFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJaZXJvXCJdID0gNDhdID0gXCJaZXJvXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk9uZVwiXSA9IDQ5XSA9IFwiT25lXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlR3b1wiXSA9IDUwXSA9IFwiVHdvXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlRocmVlXCJdID0gNTFdID0gXCJUaHJlZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJGb3VyXCJdID0gNTJdID0gXCJGb3VyXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkZpdmVcIl0gPSA1M10gPSBcIkZpdmVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiU2l4XCJdID0gNTRdID0gXCJTaXhcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiU2V2ZW5cIl0gPSA1NV0gPSBcIlNldmVuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkVpZ2h0XCJdID0gNTZdID0gXCJFaWdodFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJOaW5lXCJdID0gNTddID0gXCJOaW5lXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxlc3NUaGFuXCJdID0gNjBdID0gXCJMZXNzVGhhblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJHcmVhdGVyVGhhblwiXSA9IDYyXSA9IFwiR3JlYXRlclRoYW5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiQVwiXSA9IDY1XSA9IFwiQVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJEXCJdID0gNjhdID0gXCJEXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkVcIl0gPSA2OV0gPSBcIkVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRlwiXSA9IDcwXSA9IFwiRlwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJPXCJdID0gNzldID0gXCJPXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlBcIl0gPSA4MF0gPSBcIlBcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUlwiXSA9IDgyXSA9IFwiUlwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJMZWZ0U3F1YXJlQnJhY2tldFwiXSA9IDkxXSA9IFwiTGVmdFNxdWFyZUJyYWNrZXRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiQmFja1NsYXNoXCJdID0gOTJdID0gXCJCYWNrU2xhc2hcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUmlnaHRTcXVhcmVCcmFja2V0XCJdID0gOTNdID0gXCJSaWdodFNxdWFyZUJyYWNrZXRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiYVwiXSA9IDk3XSA9IFwiYVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJiXCJdID0gOThdID0gXCJiXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImRcIl0gPSAxMDBdID0gXCJkXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImVcIl0gPSAxMDFdID0gXCJlXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImZcIl0gPSAxMDJdID0gXCJmXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImlcIl0gPSAxMDVdID0gXCJpXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImpcIl0gPSAxMDZdID0gXCJqXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImxcIl0gPSAxMDhdID0gXCJsXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIm1cIl0gPSAxMDldID0gXCJtXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIm5cIl0gPSAxMTBdID0gXCJuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIm9cIl0gPSAxMTFdID0gXCJvXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcInJcIl0gPSAxMTRdID0gXCJyXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcInNcIl0gPSAxMTVdID0gXCJzXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcInRcIl0gPSAxMTZdID0gXCJ0XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcInVcIl0gPSAxMTddID0gXCJ1XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcInhcIl0gPSAxMjBdID0gXCJ4XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxlZnRDdXJseVwiXSA9IDEyM10gPSBcIkxlZnRDdXJseVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJSaWdodEN1cmx5XCJdID0gMTI1XSA9IFwiUmlnaHRDdXJseVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJUaWxkZVwiXSA9IDEyNl0gPSBcIlRpbGRlXCI7XG59KShDaGFyQ29kZXMgfHwgKENoYXJDb2RlcyA9IHt9KSk7XG5leHBvcnQgZGVmYXVsdCBDaGFyQ29kZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFyQ29kZXMuanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi9DaGFyQ29kZXNcIjtcbmV4cG9ydCB2YXIgSXNEZWxpbWl0ZXIgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLkxlZnRQYXJlbl0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLlJpZ2h0UGFyZW5dID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5MZXNzVGhhbl0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLkdyZWF0ZXJUaGFuXSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuTGVmdFNxdWFyZUJyYWNrZXRdID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5SaWdodFNxdWFyZUJyYWNrZXRdID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5MZWZ0Q3VybHldID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5SaWdodEN1cmx5XSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuRm9yd2FyZFNsYXNoXSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuUGVyY2VudF0gPSAxO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVsaW1pdGVycy5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuL0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgSXNEZWxpbWl0ZXIgfSBmcm9tIFwiLi9EZWxpbWl0ZXJzXCI7XG5pbXBvcnQgeyBJc1doaXRlc3BhY2UgfSBmcm9tIFwiLi9XaGl0ZXNwYWNlXCI7XG5leHBvcnQgdmFyIElzSXJyZWd1bGFyID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAodmFyIGlkeCA9IDAsIGxlbiA9IDI1NjsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgIElzSXJyZWd1bGFyW2lkeF0gPSBJc1doaXRlc3BhY2VbaWR4XSB8fCBJc0RlbGltaXRlcltpZHhdID8gMSA6IDA7XG59XG5Jc0lycmVndWxhcltDaGFyQ29kZXMuSGFzaF0gPSAxO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXJyZWd1bGFyLmpzLm1hcCIsImltcG9ydCB7IF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuL0NoYXJDb2Rlc1wiO1xudmFyIFNwYWNlID0gQ2hhckNvZGVzLlNwYWNlLCBDYXJyaWFnZVJldHVybiA9IENoYXJDb2Rlcy5DYXJyaWFnZVJldHVybiwgTmV3bGluZSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xudmFyIHN0cmVhbSA9IFtcbiAgICBDaGFyQ29kZXMucyxcbiAgICBDaGFyQ29kZXMudCxcbiAgICBDaGFyQ29kZXMucixcbiAgICBDaGFyQ29kZXMuZSxcbiAgICBDaGFyQ29kZXMuYSxcbiAgICBDaGFyQ29kZXMubSxcbl07XG52YXIgZW5kc3RyZWFtID0gW1xuICAgIENoYXJDb2Rlcy5lLFxuICAgIENoYXJDb2Rlcy5uLFxuICAgIENoYXJDb2Rlcy5kLFxuICAgIENoYXJDb2Rlcy5zLFxuICAgIENoYXJDb2Rlcy50LFxuICAgIENoYXJDb2Rlcy5yLFxuICAgIENoYXJDb2Rlcy5lLFxuICAgIENoYXJDb2Rlcy5hLFxuICAgIENoYXJDb2Rlcy5tLFxuXTtcbmV4cG9ydCB2YXIgS2V5d29yZHMgPSB7XG4gICAgaGVhZGVyOiBbXG4gICAgICAgIENoYXJDb2Rlcy5QZXJjZW50LFxuICAgICAgICBDaGFyQ29kZXMuUCxcbiAgICAgICAgQ2hhckNvZGVzLkQsXG4gICAgICAgIENoYXJDb2Rlcy5GLFxuICAgICAgICBDaGFyQ29kZXMuRGFzaCxcbiAgICBdLFxuICAgIGVvZjogW1xuICAgICAgICBDaGFyQ29kZXMuUGVyY2VudCxcbiAgICAgICAgQ2hhckNvZGVzLlBlcmNlbnQsXG4gICAgICAgIENoYXJDb2Rlcy5FLFxuICAgICAgICBDaGFyQ29kZXMuTyxcbiAgICAgICAgQ2hhckNvZGVzLkYsXG4gICAgXSxcbiAgICBvYmo6IFtDaGFyQ29kZXMubywgQ2hhckNvZGVzLmIsIENoYXJDb2Rlcy5qXSxcbiAgICBlbmRvYmo6IFtcbiAgICAgICAgQ2hhckNvZGVzLmUsXG4gICAgICAgIENoYXJDb2Rlcy5uLFxuICAgICAgICBDaGFyQ29kZXMuZCxcbiAgICAgICAgQ2hhckNvZGVzLm8sXG4gICAgICAgIENoYXJDb2Rlcy5iLFxuICAgICAgICBDaGFyQ29kZXMuaixcbiAgICBdLFxuICAgIHhyZWY6IFtDaGFyQ29kZXMueCwgQ2hhckNvZGVzLnIsIENoYXJDb2Rlcy5lLCBDaGFyQ29kZXMuZl0sXG4gICAgdHJhaWxlcjogW1xuICAgICAgICBDaGFyQ29kZXMudCxcbiAgICAgICAgQ2hhckNvZGVzLnIsXG4gICAgICAgIENoYXJDb2Rlcy5hLFxuICAgICAgICBDaGFyQ29kZXMuaSxcbiAgICAgICAgQ2hhckNvZGVzLmwsXG4gICAgICAgIENoYXJDb2Rlcy5lLFxuICAgICAgICBDaGFyQ29kZXMucixcbiAgICBdLFxuICAgIHN0YXJ0eHJlZjogW1xuICAgICAgICBDaGFyQ29kZXMucyxcbiAgICAgICAgQ2hhckNvZGVzLnQsXG4gICAgICAgIENoYXJDb2Rlcy5hLFxuICAgICAgICBDaGFyQ29kZXMucixcbiAgICAgICAgQ2hhckNvZGVzLnQsXG4gICAgICAgIENoYXJDb2Rlcy54LFxuICAgICAgICBDaGFyQ29kZXMucixcbiAgICAgICAgQ2hhckNvZGVzLmUsXG4gICAgICAgIENoYXJDb2Rlcy5mLFxuICAgIF0sXG4gICAgdHJ1ZTogW0NoYXJDb2Rlcy50LCBDaGFyQ29kZXMuciwgQ2hhckNvZGVzLnUsIENoYXJDb2Rlcy5lXSxcbiAgICBmYWxzZTogW0NoYXJDb2Rlcy5mLCBDaGFyQ29kZXMuYSwgQ2hhckNvZGVzLmwsIENoYXJDb2Rlcy5zLCBDaGFyQ29kZXMuZV0sXG4gICAgbnVsbDogW0NoYXJDb2Rlcy5uLCBDaGFyQ29kZXMudSwgQ2hhckNvZGVzLmwsIENoYXJDb2Rlcy5sXSxcbiAgICBzdHJlYW06IHN0cmVhbSxcbiAgICBzdHJlYW1FT0YxOiBfX3NwcmVhZEFycmF5cyhzdHJlYW0sIFtTcGFjZSwgQ2FycmlhZ2VSZXR1cm4sIE5ld2xpbmVdKSxcbiAgICBzdHJlYW1FT0YyOiBfX3NwcmVhZEFycmF5cyhzdHJlYW0sIFtDYXJyaWFnZVJldHVybiwgTmV3bGluZV0pLFxuICAgIHN0cmVhbUVPRjM6IF9fc3ByZWFkQXJyYXlzKHN0cmVhbSwgW0NhcnJpYWdlUmV0dXJuXSksXG4gICAgc3RyZWFtRU9GNDogX19zcHJlYWRBcnJheXMoc3RyZWFtLCBbTmV3bGluZV0pLFxuICAgIGVuZHN0cmVhbTogZW5kc3RyZWFtLFxuICAgIEVPRjFlbmRzdHJlYW06IF9fc3ByZWFkQXJyYXlzKFtDYXJyaWFnZVJldHVybiwgTmV3bGluZV0sIGVuZHN0cmVhbSksXG4gICAgRU9GMmVuZHN0cmVhbTogX19zcHJlYWRBcnJheXMoW0NhcnJpYWdlUmV0dXJuXSwgZW5kc3RyZWFtKSxcbiAgICBFT0YzZW5kc3RyZWFtOiBfX3NwcmVhZEFycmF5cyhbTmV3bGluZV0sIGVuZHN0cmVhbSksXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2V5d29yZHMuanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi9DaGFyQ29kZXNcIjtcbmV4cG9ydCB2YXIgSXNEaWdpdCA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5aZXJvXSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5PbmVdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLlR3b10gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuVGhyZWVdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLkZvdXJdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLkZpdmVdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLlNpeF0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuU2V2ZW5dID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLkVpZ2h0XSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5OaW5lXSA9IDE7XG5leHBvcnQgdmFyIElzTnVtZXJpY1ByZWZpeCA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5Jc051bWVyaWNQcmVmaXhbQ2hhckNvZGVzLlBlcmlvZF0gPSAxO1xuSXNOdW1lcmljUHJlZml4W0NoYXJDb2Rlcy5QbHVzXSA9IDE7XG5Jc051bWVyaWNQcmVmaXhbQ2hhckNvZGVzLk1pbnVzXSA9IDE7XG5leHBvcnQgdmFyIElzTnVtZXJpYyA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5mb3IgKHZhciBpZHggPSAwLCBsZW4gPSAyNTY7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICBJc051bWVyaWNbaWR4XSA9IElzRGlnaXRbaWR4XSB8fCBJc051bWVyaWNQcmVmaXhbaWR4XSA/IDEgOiAwO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TnVtZXJpYy5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuL0NoYXJDb2Rlc1wiO1xuZXhwb3J0IHZhciBJc1doaXRlc3BhY2UgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuSXNXaGl0ZXNwYWNlW0NoYXJDb2Rlcy5OdWxsXSA9IDE7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLlRhYl0gPSAxO1xuSXNXaGl0ZXNwYWNlW0NoYXJDb2Rlcy5OZXdsaW5lXSA9IDE7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLkZvcm1GZWVkXSA9IDE7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLkNhcnJpYWdlUmV0dXJuXSA9IDE7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLlNwYWNlXSA9IDE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGl0ZXNwYWNlLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkhlYWRlciBmcm9tIFwiLi4vZG9jdW1lbnQvUERGSGVhZGVyXCI7XG5pbXBvcnQgUERGVHJhaWxlciBmcm9tIFwiLi4vZG9jdW1lbnQvUERGVHJhaWxlclwiO1xuaW1wb3J0IFBERkludmFsaWRPYmplY3QgZnJvbSBcIi4uL29iamVjdHMvUERGSW52YWxpZE9iamVjdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmVhbVwiO1xuaW1wb3J0IFBERkNyb3NzUmVmU3RyZWFtIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERkNyb3NzUmVmU3RyZWFtXCI7XG5pbXBvcnQgUERGT2JqZWN0U3RyZWFtIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERk9iamVjdFN0cmVhbVwiO1xuaW1wb3J0IFBERldyaXRlciBmcm9tIFwiLi9QREZXcml0ZXJcIjtcbmltcG9ydCB7IGxhc3QsIHdhaXRGb3JUaWNrIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGU3RyZWFtV3JpdGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZTdHJlYW1Xcml0ZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGU3RyZWFtV3JpdGVyKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrLCBlbmNvZGVTdHJlYW1zLCBvYmplY3RzUGVyU3RyZWFtKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNvbnRleHQsIG9iamVjdHNQZXJUaWNrKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lbmNvZGVTdHJlYW1zID0gZW5jb2RlU3RyZWFtcztcbiAgICAgICAgX3RoaXMub2JqZWN0c1BlclN0cmVhbSA9IG9iamVjdHNQZXJTdHJlYW07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5jb21wdXRlQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9iamVjdE51bWJlciwgaGVhZGVyLCBzaXplLCB4cmVmU3RyZWFtLCB1bmNvbXByZXNzZWRPYmplY3RzLCBjb21wcmVzc2VkT2JqZWN0cywgb2JqZWN0U3RyZWFtUmVmcywgaW5kaXJlY3RPYmplY3RzLCBpZHgsIGxlbiwgaW5kaXJlY3RPYmplY3QsIHJlZiwgb2JqZWN0LCBzaG91bGROb3RDb21wcmVzcywgY2h1bmssIG9iamVjdFN0cmVhbVJlZiwgaWR4LCBsZW4sIGNodW5rLCByZWYsIG9iamVjdFN0cmVhbSwgeHJlZlN0cmVhbVJlZiwgeHJlZk9mZnNldCwgdHJhaWxlcjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE51bWJlciA9IHRoaXMuY29udGV4dC5sYXJnZXN0T2JqZWN0TnVtYmVyICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFBERkhlYWRlci5mb3JWZXJzaW9uKDEsIDcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGhlYWRlci5zaXplSW5CeXRlcygpICsgMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0gPSBQREZDcm9zc1JlZlN0cmVhbS5jcmVhdGUodGhpcy5jcmVhdGVUcmFpbGVyRGljdCgpLCB0aGlzLmVuY29kZVN0cmVhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkT2JqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZE9iamVjdHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN0cmVhbVJlZnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0T2JqZWN0cyA9IHRoaXMuY29udGV4dC5lbnVtZXJhdGVJbmRpcmVjdE9iamVjdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IGluZGlyZWN0T2JqZWN0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3RPYmplY3QgPSBpbmRpcmVjdE9iamVjdHNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IGluZGlyZWN0T2JqZWN0WzBdLCBvYmplY3QgPSBpbmRpcmVjdE9iamVjdFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZE5vdENvbXByZXNzID0gcmVmID09PSB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uRW5jcnlwdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFBERlN0cmVhbSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFBERkludmFsaWRPYmplY3QgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYuZ2VuZXJhdGlvbk51bWJlciAhPT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkTm90Q29tcHJlc3MpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkT2JqZWN0cy5wdXNoKGluZGlyZWN0T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0uYWRkVW5jb21wcmVzc2VkRW50cnkocmVmLCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jb21wdXRlSW5kaXJlY3RPYmplY3RTaXplKGluZGlyZWN0T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRXYWl0Rm9yVGljaygxKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB3YWl0Rm9yVGljaygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA9IGxhc3QoY29tcHJlc3NlZE9iamVjdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3RyZWFtUmVmID0gbGFzdChvYmplY3RTdHJlYW1SZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2h1bmsgfHwgY2h1bmsubGVuZ3RoICUgdGhpcy5vYmplY3RzUGVyU3RyZWFtID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkT2JqZWN0cy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdHJlYW1SZWYgPSBQREZSZWYub2Yob2JqZWN0TnVtYmVyKyspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN0cmVhbVJlZnMucHVzaChvYmplY3RTdHJlYW1SZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbS5hZGRDb21wcmVzc2VkRW50cnkocmVmLCBvYmplY3RTdHJlYW1SZWYsIGNodW5rLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVuay5wdXNoKGluZGlyZWN0T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gY29tcHJlc3NlZE9iamVjdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpZHggPCBsZW4pKSByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA9IGNvbXByZXNzZWRPYmplY3RzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSBvYmplY3RTdHJlYW1SZWZzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdHJlYW0gPSBQREZPYmplY3RTdHJlYW0ud2l0aENvbnRleHRBbmRPYmplY3RzKHRoaXMuY29udGV4dCwgY2h1bmssIHRoaXMuZW5jb2RlU3RyZWFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtLmFkZFVuY29tcHJlc3NlZEVudHJ5KHJlZiwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRoaXMuY29tcHV0ZUluZGlyZWN0T2JqZWN0U2l6ZShbcmVmLCBvYmplY3RTdHJlYW1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZE9iamVjdHMucHVzaChbcmVmLCBvYmplY3RTdHJlYW1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRXYWl0Rm9yVGljayhjaHVuay5sZW5ndGgpKSByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtUmVmID0gUERGUmVmLm9mKG9iamVjdE51bWJlcisrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0uZGljdC5zZXQoUERGTmFtZS5vZignU2l6ZScpLCBQREZOdW1iZXIub2Yob2JqZWN0TnVtYmVyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtLmFkZFVuY29tcHJlc3NlZEVudHJ5KHhyZWZTdHJlYW1SZWYsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZk9mZnNldCA9IHNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRoaXMuY29tcHV0ZUluZGlyZWN0T2JqZWN0U2l6ZShbeHJlZlN0cmVhbVJlZiwgeHJlZlN0cmVhbV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkT2JqZWN0cy5wdXNoKFt4cmVmU3RyZWFtUmVmLCB4cmVmU3RyZWFtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGVyID0gUERGVHJhaWxlci5mb3JMYXN0Q3Jvc3NSZWZTZWN0aW9uT2Zmc2V0KHhyZWZPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0cmFpbGVyLnNpemVJbkJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBzaXplOiBzaXplLCBoZWFkZXI6IGhlYWRlciwgaW5kaXJlY3RPYmplY3RzOiB1bmNvbXByZXNzZWRPYmplY3RzLCB0cmFpbGVyOiB0cmFpbGVyIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERlN0cmVhbVdyaXRlci5mb3JDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrLCBlbmNvZGVTdHJlYW1zLCBvYmplY3RzUGVyU3RyZWFtKSB7XG4gICAgICAgIGlmIChlbmNvZGVTdHJlYW1zID09PSB2b2lkIDApIHsgZW5jb2RlU3RyZWFtcyA9IHRydWU7IH1cbiAgICAgICAgaWYgKG9iamVjdHNQZXJTdHJlYW0gPT09IHZvaWQgMCkgeyBvYmplY3RzUGVyU3RyZWFtID0gNTA7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZTdHJlYW1Xcml0ZXIoY29udGV4dCwgb2JqZWN0c1BlclRpY2ssIGVuY29kZVN0cmVhbXMsIG9iamVjdHNQZXJTdHJlYW0pO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlN0cmVhbVdyaXRlcjtcbn0oUERGV3JpdGVyKSk7XG5leHBvcnQgZGVmYXVsdCBQREZTdHJlYW1Xcml0ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZTdHJlYW1Xcml0ZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkNyb3NzUmVmU2VjdGlvbiBmcm9tIFwiLi4vZG9jdW1lbnQvUERGQ3Jvc3NSZWZTZWN0aW9uXCI7XG5pbXBvcnQgUERGSGVhZGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZIZWFkZXJcIjtcbmltcG9ydCBQREZUcmFpbGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZUcmFpbGVyXCI7XG5pbXBvcnQgUERGVHJhaWxlckRpY3QgZnJvbSBcIi4uL2RvY3VtZW50L1BERlRyYWlsZXJEaWN0XCI7XG5pbXBvcnQgUERGT2JqZWN0U3RyZWFtIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERk9iamVjdFN0cmVhbVwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIHdhaXRGb3JUaWNrIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGV3JpdGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERldyaXRlcihjb250ZXh0LCBvYmplY3RzUGVyVGljaykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnBhcnNlZE9iamVjdHMgPSAwO1xuICAgICAgICB0aGlzLnNob3VsZFdhaXRGb3JUaWNrID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIF90aGlzLnBhcnNlZE9iamVjdHMgKz0gbjtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5wYXJzZWRPYmplY3RzICUgX3RoaXMub2JqZWN0c1BlclRpY2sgPT09IDA7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMub2JqZWN0c1BlclRpY2sgPSBvYmplY3RzUGVyVGljaztcbiAgICB9XG4gICAgUERGV3JpdGVyLnByb3RvdHlwZS5zZXJpYWxpemVUb0J1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBzaXplLCBoZWFkZXIsIGluZGlyZWN0T2JqZWN0cywgeHJlZiwgdHJhaWxlckRpY3QsIHRyYWlsZXIsIG9mZnNldCwgYnVmZmVyLCBpZHgsIGxlbiwgX2IsIHJlZiwgb2JqZWN0LCBvYmplY3ROdW1iZXIsIGdlbmVyYXRpb25OdW1iZXIsIG47XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29tcHV0ZUJ1ZmZlclNpemUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Muc2VudCgpLCBzaXplID0gX2Euc2l6ZSwgaGVhZGVyID0gX2EuaGVhZGVyLCBpbmRpcmVjdE9iamVjdHMgPSBfYS5pbmRpcmVjdE9iamVjdHMsIHhyZWYgPSBfYS54cmVmLCB0cmFpbGVyRGljdCA9IF9hLnRyYWlsZXJEaWN0LCB0cmFpbGVyID0gX2EudHJhaWxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBoZWFkZXIuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBpbmRpcmVjdE9iamVjdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpZHggPCBsZW4pKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gaW5kaXJlY3RPYmplY3RzW2lkeF0sIHJlZiA9IF9iWzBdLCBvYmplY3QgPSBfYlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE51bWJlciA9IFN0cmluZyhyZWYub2JqZWN0TnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihvYmplY3ROdW1iZXIsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uTnVtYmVyID0gU3RyaW5nKHJlZi5nZW5lcmF0aW9uTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihnZW5lcmF0aW9uTnVtYmVyLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5vO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5iO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5qO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG9iamVjdC5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuajtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBvYmplY3QgaW5zdGFuY2VvZiBQREZPYmplY3RTdHJlYW0gPyBvYmplY3QuZ2V0T2JqZWN0c0NvdW50KCkgOiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKG4pKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4cmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHhyZWYuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWlsZXJEaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHRyYWlsZXJEaWN0LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdHJhaWxlci5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBidWZmZXJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERldyaXRlci5wcm90b3R5cGUuY29tcHV0ZUluZGlyZWN0T2JqZWN0U2l6ZSA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgcmVmID0gX2FbMF0sIG9iamVjdCA9IF9hWzFdO1xuICAgICAgICB2YXIgcmVmU2l6ZSA9IHJlZi5zaXplSW5CeXRlcygpICsgMzsgLy8gJ1InIC0+ICdvYmpcXG4nXG4gICAgICAgIHZhciBvYmplY3RTaXplID0gb2JqZWN0LnNpemVJbkJ5dGVzKCkgKyA5OyAvLyAnXFxuZW5kb2JqXFxuXFxuJ1xuICAgICAgICByZXR1cm4gcmVmU2l6ZSArIG9iamVjdFNpemU7XG4gICAgfTtcbiAgICBQREZXcml0ZXIucHJvdG90eXBlLmNyZWF0ZVRyYWlsZXJEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBTaXplOiB0aGlzLmNvbnRleHQubGFyZ2VzdE9iamVjdE51bWJlciArIDEsXG4gICAgICAgICAgICBSb290OiB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uUm9vdCxcbiAgICAgICAgICAgIEVuY3J5cHQ6IHRoaXMuY29udGV4dC50cmFpbGVySW5mby5FbmNyeXB0LFxuICAgICAgICAgICAgSW5mbzogdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLkluZm8sXG4gICAgICAgICAgICBJRDogdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLklELFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERldyaXRlci5wcm90b3R5cGUuY29tcHV0ZUJ1ZmZlclNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIsIHNpemUsIHhyZWYsIGluZGlyZWN0T2JqZWN0cywgaWR4LCBsZW4sIGluZGlyZWN0T2JqZWN0LCByZWYsIHhyZWZPZmZzZXQsIHRyYWlsZXJEaWN0LCB0cmFpbGVyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gUERGSGVhZGVyLmZvclZlcnNpb24oMSwgNyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gaGVhZGVyLnNpemVJbkJ5dGVzKCkgKyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZiA9IFBERkNyb3NzUmVmU2VjdGlvbi5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0T2JqZWN0cyA9IHRoaXMuY29udGV4dC5lbnVtZXJhdGVJbmRpcmVjdE9iamVjdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IGluZGlyZWN0T2JqZWN0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3RPYmplY3QgPSBpbmRpcmVjdE9iamVjdHNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IGluZGlyZWN0T2JqZWN0WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZi5hZGRFbnRyeShyZWYsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0aGlzLmNvbXB1dGVJbmRpcmVjdE9iamVjdFNpemUoaW5kaXJlY3RPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKDEpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZPZmZzZXQgPSBzaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB4cmVmLnNpemVJbkJ5dGVzKCkgKyAxOyAvLyAnXFxuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxlckRpY3QgPSBQREZUcmFpbGVyRGljdC5vZih0aGlzLmNyZWF0ZVRyYWlsZXJEaWN0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0cmFpbGVyRGljdC5zaXplSW5CeXRlcygpICsgMjsgLy8gJ1xcblxcbidcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsZXIgPSBQREZUcmFpbGVyLmZvckxhc3RDcm9zc1JlZlNlY3Rpb25PZmZzZXQoeHJlZk9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRyYWlsZXIuc2l6ZUluQnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IHNpemU6IHNpemUsIGhlYWRlcjogaGVhZGVyLCBpbmRpcmVjdE9iamVjdHM6IGluZGlyZWN0T2JqZWN0cywgeHJlZjogeHJlZiwgdHJhaWxlckRpY3Q6IHRyYWlsZXJEaWN0LCB0cmFpbGVyOiB0cmFpbGVyIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERldyaXRlci5mb3JDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGV3JpdGVyKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZXcml0ZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGV3JpdGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGV3JpdGVyLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2FwaS9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29yZS9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2luZGV4XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJ2YXIgQ2FjaGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2FjaGUocG9wdWxhdGUpIHtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZSA9IHBvcHVsYXRlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBDYWNoZS5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgQ2FjaGUucHJvdG90eXBlLmFjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucG9wdWxhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBDYWNoZS5wcm90b3R5cGUuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIENhY2hlLnBvcHVsYXRlZEJ5ID0gZnVuY3Rpb24gKHBvcHVsYXRlKSB7IHJldHVybiBuZXcgQ2FjaGUocG9wdWxhdGUpOyB9O1xuICAgIHJldHVybiBDYWNoZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBDYWNoZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhY2hlLmpzLm1hcCIsImltcG9ydCB7IGRlY29kZUZyb21CYXNlNjREYXRhVXJpIH0gZnJvbSBcIi4vYmFzZTY0XCI7XG5pbXBvcnQgeyBjaGFyRnJvbUNvZGUgfSBmcm9tIFwiLi9zdHJpbmdzXCI7XG5leHBvcnQgdmFyIGxhc3QgPSBmdW5jdGlvbiAoYXJyYXkpIHsgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdOyB9O1xuLy8gZXhwb3J0IGNvbnN0IGRyb3BMYXN0ID0gPFQ+KGFycmF5OiBUW10pOiBUW10gPT5cbi8vIGFycmF5LnNsaWNlKDAsIGFycmF5Lmxlbmd0aCAtIDEpO1xuZXhwb3J0IHZhciB0eXBlZEFycmF5Rm9yID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSlcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgdmFyIHR5cGVkQXJyYXkgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgdHlwZWRBcnJheVtpZHhdID0gdmFsdWUuY2hhckNvZGVBdChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZWRBcnJheTtcbn07XG5leHBvcnQgdmFyIG1lcmdlSW50b1R5cGVkQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5cyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFycmF5c1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgYXJyYXlDb3VudCA9IGFycmF5cy5sZW5ndGg7XG4gICAgdmFyIHR5cGVkQXJyYXlzID0gW107XG4gICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgYXJyYXlDb3VudDsgaWR4KyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBhcnJheXNbaWR4XTtcbiAgICAgICAgdHlwZWRBcnJheXNbaWR4XSA9XG4gICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgVWludDhBcnJheSA/IGVsZW1lbnQgOiB0eXBlZEFycmF5Rm9yKGVsZW1lbnQpO1xuICAgIH1cbiAgICB2YXIgdG90YWxTaXplID0gMDtcbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBhcnJheUNvdW50OyBpZHgrKykge1xuICAgICAgICB0b3RhbFNpemUgKz0gYXJyYXlzW2lkeF0ubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkodG90YWxTaXplKTtcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKHZhciBhcnJJZHggPSAwOyBhcnJJZHggPCBhcnJheUNvdW50OyBhcnJJZHgrKykge1xuICAgICAgICB2YXIgYXJyID0gdHlwZWRBcnJheXNbYXJySWR4XTtcbiAgICAgICAgZm9yICh2YXIgYnl0ZUlkeCA9IDAsIGFyckxlbiA9IGFyci5sZW5ndGg7IGJ5dGVJZHggPCBhcnJMZW47IGJ5dGVJZHgrKykge1xuICAgICAgICAgICAgbWVyZ2VkW29mZnNldCsrXSA9IGFycltieXRlSWR4XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkO1xufTtcbmV4cG9ydCB2YXIgbWVyZ2VVaW50OEFycmF5cyA9IGZ1bmN0aW9uIChhcnJheXMpIHtcbiAgICB2YXIgdG90YWxTaXplID0gMDtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHRvdGFsU2l6ZSArPSBhcnJheXNbaWR4XS5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBtZXJnZWRCdWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xuICAgIHZhciBvZmZzZXQgPSAwO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW2lkeF07XG4gICAgICAgIG1lcmdlZEJ1ZmZlci5zZXQoYXJyYXksIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSBhcnJheS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWRCdWZmZXI7XG59O1xuZXhwb3J0IHZhciBhcnJheUFzU3RyaW5nID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBzdHIgKz0gY2hhckZyb21Db2RlKGFycmF5W2lkeF0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufTtcbmV4cG9ydCB2YXIgYnlBc2NlbmRpbmdJZCA9IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmlkIC0gYi5pZDsgfTtcbmV4cG9ydCB2YXIgc29ydGVkVW5pcSA9IGZ1bmN0aW9uIChhcnJheSwgaW5kZXhlcikge1xuICAgIHZhciB1bmlxID0gW107XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBjdXJyID0gYXJyYXlbaWR4XTtcbiAgICAgICAgdmFyIHByZXYgPSBhcnJheVtpZHggLSAxXTtcbiAgICAgICAgaWYgKGlkeCA9PT0gMCB8fCBpbmRleGVyKGN1cnIpICE9PSBpbmRleGVyKHByZXYpKSB7XG4gICAgICAgICAgICB1bmlxLnB1c2goY3Vycik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuaXE7XG59O1xuLy8gQXJyYXlzIGFuZCBUeXBlZEFycmF5cyBpbiBKUyBib3RoIGhhdmUgLnJldmVyc2UoKSBtZXRob2RzLCB3aGljaCB3b3VsZCBzZWVtXG4vLyB0byBuZWdhdGUgdGhlIG5lZWQgZm9yIHRoaXMgZnVuY3Rpb24uIEhvd2V2ZXIsIG5vdCBhbGwgcnVudGltZXMgc3VwcG9ydCB0aGlzXG4vLyBtZXRob2QgKGUuZy4gUmVhY3QgTmF0aXZlKS4gVGhpcyBmdW5jdGlvbiBjb21wZW5zYXRlcyBmb3IgdGhhdCBmYWN0LlxuZXhwb3J0IHZhciByZXZlcnNlQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICB2YXIgYXJyYXlMZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gTWF0aC5mbG9vcihhcnJheUxlbiAvIDIpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBsZWZ0SWR4ID0gaWR4O1xuICAgICAgICB2YXIgcmlnaHRJZHggPSBhcnJheUxlbiAtIGlkeCAtIDE7XG4gICAgICAgIHZhciB0ZW1wID0gYXJyYXlbaWR4XTtcbiAgICAgICAgYXJyYXlbbGVmdElkeF0gPSBhcnJheVtyaWdodElkeF07XG4gICAgICAgIGFycmF5W3JpZ2h0SWR4XSA9IHRlbXA7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn07XG5leHBvcnQgdmFyIHN1bSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgIHZhciB0b3RhbCA9IDA7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHRvdGFsICs9IGFycmF5W2lkeF07XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbn07XG5leHBvcnQgdmFyIHJhbmdlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgYXJyID0gbmV3IEFycmF5KGVuZCAtIHN0YXJ0KTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGFycltpZHhdID0gc3RhcnQgKyBpZHg7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59O1xuZXhwb3J0IHZhciBwbHVja0luZGljZXMgPSBmdW5jdGlvbiAoYXJyLCBpbmRpY2VzKSB7XG4gICAgdmFyIHBsdWNrZWQgPSBuZXcgQXJyYXkoaW5kaWNlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGluZGljZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHBsdWNrZWRbaWR4XSA9IGFycltpbmRpY2VzW2lkeF1dO1xuICAgIH1cbiAgICByZXR1cm4gcGx1Y2tlZDtcbn07XG5leHBvcnQgdmFyIGNhbkJlQ29udmVydGVkVG9VaW50OEFycmF5ID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7XG59O1xuZXhwb3J0IHZhciB0b1VpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZGVjb2RlRnJvbUJhc2U2NERhdGFVcmkoaW5wdXQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgaW5wdXRgIG11c3QgYmUgb25lIG9mIGBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXlgJyk7XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFycmF5cy5qcy5tYXAiLCIvKipcbiAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgYXQgbGVhc3Qgb25lIHRpY2sgb2YgdGhlXG4gKiBNYWNybyBUYXNrIFF1ZXVlIG9jY3Vycy5cbiAqL1xuZXhwb3J0IHZhciB3YWl0Rm9yVGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiByZXNvbHZlKCk7IH0sIDApO1xuICAgIH0pO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzeW5jLmpzLm1hcCIsIi8qXG4gKiBUaGUgYGNoYXJzYCwgYGxvb2t1cGAsIGBlbmNvZGVgLCBhbmQgYGRlY29kZWAgbWVtYmVycyBvZiB0aGlzIGZpbGUgYXJlXG4gKiBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAgICBiYXNlNjQtYXJyYXlidWZmZXJcbiAqICAgICBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyXG4gKlxuICogICAgIENvcHlyaWdodCAoYykgMjAxMiBOaWtsYXMgdm9uIEhlcnR6ZW5cbiAqICAgICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICovXG52YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG4vLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguXG52YXIgbG9va3VwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpO1xufVxuZXhwb3J0IHZhciBlbmNvZGVUb0Jhc2U2NCA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgIHZhciBiYXNlNjQgPSAnJztcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDMpIHtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2ldID4+IDJdO1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbKChieXRlc1tpXSAmIDMpIDw8IDQpIHwgKGJ5dGVzW2kgKyAxXSA+PiA0KV07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2kgKyAxXSAmIDE1KSA8PCAyKSB8IChieXRlc1tpICsgMl0gPj4gNildO1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaSArIDJdICYgNjNdO1xuICAgIH1cbiAgICBpZiAobGVuICUgMyA9PT0gMikge1xuICAgICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKDAsIGJhc2U2NC5sZW5ndGggLSAxKSArICc9JztcbiAgICB9XG4gICAgZWxzZSBpZiAobGVuICUgMyA9PT0gMSkge1xuICAgICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKDAsIGJhc2U2NC5sZW5ndGggLSAyKSArICc9PSc7XG4gICAgfVxuICAgIHJldHVybiBiYXNlNjQ7XG59O1xuZXhwb3J0IHZhciBkZWNvZGVGcm9tQmFzZTY0ID0gZnVuY3Rpb24gKGJhc2U2NCkge1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBiYXNlNjQubGVuZ3RoICogMC43NTtcbiAgICB2YXIgbGVuID0gYmFzZTY0Lmxlbmd0aDtcbiAgICB2YXIgaTtcbiAgICB2YXIgcCA9IDA7XG4gICAgdmFyIGVuY29kZWQxO1xuICAgIHZhciBlbmNvZGVkMjtcbiAgICB2YXIgZW5jb2RlZDM7XG4gICAgdmFyIGVuY29kZWQ0O1xuICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlckxlbmd0aCk7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgICAgIGVuY29kZWQxID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkpXTtcbiAgICAgICAgZW5jb2RlZDIgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDEpXTtcbiAgICAgICAgZW5jb2RlZDMgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDIpXTtcbiAgICAgICAgZW5jb2RlZDQgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDMpXTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMSA8PCAyKSB8IChlbmNvZGVkMiA+PiA0KTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDIgJiAxNSkgPDwgNCkgfCAoZW5jb2RlZDMgPj4gMik7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQzICYgMykgPDwgNikgfCAoZW5jb2RlZDQgJiA2Myk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn07XG4vLyBUaGlzIHJlZ2V4IGlzIGRlc2lnbmVkIHRvIGJlIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlLiBJdCB3aWxsIHBhcnNlIGNlcnRhaW5cbi8vIGludmFsaWQgZGF0YSBVUklzLlxudmFyIERBVEFfVVJJX1BSRUZJWF9SRUdFWCA9IC9eKGRhdGEpPzo/KFtcXHdcXC9cXCtdKyk/Oz8oY2hhcnNldD1bXFx3LV0rfGJhc2U2NCk/LiosL2k7XG4vKipcbiAqIElmIHRoZSBgZGF0YVVyaWAgaW5wdXQgaXMgYSBkYXRhIFVSSSwgdGhlbiB0aGUgZGF0YSBVUkkgcHJlZml4IG11c3Qgbm90IGJlXG4gKiBsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycywgb3IgdGhpcyBmdW5jdGlvbiB3aWxsIGZhaWwgdG8gZGVjb2RlIGl0LlxuICpcbiAqIEBwYXJhbSBkYXRhVXJpIGEgYmFzZTY0IGRhdGEgVVJJIG9yIHBsYWluIGJhc2U2NCBzdHJpbmdcbiAqIEByZXR1cm5zIGEgVWludDhBcnJheSBjb250YWluaW5nIHRoZSBkZWNvZGVkIGlucHV0XG4gKi9cbmV4cG9ydCB2YXIgZGVjb2RlRnJvbUJhc2U2NERhdGFVcmkgPSBmdW5jdGlvbiAoZGF0YVVyaSkge1xuICAgIHZhciB0cmltbWVkVXJpID0gZGF0YVVyaS50cmltKCk7XG4gICAgdmFyIHByZWZpeCA9IHRyaW1tZWRVcmkuc3Vic3RyaW5nKDAsIDEwMCk7XG4gICAgdmFyIHJlcyA9IHByZWZpeC5tYXRjaChEQVRBX1VSSV9QUkVGSVhfUkVHRVgpO1xuICAgIC8vIEFzc3VtZSBpdCdzIG5vdCBhIGRhdGEgVVJJIC0ganVzdCBhIHBsYWluIGJhc2U2NCBzdHJpbmdcbiAgICBpZiAoIXJlcylcbiAgICAgICAgcmV0dXJuIGRlY29kZUZyb21CYXNlNjQodHJpbW1lZFVyaSk7XG4gICAgLy8gUmVtb3ZlIHRoZSBkYXRhIFVSSSBwcmVmaXggYW5kIHBhcnNlIHRoZSByZW1haW5kZXIgYXMgYSBiYXNlNjQgc3RyaW5nXG4gICAgdmFyIGZ1bGxNYXRjaCA9IHJlc1swXTtcbiAgICB2YXIgZGF0YSA9IHRyaW1tZWRVcmkuc3Vic3RyaW5nKGZ1bGxNYXRjaC5sZW5ndGgpO1xuICAgIHJldHVybiBkZWNvZGVGcm9tQmFzZTY0KGRhdGEpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2U2NC5qcy5tYXAiLCJleHBvcnQgdmFyIGVycm9yID0gZnVuY3Rpb24gKG1zZykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9ycy5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9hcnJheXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FzeW5jXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJpbmdzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91bmljb2RlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9udW1iZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Jhc2U2NFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb2JqZWN0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGRmRG9jRW5jb2RpbmdcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FjaGUgfSBmcm9tIFwiLi9DYWNoZVwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gdHNsaW50OmRpc2FibGUgcmFkaXhcbi8qKlxuICogQ29udmVydHMgYSBudW1iZXIgdG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbiBpbiBkZWNpbWFsLiBUaGlzIGZ1bmN0aW9uXG4gKiBkaWZmZXJzIGZyb20gc2ltcGx5IGNvbnZlcnRpbmcgYSBudW1iZXIgdG8gYSBzdHJpbmcgd2l0aCBgLnRvU3RyaW5nKClgXG4gKiBiZWNhdXNlIHRoaXMgZnVuY3Rpb24ncyBvdXRwdXQgc3RyaW5nIHdpbGwgKipub3QqKiBjb250YWluIGV4cG9uZW50aWFsXG4gKiBub3RhdGlvbi5cbiAqXG4gKiBDcmVkaXQ6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NjU0NTUxOVxuICovXG5leHBvcnQgdmFyIG51bWJlclRvU3RyaW5nID0gZnVuY3Rpb24gKG51bSkge1xuICAgIHZhciBudW1TdHIgPSBTdHJpbmcobnVtKTtcbiAgICBpZiAoTWF0aC5hYnMobnVtKSA8IDEuMCkge1xuICAgICAgICB2YXIgZSA9IHBhcnNlSW50KG51bS50b1N0cmluZygpLnNwbGl0KCdlLScpWzFdKTtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIHZhciBuZWdhdGl2ZSA9IG51bSA8IDA7XG4gICAgICAgICAgICBpZiAobmVnYXRpdmUpXG4gICAgICAgICAgICAgICAgbnVtICo9IC0xO1xuICAgICAgICAgICAgbnVtICo9IE1hdGgucG93KDEwLCBlIC0gMSk7XG4gICAgICAgICAgICBudW1TdHIgPSAnMC4nICsgbmV3IEFycmF5KGUpLmpvaW4oJzAnKSArIG51bS50b1N0cmluZygpLnN1YnN0cmluZygyKTtcbiAgICAgICAgICAgIGlmIChuZWdhdGl2ZSlcbiAgICAgICAgICAgICAgICBudW1TdHIgPSAnLScgKyBudW1TdHI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBlID0gcGFyc2VJbnQobnVtLnRvU3RyaW5nKCkuc3BsaXQoJysnKVsxXSk7XG4gICAgICAgIGlmIChlID4gMjApIHtcbiAgICAgICAgICAgIGUgLT0gMjA7XG4gICAgICAgICAgICBudW0gLz0gTWF0aC5wb3coMTAsIGUpO1xuICAgICAgICAgICAgbnVtU3RyID0gbnVtLnRvU3RyaW5nKCkgKyBuZXcgQXJyYXkoZSArIDEpLmpvaW4oJzAnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtU3RyO1xufTtcbmV4cG9ydCB2YXIgc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAobikgeyByZXR1cm4gTWF0aC5jZWlsKG4udG9TdHJpbmcoMikubGVuZ3RoIC8gOCk7IH07XG4vKipcbiAqIENvbnZlcnRzIGEgbnVtYmVyIGludG8gaXRzIGNvbnN0aXR1ZW50IGJ5dGVzIGFuZCByZXR1cm5zIHRoZW0gYXNcbiAqIGEgbnVtYmVyW10uXG4gKlxuICogUmV0dXJucyBtb3N0IHNpZ25pZmljYW50IGJ5dGUgYXMgZmlyc3QgZWxlbWVudCBpbiBhcnJheS4gSXQgbWF5IGJlIG5lY2Vzc2FyeVxuICogdG8gY2FsbCAucmV2ZXJzZSgpIHRvIGdldCB0aGUgYml0cyBpbiB0aGUgZGVzaXJlZCBvcmRlci5cbiAqXG4gKiBFeGFtcGxlOlxuICogICBieXRlc0ZvcigweDAyQTQxRSkgPT4gWyAwYjEwLCAwYjEwMTAwMTAwLCAwYjExMTEwIF1cbiAqXG4gKiBDcmVkaXQgZm9yIGFsZ29yaXRobTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5MzY4NjVcbiAqL1xuZXhwb3J0IHZhciBieXRlc0ZvciA9IGZ1bmN0aW9uIChuKSB7XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZUluQnl0ZXMobikpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJ5dGVzW2kgLSAxXSA9IG4gPj4gKChieXRlcy5sZW5ndGggLSBpKSAqIDgpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bnVtYmVycy5qcy5tYXAiLCJpbXBvcnQgeyBGb250TmFtZXMgfSBmcm9tICdAcGRmLWxpYi9zdGFuZGFyZC1mb250cyc7XG5leHBvcnQgdmFyIHZhbHVlcyA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubWFwKGZ1bmN0aW9uIChrKSB7IHJldHVybiBvYmpba107IH0pOyB9O1xuZXhwb3J0IHZhciBTdGFuZGFyZEZvbnRWYWx1ZXMgPSB2YWx1ZXMoRm9udE5hbWVzKTtcbmV4cG9ydCB2YXIgaXNTdGFuZGFyZEZvbnQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICByZXR1cm4gU3RhbmRhcmRGb250VmFsdWVzLmluY2x1ZGVzKGlucHV0KTtcbn07XG5leHBvcnQgdmFyIHJlY3RhbmdsZXNBcmVFcXVhbCA9IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLnggPT09IGIueCAmJiBhLnkgPT09IGIueSAmJiBhLndpZHRoID09PSBiLndpZHRoICYmIGEuaGVpZ2h0ID09PSBiLmhlaWdodDsgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdHMuanMubWFwIiwiaW1wb3J0IHsgdG9DaGFyQ29kZSB9IGZyb20gXCIuL3N0cmluZ3NcIjtcbi8vIE1hcHBpbmcgZnJvbSBQREZEb2NFbmNvZGluZyB0byBVbmljb2RlIGNvZGUgcG9pbnRcbnZhciBwZGZEb2NFbmNvZGluZ1RvVW5pY29kZSA9IG5ldyBVaW50MTZBcnJheSgyNTYpO1xuLy8gSW5pdGlhbGl6ZSB0aGUgY29kZSBwb2ludHMgd2hpY2ggYXJlIHRoZSBzYW1lXG5mb3IgKHZhciBpZHggPSAwOyBpZHggPCAyNTY7IGlkeCsrKSB7XG4gICAgcGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbaWR4XSA9IGlkeDtcbn1cbi8vIFNldCBkaWZmZXJlbmNlcyAoc2VlIFwiVGFibGUgRC4yIOKAkyBQREZEb2NFbmNvZGluZyBDaGFyYWN0ZXIgU2V0XCIgb2YgdGhlIFBERiBzcGVjKVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxNl0gPSB0b0NoYXJDb2RlKCdcXHUwMDE3Jyk7IC8vIFNZTkNST05PVVMgSURMRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxOF0gPSB0b0NoYXJDb2RlKCdcXHUwMkQ4Jyk7IC8vIEJSRVZFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDE5XSA9IHRvQ2hhckNvZGUoJ1xcdTAyQzcnKTsgLy8gQ0FST05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWFdID0gdG9DaGFyQ29kZSgnXFx1MDJDNicpOyAvLyBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlRcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWJdID0gdG9DaGFyQ29kZSgnXFx1MDJEOScpOyAvLyBET1QgQUJPVkVcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWNdID0gdG9DaGFyQ29kZSgnXFx1MDJERCcpOyAvLyBET1VCTEUgQUNVVEUgQUNDRU5UXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDFkXSA9IHRvQ2hhckNvZGUoJ1xcdTAyREInKTsgLy8gT0dPTkVLXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDFlXSA9IHRvQ2hhckNvZGUoJ1xcdTAyREEnKTsgLy8gUklORyBBQk9WRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxZl0gPSB0b0NoYXJDb2RlKCdcXHUwMkRDJyk7IC8vIFNNQUxMIFRJTERFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDdmXSA9IHRvQ2hhckNvZGUoJ1xcdUZGRkQnKTsgLy8gUkVQTEFDRU1FTlQgQ0hBUkFDVEVSIChib3ggd2l0aCBxdWVzdGlvbm1hcmspXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDgwXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMjInKTsgLy8gQlVMTEVUXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDgxXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMjAnKTsgLy8gREFHR0VSXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDgyXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMjEnKTsgLy8gRE9VQkxFIERBR0dFUlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4M10gPSB0b0NoYXJDb2RlKCdcXHUyMDI2Jyk7IC8vIEhPUklaT05UQUwgRUxMSVBTSVNcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODRdID0gdG9DaGFyQ29kZSgnXFx1MjAxNCcpOyAvLyBFTSBEQVNIXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg1XSA9IHRvQ2hhckNvZGUoJ1xcdTIwMTMnKTsgLy8gRU4gREFTSFxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4Nl0gPSB0b0NoYXJDb2RlKCdcXHUwMTkyJyk7IC8vIExBVElOIFNNQUxMIExFVFRFUiBTQ1JJUFQgRlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4N10gPSB0b0NoYXJDb2RlKCdcXHUyMDQ0Jyk7IC8vIEZSQUNUSU9OIFNMQVNIIChzb2xpZHVzKVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4OF0gPSB0b0NoYXJDb2RlKCdcXHUyMDM5Jyk7IC8vIFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg5XSA9IHRvQ2hhckNvZGUoJ1xcdTIwM0EnKTsgLy8gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhhXSA9IHRvQ2hhckNvZGUoJ1xcdTIyMTInKTsgLy8gTUlOVVMgU0lHTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4Yl0gPSB0b0NoYXJDb2RlKCdcXHUyMDMwJyk7IC8vIFBFUiBNSUxMRSBTSUdOXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhjXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMUUnKTsgLy8gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLIChxdW90ZWRibGJhc2UpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhkXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMUMnKTsgLy8gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKHF1b3RlZGJsbGVmdClcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGVdID0gdG9DaGFyQ29kZSgnXFx1MjAxRCcpOyAvLyBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKHF1b3RlZGJscmlnaHQpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhmXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMTgnKTsgLy8gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKHF1b3RlbGVmdClcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTBdID0gdG9DaGFyQ29kZSgnXFx1MjAxOScpOyAvLyBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKHF1b3RlcmlnaHQpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDkxXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMUEnKTsgLy8gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLIChxdW90ZXNpbmdsYmFzZSlcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTJdID0gdG9DaGFyQ29kZSgnXFx1MjEyMicpOyAvLyBUUkFERSBNQVJLIFNJR05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTNdID0gdG9DaGFyQ29kZSgnXFx1RkIwMScpOyAvLyBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGSVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5NF0gPSB0b0NoYXJDb2RlKCdcXHVGQjAyJyk7IC8vIExBVElOIFNNQUxMIExJR0FUVVJFIEZMXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDk1XSA9IHRvQ2hhckNvZGUoJ1xcdTAxNDEnKTsgLy8gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5Nl0gPSB0b0NoYXJDb2RlKCdcXHUwMTUyJyk7IC8vIExBVElOIENBUElUQUwgTElHQVRVUkUgT0VcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTddID0gdG9DaGFyQ29kZSgnXFx1MDE2MCcpOyAvLyBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OThdID0gdG9DaGFyQ29kZSgnXFx1MDE3OCcpOyAvLyBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDk5XSA9IHRvQ2hhckNvZGUoJ1xcdTAxN0QnKTsgLy8gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDlhXSA9IHRvQ2hhckNvZGUoJ1xcdTAxMzEnKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5Yl0gPSB0b0NoYXJDb2RlKCdcXHUwMTQyJyk7IC8vIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDljXSA9IHRvQ2hhckNvZGUoJ1xcdTAxNTMnKTsgLy8gTEFUSU4gU01BTEwgTElHQVRVUkUgT0VcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OWRdID0gdG9DaGFyQ29kZSgnXFx1MDE2MScpOyAvLyBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDllXSA9IHRvQ2hhckNvZGUoJ1xcdTAxN0UnKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5Zl0gPSB0b0NoYXJDb2RlKCdcXHVGRkZEJyk7IC8vIFJFUExBQ0VNRU5UIENIQVJBQ1RFUiAoYm94IHdpdGggcXVlc3Rpb25tYXJrKVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHhhMF0gPSB0b0NoYXJDb2RlKCdcXHUyMEFDJyk7IC8vIEVVUk8gU0lHTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHhhZF0gPSB0b0NoYXJDb2RlKCdcXHVGRkZEJyk7IC8vIFJFUExBQ0VNRU5UIENIQVJBQ1RFUiAoYm94IHdpdGggcXVlc3Rpb25tYXJrKVxuLyoqXG4gKiBEZWNvZGUgYSBieXRlIGFycmF5IGludG8gYSBzdHJpbmcgdXNpbmcgUERGRG9jRW5jb2RpbmcuXG4gKlxuICogQHBhcmFtIGJ5dGVzIGEgYnl0ZSBhcnJheSAoZGVjaW1hbCByZXByZXNlbnRhdGlvbikgY29udGFpbmluZyBhIHN0cmluZ1xuICogICAgICAgICAgICAgIGVuY29kZWQgd2l0aCBQREZEb2NFbmNvZGluZy5cbiAqL1xuZXhwb3J0IHZhciBwZGZEb2NFbmNvZGluZ0RlY29kZSA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgIHZhciBjb2RlUG9pbnRzID0gbmV3IEFycmF5KGJ5dGVzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYnl0ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGNvZGVQb2ludHNbaWR4XSA9IHBkZkRvY0VuY29kaW5nVG9Vbmljb2RlW2J5dGVzW2lkeF1dO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wZGZEb2NFbmNvZGluZy5qcy5tYXAiLCJpbXBvcnQgVVBORyBmcm9tICdAcGRmLWxpYi91cG5nJztcbnZhciBnZXRJbWFnZVR5cGUgPSBmdW5jdGlvbiAoY3R5cGUpIHtcbiAgICBpZiAoY3R5cGUgPT09IDApXG4gICAgICAgIHJldHVybiBQbmdUeXBlLkdyZXlzY2FsZTtcbiAgICBpZiAoY3R5cGUgPT09IDIpXG4gICAgICAgIHJldHVybiBQbmdUeXBlLlRydWVjb2xvdXI7XG4gICAgaWYgKGN0eXBlID09PSAzKVxuICAgICAgICByZXR1cm4gUG5nVHlwZS5JbmRleGVkQ29sb3VyO1xuICAgIGlmIChjdHlwZSA9PT0gNClcbiAgICAgICAgcmV0dXJuIFBuZ1R5cGUuR3JleXNjYWxlV2l0aEFscGhhO1xuICAgIGlmIChjdHlwZSA9PT0gNilcbiAgICAgICAgcmV0dXJuIFBuZ1R5cGUuVHJ1ZWNvbG91cldpdGhBbHBoYTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNvbG9yIHR5cGU6IFwiICsgY3R5cGUpO1xufTtcbnZhciBzcGxpdEFscGhhQ2hhbm5lbCA9IGZ1bmN0aW9uIChyZ2JhQ2hhbm5lbCkge1xuICAgIHZhciBwaXhlbENvdW50ID0gTWF0aC5mbG9vcihyZ2JhQ2hhbm5lbC5sZW5ndGggLyA0KTtcbiAgICB2YXIgcmdiQ2hhbm5lbCA9IG5ldyBVaW50OEFycmF5KHBpeGVsQ291bnQgKiAzKTtcbiAgICB2YXIgYWxwaGFDaGFubmVsID0gbmV3IFVpbnQ4QXJyYXkocGl4ZWxDb3VudCAqIDEpO1xuICAgIHZhciByZ2JhT2Zmc2V0ID0gMDtcbiAgICB2YXIgcmdiT2Zmc2V0ID0gMDtcbiAgICB2YXIgYWxwaGFPZmZzZXQgPSAwO1xuICAgIHdoaWxlIChyZ2JhT2Zmc2V0IDwgcmdiYUNoYW5uZWwubGVuZ3RoKSB7XG4gICAgICAgIHJnYkNoYW5uZWxbcmdiT2Zmc2V0KytdID0gcmdiYUNoYW5uZWxbcmdiYU9mZnNldCsrXTtcbiAgICAgICAgcmdiQ2hhbm5lbFtyZ2JPZmZzZXQrK10gPSByZ2JhQ2hhbm5lbFtyZ2JhT2Zmc2V0KytdO1xuICAgICAgICByZ2JDaGFubmVsW3JnYk9mZnNldCsrXSA9IHJnYmFDaGFubmVsW3JnYmFPZmZzZXQrK107XG4gICAgICAgIGFscGhhQ2hhbm5lbFthbHBoYU9mZnNldCsrXSA9IHJnYmFDaGFubmVsW3JnYmFPZmZzZXQrK107XG4gICAgfVxuICAgIHJldHVybiB7IHJnYkNoYW5uZWw6IHJnYkNoYW5uZWwsIGFscGhhQ2hhbm5lbDogYWxwaGFDaGFubmVsIH07XG59O1xuZXhwb3J0IHZhciBQbmdUeXBlO1xuKGZ1bmN0aW9uIChQbmdUeXBlKSB7XG4gICAgUG5nVHlwZVtcIkdyZXlzY2FsZVwiXSA9IFwiR3JleXNjYWxlXCI7XG4gICAgUG5nVHlwZVtcIlRydWVjb2xvdXJcIl0gPSBcIlRydWVjb2xvdXJcIjtcbiAgICBQbmdUeXBlW1wiSW5kZXhlZENvbG91clwiXSA9IFwiSW5kZXhlZENvbG91clwiO1xuICAgIFBuZ1R5cGVbXCJHcmV5c2NhbGVXaXRoQWxwaGFcIl0gPSBcIkdyZXlzY2FsZVdpdGhBbHBoYVwiO1xuICAgIFBuZ1R5cGVbXCJUcnVlY29sb3VyV2l0aEFscGhhXCJdID0gXCJUcnVlY29sb3VyV2l0aEFscGhhXCI7XG59KShQbmdUeXBlIHx8IChQbmdUeXBlID0ge30pKTtcbnZhciBQTkcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUE5HKHBuZ0RhdGEpIHtcbiAgICAgICAgdmFyIHVwbmcgPSBVUE5HLmRlY29kZShwbmdEYXRhKTtcbiAgICAgICAgdmFyIGZyYW1lcyA9IFVQTkcudG9SR0JBOCh1cG5nKTtcbiAgICAgICAgaWYgKGZyYW1lcy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW5pbWF0ZWQgUE5HcyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgdmFyIGZyYW1lID0gbmV3IFVpbnQ4QXJyYXkoZnJhbWVzWzBdKTtcbiAgICAgICAgdmFyIF9hID0gc3BsaXRBbHBoYUNoYW5uZWwoZnJhbWUpLCByZ2JDaGFubmVsID0gX2EucmdiQ2hhbm5lbCwgYWxwaGFDaGFubmVsID0gX2EuYWxwaGFDaGFubmVsO1xuICAgICAgICB0aGlzLnJnYkNoYW5uZWwgPSByZ2JDaGFubmVsO1xuICAgICAgICB2YXIgaGFzQWxwaGFWYWx1ZXMgPSBhbHBoYUNoYW5uZWwuc29tZShmdW5jdGlvbiAoYSkgeyByZXR1cm4gYSA8IDI1NTsgfSk7XG4gICAgICAgIGlmIChoYXNBbHBoYVZhbHVlcylcbiAgICAgICAgICAgIHRoaXMuYWxwaGFDaGFubmVsID0gYWxwaGFDaGFubmVsO1xuICAgICAgICB0aGlzLnR5cGUgPSBnZXRJbWFnZVR5cGUodXBuZy5jdHlwZSk7XG4gICAgICAgIHRoaXMud2lkdGggPSB1cG5nLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHVwbmcuaGVpZ2h0O1xuICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSA4O1xuICAgIH1cbiAgICBQTkcubG9hZCA9IGZ1bmN0aW9uIChwbmdEYXRhKSB7IHJldHVybiBuZXcgUE5HKHBuZ0RhdGEpOyB9O1xuICAgIHJldHVybiBQTkc7XG59KCkpO1xuZXhwb3J0IHsgUE5HIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbmcuanMubWFwIiwiLyoqXG4gKiBHZW5lcmF0ZXMgYSBwc2V1ZG8gcmFuZG9tIG51bWJlci4gQWx0aG91Z2ggaXQgaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZVxuICogYW5kIHVuaWZvcm1seSBkaXN0cmlidXRlZCwgaXQgaXMgbm90IGEgY29uY2VybiBmb3IgdGhlIGludGVuZGVkIHVzZS1jYXNlLFxuICogd2hpY2ggaXMgdG8gZ2VuZXJhdGUgZGlzdGluY3QgbnVtYmVycy5cbiAqXG4gKiBDcmVkaXQ6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xOTMwMzcyNS8xMDI1NDA0OVxuICovXG52YXIgU2ltcGxlUk5HID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNpbXBsZVJORyhzZWVkKSB7XG4gICAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7XG4gICAgfVxuICAgIFNpbXBsZVJORy5wcm90b3R5cGUubmV4dEludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHggPSBNYXRoLnNpbih0aGlzLnNlZWQrKykgKiAxMDAwMDtcbiAgICAgICAgcmV0dXJuIHggLSBNYXRoLmZsb29yKHgpO1xuICAgIH07XG4gICAgU2ltcGxlUk5HLndpdGhTZWVkID0gZnVuY3Rpb24gKHNlZWQpIHsgcmV0dXJuIG5ldyBTaW1wbGVSTkcoc2VlZCk7IH07XG4gICAgcmV0dXJuIFNpbXBsZVJORztcbn0oKSk7XG5leHBvcnQgeyBTaW1wbGVSTkcgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJuZy5qcy5tYXAiLCJleHBvcnQgdmFyIHRvQ2hhckNvZGUgPSBmdW5jdGlvbiAoY2hhcmFjdGVyKSB7IHJldHVybiBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKTsgfTtcbmV4cG9ydCB2YXIgdG9Db2RlUG9pbnQgPSBmdW5jdGlvbiAoY2hhcmFjdGVyKSB7IHJldHVybiBjaGFyYWN0ZXIuY29kZVBvaW50QXQoMCk7IH07XG5leHBvcnQgdmFyIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGggPSBmdW5jdGlvbiAobnVtLCBtaW5MZW5ndGgpIHtcbiAgICByZXR1cm4gcGFkU3RhcnQobnVtLnRvU3RyaW5nKDE2KSwgbWluTGVuZ3RoLCAnMCcpLnRvVXBwZXJDYXNlKCk7XG59O1xuZXhwb3J0IHZhciB0b0hleFN0cmluZyA9IGZ1bmN0aW9uIChudW0pIHsgcmV0dXJuIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgobnVtLCAyKTsgfTtcbmV4cG9ydCB2YXIgY2hhckZyb21Db2RlID0gZnVuY3Rpb24gKGNvZGUpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7IH07XG5leHBvcnQgdmFyIGNoYXJGcm9tSGV4Q29kZSA9IGZ1bmN0aW9uIChoZXgpIHsgcmV0dXJuIGNoYXJGcm9tQ29kZShwYXJzZUludChoZXgsIDE2KSk7IH07XG5leHBvcnQgdmFyIHBhZFN0YXJ0ID0gZnVuY3Rpb24gKHZhbHVlLCBsZW5ndGgsIHBhZENoYXIpIHtcbiAgICB2YXIgcGFkZGluZyA9ICcnO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxlbmd0aCAtIHZhbHVlLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBwYWRkaW5nICs9IHBhZENoYXI7XG4gICAgfVxuICAgIHJldHVybiBwYWRkaW5nICsgdmFsdWU7XG59O1xuZXhwb3J0IHZhciBjb3B5U3RyaW5nSW50b0J1ZmZlciA9IGZ1bmN0aW9uIChzdHIsIGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gc3RyLmNoYXJDb2RlQXQoaWR4KTtcbiAgICB9XG4gICAgcmV0dXJuIGxlbmd0aDtcbn07XG5leHBvcnQgdmFyIGFkZFJhbmRvbVN1ZmZpeCA9IGZ1bmN0aW9uIChwcmVmaXgsIHN1ZmZpeExlbmd0aCkge1xuICAgIGlmIChzdWZmaXhMZW5ndGggPT09IHZvaWQgMCkgeyBzdWZmaXhMZW5ndGggPSA0OyB9XG4gICAgcmV0dXJuIHByZWZpeCArIFwiLVwiICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTWF0aC5wb3coMTAsIHN1ZmZpeExlbmd0aCkpO1xufTtcbmV4cG9ydCB2YXIgZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbn07XG5leHBvcnQgdmFyIGNsZWFuVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFx0fFxcdTAwODV8XFx1MjAyOHxcXHUyMDI5L2csICcgICAgJykucmVwbGFjZSgvW1xcYlxcdl0vZywgJycpO1xufTtcbmV4cG9ydCB2YXIgZXNjYXBlZE5ld2xpbmVDaGFycyA9IFsnXFxcXG4nLCAnXFxcXGYnLCAnXFxcXHInLCAnXFxcXHUwMDBCJ107XG5leHBvcnQgdmFyIG5ld2xpbmVDaGFycyA9IFsnXFxuJywgJ1xcZicsICdcXHInLCAnXFx1MDAwQiddO1xuZXhwb3J0IHZhciBpc05ld2xpbmVDaGFyID0gZnVuY3Rpb24gKHRleHQpIHsgcmV0dXJuIC9eW1xcblxcZlxcclxcdTAwMEJdJC8udGVzdCh0ZXh0KTsgfTtcbmV4cG9ydCB2YXIgbGluZVNwbGl0ID0gZnVuY3Rpb24gKHRleHQpIHsgcmV0dXJuIHRleHQuc3BsaXQoL1tcXG5cXGZcXHJcXHUwMDBCXS8pOyB9O1xuZXhwb3J0IHZhciBtZXJnZUxpbmVzID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bXFxuXFxmXFxyXFx1MDAwQl0vZywgJyAnKTtcbn07XG4vLyBKYXZhU2NyaXB0J3MgU3RyaW5nLmNoYXJBdCgpIG1ldGhvZCBkb2VzbiB3b3JrIG9uIHN0cmluZ3MgY29udGFpbmluZyBVVEYtMTZcbi8vIGNoYXJhY3RlcnMgKHdpdGggaGlnaCBhbmQgbG93IHN1cnJvZ2F0ZSBwYWlycyksIHN1Y2ggYXMg8J+SqSAocG9vIGVtb2ppKS4gVGhpc1xuLy8gYGNoYXJBdEluZGV4KClgIGZ1bmN0aW9uIGRvZXMuXG4vL1xuLy8gQ3JlZGl0OiBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0L2Jsb2IvbWFzdGVyL2F0LmpzI0wxNC1MNDhcbmV4cG9ydCB2YXIgY2hhckF0SW5kZXggPSBmdW5jdGlvbiAodGV4dCwgaW5kZXgpIHtcbiAgICAvLyBHZXQgdGhlIGZpcnN0IGNvZGUgdW5pdCBhbmQgY29kZSB1bml0IHZhbHVlXG4gICAgdmFyIGN1Rmlyc3QgPSB0ZXh0LmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgIHZhciBjdVNlY29uZDtcbiAgICB2YXIgbmV4dEluZGV4ID0gaW5kZXggKyAxO1xuICAgIHZhciBsZW5ndGggPSAxO1xuICAgIGlmIChcbiAgICAvLyBDaGVjayBpZiBpdCdzIHRoZSBzdGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyLlxuICAgIGN1Rmlyc3QgPj0gMHhkODAwICYmXG4gICAgICAgIGN1Rmlyc3QgPD0gMHhkYmZmICYmIC8vIGhpZ2ggc3Vycm9nYXRlXG4gICAgICAgIHRleHQubGVuZ3RoID4gbmV4dEluZGV4IC8vIHRoZXJlIGlzIGEgbmV4dCBjb2RlIHVuaXRcbiAgICApIHtcbiAgICAgICAgY3VTZWNvbmQgPSB0ZXh0LmNoYXJDb2RlQXQobmV4dEluZGV4KTtcbiAgICAgICAgaWYgKGN1U2Vjb25kID49IDB4ZGMwMCAmJiBjdVNlY29uZCA8PSAweGRmZmYpXG4gICAgICAgICAgICBsZW5ndGggPSAyOyAvLyBsb3cgc3Vycm9nYXRlXG4gICAgfVxuICAgIHJldHVybiBbdGV4dC5zbGljZShpbmRleCwgaW5kZXggKyBsZW5ndGgpLCBsZW5ndGhdO1xufTtcbmV4cG9ydCB2YXIgY2hhclNwbGl0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICB2YXIgY2hhcnMgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0ZXh0Lmxlbmd0aDsgaWR4IDwgbGVuOykge1xuICAgICAgICB2YXIgX2EgPSBjaGFyQXRJbmRleCh0ZXh0LCBpZHgpLCBjID0gX2FbMF0sIGNMZW4gPSBfYVsxXTtcbiAgICAgICAgY2hhcnMucHVzaChjKTtcbiAgICAgICAgaWR4ICs9IGNMZW47XG4gICAgfVxuICAgIHJldHVybiBjaGFycztcbn07XG52YXIgYnVpbGRXb3JkQnJlYWtSZWdleCA9IGZ1bmN0aW9uICh3b3JkQnJlYWtzKSB7XG4gICAgdmFyIG5ld2xpbmVDaGFyVW5pb24gPSBlc2NhcGVkTmV3bGluZUNoYXJzLmpvaW4oJ3wnKTtcbiAgICB2YXIgZXNjYXBlZFJ1bGVzID0gWyckJ107XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd29yZEJyZWFrcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIHdvcmRCcmVhayA9IHdvcmRCcmVha3NbaWR4XTtcbiAgICAgICAgaWYgKGlzTmV3bGluZUNoYXIod29yZEJyZWFrKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImB3b3JkQnJlYWtgIG11c3Qgbm90IGluY2x1ZGUgXCIgKyBuZXdsaW5lQ2hhclVuaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlc2NhcGVkUnVsZXMucHVzaCh3b3JkQnJlYWsgPT09ICcnID8gJy4nIDogZXNjYXBlUmVnRXhwKHdvcmRCcmVhaykpO1xuICAgIH1cbiAgICB2YXIgYnJlYWtSdWxlcyA9IGVzY2FwZWRSdWxlcy5qb2luKCd8Jyk7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoXCIgKyBuZXdsaW5lQ2hhclVuaW9uICsgXCIpfCgoLio/KShcIiArIGJyZWFrUnVsZXMgKyBcIikpXCIsICdnbScpO1xufTtcbmV4cG9ydCB2YXIgYnJlYWtUZXh0SW50b0xpbmVzID0gZnVuY3Rpb24gKHRleHQsIHdvcmRCcmVha3MsIG1heFdpZHRoLCBjb21wdXRlV2lkdGhPZlRleHQpIHtcbiAgICB2YXIgcmVnZXggPSBidWlsZFdvcmRCcmVha1JlZ2V4KHdvcmRCcmVha3MpO1xuICAgIHZhciB3b3JkcyA9IGNsZWFuVGV4dCh0ZXh0KS5tYXRjaChyZWdleCk7XG4gICAgdmFyIGN1cnJMaW5lID0gJyc7XG4gICAgdmFyIGN1cnJXaWR0aCA9IDA7XG4gICAgdmFyIGxpbmVzID0gW107XG4gICAgdmFyIHB1c2hDdXJyTGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGN1cnJMaW5lICE9PSAnJylcbiAgICAgICAgICAgIGxpbmVzLnB1c2goY3VyckxpbmUpO1xuICAgICAgICBjdXJyTGluZSA9ICcnO1xuICAgICAgICBjdXJyV2lkdGggPSAwO1xuICAgIH07XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd29yZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciB3b3JkID0gd29yZHNbaWR4XTtcbiAgICAgICAgaWYgKGlzTmV3bGluZUNoYXIod29yZCkpIHtcbiAgICAgICAgICAgIHB1c2hDdXJyTGluZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gY29tcHV0ZVdpZHRoT2ZUZXh0KHdvcmQpO1xuICAgICAgICAgICAgaWYgKGN1cnJXaWR0aCArIHdpZHRoID4gbWF4V2lkdGgpXG4gICAgICAgICAgICAgICAgcHVzaEN1cnJMaW5lKCk7XG4gICAgICAgICAgICBjdXJyTGluZSArPSB3b3JkO1xuICAgICAgICAgICAgY3VycldpZHRoICs9IHdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1c2hDdXJyTGluZSgpO1xuICAgIHJldHVybiBsaW5lcztcbn07XG4vLyBTZWUgc2VjdGlvbiBcIjcuOS40IERhdGVzXCIgb2YgdGhlIFBERiBzcGVjaWZpY2F0aW9uXG52YXIgZGF0ZVJlZ2V4ID0gL15EOihcXGRcXGRcXGRcXGQpKFxcZFxcZCk/KFxcZFxcZCk/KFxcZFxcZCk/KFxcZFxcZCk/KFxcZFxcZCk/KFsrXFwtWl0pPyhcXGRcXGQpPyc/KFxcZFxcZCk/Jz8kLztcbmV4cG9ydCB2YXIgcGFyc2VEYXRlID0gZnVuY3Rpb24gKGRhdGVTdHIpIHtcbiAgICB2YXIgbWF0Y2ggPSBkYXRlU3RyLm1hdGNoKGRhdGVSZWdleCk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2YXIgeWVhciA9IG1hdGNoWzFdLCBfYSA9IG1hdGNoWzJdLCBtb250aCA9IF9hID09PSB2b2lkIDAgPyAnMDEnIDogX2EsIF9iID0gbWF0Y2hbM10sIGRheSA9IF9iID09PSB2b2lkIDAgPyAnMDEnIDogX2IsIF9jID0gbWF0Y2hbNF0sIGhvdXJzID0gX2MgPT09IHZvaWQgMCA/ICcwMCcgOiBfYywgX2QgPSBtYXRjaFs1XSwgbWlucyA9IF9kID09PSB2b2lkIDAgPyAnMDAnIDogX2QsIF9lID0gbWF0Y2hbNl0sIHNlY3MgPSBfZSA9PT0gdm9pZCAwID8gJzAwJyA6IF9lLCBfZiA9IG1hdGNoWzddLCBvZmZzZXRTaWduID0gX2YgPT09IHZvaWQgMCA/ICdaJyA6IF9mLCBfZyA9IG1hdGNoWzhdLCBvZmZzZXRIb3VycyA9IF9nID09PSB2b2lkIDAgPyAnMDAnIDogX2csIF9oID0gbWF0Y2hbOV0sIG9mZnNldE1pbnMgPSBfaCA9PT0gdm9pZCAwID8gJzAwJyA6IF9oO1xuICAgIC8vIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuMTVcbiAgICB2YXIgdHpPZmZzZXQgPSBvZmZzZXRTaWduID09PSAnWicgPyAnWicgOiBcIlwiICsgb2Zmc2V0U2lnbiArIG9mZnNldEhvdXJzICsgXCI6XCIgKyBvZmZzZXRNaW5zO1xuICAgIHZhciBkYXRlID0gbmV3IERhdGUoeWVhciArIFwiLVwiICsgbW9udGggKyBcIi1cIiArIGRheSArIFwiVFwiICsgaG91cnMgKyBcIjpcIiArIG1pbnMgKyBcIjpcIiArIHNlY3MgKyB0ek9mZnNldCk7XG4gICAgcmV0dXJuIGRhdGU7XG59O1xuZXhwb3J0IHZhciBmaW5kTGFzdE1hdGNoID0gZnVuY3Rpb24gKHZhbHVlLCByZWdleCkge1xuICAgIHZhciBfYTtcbiAgICB2YXIgcG9zaXRpb24gPSAwO1xuICAgIHZhciBsYXN0TWF0Y2g7XG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHZhbHVlLnN1YnN0cmluZyhwb3NpdGlvbikubWF0Y2gocmVnZXgpO1xuICAgICAgICBpZiAoIW1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2g6IGxhc3RNYXRjaCwgcG9zOiBwb3NpdGlvbiB9O1xuICAgICAgICBsYXN0TWF0Y2ggPSBtYXRjaDtcbiAgICAgICAgcG9zaXRpb24gKz0gKChfYSA9IG1hdGNoLmluZGV4KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwKSArIG1hdGNoWzBdLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHsgbWF0Y2g6IGxhc3RNYXRjaCwgcG9zOiBwb3NpdGlvbiB9O1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ3MuanMubWFwIiwiaW1wb3J0IHsgdG9IZXhTdHJpbmcgfSBmcm9tIFwiLi9zdHJpbmdzXCI7XG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgdG8gVVRGLTguXG4gKlxuICogQHBhcmFtIGlucHV0IFRoZSBzdHJpbmcgdG8gYmUgZW5jb2RlZC5cbiAqIEBwYXJhbSBieXRlT3JkZXJNYXJrIFdoZXRoZXIgb3Igbm90IGEgYnl0ZSBvcmRlciBtYXJrZXIgKEJPTSkgc2hvdWxkIGJlIGFkZGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgc3RhcnQgb2YgdGhlIGVuY29kaW5nLiAoZGVmYXVsdCBgdHJ1ZWApXG4gKiBAcmV0dXJucyBBIFVpbnQ4QXJyYXkgY29udGFpbmluZyB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEphdmFTY3JpcHQgc3RyaW5ncyBhcmUgY29tcG9zZWQgb2YgVW5pY29kZSBjb2RlIHBvaW50cy4gQ29kZSBwb2ludHMgYXJlXG4gKiBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMCB0byAxLDExNCwxMTEgKDB4MTBGRkZGKS4gV2hlbiBzZXJpYWxpemluZyBhIHN0cmluZyxcbiAqIGl0IG11c3QgYmUgZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIHdvcmRzLiBBIHdvcmQgaXMgdHlwaWNhbGx5IDgsIDE2LCBvciAzMlxuICogYnl0ZXMgaW4gc2l6ZS4gQXMgc3VjaCwgVW5pY29kZSBkZWZpbmVzIHRocmVlIGVuY29kaW5nIGZvcm1zOiBVVEYtOCwgVVRGLTE2LFxuICogYW5kIFVURi0zMi4gVGhlc2UgZW5jb2RpbmcgZm9ybXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgVW5pY29kZSBzdGFuZGFyZCBbMV0uXG4gKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIFVURi04IGVuY29kaW5nIGZvcm0uXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBJbiBVVEYtOCwgZWFjaCBjb2RlIHBvaW50IGlzIG1hcHBlZCB0byBhIHNlcXVlbmNlIG9mIDEsIDIsIDMsIG9yIDQgYnl0ZXMuXG4gKiBOb3RlIHRoYXQgdGhlIGxvZ2ljIHdoaWNoIGRlZmluZXMgdGhpcyBtYXBwaW5nIGlzIHNsaWdodGx5IGNvbnZvbHV0ZWQsIGFuZFxuICogbm90IGFzIHN0cmFpZ2h0Zm9yd2FyZCBhcyB0aGUgbWFwcGluZyBsb2dpYyBmb3IgVVRGLTE2IG9yIFVURi0zMi4gVGhlIFVURi04XG4gKiBtYXBwaW5nIGxvZ2ljIGlzIGFzIGZvbGxvd3MgWzJdOlxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMDAwMC4uVSswMDdGLCB0aGVuIHZpZXcgaXQgYXMgYSA3LWJpdFxuICogICBpbnRlZ2VyOiAwYnh4eHh4eHguIE1hcCB0aGUgY29kZSBwb2ludCB0byAxIGJ5dGUgd2l0aCB0aGUgZmlyc3QgaGlnaCBvcmRlclxuICogICBiaXQgc2V0IHRvIDA6XG4gKlxuICogICAgICAgYjE9MGIweHh4eHh4eFxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMDA4MC4uVSswN0ZGLCB0aGVuIHZpZXcgaXQgYXMgYW4gMTEtYml0XG4gKiAgIGludGVnZXI6IDBieXl5eXl4eHh4eHguIE1hcCB0aGUgY29kZSBwb2ludCB0byAyIGJ5dGVzIHdpdGggdGhlIGZpcnN0IDUgYml0c1xuICogICBvZiB0aGUgY29kZSBwb2ludCBzdG9yZWQgaW4gdGhlIGZpcnN0IGJ5dGUsIGFuZCB0aGUgbGFzdCA2IGJpdHMgc3RvcmVkIGluXG4gKiAgIHRoZSBzZWNvbmQgYnl0ZTpcbiAqXG4gKiAgICAgICBiMT0wYjExMHl5eXl5ICAgIGIyPTBiMTB4eHh4eHhcbiAqXG4gKiDigKIgSWYgYSBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVKzA4MDAuLlUrRkZGRiwgdGhlbiB2aWV3IGl0IGFzIGEgMTYtYml0XG4gKiAgIGludGVnZXIsIDBienp6enl5eXl5eXh4eHh4eC4gTWFwIHRoZSBjb2RlIHBvaW50IHRvIDMgYnl0ZXMgd2l0aCB0aGUgZmlyc3RcbiAqICAgNCBiaXRzIHN0b3JlZCBpbiB0aGUgZmlyc3QgYnl0ZSwgdGhlIG5leHQgNiBiaXRzIHN0b3JlZCBpbiB0aGUgc2Vjb25kIGJ5dGUsXG4gKiAgIGFuZCB0aGUgbGFzdCA2IGJpdHMgaW4gdGhlIHRoaXJkIGJ5dGU6XG4gKlxuICogICAgICAgYjE9MGIxMTEwenp6eiAgICBiMj0wYjEweXl5eXl5ICAgIGIzPTBiMTB4eHh4eHhcbiAqXG4gKiDigKIgSWYgYSBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVKzEwMDAwLi4uVSsxMEZGRkYsIHRoZW4gdmlldyBpdCBhcyBhXG4gKiAgIDIxLWJpdCBpbnRlZ2VyLCAwYnZ2dnp6enp6enl5eXl5eXh4eHh4eC4gTWFwIHRoZSBjb2RlIHBvaW50IHRvIDQgYnl0ZXMgd2l0aFxuICogICB0aGUgZmlyc3QgMyBiaXRzIHN0b3JlZCBpbiB0aGUgZmlyc3QgYnl0ZSwgdGhlIG5leHQgNiBiaXRzIHN0b3JlZCBpbiB0aGVcbiAqICAgc2Vjb25kIGJ5dGUsIHRoZSBuZXh0IDYgYml0cyBzdG9yZWQgaW4gdGhlIHRoaXJkIGJ5dGUsIGFuZCB0aGUgbGFzdCA2IGJpdHNcbiAqICAgc3RvcmVkIGluIHRoZSBmb3VydGggYnl0ZTpcbiAqXG4gKiAgICAgICBiMT0wYjExMTEweHh4ICAgIGIyPTBiMTB6enp6enogICAgYjM9MGIxMHl5eXl5eSAgICBiND0wYjEweHh4eHh4XG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSwgd2hlbiBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgY29kZSBwb2ludHMgb2YgYSBzdHJpbmdcbiAqIGluIEphdmFTY3JpcHQsIHRoYXQgaWYgYSBjaGFyYWN0ZXIgaXMgZW5jb2RlZCBhcyBhIHN1cnJvZ2F0ZSBwYWlyIGl0IHdpbGxcbiAqIGluY3JlYXNlIHRoZSBzdHJpbmcncyBsZW5ndGggYnkgMiBpbnN0ZWFkIG9mIDEgWzRdLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBcbiAqID4gJ2EnLmxlbmd0aFxuICogMVxuICogPiAn8J+SqScubGVuZ3RoXG4gKiAyXG4gKiA+ICfoqp4nLmxlbmd0aFxuICogMVxuICogPiAnYfCfkqnoqp4nLmxlbmd0aFxuICogNFxuICogYGBgXG4gKlxuICogVGhlIHJlc3VsdHMgb2YgdGhlIGFib3ZlIGV4YW1wbGUgYXJlIGV4cGxhaW5lZCBieSB0aGUgZmFjdCB0aGF0IHRoZVxuICogY2hhcmFjdGVycyAnYScgYW5kICfoqp4nIGFyZSBub3QgcmVwcmVzZW50ZWQgYnkgc3Vycm9nYXRlIHBhaXJzLCBidXQgJ/CfkqknIGlzLlxuICpcbiAqIEJlY2F1c2Ugb2YgdGhpcyBpZGlvc3luY3Jhc3kgaW4gSmF2YVNjcmlwdCdzIHN0cmluZyBpbXBsZW1lbnRhdGlvbiBhbmQgQVBJcyxcbiAqIHdlIG11c3QgXCJqdW1wXCIgYW4gZXh0cmEgaW5kZXggYWZ0ZXIgZW5jb2RpbmcgYSBjaGFyYWN0ZXIgYXMgYSBzdXJyb2dhdGVcbiAqIHBhaXIuIEluIHByYWN0aWNlLCB0aGlzIG1lYW5zIHdlIG11c3QgaW5jcmVtZW50IHRoZSBpbmRleCBvZiBvdXIgZm9yIGxvb3AgYnlcbiAqIDIgaWYgd2UgZW5jb2RlIGEgc3Vycm9nYXRlIHBhaXIsIGFuZCAxIGluIGFsbCBvdGhlciBjYXNlcy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiAgIC0gWzFdIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGUxMi4wLjAvVW5pY29kZVN0YW5kYXJkLTEyLjAucGRmXG4gKiAgICAgICAgIDMuOSAgVW5pY29kZSBFbmNvZGluZyBGb3JtcyAtIFVURi04XG4gKiAgIC0gWzJdIGh0dHA6Ly93d3cuaGVyb25neWFuZy5jb20vVW5pY29kZS9VVEYtOC1VVEYtOC1FbmNvZGluZy5odG1sXG4gKiAgIC0gWzNdIGh0dHA6Ly93d3cuaGVyb25neWFuZy5jb20vVW5pY29kZS9VVEYtOC1VVEYtOC1FbmNvZGluZy1BbGdvcml0aG0uaHRtbFxuICogICAtIFs0XSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvbGVuZ3RoI0Rlc2NyaXB0aW9uXG4gKlxuICovXG5leHBvcnQgdmFyIHV0ZjhFbmNvZGUgPSBmdW5jdGlvbiAoaW5wdXQsIGJ5dGVPcmRlck1hcmspIHtcbiAgICBpZiAoYnl0ZU9yZGVyTWFyayA9PT0gdm9pZCAwKSB7IGJ5dGVPcmRlck1hcmsgPSB0cnVlOyB9XG4gICAgdmFyIGVuY29kZWQgPSBbXTtcbiAgICBpZiAoYnl0ZU9yZGVyTWFyaylcbiAgICAgICAgZW5jb2RlZC5wdXNoKDB4ZWYsIDB4YmIsIDB4YmYpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGlucHV0Lmxlbmd0aDsgaWR4IDwgbGVuOykge1xuICAgICAgICB2YXIgY29kZVBvaW50ID0gaW5wdXQuY29kZVBvaW50QXQoaWR4KTtcbiAgICAgICAgLy8gT25lIGJ5dGUgZW5jb2RpbmdcbiAgICAgICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgICAgICAgIHZhciBieXRlMSA9IGNvZGVQb2ludCAmIDB4N2Y7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goYnl0ZTEpO1xuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHdvIGJ5dGUgZW5jb2RpbmdcbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDwgMHgwODAwKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZTEgPSAoKGNvZGVQb2ludCA+PiA2KSAmIDB4MWYpIHwgMHhjMDtcbiAgICAgICAgICAgIHZhciBieXRlMiA9IChjb2RlUG9pbnQgJiAweDNmKSB8IDB4ODA7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goYnl0ZTEsIGJ5dGUyKTtcbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRocmVlIGJ5dGUgZW5jb2RpbmdcbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDwgMHgwMTAwMDApIHtcbiAgICAgICAgICAgIHZhciBieXRlMSA9ICgoY29kZVBvaW50ID4+IDEyKSAmIDB4MGYpIHwgMHhlMDtcbiAgICAgICAgICAgIHZhciBieXRlMiA9ICgoY29kZVBvaW50ID4+IDYpICYgMHgzZikgfCAweDgwO1xuICAgICAgICAgICAgdmFyIGJ5dGUzID0gKGNvZGVQb2ludCAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChieXRlMSwgYnl0ZTIsIGJ5dGUzKTtcbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvdXIgYnl0ZSBlbmNvZGluZyAoc3Vycm9nYXRlIHBhaXIpXG4gICAgICAgIGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZTEgPSAoKGNvZGVQb2ludCA+PiAxOCkgJiAweDA3KSB8IDB4ZjA7XG4gICAgICAgICAgICB2YXIgYnl0ZTIgPSAoKGNvZGVQb2ludCA+PiAxMikgJiAweDNmKSB8IDB4ODA7XG4gICAgICAgICAgICB2YXIgYnl0ZTMgPSAoKGNvZGVQb2ludCA+PiA2KSAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHZhciBieXRlNCA9ICgoY29kZVBvaW50ID4+IDApICYgMHgzZikgfCAweDgwO1xuICAgICAgICAgICAgZW5jb2RlZC5wdXNoKGJ5dGUxLCBieXRlMiwgYnl0ZTMsIGJ5dGU0KTtcbiAgICAgICAgICAgIGlkeCArPSAyO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciByZWFjaCB0aGlzIGNhc2VcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjb2RlIHBvaW50OiAweFwiICsgdG9IZXhTdHJpbmcoY29kZVBvaW50KSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShlbmNvZGVkKTtcbn07XG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgdG8gVVRGLTE2LlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyaW5nIHRvIGJlIGVuY29kZWQuXG4gKiBAcGFyYW0gYnl0ZU9yZGVyTWFyayBXaGV0aGVyIG9yIG5vdCBhIGJ5dGUgb3JkZXIgbWFya2VyIChCT00pIHNob3VsZCBiZSBhZGRlZFxuICogICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBlbmNvZGluZy4gKGRlZmF1bHQgYHRydWVgKVxuICogQHJldHVybnMgQSBVaW50MTZBcnJheSBjb250YWluaW5nIHRoZSBVVEYtMTYgZW5jb2Rpbmcgb2YgdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEphdmFTY3JpcHQgc3RyaW5ncyBhcmUgY29tcG9zZWQgb2YgVW5pY29kZSBjb2RlIHBvaW50cy4gQ29kZSBwb2ludHMgYXJlXG4gKiBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMCB0byAxLDExNCwxMTEgKDB4MTBGRkZGKS4gV2hlbiBzZXJpYWxpemluZyBhIHN0cmluZyxcbiAqIGl0IG11c3QgYmUgZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIHdvcmRzLiBBIHdvcmQgaXMgdHlwaWNhbGx5IDgsIDE2LCBvciAzMlxuICogYnl0ZXMgaW4gc2l6ZS4gQXMgc3VjaCwgVW5pY29kZSBkZWZpbmVzIHRocmVlIGVuY29kaW5nIGZvcm1zOiBVVEYtOCwgVVRGLTE2LFxuICogYW5kIFVURi0zMi4gVGhlc2UgZW5jb2RpbmcgZm9ybXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgVW5pY29kZSBzdGFuZGFyZCBbMV0uXG4gKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIFVURi0xNiBlbmNvZGluZyBmb3JtLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSW4gVVRGLTE2LCBlYWNoIGNvZGUgcG9pbnQgaXMgbWFwcGVkIHRvIG9uZSBvciB0d28gMTYtYml0IGludGVnZXJzLiBUaGVcbiAqIFVURi0xNiBtYXBwaW5nIGxvZ2ljIGlzIGFzIGZvbGxvd3MgWzJdOlxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMDAwMC4uVStGRkZGLCB0aGVuIG1hcCB0aGUgY29kZSBwb2ludCB0b1xuICogICBhIDE2LWJpdCBpbnRlZ2VyIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC5cbiAqXG4gKiDigKIgSWYgYSBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVKzEwMDAwLi5VKzEwMDAwLCB0aGVuIG1hcCB0aGUgY29kZSBwb2ludFxuICogICB0byB0d28gMTYtYml0IGludGVnZXJzLiBUaGUgZmlyc3QgaW50ZWdlciBzaG91bGQgY29udGFpbiB0aGUgaGlnaCBzdXJyb2dhdGVcbiAqICAgYW5kIHRoZSBzZWNvbmQgaW50ZWdlciBzaG91bGQgY29udGFpbiB0aGUgbG93IHN1cnJvZ2F0ZS4gQm90aCBzdXJyb2dhdGVzXG4gKiAgIHNob3VsZCBiZSB3cml0dGVuIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEl0IGlzIGltcG9ydGFudCB0byBub3RlLCB3aGVuIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBjb2RlIHBvaW50cyBvZiBhIHN0cmluZ1xuICogaW4gSmF2YVNjcmlwdCwgdGhhdCBpZiBhIGNoYXJhY3RlciBpcyBlbmNvZGVkIGFzIGEgc3Vycm9nYXRlIHBhaXIgaXQgd2lsbFxuICogaW5jcmVhc2UgdGhlIHN0cmluZydzIGxlbmd0aCBieSAyIGluc3RlYWQgb2YgMSBbNF0uIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYFxuICogPiAnYScubGVuZ3RoXG4gKiAxXG4gKiA+ICfwn5KpJy5sZW5ndGhcbiAqIDJcbiAqID4gJ+iqnicubGVuZ3RoXG4gKiAxXG4gKiA+ICdh8J+SqeiqnicubGVuZ3RoXG4gKiA0XG4gKiBgYGBcbiAqXG4gKiBUaGUgcmVzdWx0cyBvZiB0aGUgYWJvdmUgZXhhbXBsZSBhcmUgZXhwbGFpbmVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlXG4gKiBjaGFyYWN0ZXJzICdhJyBhbmQgJ+iqnicgYXJlIG5vdCByZXByZXNlbnRlZCBieSBzdXJyb2dhdGUgcGFpcnMsIGJ1dCAn8J+SqScgaXMuXG4gKlxuICogQmVjYXVzZSBvZiB0aGlzIGlkaW9zeW5jcmFzeSBpbiBKYXZhU2NyaXB0J3Mgc3RyaW5nIGltcGxlbWVudGF0aW9uIGFuZCBBUElzLFxuICogd2UgbXVzdCBcImp1bXBcIiBhbiBleHRyYSBpbmRleCBhZnRlciBlbmNvZGluZyBhIGNoYXJhY3RlciBhcyBhIHN1cnJvZ2F0ZVxuICogcGFpci4gSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgd2UgbXVzdCBpbmNyZW1lbnQgdGhlIGluZGV4IG9mIG91ciBmb3IgbG9vcCBieVxuICogMiBpZiB3ZSBlbmNvZGUgYSBzdXJyb2dhdGUgcGFpciwgYW5kIDEgaW4gYWxsIG90aGVyIGNhc2VzLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogUmVmZXJlbmNlczpcbiAqICAgLSBbMV0gaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTEyLjAuMC9Vbmljb2RlU3RhbmRhcmQtMTIuMC5wZGZcbiAqICAgICAgICAgMy45ICBVbmljb2RlIEVuY29kaW5nIEZvcm1zIC0gVVRGLThcbiAqICAgLSBbMl0gaHR0cDovL3d3dy5oZXJvbmd5YW5nLmNvbS9Vbmljb2RlL1VURi0xNi1VVEYtMTYtRW5jb2RpbmcuaHRtbFxuICogICAtIFszXSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvbGVuZ3RoI0Rlc2NyaXB0aW9uXG4gKlxuICovXG5leHBvcnQgdmFyIHV0ZjE2RW5jb2RlID0gZnVuY3Rpb24gKGlucHV0LCBieXRlT3JkZXJNYXJrKSB7XG4gICAgaWYgKGJ5dGVPcmRlck1hcmsgPT09IHZvaWQgMCkgeyBieXRlT3JkZXJNYXJrID0gdHJ1ZTsgfVxuICAgIHZhciBlbmNvZGVkID0gW107XG4gICAgaWYgKGJ5dGVPcmRlck1hcmspXG4gICAgICAgIGVuY29kZWQucHVzaCgweGZlZmYpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGlucHV0Lmxlbmd0aDsgaWR4IDwgbGVuOykge1xuICAgICAgICB2YXIgY29kZVBvaW50ID0gaW5wdXQuY29kZVBvaW50QXQoaWR4KTtcbiAgICAgICAgLy8gVHdvIGJ5dGUgZW5jb2RpbmdcbiAgICAgICAgaWYgKGNvZGVQb2ludCA8IDB4MDEwMDAwKSB7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goY29kZVBvaW50KTtcbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvdXIgYnl0ZSBlbmNvZGluZyAoc3Vycm9nYXRlIHBhaXIpXG4gICAgICAgIGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goaGlnaFN1cnJvZ2F0ZShjb2RlUG9pbnQpLCBsb3dTdXJyb2dhdGUoY29kZVBvaW50KSk7XG4gICAgICAgICAgICBpZHggKz0gMjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBjYXNlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29kZSBwb2ludDogMHhcIiArIHRvSGV4U3RyaW5nKGNvZGVQb2ludCkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQxNkFycmF5KGVuY29kZWQpO1xufTtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGBjb2RlUG9pbnRgIGlzIHdpdGhpbiB0aGVcbiAqIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKS4gQ29kZSBwb2ludHMgaW5zaWRlIHRoZSBCTVAgYXJlIG5vdCBlbmNvZGVkXG4gKiB3aXRoIHN1cnJvZ2F0ZSBwYWlycy5cbiAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIGNvZGUgcG9pbnQgdG8gYmUgZXZhbHVhdGVkLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0Rlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCB2YXIgaXNXaXRoaW5CTVAgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIGNvZGVQb2ludCA+PSAwICYmIGNvZGVQb2ludCA8PSAweGZmZmY7XG59O1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYGNvZGVQb2ludGAgaXMgdmFsaWQgYW5kIG11c3QgYmUgcmVwcmVzZW50ZWRcbiAqIHdpdGggYSBzdXJyb2dhdGUgcGFpciB3aGVuIGVuY29kZWQuXG4gKiBAcGFyYW0gY29kZVBvaW50IFRoZSBjb2RlIHBvaW50IHRvIGJlIGV2YWx1YXRlZC5cbiAqXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNEZXNjcmlwdGlvblxuICovXG5leHBvcnQgdmFyIGhhc1N1cnJvZ2F0ZXMgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIGNvZGVQb2ludCA+PSAweDAxMDAwMCAmJiBjb2RlUG9pbnQgPD0gMHgxMGZmZmY7XG59O1xuLy8gRnJvbSBVbmljb2RlIDMuMCBzcGVjLCBzZWN0aW9uIDMuNzpcbi8vICAgaHR0cDovL3VuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGUzLjAuMC9jaDAzLnBkZlxuZXhwb3J0IHZhciBoaWdoU3Vycm9nYXRlID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKChjb2RlUG9pbnQgLSAweDEwMDAwKSAvIDB4NDAwKSArIDB4ZDgwMDtcbn07XG4vLyBGcm9tIFVuaWNvZGUgMy4wIHNwZWMsIHNlY3Rpb24gMy43OlxuLy8gICBodHRwOi8vdW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTMuMC4wL2NoMDMucGRmXG5leHBvcnQgdmFyIGxvd1N1cnJvZ2F0ZSA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gKChjb2RlUG9pbnQgLSAweDEwMDAwKSAlIDB4NDAwKSArIDB4ZGMwMDtcbn07XG52YXIgQnl0ZU9yZGVyO1xuKGZ1bmN0aW9uIChCeXRlT3JkZXIpIHtcbiAgICBCeXRlT3JkZXJbXCJCaWdFbmRpYW5cIl0gPSBcIkJpZ0VuZGlhblwiO1xuICAgIEJ5dGVPcmRlcltcIkxpdHRsZUVuZGlhblwiXSA9IFwiTGl0dGxlRW5kaWFuXCI7XG59KShCeXRlT3JkZXIgfHwgKEJ5dGVPcmRlciA9IHt9KSk7XG52YXIgUkVQTEFDRU1FTlQgPSAn77+9Jy5jb2RlUG9pbnRBdCgwKTtcbi8qKlxuICogRGVjb2RlcyBhIFVpbnQ4QXJyYXkgb2YgZGF0YSB0byBhIHN0cmluZyB1c2luZyBVVEYtMTYuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gcmVjb3ZlciBmcm9tIGVycm9ub3VzIGlucHV0IGJ5XG4gKiBpbnNlcnRpbmcgdGhlIHJlcGxhY2VtZW50IGNoYXJhY3RlciAo77+9KSB0byBtYXJrIGludmFsaWQgY29kZSBwb2ludHNcbiAqIGFuZCBzdXJyb2dhdGUgcGFpcnMuXG4gKlxuICogQHBhcmFtIGlucHV0IEEgVWludDhBcnJheSBjb250YWluaW5nIFVURi0xNiBlbmNvZGVkIGRhdGFcbiAqIEBwYXJhbSBieXRlT3JkZXJNYXJrIFdoZXRoZXIgb3Igbm90IGEgYnl0ZSBvcmRlciBtYXJrZXIgKEJPTSkgc2hvdWxkIGJlIHJlYWRcbiAqICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgZW5jb2RpbmcuIChkZWZhdWx0IGB0cnVlYClcbiAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IHZhciB1dGYxNkRlY29kZSA9IGZ1bmN0aW9uIChpbnB1dCwgYnl0ZU9yZGVyTWFyaykge1xuICAgIGlmIChieXRlT3JkZXJNYXJrID09PSB2b2lkIDApIHsgYnl0ZU9yZGVyTWFyayA9IHRydWU7IH1cbiAgICAvLyBOZWVkIGF0IGxlYXN0IDIgYnl0ZXMgb2YgZGF0YSBpbiBVVEYtMTYgZW5jb2RpbmdzXG4gICAgaWYgKGlucHV0Lmxlbmd0aCA8PSAxKVxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoUkVQTEFDRU1FTlQpO1xuICAgIHZhciBieXRlT3JkZXIgPSBieXRlT3JkZXJNYXJrID8gcmVhZEJPTShpbnB1dCkgOiBCeXRlT3JkZXIuQmlnRW5kaWFuO1xuICAgIC8vIFNraXAgYnl0ZSBvcmRlciBtYXJrIGlmIG5lZWRlZFxuICAgIHZhciBpZHggPSBieXRlT3JkZXJNYXJrID8gMiA6IDA7XG4gICAgdmFyIGNvZGVQb2ludHMgPSBbXTtcbiAgICB3aGlsZSAoaW5wdXQubGVuZ3RoIC0gaWR4ID49IDIpIHtcbiAgICAgICAgdmFyIGZpcnN0ID0gZGVjb2RlVmFsdWVzKGlucHV0W2lkeCsrXSwgaW5wdXRbaWR4KytdLCBieXRlT3JkZXIpO1xuICAgICAgICBpZiAoaXNIaWdoU3Vycm9nYXRlKGZpcnN0KSkge1xuICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCAtIGlkeCA8IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBOZWVkIGF0IGxlYXN0IDIgYnl0ZXMgbGVmdCBmb3IgdGhlIGxvdyBzdXJyb2dhdGUgdGhhdCBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICAgIGNvZGVQb2ludHMucHVzaChSRVBMQUNFTUVOVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kID0gZGVjb2RlVmFsdWVzKGlucHV0W2lkeCsrXSwgaW5wdXRbaWR4KytdLCBieXRlT3JkZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpc0xvd1N1cnJvZ2F0ZShzZWNvbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVQb2ludHMucHVzaChmaXJzdCwgc2Vjb25kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvdyBzdXJyb2dhdGVzIHNob3VsZCBhbHdheXMgZm9sbG93IGhpZ2ggc3Vycm9nYXRlc1xuICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnRzLnB1c2goUkVQTEFDRU1FTlQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0xvd1N1cnJvZ2F0ZShmaXJzdCkpIHtcbiAgICAgICAgICAgIC8vIEhpZ2ggc3Vycm9nYXRlcyBzaG91bGQgYWx3YXlzIGNvbWUgZmlyc3Qgc2luY2UgYGRlY29kZVZhbHVlcygpYFxuICAgICAgICAgICAgLy8gYWNjb3VudHMgZm9yIHRoZSBieXRlIG9yZGVyaW5nXG4gICAgICAgICAgICBpZHggKz0gMjtcbiAgICAgICAgICAgIGNvZGVQb2ludHMucHVzaChSRVBMQUNFTUVOVCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb2RlUG9pbnRzLnB1c2goZmlyc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBleHRyYSBieXRlKHMpIGxlZnQgb3ZlclxuICAgIGlmIChpZHggPCBpbnB1dC5sZW5ndGgpXG4gICAgICAgIGNvZGVQb2ludHMucHVzaChSRVBMQUNFTUVOVCk7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KFN0cmluZywgY29kZVBvaW50cyk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYGNvZGVQb2ludGAgaXMgYSBoaWdoIHN1cnJvZ2F0ZS5cbiAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIGNvZGUgcG9pbnQgdG8gYmUgZXZhbHVhdGVkLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0Rlc2NyaXB0aW9uXG4gKi9cbnZhciBpc0hpZ2hTdXJyb2dhdGUgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIGNvZGVQb2ludCA+PSAweGQ4MDAgJiYgY29kZVBvaW50IDw9IDB4ZGJmZjtcbn07XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBgY29kZVBvaW50YCBpcyBhIGxvdyBzdXJyb2dhdGUuXG4gKiBAcGFyYW0gY29kZVBvaW50IFRoZSBjb2RlIHBvaW50IHRvIGJlIGV2YWx1YXRlZC5cbiAqXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNEZXNjcmlwdGlvblxuICovXG52YXIgaXNMb3dTdXJyb2dhdGUgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIGNvZGVQb2ludCA+PSAweGRjMDAgJiYgY29kZVBvaW50IDw9IDB4ZGZmZjtcbn07XG4vKipcbiAqIERlY29kZXMgdGhlIGdpdmVuIHV0Zi0xNiB2YWx1ZXMgZmlyc3QgYW5kIHNlY29uZCB1c2luZyB0aGUgc3BlY2lmaWVkXG4gKiBieXRlIG9yZGVyLlxuICogQHBhcmFtIGZpcnN0IFRoZSBmaXJzdCBieXRlIG9mIHRoZSBlbmNvZGluZy5cbiAqIEBwYXJhbSBzZWNvbmQgVGhlIHNlY29uZCBieXRlIG9mIHRoZSBlbmNvZGluZy5cbiAqIEBwYXJhbSBieXRlT3JkZXIgVGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGVuY29kaW5nLlxuICogUmVmZXJlbmNlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjRXhhbXBsZXNcbiAqL1xudmFyIGRlY29kZVZhbHVlcyA9IGZ1bmN0aW9uIChmaXJzdCwgc2Vjb25kLCBieXRlT3JkZXIpIHtcbiAgICAvLyBBcHBlbmQgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJlY2VkaW5nIGJ5dGUgYnkgc2hpZnRpbmcgdGhlXG4gICAgLy8gZmlyc3Qgb25lIDggdG8gdGhlIGxlZnQgYW5kIHRoYW4gYXBwbHlpbmcgYSBiaXR3aXNlIG9yLW9wZXJhdG9yIHRvIGFwcGVuZFxuICAgIC8vIHRoZSBzZWNvbmQgb25lLlxuICAgIGlmIChieXRlT3JkZXIgPT09IEJ5dGVPcmRlci5MaXR0bGVFbmRpYW4pXG4gICAgICAgIHJldHVybiAoc2Vjb25kIDw8IDgpIHwgZmlyc3Q7XG4gICAgaWYgKGJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkJpZ0VuZGlhbilcbiAgICAgICAgcmV0dXJuIChmaXJzdCA8PCA4KSB8IHNlY29uZDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJ5dGVPcmRlcjogXCIgKyBieXRlT3JkZXIpO1xufTtcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBhcnJheSBjb250YWlucyBhIGJ5dGUgb3JkZXIgbWFyayBmb3IgdGhlXG4gKiBVVEYtMTZCRSBvciBVVEYtMTZMRSBlbmNvZGluZy4gSWYgaXQgaGFzIG5laXRoZXIsIEJpZ0VuZGlhbiBpcyBhc3N1bWVkLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnl0ZV9vcmRlcl9tYXJrI1VURi0xNlxuICpcbiAqIEBwYXJhbSBieXRlcyBUaGUgYnl0ZSBhcnJheSB0byBiZSBldmFsdWF0ZWQuXG4gKi9cbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIHJlYWRCT00gPSBmdW5jdGlvbiAoYnl0ZXMpIHsgcmV0dXJuIChoYXNVdGYxNkJpZ0VuZGlhbkJPTShieXRlcykgPyBCeXRlT3JkZXIuQmlnRW5kaWFuXG4gICAgOiBoYXNVdGYxNkxpdHRsZUVuZGlhbkJPTShieXRlcykgPyBCeXRlT3JkZXIuTGl0dGxlRW5kaWFuXG4gICAgICAgIDogQnl0ZU9yZGVyLkJpZ0VuZGlhbik7IH07XG52YXIgaGFzVXRmMTZCaWdFbmRpYW5CT00gPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICByZXR1cm4gYnl0ZXNbMF0gPT09IDB4ZmUgJiYgYnl0ZXNbMV0gPT09IDB4ZmY7XG59O1xudmFyIGhhc1V0ZjE2TGl0dGxlRW5kaWFuQk9NID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGJ5dGVzWzBdID09PSAweGZmICYmIGJ5dGVzWzFdID09PSAweGZlO1xufTtcbmV4cG9ydCB2YXIgaGFzVXRmMTZCT00gPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICByZXR1cm4gaGFzVXRmMTZCaWdFbmRpYW5CT00oYnl0ZXMpIHx8IGhhc1V0ZjE2TGl0dGxlRW5kaWFuQk9NKGJ5dGVzKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmljb2RlLmpzLm1hcCIsIi8qIHRzbGludDpkaXNhYmxlOmJhbi10eXBlcyAqL1xuaW1wb3J0IHsgdmFsdWVzIGFzIG9iamVjdFZhbHVlcyB9IGZyb20gXCIuL29iamVjdHNcIjtcbmV4cG9ydCB2YXIgYmFja3RpY2sgPSBmdW5jdGlvbiAodmFsKSB7IHJldHVybiBcImBcIiArIHZhbCArIFwiYFwiOyB9O1xuZXhwb3J0IHZhciBzaW5nbGVRdW90ZSA9IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIFwiJ1wiICsgdmFsICsgXCInXCI7IH07XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBmb3JtYXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJylcbiAgICAgICAgcmV0dXJuIHNpbmdsZVF1b3RlKHZhbHVlKTtcbiAgICBlbHNlIGlmICh0eXBlID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIGJhY2t0aWNrKHZhbHVlKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbn07XG5leHBvcnQgdmFyIGNyZWF0ZVZhbHVlRXJyb3JNc2cgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgdmFsdWVzKSB7XG4gICAgdmFyIGFsbG93ZWRWYWx1ZXMgPSBuZXcgQXJyYXkodmFsdWVzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgdiA9IHZhbHVlc1tpZHhdO1xuICAgICAgICBhbGxvd2VkVmFsdWVzW2lkeF0gPSBmb3JtYXRWYWx1ZSh2KTtcbiAgICB9XG4gICAgdmFyIGpvaW5lZFZhbHVlcyA9IGFsbG93ZWRWYWx1ZXMuam9pbignIG9yICcpO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHJldHVybiBiYWNrdGljayh2YWx1ZU5hbWUpICsgXCIgbXVzdCBiZSBvbmUgb2YgXCIgKyBqb2luZWRWYWx1ZXMgKyBcIiwgYnV0IHdhcyBhY3R1YWxseSBcIiArIGZvcm1hdFZhbHVlKHZhbHVlKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydElzT25lT2YgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhbGxvd2VkVmFsdWVzKSkge1xuICAgICAgICBhbGxvd2VkVmFsdWVzID0gb2JqZWN0VmFsdWVzKGFsbG93ZWRWYWx1ZXMpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhbGxvd2VkVmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBpZiAodmFsdWUgPT09IGFsbG93ZWRWYWx1ZXNbaWR4XSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihjcmVhdGVWYWx1ZUVycm9yTXNnKHZhbHVlLCB2YWx1ZU5hbWUsIGFsbG93ZWRWYWx1ZXMpKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFsbG93ZWRWYWx1ZXMpKSB7XG4gICAgICAgIGFsbG93ZWRWYWx1ZXMgPSBvYmplY3RWYWx1ZXMoYWxsb3dlZFZhbHVlcyk7XG4gICAgfVxuICAgIGFzc2VydElzT25lT2YodmFsdWUsIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcy5jb25jYXQodW5kZWZpbmVkKSk7XG59O1xuZXhwb3J0IHZhciBhc3NlcnRJc1N1YnNldCA9IGZ1bmN0aW9uICh2YWx1ZXMsIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhbGxvd2VkVmFsdWVzKSkge1xuICAgICAgICBhbGxvd2VkVmFsdWVzID0gb2JqZWN0VmFsdWVzKGFsbG93ZWRWYWx1ZXMpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGFzc2VydElzT25lT2YodmFsdWVzW2lkeF0sIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcyk7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgZ2V0VHlwZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICBpZiAodmFsID09PSBudWxsKVxuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIGlmIChpc05hTih2YWwpKVxuICAgICAgICByZXR1cm4gJ05hTic7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJylcbiAgICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N5bWJvbCcpXG4gICAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2JpZ2ludCcpXG4gICAgICAgIHJldHVybiAnYmlnaW50JztcbiAgICBpZiAodmFsLmNvbnN0cnVjdG9yICYmIHZhbC5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgICAgICByZXR1cm4gdmFsLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgaWYgKHZhbC5uYW1lKVxuICAgICAgICByZXR1cm4gdmFsLm5hbWU7XG4gICAgaWYgKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWwuY29uc3RydWN0b3IpO1xuICAgIHJldHVybiBTdHJpbmcodmFsKTtcbn07XG5leHBvcnQgdmFyIGlzVHlwZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdHlwZSkge1xuICAgIGlmICh0eXBlID09PSAnbnVsbCcpXG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcbiAgICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJylcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpO1xuICAgIGlmICh0eXBlID09PSAnYm9vbGVhbicpXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgICBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnO1xuICAgIGlmICh0eXBlID09PSAnYmlnaW50JylcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCc7XG4gICAgaWYgKHR5cGUgPT09IERhdGUpXG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgaWYgKHR5cGUgPT09IEFycmF5KVxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBBcnJheTtcbiAgICBpZiAodHlwZSA9PT0gVWludDhBcnJheSlcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheTtcbiAgICBpZiAodHlwZSA9PT0gQXJyYXlCdWZmZXIpXG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyO1xuICAgIGlmICh0eXBlID09PSBGdW5jdGlvbilcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgdHlwZVswXTtcbn07XG5leHBvcnQgdmFyIGNyZWF0ZVR5cGVFcnJvck1zZyA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCB0eXBlcykge1xuICAgIHZhciBhbGxvd2VkVHlwZXMgPSBuZXcgQXJyYXkodHlwZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0eXBlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpZHhdO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ251bGwnKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnbnVsbCcpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCd1bmRlZmluZWQnKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnc3RyaW5nJyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnbnVtYmVyJyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ2Jvb2xlYW4nKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdzeW1ib2wnKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2JpZ2ludCcpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdiaWdpbnQnKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gQXJyYXkpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdBcnJheScpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBVaW50OEFycmF5KVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnVWludDhBcnJheScpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBBcnJheUJ1ZmZlcilcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ0FycmF5QnVmZmVyJyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2sodHlwZVsxXSk7XG4gICAgfVxuICAgIHZhciBqb2luZWRUeXBlcyA9IGFsbG93ZWRUeXBlcy5qb2luKCcgb3IgJyk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIGJhY2t0aWNrKHZhbHVlTmFtZSkgKyBcIiBtdXN0IGJlIG9mIHR5cGUgXCIgKyBqb2luZWRUeXBlcyArIFwiLCBidXQgd2FzIGFjdHVhbGx5IG9mIHR5cGUgXCIgKyBiYWNrdGljayhnZXRUeXBlKHZhbHVlKSk7XG59O1xuZXhwb3J0IHZhciBhc3NlcnRJcyA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCB0eXBlcykge1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHR5cGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBpZiAoaXNUeXBlKHZhbHVlLCB0eXBlc1tpZHhdKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihjcmVhdGVUeXBlRXJyb3JNc2codmFsdWUsIHZhbHVlTmFtZSwgdHlwZXMpKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydE9yVW5kZWZpbmVkID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIHR5cGVzKSB7XG4gICAgYXNzZXJ0SXModmFsdWUsIHZhbHVlTmFtZSwgdHlwZXMuY29uY2F0KCd1bmRlZmluZWQnKSk7XG59O1xuZXhwb3J0IHZhciBhc3NlcnRFYWNoSXMgPSBmdW5jdGlvbiAodmFsdWVzLCB2YWx1ZU5hbWUsIHR5cGVzKSB7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBhc3NlcnRJcyh2YWx1ZXNbaWR4XSwgdmFsdWVOYW1lLCB0eXBlcyk7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgYXNzZXJ0UmFuZ2UgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgbWluLCBtYXgpIHtcbiAgICBhc3NlcnRJcyh2YWx1ZSwgdmFsdWVOYW1lLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRJcyhtaW4sICdtaW4nLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRJcyhtYXgsICdtYXgnLCBbJ251bWJlciddKTtcbiAgICBtYXggPSBNYXRoLm1heChtaW4sIG1heCk7XG4gICAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYmFja3RpY2sodmFsdWVOYW1lKSArIFwiIG11c3QgYmUgYXQgbGVhc3QgXCIgKyBtaW4gKyBcIiBhbmQgYXQgbW9zdCBcIiArIG1heCArIFwiLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgdmFsdWUpO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGFzc2VydFJhbmdlT3JVbmRlZmluZWQgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgbWluLCBtYXgpIHtcbiAgICBhc3NlcnRJcyh2YWx1ZSwgdmFsdWVOYW1lLCBbJ251bWJlcicsICd1bmRlZmluZWQnXSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICAgIGFzc2VydFJhbmdlKHZhbHVlLCB2YWx1ZU5hbWUsIG1pbiwgbWF4KTtcbn07XG5leHBvcnQgdmFyIGFzc2VydE11bHRpcGxlID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIG11bHRpcGxpZXIpIHtcbiAgICBhc3NlcnRJcyh2YWx1ZSwgdmFsdWVOYW1lLCBbJ251bWJlciddKTtcbiAgICBpZiAodmFsdWUgJSBtdWx0aXBsaWVyICE9PSAwKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYmFja3RpY2sodmFsdWVOYW1lKSArIFwiIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBcIiArIG11bHRpcGxpZXIgKyBcIiwgYnV0IHdhcyBhY3R1YWxseSBcIiArIHZhbHVlKTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBhc3NlcnRJbnRlZ2VyID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihiYWNrdGljayh2YWx1ZU5hbWUpICsgXCIgbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgdmFsdWUpO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGFzc2VydFBvc2l0aXZlID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUpIHtcbiAgICBpZiAoIVsxLCAwXS5pbmNsdWRlcyhNYXRoLnNpZ24odmFsdWUpKSkge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJhY2t0aWNrKHZhbHVlTmFtZSkgKyBcIiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIDAsIGJ1dCB3YXMgYWN0dWFsbHkgXCIgKyB2YWx1ZSk7XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZhbGlkYXRvcnMuanMubWFwIiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY3JlYXRlQmluZGluZyhvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XHJcbiAgICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wicHJpbnRKU1wiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJwcmludEpTXCJdID0gZmFjdG9yeSgpO1xufSkod2luZG93LCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoe1xuXG4vKioqLyBcIi4vc3JjL2luZGV4LmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2luZGV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3Nhc3NfaW5kZXhfc2Nzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9zYXNzL2luZGV4LnNjc3MgKi8gXCIuL3NyYy9zYXNzL2luZGV4LnNjc3NcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3Nhc3NfaW5kZXhfc2Nzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9zYXNzX2luZGV4X3Njc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2pzX2luaXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vanMvaW5pdCAqLyBcIi4vc3JjL2pzL2luaXQuanNcIik7XG5cblxudmFyIHByaW50SlMgPSBfanNfaW5pdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5pbml0O1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LnByaW50SlMgPSBwcmludEpTO1xufVxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHByaW50SlMpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9icm93c2VyLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvYnJvd3Nlci5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG52YXIgQnJvd3NlciA9IHtcbiAgLy8gRmlyZWZveCAxLjArXG4gIGlzRmlyZWZveDogZnVuY3Rpb24gaXNGaXJlZm94KCkge1xuICAgIHJldHVybiB0eXBlb2YgSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnO1xuICB9LFxuICAvLyBJbnRlcm5ldCBFeHBsb3JlciA2LTExXG4gIGlzSUU6IGZ1bmN0aW9uIGlzSUUoKSB7XG4gICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTVNJRScpICE9PSAtMSB8fCAhIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcbiAgfSxcbiAgLy8gRWRnZSAyMCtcbiAgaXNFZGdlOiBmdW5jdGlvbiBpc0VkZ2UoKSB7XG4gICAgcmV0dXJuICFCcm93c2VyLmlzSUUoKSAmJiAhIXdpbmRvdy5TdHlsZU1lZGlhO1xuICB9LFxuICAvLyBDaHJvbWUgMStcbiAgaXNDaHJvbWU6IGZ1bmN0aW9uIGlzQ2hyb21lKCkge1xuICAgIHZhciBjb250ZXh0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB3aW5kb3c7XG4gICAgcmV0dXJuICEhY29udGV4dC5jaHJvbWU7XG4gIH0sXG4gIC8vIEF0IGxlYXN0IFNhZmFyaSAzKzogXCJbb2JqZWN0IEhUTUxFbGVtZW50Q29uc3RydWN0b3JdXCJcbiAgaXNTYWZhcmk6IGZ1bmN0aW9uIGlzU2FmYXJpKCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93LkhUTUxFbGVtZW50KS5pbmRleE9mKCdDb25zdHJ1Y3RvcicpID4gMCB8fCBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignc2FmYXJpJykgIT09IC0xO1xuICB9LFxuICAvLyBJT1MgQ2hyb21lXG4gIGlzSU9TQ2hyb21lOiBmdW5jdGlvbiBpc0lPU0Nocm9tZSgpIHtcbiAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2NyaW9zJykgIT09IC0xO1xuICB9XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChCcm93c2VyKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9mdW5jdGlvbnMuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGFkZFdyYXBwZXIsIGNhcGl0YWxpemVQcmludCwgY29sbGVjdFN0eWxlcywgYWRkSGVhZGVyLCBjbGVhblVwLCBpc1Jhd0hUTUwgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkV3JhcHBlclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFkZFdyYXBwZXI7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImNhcGl0YWxpemVQcmludFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGNhcGl0YWxpemVQcmludDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiY29sbGVjdFN0eWxlc1wiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGNvbGxlY3RTdHlsZXM7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZEhlYWRlclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFkZEhlYWRlcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiY2xlYW5VcFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGNsZWFuVXA7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzUmF3SFRNTFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGlzUmF3SFRNTDsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX21vZGFsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL21vZGFsICovIFwiLi9zcmMvanMvbW9kYWwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYnJvd3NlciAqLyBcIi4vc3JjL2pzL2Jyb3dzZXIuanNcIik7XG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG5mdW5jdGlvbiBhZGRXcmFwcGVyKGh0bWxEYXRhLCBwYXJhbXMpIHtcbiAgdmFyIGJvZHlTdHlsZSA9ICdmb250LWZhbWlseTonICsgcGFyYW1zLmZvbnQgKyAnICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogJyArIHBhcmFtcy5mb250X3NpemUgKyAnICFpbXBvcnRhbnQ7IHdpZHRoOjEwMCU7JztcbiAgcmV0dXJuICc8ZGl2IHN0eWxlPVwiJyArIGJvZHlTdHlsZSArICdcIj4nICsgaHRtbERhdGEgKyAnPC9kaXY+Jztcbn1cbmZ1bmN0aW9uIGNhcGl0YWxpemVQcmludChvYmopIHtcbiAgcmV0dXJuIG9iai5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG9iai5zbGljZSgxKTtcbn1cbmZ1bmN0aW9uIGNvbGxlY3RTdHlsZXMoZWxlbWVudCwgcGFyYW1zKSB7XG4gIHZhciB3aW4gPSBkb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IC8vIFN0cmluZyB2YXJpYWJsZSB0byBob2xkIHN0eWxpbmcgZm9yIGVhY2ggZWxlbWVudFxuXG4gIHZhciBlbGVtZW50U3R5bGUgPSAnJzsgLy8gTG9vcCBvdmVyIGNvbXB1dGVkIHN0eWxlc1xuXG4gIHZhciBzdHlsZXMgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCAnJyk7XG5cbiAgZm9yICh2YXIga2V5ID0gMDsga2V5IDwgc3R5bGVzLmxlbmd0aDsga2V5KyspIHtcbiAgICAvLyBDaGVjayBpZiBzdHlsZSBzaG91bGQgYmUgcHJvY2Vzc2VkXG4gICAgaWYgKHBhcmFtcy50YXJnZXRTdHlsZXMuaW5kZXhPZignKicpICE9PSAtMSB8fCBwYXJhbXMudGFyZ2V0U3R5bGUuaW5kZXhPZihzdHlsZXNba2V5XSkgIT09IC0xIHx8IHRhcmdldFN0eWxlc01hdGNoKHBhcmFtcy50YXJnZXRTdHlsZXMsIHN0eWxlc1trZXldKSkge1xuICAgICAgaWYgKHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlc1trZXldKSkgZWxlbWVudFN0eWxlICs9IHN0eWxlc1trZXldICsgJzonICsgc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGVzW2tleV0pICsgJzsnO1xuICAgIH1cbiAgfSAvLyBQcmludCBmcmllbmRseSBkZWZhdWx0cyAoZGVwcmVjYXRlZClcblxuXG4gIGVsZW1lbnRTdHlsZSArPSAnbWF4LXdpZHRoOiAnICsgcGFyYW1zLm1heFdpZHRoICsgJ3B4ICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogJyArIHBhcmFtcy5mb250X3NpemUgKyAnICFpbXBvcnRhbnQ7JztcbiAgcmV0dXJuIGVsZW1lbnRTdHlsZTtcbn1cblxuZnVuY3Rpb24gdGFyZ2V0U3R5bGVzTWF0Y2goc3R5bGVzLCB2YWx1ZSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuaW5kZXhPZihzdHlsZXNbaV0pICE9PSAtMSkgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFkZEhlYWRlcihwcmludEVsZW1lbnQsIHBhcmFtcykge1xuICAvLyBDcmVhdGUgdGhlIGhlYWRlciBjb250YWluZXIgZGl2XG4gIHZhciBoZWFkZXJDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gQ2hlY2sgaWYgdGhlIGhlYWRlciBpcyB0ZXh0IG9yIHJhdyBodG1sXG5cbiAgaWYgKGlzUmF3SFRNTChwYXJhbXMuaGVhZGVyKSkge1xuICAgIGhlYWRlckNvbnRhaW5lci5pbm5lckhUTUwgPSBwYXJhbXMuaGVhZGVyO1xuICB9IGVsc2Uge1xuICAgIC8vIENyZWF0ZSBoZWFkZXIgZWxlbWVudFxuICAgIHZhciBoZWFkZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDEnKTsgLy8gQ3JlYXRlIGhlYWRlciB0ZXh0IG5vZGVcblxuICAgIHZhciBoZWFkZXJOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFyYW1zLmhlYWRlcik7IC8vIEJ1aWxkIGFuZCBzdHlsZVxuXG4gICAgaGVhZGVyRWxlbWVudC5hcHBlbmRDaGlsZChoZWFkZXJOb2RlKTtcbiAgICBoZWFkZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBwYXJhbXMuaGVhZGVyU3R5bGUpO1xuICAgIGhlYWRlckNvbnRhaW5lci5hcHBlbmRDaGlsZChoZWFkZXJFbGVtZW50KTtcbiAgfVxuXG4gIHByaW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaGVhZGVyQ29udGFpbmVyLCBwcmludEVsZW1lbnQuY2hpbGROb2Rlc1swXSk7XG59XG5mdW5jdGlvbiBjbGVhblVwKHBhcmFtcykge1xuICAvLyBJZiB3ZSBhcmUgc2hvd2luZyBhIGZlZWRiYWNrIG1lc3NhZ2UgdG8gdXNlciwgcmVtb3ZlIGl0XG4gIGlmIChwYXJhbXMuc2hvd01vZGFsKSBfbW9kYWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uY2xvc2UoKTsgLy8gQ2hlY2sgZm9yIGEgZmluaXNoZWQgbG9hZGluZyBob29rIGZ1bmN0aW9uXG5cbiAgaWYgKHBhcmFtcy5vbkxvYWRpbmdFbmQpIHBhcmFtcy5vbkxvYWRpbmdFbmQoKTsgLy8gSWYgcHJlbG9hZGluZyBwZGYgZmlsZXMsIGNsZWFuIGJsb2IgdXJsXG5cbiAgaWYgKHBhcmFtcy5zaG93TW9kYWwgfHwgcGFyYW1zLm9uTG9hZGluZ1N0YXJ0KSB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTChwYXJhbXMucHJpbnRhYmxlKTsgLy8gUnVuIG9uUHJpbnREaWFsb2dDbG9zZSBjYWxsYmFja1xuXG4gIHZhciBldmVudCA9ICdtb3VzZW92ZXInO1xuXG4gIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5pc0Nocm9tZSgpIHx8IF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLmlzRmlyZWZveCgpKSB7XG4gICAgLy8gUHMuOiBGaXJlZm94IHdpbGwgcmVxdWlyZSBhbiBleHRyYSBjbGljayBpbiB0aGUgZG9jdW1lbnQgdG8gZmlyZSB0aGUgZm9jdXMgZXZlbnQuXG4gICAgZXZlbnQgPSAnZm9jdXMnO1xuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXZlbnQgb25seSBoYXBwZW5zIG9uY2UuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgIHBhcmFtcy5vblByaW50RGlhbG9nQ2xvc2UoKTsgLy8gUmVtb3ZlIGlmcmFtZSBmcm9tIHRoZSBET01cblxuICAgIHZhciBpZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJhbXMuZnJhbWVJZCk7XG5cbiAgICBpZiAoaWZyYW1lKSB7XG4gICAgICBpZnJhbWUucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbn1cbmZ1bmN0aW9uIGlzUmF3SFRNTChyYXcpIHtcbiAgdmFyIHJlZ2V4SHRtbCA9IG5ldyBSZWdFeHAoJzwoW0EtWmEtel1bQS1aYS16MC05XSopXFxcXGJbXj5dKj4oLio/KTwvXFxcXDE+Jyk7XG4gIHJldHVybiByZWdleEh0bWwudGVzdChyYXcpO1xufVxuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9odG1sLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvaHRtbC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9mdW5jdGlvbnMgKi8gXCIuL3NyYy9qcy9mdW5jdGlvbnMuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3ByaW50ICovIFwiLi9zcmMvanMvcHJpbnQuanNcIik7XG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHtcbiAgcHJpbnQ6IGZ1bmN0aW9uIHByaW50KHBhcmFtcywgcHJpbnRGcmFtZSkge1xuICAgIC8vIEdldCB0aGUgRE9NIHByaW50YWJsZSBlbGVtZW50XG4gICAgdmFyIHByaW50RWxlbWVudCA9IGlzSHRtbEVsZW1lbnQocGFyYW1zLnByaW50YWJsZSkgPyBwYXJhbXMucHJpbnRhYmxlIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1zLnByaW50YWJsZSk7IC8vIENoZWNrIGlmIHRoZSBlbGVtZW50IGV4aXN0c1xuXG4gICAgaWYgKCFwcmludEVsZW1lbnQpIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmVycm9yKCdJbnZhbGlkIEhUTUwgZWxlbWVudCBpZDogJyArIHBhcmFtcy5wcmludGFibGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gQ2xvbmUgdGhlIHRhcmdldCBlbGVtZW50IGluY2x1ZGluZyBpdHMgY2hpbGRyZW4gKGlmIGF2YWlsYWJsZSlcblxuXG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQocHJpbnRFbGVtZW50LCBwYXJhbXMpOyAvLyBBZGQgaGVhZGVyXG5cbiAgICBpZiAocGFyYW1zLmhlYWRlcikge1xuICAgICAgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImFkZEhlYWRlclwiXSkocGFyYW1zLnByaW50YWJsZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgfSAvLyBQcmludCBodG1sIGVsZW1lbnQgY29udGVudHNcblxuXG4gICAgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLnNlbmQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBwYXJhbXMpIHtcbiAgLy8gQ2xvbmUgdGhlIG1haW4gbm9kZSAoaWYgbm90IGFscmVhZHkgaW5zaWRlIHRoZSByZWN1cnNpb24gcHJvY2VzcylcbiAgdmFyIGNsb25lID0gZWxlbWVudC5jbG9uZU5vZGUoKTsgLy8gTG9vcCBvdmVyIGFuZCBwcm9jZXNzIHRoZSBjaGlsZHJlbiBlbGVtZW50cyAvIG5vZGVzIChpbmNsdWRpbmcgdGV4dCBub2RlcylcblxuICB2YXIgY2hpbGROb2Rlc0FycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZWxlbWVudC5jaGlsZE5vZGVzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkTm9kZXNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgIC8vIENoZWNrIGlmIHdlIGFyZSBza2lwcGluZyB0aGUgY3VycmVudCBlbGVtZW50XG4gICAgaWYgKHBhcmFtcy5pZ25vcmVFbGVtZW50cy5pbmRleE9mKGNoaWxkTm9kZXNBcnJheVtpXS5pZCkgIT09IC0xKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIENsb25lIHRoZSBjaGlsZCBlbGVtZW50XG5cblxuICAgIHZhciBjbG9uZWRDaGlsZCA9IGNsb25lRWxlbWVudChjaGlsZE5vZGVzQXJyYXlbaV0sIHBhcmFtcyk7IC8vIEF0dGFjaCB0aGUgY2xvbmVkIGNoaWxkIHRvIHRoZSBjbG9uZWQgcGFyZW50IG5vZGVcblxuICAgIGNsb25lLmFwcGVuZENoaWxkKGNsb25lZENoaWxkKTtcbiAgfSAvLyBHZXQgYWxsIHN0eWxpbmcgZm9yIHByaW50IGVsZW1lbnQgKGZvciBub2RlcyBvZiB0eXBlIGVsZW1lbnQgb25seSlcblxuXG4gIGlmIChwYXJhbXMuc2NhblN0eWxlcyAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgY2xvbmUuc2V0QXR0cmlidXRlKCdzdHlsZScsIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJjb2xsZWN0U3R5bGVzXCJdKShlbGVtZW50LCBwYXJhbXMpKTtcbiAgfSAvLyBDaGVjayBpZiB0aGUgZWxlbWVudCBuZWVkcyBhbnkgc3RhdGUgcHJvY2Vzc2luZyAoY29weSB1c2VyIGlucHV0IGRhdGEpXG5cblxuICBzd2l0Y2ggKGVsZW1lbnQudGFnTmFtZSkge1xuICAgIGNhc2UgJ1NFTEVDVCc6XG4gICAgICAvLyBDb3B5IHRoZSBjdXJyZW50IHNlbGVjdGlvbiB2YWx1ZSB0byBpdHMgY2xvbmVcbiAgICAgIGNsb25lLnZhbHVlID0gZWxlbWVudC52YWx1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnQ0FOVkFTJzpcbiAgICAgIC8vIENvcHkgdGhlIGNhbnZhcyBjb250ZW50IHRvIGl0cyBjbG9uZVxuICAgICAgY2xvbmUuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UoZWxlbWVudCwgMCwgMCk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gaXNIdG1sRWxlbWVudChwcmludGFibGUpIHtcbiAgLy8gQ2hlY2sgaWYgZWxlbWVudCBpcyBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCBvciBoYXMgbm9kZVR5cGUgPT09IDEgKGZvciBlbGVtZW50cyBpbiBpZnJhbWUpXG4gIHJldHVybiBfdHlwZW9mKHByaW50YWJsZSkgPT09ICdvYmplY3QnICYmIHByaW50YWJsZSAmJiAocHJpbnRhYmxlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgcHJpbnRhYmxlLm5vZGVUeXBlID09PSAxKTtcbn1cblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvaW1hZ2UuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvaW1hZ2UuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Z1bmN0aW9ucyAqLyBcIi4vc3JjL2pzL2Z1bmN0aW9ucy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJpbnQgKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9icm93c2VyICovIFwiLi9zcmMvanMvYnJvd3Nlci5qc1wiKTtcblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBwcmludDogZnVuY3Rpb24gcHJpbnQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHByaW50aW5nIG9uZSBpbWFnZSBvciBtdWx0aXBsZSBpbWFnZXNcbiAgICBpZiAocGFyYW1zLnByaW50YWJsZS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHtcbiAgICAgIC8vIENyZWF0ZSBhcnJheSB3aXRoIG9uZSBpbWFnZVxuICAgICAgcGFyYW1zLnByaW50YWJsZSA9IFtwYXJhbXMucHJpbnRhYmxlXTtcbiAgICB9IC8vIENyZWF0ZSBwcmludGFibGUgZWxlbWVudCAoY29udGFpbmVyKVxuXG5cbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBDcmVhdGUgYWxsIGltYWdlIGVsZW1lbnRzIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgcHJpbnRhYmxlIGNvbnRhaW5lclxuXG4gICAgcGFyYW1zLnByaW50YWJsZS5mb3JFYWNoKGZ1bmN0aW9uIChzcmMpIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgaW1hZ2UgZWxlbWVudFxuICAgICAgdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgaW1nLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBwYXJhbXMuaW1hZ2VTdHlsZSk7IC8vIFNldCBpbWFnZSBzcmMgd2l0aCB0aGUgZmlsZSB1cmxcblxuICAgICAgaW1nLnNyYyA9IHNyYzsgLy8gVGhlIGZvbGxvd2luZyBibG9jayBpcyBmb3IgRmlyZWZveCwgd2hpY2ggZm9yIHNvbWUgcmVhc29uIHJlcXVpcmVzIHRoZSBpbWFnZSdzIHNyYyB0byBiZSBmdWxseSBxdWFsaWZpZWQgaW5cbiAgICAgIC8vIG9yZGVyIHRvIHByaW50IGl0XG5cbiAgICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fW1wiZGVmYXVsdFwiXS5pc0ZpcmVmb3goKSkge1xuICAgICAgICB2YXIgZnVsbHlRdWFsaWZpZWRTcmMgPSBpbWcuc3JjO1xuICAgICAgICBpbWcuc3JjID0gZnVsbHlRdWFsaWZpZWRTcmM7XG4gICAgICB9IC8vIENyZWF0ZSB0aGUgaW1hZ2Ugd3JhcHBlclxuXG5cbiAgICAgIHZhciBpbWFnZVdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gQXBwZW5kIGltYWdlIHRvIHRoZSB3cmFwcGVyIGVsZW1lbnRcblxuICAgICAgaW1hZ2VXcmFwcGVyLmFwcGVuZENoaWxkKGltZyk7IC8vIEFwcGVuZCB3cmFwcGVyIHRvIHRoZSBwcmludGFibGUgZWxlbWVudFxuXG4gICAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudC5hcHBlbmRDaGlsZChpbWFnZVdyYXBwZXIpO1xuICAgIH0pOyAvLyBDaGVjayBpZiB3ZSBhcmUgYWRkaW5nIGEgcHJpbnQgaGVhZGVyXG5cbiAgICBpZiAocGFyYW1zLmhlYWRlcikgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImFkZEhlYWRlclwiXSkocGFyYW1zLnByaW50YWJsZUVsZW1lbnQsIHBhcmFtcyk7IC8vIFByaW50IGltYWdlXG5cbiAgICBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uc2VuZChwYXJhbXMsIHByaW50RnJhbWUpO1xuICB9XG59KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvaW5pdC5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL2luaXQuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Jyb3dzZXIgKi8gXCIuL3NyYy9qcy9icm93c2VyLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9tb2RhbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tb2RhbCAqLyBcIi4vc3JjL2pzL21vZGFsLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9wZGZfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcGRmICovIFwiLi9zcmMvanMvcGRmLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9odG1sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2h0bWwgKi8gXCIuL3NyYy9qcy9odG1sLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9yYXdfaHRtbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9yYXctaHRtbCAqLyBcIi4vc3JjL2pzL3Jhdy1odG1sLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9pbWFnZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9pbWFnZSAqLyBcIi4vc3JjL2pzL2ltYWdlLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9qc29uX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2pzb24gKi8gXCIuL3NyYy9qcy9qc29uLmpzXCIpO1xuXG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuXG5cblxuXG5cblxuXG52YXIgcHJpbnRUeXBlcyA9IFsncGRmJywgJ2h0bWwnLCAnaW1hZ2UnLCAnanNvbicsICdyYXctaHRtbCddO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgIHByaW50YWJsZTogbnVsbCxcbiAgICAgIGZhbGxiYWNrUHJpbnRhYmxlOiBudWxsLFxuICAgICAgdHlwZTogJ3BkZicsXG4gICAgICBoZWFkZXI6IG51bGwsXG4gICAgICBoZWFkZXJTdHlsZTogJ2ZvbnQtd2VpZ2h0OiAzMDA7JyxcbiAgICAgIG1heFdpZHRoOiA4MDAsXG4gICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgZ3JpZEhlYWRlclN0eWxlOiAnZm9udC13ZWlnaHQ6IGJvbGQ7IHBhZGRpbmc6IDVweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsnLFxuICAgICAgZ3JpZFN0eWxlOiAnYm9yZGVyOiAxcHggc29saWQgbGlnaHRncmF5OyBtYXJnaW4tYm90dG9tOiAtMXB4OycsXG4gICAgICBzaG93TW9kYWw6IGZhbHNlLFxuICAgICAgb25FcnJvcjogZnVuY3Rpb24gb25FcnJvcihlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRpbmdTdGFydDogbnVsbCxcbiAgICAgIG9uTG9hZGluZ0VuZDogbnVsbCxcbiAgICAgIG9uUHJpbnREaWFsb2dDbG9zZTogZnVuY3Rpb24gb25QcmludERpYWxvZ0Nsb3NlKCkge30sXG4gICAgICBvbkluY29tcGF0aWJsZUJyb3dzZXI6IGZ1bmN0aW9uIG9uSW5jb21wYXRpYmxlQnJvd3NlcigpIHt9LFxuICAgICAgbW9kYWxNZXNzYWdlOiAnUmV0cmlldmluZyBEb2N1bWVudC4uLicsXG4gICAgICBmcmFtZUlkOiAncHJpbnRKUycsXG4gICAgICBwcmludGFibGVFbGVtZW50OiBudWxsLFxuICAgICAgZG9jdW1lbnRUaXRsZTogJ0RvY3VtZW50JyxcbiAgICAgIHRhcmdldFN0eWxlOiBbJ2NsZWFyJywgJ2Rpc3BsYXknLCAnd2lkdGgnLCAnbWluLXdpZHRoJywgJ2hlaWdodCcsICdtaW4taGVpZ2h0JywgJ21heC1oZWlnaHQnXSxcbiAgICAgIHRhcmdldFN0eWxlczogWydib3JkZXInLCAnYm94JywgJ2JyZWFrJywgJ3RleHQtZGVjb3JhdGlvbiddLFxuICAgICAgaWdub3JlRWxlbWVudHM6IFtdLFxuICAgICAgcmVwZWF0VGFibGVIZWFkZXI6IHRydWUsXG4gICAgICBjc3M6IG51bGwsXG4gICAgICBzdHlsZTogbnVsbCxcbiAgICAgIHNjYW5TdHlsZXM6IHRydWUsXG4gICAgICBiYXNlNjQ6IGZhbHNlLFxuICAgICAgLy8gRGVwcmVjYXRlZFxuICAgICAgb25QZGZPcGVuOiBudWxsLFxuICAgICAgZm9udDogJ1RpbWVzTmV3Um9tYW4nLFxuICAgICAgZm9udF9zaXplOiAnMTJwdCcsXG4gICAgICBob25vck1hcmdpblBhZGRpbmc6IHRydWUsXG4gICAgICBob25vckNvbG9yOiBmYWxzZSxcbiAgICAgIGltYWdlU3R5bGU6ICdtYXgtd2lkdGg6IDEwMCU7J1xuICAgIH07IC8vIENoZWNrIGlmIGEgcHJpbnRhYmxlIGRvY3VtZW50IG9yIG9iamVjdCB3YXMgc3VwcGxpZWRcblxuICAgIHZhciBhcmdzID0gYXJndW1lbnRzWzBdO1xuXG4gICAgaWYgKGFyZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcmludEpTIGV4cGVjdHMgYXQgbGVhc3QgMSBhdHRyaWJ1dGUuJyk7XG4gICAgfSAvLyBQcm9jZXNzIHBhcmFtZXRlcnNcblxuXG4gICAgc3dpdGNoIChfdHlwZW9mKGFyZ3MpKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICBwYXJhbXMucHJpbnRhYmxlID0gZW5jb2RlVVJJKGFyZ3MpO1xuICAgICAgICBwYXJhbXMuZmFsbGJhY2tQcmludGFibGUgPSBwYXJhbXMucHJpbnRhYmxlO1xuICAgICAgICBwYXJhbXMudHlwZSA9IGFyZ3VtZW50c1sxXSB8fCBwYXJhbXMudHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHBhcmFtcy5wcmludGFibGUgPSBhcmdzLnByaW50YWJsZTtcbiAgICAgICAgcGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlID0gdHlwZW9mIGFyZ3MuZmFsbGJhY2tQcmludGFibGUgIT09ICd1bmRlZmluZWQnID8gYXJncy5mYWxsYmFja1ByaW50YWJsZSA6IHBhcmFtcy5wcmludGFibGU7XG4gICAgICAgIHBhcmFtcy5mYWxsYmFja1ByaW50YWJsZSA9IHBhcmFtcy5iYXNlNjQgPyBcImRhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCxcIi5jb25jYXQocGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlKSA6IHBhcmFtcy5mYWxsYmFja1ByaW50YWJsZTtcblxuICAgICAgICBmb3IgKHZhciBrIGluIHBhcmFtcykge1xuICAgICAgICAgIGlmIChrID09PSAncHJpbnRhYmxlJyB8fCBrID09PSAnZmFsbGJhY2tQcmludGFibGUnKSBjb250aW51ZTtcbiAgICAgICAgICBwYXJhbXNba10gPSB0eXBlb2YgYXJnc1trXSAhPT0gJ3VuZGVmaW5lZCcgPyBhcmdzW2tdIDogcGFyYW1zW2tdO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBhcmd1bWVudCB0eXBlISBFeHBlY3RlZCBcInN0cmluZ1wiIG9yIFwib2JqZWN0XCIsIGdvdCAnICsgX3R5cGVvZihhcmdzKSk7XG4gICAgfSAvLyBWYWxpZGF0ZSBwcmludGFibGVcblxuXG4gICAgaWYgKCFwYXJhbXMucHJpbnRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJpbnRhYmxlIGluZm9ybWF0aW9uLicpOyAvLyBWYWxpZGF0ZSB0eXBlXG5cbiAgICBpZiAoIXBhcmFtcy50eXBlIHx8IHR5cGVvZiBwYXJhbXMudHlwZSAhPT0gJ3N0cmluZycgfHwgcHJpbnRUeXBlcy5pbmRleE9mKHBhcmFtcy50eXBlLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaW50IHR5cGUuIEF2YWlsYWJsZSB0eXBlcyBhcmU6IHBkZiwgaHRtbCwgaW1hZ2UgYW5kIGpzb24uJyk7XG4gICAgfSAvLyBDaGVjayBpZiB3ZSBhcmUgc2hvd2luZyBhIGZlZWRiYWNrIG1lc3NhZ2UgdG8gdGhlIHVzZXIgKHVzZWZ1bCBmb3IgbGFyZ2UgZmlsZXMpXG5cblxuICAgIGlmIChwYXJhbXMuc2hvd01vZGFsKSBfbW9kYWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uc2hvdyhwYXJhbXMpOyAvLyBDaGVjayBmb3IgYSBwcmludCBzdGFydCBob29rIGZ1bmN0aW9uXG5cbiAgICBpZiAocGFyYW1zLm9uTG9hZGluZ1N0YXJ0KSBwYXJhbXMub25Mb2FkaW5nU3RhcnQoKTsgLy8gVG8gcHJldmVudCBkdXBsaWNhdGlvbiBhbmQgaXNzdWVzLCByZW1vdmUgYW55IHVzZWQgcHJpbnRGcmFtZSBmcm9tIHRoZSBET01cblxuICAgIHZhciB1c2VkRnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJhbXMuZnJhbWVJZCk7XG4gICAgaWYgKHVzZWRGcmFtZSkgdXNlZEZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodXNlZEZyYW1lKTsgLy8gQ3JlYXRlIGEgbmV3IGlmcmFtZSBmb3IgdGhlIHByaW50IGpvYlxuXG4gICAgdmFyIHByaW50RnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcblxuICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5pc0ZpcmVmb3goKSkge1xuICAgICAgLy8gU2V0IHRoZSBpZnJhbWUgdG8gYmUgaXMgdmlzaWJsZSBvbiB0aGUgcGFnZSAoZ3VhcmFudGVlZCBieSBmaXhlZCBwb3NpdGlvbikgYnV0IGhpZGRlbiB1c2luZyBvcGFjaXR5IDAsIGJlY2F1c2VcbiAgICAgIC8vIHRoaXMgd29ya3MgaW4gRmlyZWZveC4gVGhlIGhlaWdodCBuZWVkcyB0byBiZSBzdWZmaWNpZW50IGZvciBzb21lIHBhcnQgb2YgdGhlIGRvY3VtZW50IG90aGVyIHRoYW4gdGhlIFBERlxuICAgICAgLy8gdmlld2VyJ3MgdG9vbGJhciB0byBiZSB2aXNpYmxlIGluIHRoZSBwYWdlXG4gICAgICBwcmludEZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6IDFweDsgaGVpZ2h0OiAxMDBweDsgcG9zaXRpb246IGZpeGVkOyBsZWZ0OiAwOyB0b3A6IDA7IG9wYWNpdHk6IDA7IGJvcmRlci13aWR0aDogMDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhpZGUgdGhlIGlmcmFtZSBpbiBvdGhlciBicm93c2Vyc1xuICAgICAgcHJpbnRGcmFtZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3Zpc2liaWxpdHk6IGhpZGRlbjsgaGVpZ2h0OiAwOyB3aWR0aDogMDsgcG9zaXRpb246IGFic29sdXRlOyBib3JkZXI6IDAnKTtcbiAgICB9IC8vIFNldCBpZnJhbWUgZWxlbWVudCBpZFxuXG5cbiAgICBwcmludEZyYW1lLnNldEF0dHJpYnV0ZSgnaWQnLCBwYXJhbXMuZnJhbWVJZCk7IC8vIEZvciBub24gcGRmIHByaW50aW5nLCBwYXNzIGFuIGh0bWwgZG9jdW1lbnQgc3RyaW5nIHRvIHNyY2RvYyAoZm9yY2Ugb25sb2FkIGNhbGxiYWNrKVxuXG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSAncGRmJykge1xuICAgICAgcHJpbnRGcmFtZS5zcmNkb2MgPSAnPGh0bWw+PGhlYWQ+PHRpdGxlPicgKyBwYXJhbXMuZG9jdW1lbnRUaXRsZSArICc8L3RpdGxlPic7IC8vIEF0dGFjaCBjc3MgZmlsZXNcblxuICAgICAgaWYgKHBhcmFtcy5jc3MpIHtcbiAgICAgICAgLy8gQWRkIHN1cHBvcnQgZm9yIHNpbmdsZSBmaWxlXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuY3NzKSkgcGFyYW1zLmNzcyA9IFtwYXJhbXMuY3NzXTsgLy8gQ3JlYXRlIGxpbmsgdGFncyBmb3IgZWFjaCBjc3MgZmlsZVxuXG4gICAgICAgIHBhcmFtcy5jc3MuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICAgIHByaW50RnJhbWUuc3JjZG9jICs9ICc8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIicgKyBmaWxlICsgJ1wiPic7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwcmludEZyYW1lLnNyY2RvYyArPSAnPC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+JztcbiAgICB9IC8vIENoZWNrIHByaW50YWJsZSB0eXBlXG5cblxuICAgIHN3aXRjaCAocGFyYW1zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3BkZic6XG4gICAgICAgIC8vIENoZWNrIGJyb3dzZXIgc3VwcG9ydCBmb3IgcGRmIGFuZCBpZiBub3Qgc3VwcG9ydGVkIHdlIHdpbGwganVzdCBvcGVuIHRoZSBwZGYgZmlsZSBpbnN0ZWFkXG4gICAgICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5pc0lFKCkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdQcmludC5qcyBkb2VzblxcJ3Qgc3VwcG9ydCBQREYgcHJpbnRpbmcgaW4gSW50ZXJuZXQgRXhwbG9yZXIuJyk7XG4gICAgICAgICAgICB2YXIgd2luID0gd2luZG93Lm9wZW4ocGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlLCAnX2JsYW5rJyk7XG4gICAgICAgICAgICB3aW4uZm9jdXMoKTtcbiAgICAgICAgICAgIHBhcmFtcy5vbkluY29tcGF0aWJsZUJyb3dzZXIoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcGFyYW1zLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgbm8gbG9hZGluZyBtb2RhbCBvcGVuZWRcbiAgICAgICAgICAgIGlmIChwYXJhbXMuc2hvd01vZGFsKSBfbW9kYWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uY2xvc2UoKTtcbiAgICAgICAgICAgIGlmIChwYXJhbXMub25Mb2FkaW5nRW5kKSBwYXJhbXMub25Mb2FkaW5nRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9wZGZfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1tcImRlZmF1bHRcIl0ucHJpbnQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgIF9pbWFnZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fW1wiZGVmYXVsdFwiXS5wcmludChwYXJhbXMsIHByaW50RnJhbWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICAgIF9odG1sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bXCJkZWZhdWx0XCJdLnByaW50KHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyYXctaHRtbCc6XG4gICAgICAgIF9yYXdfaHRtbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fW1wiZGVmYXVsdFwiXS5wcmludChwYXJhbXMsIHByaW50RnJhbWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIF9qc29uX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X19bXCJkZWZhdWx0XCJdLnByaW50KHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL2pzb24uanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9qc29uLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Z1bmN0aW9ucyAqLyBcIi4vc3JjL2pzL2Z1bmN0aW9ucy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJpbnQgKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiKTtcbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBwcmludDogZnVuY3Rpb24gcHJpbnQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgcmVjZWl2ZWQgcHJvcGVyIGRhdGFcbiAgICBpZiAoX3R5cGVvZihwYXJhbXMucHJpbnRhYmxlKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBqYXZhc2NyaXB0IGRhdGEgb2JqZWN0IChKU09OKS4nKTtcbiAgICB9IC8vIFZhbGlkYXRlIHJlcGVhdFRhYmxlSGVhZGVyXG5cblxuICAgIGlmICh0eXBlb2YgcGFyYW1zLnJlcGVhdFRhYmxlSGVhZGVyICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgcmVwZWF0VGFibGVIZWFkZXIgYXR0cmlidXRlIChKU09OKS4nKTtcbiAgICB9IC8vIFZhbGlkYXRlIHByb3BlcnRpZXNcblxuXG4gICAgaWYgKCFwYXJhbXMucHJvcGVydGllcyB8fCAhQXJyYXkuaXNBcnJheShwYXJhbXMucHJvcGVydGllcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwcm9wZXJ0aWVzIGFycmF5IGZvciB5b3VyIEpTT04gZGF0YS4nKTtcbiAgICB9IC8vIFdlIHdpbGwgZm9ybWF0IHRoZSBwcm9wZXJ0eSBvYmplY3RzIHRvIGtlZXAgdGhlIEpTT04gYXBpIGNvbXBhdGlibGUgd2l0aCBvbGRlciByZWxlYXNlc1xuXG5cbiAgICBwYXJhbXMucHJvcGVydGllcyA9IHBhcmFtcy5wcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBfdHlwZW9mKHByb3BlcnR5KSA9PT0gJ29iamVjdCcgPyBwcm9wZXJ0eS5maWVsZCA6IHByb3BlcnR5LFxuICAgICAgICBkaXNwbGF5TmFtZTogX3R5cGVvZihwcm9wZXJ0eSkgPT09ICdvYmplY3QnID8gcHJvcGVydHkuZGlzcGxheU5hbWUgOiBwcm9wZXJ0eSxcbiAgICAgICAgY29sdW1uU2l6ZTogX3R5cGVvZihwcm9wZXJ0eSkgPT09ICdvYmplY3QnICYmIHByb3BlcnR5LmNvbHVtblNpemUgPyBwcm9wZXJ0eS5jb2x1bW5TaXplICsgJzsnIDogMTAwIC8gcGFyYW1zLnByb3BlcnRpZXMubGVuZ3RoICsgJyU7J1xuICAgICAgfTtcbiAgICB9KTsgLy8gQ3JlYXRlIGEgcHJpbnQgY29udGFpbmVyIGVsZW1lbnRcblxuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IC8vIENoZWNrIGlmIHdlIGFyZSBhZGRpbmcgYSBwcmludCBoZWFkZXJcblxuICAgIGlmIChwYXJhbXMuaGVhZGVyKSB7XG4gICAgICBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiYWRkSGVhZGVyXCJdKShwYXJhbXMucHJpbnRhYmxlRWxlbWVudCwgcGFyYW1zKTtcbiAgICB9IC8vIEJ1aWxkIHRoZSBwcmludGFibGUgaHRtbCBkYXRhXG5cblxuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50LmlubmVySFRNTCArPSBqc29uVG9IVE1MKHBhcmFtcyk7IC8vIFByaW50IHRoZSBqc29uIGRhdGFcblxuICAgIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5zZW5kKHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBqc29uVG9IVE1MKHBhcmFtcykge1xuICAvLyBHZXQgdGhlIHJvdyBhbmQgY29sdW1uIGRhdGFcbiAgdmFyIGRhdGEgPSBwYXJhbXMucHJpbnRhYmxlO1xuICB2YXIgcHJvcGVydGllcyA9IHBhcmFtcy5wcm9wZXJ0aWVzOyAvLyBDcmVhdGUgYSBodG1sIHRhYmxlXG5cbiAgdmFyIGh0bWxEYXRhID0gJzx0YWJsZSBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiAxMDAlO1wiPic7IC8vIENoZWNrIGlmIHRoZSBoZWFkZXIgc2hvdWxkIGJlIHJlcGVhdGVkXG5cbiAgaWYgKHBhcmFtcy5yZXBlYXRUYWJsZUhlYWRlcikge1xuICAgIGh0bWxEYXRhICs9ICc8dGhlYWQ+JztcbiAgfSAvLyBBZGQgdGhlIHRhYmxlIGhlYWRlciByb3dcblxuXG4gIGh0bWxEYXRhICs9ICc8dHI+JzsgLy8gQWRkIHRoZSB0YWJsZSBoZWFkZXIgY29sdW1uc1xuXG4gIGZvciAodmFyIGEgPSAwOyBhIDwgcHJvcGVydGllcy5sZW5ndGg7IGErKykge1xuICAgIGh0bWxEYXRhICs9ICc8dGggc3R5bGU9XCJ3aWR0aDonICsgcHJvcGVydGllc1thXS5jb2x1bW5TaXplICsgJzsnICsgcGFyYW1zLmdyaWRIZWFkZXJTdHlsZSArICdcIj4nICsgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImNhcGl0YWxpemVQcmludFwiXSkocHJvcGVydGllc1thXS5kaXNwbGF5TmFtZSkgKyAnPC90aD4nO1xuICB9IC8vIEFkZCB0aGUgY2xvc2luZyB0YWcgZm9yIHRoZSB0YWJsZSBoZWFkZXIgcm93XG5cblxuICBodG1sRGF0YSArPSAnPC90cj4nOyAvLyBJZiB0aGUgdGFibGUgaGVhZGVyIGlzIG1hcmtlZCBhcyByZXBlYXRlZCwgYWRkIHRoZSBjbG9zaW5nIHRhZ1xuXG4gIGlmIChwYXJhbXMucmVwZWF0VGFibGVIZWFkZXIpIHtcbiAgICBodG1sRGF0YSArPSAnPC90aGVhZD4nO1xuICB9IC8vIENyZWF0ZSB0aGUgdGFibGUgYm9keVxuXG5cbiAgaHRtbERhdGEgKz0gJzx0Ym9keT4nOyAvLyBBZGQgdGhlIHRhYmxlIGRhdGEgcm93c1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIC8vIEFkZCB0aGUgcm93IHN0YXJ0aW5nIHRhZ1xuICAgIGh0bWxEYXRhICs9ICc8dHI+JzsgLy8gUHJpbnQgc2VsZWN0ZWQgcHJvcGVydGllcyBvbmx5XG5cbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IHByb3BlcnRpZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgIHZhciBzdHJpbmdEYXRhID0gZGF0YVtpXTsgLy8gU3VwcG9ydCBuZXN0ZWQgb2JqZWN0c1xuXG4gICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW25dLmZpZWxkLnNwbGl0KCcuJyk7XG5cbiAgICAgIGlmIChwcm9wZXJ0eS5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgcHJvcGVydHkubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICBzdHJpbmdEYXRhID0gc3RyaW5nRGF0YVtwcm9wZXJ0eVtwXV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmluZ0RhdGEgPSBzdHJpbmdEYXRhW3Byb3BlcnRpZXNbbl0uZmllbGRdO1xuICAgICAgfSAvLyBBZGQgdGhlIHJvdyBjb250ZW50cyBhbmQgc3R5bGVzXG5cblxuICAgICAgaHRtbERhdGEgKz0gJzx0ZCBzdHlsZT1cIndpZHRoOicgKyBwcm9wZXJ0aWVzW25dLmNvbHVtblNpemUgKyBwYXJhbXMuZ3JpZFN0eWxlICsgJ1wiPicgKyBzdHJpbmdEYXRhICsgJzwvdGQ+JztcbiAgICB9IC8vIEFkZCB0aGUgcm93IGNsb3NpbmcgdGFnXG5cblxuICAgIGh0bWxEYXRhICs9ICc8L3RyPic7XG4gIH0gLy8gQWRkIHRoZSB0YWJsZSBhbmQgYm9keSBjbG9zaW5nIHRhZ3NcblxuXG4gIGh0bWxEYXRhICs9ICc8L3Rib2R5PjwvdGFibGU+JztcbiAgcmV0dXJuIGh0bWxEYXRhO1xufVxuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9tb2RhbC5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9tb2RhbC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xudmFyIE1vZGFsID0ge1xuICBzaG93OiBmdW5jdGlvbiBzaG93KHBhcmFtcykge1xuICAgIC8vIEJ1aWxkIG1vZGFsXG4gICAgdmFyIG1vZGFsU3R5bGUgPSAnZm9udC1mYW1pbHk6c2Fucy1zZXJpZjsgJyArICdkaXNwbGF5OnRhYmxlOyAnICsgJ3RleHQtYWxpZ246Y2VudGVyOyAnICsgJ2ZvbnQtd2VpZ2h0OjMwMDsgJyArICdmb250LXNpemU6MzBweDsgJyArICdsZWZ0OjA7IHRvcDowOycgKyAncG9zaXRpb246Zml4ZWQ7ICcgKyAnei1pbmRleDogOTk5MDsnICsgJ2NvbG9yOiAjMDQ2MEI1OyAnICsgJ3dpZHRoOiAxMDAlOyAnICsgJ2hlaWdodDogMTAwJTsgJyArICdiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpOycgKyAndHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTsnOyAvLyBDcmVhdGUgd3JhcHBlclxuXG4gICAgdmFyIHByaW50TW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBwcmludE1vZGFsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBtb2RhbFN0eWxlKTtcbiAgICBwcmludE1vZGFsLnNldEF0dHJpYnV0ZSgnaWQnLCAncHJpbnRKUy1Nb2RhbCcpOyAvLyBDcmVhdGUgY29udGVudCBkaXZcblxuICAgIHZhciBjb250ZW50RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29udGVudERpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyBwYWRkaW5nLWJvdHRvbToxMDBweDsnKTsgLy8gQWRkIGNsb3NlIGJ1dHRvbiAocmVxdWlyZXMgcHJpbnQuY3NzKVxuXG4gICAgdmFyIGNsb3NlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY2xvc2VCdXR0b24uc2V0QXR0cmlidXRlKCdjbGFzcycsICdwcmludENsb3NlJyk7XG4gICAgY2xvc2VCdXR0b24uc2V0QXR0cmlidXRlKCdpZCcsICdwcmludENsb3NlJyk7XG4gICAgY29udGVudERpdi5hcHBlbmRDaGlsZChjbG9zZUJ1dHRvbik7IC8vIEFkZCBzcGlubmVyIChyZXF1aXJlcyBwcmludC5jc3MpXG5cbiAgICB2YXIgc3Bpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBzcGlubmVyLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAncHJpbnRTcGlubmVyJyk7XG4gICAgY29udGVudERpdi5hcHBlbmRDaGlsZChzcGlubmVyKTsgLy8gQWRkIG1lc3NhZ2VcblxuICAgIHZhciBtZXNzYWdlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhcmFtcy5tb2RhbE1lc3NhZ2UpO1xuICAgIGNvbnRlbnREaXYuYXBwZW5kQ2hpbGQobWVzc2FnZU5vZGUpOyAvLyBBZGQgY29udGVudERpdiB0byBwcmludE1vZGFsXG5cbiAgICBwcmludE1vZGFsLmFwcGVuZENoaWxkKGNvbnRlbnREaXYpOyAvLyBBcHBlbmQgcHJpbnQgbW9kYWwgZWxlbWVudCB0byBkb2N1bWVudCBib2R5XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLmFwcGVuZENoaWxkKHByaW50TW9kYWwpOyAvLyBBZGQgZXZlbnQgbGlzdGVuZXIgdG8gY2xvc2UgYnV0dG9uXG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpbnRDbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgTW9kYWwuY2xvc2UoKTtcbiAgICB9KTtcbiAgfSxcbiAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIHZhciBwcmludE1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW50SlMtTW9kYWwnKTtcblxuICAgIGlmIChwcmludE1vZGFsKSB7XG4gICAgICBwcmludE1vZGFsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocHJpbnRNb2RhbCk7XG4gICAgfVxuICB9XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChNb2RhbCk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL3BkZi5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvcGRmLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9wcmludCAqLyBcIi4vc3JjL2pzL3ByaW50LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZnVuY3Rpb25zICovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCIpO1xuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBwcmludDogZnVuY3Rpb24gcHJpbnQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBiYXNlNjQgZGF0YVxuICAgIGlmIChwYXJhbXMuYmFzZTY0KSB7XG4gICAgICB2YXIgYnl0ZXNBcnJheSA9IFVpbnQ4QXJyYXkuZnJvbShhdG9iKHBhcmFtcy5wcmludGFibGUpLCBmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYy5jaGFyQ29kZUF0KDApO1xuICAgICAgfSk7XG4gICAgICBjcmVhdGVCbG9iQW5kUHJpbnQocGFyYW1zLCBwcmludEZyYW1lLCBieXRlc0FycmF5KTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZvcm1hdCBwZGYgdXJsXG5cblxuICAgIHBhcmFtcy5wcmludGFibGUgPSAvXihibG9ifGh0dHB8XFwvXFwvKS9pLnRlc3QocGFyYW1zLnByaW50YWJsZSkgPyBwYXJhbXMucHJpbnRhYmxlIDogd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIChwYXJhbXMucHJpbnRhYmxlLmNoYXJBdCgwKSAhPT0gJy8nID8gJy8nICsgcGFyYW1zLnByaW50YWJsZSA6IHBhcmFtcy5wcmludGFibGUpOyAvLyBHZXQgdGhlIGZpbGUgdGhyb3VnaCBhIGh0dHAgcmVxdWVzdCAoUHJlbG9hZClcblxuICAgIHZhciByZXEgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgcmVxLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImNsZWFuVXBcIl0pKHBhcmFtcyk7XG4gICAgICBwYXJhbXMub25FcnJvcihyZXEuc3RhdHVzVGV4dCwgcmVxKTsgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHBkZiBkb2N1bWVudCBhdmFpbGFibGUsIHdlIHdpbGwgc3RvcCB0aGUgcHJpbnQgam9iXG4gICAgfSk7XG4gICAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBDaGVjayBmb3IgZXJyb3JzXG4gICAgICBpZiAoWzIwMCwgMjAxXS5pbmRleE9mKHJlcS5zdGF0dXMpID09PSAtMSkge1xuICAgICAgICBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiY2xlYW5VcFwiXSkocGFyYW1zKTtcbiAgICAgICAgcGFyYW1zLm9uRXJyb3IocmVxLnN0YXR1c1RleHQsIHJlcSk7IC8vIFNpbmNlIHdlIGRvbid0IGhhdmUgYSBwZGYgZG9jdW1lbnQgYXZhaWxhYmxlLCB3ZSB3aWxsIHN0b3AgdGhlIHByaW50IGpvYlxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gUHJpbnQgcmVxdWVzdGVkIGRvY3VtZW50XG5cblxuICAgICAgY3JlYXRlQmxvYkFuZFByaW50KHBhcmFtcywgcHJpbnRGcmFtZSwgcmVxLnJlc3BvbnNlKTtcbiAgICB9KTtcbiAgICByZXEub3BlbignR0VUJywgcGFyYW1zLnByaW50YWJsZSwgdHJ1ZSk7XG4gICAgcmVxLnNlbmQoKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUJsb2JBbmRQcmludChwYXJhbXMsIHByaW50RnJhbWUsIGRhdGEpIHtcbiAgLy8gUGFzcyByZXNwb25zZSBvciBiYXNlNjQgZGF0YSB0byBhIGJsb2IgYW5kIGNyZWF0ZSBhIGxvY2FsIG9iamVjdCB1cmxcbiAgdmFyIGxvY2FsUGRmID0gbmV3IHdpbmRvdy5CbG9iKFtkYXRhXSwge1xuICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnXG4gIH0pO1xuICBsb2NhbFBkZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGxvY2FsUGRmKTsgLy8gU2V0IGlmcmFtZSBzcmMgd2l0aCBwZGYgZG9jdW1lbnQgdXJsXG5cbiAgcHJpbnRGcmFtZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIGxvY2FsUGRmKTtcbiAgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLnNlbmQocGFyYW1zLCBwcmludEZyYW1lKTtcbn1cblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvcHJpbnQuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvcHJpbnQuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9icm93c2VyICovIFwiLi9zcmMvanMvYnJvd3Nlci5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Z1bmN0aW9ucyAqLyBcIi4vc3JjL2pzL2Z1bmN0aW9ucy5qc1wiKTtcblxuXG52YXIgUHJpbnQgPSB7XG4gIHNlbmQ6IGZ1bmN0aW9uIHNlbmQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gQXBwZW5kIGlmcmFtZSBlbGVtZW50IHRvIGRvY3VtZW50IGJvZHlcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLmFwcGVuZENoaWxkKHByaW50RnJhbWUpOyAvLyBHZXQgaWZyYW1lIGVsZW1lbnRcblxuICAgIHZhciBpZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1zLmZyYW1lSWQpOyAvLyBXYWl0IGZvciBpZnJhbWUgdG8gbG9hZCBhbGwgY29udGVudFxuXG4gICAgaWZyYW1lRWxlbWVudC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdwZGYnKSB7XG4gICAgICAgIC8vIEFkZCBhIGRlbGF5IGZvciBGaXJlZm94LiBJbiBteSB0ZXN0cywgMTAwMG1zIHdhcyBzdWZmaWNpZW50IGJ1dCAxMDBtcyB3YXMgbm90XG4gICAgICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5pc0ZpcmVmb3goKSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1QcmludChpZnJhbWVFbGVtZW50LCBwYXJhbXMpO1xuICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlcmZvcm1QcmludChpZnJhbWVFbGVtZW50LCBwYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBHZXQgaWZyYW1lIGVsZW1lbnQgZG9jdW1lbnRcblxuXG4gICAgICB2YXIgcHJpbnREb2N1bWVudCA9IGlmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdyB8fCBpZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudDtcbiAgICAgIGlmIChwcmludERvY3VtZW50LmRvY3VtZW50KSBwcmludERvY3VtZW50ID0gcHJpbnREb2N1bWVudC5kb2N1bWVudDsgLy8gQXBwZW5kIHByaW50YWJsZSBlbGVtZW50IHRvIHRoZSBpZnJhbWUgYm9keVxuXG4gICAgICBwcmludERvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGFyYW1zLnByaW50YWJsZUVsZW1lbnQpOyAvLyBBZGQgY3VzdG9tIHN0eWxlXG5cbiAgICAgIGlmIChwYXJhbXMudHlwZSAhPT0gJ3BkZicgJiYgcGFyYW1zLnN0eWxlKSB7XG4gICAgICAgIC8vIENyZWF0ZSBzdHlsZSBlbGVtZW50XG4gICAgICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlLmlubmVySFRNTCA9IHBhcmFtcy5zdHlsZTsgLy8gQXBwZW5kIHN0eWxlIGVsZW1lbnQgdG8gaWZyYW1lJ3MgaGVhZFxuXG4gICAgICAgIHByaW50RG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICB9IC8vIElmIHByaW50aW5nIGltYWdlcywgd2FpdCBmb3IgdGhlbSB0byBsb2FkIGluc2lkZSB0aGUgaWZyYW1lXG5cblxuICAgICAgdmFyIGltYWdlcyA9IHByaW50RG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpO1xuXG4gICAgICBpZiAoaW1hZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9hZElmcmFtZUltYWdlcyhBcnJheS5mcm9tKGltYWdlcykpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBwZXJmb3JtUHJpbnQoaWZyYW1lRWxlbWVudCwgcGFyYW1zKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXJmb3JtUHJpbnQoaWZyYW1lRWxlbWVudCwgcGFyYW1zKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG5mdW5jdGlvbiBwZXJmb3JtUHJpbnQoaWZyYW1lRWxlbWVudCwgcGFyYW1zKSB7XG4gIHRyeSB7XG4gICAgaWZyYW1lRWxlbWVudC5mb2N1cygpOyAvLyBJZiBFZGdlIG9yIElFLCB0cnkgY2F0Y2ggd2l0aCBleGVjQ29tbWFuZFxuXG4gICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzRWRnZSgpIHx8IF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzSUUoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50LmV4ZWNDb21tYW5kKCdwcmludCcsIGZhbHNlLCBudWxsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LnByaW50KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyIGJyb3dzZXJzXG4gICAgICBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cucHJpbnQoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcGFyYW1zLm9uRXJyb3IoZXJyb3IpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5pc0ZpcmVmb3goKSkge1xuICAgICAgLy8gTW92ZSB0aGUgaWZyYW1lIGVsZW1lbnQgb2ZmLXNjcmVlbiBhbmQgbWFrZSBpdCBpbnZpc2libGVcbiAgICAgIGlmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgaWZyYW1lRWxlbWVudC5zdHlsZS5sZWZ0ID0gJy0xcHgnO1xuICAgIH1cblxuICAgIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJjbGVhblVwXCJdKShwYXJhbXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxvYWRJZnJhbWVJbWFnZXMoaW1hZ2VzKSB7XG4gIHZhciBwcm9taXNlcyA9IGltYWdlcy5tYXAoZnVuY3Rpb24gKGltYWdlKSB7XG4gICAgaWYgKGltYWdlLnNyYyAmJiBpbWFnZS5zcmMgIT09IHdpbmRvdy5sb2NhdGlvbi5ocmVmKSB7XG4gICAgICByZXR1cm4gbG9hZElmcmFtZUltYWdlKGltYWdlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuXG5mdW5jdGlvbiBsb2FkSWZyYW1lSW1hZ2UoaW1hZ2UpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgdmFyIHBvbGxJbWFnZSA9IGZ1bmN0aW9uIHBvbGxJbWFnZSgpIHtcbiAgICAgICFpbWFnZSB8fCB0eXBlb2YgaW1hZ2UubmF0dXJhbFdpZHRoID09PSAndW5kZWZpbmVkJyB8fCBpbWFnZS5uYXR1cmFsV2lkdGggPT09IDAgfHwgIWltYWdlLmNvbXBsZXRlID8gc2V0VGltZW91dChwb2xsSW1hZ2UsIDUwMCkgOiByZXNvbHZlKCk7XG4gICAgfTtcblxuICAgIHBvbGxJbWFnZSgpO1xuICB9KTtcbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChQcmludCk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL3Jhdy1odG1sLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL3Jhdy1odG1sLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3ByaW50ICovIFwiLi9zcmMvanMvcHJpbnQuanNcIik7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBwcmludDogZnVuY3Rpb24gcHJpbnQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gQ3JlYXRlIHByaW50YWJsZSBlbGVtZW50IChjb250YWluZXIpXG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOjEwMCUnKTsgLy8gU2V0IG91ciByYXcgaHRtbCBhcyB0aGUgcHJpbnRhYmxlIGVsZW1lbnQgaW5uZXIgaHRtbCBjb250ZW50XG5cbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudC5pbm5lckhUTUwgPSBwYXJhbXMucHJpbnRhYmxlOyAvLyBQcmludCBodG1sIGNvbnRlbnRzXG5cbiAgICBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uc2VuZChwYXJhbXMsIHByaW50RnJhbWUpO1xuICB9XG59KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvc2Fzcy9pbmRleC5zY3NzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9zYXNzL2luZGV4LnNjc3MgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMDpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogbXVsdGkgLi9zcmMvaW5kZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3NyYy9pbmRleC5qcyAqL1wiLi9zcmMvaW5kZXguanNcIik7XG5cblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSlbXCJkZWZhdWx0XCJdO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcmludC5tYXAiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG4gIHZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgdmFyIGhhcyA9IHJlcXVpcmUoJy4vbGliL2hhcycpO1xuXG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7IC8qKi8gfVxuICB9O1xufVxuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBnZXRTdGFjaykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcihcbiAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArXG4gICAgICAgICAgICAgICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgJiYgIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICcgK1xuICAgICAgICAgICAgbG9jYXRpb24gKyAnIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAnICsgdHlwZW9mIGVycm9yICsgJy4gJyArXG4gICAgICAgICAgICAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICtcbiAgICAgICAgICAgICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgICB2YXIgc3RhY2sgPSBnZXRTdGFjayA/IGdldFN0YWNrKCkgOiAnJztcblxuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdGYWlsZWQgJyArIGxvY2F0aW9uICsgJyB0eXBlOiAnICsgZXJyb3IubWVzc2FnZSArIChzdGFjayAhPSBudWxsID8gc3RhY2sgOiAnJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVzZXRzIHdhcm5pbmcgY2FjaGUgd2hlbiB0ZXN0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlID0gZnVuY3Rpb24oKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1Byb3BUeXBlcztcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vbGliL2hhcycpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgnLi9jaGVja1Byb3BUeXBlcycpO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICAgKlxuICAgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAgICpcbiAgICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAgICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAgICogICAgICAgLi4uXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gICAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gICAqXG4gICAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAgICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAgICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAgICpcbiAgICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICAgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICAgKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gICAqICAgICB9LFxuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICAgKlxuICAgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAgICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gICAqXG4gICAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAgICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICAgKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICAgKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gICAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgKiAgICAgICAgICApO1xuICAgKiAgICAgICAgfVxuICAgKiAgICAgIH1cbiAgICogICAgfSxcbiAgICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gICAqICB9KTtcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gICAgYmlnaW50OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYmlnaW50JyksXG4gICAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICAgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gICAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gICAgZWxlbWVudFR5cGU6IGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSxcbiAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIsXG4gICAgZXhhY3Q6IGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAqL1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSovXG4gIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gICAgfVxuICB9XG4gIC8qZXNsaW50LWVuYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuXG4gIC8qKlxuICAgKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsXG4gICAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIsIHdlIGRvbid0IHVzZSByZWFsXG4gICAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW1cbiAgICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdFxuICAgKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuXG4gICAqL1xuICBmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuZGF0YSA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YToge307XG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG4gIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cbiAgUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPSAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgICAgaWYgKHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgICAgICAgICAvLyBOZXcgYmVoYXZpb3Igb25seSBmb3IgdXNlcnMgb2YgYHByb3AtdHlwZXNgIHBhY2thZ2VcbiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgJ1VzZSBgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKClgIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAgICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICAgICAgICApO1xuICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE9sZCBiZWhhdmlvciBmb3IgcGVvcGxlIHVzaW5nIFJlYWN0LlByb3BUeXBlc1xuICAgICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldICYmXG4gICAgICAgICAgICAvLyBBdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZSBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIG5vdCBhY3Rpb25hYmxlIGV4Y2VwdCBmb3IgbGliIGF1dGhvcnNcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50IDwgM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgICAnWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gJyArXG4gICAgICAgICAgICAgICdmdW5jdGlvbiBmb3IgdGhlIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgcHJvcCBvbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgK1xuICAgICAgICAgICAgICAnYW5kIHdpbGwgdGhyb3cgaW4gdGhlIHN0YW5kYWxvbmUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgICAnWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAnICtcbiAgICAgICAgICAgICAgJ2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyAnICsgJ2ZvciBkZXRhaWxzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhblxuICAgICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJyksXG4gICAgICAgICAge2V4cGVjdGVkVHlwZTogZXhwZWN0ZWRUeXBlfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBhcnJheS4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycgKyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIVJlYWN0SXMuaXNWYWxpZEVsZW1lbnRUeXBlKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50IHR5cGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICAgIHZhciBleHBlY3RlZENsYXNzTmFtZSA9IGV4cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgYWN0dWFsQ2xhc3NOYW1lICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdpbnN0YW5jZSBvZiBgJyArIGV4cGVjdGVkQ2xhc3NOYW1lICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LCBnb3QgJyArIGFyZ3VtZW50cy5sZW5ndGggKyAnIGFyZ3VtZW50cy4gJyArXG4gICAgICAgICAgICAnQSBjb21tb24gbWlzdGFrZSBpcyB0byB3cml0ZSBvbmVPZih4LCB5LCB6KSBpbnN0ZWFkIG9mIG9uZU9mKFt4LCB5LCB6XSkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMsIGZ1bmN0aW9uIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIFN0cmluZyhwcm9wVmFsdWUpICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBvZiAnICsgdmFsdWVzU3RyaW5nICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIG9iamVjdC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7XG4gICAgICAgIGlmIChoYXMocHJvcFZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVVbmlvblR5cGVDaGVja2VyKGFycmF5T2ZUeXBlQ2hlY2tlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUuIEV4cGVjdGVkIGFuIGFycmF5IG9mIGNoZWNrIGZ1bmN0aW9ucywgYnV0ICcgK1xuICAgICAgICAgICdyZWNlaXZlZCAnICsgZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKGNoZWNrZXIpICsgJyBhdCBpbmRleCAnICsgaSArICcuJ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBleHBlY3RlZFR5cGVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgICB2YXIgY2hlY2tlclJlc3VsdCA9IGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChjaGVja2VyUmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tlclJlc3VsdC5kYXRhICYmIGhhcyhjaGVja2VyUmVzdWx0LmRhdGEsICdleHBlY3RlZFR5cGUnKSkge1xuICAgICAgICAgIGV4cGVjdGVkVHlwZXMucHVzaChjaGVja2VyUmVzdWx0LmRhdGEuZXhwZWN0ZWRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGV4cGVjdGVkVHlwZXNNZXNzYWdlID0gKGV4cGVjdGVkVHlwZXMubGVuZ3RoID4gMCkgPyAnLCBleHBlY3RlZCBvbmUgb2YgdHlwZSBbJyArIGV4cGVjdGVkVHlwZXMuam9pbignLCAnKSArICddJzogJyc7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgJyArIGV4cGVjdGVkVHlwZXNNZXNzYWdlICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghaXNOb2RlKHByb3BzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZhbGlkVmFsaWRhdG9yRXJyb3IoY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwga2V5LCB0eXBlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXkgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGUgKyAnYC4nXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFZhbGlkYXRvckVycm9yKGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIGtleSwgZ2V0UHJlY2lzZVR5cGUoY2hlY2tlcikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWxsIGtleXMgaW4gY2FzZSBzb21lIGFyZSByZXF1aXJlZCBidXQgbWlzc2luZyBmcm9tIHByb3BzLlxuICAgICAgdmFyIGFsbEtleXMgPSBhc3NpZ24oe30sIHByb3BzW3Byb3BOYW1lXSwgc2hhcGVUeXBlcyk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWxsS2V5cykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKGhhcyhzaGFwZVR5cGVzLCBrZXkpICYmIHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGludmFsaWRWYWxpZGF0b3JFcnJvcihjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBrZXksIGdldFByZWNpc2VUeXBlKGNoZWNrZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgICAnSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Aga2V5IGAnICsga2V5ICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJyArXG4gICAgICAgICAgICAnXFxuQmFkIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KHByb3BzW3Byb3BOYW1lXSwgbnVsbCwgJyAgJykgK1xuICAgICAgICAgICAgJ1xcblZhbGlkIGtleXM6ICcgKyBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzaGFwZVR5cGVzKSwgbnVsbCwgJyAgJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gIXByb3BWYWx1ZTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgLy8gTmF0aXZlIFN5bWJvbC5cbiAgICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBmYWxzeSB2YWx1ZSBjYW4ndCBiZSBhIFN5bWJvbFxuICAgIGlmICghcHJvcFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSA9PT0gJ1N5bWJvbCdcbiAgICBpZiAocHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMgd2hpY2ggYXJlIHBvbHlmaWxsZWQuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG4gIGZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkge1xuICAgIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgfVxuICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIE9sZCB3ZWJraXRzIChhdCBsZWFzdCB1bnRpbCBBbmRyb2lkIDQuMCkgcmV0dXJuICdmdW5jdGlvbicgcmF0aGVyIHRoYW5cbiAgICAgIC8vICdvYmplY3QnIGZvciB0eXBlb2YgYSBSZWdFeHAuIFdlJ2xsIG5vcm1hbGl6ZSB0aGlzIGhlcmUgc28gdGhhdCAvYmxhL1xuICAgICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBUaGlzIGhhbmRsZXMgbW9yZSB0eXBlcyB0aGFuIGBnZXRQcm9wVHlwZWAuIE9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gIC8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLlxuICBmdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJycgKyBwcm9wVmFsdWU7XG4gICAgfVxuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiAncmVnZXhwJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHBvc3RmaXhlZCB0byBhIHdhcm5pbmcgYWJvdXQgYW4gaW52YWxpZCB0eXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgXCJ1bmRlZmluZWRcIiBvciBcIm9mIHR5cGUgYXJyYXlcIlxuICBmdW5jdGlvbiBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiAnYW4gJyArIHR5cGU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAncmVnZXhwJzpcbiAgICAgICAgcmV0dXJuICdhICcgKyB0eXBlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QsIGlmIGFueS5cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKHByb3BWYWx1ZSkge1xuICAgIGlmICghcHJvcFZhbHVlLmNvbnN0cnVjdG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgcmV0dXJuIEFOT05ZTU9VUztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbiAgUmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMgPSBjaGVja1Byb3BUeXBlcztcbiAgUmVhY3RQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBjaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZTtcbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoUmVhY3RJcy5pc0VsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgUmVzaXplciB9IGZyb20gJy4vcmVzaXplcic7XG52YXIgREVGQVVMVF9TSVpFID0ge1xuICAgIHdpZHRoOiAnYXV0bycsXG4gICAgaGVpZ2h0OiAnYXV0bycsXG59O1xudmFyIGNsYW1wID0gZnVuY3Rpb24gKG4sIG1pbiwgbWF4KSB7IHJldHVybiBNYXRoLm1heChNYXRoLm1pbihuLCBtYXgpLCBtaW4pOyB9O1xudmFyIHNuYXAgPSBmdW5jdGlvbiAobiwgc2l6ZSkgeyByZXR1cm4gTWF0aC5yb3VuZChuIC8gc2l6ZSkgKiBzaXplOyB9O1xudmFyIGhhc0RpcmVjdGlvbiA9IGZ1bmN0aW9uIChkaXIsIHRhcmdldCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGRpciwgJ2knKS50ZXN0KHRhcmdldCk7XG59O1xuLy8gSU5GTzogSW4gY2FzZSBvZiB3aW5kb3cgaXMgYSBQcm94eSBhbmQgZG9lcyBub3QgcG9yeHkgRXZlbnRzIGNvcnJlY3RseSwgdXNlIGlzVG91Y2hFdmVudCAmIGlzTW91c2VFdmVudCB0byBkaXN0aW5ndWlzaCBldmVudCB0eXBlIGluc3RlYWQgb2YgYGluc3RhbmNlb2ZgLlxudmFyIGlzVG91Y2hFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBCb29sZWFuKGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGgpO1xufTtcbnZhciBpc01vdXNlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gQm9vbGVhbigoZXZlbnQuY2xpZW50WCB8fCBldmVudC5jbGllbnRYID09PSAwKSAmJlxuICAgICAgICAoZXZlbnQuY2xpZW50WSB8fCBldmVudC5jbGllbnRZID09PSAwKSk7XG59O1xudmFyIGZpbmRDbG9zZXN0U25hcCA9IGZ1bmN0aW9uIChuLCBzbmFwQXJyYXksIHNuYXBHYXApIHtcbiAgICBpZiAoc25hcEdhcCA9PT0gdm9pZCAwKSB7IHNuYXBHYXAgPSAwOyB9XG4gICAgdmFyIGNsb3Nlc3RHYXBJbmRleCA9IHNuYXBBcnJheS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIsIGluZGV4KSB7IHJldHVybiAoTWF0aC5hYnMoY3VyciAtIG4pIDwgTWF0aC5hYnMoc25hcEFycmF5W3ByZXZdIC0gbikgPyBpbmRleCA6IHByZXYpOyB9LCAwKTtcbiAgICB2YXIgZ2FwID0gTWF0aC5hYnMoc25hcEFycmF5W2Nsb3Nlc3RHYXBJbmRleF0gLSBuKTtcbiAgICByZXR1cm4gc25hcEdhcCA9PT0gMCB8fCBnYXAgPCBzbmFwR2FwID8gc25hcEFycmF5W2Nsb3Nlc3RHYXBJbmRleF0gOiBuO1xufTtcbnZhciBnZXRTdHJpbmdTaXplID0gZnVuY3Rpb24gKG4pIHtcbiAgICBuID0gbi50b1N0cmluZygpO1xuICAgIGlmIChuID09PSAnYXV0bycpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCdweCcpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAobi5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAobi5lbmRzV2l0aCgndmgnKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG4uZW5kc1dpdGgoJ3Z3JykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCd2bWF4JykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCd2bWluJykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIHJldHVybiBuICsgXCJweFwiO1xufTtcbnZhciBnZXRQaXhlbFNpemUgPSBmdW5jdGlvbiAoc2l6ZSwgcGFyZW50U2l6ZSwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQpIHtcbiAgICBpZiAoc2l6ZSAmJiB0eXBlb2Ygc2l6ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHNpemUuZW5kc1dpdGgoJ3B4JykpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIoc2l6ZS5yZXBsYWNlKCdweCcsICcnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUuZW5kc1dpdGgoJyUnKSkge1xuICAgICAgICAgICAgdmFyIHJhdGlvID0gTnVtYmVyKHNpemUucmVwbGFjZSgnJScsICcnKSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50U2l6ZSAqIHJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplLmVuZHNXaXRoKCd2dycpKSB7XG4gICAgICAgICAgICB2YXIgcmF0aW8gPSBOdW1iZXIoc2l6ZS5yZXBsYWNlKCd2dycsICcnKSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXJXaWR0aCAqIHJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplLmVuZHNXaXRoKCd2aCcpKSB7XG4gICAgICAgICAgICB2YXIgcmF0aW8gPSBOdW1iZXIoc2l6ZS5yZXBsYWNlKCd2aCcsICcnKSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXJIZWlnaHQgKiByYXRpbztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn07XG52YXIgY2FsY3VsYXRlTmV3TWF4ID0gZnVuY3Rpb24gKHBhcmVudFNpemUsIGlubmVyV2lkdGgsIGlubmVySGVpZ2h0LCBtYXhXaWR0aCwgbWF4SGVpZ2h0LCBtaW5XaWR0aCwgbWluSGVpZ2h0KSB7XG4gICAgbWF4V2lkdGggPSBnZXRQaXhlbFNpemUobWF4V2lkdGgsIHBhcmVudFNpemUud2lkdGgsIGlubmVyV2lkdGgsIGlubmVySGVpZ2h0KTtcbiAgICBtYXhIZWlnaHQgPSBnZXRQaXhlbFNpemUobWF4SGVpZ2h0LCBwYXJlbnRTaXplLmhlaWdodCwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQpO1xuICAgIG1pbldpZHRoID0gZ2V0UGl4ZWxTaXplKG1pbldpZHRoLCBwYXJlbnRTaXplLndpZHRoLCBpbm5lcldpZHRoLCBpbm5lckhlaWdodCk7XG4gICAgbWluSGVpZ2h0ID0gZ2V0UGl4ZWxTaXplKG1pbkhlaWdodCwgcGFyZW50U2l6ZS5oZWlnaHQsIGlubmVyV2lkdGgsIGlubmVySGVpZ2h0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBtYXhXaWR0aDogdHlwZW9mIG1heFdpZHRoID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE51bWJlcihtYXhXaWR0aCksXG4gICAgICAgIG1heEhlaWdodDogdHlwZW9mIG1heEhlaWdodCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBOdW1iZXIobWF4SGVpZ2h0KSxcbiAgICAgICAgbWluV2lkdGg6IHR5cGVvZiBtaW5XaWR0aCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBOdW1iZXIobWluV2lkdGgpLFxuICAgICAgICBtaW5IZWlnaHQ6IHR5cGVvZiBtaW5IZWlnaHQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogTnVtYmVyKG1pbkhlaWdodCksXG4gICAgfTtcbn07XG4vKipcbiAqIHRyYW5zZm9ybSBUIHwgW1QsIFRdIHRvIFtULCBUXVxuICogQHBhcmFtIHZhbFxuICogQHJldHVybnNcbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG52YXIgbm9ybWFsaXplVG9QYWlyID0gZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gKEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWwsIHZhbF0pOyB9O1xudmFyIGRlZmluZWRQcm9wcyA9IFtcbiAgICAnYXMnLFxuICAgICdyZWYnLFxuICAgICdzdHlsZScsXG4gICAgJ2NsYXNzTmFtZScsXG4gICAgJ2dyaWQnLFxuICAgICdzbmFwJyxcbiAgICAnYm91bmRzJyxcbiAgICAnYm91bmRzQnlEaXJlY3Rpb24nLFxuICAgICdzaXplJyxcbiAgICAnZGVmYXVsdFNpemUnLFxuICAgICdtaW5XaWR0aCcsXG4gICAgJ21pbkhlaWdodCcsXG4gICAgJ21heFdpZHRoJyxcbiAgICAnbWF4SGVpZ2h0JyxcbiAgICAnbG9ja0FzcGVjdFJhdGlvJyxcbiAgICAnbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCcsXG4gICAgJ2xvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0JyxcbiAgICAnZW5hYmxlJyxcbiAgICAnaGFuZGxlU3R5bGVzJyxcbiAgICAnaGFuZGxlQ2xhc3NlcycsXG4gICAgJ2hhbmRsZVdyYXBwZXJTdHlsZScsXG4gICAgJ2hhbmRsZVdyYXBwZXJDbGFzcycsXG4gICAgJ2NoaWxkcmVuJyxcbiAgICAnb25SZXNpemVTdGFydCcsXG4gICAgJ29uUmVzaXplJyxcbiAgICAnb25SZXNpemVTdG9wJyxcbiAgICAnaGFuZGxlQ29tcG9uZW50JyxcbiAgICAnc2NhbGUnLFxuICAgICdyZXNpemVSYXRpbycsXG4gICAgJ3NuYXBHYXAnLFxuXTtcbi8vIEhBQ0s6IFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjYWxjdWxhdGUgJSBzaXplLlxudmFyIGJhc2VDbGFzc05hbWUgPSAnX19yZXNpemFibGVfYmFzZV9fJztcbnZhciBSZXNpemFibGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlc2l6YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZXNpemFibGUocHJvcHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmF0aW8gPSAxO1xuICAgICAgICBfdGhpcy5yZXNpemFibGUgPSBudWxsO1xuICAgICAgICAvLyBGb3IgcGFyZW50IGJvdW5kYXJ5XG4gICAgICAgIF90aGlzLnBhcmVudExlZnQgPSAwO1xuICAgICAgICBfdGhpcy5wYXJlbnRUb3AgPSAwO1xuICAgICAgICAvLyBGb3IgYm91bmRhcnlcbiAgICAgICAgX3RoaXMucmVzaXphYmxlTGVmdCA9IDA7XG4gICAgICAgIF90aGlzLnJlc2l6YWJsZVJpZ2h0ID0gMDtcbiAgICAgICAgX3RoaXMucmVzaXphYmxlVG9wID0gMDtcbiAgICAgICAgX3RoaXMucmVzaXphYmxlQm90dG9tID0gMDtcbiAgICAgICAgLy8gRm9yIHRhcmdldCBib3VuZGFyeVxuICAgICAgICBfdGhpcy50YXJnZXRMZWZ0ID0gMDtcbiAgICAgICAgX3RoaXMudGFyZ2V0VG9wID0gMDtcbiAgICAgICAgX3RoaXMuYXBwZW5kQmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghX3RoaXMucmVzaXphYmxlIHx8ICFfdGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBfdGhpcy5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMud2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZSgwLCAwKSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmZsZXggPSAnMCAwIDEwMCUnO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGJhc2VDbGFzc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gYmFzZUNsYXNzTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5yZW1vdmVCYXNlID0gZnVuY3Rpb24gKGJhc2UpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBfdGhpcy5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoYmFzZSk7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgICAgICB3aWR0aDogKF9iID0gKF9hID0gX3RoaXMucHJvcHNTaXplKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eud2lkdGgpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICdhdXRvJyxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gKF9jID0gX3RoaXMucHJvcHNTaXplKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnYXV0bycsXG4gICAgICAgICAgICBkaXJlY3Rpb246ICdyaWdodCcsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmFja2dyb3VuZFN0eWxlOiB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsMCwwLDApJyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgICAgIHpJbmRleDogOTk5OSxcbiAgICAgICAgICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmbGV4QmFzaXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMub25SZXNpemVTdGFydCA9IF90aGlzLm9uUmVzaXplU3RhcnQuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uTW91c2VNb3ZlID0gX3RoaXMub25Nb3VzZU1vdmUuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uTW91c2VVcCA9IF90aGlzLm9uTW91c2VVcC5iaW5kKF90aGlzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVzaXphYmxlLnByb3RvdHlwZSwgXCJwYXJlbnROb2RlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNpemFibGUucGFyZW50Tm9kZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNpemFibGUucHJvdG90eXBlLCBcIndpbmRvd1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZS5vd25lckRvY3VtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNpemFibGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNpemFibGUucHJvdG90eXBlLCBcInByb3BzU2l6ZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2l6ZSB8fCB0aGlzLnByb3BzLmRlZmF1bHRTaXplIHx8IERFRkFVTFRfU0laRTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNpemFibGUucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IDA7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6YWJsZSAmJiB0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgICAgIHZhciBvcmdXaWR0aCA9IHRoaXMucmVzaXphYmxlLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgIHZhciBvcmdIZWlnaHQgPSB0aGlzLnJlc2l6YWJsZS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgLy8gSEFDSzogU2V0IHBvc2l0aW9uIGByZWxhdGl2ZWAgdG8gZ2V0IHBhcmVudCBzaXplLlxuICAgICAgICAgICAgICAgIC8vICAgICAgIFRoaXMgaXMgYmVjYXVzZSB3aGVuIHJlLXJlc2l6YWJsZSBzZXQgYGFic29sdXRlYCwgSSBjYW4gbm90IGdldCBiYXNlIHdpZHRoIGNvcnJlY3RseS5cbiAgICAgICAgICAgICAgICB2YXIgb3JnUG9zaXRpb24gPSB0aGlzLnJlc2l6YWJsZS5zdHlsZS5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAob3JnUG9zaXRpb24gIT09ICdyZWxhdGl2ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemFibGUuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJTkZPOiBVc2Ugb3JpZ2luYWwgd2lkdGggb3IgaGVpZ2h0IGlmIHNldCBhdXRvLlxuICAgICAgICAgICAgICAgIHdpZHRoID0gdGhpcy5yZXNpemFibGUuc3R5bGUud2lkdGggIT09ICdhdXRvJyA/IHRoaXMucmVzaXphYmxlLm9mZnNldFdpZHRoIDogb3JnV2lkdGg7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5yZXNpemFibGUuc3R5bGUuaGVpZ2h0ICE9PSAnYXV0bycgPyB0aGlzLnJlc2l6YWJsZS5vZmZzZXRIZWlnaHQgOiBvcmdIZWlnaHQ7XG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXphYmxlLnN0eWxlLnBvc2l0aW9uID0gb3JnUG9zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVzaXphYmxlLnByb3RvdHlwZSwgXCJzaXplU3R5bGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZTtcbiAgICAgICAgICAgIHZhciBnZXRTaXplID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIF90aGlzLnN0YXRlW2tleV0gPT09ICd1bmRlZmluZWQnIHx8IF90aGlzLnN0YXRlW2tleV0gPT09ICdhdXRvJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2F1dG8nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMucHJvcHNTaXplICYmIF90aGlzLnByb3BzU2l6ZVtrZXldICYmICgoX2EgPSBfdGhpcy5wcm9wc1NpemVba2V5XSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkuZW5kc1dpdGgoJyUnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLnN0YXRlW2tleV0udG9TdHJpbmcoKS5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGVba2V5XS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTaXplID0gX3RoaXMuZ2V0UGFyZW50U2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBOdW1iZXIoX3RoaXMuc3RhdGVba2V5XS50b1N0cmluZygpLnJlcGxhY2UoJ3B4JywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAodmFsdWUgLyBwYXJlbnRTaXplW2tleV0pICogMTAwO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGVyY2VudCArIFwiJVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3RyaW5nU2l6ZShfdGhpcy5zdGF0ZVtrZXldKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgd2lkdGggPSBzaXplICYmIHR5cGVvZiBzaXplLndpZHRoICE9PSAndW5kZWZpbmVkJyAmJiAhdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nXG4gICAgICAgICAgICAgICAgPyBnZXRTdHJpbmdTaXplKHNpemUud2lkdGgpXG4gICAgICAgICAgICAgICAgOiBnZXRTaXplKCd3aWR0aCcpO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHNpemUgJiYgdHlwZW9mIHNpemUuaGVpZ2h0ICE9PSAndW5kZWZpbmVkJyAmJiAhdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nXG4gICAgICAgICAgICAgICAgPyBnZXRTdHJpbmdTaXplKHNpemUuaGVpZ2h0KVxuICAgICAgICAgICAgICAgIDogZ2V0U2l6ZSgnaGVpZ2h0Jyk7XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmdldFBhcmVudFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2luZG93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHRoaXMud2luZG93LmlubmVyV2lkdGgsIGhlaWdodDogdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmFzZSA9IHRoaXMuYXBwZW5kQmFzZSgpO1xuICAgICAgICBpZiAoIWJhc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJTkZPOiBUbyBjYWxjdWxhdGUgcGFyZW50IHdpZHRoIHdpdGggZmxleCBsYXlvdXRcbiAgICAgICAgdmFyIHdyYXBDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHZhciB3cmFwID0gdGhpcy5wYXJlbnROb2RlLnN0eWxlLmZsZXhXcmFwO1xuICAgICAgICBpZiAod3JhcCAhPT0gJ3dyYXAnKSB7XG4gICAgICAgICAgICB3cmFwQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUuc3R5bGUuZmxleFdyYXAgPSAnd3JhcCc7XG4gICAgICAgICAgICAvLyBIQUNLOiBVc2UgcmVsYXRpdmUgdG8gZ2V0IHBhcmVudCBwYWRkaW5nIHNpemVcbiAgICAgICAgfVxuICAgICAgICBiYXNlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgYmFzZS5zdHlsZS5taW5XaWR0aCA9ICcxMDAlJztcbiAgICAgICAgYmFzZS5zdHlsZS5taW5IZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgIHZhciBzaXplID0ge1xuICAgICAgICAgICAgd2lkdGg6IGJhc2Uub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGJhc2Uub2Zmc2V0SGVpZ2h0LFxuICAgICAgICB9O1xuICAgICAgICBpZiAod3JhcENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5zdHlsZS5mbGV4V3JhcCA9IHdyYXA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVCYXNlKGJhc2UpO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMud2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSwge1xuICAgICAgICAgICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLnVuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMud2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSB8fCAhdGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IHRoaXMud2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5yZXNpemFibGUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnN0YXRlLndpZHRoIHx8IHRoaXMuc2l6ZS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5zdGF0ZS5oZWlnaHQgfHwgdGhpcy5zaXplLmhlaWdodCxcbiAgICAgICAgICAgIGZsZXhCYXNpczogY29tcHV0ZWRTdHlsZS5mbGV4QmFzaXMgIT09ICdhdXRvJyA/IGNvbXB1dGVkU3R5bGUuZmxleEJhc2lzIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgdGhpcy51bmJpbmRFdmVudHMoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jcmVhdGVTaXplRm9yQ3NzUHJvcGVydHkgPSBmdW5jdGlvbiAobmV3U2l6ZSwga2luZCkge1xuICAgICAgICB2YXIgcHJvcHNTaXplID0gdGhpcy5wcm9wc1NpemUgJiYgdGhpcy5wcm9wc1NpemVba2luZF07XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlW2tpbmRdID09PSAnYXV0bycgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUub3JpZ2luYWxba2luZF0gPT09IG5ld1NpemUgJiZcbiAgICAgICAgICAgICh0eXBlb2YgcHJvcHNTaXplID09PSAndW5kZWZpbmVkJyB8fCBwcm9wc1NpemUgPT09ICdhdXRvJylcbiAgICAgICAgICAgID8gJ2F1dG8nXG4gICAgICAgICAgICA6IG5ld1NpemU7XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmNhbGN1bGF0ZU5ld01heEZyb21Cb3VuZGFyeSA9IGZ1bmN0aW9uIChtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBib3VuZHNCeURpcmVjdGlvbiA9IHRoaXMucHJvcHMuYm91bmRzQnlEaXJlY3Rpb247XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSB0aGlzLnN0YXRlLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIHdpZHRoQnlEaXJlY3Rpb24gPSBib3VuZHNCeURpcmVjdGlvbiAmJiBoYXNEaXJlY3Rpb24oJ2xlZnQnLCBkaXJlY3Rpb24pO1xuICAgICAgICB2YXIgaGVpZ2h0QnlEaXJlY3Rpb24gPSBib3VuZHNCeURpcmVjdGlvbiAmJiBoYXNEaXJlY3Rpb24oJ3RvcCcsIGRpcmVjdGlvbik7XG4gICAgICAgIHZhciBib3VuZFdpZHRoO1xuICAgICAgICB2YXIgYm91bmRIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRfMSkge1xuICAgICAgICAgICAgICAgIGJvdW5kV2lkdGggPSB3aWR0aEJ5RGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZXNpemFibGVSaWdodCAtIHRoaXMucGFyZW50TGVmdFxuICAgICAgICAgICAgICAgICAgICA6IHBhcmVudF8xLm9mZnNldFdpZHRoICsgKHRoaXMucGFyZW50TGVmdCAtIHRoaXMucmVzaXphYmxlTGVmdCk7XG4gICAgICAgICAgICAgICAgYm91bmRIZWlnaHQgPSBoZWlnaHRCeURpcmVjdGlvblxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucmVzaXphYmxlQm90dG9tIC0gdGhpcy5wYXJlbnRUb3BcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJlbnRfMS5vZmZzZXRIZWlnaHQgKyAodGhpcy5wYXJlbnRUb3AgLSB0aGlzLnJlc2l6YWJsZVRvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgICAgICBib3VuZFdpZHRoID0gd2lkdGhCeURpcmVjdGlvbiA/IHRoaXMucmVzaXphYmxlUmlnaHQgOiB0aGlzLndpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy5yZXNpemFibGVMZWZ0O1xuICAgICAgICAgICAgICAgIGJvdW5kSGVpZ2h0ID0gaGVpZ2h0QnlEaXJlY3Rpb24gPyB0aGlzLnJlc2l6YWJsZUJvdHRvbSA6IHRoaXMud2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5yZXNpemFibGVUb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIGJvdW5kV2lkdGggPSB3aWR0aEJ5RGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgPyB0aGlzLnJlc2l6YWJsZVJpZ2h0IC0gdGhpcy50YXJnZXRMZWZ0XG4gICAgICAgICAgICAgICAgOiB0aGlzLnByb3BzLmJvdW5kcy5vZmZzZXRXaWR0aCArICh0aGlzLnRhcmdldExlZnQgLSB0aGlzLnJlc2l6YWJsZUxlZnQpO1xuICAgICAgICAgICAgYm91bmRIZWlnaHQgPSBoZWlnaHRCeURpcmVjdGlvblxuICAgICAgICAgICAgICAgID8gdGhpcy5yZXNpemFibGVCb3R0b20gLSB0aGlzLnRhcmdldFRvcFxuICAgICAgICAgICAgICAgIDogdGhpcy5wcm9wcy5ib3VuZHMub2Zmc2V0SGVpZ2h0ICsgKHRoaXMudGFyZ2V0VG9wIC0gdGhpcy5yZXNpemFibGVUb3ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChib3VuZFdpZHRoICYmIE51bWJlci5pc0Zpbml0ZShib3VuZFdpZHRoKSkge1xuICAgICAgICAgICAgbWF4V2lkdGggPSBtYXhXaWR0aCAmJiBtYXhXaWR0aCA8IGJvdW5kV2lkdGggPyBtYXhXaWR0aCA6IGJvdW5kV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJvdW5kSGVpZ2h0ICYmIE51bWJlci5pc0Zpbml0ZShib3VuZEhlaWdodCkpIHtcbiAgICAgICAgICAgIG1heEhlaWdodCA9IG1heEhlaWdodCAmJiBtYXhIZWlnaHQgPCBib3VuZEhlaWdodCA/IG1heEhlaWdodCA6IGJvdW5kSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1heFdpZHRoOiBtYXhXaWR0aCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHQgfTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuY2FsY3VsYXRlTmV3U2l6ZUZyb21EaXJlY3Rpb24gPSBmdW5jdGlvbiAoY2xpZW50WCwgY2xpZW50WSkge1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLnByb3BzLnNjYWxlIHx8IDE7XG4gICAgICAgIHZhciBfYSA9IG5vcm1hbGl6ZVRvUGFpcih0aGlzLnByb3BzLnJlc2l6ZVJhdGlvIHx8IDEpLCByZXNpemVSYXRpb1ggPSBfYVswXSwgcmVzaXplUmF0aW9ZID0gX2FbMV07XG4gICAgICAgIHZhciBfYiA9IHRoaXMuc3RhdGUsIGRpcmVjdGlvbiA9IF9iLmRpcmVjdGlvbiwgb3JpZ2luYWwgPSBfYi5vcmlnaW5hbDtcbiAgICAgICAgdmFyIF9jID0gdGhpcy5wcm9wcywgbG9ja0FzcGVjdFJhdGlvID0gX2MubG9ja0FzcGVjdFJhdGlvLCBsb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCA9IF9jLmxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0LCBsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoID0gX2MubG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aDtcbiAgICAgICAgdmFyIG5ld1dpZHRoID0gb3JpZ2luYWwud2lkdGg7XG4gICAgICAgIHZhciBuZXdIZWlnaHQgPSBvcmlnaW5hbC5oZWlnaHQ7XG4gICAgICAgIHZhciBleHRyYUhlaWdodCA9IGxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0IHx8IDA7XG4gICAgICAgIHZhciBleHRyYVdpZHRoID0gbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCB8fCAwO1xuICAgICAgICBpZiAoaGFzRGlyZWN0aW9uKCdyaWdodCcsIGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gb3JpZ2luYWwud2lkdGggKyAoKGNsaWVudFggLSBvcmlnaW5hbC54KSAqIHJlc2l6ZVJhdGlvWCkgLyBzY2FsZTtcbiAgICAgICAgICAgIGlmIChsb2NrQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSAobmV3V2lkdGggLSBleHRyYVdpZHRoKSAvIHRoaXMucmF0aW8gKyBleHRyYUhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzRGlyZWN0aW9uKCdsZWZ0JywgZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgbmV3V2lkdGggPSBvcmlnaW5hbC53aWR0aCAtICgoY2xpZW50WCAtIG9yaWdpbmFsLngpICogcmVzaXplUmF0aW9YKSAvIHNjYWxlO1xuICAgICAgICAgICAgaWYgKGxvY2tBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IChuZXdXaWR0aCAtIGV4dHJhV2lkdGgpIC8gdGhpcy5yYXRpbyArIGV4dHJhSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNEaXJlY3Rpb24oJ2JvdHRvbScsIGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IG9yaWdpbmFsLmhlaWdodCArICgoY2xpZW50WSAtIG9yaWdpbmFsLnkpICogcmVzaXplUmF0aW9ZKSAvIHNjYWxlO1xuICAgICAgICAgICAgaWYgKGxvY2tBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gKG5ld0hlaWdodCAtIGV4dHJhSGVpZ2h0KSAqIHRoaXMucmF0aW8gKyBleHRyYVdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNEaXJlY3Rpb24oJ3RvcCcsIGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IG9yaWdpbmFsLmhlaWdodCAtICgoY2xpZW50WSAtIG9yaWdpbmFsLnkpICogcmVzaXplUmF0aW9ZKSAvIHNjYWxlO1xuICAgICAgICAgICAgaWYgKGxvY2tBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gKG5ld0hlaWdodCAtIGV4dHJhSGVpZ2h0KSAqIHRoaXMucmF0aW8gKyBleHRyYVdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5ld1dpZHRoOiBuZXdXaWR0aCwgbmV3SGVpZ2h0OiBuZXdIZWlnaHQgfTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuY2FsY3VsYXRlTmV3U2l6ZUZyb21Bc3BlY3RSYXRpbyA9IGZ1bmN0aW9uIChuZXdXaWR0aCwgbmV3SGVpZ2h0LCBtYXgsIG1pbikge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBsb2NrQXNwZWN0UmF0aW8gPSBfYS5sb2NrQXNwZWN0UmF0aW8sIGxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0ID0gX2EubG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQsIGxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGggPSBfYS5sb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoO1xuICAgICAgICB2YXIgY29tcHV0ZWRNaW5XaWR0aCA9IHR5cGVvZiBtaW4ud2lkdGggPT09ICd1bmRlZmluZWQnID8gMTAgOiBtaW4ud2lkdGg7XG4gICAgICAgIHZhciBjb21wdXRlZE1heFdpZHRoID0gdHlwZW9mIG1heC53aWR0aCA9PT0gJ3VuZGVmaW5lZCcgfHwgbWF4LndpZHRoIDwgMCA/IG5ld1dpZHRoIDogbWF4LndpZHRoO1xuICAgICAgICB2YXIgY29tcHV0ZWRNaW5IZWlnaHQgPSB0eXBlb2YgbWluLmhlaWdodCA9PT0gJ3VuZGVmaW5lZCcgPyAxMCA6IG1pbi5oZWlnaHQ7XG4gICAgICAgIHZhciBjb21wdXRlZE1heEhlaWdodCA9IHR5cGVvZiBtYXguaGVpZ2h0ID09PSAndW5kZWZpbmVkJyB8fCBtYXguaGVpZ2h0IDwgMCA/IG5ld0hlaWdodCA6IG1heC5oZWlnaHQ7XG4gICAgICAgIHZhciBleHRyYUhlaWdodCA9IGxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0IHx8IDA7XG4gICAgICAgIHZhciBleHRyYVdpZHRoID0gbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCB8fCAwO1xuICAgICAgICBpZiAobG9ja0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICB2YXIgZXh0cmFNaW5XaWR0aCA9IChjb21wdXRlZE1pbkhlaWdodCAtIGV4dHJhSGVpZ2h0KSAqIHRoaXMucmF0aW8gKyBleHRyYVdpZHRoO1xuICAgICAgICAgICAgdmFyIGV4dHJhTWF4V2lkdGggPSAoY29tcHV0ZWRNYXhIZWlnaHQgLSBleHRyYUhlaWdodCkgKiB0aGlzLnJhdGlvICsgZXh0cmFXaWR0aDtcbiAgICAgICAgICAgIHZhciBleHRyYU1pbkhlaWdodCA9IChjb21wdXRlZE1pbldpZHRoIC0gZXh0cmFXaWR0aCkgLyB0aGlzLnJhdGlvICsgZXh0cmFIZWlnaHQ7XG4gICAgICAgICAgICB2YXIgZXh0cmFNYXhIZWlnaHQgPSAoY29tcHV0ZWRNYXhXaWR0aCAtIGV4dHJhV2lkdGgpIC8gdGhpcy5yYXRpbyArIGV4dHJhSGVpZ2h0O1xuICAgICAgICAgICAgdmFyIGxvY2tlZE1pbldpZHRoID0gTWF0aC5tYXgoY29tcHV0ZWRNaW5XaWR0aCwgZXh0cmFNaW5XaWR0aCk7XG4gICAgICAgICAgICB2YXIgbG9ja2VkTWF4V2lkdGggPSBNYXRoLm1pbihjb21wdXRlZE1heFdpZHRoLCBleHRyYU1heFdpZHRoKTtcbiAgICAgICAgICAgIHZhciBsb2NrZWRNaW5IZWlnaHQgPSBNYXRoLm1heChjb21wdXRlZE1pbkhlaWdodCwgZXh0cmFNaW5IZWlnaHQpO1xuICAgICAgICAgICAgdmFyIGxvY2tlZE1heEhlaWdodCA9IE1hdGgubWluKGNvbXB1dGVkTWF4SGVpZ2h0LCBleHRyYU1heEhlaWdodCk7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IGNsYW1wKG5ld1dpZHRoLCBsb2NrZWRNaW5XaWR0aCwgbG9ja2VkTWF4V2lkdGgpO1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gY2xhbXAobmV3SGVpZ2h0LCBsb2NrZWRNaW5IZWlnaHQsIGxvY2tlZE1heEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IGNsYW1wKG5ld1dpZHRoLCBjb21wdXRlZE1pbldpZHRoLCBjb21wdXRlZE1heFdpZHRoKTtcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IGNsYW1wKG5ld0hlaWdodCwgY29tcHV0ZWRNaW5IZWlnaHQsIGNvbXB1dGVkTWF4SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuZXdXaWR0aDogbmV3V2lkdGgsIG5ld0hlaWdodDogbmV3SGVpZ2h0IH07XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLnNldEJvdW5kaW5nQ2xpZW50UmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gRm9yIHBhcmVudCBib3VuZGFyeVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09ICdwYXJlbnQnKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzIgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAocGFyZW50XzIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50UmVjdCA9IHBhcmVudF8yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TGVmdCA9IHBhcmVudFJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFRvcCA9IHBhcmVudFJlY3QudG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZvciB0YXJnZXQoaHRtbCBlbGVtZW50KSBib3VuZGFyeVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMgJiYgdHlwZW9mIHRoaXMucHJvcHMuYm91bmRzICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIHRhcmdldFJlY3QgPSB0aGlzLnByb3BzLmJvdW5kcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0TGVmdCA9IHRhcmdldFJlY3QubGVmdDtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0VG9wID0gdGFyZ2V0UmVjdC50b3A7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIGJvdW5kYXJ5XG4gICAgICAgIGlmICh0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5yZXNpemFibGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGxlZnQgPSBfYS5sZWZ0LCB0b3BfMSA9IF9hLnRvcCwgcmlnaHQgPSBfYS5yaWdodCwgYm90dG9tID0gX2EuYm90dG9tO1xuICAgICAgICAgICAgdGhpcy5yZXNpemFibGVMZWZ0ID0gbGVmdDtcbiAgICAgICAgICAgIHRoaXMucmVzaXphYmxlUmlnaHQgPSByaWdodDtcbiAgICAgICAgICAgIHRoaXMucmVzaXphYmxlVG9wID0gdG9wXzE7XG4gICAgICAgICAgICB0aGlzLnJlc2l6YWJsZUJvdHRvbSA9IGJvdHRvbTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5vblJlc2l6ZVN0YXJ0ID0gZnVuY3Rpb24gKGV2ZW50LCBkaXJlY3Rpb24pIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSB8fCAhdGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2xpZW50WCA9IDA7XG4gICAgICAgIHZhciBjbGllbnRZID0gMDtcbiAgICAgICAgaWYgKGV2ZW50Lm5hdGl2ZUV2ZW50ICYmIGlzTW91c2VFdmVudChldmVudC5uYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgIGNsaWVudFggPSBldmVudC5uYXRpdmVFdmVudC5jbGllbnRYO1xuICAgICAgICAgICAgY2xpZW50WSA9IGV2ZW50Lm5hdGl2ZUV2ZW50LmNsaWVudFk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnQubmF0aXZlRXZlbnQgJiYgaXNUb3VjaEV2ZW50KGV2ZW50Lm5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAgICAgY2xpZW50WCA9IGV2ZW50Lm5hdGl2ZUV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgICAgICAgIGNsaWVudFkgPSBldmVudC5uYXRpdmVFdmVudC50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25SZXNpemVTdGFydCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0UmVzaXplID0gdGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KGV2ZW50LCBkaXJlY3Rpb24sIHRoaXMucmVzaXphYmxlKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRSZXNpemUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRml4ICMxNjhcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2l6ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNpemUuaGVpZ2h0ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnByb3BzLnNpemUuaGVpZ2h0ICE9PSB0aGlzLnN0YXRlLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBoZWlnaHQ6IHRoaXMucHJvcHMuc2l6ZS5oZWlnaHQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuc2l6ZS53aWR0aCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wcm9wcy5zaXplLndpZHRoICE9PSB0aGlzLnN0YXRlLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHdpZHRoOiB0aGlzLnByb3BzLnNpemUud2lkdGggfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIGxvY2tBc3BlY3RSYXRpbyBjYXNlXG4gICAgICAgIHRoaXMucmF0aW8gPVxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvID09PSAnbnVtYmVyJyA/IHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvIDogdGhpcy5zaXplLndpZHRoIC8gdGhpcy5zaXplLmhlaWdodDtcbiAgICAgICAgdmFyIGZsZXhCYXNpcztcbiAgICAgICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB0aGlzLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMucmVzaXphYmxlKTtcbiAgICAgICAgaWYgKGNvbXB1dGVkU3R5bGUuZmxleEJhc2lzICE9PSAnYXV0bycpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMyA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRfMykge1xuICAgICAgICAgICAgICAgIHZhciBkaXIgPSB0aGlzLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudF8zKS5mbGV4RGlyZWN0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuZmxleERpciA9IGRpci5zdGFydHNXaXRoKCdyb3cnKSA/ICdyb3cnIDogJ2NvbHVtbic7XG4gICAgICAgICAgICAgICAgZmxleEJhc2lzID0gY29tcHV0ZWRTdHlsZS5mbGV4QmFzaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIGJvdW5kYXJ5XG4gICAgICAgIHRoaXMuc2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICB2YXIgc3RhdGUgPSB7XG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICAgIHg6IGNsaWVudFgsXG4gICAgICAgICAgICAgICAgeTogY2xpZW50WSxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5zaXplLndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5zaXplLmhlaWdodCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1Jlc2l6aW5nOiB0cnVlLFxuICAgICAgICAgICAgYmFja2dyb3VuZFN0eWxlOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5zdGF0ZS5iYWNrZ3JvdW5kU3R5bGUpLCB7IGN1cnNvcjogdGhpcy53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShldmVudC50YXJnZXQpLmN1cnNvciB8fCAnYXV0bycgfSksXG4gICAgICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgICAgICAgIGZsZXhCYXNpczogZmxleEJhc2lzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNldFN0YXRlKHN0YXRlKTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUub25Nb3VzZU1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmlzUmVzaXppbmcgfHwgIXRoaXMucmVzaXphYmxlIHx8ICF0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndpbmRvdy5Ub3VjaEV2ZW50ICYmIGlzVG91Y2hFdmVudChldmVudCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIG9uIGZhaWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBtYXhXaWR0aCA9IF9hLm1heFdpZHRoLCBtYXhIZWlnaHQgPSBfYS5tYXhIZWlnaHQsIG1pbldpZHRoID0gX2EubWluV2lkdGgsIG1pbkhlaWdodCA9IF9hLm1pbkhlaWdodDtcbiAgICAgICAgdmFyIGNsaWVudFggPSBpc1RvdWNoRXZlbnQoZXZlbnQpID8gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIDogZXZlbnQuY2xpZW50WDtcbiAgICAgICAgdmFyIGNsaWVudFkgPSBpc1RvdWNoRXZlbnQoZXZlbnQpID8gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZIDogZXZlbnQuY2xpZW50WTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5zdGF0ZSwgZGlyZWN0aW9uID0gX2IuZGlyZWN0aW9uLCBvcmlnaW5hbCA9IF9iLm9yaWdpbmFsLCB3aWR0aCA9IF9iLndpZHRoLCBoZWlnaHQgPSBfYi5oZWlnaHQ7XG4gICAgICAgIHZhciBwYXJlbnRTaXplID0gdGhpcy5nZXRQYXJlbnRTaXplKCk7XG4gICAgICAgIHZhciBtYXggPSBjYWxjdWxhdGVOZXdNYXgocGFyZW50U2l6ZSwgdGhpcy53aW5kb3cuaW5uZXJXaWR0aCwgdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQsIG1pbldpZHRoLCBtaW5IZWlnaHQpO1xuICAgICAgICBtYXhXaWR0aCA9IG1heC5tYXhXaWR0aDtcbiAgICAgICAgbWF4SGVpZ2h0ID0gbWF4Lm1heEhlaWdodDtcbiAgICAgICAgbWluV2lkdGggPSBtYXgubWluV2lkdGg7XG4gICAgICAgIG1pbkhlaWdodCA9IG1heC5taW5IZWlnaHQ7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgc2l6ZVxuICAgICAgICB2YXIgX2MgPSB0aGlzLmNhbGN1bGF0ZU5ld1NpemVGcm9tRGlyZWN0aW9uKGNsaWVudFgsIGNsaWVudFkpLCBuZXdIZWlnaHQgPSBfYy5uZXdIZWlnaHQsIG5ld1dpZHRoID0gX2MubmV3V2lkdGg7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBtYXggc2l6ZSBmcm9tIGJvdW5kYXJ5IHNldHRpbmdzXG4gICAgICAgIHZhciBib3VuZGFyeU1heCA9IHRoaXMuY2FsY3VsYXRlTmV3TWF4RnJvbUJvdW5kYXJ5KG1heFdpZHRoLCBtYXhIZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5zbmFwICYmIHRoaXMucHJvcHMuc25hcC54KSB7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IGZpbmRDbG9zZXN0U25hcChuZXdXaWR0aCwgdGhpcy5wcm9wcy5zbmFwLngsIHRoaXMucHJvcHMuc25hcEdhcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc25hcCAmJiB0aGlzLnByb3BzLnNuYXAueSkge1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gZmluZENsb3Nlc3RTbmFwKG5ld0hlaWdodCwgdGhpcy5wcm9wcy5zbmFwLnksIHRoaXMucHJvcHMuc25hcEdhcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzaXplIGZyb20gYXNwZWN0IHJhdGlvXG4gICAgICAgIHZhciBuZXdTaXplID0gdGhpcy5jYWxjdWxhdGVOZXdTaXplRnJvbUFzcGVjdFJhdGlvKG5ld1dpZHRoLCBuZXdIZWlnaHQsIHsgd2lkdGg6IGJvdW5kYXJ5TWF4Lm1heFdpZHRoLCBoZWlnaHQ6IGJvdW5kYXJ5TWF4Lm1heEhlaWdodCB9LCB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSk7XG4gICAgICAgIG5ld1dpZHRoID0gbmV3U2l6ZS5uZXdXaWR0aDtcbiAgICAgICAgbmV3SGVpZ2h0ID0gbmV3U2l6ZS5uZXdIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmdyaWQpIHtcbiAgICAgICAgICAgIHZhciBuZXdHcmlkV2lkdGggPSBzbmFwKG5ld1dpZHRoLCB0aGlzLnByb3BzLmdyaWRbMF0pO1xuICAgICAgICAgICAgdmFyIG5ld0dyaWRIZWlnaHQgPSBzbmFwKG5ld0hlaWdodCwgdGhpcy5wcm9wcy5ncmlkWzFdKTtcbiAgICAgICAgICAgIHZhciBnYXAgPSB0aGlzLnByb3BzLnNuYXBHYXAgfHwgMDtcbiAgICAgICAgICAgIHZhciB3ID0gZ2FwID09PSAwIHx8IE1hdGguYWJzKG5ld0dyaWRXaWR0aCAtIG5ld1dpZHRoKSA8PSBnYXAgPyBuZXdHcmlkV2lkdGggOiBuZXdXaWR0aDtcbiAgICAgICAgICAgIHZhciBoID0gZ2FwID09PSAwIHx8IE1hdGguYWJzKG5ld0dyaWRIZWlnaHQgLSBuZXdIZWlnaHQpIDw9IGdhcCA/IG5ld0dyaWRIZWlnaHQgOiBuZXdIZWlnaHQ7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IHc7XG4gICAgICAgICAgICBuZXdIZWlnaHQgPSBoO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWx0YSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBuZXdXaWR0aCAtIG9yaWdpbmFsLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHQgLSBvcmlnaW5hbC5oZWlnaHQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh3aWR0aCAmJiB0eXBlb2Ygd2lkdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAod2lkdGguZW5kc1dpdGgoJyUnKSkge1xuICAgICAgICAgICAgICAgIHZhciBwZXJjZW50ID0gKG5ld1dpZHRoIC8gcGFyZW50U2l6ZS53aWR0aCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBwZXJjZW50ICsgXCIlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3aWR0aC5lbmRzV2l0aCgndncnKSkge1xuICAgICAgICAgICAgICAgIHZhciB2dyA9IChuZXdXaWR0aCAvIHRoaXMud2luZG93LmlubmVyV2lkdGgpICogMTAwO1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gdncgKyBcInZ3XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3aWR0aC5lbmRzV2l0aCgndmgnKSkge1xuICAgICAgICAgICAgICAgIHZhciB2aCA9IChuZXdXaWR0aCAvIHRoaXMud2luZG93LmlubmVySGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHZoICsgXCJ2aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoZWlnaHQgJiYgdHlwZW9mIGhlaWdodCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChoZWlnaHQuZW5kc1dpdGgoJyUnKSkge1xuICAgICAgICAgICAgICAgIHZhciBwZXJjZW50ID0gKG5ld0hlaWdodCAvIHBhcmVudFNpemUuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBwZXJjZW50ICsgXCIlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoZWlnaHQuZW5kc1dpdGgoJ3Z3JykpIHtcbiAgICAgICAgICAgICAgICB2YXIgdncgPSAobmV3SGVpZ2h0IC8gdGhpcy53aW5kb3cuaW5uZXJXaWR0aCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gdncgKyBcInZ3XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoZWlnaHQuZW5kc1dpdGgoJ3ZoJykpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmggPSAobmV3SGVpZ2h0IC8gdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQpICogMTAwO1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IHZoICsgXCJ2aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLmNyZWF0ZVNpemVGb3JDc3NQcm9wZXJ0eShuZXdXaWR0aCwgJ3dpZHRoJyksXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuY3JlYXRlU2l6ZUZvckNzc1Byb3BlcnR5KG5ld0hlaWdodCwgJ2hlaWdodCcpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5mbGV4RGlyID09PSAncm93Jykge1xuICAgICAgICAgICAgbmV3U3RhdGUuZmxleEJhc2lzID0gbmV3U3RhdGUud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mbGV4RGlyID09PSAnY29sdW1uJykge1xuICAgICAgICAgICAgbmV3U3RhdGUuZmxleEJhc2lzID0gbmV3U3RhdGUuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHZhciB3aWR0aENoYW5nZWQgPSB0aGlzLnN0YXRlLndpZHRoICE9PSBuZXdTdGF0ZS53aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodENoYW5nZWQgPSB0aGlzLnN0YXRlLmhlaWdodCAhPT0gbmV3U3RhdGUuaGVpZ2h0O1xuICAgICAgICB2YXIgZmxleEJhc2VDaGFuZ2VkID0gdGhpcy5zdGF0ZS5mbGV4QmFzaXMgIT09IG5ld1N0YXRlLmZsZXhCYXNpcztcbiAgICAgICAgdmFyIGNoYW5nZWQgPSB3aWR0aENoYW5nZWQgfHwgaGVpZ2h0Q2hhbmdlZCB8fCBmbGV4QmFzZUNoYW5nZWQ7XG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAvLyBGb3IgdjE4LCB1cGRhdGUgc3RhdGUgc3luY1xuICAgICAgICAgICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblJlc2l6ZSkge1xuICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uUmVzaXplKGV2ZW50LCBkaXJlY3Rpb24sIHRoaXMucmVzaXphYmxlLCBkZWx0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUub25Nb3VzZVVwID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBfYyA9IHRoaXMuc3RhdGUsIGlzUmVzaXppbmcgPSBfYy5pc1Jlc2l6aW5nLCBkaXJlY3Rpb24gPSBfYy5kaXJlY3Rpb24sIG9yaWdpbmFsID0gX2Mub3JpZ2luYWw7XG4gICAgICAgIGlmICghaXNSZXNpemluZyB8fCAhdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsdGEgPSB7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy5zaXplLndpZHRoIC0gb3JpZ2luYWwud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuc2l6ZS5oZWlnaHQgLSBvcmlnaW5hbC5oZWlnaHQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uUmVzaXplU3RvcCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vblJlc2l6ZVN0b3AoZXZlbnQsIGRpcmVjdGlvbiwgdGhpcy5yZXNpemFibGUsIGRlbHRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaXplKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgd2lkdGg6IChfYSA9IHRoaXMucHJvcHMuc2l6ZS53aWR0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJ2F1dG8nLCBoZWlnaHQ6IChfYiA9IHRoaXMucHJvcHMuc2l6ZS5oZWlnaHQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICdhdXRvJyB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzUmVzaXppbmc6IGZhbHNlLFxuICAgICAgICAgICAgYmFja2dyb3VuZFN0eWxlOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5zdGF0ZS5iYWNrZ3JvdW5kU3R5bGUpLCB7IGN1cnNvcjogJ2F1dG8nIH0pLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUudXBkYXRlU2l6ZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB3aWR0aDogKF9hID0gc2l6ZS53aWR0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJ2F1dG8nLCBoZWlnaHQ6IChfYiA9IHNpemUuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnYXV0bycgfSk7XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLnJlbmRlclJlc2l6ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIGVuYWJsZSA9IF9hLmVuYWJsZSwgaGFuZGxlU3R5bGVzID0gX2EuaGFuZGxlU3R5bGVzLCBoYW5kbGVDbGFzc2VzID0gX2EuaGFuZGxlQ2xhc3NlcywgaGFuZGxlV3JhcHBlclN0eWxlID0gX2EuaGFuZGxlV3JhcHBlclN0eWxlLCBoYW5kbGVXcmFwcGVyQ2xhc3MgPSBfYS5oYW5kbGVXcmFwcGVyQ2xhc3MsIGhhbmRsZUNvbXBvbmVudCA9IF9hLmhhbmRsZUNvbXBvbmVudDtcbiAgICAgICAgaWYgKCFlbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXNpemVycyA9IE9iamVjdC5rZXlzKGVuYWJsZSkubWFwKGZ1bmN0aW9uIChkaXIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVbZGlyXSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplciwgeyBrZXk6IGRpciwgZGlyZWN0aW9uOiBkaXIsIG9uUmVzaXplU3RhcnQ6IF90aGlzLm9uUmVzaXplU3RhcnQsIHJlcGxhY2VTdHlsZXM6IGhhbmRsZVN0eWxlcyAmJiBoYW5kbGVTdHlsZXNbZGlyXSwgY2xhc3NOYW1lOiBoYW5kbGVDbGFzc2VzICYmIGhhbmRsZUNsYXNzZXNbZGlyXSB9LCBoYW5kbGVDb21wb25lbnQgJiYgaGFuZGxlQ29tcG9uZW50W2Rpcl0gPyBoYW5kbGVDb21wb25lbnRbZGlyXSA6IG51bGwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gIzkzIFdyYXAgdGhlIHJlc2l6ZSBib3ggaW4gc3BhbiAod2lsbCBub3QgYnJlYWsgMTAwJSB3aWR0aC9oZWlnaHQpXG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogaGFuZGxlV3JhcHBlckNsYXNzLCBzdHlsZTogaGFuZGxlV3JhcHBlclN0eWxlIH0sIHJlc2l6ZXJzKSk7XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGV4dGVuZHNQcm9wcyA9IE9iamVjdC5rZXlzKHRoaXMucHJvcHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgICAgIGlmIChkZWZpbmVkUHJvcHMuaW5kZXhPZihrZXkpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2Nba2V5XSA9IF90aGlzLnByb3BzW2tleV07XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHZhciBzdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHsgcG9zaXRpb246ICdyZWxhdGl2ZScsIHVzZXJTZWxlY3Q6IHRoaXMuc3RhdGUuaXNSZXNpemluZyA/ICdub25lJyA6ICdhdXRvJyB9LCB0aGlzLnByb3BzLnN0eWxlKSwgdGhpcy5zaXplU3R5bGUpLCB7IG1heFdpZHRoOiB0aGlzLnByb3BzLm1heFdpZHRoLCBtYXhIZWlnaHQ6IHRoaXMucHJvcHMubWF4SGVpZ2h0LCBtaW5XaWR0aDogdGhpcy5wcm9wcy5taW5XaWR0aCwgbWluSGVpZ2h0OiB0aGlzLnByb3BzLm1pbkhlaWdodCwgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsIGZsZXhTaHJpbms6IDAgfSk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmZsZXhCYXNpcykge1xuICAgICAgICAgICAgc3R5bGUuZmxleEJhc2lzID0gdGhpcy5zdGF0ZS5mbGV4QmFzaXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIFdyYXBwZXIgPSB0aGlzLnByb3BzLmFzIHx8ICdkaXYnO1xuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlciwgX19hc3NpZ24oeyBzdHlsZTogc3R5bGUsIGNsYXNzTmFtZTogdGhpcy5wcm9wcy5jbGFzc05hbWUgfSwgZXh0ZW5kc1Byb3BzLCB7IFxuICAgICAgICAgICAgLy8gYHJlZmAgaXMgYWZ0ZXIgYGV4dGVuZHNQcm9wc2AgdG8gZW5zdXJlIHRoaXMgb25lIHdpbnMgb3ZlciBhIHZlcnNpb25cbiAgICAgICAgICAgIC8vIHBhc3NlZCBpblxuICAgICAgICAgICAgcmVmOiBmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlc2l6YWJsZSA9IGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB9KSxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuaXNSZXNpemluZyAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgc3R5bGU6IHRoaXMuc3RhdGUuYmFja2dyb3VuZFN0eWxlIH0pLFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgIHRoaXMucmVuZGVyUmVzaXplcigpKSk7XG4gICAgfTtcbiAgICBSZXNpemFibGUuZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBhczogJ2RpdicsXG4gICAgICAgIG9uUmVzaXplU3RhcnQ6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25SZXNpemU6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25SZXNpemVTdG9wOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIGVuYWJsZToge1xuICAgICAgICAgICAgdG9wOiB0cnVlLFxuICAgICAgICAgICAgcmlnaHQ6IHRydWUsXG4gICAgICAgICAgICBib3R0b206IHRydWUsXG4gICAgICAgICAgICBsZWZ0OiB0cnVlLFxuICAgICAgICAgICAgdG9wUmlnaHQ6IHRydWUsXG4gICAgICAgICAgICBib3R0b21SaWdodDogdHJ1ZSxcbiAgICAgICAgICAgIGJvdHRvbUxlZnQ6IHRydWUsXG4gICAgICAgICAgICB0b3BMZWZ0OiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBzdHlsZToge30sXG4gICAgICAgIGdyaWQ6IFsxLCAxXSxcbiAgICAgICAgbG9ja0FzcGVjdFJhdGlvOiBmYWxzZSxcbiAgICAgICAgbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aDogMCxcbiAgICAgICAgbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQ6IDAsXG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgICByZXNpemVSYXRpbzogMSxcbiAgICAgICAgc25hcEdhcDogMCxcbiAgICB9O1xuICAgIHJldHVybiBSZXNpemFibGU7XG59KFJlYWN0LlB1cmVDb21wb25lbnQpKTtcbmV4cG9ydCB7IFJlc2l6YWJsZSB9O1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgcm93U2l6ZUJhc2UgPSB7XG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBoZWlnaHQ6ICcxMHB4JyxcbiAgICB0b3A6ICcwcHgnLFxuICAgIGxlZnQ6ICcwcHgnLFxuICAgIGN1cnNvcjogJ3Jvdy1yZXNpemUnLFxufTtcbnZhciBjb2xTaXplQmFzZSA9IHtcbiAgICB3aWR0aDogJzEwcHgnLFxuICAgIGhlaWdodDogJzEwMCUnLFxuICAgIHRvcDogJzBweCcsXG4gICAgbGVmdDogJzBweCcsXG4gICAgY3Vyc29yOiAnY29sLXJlc2l6ZScsXG59O1xudmFyIGVkZ2VCYXNlID0ge1xuICAgIHdpZHRoOiAnMjBweCcsXG4gICAgaGVpZ2h0OiAnMjBweCcsXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG59O1xudmFyIHN0eWxlcyA9IHtcbiAgICB0b3A6IF9fYXNzaWduKF9fYXNzaWduKHt9LCByb3dTaXplQmFzZSksIHsgdG9wOiAnLTVweCcgfSksXG4gICAgcmlnaHQ6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb2xTaXplQmFzZSksIHsgbGVmdDogdW5kZWZpbmVkLCByaWdodDogJy01cHgnIH0pLFxuICAgIGJvdHRvbTogX19hc3NpZ24oX19hc3NpZ24oe30sIHJvd1NpemVCYXNlKSwgeyB0b3A6IHVuZGVmaW5lZCwgYm90dG9tOiAnLTVweCcgfSksXG4gICAgbGVmdDogX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbFNpemVCYXNlKSwgeyBsZWZ0OiAnLTVweCcgfSksXG4gICAgdG9wUmlnaHQ6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBlZGdlQmFzZSksIHsgcmlnaHQ6ICctMTBweCcsIHRvcDogJy0xMHB4JywgY3Vyc29yOiAnbmUtcmVzaXplJyB9KSxcbiAgICBib3R0b21SaWdodDogX19hc3NpZ24oX19hc3NpZ24oe30sIGVkZ2VCYXNlKSwgeyByaWdodDogJy0xMHB4JywgYm90dG9tOiAnLTEwcHgnLCBjdXJzb3I6ICdzZS1yZXNpemUnIH0pLFxuICAgIGJvdHRvbUxlZnQ6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBlZGdlQmFzZSksIHsgbGVmdDogJy0xMHB4JywgYm90dG9tOiAnLTEwcHgnLCBjdXJzb3I6ICdzdy1yZXNpemUnIH0pLFxuICAgIHRvcExlZnQ6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBlZGdlQmFzZSksIHsgbGVmdDogJy0xMHB4JywgdG9wOiAnLTEwcHgnLCBjdXJzb3I6ICdudy1yZXNpemUnIH0pLFxufTtcbnZhciBSZXNpemVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZXNpemVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlc2l6ZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vbk1vdXNlRG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBfdGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KGUsIF90aGlzLnByb3BzLmRpcmVjdGlvbik7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLm9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBfdGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KGUsIF90aGlzLnByb3BzLmRpcmVjdGlvbik7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVzaXplci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHRoaXMucHJvcHMuY2xhc3NOYW1lIHx8ICcnLCBzdHlsZTogX19hc3NpZ24oX19hc3NpZ24oeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgdXNlclNlbGVjdDogJ25vbmUnIH0sIHN0eWxlc1t0aGlzLnByb3BzLmRpcmVjdGlvbl0pLCAodGhpcy5wcm9wcy5yZXBsYWNlU3R5bGVzIHx8IHt9KSksIG9uTW91c2VEb3duOiB0aGlzLm9uTW91c2VEb3duLCBvblRvdWNoU3RhcnQ6IHRoaXMub25Ub3VjaFN0YXJ0IH0sIHRoaXMucHJvcHMuY2hpbGRyZW4pKTtcbiAgICB9O1xuICAgIHJldHVybiBSZXNpemVyO1xufShSZWFjdC5QdXJlQ29tcG9uZW50KSk7XG5leHBvcnQgeyBSZXNpemVyIH07XG4iLCJpbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZSc7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5JztcbmltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiB3aXRoU2lkZUVmZmVjdChyZWR1Y2VQcm9wc1RvU3RhdGUsIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICh0eXBlb2YgcmVkdWNlUHJvcHNUb1N0YXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlZHVjZVByb3BzVG9TdGF0ZSB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50IHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIHJldHVybiBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAodHlwZW9mIFdyYXBwZWRDb21wb25lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBXcmFwcGVkQ29tcG9uZW50IHRvIGJlIGEgUmVhY3QgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtb3VudGVkSW5zdGFuY2VzID0gW107XG4gICAgdmFyIHN0YXRlO1xuXG4gICAgZnVuY3Rpb24gZW1pdENoYW5nZSgpIHtcbiAgICAgIHN0YXRlID0gcmVkdWNlUHJvcHNUb1N0YXRlKG1vdW50ZWRJbnN0YW5jZXMubWFwKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UucHJvcHM7XG4gICAgICB9KSk7XG4gICAgICBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KHN0YXRlKTtcbiAgICB9XG5cbiAgICB2YXIgU2lkZUVmZmVjdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B1cmVDb21wb25lbnQpIHtcbiAgICAgIF9pbmhlcml0c0xvb3NlKFNpZGVFZmZlY3QsIF9QdXJlQ29tcG9uZW50KTtcblxuICAgICAgZnVuY3Rpb24gU2lkZUVmZmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIF9QdXJlQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IHRvIHVzZSBkaXNwbGF5TmFtZSBvZiB3cmFwcGVkIGNvbXBvbmVudFxuICAgICAgU2lkZUVmZmVjdC5wZWVrID0gZnVuY3Rpb24gcGVlaygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfTtcblxuICAgICAgdmFyIF9wcm90byA9IFNpZGVFZmZlY3QucHJvdG90eXBlO1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgbW91bnRlZEluc3RhbmNlcy5wdXNoKHRoaXMpO1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gbW91bnRlZEluc3RhbmNlcy5pbmRleE9mKHRoaXMpO1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCB0aGlzLnByb3BzKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBTaWRlRWZmZWN0O1xuICAgIH0oUHVyZUNvbXBvbmVudCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoU2lkZUVmZmVjdCwgXCJkaXNwbGF5TmFtZVwiLCBcIlNpZGVFZmZlY3QoXCIgKyBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSArIFwiKVwiKTtcblxuICAgIHJldHVybiBTaWRlRWZmZWN0O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoU2lkZUVmZmVjdDtcbiIsIiFmdW5jdGlvbih0LGUpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcInJlYWN0XCIpKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcInJlYWN0XCJdLGUpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuUmVhY3RDb25mZXR0aT1lKHJlcXVpcmUoXCJyZWFjdFwiKSk6dC5SZWFjdENvbmZldHRpPWUodC5SZWFjdCl9KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcywoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBpPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLG4pLGkubD0hMCxpLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUscil7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIGkgaW4gdCluLmQocixpLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsaSkpO3JldHVybiByfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9Mil9KFtmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9e2xpbmVhcjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSp0L3IrZX0sZWFzZUluUXVhZDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSoodC89cikqdCtlfSxlYXNlT3V0UXVhZDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4tKG4tZSkqKHQvPXIpKih0LTIpK2V9LGVhc2VJbk91dFF1YWQ6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybih0Lz1yLzIpPDE/aS8yKnQqdCtlOi1pLzIqKC0tdCoodC0yKS0xKStlfSxlYXNlSW5DdWJpYzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSoodC89cikqdCp0K2V9LGVhc2VPdXRDdWJpYzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSooKHQ9dC9yLTEpKnQqdCsxKStlfSxlYXNlSW5PdXRDdWJpYzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIvMik8MT9pLzIqdCp0KnQrZTppLzIqKCh0LT0yKSp0KnQrMikrZX0sZWFzZUluUXVhcnQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqKHQvPXIpKnQqdCp0K2V9LGVhc2VPdXRRdWFydDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4tKG4tZSkqKCh0PXQvci0xKSp0KnQqdC0xKStlfSxlYXNlSW5PdXRRdWFydDpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIvMik8MT9pLzIqdCp0KnQqdCtlOi1pLzIqKCh0LT0yKSp0KnQqdC0yKStlfSxlYXNlSW5RdWludDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSoodC89cikqdCp0KnQqdCtlfSxlYXNlT3V0UXVpbnQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqKCh0PXQvci0xKSp0KnQqdCp0KzEpK2V9LGVhc2VJbk91dFF1aW50OmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4odC89ci8yKTwxP2kvMip0KnQqdCp0KnQrZTppLzIqKCh0LT0yKSp0KnQqdCp0KzIpK2V9LGVhc2VJblNpbmU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybi1pKk1hdGguY29zKHQvciooTWF0aC5QSS8yKSkraStlfSxlYXNlT3V0U2luZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSpNYXRoLnNpbih0L3IqKE1hdGguUEkvMikpK2V9LGVhc2VJbk91dFNpbmU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuLShuLWUpLzIqKE1hdGguY29zKE1hdGguUEkqdC9yKS0xKStlfSxlYXNlSW5FeHBvOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiAwPT10P2U6KG4tZSkqTWF0aC5wb3coMiwxMCoodC9yLTEpKStlfSxlYXNlT3V0RXhwbzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuIHQ9PXI/ZStpOmkqKDEtTWF0aC5wb3coMiwtMTAqdC9yKSkrZX0sZWFzZUluT3V0RXhwbzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuIDA9PT10P2U6dD09PXI/ZStpOih0Lz1yLzIpPDE/aS8yKk1hdGgucG93KDIsMTAqKHQtMSkpK2U6aS8yKigyLU1hdGgucG93KDIsLTEwKi0tdCkpK2V9LGVhc2VJbkNpcmM6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuLShuLWUpKihNYXRoLnNxcnQoMS0odC89cikqdCktMSkrZX0sZWFzZU91dENpcmM6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqTWF0aC5zcXJ0KDEtKHQ9dC9yLTEpKnQpK2V9LGVhc2VJbk91dENpcmM6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybih0Lz1yLzIpPDE/LWkvMiooTWF0aC5zcXJ0KDEtdCp0KS0xKStlOmkvMiooTWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpK2V9LGVhc2VJbkVsYXN0aWM6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxhLGM9bi1lO3JldHVybiBhPTEuNzAxNTgsMD09PXQ/ZToxPT0odC89cik/ZStjOigobz0wKXx8KG89LjMqciksKGk9Yyk8TWF0aC5hYnMoYyk/KGk9YyxhPW8vNCk6YT1vLygyKk1hdGguUEkpKk1hdGguYXNpbihjL2kpLC1pKk1hdGgucG93KDIsMTAqKHQtPTEpKSpNYXRoLnNpbigodCpyLWEpKigyKk1hdGguUEkpL28pK2UpfSxlYXNlT3V0RWxhc3RpYzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLGEsYz1uLWU7cmV0dXJuIGE9MS43MDE1OCwwPT09dD9lOjE9PSh0Lz1yKT9lK2M6KChvPTApfHwobz0uMypyKSwoaT1jKTxNYXRoLmFicyhjKT8oaT1jLGE9by80KTphPW8vKDIqTWF0aC5QSSkqTWF0aC5hc2luKGMvaSksaSpNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigodCpyLWEpKigyKk1hdGguUEkpL28pK2MrZSl9LGVhc2VJbk91dEVsYXN0aWM6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxhLGM9bi1lO3JldHVybiBhPTEuNzAxNTgsMD09PXQ/ZToyPT0odC89ci8yKT9lK2M6KChvPTApfHwobz1yKiguMyoxLjUpKSwoaT1jKTxNYXRoLmFicyhjKT8oaT1jLGE9by80KTphPW8vKDIqTWF0aC5QSSkqTWF0aC5hc2luKGMvaSksdDwxP2kqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0KnItYSkqKDIqTWF0aC5QSSkvbykqLS41K2U6aSpNYXRoLnBvdygyLC0xMCoodC09MSkpKk1hdGguc2luKCh0KnItYSkqKDIqTWF0aC5QSSkvbykqLjUrYytlKX0sZWFzZUluQmFjazpmdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB2b2lkIDA9PT1pJiYoaT0xLjcwMTU4KSwobi1lKSoodC89cikqdCooKGkrMSkqdC1pKStlfSxlYXNlT3V0QmFjazpmdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB2b2lkIDA9PT1pJiYoaT0xLjcwMTU4KSwobi1lKSooKHQ9dC9yLTEpKnQqKChpKzEpKnQraSkrMSkrZX0sZWFzZUluT3V0QmFjazpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPW4tZTtyZXR1cm4gdm9pZCAwPT09aSYmKGk9MS43MDE1OCksKHQvPXIvMik8MT9vLzIqKHQqdCooKDErKGkqPTEuNTI1KSkqdC1pKSkrZTpvLzIqKCh0LT0yKSp0KigoMSsoaSo9MS41MjUpKSp0K2kpKzIpK2V9LGVhc2VJbkJvdW5jZTpmdW5jdGlvbih0LGUsbixpKXt2YXIgbz1uLWU7cmV0dXJuIG8tci5lYXNlT3V0Qm91bmNlKGktdCwwLG8saSkrZX0sZWFzZU91dEJvdW5jZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIpPDEvMi43NT9pKig3LjU2MjUqdCp0KStlOnQ8Mi8yLjc1P2kqKDcuNTYyNSoodC09MS41LzIuNzUpKnQrLjc1KStlOnQ8Mi41LzIuNzU/aSooNy41NjI1Kih0LT0yLjI1LzIuNzUpKnQrLjkzNzUpK2U6aSooNy41NjI1Kih0LT0yLjYyNS8yLjc1KSp0Ky45ODQzNzUpK2V9LGVhc2VJbk91dEJvdW5jZTpmdW5jdGlvbih0LGUsbixpKXt2YXIgbz1uLWU7cmV0dXJuIHQ8aS8yPy41KnIuZWFzZUluQm91bmNlKDIqdCwwLG8saSkrZTouNSpyLmVhc2VPdXRCb3VuY2UoMip0LWksMCxvLGkpKy41Km8rZX19O3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMyl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJSZWFjdENvbmZldHRpXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSk7dmFyIHIsaSxvPW4oMCksYT1uLm4obyksYz1uKDEpLHM9bi5uKGMpO2Z1bmN0aW9uIHUodCxlKXtyZXR1cm4gdCtNYXRoLnJhbmRvbSgpKihlLXQpfWZ1bmN0aW9uIGYodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIGgodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fSFmdW5jdGlvbih0KXt0W3QuQ2lyY2xlPTBdPVwiQ2lyY2xlXCIsdFt0LlNxdWFyZT0xXT1cIlNxdWFyZVwiLHRbdC5TdHJpcD0yXT1cIlN0cmlwXCJ9KHJ8fChyPXt9KSksZnVuY3Rpb24odCl7dFt0LlBvc2l0aXZlPTFdPVwiUG9zaXRpdmVcIix0W3QuTmVnYXRpdmU9LTFdPVwiTmVnYXRpdmVcIn0oaXx8KGk9e30pKTt2YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuLHIsbyl7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyx0KSxoKHRoaXMsXCJjb250ZXh0XCIsdm9pZCAwKSxoKHRoaXMsXCJyYWRpdXNcIix2b2lkIDApLGgodGhpcyxcInhcIix2b2lkIDApLGgodGhpcyxcInlcIix2b2lkIDApLGgodGhpcyxcIndcIix2b2lkIDApLGgodGhpcyxcImhcIix2b2lkIDApLGgodGhpcyxcInZ4XCIsdm9pZCAwKSxoKHRoaXMsXCJ2eVwiLHZvaWQgMCksaCh0aGlzLFwic2hhcGVcIix2b2lkIDApLGgodGhpcyxcImFuZ2xlXCIsdm9pZCAwKSxoKHRoaXMsXCJhbmd1bGFyU3BpblwiLHZvaWQgMCksaCh0aGlzLFwiY29sb3JcIix2b2lkIDApLGgodGhpcyxcInJvdGF0ZVlcIix2b2lkIDApLGgodGhpcyxcInJvdGF0aW9uRGlyZWN0aW9uXCIsdm9pZCAwKSxoKHRoaXMsXCJnZXRPcHRpb25zXCIsdm9pZCAwKSx0aGlzLmdldE9wdGlvbnM9bjt2YXIgYSxjLHM9dGhpcy5nZXRPcHRpb25zKCksZj1zLmNvbG9ycyxsPXMuaW5pdGlhbFZlbG9jaXR5WCxwPXMuaW5pdGlhbFZlbG9jaXR5WTt0aGlzLmNvbnRleHQ9ZSx0aGlzLng9cix0aGlzLnk9byx0aGlzLnc9dSg1LDIwKSx0aGlzLmg9dSg1LDIwKSx0aGlzLnJhZGl1cz11KDUsMTApLHRoaXMudng9XCJudW1iZXJcIj09dHlwZW9mIGw/dSgtbCxsKTp1KGwubWluLGwubWF4KSx0aGlzLnZ5PVwibnVtYmVyXCI9PXR5cGVvZiBwP3UoLXAsMCk6dShwLm1pbixwLm1heCksdGhpcy5zaGFwZT0oYT0wLGM9MixNYXRoLmZsb29yKGErTWF0aC5yYW5kb20oKSooYy1hKzEpKSksdGhpcy5hbmdsZT11KDAsMzYwKSpNYXRoLlBJLzE4MCx0aGlzLmFuZ3VsYXJTcGluPXUoLS4yLC4yKSx0aGlzLmNvbG9yPWZbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmYubGVuZ3RoKV0sdGhpcy5yb3RhdGVZPXUoMCwxKSx0aGlzLnJvdGF0aW9uRGlyZWN0aW9uPXUoMCwxKT9pLlBvc2l0aXZlOmkuTmVnYXRpdmV9dmFyIGUsbixvO3JldHVybiBlPXQsKG49W3trZXk6XCJ1cGRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0T3B0aW9ucygpLGU9dC5ncmF2aXR5LG49dC53aW5kLG89dC5mcmljdGlvbixhPXQub3BhY2l0eSxjPXQuZHJhd1NoYXBlO3RoaXMueCs9dGhpcy52eCx0aGlzLnkrPXRoaXMudnksdGhpcy52eSs9ZSx0aGlzLnZ4Kz1uLHRoaXMudngqPW8sdGhpcy52eSo9byx0aGlzLnJvdGF0ZVk+PTEmJnRoaXMucm90YXRpb25EaXJlY3Rpb249PT1pLlBvc2l0aXZlP3RoaXMucm90YXRpb25EaXJlY3Rpb249aS5OZWdhdGl2ZTp0aGlzLnJvdGF0ZVk8PS0xJiZ0aGlzLnJvdGF0aW9uRGlyZWN0aW9uPT09aS5OZWdhdGl2ZSYmKHRoaXMucm90YXRpb25EaXJlY3Rpb249aS5Qb3NpdGl2ZSk7dmFyIHM9LjEqdGhpcy5yb3RhdGlvbkRpcmVjdGlvbjtpZih0aGlzLnJvdGF0ZVkrPXMsdGhpcy5hbmdsZSs9dGhpcy5hbmd1bGFyU3Bpbix0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC50cmFuc2xhdGUodGhpcy54LHRoaXMueSksdGhpcy5jb250ZXh0LnJvdGF0ZSh0aGlzLmFuZ2xlKSx0aGlzLmNvbnRleHQuc2NhbGUoMSx0aGlzLnJvdGF0ZVkpLHRoaXMuY29udGV4dC5yb3RhdGUodGhpcy5hbmdsZSksdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpLHRoaXMuY29udGV4dC5maWxsU3R5bGU9dGhpcy5jb2xvcix0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGU9dGhpcy5jb2xvcix0aGlzLmNvbnRleHQuZ2xvYmFsQWxwaGE9YSx0aGlzLmNvbnRleHQubGluZUNhcD1cInJvdW5kXCIsdGhpcy5jb250ZXh0LmxpbmVXaWR0aD0yLGMmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGMpYy5jYWxsKHRoaXMsdGhpcy5jb250ZXh0KTtlbHNlIHN3aXRjaCh0aGlzLnNoYXBlKXtjYXNlIHIuQ2lyY2xlOnRoaXMuY29udGV4dC5iZWdpblBhdGgoKSx0aGlzLmNvbnRleHQuYXJjKDAsMCx0aGlzLnJhZGl1cywwLDIqTWF0aC5QSSksdGhpcy5jb250ZXh0LmZpbGwoKTticmVhaztjYXNlIHIuU3F1YXJlOnRoaXMuY29udGV4dC5maWxsUmVjdCgtdGhpcy53LzIsLXRoaXMuaC8yLHRoaXMudyx0aGlzLmgpO2JyZWFrO2Nhc2Ugci5TdHJpcDp0aGlzLmNvbnRleHQuZmlsbFJlY3QoLXRoaXMudy82LC10aGlzLmgvMix0aGlzLncvMyx0aGlzLmgpfXRoaXMuY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLmNvbnRleHQucmVzdG9yZSgpfX1dKSYmZihlLnByb3RvdHlwZSxuKSxvJiZmKGUsbyksdH0oKTtmdW5jdGlvbiBwKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH12YXIgdj1mdW5jdGlvbiB0KGUsbil7dmFyIHI9dGhpczshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLHQpLHAodGhpcyxcImNhbnZhc1wiLHZvaWQgMCkscCh0aGlzLFwiY29udGV4dFwiLHZvaWQgMCkscCh0aGlzLFwiZ2V0T3B0aW9uc1wiLHZvaWQgMCkscCh0aGlzLFwieFwiLDApLHAodGhpcyxcInlcIiwwKSxwKHRoaXMsXCJ3XCIsMCkscCh0aGlzLFwiaFwiLDApLHAodGhpcyxcImxhc3ROdW1iZXJPZlBpZWNlc1wiLDApLHAodGhpcyxcInR3ZWVuSW5pdFRpbWVcIixEYXRlLm5vdygpKSxwKHRoaXMsXCJwYXJ0aWNsZXNcIixbXSkscCh0aGlzLFwicGFydGljbGVzR2VuZXJhdGVkXCIsMCkscCh0aGlzLFwicmVtb3ZlUGFydGljbGVBdFwiLChmdW5jdGlvbih0KXtyLnBhcnRpY2xlcy5zcGxpY2UodCwxKX0pKSxwKHRoaXMsXCJnZXRQYXJ0aWNsZVwiLChmdW5jdGlvbigpe3ZhciB0PXUoci54LHIudytyLngpLGU9dShyLnksci5oK3IueSk7cmV0dXJuIG5ldyBsKHIuY29udGV4dCxyLmdldE9wdGlvbnMsdCxlKX0pKSxwKHRoaXMsXCJhbmltYXRlXCIsKGZ1bmN0aW9uKCl7dmFyIHQ9ci5jYW52YXMsZT1yLmNvbnRleHQsbj1yLnBhcnRpY2xlc0dlbmVyYXRlZCxpPXIubGFzdE51bWJlck9mUGllY2VzLG89ci5nZXRPcHRpb25zKCksYT1vLnJ1bixjPW8ucmVjeWNsZSxzPW8ubnVtYmVyT2ZQaWVjZXMsdT1vLmRlYnVnLGY9by50d2VlbkZ1bmN0aW9uLGg9by50d2VlbkR1cmF0aW9uO2lmKCFhKXJldHVybiExO3ZhciBsPXIucGFydGljbGVzLmxlbmd0aCxwPWM/bDpuLHY9RGF0ZS5ub3coKTtpZihwPHMpe2khPT1zJiYoci50d2VlbkluaXRUaW1lPXYsci5sYXN0TnVtYmVyT2ZQaWVjZXM9cyk7Zm9yKHZhciB5PXIudHdlZW5Jbml0VGltZSxkPWYodi15Pmg/aDpNYXRoLm1heCgwLHYteSkscCxzLGgpLGI9TWF0aC5yb3VuZChkLXApLGc9MDtnPGI7ZysrKXIucGFydGljbGVzLnB1c2goci5nZXRQYXJ0aWNsZSgpKTtyLnBhcnRpY2xlc0dlbmVyYXRlZCs9Yn1yZXR1cm4gdSYmKGUuZm9udD1cIjEycHggc2Fucy1zZXJpZlwiLGUuZmlsbFN0eWxlPVwiIzMzM1wiLGUudGV4dEFsaWduPVwicmlnaHRcIixlLmZpbGxUZXh0KFwiUGFydGljbGVzOiBcIi5jb25jYXQobCksdC53aWR0aC0xMCx0LmhlaWdodC0yMCkpLHIucGFydGljbGVzLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7ZS51cGRhdGUoKSwoZS55PnQuaGVpZ2h0fHxlLnk8LTEwMHx8ZS54PnQud2lkdGgrMTAwfHxlLng8LTEwMCkmJihjJiZwPD1zP3IucGFydGljbGVzW25dPXIuZ2V0UGFydGljbGUoKTpyLnJlbW92ZVBhcnRpY2xlQXQobikpfSkpLGw+MHx8cDxzfSkpLHRoaXMuY2FudmFzPWU7dmFyIGk9dGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO2lmKCFpKXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgY2FudmFzIGNvbnRleHRcIik7dGhpcy5jb250ZXh0PWksdGhpcy5nZXRPcHRpb25zPW59O2Z1bmN0aW9uIHkodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIGQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/eShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2codCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOnkoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gYih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gZyh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9dmFyIE89e3dpZHRoOlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93LmlubmVyV2lkdGg6MzAwLGhlaWdodDpcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdy5pbm5lckhlaWdodDoyMDAsbnVtYmVyT2ZQaWVjZXM6MjAwLGZyaWN0aW9uOi45OSx3aW5kOjAsZ3Jhdml0eTouMSxpbml0aWFsVmVsb2NpdHlYOjQsaW5pdGlhbFZlbG9jaXR5WToxMCxjb2xvcnM6W1wiI2Y0NDMzNlwiLFwiI2U5MWU2M1wiLFwiIzljMjdiMFwiLFwiIzY3M2FiN1wiLFwiIzNmNTFiNVwiLFwiIzIxOTZmM1wiLFwiIzAzYTlmNFwiLFwiIzAwYmNkNFwiLFwiIzAwOTY4OFwiLFwiIzRDQUY1MFwiLFwiIzhCQzM0QVwiLFwiI0NEREMzOVwiLFwiI0ZGRUIzQlwiLFwiI0ZGQzEwN1wiLFwiI0ZGOTgwMFwiLFwiI0ZGNTcyMlwiLFwiIzc5NTU0OFwiXSxvcGFjaXR5OjEsZGVidWc6ITEsdHdlZW5GdW5jdGlvbjpzLmEuZWFzZUluT3V0UXVhZCx0d2VlbkR1cmF0aW9uOjVlMyxyZWN5Y2xlOiEwLHJ1bjohMH0sdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXt2YXIgcj10aGlzOyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsdCksZyh0aGlzLFwiY2FudmFzXCIsdm9pZCAwKSxnKHRoaXMsXCJjb250ZXh0XCIsdm9pZCAwKSxnKHRoaXMsXCJfb3B0aW9uc1wiLHZvaWQgMCksZyh0aGlzLFwiZ2VuZXJhdG9yXCIsdm9pZCAwKSxnKHRoaXMsXCJyYWZJZFwiLHZvaWQgMCksZyh0aGlzLFwic2V0T3B0aW9uc1dpdGhEZWZhdWx0c1wiLChmdW5jdGlvbih0KXt2YXIgZT17Y29uZmV0dGlTb3VyY2U6e3g6MCx5OjAsdzpyLmNhbnZhcy53aWR0aCxoOjB9fTtyLl9vcHRpb25zPWQoZChkKHt9LGUpLE8pLHQpLE9iamVjdC5hc3NpZ24ocix0LmNvbmZldHRpU291cmNlKX0pKSxnKHRoaXMsXCJ1cGRhdGVcIiwoZnVuY3Rpb24oKXt2YXIgdD1yLm9wdGlvbnMsZT10LnJ1bixuPXQub25Db25mZXR0aUNvbXBsZXRlLGk9ci5jYW52YXMsbz1yLmNvbnRleHQ7ZSYmKG8uZmlsbFN0eWxlPVwid2hpdGVcIixvLmNsZWFyUmVjdCgwLDAsaS53aWR0aCxpLmhlaWdodCkpLHIuZ2VuZXJhdG9yLmFuaW1hdGUoKT9yLnJhZklkPXJlcXVlc3RBbmltYXRpb25GcmFtZShyLnVwZGF0ZSk6KG4mJlwiZnVuY3Rpb25cIj09dHlwZW9mIG4mJnIuZ2VuZXJhdG9yLnBhcnRpY2xlc0dlbmVyYXRlZD4wJiZuLmNhbGwocixyKSxyLl9vcHRpb25zLnJ1bj0hMSl9KSksZyh0aGlzLFwicmVzZXRcIiwoZnVuY3Rpb24oKXtyLmdlbmVyYXRvciYmci5nZW5lcmF0b3IucGFydGljbGVzR2VuZXJhdGVkPjAmJihyLmdlbmVyYXRvci5wYXJ0aWNsZXNHZW5lcmF0ZWQ9MCxyLmdlbmVyYXRvci5wYXJ0aWNsZXM9W10sci5nZW5lcmF0b3IubGFzdE51bWJlck9mUGllY2VzPTApfSkpLGcodGhpcyxcInN0b3BcIiwoZnVuY3Rpb24oKXtyLm9wdGlvbnM9e3J1bjohMX0sci5yYWZJZCYmKGNhbmNlbEFuaW1hdGlvbkZyYW1lKHIucmFmSWQpLHIucmFmSWQ9dm9pZCAwKX0pKSx0aGlzLmNhbnZhcz1lO3ZhciBpPXRoaXMuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtpZighaSl0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZ2V0IGNhbnZhcyBjb250ZXh0XCIpO3RoaXMuY29udGV4dD1pLHRoaXMuZ2VuZXJhdG9yPW5ldyB2KHRoaXMuY2FudmFzLChmdW5jdGlvbigpe3JldHVybiByLm9wdGlvbnN9KSksdGhpcy5vcHRpb25zPW4sdGhpcy51cGRhdGUoKX12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleTpcIm9wdGlvbnNcIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3B0aW9uc30sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29wdGlvbnMmJnRoaXMuX29wdGlvbnMucnVuLG49dGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5yZWN5Y2xlO3RoaXMuc2V0T3B0aW9uc1dpdGhEZWZhdWx0cyh0KSx0aGlzLmdlbmVyYXRvciYmKE9iamVjdC5hc3NpZ24odGhpcy5nZW5lcmF0b3IsdGhpcy5vcHRpb25zLmNvbmZldHRpU291cmNlKSxcImJvb2xlYW5cIj09dHlwZW9mIHQucmVjeWNsZSYmdC5yZWN5Y2xlJiYhMT09PW4mJih0aGlzLmdlbmVyYXRvci5sYXN0TnVtYmVyT2ZQaWVjZXM9dGhpcy5nZW5lcmF0b3IucGFydGljbGVzLmxlbmd0aCkpLFwiYm9vbGVhblwiPT10eXBlb2YgdC5ydW4mJnQucnVuJiYhMT09PWUmJnRoaXMudXBkYXRlKCl9fV0pJiZiKGUucHJvdG90eXBlLG4pLHImJmIoZSxyKSx0fSgpO2Z1bmN0aW9uIG0odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEModCl9KHQpfHxmdW5jdGlvbih0KXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKXJldHVybiBBcnJheS5mcm9tKHQpfSh0KXx8Uyh0KXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX0oKX1mdW5jdGlvbiB4KHQpe3JldHVybih4PVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBQKCl7cmV0dXJuKFA9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYodFtyXT1uW3JdKX1yZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBqKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBNKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP2ooT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtUKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpqKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIEkodCxlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdH0odCl8fGZ1bmN0aW9uKHQsZSl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKSlyZXR1cm47dmFyIG49W10scj0hMCxpPSExLG89dm9pZCAwO3RyeXtmb3IodmFyIGEsYz10W1N5bWJvbC5pdGVyYXRvcl0oKTshKHI9KGE9Yy5uZXh0KCkpLmRvbmUpJiYobi5wdXNoKGEudmFsdWUpLCFlfHxuLmxlbmd0aCE9PWUpO3I9ITApO31jYXRjaCh0KXtpPSEwLG89dH1maW5hbGx5e3RyeXtyfHxudWxsPT1jLnJldHVybnx8Yy5yZXR1cm4oKX1maW5hbGx5e2lmKGkpdGhyb3cgb319cmV0dXJuIG59KHQsZSl8fFModCxlKXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfSgpfWZ1bmN0aW9uIFModCxlKXtpZih0KXtpZihcInN0cmluZ1wiPT10eXBlb2YgdClyZXR1cm4gQyh0LGUpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTtyZXR1cm5cIk9iamVjdFwiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKSxcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4/QXJyYXkuZnJvbSh0KTpcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/Qyh0LGUpOnZvaWQgMH19ZnVuY3Rpb24gQyh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIEQodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIEUodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIF8odCxlKXtyZXR1cm4oXz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gUih0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPUYodCk7aWYoZSl7dmFyIGk9Rih0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gayh0aGlzLG4pfX1mdW5jdGlvbiBrKHQsZSl7cmV0dXJuIWV8fFwib2JqZWN0XCIhPT14KGUpJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP0EodCk6ZX1mdW5jdGlvbiBBKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiB0fWZ1bmN0aW9uIEYodCl7cmV0dXJuKEY9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIFQodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fXZhciBCPWEuYS5jcmVhdGVSZWYoKSxOPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmXyh0LGUpfShvLHQpO3ZhciBlLG4scixpPVIobyk7ZnVuY3Rpb24gbyh0KXt2YXIgZTtEKHRoaXMsbyk7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxjPTE7YzxuO2MrKylyW2MtMV09YXJndW1lbnRzW2NdO3JldHVybiBUKEEoZT1pLmNhbGwuYXBwbHkoaSxbdGhpcyx0XS5jb25jYXQocikpKSxcImNhbnZhc1wiLGEuYS5jcmVhdGVSZWYoKSksVChBKGUpLFwiY29uZmV0dGlcIix2b2lkIDApLGUuY2FudmFzPXQuY2FudmFzUmVmfHxCLGV9cmV0dXJuIGU9bywobj1be2tleTpcImNvbXBvbmVudERpZE1vdW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmNhbnZhcy5jdXJyZW50KXt2YXIgdD1xKHRoaXMucHJvcHMpWzBdO3RoaXMuY29uZmV0dGk9bmV3IHcodGhpcy5jYW52YXMuY3VycmVudCx0KX19fSx7a2V5OlwiY29tcG9uZW50RGlkVXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1xKHRoaXMucHJvcHMpWzBdO3RoaXMuY29uZmV0dGkmJih0aGlzLmNvbmZldHRpLm9wdGlvbnM9dCl9fSx7a2V5OlwiY29tcG9uZW50V2lsbFVubW91bnRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY29uZmV0dGkmJnRoaXMuY29uZmV0dGkuc3RvcCgpLHRoaXMuY29uZmV0dGk9dm9pZCAwfX0se2tleTpcInJlbmRlclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9SShxKHRoaXMucHJvcHMpLDIpLGU9dFswXSxuPXRbMV0scj1NKHt6SW5kZXg6Mixwb3NpdGlvbjpcImFic29sdXRlXCIscG9pbnRlckV2ZW50czpcIm5vbmVcIix0b3A6MCxsZWZ0OjAsYm90dG9tOjAscmlnaHQ6MH0sbi5zdHlsZSk7cmV0dXJuIGEuYS5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIsUCh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHQscmVmOnRoaXMuY2FudmFzfSxuLHtzdHlsZTpyfSkpfX1dKSYmRShlLnByb3RvdHlwZSxuKSxyJiZFKGUsciksb30oby5Db21wb25lbnQpO2Z1bmN0aW9uIHEodCl7dmFyIGU9e30sbj17fSxyPVtdLmNvbmNhdChtKE9iamVjdC5rZXlzKE8pKSxbXCJjb25mZXR0aVNvdXJjZVwiLFwiZHJhd1NoYXBlXCIsXCJvbkNvbmZldHRpQ29tcGxldGVcIl0pLGk9W1wiY2FudmFzUmVmXCJdO2Zvcih2YXIgbyBpbiB0KXt2YXIgYT10W29dO3IuaW5jbHVkZXMobyk/ZVtvXT1hOmkuaW5jbHVkZXMobyk/aVtvXT1hOm5bb109YX1yZXR1cm5bZSxuLHt9XX1UKE4sXCJkZWZhdWx0UHJvcHNcIixNKHt9LE8pKSxUKE4sXCJkaXNwbGF5TmFtZVwiLFwiUmVhY3RDb25mZXR0aVwiKTt2YXIgUT1hLmEuZm9yd2FyZFJlZigoZnVuY3Rpb24odCxlKXtyZXR1cm4gYS5hLmNyZWF0ZUVsZW1lbnQoTixQKHtjYW52YXNSZWY6ZX0sdCkpfSkpO2UuZGVmYXVsdD1RfV0pLmRlZmF1bHR9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFjdC1jb25mZXR0aS5taW4uanMubWFwIiwiLyohXG4gIHJlYWN0LWRhdGVwaWNrZXIgdjcuMi4wXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9IYWNrZXIweDAxL3JlYWN0LWRhdGVwaWNrZXJcbiAgUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuKi9cbiFmdW5jdGlvbihlLHQpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP3QoZXhwb3J0cyxyZXF1aXJlKFwiY2xzeFwiKSxyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcInJlYWN0LW9uY2xpY2tvdXRzaWRlXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGREYXlzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRIb3Vyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkTWludXRlc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkTW9udGhzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRRdWFydGVyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkU2Vjb25kc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkV2Vla3NcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZFllYXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXNcIikscmVxdWlyZShcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9lbmRPZkRheVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZW5kT2ZNb250aFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZW5kT2ZXZWVrXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9lbmRPZlllYXJcIikscmVxdWlyZShcImRhdGUtZm5zL2Zvcm1hdFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0RGF0ZVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0RGF5XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRIb3Vyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0SVNPV2Vla1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0TWludXRlc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0TW9udGhcIikscmVxdWlyZShcImRhdGUtZm5zL2dldFF1YXJ0ZXJcIikscmVxdWlyZShcImRhdGUtZm5zL2dldFNlY29uZHNcIikscmVxdWlyZShcImRhdGUtZm5zL2dldFRpbWVcIikscmVxdWlyZShcImRhdGUtZm5zL2dldFllYXJcIikscmVxdWlyZShcImRhdGUtZm5zL2lzQWZ0ZXJcIikscmVxdWlyZShcImRhdGUtZm5zL2lzQmVmb3JlXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc0RhdGVcIikscmVxdWlyZShcImRhdGUtZm5zL2lzRXF1YWxcIikscmVxdWlyZShcImRhdGUtZm5zL2lzU2FtZURheVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNTYW1lTW9udGhcIikscmVxdWlyZShcImRhdGUtZm5zL2lzU2FtZVF1YXJ0ZXJcIikscmVxdWlyZShcImRhdGUtZm5zL2lzU2FtZVllYXJcIikscmVxdWlyZShcImRhdGUtZm5zL2lzVmFsaWRcIikscmVxdWlyZShcImRhdGUtZm5zL2lzV2l0aGluSW50ZXJ2YWxcIikscmVxdWlyZShcImRhdGUtZm5zL21heFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvbWluXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9wYXJzZVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvcGFyc2VJU09cIikscmVxdWlyZShcImRhdGUtZm5zL3NldFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0SG91cnNcIikscmVxdWlyZShcImRhdGUtZm5zL3NldE1pbnV0ZXNcIikscmVxdWlyZShcImRhdGUtZm5zL3NldE1vbnRoXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRRdWFydGVyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRTZWNvbmRzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRZZWFyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdGFydE9mRGF5XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdGFydE9mTW9udGhcIikscmVxdWlyZShcImRhdGUtZm5zL3N0YXJ0T2ZRdWFydGVyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdGFydE9mV2Vla1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3RhcnRPZlllYXJcIikscmVxdWlyZShcImRhdGUtZm5zL3N1YkRheXNcIikscmVxdWlyZShcImRhdGUtZm5zL3N1Yk1vbnRoc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3ViUXVhcnRlcnNcIikscmVxdWlyZShcImRhdGUtZm5zL3N1YldlZWtzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdWJZZWFyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvdG9EYXRlXCIpLHJlcXVpcmUoXCJAZmxvYXRpbmctdWkvcmVhY3RcIikscmVxdWlyZShcInJlYWN0LWRvbVwiKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJleHBvcnRzXCIsXCJjbHN4XCIsXCJyZWFjdFwiLFwicmVhY3Qtb25jbGlja291dHNpZGVcIixcImRhdGUtZm5zL2FkZERheXNcIixcImRhdGUtZm5zL2FkZEhvdXJzXCIsXCJkYXRlLWZucy9hZGRNaW51dGVzXCIsXCJkYXRlLWZucy9hZGRNb250aHNcIixcImRhdGUtZm5zL2FkZFF1YXJ0ZXJzXCIsXCJkYXRlLWZucy9hZGRTZWNvbmRzXCIsXCJkYXRlLWZucy9hZGRXZWVrc1wiLFwiZGF0ZS1mbnMvYWRkWWVhcnNcIixcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c1wiLFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNcIixcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnNcIixcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnNcIixcImRhdGUtZm5zL2VuZE9mRGF5XCIsXCJkYXRlLWZucy9lbmRPZk1vbnRoXCIsXCJkYXRlLWZucy9lbmRPZldlZWtcIixcImRhdGUtZm5zL2VuZE9mWWVhclwiLFwiZGF0ZS1mbnMvZm9ybWF0XCIsXCJkYXRlLWZucy9nZXREYXRlXCIsXCJkYXRlLWZucy9nZXREYXlcIixcImRhdGUtZm5zL2dldEhvdXJzXCIsXCJkYXRlLWZucy9nZXRJU09XZWVrXCIsXCJkYXRlLWZucy9nZXRNaW51dGVzXCIsXCJkYXRlLWZucy9nZXRNb250aFwiLFwiZGF0ZS1mbnMvZ2V0UXVhcnRlclwiLFwiZGF0ZS1mbnMvZ2V0U2Vjb25kc1wiLFwiZGF0ZS1mbnMvZ2V0VGltZVwiLFwiZGF0ZS1mbnMvZ2V0WWVhclwiLFwiZGF0ZS1mbnMvaXNBZnRlclwiLFwiZGF0ZS1mbnMvaXNCZWZvcmVcIixcImRhdGUtZm5zL2lzRGF0ZVwiLFwiZGF0ZS1mbnMvaXNFcXVhbFwiLFwiZGF0ZS1mbnMvaXNTYW1lRGF5XCIsXCJkYXRlLWZucy9pc1NhbWVNb250aFwiLFwiZGF0ZS1mbnMvaXNTYW1lUXVhcnRlclwiLFwiZGF0ZS1mbnMvaXNTYW1lWWVhclwiLFwiZGF0ZS1mbnMvaXNWYWxpZFwiLFwiZGF0ZS1mbnMvaXNXaXRoaW5JbnRlcnZhbFwiLFwiZGF0ZS1mbnMvbWF4XCIsXCJkYXRlLWZucy9taW5cIixcImRhdGUtZm5zL3BhcnNlXCIsXCJkYXRlLWZucy9wYXJzZUlTT1wiLFwiZGF0ZS1mbnMvc2V0XCIsXCJkYXRlLWZucy9zZXRIb3Vyc1wiLFwiZGF0ZS1mbnMvc2V0TWludXRlc1wiLFwiZGF0ZS1mbnMvc2V0TW9udGhcIixcImRhdGUtZm5zL3NldFF1YXJ0ZXJcIixcImRhdGUtZm5zL3NldFNlY29uZHNcIixcImRhdGUtZm5zL3NldFllYXJcIixcImRhdGUtZm5zL3N0YXJ0T2ZEYXlcIixcImRhdGUtZm5zL3N0YXJ0T2ZNb250aFwiLFwiZGF0ZS1mbnMvc3RhcnRPZlF1YXJ0ZXJcIixcImRhdGUtZm5zL3N0YXJ0T2ZXZWVrXCIsXCJkYXRlLWZucy9zdGFydE9mWWVhclwiLFwiZGF0ZS1mbnMvc3ViRGF5c1wiLFwiZGF0ZS1mbnMvc3ViTW9udGhzXCIsXCJkYXRlLWZucy9zdWJRdWFydGVyc1wiLFwiZGF0ZS1mbnMvc3ViV2Vla3NcIixcImRhdGUtZm5zL3N1YlllYXJzXCIsXCJkYXRlLWZucy90b0RhdGVcIixcIkBmbG9hdGluZy11aS9yZWFjdFwiLFwicmVhY3QtZG9tXCJdLHQpOnQoKGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5EYXRlUGlja2VyPXt9LGUuY2xzeCxlLlJlYWN0LGUub25DbGlja091dHNpZGUsZS5hZGREYXlzLGUuYWRkSG91cnMsZS5hZGRNaW51dGVzLGUuYWRkTW9udGhzLGUuYWRkUXVhcnRlcnMsZS5hZGRTZWNvbmRzLGUuYWRkV2Vla3MsZS5hZGRZZWFycyxlLmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyxlLmRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzLGUuZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyxlLmRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMsZS5lbmRPZkRheSxlLmVuZE9mTW9udGgsZS5lbmRPZldlZWssZS5lbmRPZlllYXIsZS5mb3JtYXQsZS5nZXREYXRlLGUuZ2V0RGF5LGUuZ2V0SG91cnMsZS5nZXRJU09XZWVrLGUuZ2V0TWludXRlcyxlLmdldE1vbnRoLGUuZ2V0UXVhcnRlcixlLmdldFNlY29uZHMsZS5nZXRUaW1lLGUuZ2V0WWVhcixlLmlzQWZ0ZXIsZS5pc0JlZm9yZSxlLmlzRGF0ZSxlLmlzRXF1YWwkMSxlLmlzU2FtZURheSQxLGUuaXNTYW1lTW9udGgkMSxlLmlzU2FtZVF1YXJ0ZXIkMSxlLmlzU2FtZVllYXIkMSxlLmlzVmFsaWQkMSxlLmlzV2l0aGluSW50ZXJ2YWwsZS5tYXgsZS5taW4sZS5wYXJzZSxlLnBhcnNlSVNPLGUuc2V0LGUuc2V0SG91cnMsZS5zZXRNaW51dGVzLGUuc2V0TW9udGgsZS5zZXRRdWFydGVyLGUuc2V0U2Vjb25kcyxlLnNldFllYXIsZS5zdGFydE9mRGF5LGUuc3RhcnRPZk1vbnRoLGUuc3RhcnRPZlF1YXJ0ZXIsZS5zdGFydE9mV2VlayxlLnN0YXJ0T2ZZZWFyLGUuc3ViRGF5cyxlLnN1Yk1vbnRocyxlLnN1YlF1YXJ0ZXJzLGUuc3ViV2Vla3MsZS5zdWJZZWFycyxlLnRvRGF0ZSxlLnJlYWN0LGUuUmVhY3RET00pfSh0aGlzLChmdW5jdGlvbihlLHQscixuLGEsbyxzLGksbCxjLHAsZCx1LGYsaCxtLHYsZyx5LEQsayx3LFMsYixNLF8sQyxFLFksUCx4LE4sTyxJLFQsUixMLEEsRixILFcsUSxxLEssQixWLGosVSwkLHosWCxHLEosWixlZSx0ZSxyZSxuZSxhZSxvZSxzZSxpZSxsZSxjZSxwZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZGUoZSl7cmV0dXJuIGUmJlwib2JqZWN0XCI9PXR5cGVvZiBlJiZcImRlZmF1bHRcImluIGU/ZTp7ZGVmYXVsdDplfX12YXIgdWU9ZGUociksZmU9ZGUobiksaGU9ZGUocGUpLG1lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG1lPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgciBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpJiYoZVtyXT10W3JdKX0sbWUoZSx0KX07ZnVuY3Rpb24gdmUoZSx0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIitTdHJpbmcodCkrXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfW1lKGUsdCksZS5wcm90b3R5cGU9bnVsbD09PXQ/T2JqZWN0LmNyZWF0ZSh0KTooci5wcm90b3R5cGU9dC5wcm90b3R5cGUsbmV3IHIpfXZhciBnZT1mdW5jdGlvbigpe3JldHVybiBnZT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQscj0xLG49YXJndW1lbnRzLmxlbmd0aDtyPG47cisrKWZvcih2YXIgYSBpbiB0PWFyZ3VtZW50c1tyXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxhKSYmKGVbYV09dFthXSk7cmV0dXJuIGV9LGdlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07ZnVuY3Rpb24geWUoZSx0LHIpe2lmKHJ8fDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbixhPTAsbz10Lmxlbmd0aDthPG87YSsrKSFuJiZhIGluIHR8fChufHwobj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LDAsYSkpLG5bYV09dFthXSk7cmV0dXJuIGUuY29uY2F0KG58fEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpKX1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTdXBwcmVzc2VkRXJyb3ImJlN1cHByZXNzZWRFcnJvcjt2YXIgRGUsa2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zaG93VGltZVNlbGVjdE9ubHkscj12b2lkIDAhPT10JiZ0LG49ZS5zaG93VGltZSxhPXZvaWQgMCE9PW4mJm4sbz1lLmNsYXNzTmFtZSxzPWUuY2hpbGRyZW4saT1yP1wiQ2hvb3NlIFRpbWVcIjpcIkNob29zZSBEYXRlXCIuY29uY2F0KGE/XCIgYW5kIFRpbWVcIjpcIlwiKTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpvLHJvbGU6XCJkaWFsb2dcIixcImFyaWEtbGFiZWxcIjppLFwiYXJpYS1tb2RhbFwiOlwidHJ1ZVwifSxzKX07ZnVuY3Rpb24gd2UoKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzpnbG9iYWxUaGlzfSFmdW5jdGlvbihlKXtlLkFycm93VXA9XCJBcnJvd1VwXCIsZS5BcnJvd0Rvd249XCJBcnJvd0Rvd25cIixlLkFycm93TGVmdD1cIkFycm93TGVmdFwiLGUuQXJyb3dSaWdodD1cIkFycm93UmlnaHRcIixlLlBhZ2VVcD1cIlBhZ2VVcFwiLGUuUGFnZURvd249XCJQYWdlRG93blwiLGUuSG9tZT1cIkhvbWVcIixlLkVuZD1cIkVuZFwiLGUuRW50ZXI9XCJFbnRlclwiLGUuU3BhY2U9XCIgXCIsZS5UYWI9XCJUYWJcIixlLkVzY2FwZT1cIkVzY2FwZVwiLGUuQmFja3NwYWNlPVwiQmFja3NwYWNlXCIsZS5YPVwieFwifShEZXx8KERlPXt9KSk7dmFyIFNlPTEyLGJlPS9QK3ArfFArfHArfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nO2Z1bmN0aW9uIE1lKGUpe2lmKG51bGw9PWUpcmV0dXJuIG5ldyBEYXRlO3ZhciB0PVwic3RyaW5nXCI9PXR5cGVvZiBlP0IucGFyc2VJU08oZSk6bGUudG9EYXRlKGUpO3JldHVybiBfZSh0KT90Om5ldyBEYXRlfWZ1bmN0aW9uIF9lKGUsdCl7cmV0dXJuIEguaXNWYWxpZChlKSYmIU8uaXNCZWZvcmUoZSxudWxsIT10P3Q6bmV3IERhdGUoXCIxLzEvMTgwMFwiKSl9ZnVuY3Rpb24gQ2UoZSx0LHIpe2lmKFwiZW5cIj09PXIpcmV0dXJuIGsuZm9ybWF0KGUsdCx7dXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zOiEwLHVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM6ITB9KTt2YXIgbj1yP0tlKHIpOnZvaWQgMDtyZXR1cm4gciYmIW4mJmNvbnNvbGUud2FybignQSBsb2NhbGUgb2JqZWN0IHdhcyBub3QgZm91bmQgZm9yIHRoZSBwcm92aWRlZCBzdHJpbmcgW1wiJy5jb25jYXQociwnXCJdLicpKSwhbiYmcWUoKSYmS2UocWUoKSkmJihuPUtlKHFlKCkpKSxrLmZvcm1hdChlLHQse2xvY2FsZTpuLHVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VuczohMCx1c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zOiEwfSl9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgcj10LmRhdGVGb3JtYXQsbj10LmxvY2FsZSxhPUFycmF5LmlzQXJyYXkocikmJnIubGVuZ3RoPjA/clswXTpyO3JldHVybiBlJiZDZShlLGEsbil8fFwiXCJ9ZnVuY3Rpb24gWWUoZSx0KXt2YXIgcj10LmhvdXIsbj12b2lkIDA9PT1yPzA6cixhPXQubWludXRlLG89dm9pZCAwPT09YT8wOmEscz10LnNlY29uZCxpPXZvaWQgMD09PXM/MDpzO3JldHVybiBqLnNldEhvdXJzKFUuc2V0TWludXRlcyhYLnNldFNlY29uZHMoZSxpKSxvKSxuKX1mdW5jdGlvbiBQZShlKXtyZXR1cm4gSi5zdGFydE9mRGF5KGUpfWZ1bmN0aW9uIHhlKGUsdCxyKXt2YXIgbj1LZSh0fHxxZSgpKTtyZXR1cm4gdGUuc3RhcnRPZldlZWsoZSx7bG9jYWxlOm4sd2Vla1N0YXJ0c09uOnJ9KX1mdW5jdGlvbiBOZShlKXtyZXR1cm4gWi5zdGFydE9mTW9udGgoZSl9ZnVuY3Rpb24gT2UoZSl7cmV0dXJuIHJlLnN0YXJ0T2ZZZWFyKGUpfWZ1bmN0aW9uIEllKGUpe3JldHVybiBlZS5zdGFydE9mUXVhcnRlcihlKX1mdW5jdGlvbiBUZSgpe3JldHVybiBKLnN0YXJ0T2ZEYXkoTWUoKSl9ZnVuY3Rpb24gUmUoZSl7cmV0dXJuIHYuZW5kT2ZEYXkoZSl9ZnVuY3Rpb24gTGUoZSx0KXtyZXR1cm4gZSYmdD9GLmlzU2FtZVllYXIoZSx0KTohZSYmIXR9ZnVuY3Rpb24gQWUoZSx0KXtyZXR1cm4gZSYmdD9MLmlzU2FtZU1vbnRoKGUsdCk6IWUmJiF0fWZ1bmN0aW9uIEZlKGUsdCl7cmV0dXJuIGUmJnQ/QS5pc1NhbWVRdWFydGVyKGUsdCk6IWUmJiF0fWZ1bmN0aW9uIEhlKGUsdCl7cmV0dXJuIGUmJnQ/Ui5pc1NhbWVEYXkoZSx0KTohZSYmIXR9ZnVuY3Rpb24gV2UoZSx0KXtyZXR1cm4gZSYmdD9ULmlzRXF1YWwoZSx0KTohZSYmIXR9ZnVuY3Rpb24gUWUoZSx0LHIpe3ZhciBuLGE9Si5zdGFydE9mRGF5KHQpLG89di5lbmRPZkRheShyKTt0cnl7bj1XLmlzV2l0aGluSW50ZXJ2YWwoZSx7c3RhcnQ6YSxlbmQ6b30pfWNhdGNoKGUpe249ITF9cmV0dXJuIG59ZnVuY3Rpb24gcWUoKXtyZXR1cm4gd2UoKS5fX2xvY2FsZUlkX199ZnVuY3Rpb24gS2UoZSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpe3ZhciB0PXdlKCk7cmV0dXJuIHQuX19sb2NhbGVEYXRhX18/dC5fX2xvY2FsZURhdGFfX1tlXTp2b2lkIDB9cmV0dXJuIGV9ZnVuY3Rpb24gQmUoZSx0KXtyZXR1cm4gQ2UoJC5zZXRNb250aChNZSgpLGUpLFwiTExMTFwiLHQpfWZ1bmN0aW9uIFZlKGUsdCl7cmV0dXJuIENlKCQuc2V0TW9udGgoTWUoKSxlKSxcIkxMTFwiLHQpfWZ1bmN0aW9uIGplKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5tYXhEYXRlLG89ci5leGNsdWRlRGF0ZXMscz1yLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzLGk9ci5pbmNsdWRlRGF0ZXMsbD1yLmluY2x1ZGVEYXRlSW50ZXJ2YWxzLGM9ci5maWx0ZXJEYXRlO3JldHVybiB0dChlLHttaW5EYXRlOm4sbWF4RGF0ZTphfSl8fG8mJm8uc29tZSgoZnVuY3Rpb24odCl7dmFyIHI7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlP0hlKGUsdCk6SGUoZSxudWxsIT09KHI9dC5kYXRlKSYmdm9pZCAwIT09cj9yOm5ldyBEYXRlKX0pKXx8cyYmcy5zb21lKChmdW5jdGlvbih0KXt2YXIgcj10LnN0YXJ0LG49dC5lbmQ7cmV0dXJuIFcuaXNXaXRoaW5JbnRlcnZhbChlLHtzdGFydDpyLGVuZDpufSl9KSl8fGkmJiFpLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBIZShlLHQpfSkpfHxsJiYhbC5zb21lKChmdW5jdGlvbih0KXt2YXIgcj10LnN0YXJ0LG49dC5lbmQ7cmV0dXJuIFcuaXNXaXRoaW5JbnRlcnZhbChlLHtzdGFydDpyLGVuZDpufSl9KSl8fGMmJiFjKE1lKGUpKXx8ITF9ZnVuY3Rpb24gVWUoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLmV4Y2x1ZGVEYXRlcyxhPXIuZXhjbHVkZURhdGVJbnRlcnZhbHM7cmV0dXJuIGEmJmEubGVuZ3RoPjA/YS5zb21lKChmdW5jdGlvbih0KXt2YXIgcj10LnN0YXJ0LG49dC5lbmQ7cmV0dXJuIFcuaXNXaXRoaW5JbnRlcnZhbChlLHtzdGFydDpyLGVuZDpufSl9KSk6biYmbi5zb21lKChmdW5jdGlvbih0KXt2YXIgcjtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGU/SGUoZSx0KTpIZShlLG51bGwhPT0ocj10LmRhdGUpJiZ2b2lkIDAhPT1yP3I6bmV3IERhdGUpfSkpfHwhMX1mdW5jdGlvbiAkZShlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWluRGF0ZSxhPXIubWF4RGF0ZSxvPXIuZXhjbHVkZURhdGVzLHM9ci5pbmNsdWRlRGF0ZXMsaT1yLmZpbHRlckRhdGU7cmV0dXJuIHR0KGUse21pbkRhdGU6bj9aLnN0YXJ0T2ZNb250aChuKTp2b2lkIDAsbWF4RGF0ZTphP2cuZW5kT2ZNb250aChhKTp2b2lkIDB9KXx8KG51bGw9PW8/dm9pZCAwOm8uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEFlKGUsdCBpbnN0YW5jZW9mIERhdGU/dDp0LmRhdGUpfSkpKXx8cyYmIXMuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEFlKGUsdCl9KSl8fGkmJiFpKE1lKGUpKXx8ITF9ZnVuY3Rpb24gemUoZSx0LHIsbil7dmFyIGE9eC5nZXRZZWFyKGUpLG89Qy5nZXRNb250aChlKSxzPXguZ2V0WWVhcih0KSxpPUMuZ2V0TW9udGgodCksbD14LmdldFllYXIobik7cmV0dXJuIGE9PT1zJiZhPT09bD9vPD1yJiZyPD1pOmE8cyYmKGw9PT1hJiZvPD1yfHxsPT09cyYmaT49cnx8bDxzJiZsPmEpfWZ1bmN0aW9uIFhlKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5tYXhEYXRlLG89ci5leGNsdWRlRGF0ZXMscz1yLmluY2x1ZGVEYXRlcztyZXR1cm4gdHQoZSx7bWluRGF0ZTpuLG1heERhdGU6YX0pfHxvJiZvLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBBZSh0IGluc3RhbmNlb2YgRGF0ZT90OnQuZGF0ZSxlKX0pKXx8cyYmIXMuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEFlKHQsZSl9KSl8fCExfWZ1bmN0aW9uIEdlKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5tYXhEYXRlLG89ci5leGNsdWRlRGF0ZXMscz1yLmluY2x1ZGVEYXRlcyxpPXIuZmlsdGVyRGF0ZTtyZXR1cm4gdHQoZSx7bWluRGF0ZTpuLG1heERhdGU6YX0pfHwobnVsbD09bz92b2lkIDA6by5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gRmUoZSx0IGluc3RhbmNlb2YgRGF0ZT90OnQuZGF0ZSl9KSkpfHxzJiYhcy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gRmUoZSx0KX0pKXx8aSYmIWkoTWUoZSkpfHwhMX1mdW5jdGlvbiBKZShlLHQscil7aWYoIXR8fCFyKXJldHVybiExO2lmKCFILmlzVmFsaWQodCl8fCFILmlzVmFsaWQocikpcmV0dXJuITE7dmFyIG49eC5nZXRZZWFyKHQpLGE9eC5nZXRZZWFyKHIpO3JldHVybiBuPD1lJiZhPj1lfWZ1bmN0aW9uIFplKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5tYXhEYXRlLG89ci5leGNsdWRlRGF0ZXMscz1yLmluY2x1ZGVEYXRlcyxpPXIuZmlsdGVyRGF0ZSxsPW5ldyBEYXRlKGUsMCwxKTtyZXR1cm4gdHQobCx7bWluRGF0ZTpuP3JlLnN0YXJ0T2ZZZWFyKG4pOnZvaWQgMCxtYXhEYXRlOmE/RC5lbmRPZlllYXIoYSk6dm9pZCAwfSl8fChudWxsPT1vP3ZvaWQgMDpvLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBMZShsLGUgaW5zdGFuY2VvZiBEYXRlP2U6ZS5kYXRlKX0pKSl8fHMmJiFzLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBMZShsLGUpfSkpfHxpJiYhaShNZShsKSl8fCExfWZ1bmN0aW9uIGV0KGUsdCxyLG4pe3ZhciBhPXguZ2V0WWVhcihlKSxvPUUuZ2V0UXVhcnRlcihlKSxzPXguZ2V0WWVhcih0KSxpPUUuZ2V0UXVhcnRlcih0KSxsPXguZ2V0WWVhcihuKTtyZXR1cm4gYT09PXMmJmE9PT1sP288PXImJnI8PWk6YTxzJiYobD09PWEmJm88PXJ8fGw9PT1zJiZpPj1yfHxsPHMmJmw+YSl9ZnVuY3Rpb24gdHQoZSx0KXt2YXIgcixuPXZvaWQgMD09PXQ/e306dCxhPW4ubWluRGF0ZSxvPW4ubWF4RGF0ZTtyZXR1cm4gbnVsbCE9PShyPWEmJnUuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsYSk8MHx8byYmdS5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSxvKT4wKSYmdm9pZCAwIT09ciYmcn1mdW5jdGlvbiBydChlLHQpe3JldHVybiB0LnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBiLmdldEhvdXJzKHQpPT09Yi5nZXRIb3VycyhlKSYmXy5nZXRNaW51dGVzKHQpPT09Xy5nZXRNaW51dGVzKGUpJiZZLmdldFNlY29uZHModCk9PT1ZLmdldFNlY29uZHMoZSl9KSl9ZnVuY3Rpb24gbnQoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLmV4Y2x1ZGVUaW1lcyxhPXIuaW5jbHVkZVRpbWVzLG89ci5maWx0ZXJUaW1lO3JldHVybiBuJiZydChlLG4pfHxhJiYhcnQoZSxhKXx8byYmIW8oZSl8fCExfWZ1bmN0aW9uIGF0KGUsdCl7dmFyIHI9dC5taW5UaW1lLG49dC5tYXhUaW1lO2lmKCFyfHwhbil0aHJvdyBuZXcgRXJyb3IoXCJCb3RoIG1pblRpbWUgYW5kIG1heFRpbWUgcHJvcHMgcmVxdWlyZWRcIik7dmFyIGE9TWUoKTthPWouc2V0SG91cnMoYSxiLmdldEhvdXJzKGUpKSxhPVUuc2V0TWludXRlcyhhLF8uZ2V0TWludXRlcyhlKSksYT1YLnNldFNlY29uZHMoYSxZLmdldFNlY29uZHMoZSkpO3ZhciBvPU1lKCk7bz1qLnNldEhvdXJzKG8sYi5nZXRIb3VycyhyKSksbz1VLnNldE1pbnV0ZXMobyxfLmdldE1pbnV0ZXMocikpLG89WC5zZXRTZWNvbmRzKG8sWS5nZXRTZWNvbmRzKHIpKTt2YXIgcyxpPU1lKCk7aT1qLnNldEhvdXJzKGksYi5nZXRIb3VycyhuKSksaT1VLnNldE1pbnV0ZXMoaSxfLmdldE1pbnV0ZXMobikpLGk9WC5zZXRTZWNvbmRzKGksWS5nZXRTZWNvbmRzKG4pKTt0cnl7cz0hVy5pc1dpdGhpbkludGVydmFsKGEse3N0YXJ0Om8sZW5kOml9KX1jYXRjaChlKXtzPSExfXJldHVybiBzfWZ1bmN0aW9uIG90KGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz1hZS5zdWJNb250aHMoZSwxKTtyZXR1cm4gbiYmZi5kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhuLG8pPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBmLmRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKGUsbyk+MH0pKXx8ITF9ZnVuY3Rpb24gc3QoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1heERhdGUsYT1yLmluY2x1ZGVEYXRlcyxvPWkuYWRkTW9udGhzKGUsMSk7cmV0dXJuIG4mJmYuZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobyxuKT4wfHxhJiZhLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gZi5kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhvLGUpPjB9KSl8fCExfWZ1bmN0aW9uIGl0KGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz1pZS5zdWJZZWFycyhlLDEpO3JldHVybiBuJiZtLmRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobixvKT4wfHxhJiZhLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gbS5kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKGUsbyk+MH0pKXx8ITF9ZnVuY3Rpb24gbHQoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1heERhdGUsYT1yLmluY2x1ZGVEYXRlcyxvPWQuYWRkWWVhcnMoZSwxKTtyZXR1cm4gbiYmbS5kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKG8sbik+MHx8YSYmYS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIG0uZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhvLGUpPjB9KSl8fCExfWZ1bmN0aW9uIGN0KGUpe3ZhciB0PWUubWluRGF0ZSxyPWUuaW5jbHVkZURhdGVzO2lmKHImJnQpe3ZhciBuPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gdS5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSx0KT49MH0pKTtyZXR1cm4gcS5taW4obil9cmV0dXJuIHI/cS5taW4ocik6dH1mdW5jdGlvbiBwdChlKXt2YXIgdD1lLm1heERhdGUscj1lLmluY2x1ZGVEYXRlcztpZihyJiZ0KXt2YXIgbj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIHUuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsdCk8PTB9KSk7cmV0dXJuIFEubWF4KG4pfXJldHVybiByP1EubWF4KHIpOnR9ZnVuY3Rpb24gZHQoZSx0KXt2YXIgcjt2b2lkIDA9PT1lJiYoZT1bXSksdm9pZCAwPT09dCYmKHQ9XCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkXCIpO2Zvcih2YXIgbj1uZXcgTWFwLGE9MCxvPWUubGVuZ3RoO2E8bzthKyspe3ZhciBzPWVbYV07aWYoSS5pc0RhdGUocykpe3ZhciBpPUNlKHMsXCJNTS5kZC55eXl5XCIpOyhmPW4uZ2V0KGkpfHxbXSkuaW5jbHVkZXModCl8fChmLnB1c2godCksbi5zZXQoaSxmKSl9ZWxzZSBpZihcIm9iamVjdFwiPT10eXBlb2Ygcyl7dmFyIGw9bnVsbCE9PShyPU9iamVjdC5rZXlzKHMpWzBdKSYmdm9pZCAwIT09cj9yOlwiXCIsYz1zW2xdO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBsJiZBcnJheS5pc0FycmF5KGMpKWZvcih2YXIgcD0wLGQ9Yy5sZW5ndGg7cDxkO3ArKyl7dmFyIHU9Y1twXTtpZih1KXt2YXIgZjtpPUNlKHUsXCJNTS5kZC55eXl5XCIpOyhmPW4uZ2V0KGkpfHxbXSkuaW5jbHVkZXMobCl8fChmLnB1c2gobCksbi5zZXQoaSxmKSl9fX19cmV0dXJuIG59ZnVuY3Rpb24gdXQoZSx0KXt2b2lkIDA9PT1lJiYoZT1bXSksdm9pZCAwPT09dCYmKHQ9XCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzXCIpO3ZhciByPW5ldyBNYXA7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5kYXRlLGE9ZS5ob2xpZGF5TmFtZTtpZihJLmlzRGF0ZShuKSl7dmFyIG89Q2UobixcIk1NLmRkLnl5eXlcIikscz1yLmdldChvKXx8e2NsYXNzTmFtZTpcIlwiLGhvbGlkYXlOYW1lczpbXX07aWYoIShcImNsYXNzTmFtZVwiaW4gcyl8fHMuY2xhc3NOYW1lIT09dHx8KGk9cy5ob2xpZGF5TmFtZXMsbD1bYV0saS5sZW5ndGghPT1sLmxlbmd0aHx8IWkuZXZlcnkoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT1sW3RdfSkpKSl7dmFyIGksbDtzLmNsYXNzTmFtZT10O3ZhciBjPXMuaG9saWRheU5hbWVzO3MuaG9saWRheU5hbWVzPWM/eWUoeWUoW10sYywhMCksW2FdLCExKTpbYV0sci5zZXQobyxzKX19fSkpLHJ9ZnVuY3Rpb24gZnQoZSx0LHIsbixhKXtmb3IodmFyIGk9YS5sZW5ndGgsbD1bXSxwPTA7cDxpO3ArKyl7dmFyIGQ9ZSx1PWFbcF07dSYmKGQ9by5hZGRIb3VycyhkLGIuZ2V0SG91cnModSkpLGQ9cy5hZGRNaW51dGVzKGQsXy5nZXRNaW51dGVzKHUpKSxkPWMuYWRkU2Vjb25kcyhkLFkuZ2V0U2Vjb25kcyh1KSkpO3ZhciBmPXMuYWRkTWludXRlcyhlLChyKzEpKm4pO04uaXNBZnRlcihkLHQpJiZPLmlzQmVmb3JlKGQsZikmJm51bGwhPXUmJmwucHVzaCh1KX1yZXR1cm4gbH1mdW5jdGlvbiBodChlKXtyZXR1cm4gZTwxMD9cIjBcIi5jb25jYXQoZSk6XCJcIi5jb25jYXQoZSl9ZnVuY3Rpb24gbXQoZSx0KXt2b2lkIDA9PT10JiYodD1TZSk7dmFyIHI9TWF0aC5jZWlsKHguZ2V0WWVhcihlKS90KSp0O3JldHVybntzdGFydFBlcmlvZDpyLSh0LTEpLGVuZFBlcmlvZDpyfX1mdW5jdGlvbiB2dChlKXt2YXIgdD1lLmdldFNlY29uZHMoKSxyPWUuZ2V0TWlsbGlzZWNvbmRzKCk7cmV0dXJuIGxlLnRvRGF0ZShlLmdldFRpbWUoKS0xZTMqdC1yKX1mdW5jdGlvbiBndChlKXtpZighSS5pc0RhdGUoZSkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRlXCIpO3ZhciB0PW5ldyBEYXRlKGUpO3JldHVybiB0LnNldEhvdXJzKDAsMCwwLDApLHR9ZnVuY3Rpb24geXQoZSx0KXtpZighSS5pc0RhdGUoZSl8fCFJLmlzRGF0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRhdGUgcmVjZWl2ZWRcIik7dmFyIHI9Z3QoZSksbj1ndCh0KTtyZXR1cm4gTy5pc0JlZm9yZShyLG4pfWZ1bmN0aW9uIER0KGUpe3JldHVybiBlLmtleT09PURlLlNwYWNlfXZhciBrdCx3dD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLm9uVGltZUNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdCxyO24uc2V0U3RhdGUoe3RpbWU6ZX0pO3ZhciBhPW4ucHJvcHMuZGF0ZSxvPWEgaW5zdGFuY2VvZiBEYXRlJiYhaXNOYU4oK2EpP2E6bmV3IERhdGU7aWYobnVsbD09ZT92b2lkIDA6ZS5pbmNsdWRlcyhcIjpcIikpe3ZhciBzPWUuc3BsaXQoXCI6XCIpLGk9c1swXSxsPXNbMV07by5zZXRIb3VycyhOdW1iZXIoaSkpLG8uc2V0TWludXRlcyhOdW1iZXIobCkpfW51bGw9PT0ocj0odD1uLnByb3BzKS5vbkNoYW5nZSl8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LG8pfSxuLnJlbmRlclRpbWVJbnB1dD1mdW5jdGlvbigpe3ZhciBlPW4uc3RhdGUudGltZSx0PW4ucHJvcHMsYT10LmRhdGUsbz10LnRpbWVTdHJpbmcscz10LmN1c3RvbVRpbWVJbnB1dDtyZXR1cm4gcz9yLmNsb25lRWxlbWVudChzLHtkYXRlOmEsdmFsdWU6ZSxvbkNoYW5nZTpuLm9uVGltZUNoYW5nZX0pOnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlucHV0XCIse3R5cGU6XCJ0aW1lXCIsY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dFwiLHBsYWNlaG9sZGVyOlwiVGltZVwiLG5hbWU6XCJ0aW1lLWlucHV0XCIscmVxdWlyZWQ6ITAsdmFsdWU6ZSxvbkNoYW5nZTpmdW5jdGlvbihlKXtuLm9uVGltZUNoYW5nZShlLnRhcmdldC52YWx1ZXx8byl9fSl9LG4uc3RhdGU9e3RpbWU6bi5wcm9wcy50aW1lU3RyaW5nfSxufXJldHVybiB2ZSh0LGUpLHQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudGltZVN0cmluZyE9PXQudGltZT97dGltZTplLnRpbWVTdHJpbmd9Om51bGx9LHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXJcIn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXItdGltZV9fY2FwdGlvblwifSx0aGlzLnByb3BzLnRpbWVJbnB1dExhYmVsKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXJcIn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXRcIn0sdGhpcy5yZW5kZXJUaW1lSW5wdXQoKSkpKX0sdH0oci5Db21wb25lbnQpLFN0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4uZGF5RWw9ci5jcmVhdGVSZWYoKSxuLmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGUpeyFuLmlzRGlzYWJsZWQoKSYmbi5wcm9wcy5vbkNsaWNrJiZuLnByb3BzLm9uQ2xpY2soZSl9LG4uaGFuZGxlTW91c2VFbnRlcj1mdW5jdGlvbihlKXshbi5pc0Rpc2FibGVkKCkmJm4ucHJvcHMub25Nb3VzZUVudGVyJiZuLnByb3BzLm9uTW91c2VFbnRlcihlKX0sbi5oYW5kbGVPbktleURvd249ZnVuY3Rpb24oZSl7dmFyIHQscjtlLmtleT09PURlLlNwYWNlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUua2V5PURlLkVudGVyKSxudWxsPT09KHI9KHQ9bi5wcm9wcykuaGFuZGxlT25LZXlEb3duKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSl9LG4uaXNTYW1lRGF5PWZ1bmN0aW9uKGUpe3JldHVybiBIZShuLnByb3BzLmRheSxlKX0sbi5pc0tleWJvYXJkU2VsZWN0ZWQ9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4hbi5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbiYmKCEobi5wcm9wcy5zZWxlY3RzTXVsdGlwbGU/bnVsbD09PShlPW4ucHJvcHMuc2VsZWN0ZWREYXRlcyl8fHZvaWQgMD09PWU/dm9pZCAwOmUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIG4uaXNTYW1lRGF5T3JXZWVrKGUpfSkpOm4uaXNTYW1lRGF5T3JXZWVrKG4ucHJvcHMuc2VsZWN0ZWQpKSYmbi5pc1NhbWVEYXlPcldlZWsobi5wcm9wcy5wcmVTZWxlY3Rpb24pKX0sbi5pc0Rpc2FibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIGplKG4ucHJvcHMuZGF5LHttaW5EYXRlOm4ucHJvcHMubWluRGF0ZSxtYXhEYXRlOm4ucHJvcHMubWF4RGF0ZSxleGNsdWRlRGF0ZXM6bi5wcm9wcy5leGNsdWRlRGF0ZXMsZXhjbHVkZURhdGVJbnRlcnZhbHM6bi5wcm9wcy5leGNsdWRlRGF0ZUludGVydmFscyxpbmNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmluY2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlczpuLnByb3BzLmluY2x1ZGVEYXRlcyxmaWx0ZXJEYXRlOm4ucHJvcHMuZmlsdGVyRGF0ZX0pfSxuLmlzRXhjbHVkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gVWUobi5wcm9wcy5kYXkse2V4Y2x1ZGVEYXRlczpuLnByb3BzLmV4Y2x1ZGVEYXRlcyxleGNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzfSl9LG4uaXNTdGFydE9mV2Vlaz1mdW5jdGlvbigpe3JldHVybiBIZShuLnByb3BzLmRheSx4ZShuLnByb3BzLmRheSxuLnByb3BzLmxvY2FsZSxuLnByb3BzLmNhbGVuZGFyU3RhcnREYXkpKX0sbi5pc1NhbWVXZWVrPWZ1bmN0aW9uKGUpe3JldHVybiBuLnByb3BzLnNob3dXZWVrUGlja2VyJiZIZShlLHhlKG4ucHJvcHMuZGF5LG4ucHJvcHMubG9jYWxlLG4ucHJvcHMuY2FsZW5kYXJTdGFydERheSkpfSxuLmlzU2FtZURheU9yV2Vlaz1mdW5jdGlvbihlKXtyZXR1cm4gbi5pc1NhbWVEYXkoZSl8fG4uaXNTYW1lV2VlayhlKX0sbi5nZXRIaWdoTGlnaHRlZENsYXNzPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5oaWdobGlnaHREYXRlcztpZighcilyZXR1cm4hMTt2YXIgYT1DZSh0LFwiTU0uZGQueXl5eVwiKTtyZXR1cm4gci5nZXQoYSl9LG4uZ2V0SG9saWRheXNDbGFzcz1mdW5jdGlvbigpe3ZhciBlLHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5ob2xpZGF5cztpZighYSlyZXR1cm5bdm9pZCAwXTt2YXIgbz1DZShyLFwiTU0uZGQueXl5eVwiKTtyZXR1cm4gYS5oYXMobyk/W251bGw9PT0oZT1hLmdldChvKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuY2xhc3NOYW1lXTpbdm9pZCAwXX0sbi5pc0luUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLnN0YXJ0RGF0ZSxhPWUuZW5kRGF0ZTtyZXR1cm4hKCFyfHwhYSkmJlFlKHQscixhKX0sbi5pc0luU2VsZWN0aW5nUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgZSx0PW4ucHJvcHMscj10LmRheSxhPXQuc2VsZWN0c1N0YXJ0LG89dC5zZWxlY3RzRW5kLHM9dC5zZWxlY3RzUmFuZ2UsaT10LnNlbGVjdHNEaXNhYmxlZERheXNJblJhbmdlLGw9dC5zdGFydERhdGUsYz10LmVuZERhdGUscD1udWxsIT09KGU9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09ZT9lOm4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiEoIShhfHxvfHxzKXx8IXB8fCFpJiZuLmlzRGlzYWJsZWQoKSkmJihhJiZjJiYoTy5pc0JlZm9yZShwLGMpfHxXZShwLGMpKT9RZShyLHAsYyk6KG8mJmwmJihOLmlzQWZ0ZXIocCxsKXx8V2UocCxsKSl8fCEoIXN8fCFsfHxjfHwhTi5pc0FmdGVyKHAsbCkmJiFXZShwLGwpKSkmJlFlKHIsbCxwKSl9LG4uaXNTZWxlY3RpbmdSYW5nZVN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGU7aWYoIW4uaXNJblNlbGVjdGluZ1JhbmdlKCkpcmV0dXJuITE7dmFyIHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5zdGFydERhdGUsbz10LnNlbGVjdHNTdGFydCxzPW51bGwhPT0oZT1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT1lP2U6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuIEhlKHIsbz9zOmEpfSxuLmlzU2VsZWN0aW5nUmFuZ2VFbmQ9ZnVuY3Rpb24oKXt2YXIgZTtpZighbi5pc0luU2VsZWN0aW5nUmFuZ2UoKSlyZXR1cm4hMTt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LmVuZERhdGUsbz10LnNlbGVjdHNFbmQscz10LnNlbGVjdHNSYW5nZSxpPW51bGwhPT0oZT1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT1lP2U6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuIEhlKHIsb3x8cz9pOmEpfSxuLmlzUmFuZ2VTdGFydD1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuc3RhcnREYXRlLGE9ZS5lbmREYXRlO3JldHVybiEoIXJ8fCFhKSYmSGUocix0KX0sbi5pc1JhbmdlRW5kPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5zdGFydERhdGUsYT1lLmVuZERhdGU7cmV0dXJuISghcnx8IWEpJiZIZShhLHQpfSxuLmlzV2Vla2VuZD1mdW5jdGlvbigpe3ZhciBlPVMuZ2V0RGF5KG4ucHJvcHMuZGF5KTtyZXR1cm4gMD09PWV8fDY9PT1lfSxuLmlzQWZ0ZXJNb250aD1mdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT1uLnByb3BzLm1vbnRoJiYobi5wcm9wcy5tb250aCsxKSUxMj09PUMuZ2V0TW9udGgobi5wcm9wcy5kYXkpfSxuLmlzQmVmb3JlTW9udGg9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09bi5wcm9wcy5tb250aCYmKEMuZ2V0TW9udGgobi5wcm9wcy5kYXkpKzEpJTEyPT09bi5wcm9wcy5tb250aH0sbi5pc0N1cnJlbnREYXk9ZnVuY3Rpb24oKXtyZXR1cm4gbi5pc1NhbWVEYXkoTWUoKSl9LG4uaXNTZWxlY3RlZD1mdW5jdGlvbigpe3ZhciBlO3JldHVybiBuLnByb3BzLnNlbGVjdHNNdWx0aXBsZT9udWxsPT09KGU9bi5wcm9wcy5zZWxlY3RlZERhdGVzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gbi5pc1NhbWVEYXlPcldlZWsoZSl9KSk6bi5pc1NhbWVEYXlPcldlZWsobi5wcm9wcy5zZWxlY3RlZCl9LG4uZ2V0Q2xhc3NOYW1lcz1mdW5jdGlvbihlKXt2YXIgcixhPW4ucHJvcHMuZGF5Q2xhc3NOYW1lP24ucHJvcHMuZGF5Q2xhc3NOYW1lKGUpOnZvaWQgMDtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5XCIsYSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tXCIrQ2Uobi5wcm9wcy5kYXksXCJkZGRcIixyKSx7XCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkXCI6bi5pc0Rpc2FibGVkKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWV4Y2x1ZGVkXCI6bi5pc0V4Y2x1ZGVkKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkXCI6bi5pc1NlbGVjdGVkKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWtleWJvYXJkLXNlbGVjdGVkXCI6bi5pc0tleWJvYXJkU2VsZWN0ZWQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tcmFuZ2Utc3RhcnRcIjpuLmlzUmFuZ2VTdGFydCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1yYW5nZS1lbmRcIjpuLmlzUmFuZ2VFbmQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2VcIjpuLmlzSW5SYW5nZSgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2VcIjpuLmlzSW5TZWxlY3RpbmdSYW5nZSgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RpbmctcmFuZ2Utc3RhcnRcIjpuLmlzU2VsZWN0aW5nUmFuZ2VTdGFydCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RpbmctcmFuZ2UtZW5kXCI6bi5pc1NlbGVjdGluZ1JhbmdlRW5kKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXRvZGF5XCI6bi5pc0N1cnJlbnREYXkoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0td2Vla2VuZFwiOm4uaXNXZWVrZW5kKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLW91dHNpZGUtbW9udGhcIjpuLmlzQWZ0ZXJNb250aCgpfHxuLmlzQmVmb3JlTW9udGgoKX0sbi5nZXRIaWdoTGlnaHRlZENsYXNzKCksbi5nZXRIb2xpZGF5c0NsYXNzKCkpfSxuLmdldEFyaWFMYWJlbD1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuYXJpYUxhYmVsUHJlZml4V2hlbkVuYWJsZWQsYT12b2lkIDA9PT1yP1wiQ2hvb3NlXCI6cixvPWUuYXJpYUxhYmVsUHJlZml4V2hlbkRpc2FibGVkLHM9dm9pZCAwPT09bz9cIk5vdCBhdmFpbGFibGVcIjpvLGk9bi5pc0Rpc2FibGVkKCl8fG4uaXNFeGNsdWRlZCgpP3M6YTtyZXR1cm5cIlwiLmNvbmNhdChpLFwiIFwiKS5jb25jYXQoQ2UodCxcIlBQUFBcIixuLnByb3BzLmxvY2FsZSkpfSxuLmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5ob2xpZGF5cyxhPXZvaWQgMD09PXI/bmV3IE1hcDpyLG89ZS5leGNsdWRlRGF0ZXMscz1DZSh0LFwiTU0uZGQueXl5eVwiKSxpPVtdO3JldHVybiBhLmhhcyhzKSYmaS5wdXNoLmFwcGx5KGksYS5nZXQocykuaG9saWRheU5hbWVzKSxuLmlzRXhjbHVkZWQoKSYmaS5wdXNoKG51bGw9PW8/dm9pZCAwOm8uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIERhdGU/SGUoZSx0KTpIZShudWxsPT1lP3ZvaWQgMDplLmRhdGUsdCl9KSkubWFwKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBEYXRlKSlyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlfSkpKSxpLmpvaW4oXCIsIFwiKX0sbi5nZXRUYWJJbmRleD1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMuc2VsZWN0ZWQsdD1uLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4oIW4ucHJvcHMuc2hvd1dlZWtQaWNrZXJ8fCFuLnByb3BzLnNob3dXZWVrTnVtYmVyJiZuLmlzU3RhcnRPZldlZWsoKSkmJihuLmlzS2V5Ym9hcmRTZWxlY3RlZCgpfHxuLmlzU2FtZURheShlKSYmSGUodCxlKSk/MDotMX0sbi5oYW5kbGVGb2N1c0RheT1mdW5jdGlvbigpe3ZhciBlO24uc2hvdWxkRm9jdXNEYXkoKSYmKG51bGw9PT0oZT1uLmRheUVsLmN1cnJlbnQpfHx2b2lkIDA9PT1lfHxlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSkpfSxuLnJlbmRlckRheUNvbnRlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIG4ucHJvcHMubW9udGhTaG93c0R1cGxpY2F0ZURheXNFbmQmJm4uaXNBZnRlck1vbnRoKCl8fG4ucHJvcHMubW9udGhTaG93c0R1cGxpY2F0ZURheXNTdGFydCYmbi5pc0JlZm9yZU1vbnRoKCk/bnVsbDpuLnByb3BzLnJlbmRlckRheUNvbnRlbnRzP24ucHJvcHMucmVuZGVyRGF5Q29udGVudHMody5nZXREYXRlKG4ucHJvcHMuZGF5KSxuLnByb3BzLmRheSk6dy5nZXREYXRlKG4ucHJvcHMuZGF5KX0sbi5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse3JlZjpuLmRheUVsLGNsYXNzTmFtZTpuLmdldENsYXNzTmFtZXMobi5wcm9wcy5kYXkpLG9uS2V5RG93bjpuLmhhbmRsZU9uS2V5RG93bixvbkNsaWNrOm4uaGFuZGxlQ2xpY2ssb25Nb3VzZUVudGVyOm4ucHJvcHMudXNlUG9pbnRlckV2ZW50P3ZvaWQgMDpuLmhhbmRsZU1vdXNlRW50ZXIsb25Qb2ludGVyRW50ZXI6bi5wcm9wcy51c2VQb2ludGVyRXZlbnQ/bi5oYW5kbGVNb3VzZUVudGVyOnZvaWQgMCx0YWJJbmRleDpuLmdldFRhYkluZGV4KCksXCJhcmlhLWxhYmVsXCI6bi5nZXRBcmlhTGFiZWwoKSxyb2xlOlwib3B0aW9uXCIsdGl0bGU6bi5nZXRUaXRsZSgpLFwiYXJpYS1kaXNhYmxlZFwiOm4uaXNEaXNhYmxlZCgpLFwiYXJpYS1jdXJyZW50XCI6bi5pc0N1cnJlbnREYXkoKT9cImRhdGVcIjp2b2lkIDAsXCJhcmlhLXNlbGVjdGVkXCI6bi5pc1NlbGVjdGVkKCl8fG4uaXNJblJhbmdlKCl9LG4ucmVuZGVyRGF5Q29udGVudHMoKSxcIlwiIT09bi5nZXRUaXRsZSgpJiZ1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcIm92ZXJsYXlcIn0sbi5nZXRUaXRsZSgpKSl9LG59cmV0dXJuIHZlKG4sZSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZUZvY3VzRGF5KCl9LG4ucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuaGFuZGxlRm9jdXNEYXkoKX0sbi5wcm90b3R5cGUuc2hvdWxkRm9jdXNEYXk9ZnVuY3Rpb24oKXt2YXIgZT0hMTtyZXR1cm4gMD09PXRoaXMuZ2V0VGFiSW5kZXgoKSYmdGhpcy5pc1NhbWVEYXkodGhpcy5wcm9wcy5wcmVTZWxlY3Rpb24pJiYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWRvY3VtZW50LmJvZHl8fChlPSEwKSx0aGlzLnByb3BzLmlubGluZSYmIXRoaXMucHJvcHMuc2hvdWxkRm9jdXNEYXlJbmxpbmUmJihlPSExKSx0aGlzLmlzRGF5QWN0aXZlRWxlbWVudCgpJiYoZT0hMCksdGhpcy5pc0R1cGxpY2F0ZURheSgpJiYoZT0hMSkpLGV9LG4ucHJvdG90eXBlLmlzRGF5QWN0aXZlRWxlbWVudD1mdW5jdGlvbigpe3ZhciBlLHQscjtyZXR1cm4obnVsbD09PSh0PW51bGw9PT0oZT10aGlzLnByb3BzLmNvbnRhaW5lclJlZil8fHZvaWQgMD09PWU/dm9pZCAwOmUuY3VycmVudCl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpJiYobnVsbD09PShyPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmNsYXNzTGlzdC5jb250YWlucyhcInJlYWN0LWRhdGVwaWNrZXJfX2RheVwiKSl9LG4ucHJvdG90eXBlLmlzRHVwbGljYXRlRGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcHMubW9udGhTaG93c0R1cGxpY2F0ZURheXNFbmQmJnRoaXMuaXNBZnRlck1vbnRoKCl8fHRoaXMucHJvcHMubW9udGhTaG93c0R1cGxpY2F0ZURheXNTdGFydCYmdGhpcy5pc0JlZm9yZU1vbnRoKCl9LG59KHIuQ29tcG9uZW50KSxidD1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LndlZWtOdW1iZXJFbD1yLmNyZWF0ZVJlZigpLHQuaGFuZGxlQ2xpY2s9ZnVuY3Rpb24oZSl7dC5wcm9wcy5vbkNsaWNrJiZ0LnByb3BzLm9uQ2xpY2soZSl9LHQuaGFuZGxlT25LZXlEb3duPWZ1bmN0aW9uKGUpe3ZhciByLG47ZS5rZXk9PT1EZS5TcGFjZSYmKGUucHJldmVudERlZmF1bHQoKSxlLmtleT1EZS5FbnRlciksbnVsbD09PShuPShyPXQucHJvcHMpLmhhbmRsZU9uS2V5RG93bil8fHZvaWQgMD09PW58fG4uY2FsbChyLGUpfSx0LmlzS2V5Ym9hcmRTZWxlY3RlZD1mdW5jdGlvbigpe3JldHVybiF0LnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uJiYhSGUodC5wcm9wcy5kYXRlLHQucHJvcHMuc2VsZWN0ZWQpJiZIZSh0LnByb3BzLmRhdGUsdC5wcm9wcy5wcmVTZWxlY3Rpb24pfSx0LmdldFRhYkluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvcHMuc2hvd1dlZWtQaWNrZXImJnQucHJvcHMuc2hvd1dlZWtOdW1iZXImJih0LmlzS2V5Ym9hcmRTZWxlY3RlZCgpfHxIZSh0LnByb3BzLmRhdGUsdC5wcm9wcy5zZWxlY3RlZCkmJkhlKHQucHJvcHMucHJlU2VsZWN0aW9uLHQucHJvcHMuc2VsZWN0ZWQpKT8wOi0xfSx0LmhhbmRsZUZvY3VzV2Vla051bWJlcj1mdW5jdGlvbihlKXt2YXIgcj0hMTswPT09dC5nZXRUYWJJbmRleCgpJiYhKG51bGw9PWU/dm9pZCAwOmUuaXNJbnB1dEZvY3VzZWQpJiZIZSh0LnByb3BzLmRhdGUsdC5wcm9wcy5wcmVTZWxlY3Rpb24pJiYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWRvY3VtZW50LmJvZHl8fChyPSEwKSx0LnByb3BzLmlubGluZSYmIXQucHJvcHMuc2hvdWxkRm9jdXNEYXlJbmxpbmUmJihyPSExKSx0LnByb3BzLmNvbnRhaW5lclJlZiYmdC5wcm9wcy5jb250YWluZXJSZWYuY3VycmVudCYmdC5wcm9wcy5jb250YWluZXJSZWYuY3VycmVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlclwiKSYmKHI9ITApKSxyJiZ0LndlZWtOdW1iZXJFbC5jdXJyZW50JiZ0LndlZWtOdW1iZXJFbC5jdXJyZW50LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9LHR9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FyaWFMYWJlbFByZWZpeDpcIndlZWsgXCJ9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLG4ucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVGb2N1c1dlZWtOdW1iZXIoKX0sbi5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlRm9jdXNXZWVrTnVtYmVyKGUpfSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHI9ZS53ZWVrTnVtYmVyLGE9ZS5hcmlhTGFiZWxQcmVmaXgsbz12b2lkIDA9PT1hP24uZGVmYXVsdFByb3BzLmFyaWFMYWJlbFByZWZpeDphLHM9ZS5vbkNsaWNrLGk9e1wicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXJcIjohMCxcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1jbGlja2FibGVcIjohIXMsXCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tc2VsZWN0ZWRcIjohIXMmJkhlKHRoaXMucHJvcHMuZGF0ZSx0aGlzLnByb3BzLnNlbGVjdGVkKSxcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZFwiOnRoaXMuaXNLZXlib2FyZFNlbGVjdGVkKCl9O3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOnRoaXMud2Vla051bWJlckVsLGNsYXNzTmFtZTp0LmNsc3goaSksXCJhcmlhLWxhYmVsXCI6XCJcIi5jb25jYXQobyxcIiBcIikuY29uY2F0KHRoaXMucHJvcHMud2Vla051bWJlciksb25DbGljazp0aGlzLmhhbmRsZUNsaWNrLG9uS2V5RG93bjp0aGlzLmhhbmRsZU9uS2V5RG93bix0YWJJbmRleDp0aGlzLmdldFRhYkluZGV4KCl9LHIpfSxufShyLkNvbXBvbmVudCksTXQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcigpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC5pc0Rpc2FibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBqZShlLHttaW5EYXRlOnQucHJvcHMubWluRGF0ZSxtYXhEYXRlOnQucHJvcHMubWF4RGF0ZSxleGNsdWRlRGF0ZXM6dC5wcm9wcy5leGNsdWRlRGF0ZXMsZXhjbHVkZURhdGVJbnRlcnZhbHM6dC5wcm9wcy5leGNsdWRlRGF0ZUludGVydmFscyxpbmNsdWRlRGF0ZUludGVydmFsczp0LnByb3BzLmluY2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlczp0LnByb3BzLmluY2x1ZGVEYXRlcyxmaWx0ZXJEYXRlOnQucHJvcHMuZmlsdGVyRGF0ZX0pfSx0LmhhbmRsZURheUNsaWNrPWZ1bmN0aW9uKGUscil7dC5wcm9wcy5vbkRheUNsaWNrJiZ0LnByb3BzLm9uRGF5Q2xpY2soZSxyKX0sdC5oYW5kbGVEYXlNb3VzZUVudGVyPWZ1bmN0aW9uKGUpe3QucHJvcHMub25EYXlNb3VzZUVudGVyJiZ0LnByb3BzLm9uRGF5TW91c2VFbnRlcihlKX0sdC5oYW5kbGVXZWVrQ2xpY2s9ZnVuY3Rpb24oZSxuLGEpe2Zvcih2YXIgbyxzLGksbD1uZXcgRGF0ZShlKSxjPTA7Yzw3O2MrKyl7dmFyIHA9bmV3IERhdGUoZSk7aWYocC5zZXREYXRlKHAuZ2V0RGF0ZSgpK2MpLCF0LmlzRGlzYWJsZWQocCkpe2w9cDticmVha319XCJmdW5jdGlvblwiPT10eXBlb2YgdC5wcm9wcy5vbldlZWtTZWxlY3QmJnQucHJvcHMub25XZWVrU2VsZWN0KGwsbixhKSx0LnByb3BzLnNob3dXZWVrUGlja2VyJiZ0LmhhbmRsZURheUNsaWNrKGwsYSksKG51bGwhPT0obz10LnByb3BzLnNob3VsZENsb3NlT25TZWxlY3QpJiZ2b2lkIDAhPT1vP286ci5kZWZhdWx0UHJvcHMuc2hvdWxkQ2xvc2VPblNlbGVjdCkmJihudWxsPT09KGk9KHM9dC5wcm9wcykuc2V0T3Blbil8fHZvaWQgMD09PWl8fGkuY2FsbChzLCExKSl9LHQuZm9ybWF0V2Vla051bWJlcj1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm9wcy5mb3JtYXRXZWVrTnVtYmVyP3QucHJvcHMuZm9ybWF0V2Vla051bWJlcihlKTpmdW5jdGlvbihlKXtyZXR1cm4gTS5nZXRJU09XZWVrKGUpfShlKX0sdC5yZW5kZXJEYXlzPWZ1bmN0aW9uKCl7dmFyIGU9dC5zdGFydE9mV2VlaygpLG49W10sbz10LmZvcm1hdFdlZWtOdW1iZXIoZSk7aWYodC5wcm9wcy5zaG93V2Vla051bWJlcil7dmFyIHM9dC5wcm9wcy5vbldlZWtTZWxlY3R8fHQucHJvcHMuc2hvd1dlZWtQaWNrZXI/dC5oYW5kbGVXZWVrQ2xpY2suYmluZCh0LGUsbyk6dm9pZCAwO24ucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYnQsZ2Uoe2tleTpcIldcIn0sci5kZWZhdWx0UHJvcHMsdC5wcm9wcyx7d2Vla051bWJlcjpvLGRhdGU6ZSxvbkNsaWNrOnN9KSkpfXJldHVybiBuLmNvbmNhdChbMCwxLDIsMyw0LDUsNl0ubWFwKChmdW5jdGlvbihuKXt2YXIgbz1hLmFkZERheXMoZSxuKTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFN0LGdlKHt9LHIuZGVmYXVsdFByb3BzLHQucHJvcHMse2FyaWFMYWJlbFByZWZpeFdoZW5FbmFibGVkOnQucHJvcHMuY2hvb3NlRGF5QXJpYUxhYmVsUHJlZml4LGFyaWFMYWJlbFByZWZpeFdoZW5EaXNhYmxlZDp0LnByb3BzLmRpc2FibGVkRGF5QXJpYUxhYmVsUHJlZml4LGtleTpvLnZhbHVlT2YoKSxkYXk6byxvbkNsaWNrOnQuaGFuZGxlRGF5Q2xpY2suYmluZCh0LG8pLG9uTW91c2VFbnRlcjp0LmhhbmRsZURheU1vdXNlRW50ZXIuYmluZCh0LG8pfSkpfSkpKX0sdC5zdGFydE9mV2Vlaz1mdW5jdGlvbigpe3JldHVybiB4ZSh0LnByb3BzLmRheSx0LnByb3BzLmxvY2FsZSx0LnByb3BzLmNhbGVuZGFyU3RhcnREYXkpfSx0LmlzS2V5Ym9hcmRTZWxlY3RlZD1mdW5jdGlvbigpe3JldHVybiF0LnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uJiYhSGUodC5zdGFydE9mV2VlaygpLHQucHJvcHMuc2VsZWN0ZWQpJiZIZSh0LnN0YXJ0T2ZXZWVrKCksdC5wcm9wcy5wcmVTZWxlY3Rpb24pfSx0fXJldHVybiB2ZShyLGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLFwiZGVmYXVsdFByb3BzXCIse2dldDpmdW5jdGlvbigpe3JldHVybntzaG91bGRDbG9zZU9uU2VsZWN0OiEwfX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT17XCJyZWFjdC1kYXRlcGlja2VyX193ZWVrXCI6ITAsXCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLS1zZWxlY3RlZFwiOkhlKHRoaXMuc3RhcnRPZldlZWsoKSx0aGlzLnByb3BzLnNlbGVjdGVkKSxcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstLWtleWJvYXJkLXNlbGVjdGVkXCI6dGhpcy5pc0tleWJvYXJkU2VsZWN0ZWQoKX07cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6dC5jbHN4KGUpfSx0aGlzLnJlbmRlckRheXMoKSl9LHJ9KHIuQ29tcG9uZW50KSxfdD1cInR3b19jb2x1bW5zXCIsQ3Q9XCJ0aHJlZV9jb2x1bW5zXCIsRXQ9XCJmb3VyX2NvbHVtbnNcIixZdD0oKGt0PXt9KVtfdF09e2dyaWQ6W1swLDFdLFsyLDNdLFs0LDVdLFs2LDddLFs4LDldLFsxMCwxMV1dLHZlcnRpY2FsTmF2aWdhdGlvbk9mZnNldDoyfSxrdFtDdF09e2dyaWQ6W1swLDEsMl0sWzMsNCw1XSxbNiw3LDhdLFs5LDEwLDExXV0sdmVydGljYWxOYXZpZ2F0aW9uT2Zmc2V0OjN9LGt0W0V0XT17Z3JpZDpbWzAsMSwyLDNdLFs0LDUsNiw3XSxbOCw5LDEwLDExXV0sdmVydGljYWxOYXZpZ2F0aW9uT2Zmc2V0OjR9LGt0KTtmdW5jdGlvbiBQdChlLHQpe3JldHVybiBlP0V0OnQ/X3Q6Q3R9dmFyIHh0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4uTU9OVEhfUkVGUz15ZShbXSxBcnJheSgxMiksITApLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gci5jcmVhdGVSZWYoKX0pKSxuLlFVQVJURVJfUkVGUz15ZShbXSxBcnJheSg0KSwhMCkubWFwKChmdW5jdGlvbigpe3JldHVybiByLmNyZWF0ZVJlZigpfSkpLG4uaXNEaXNhYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gamUoZSx7bWluRGF0ZTpuLnByb3BzLm1pbkRhdGUsbWF4RGF0ZTpuLnByb3BzLm1heERhdGUsZXhjbHVkZURhdGVzOm4ucHJvcHMuZXhjbHVkZURhdGVzLGV4Y2x1ZGVEYXRlSW50ZXJ2YWxzOm4ucHJvcHMuZXhjbHVkZURhdGVJbnRlcnZhbHMsaW5jbHVkZURhdGVJbnRlcnZhbHM6bi5wcm9wcy5pbmNsdWRlRGF0ZUludGVydmFscyxpbmNsdWRlRGF0ZXM6bi5wcm9wcy5pbmNsdWRlRGF0ZXMsZmlsdGVyRGF0ZTpuLnByb3BzLmZpbHRlckRhdGV9KX0sbi5pc0V4Y2x1ZGVkPWZ1bmN0aW9uKGUpe3JldHVybiBVZShlLHtleGNsdWRlRGF0ZXM6bi5wcm9wcy5leGNsdWRlRGF0ZXMsZXhjbHVkZURhdGVJbnRlcnZhbHM6bi5wcm9wcy5leGNsdWRlRGF0ZUludGVydmFsc30pfSxuLmhhbmRsZURheUNsaWNrPWZ1bmN0aW9uKGUsdCl7dmFyIHIsYTtudWxsPT09KGE9KHI9bi5wcm9wcykub25EYXlDbGljayl8fHZvaWQgMD09PWF8fGEuY2FsbChyLGUsdCxuLnByb3BzLm9yZGVySW5EaXNwbGF5KX0sbi5oYW5kbGVEYXlNb3VzZUVudGVyPWZ1bmN0aW9uKGUpe3ZhciB0LHI7bnVsbD09PShyPSh0PW4ucHJvcHMpLm9uRGF5TW91c2VFbnRlcil8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpfSxuLmhhbmRsZU1vdXNlTGVhdmU9ZnVuY3Rpb24oKXt2YXIgZSx0O251bGw9PT0odD0oZT1uLnByb3BzKS5vbk1vdXNlTGVhdmUpfHx2b2lkIDA9PT10fHx0LmNhbGwoZSl9LG4uaXNSYW5nZVN0YXJ0TW9udGg9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5zdGFydERhdGUsbz10LmVuZERhdGU7cmV0dXJuISghYXx8IW8pJiZBZSgkLnNldE1vbnRoKHIsZSksYSl9LG4uaXNSYW5nZVN0YXJ0UXVhcnRlcj1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LnN0YXJ0RGF0ZSxvPXQuZW5kRGF0ZTtyZXR1cm4hKCFhfHwhbykmJkZlKHouc2V0UXVhcnRlcihyLGUpLGEpfSxuLmlzUmFuZ2VFbmRNb250aD1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LnN0YXJ0RGF0ZSxvPXQuZW5kRGF0ZTtyZXR1cm4hKCFhfHwhbykmJkFlKCQuc2V0TW9udGgocixlKSxvKX0sbi5pc1JhbmdlRW5kUXVhcnRlcj1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LnN0YXJ0RGF0ZSxvPXQuZW5kRGF0ZTtyZXR1cm4hKCFhfHwhbykmJkZlKHouc2V0UXVhcnRlcihyLGUpLG8pfSxuLmlzSW5TZWxlY3RpbmdSYW5nZU1vbnRoPWZ1bmN0aW9uKGUpe3ZhciB0LHI9bi5wcm9wcyxhPXIuZGF5LG89ci5zZWxlY3RzU3RhcnQscz1yLnNlbGVjdHNFbmQsaT1yLnNlbGVjdHNSYW5nZSxsPXIuc3RhcnREYXRlLGM9ci5lbmREYXRlLHA9bnVsbCE9PSh0PW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PXQ/dDpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4hKCEob3x8c3x8aSl8fCFwKSYmKG8mJmM/emUocCxjLGUsYSk6KHMmJmx8fCEoIWl8fCFsfHxjKSkmJnplKGwscCxlLGEpKX0sbi5pc1NlbGVjdGluZ01vbnRoUmFuZ2VTdGFydD1mdW5jdGlvbihlKXt2YXIgdDtpZighbi5pc0luU2VsZWN0aW5nUmFuZ2VNb250aChlKSlyZXR1cm4hMTt2YXIgcj1uLnByb3BzLGE9ci5kYXksbz1yLnN0YXJ0RGF0ZSxzPXIuc2VsZWN0c1N0YXJ0LGk9JC5zZXRNb250aChhLGUpLGw9bnVsbCE9PSh0PW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PXQ/dDpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4gQWUoaSxzP2w6byl9LG4uaXNTZWxlY3RpbmdNb250aFJhbmdlRW5kPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFuLmlzSW5TZWxlY3RpbmdSYW5nZU1vbnRoKGUpKXJldHVybiExO3ZhciByPW4ucHJvcHMsYT1yLmRheSxvPXIuZW5kRGF0ZSxzPXIuc2VsZWN0c0VuZCxpPXIuc2VsZWN0c1JhbmdlLGw9JC5zZXRNb250aChhLGUpLGM9bnVsbCE9PSh0PW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PXQ/dDpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4gQWUobCxzfHxpP2M6byl9LG4uaXNJblNlbGVjdGluZ1JhbmdlUXVhcnRlcj1mdW5jdGlvbihlKXt2YXIgdCxyPW4ucHJvcHMsYT1yLmRheSxvPXIuc2VsZWN0c1N0YXJ0LHM9ci5zZWxlY3RzRW5kLGk9ci5zZWxlY3RzUmFuZ2UsbD1yLnN0YXJ0RGF0ZSxjPXIuZW5kRGF0ZSxwPW51bGwhPT0odD1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT10P3Q6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuISghKG98fHN8fGkpfHwhcCkmJihvJiZjP2V0KHAsYyxlLGEpOihzJiZsfHwhKCFpfHwhbHx8YykpJiZldChsLHAsZSxhKSl9LG4uaXNXZWVrSW5Nb250aD1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLmRheSxyPWEuYWRkRGF5cyhlLDYpO3JldHVybiBBZShlLHQpfHxBZShyLHQpfSxuLmlzQ3VycmVudE1vbnRoPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguZ2V0WWVhcihlKT09PXguZ2V0WWVhcihNZSgpKSYmdD09PUMuZ2V0TW9udGgoTWUoKSl9LG4uaXNDdXJyZW50UXVhcnRlcj1mdW5jdGlvbihlLHQpe3JldHVybiB4LmdldFllYXIoZSk9PT14LmdldFllYXIoTWUoKSkmJnQ9PT1FLmdldFF1YXJ0ZXIoTWUoKSl9LG4uaXNTZWxlY3RlZE1vbnRoPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gQy5nZXRNb250aChyKT09PXQmJnguZ2V0WWVhcihlKT09PXguZ2V0WWVhcihyKX0sbi5pc1NlbGVjdGVkUXVhcnRlcj1mdW5jdGlvbihlLHQscil7cmV0dXJuIEUuZ2V0UXVhcnRlcihlKT09PXQmJnguZ2V0WWVhcihlKT09PXguZ2V0WWVhcihyKX0sbi5yZW5kZXJXZWVrcz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PW4ucHJvcHMuZml4ZWRIZWlnaHQscj0wLGE9ITEsbz14ZShOZShuLnByb3BzLmRheSksbi5wcm9wcy5sb2NhbGUsbi5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KSxzPW4ucHJvcHMuc2VsZWN0ZWQ/ZnVuY3Rpb24oZSl7cmV0dXJuIG4ucHJvcHMuc2hvd1dlZWtQaWNrZXI/eGUoZSxuLnByb3BzLmxvY2FsZSxuLnByb3BzLmNhbGVuZGFyU3RhcnREYXkpOm4ucHJvcHMuc2VsZWN0ZWR9KG4ucHJvcHMuc2VsZWN0ZWQpOnZvaWQgMCxpPW4ucHJvcHMucHJlU2VsZWN0aW9uP2Z1bmN0aW9uKGUpe3JldHVybiBuLnByb3BzLnNob3dXZWVrUGlja2VyP3hlKGUsbi5wcm9wcy5sb2NhbGUsbi5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KTpuLnByb3BzLnByZVNlbGVjdGlvbn0obi5wcm9wcy5wcmVTZWxlY3Rpb24pOnZvaWQgMDtlLnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE10LGdlKHt9LG4ucHJvcHMse2FyaWFMYWJlbFByZWZpeDpuLnByb3BzLndlZWtBcmlhTGFiZWxQcmVmaXgsa2V5OnIsZGF5Om8sbW9udGg6Qy5nZXRNb250aChuLnByb3BzLmRheSksb25EYXlDbGljazpuLmhhbmRsZURheUNsaWNrLG9uRGF5TW91c2VFbnRlcjpuLmhhbmRsZURheU1vdXNlRW50ZXIsc2VsZWN0ZWQ6cyxwcmVTZWxlY3Rpb246aSxzaG93V2Vla051bWJlcjpuLnByb3BzLnNob3dXZWVrTnVtYmVyc30pKSksIWE7KXtyKyssbz1wLmFkZFdlZWtzKG8sMSk7dmFyIGw9dCYmcj49NixjPSF0JiYhbi5pc1dlZWtJbk1vbnRoKG8pO2lmKGx8fGMpe2lmKCFuLnByb3BzLnBlZWtOZXh0TW9udGgpYnJlYWs7YT0hMH19cmV0dXJuIGV9LG4ub25Nb250aENsaWNrPWZ1bmN0aW9uKGUsdCl7dmFyIHI9bi5pc01vbnRoRGlzYWJsZWRGb3JMYWJlbERhdGUodCksYT1yLmlzRGlzYWJsZWQsbz1yLmxhYmVsRGF0ZTthfHxuLmhhbmRsZURheUNsaWNrKE5lKG8pLGUpfSxuLm9uTW9udGhNb3VzZUVudGVyPWZ1bmN0aW9uKGUpe3ZhciB0PW4uaXNNb250aERpc2FibGVkRm9yTGFiZWxEYXRlKGUpLHI9dC5pc0Rpc2FibGVkLGE9dC5sYWJlbERhdGU7cnx8bi5oYW5kbGVEYXlNb3VzZUVudGVyKE5lKGEpKX0sbi5oYW5kbGVNb250aE5hdmlnYXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcixhLG8scztudWxsPT09KGE9KHI9bi5wcm9wcykuc2V0UHJlU2VsZWN0aW9uKXx8dm9pZCAwPT09YXx8YS5jYWxsKHIsdCksbnVsbD09PShzPW51bGw9PT0obz1uLk1PTlRIX1JFRlNbZV0pfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmN1cnJlbnQpfHx2b2lkIDA9PT1zfHxzLmZvY3VzKCl9LG4uaGFuZGxlS2V5Ym9hcmROYXZpZ2F0aW9uPWZ1bmN0aW9uKGUsdCxyKXt2YXIgYSxvPW4ucHJvcHMscz1vLnNlbGVjdGVkLGw9by5wcmVTZWxlY3Rpb24sYz1vLnNldFByZVNlbGVjdGlvbixwPW8ubWluRGF0ZSxkPW8ubWF4RGF0ZSx1PW8uc2hvd0ZvdXJDb2x1bW5Nb250aFllYXJQaWNrZXIsZj1vLnNob3dUd29Db2x1bW5Nb250aFllYXJQaWNrZXI7aWYobCl7dmFyIGg9UHQodSxmKSxtPW4uZ2V0VmVydGljYWxPZmZzZXQoaCksdj1udWxsPT09KGE9WXRbaF0pfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmdyaWQsZz1mdW5jdGlvbihlLHQscil7dmFyIG4sYSxvPXQscz1yO3N3aXRjaChlKXtjYXNlIERlLkFycm93UmlnaHQ6bz1pLmFkZE1vbnRocyh0LDEpLHM9MTE9PT1yPzA6cisxO2JyZWFrO2Nhc2UgRGUuQXJyb3dMZWZ0Om89YWUuc3ViTW9udGhzKHQsMSkscz0wPT09cj8xMTpyLTE7YnJlYWs7Y2FzZSBEZS5BcnJvd1VwOm89YWUuc3ViTW9udGhzKHQsbSkscz0obnVsbD09PShuPW51bGw9PXY/dm9pZCAwOnZbMF0pfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmluY2x1ZGVzKHIpKT9yKzEyLW06ci1tO2JyZWFrO2Nhc2UgRGUuQXJyb3dEb3duOm89aS5hZGRNb250aHModCxtKSxzPShudWxsPT09KGE9bnVsbD09dj92b2lkIDA6dlt2Lmxlbmd0aC0xXSl8fHZvaWQgMD09PWE/dm9pZCAwOmEuaW5jbHVkZXMocikpP3ItMTIrbTpyK219cmV0dXJue25ld0NhbGN1bGF0ZWREYXRlOm8sbmV3Q2FsY3VsYXRlZE1vbnRoOnN9fTtpZih0IT09RGUuRW50ZXIpe3ZhciB5PWZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIGE9ZSxvPSExLHM9MCxpPWcoYSx0LHIpLGw9aS5uZXdDYWxjdWxhdGVkRGF0ZSxjPWkubmV3Q2FsY3VsYXRlZE1vbnRoOyFvOyl7aWYocz49NDApe2w9dCxjPXI7YnJlYWt9dmFyIHU7aWYocCYmbDxwKWE9RGUuQXJyb3dSaWdodCxsPSh1PWcoYSxsLGMpKS5uZXdDYWxjdWxhdGVkRGF0ZSxjPXUubmV3Q2FsY3VsYXRlZE1vbnRoO2lmKGQmJmw+ZClhPURlLkFycm93TGVmdCxsPSh1PWcoYSxsLGMpKS5uZXdDYWxjdWxhdGVkRGF0ZSxjPXUubmV3Q2FsY3VsYXRlZE1vbnRoO2lmKFhlKGwsbi5wcm9wcykpbD0odT1nKGEsbCxjKSkubmV3Q2FsY3VsYXRlZERhdGUsYz11Lm5ld0NhbGN1bGF0ZWRNb250aDtlbHNlIG89ITA7cysrfXJldHVybntuZXdDYWxjdWxhdGVkRGF0ZTpsLG5ld0NhbGN1bGF0ZWRNb250aDpjfX0odCxsLHIpLEQ9eS5uZXdDYWxjdWxhdGVkRGF0ZSxrPXkubmV3Q2FsY3VsYXRlZE1vbnRoO3N3aXRjaCh0KXtjYXNlIERlLkFycm93UmlnaHQ6Y2FzZSBEZS5BcnJvd0xlZnQ6Y2FzZSBEZS5BcnJvd1VwOmNhc2UgRGUuQXJyb3dEb3duOm4uaGFuZGxlTW9udGhOYXZpZ2F0aW9uKGssRCl9fWVsc2Ugbi5pc01vbnRoRGlzYWJsZWQocil8fChuLm9uTW9udGhDbGljayhlLHIpLG51bGw9PWN8fGMocykpfX0sbi5nZXRWZXJ0aWNhbE9mZnNldD1mdW5jdGlvbihlKXt2YXIgdCxyO3JldHVybiBudWxsIT09KHI9bnVsbD09PSh0PVl0W2VdKXx8dm9pZCAwPT09dD92b2lkIDA6dC52ZXJ0aWNhbE5hdmlnYXRpb25PZmZzZXQpJiZ2b2lkIDAhPT1yP3I6MH0sbi5vbk1vbnRoS2V5RG93bj1mdW5jdGlvbihlLHQpe3ZhciByPW4ucHJvcHMsYT1yLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uLG89ci5oYW5kbGVPbk1vbnRoS2V5RG93bixzPWUua2V5O3MhPT1EZS5UYWImJmUucHJldmVudERlZmF1bHQoKSxhfHxuLmhhbmRsZUtleWJvYXJkTmF2aWdhdGlvbihlLHMsdCksbyYmbyhlKX0sbi5vblF1YXJ0ZXJDbGljaz1mdW5jdGlvbihlLHQpe3ZhciByPXouc2V0UXVhcnRlcihuLnByb3BzLmRheSx0KTtHZShyLG4ucHJvcHMpfHxuLmhhbmRsZURheUNsaWNrKEllKHIpLGUpfSxuLm9uUXVhcnRlck1vdXNlRW50ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ei5zZXRRdWFydGVyKG4ucHJvcHMuZGF5LGUpO0dlKHQsbi5wcm9wcyl8fG4uaGFuZGxlRGF5TW91c2VFbnRlcihJZSh0KSl9LG4uaGFuZGxlUXVhcnRlck5hdmlnYXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcixhLG8scztuLmlzRGlzYWJsZWQodCl8fG4uaXNFeGNsdWRlZCh0KXx8KG51bGw9PT0oYT0ocj1uLnByb3BzKS5zZXRQcmVTZWxlY3Rpb24pfHx2b2lkIDA9PT1hfHxhLmNhbGwocix0KSxudWxsPT09KHM9bnVsbD09PShvPW4uUVVBUlRFUl9SRUZTW2UtMV0pfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmN1cnJlbnQpfHx2b2lkIDA9PT1zfHxzLmZvY3VzKCkpfSxuLm9uUXVhcnRlcktleURvd249ZnVuY3Rpb24oZSx0KXt2YXIgcixhLG89ZS5rZXk7aWYoIW4ucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24pc3dpdGNoKG8pe2Nhc2UgRGUuRW50ZXI6bi5vblF1YXJ0ZXJDbGljayhlLHQpLG51bGw9PT0oYT0ocj1uLnByb3BzKS5zZXRQcmVTZWxlY3Rpb24pfHx2b2lkIDA9PT1hfHxhLmNhbGwocixuLnByb3BzLnNlbGVjdGVkKTticmVhaztjYXNlIERlLkFycm93UmlnaHQ6aWYoIW4ucHJvcHMucHJlU2VsZWN0aW9uKWJyZWFrO24uaGFuZGxlUXVhcnRlck5hdmlnYXRpb24oND09PXQ/MTp0KzEsbC5hZGRRdWFydGVycyhuLnByb3BzLnByZVNlbGVjdGlvbiwxKSk7YnJlYWs7Y2FzZSBEZS5BcnJvd0xlZnQ6aWYoIW4ucHJvcHMucHJlU2VsZWN0aW9uKWJyZWFrO24uaGFuZGxlUXVhcnRlck5hdmlnYXRpb24oMT09PXQ/NDp0LTEsb2Uuc3ViUXVhcnRlcnMobi5wcm9wcy5wcmVTZWxlY3Rpb24sMSkpfX0sbi5pc01vbnRoRGlzYWJsZWRGb3JMYWJlbERhdGU9ZnVuY3Rpb24oZSl7dmFyIHQscj1uLnByb3BzLGE9ci5kYXksbz1yLm1pbkRhdGUscz1yLm1heERhdGUsaT1yLmV4Y2x1ZGVEYXRlcyxsPXIuaW5jbHVkZURhdGVzLGM9JC5zZXRNb250aChhLGUpO3JldHVybntpc0Rpc2FibGVkOm51bGwhPT0odD0ob3x8c3x8aXx8bCkmJiRlKGMsbi5wcm9wcykpJiZ2b2lkIDAhPT10JiZ0LGxhYmVsRGF0ZTpjfX0sbi5pc01vbnRoRGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uaXNNb250aERpc2FibGVkRm9yTGFiZWxEYXRlKGUpLmlzRGlzYWJsZWR9LG4uZ2V0TW9udGhDbGFzc05hbWVzPWZ1bmN0aW9uKGUpe3ZhciByPW4ucHJvcHMsYT1yLmRheSxvPXIuc3RhcnREYXRlLHM9ci5lbmREYXRlLGk9ci5zZWxlY3RlZCxsPXIucHJlU2VsZWN0aW9uLGM9ci5tb250aENsYXNzTmFtZSxwPWM/YygkLnNldE1vbnRoKGEsZSkpOnZvaWQgMDtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dFwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtXCIuY29uY2F0KGUpLHAse1wicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWRcIjpuLmlzTW9udGhEaXNhYmxlZChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGVkXCI6aT9uLmlzU2VsZWN0ZWRNb250aChhLGUsaSk6dm9pZCAwLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjohbi5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbiYmbCYmbi5pc1NlbGVjdGVkTW9udGgoYSxlLGwpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlXCI6bi5pc0luU2VsZWN0aW5nUmFuZ2VNb250aChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlXCI6byYmcz96ZShvLHMsZSxhKTp2b2lkIDAsXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1yYW5nZS1zdGFydFwiOm4uaXNSYW5nZVN0YXJ0TW9udGgoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1yYW5nZS1lbmRcIjpuLmlzUmFuZ2VFbmRNb250aChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGluZy1yYW5nZS1zdGFydFwiOm4uaXNTZWxlY3RpbmdNb250aFJhbmdlU3RhcnQoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RpbmctcmFuZ2UtZW5kXCI6bi5pc1NlbGVjdGluZ01vbnRoUmFuZ2VFbmQoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS10b2RheVwiOm4uaXNDdXJyZW50TW9udGgoYSxlKX0pfSxuLmdldFRhYkluZGV4PWZ1bmN0aW9uKGUpe2lmKG51bGw9PW4ucHJvcHMucHJlU2VsZWN0aW9uKXJldHVyblwiLTFcIjt2YXIgdD1DLmdldE1vbnRoKG4ucHJvcHMucHJlU2VsZWN0aW9uKTtyZXR1cm4gbi5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbnx8ZSE9PXQ/XCItMVwiOlwiMFwifSxuLmdldFF1YXJ0ZXJUYWJJbmRleD1mdW5jdGlvbihlKXtpZihudWxsPT1uLnByb3BzLnByZVNlbGVjdGlvbilyZXR1cm5cIi0xXCI7dmFyIHQ9RS5nZXRRdWFydGVyKG4ucHJvcHMucHJlU2VsZWN0aW9uKTtyZXR1cm4gbi5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbnx8ZSE9PXQ/XCItMVwiOlwiMFwifSxuLmdldEFyaWFMYWJlbD1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5jaG9vc2VEYXlBcmlhTGFiZWxQcmVmaXgsYT12b2lkIDA9PT1yP1wiQ2hvb3NlXCI6cixvPXQuZGlzYWJsZWREYXlBcmlhTGFiZWxQcmVmaXgscz12b2lkIDA9PT1vP1wiTm90IGF2YWlsYWJsZVwiOm8saT10LmRheSxsPXQubG9jYWxlLGM9JC5zZXRNb250aChpLGUpLHA9bi5pc0Rpc2FibGVkKGMpfHxuLmlzRXhjbHVkZWQoYyk/czphO3JldHVyblwiXCIuY29uY2F0KHAsXCIgXCIpLmNvbmNhdChDZShjLFwiTU1NTSB5eXl5XCIsbCkpfSxuLmdldFF1YXJ0ZXJDbGFzc05hbWVzPWZ1bmN0aW9uKGUpe3ZhciByPW4ucHJvcHMsYT1yLmRheSxvPXIuc3RhcnREYXRlLHM9ci5lbmREYXRlLGk9ci5zZWxlY3RlZCxsPXIubWluRGF0ZSxjPXIubWF4RGF0ZSxwPXIucHJlU2VsZWN0aW9uLGQ9ci5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbjtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0XCIsXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLVwiLmNvbmNhdChlKSx7XCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkXCI6KGx8fGMpJiZHZSh6LnNldFF1YXJ0ZXIoYSxlKSxuLnByb3BzKSxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tc2VsZWN0ZWRcIjppP24uaXNTZWxlY3RlZFF1YXJ0ZXIoYSxlLGkpOnZvaWQgMCxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjohZCYmcCYmbi5pc1NlbGVjdGVkUXVhcnRlcihhLGUscCksXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZVwiOm4uaXNJblNlbGVjdGluZ1JhbmdlUXVhcnRlcihlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2VcIjpvJiZzP2V0KG8scyxlLGEpOnZvaWQgMCxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tcmFuZ2Utc3RhcnRcIjpuLmlzUmFuZ2VTdGFydFF1YXJ0ZXIoZSksXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXJhbmdlLWVuZFwiOm4uaXNSYW5nZUVuZFF1YXJ0ZXIoZSl9KX0sbi5nZXRNb250aENvbnRlbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcyxyPXQuc2hvd0Z1bGxNb250aFllYXJQaWNrZXIsYT10LnJlbmRlck1vbnRoQ29udGVudCxvPXQubG9jYWxlLHM9dC5kYXksaT1WZShlLG8pLGw9QmUoZSxvKTtyZXR1cm4gYT9hKGUsaSxsLHMpOnI/bDppfSxuLmdldFF1YXJ0ZXJDb250ZW50PWZ1bmN0aW9uKGUpe3ZhciB0LHI9bi5wcm9wcyxhPXIucmVuZGVyUXVhcnRlckNvbnRlbnQsbz1mdW5jdGlvbihlLHQpe3JldHVybiBDZSh6LnNldFF1YXJ0ZXIoTWUoKSxlKSxcIlFRUVwiLHQpfShlLHIubG9jYWxlKTtyZXR1cm4gbnVsbCE9PSh0PW51bGw9PWE/dm9pZCAwOmEoZSxvKSkmJnZvaWQgMCE9PXQ/dDpvfSxuLnJlbmRlck1vbnRocz1mdW5jdGlvbigpe3ZhciBlLHQ9bi5wcm9wcyxyPXQuc2hvd1R3b0NvbHVtbk1vbnRoWWVhclBpY2tlcixhPXQuc2hvd0ZvdXJDb2x1bW5Nb250aFllYXJQaWNrZXIsbz10LmRheSxzPXQuc2VsZWN0ZWQsaT1udWxsPT09KGU9WXRbUHQoYSxyKV0pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmdyaWQ7cmV0dXJuIG51bGw9PWk/dm9pZCAwOmkubWFwKChmdW5jdGlvbihlLHQpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtd3JhcHBlclwiLGtleTp0fSxlLm1hcCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse3JlZjpuLk1PTlRIX1JFRlNbZV0sa2V5OnQsb25DbGljazpmdW5jdGlvbih0KXtuLm9uTW9udGhDbGljayh0LGUpfSxvbktleURvd246ZnVuY3Rpb24odCl7RHQodCkmJih0LnByZXZlbnREZWZhdWx0KCksdC5rZXk9RGUuRW50ZXIpLG4ub25Nb250aEtleURvd24odCxlKX0sb25Nb3VzZUVudGVyOm4ucHJvcHMudXNlUG9pbnRlckV2ZW50P3ZvaWQgMDpmdW5jdGlvbigpe3JldHVybiBuLm9uTW9udGhNb3VzZUVudGVyKGUpfSxvblBvaW50ZXJFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD9mdW5jdGlvbigpe3JldHVybiBuLm9uTW9udGhNb3VzZUVudGVyKGUpfTp2b2lkIDAsdGFiSW5kZXg6TnVtYmVyKG4uZ2V0VGFiSW5kZXgoZSkpLGNsYXNzTmFtZTpuLmdldE1vbnRoQ2xhc3NOYW1lcyhlKSxcImFyaWEtZGlzYWJsZWRcIjpuLmlzTW9udGhEaXNhYmxlZChlKSxyb2xlOlwib3B0aW9uXCIsXCJhcmlhLWxhYmVsXCI6bi5nZXRBcmlhTGFiZWwoZSksXCJhcmlhLWN1cnJlbnRcIjpuLmlzQ3VycmVudE1vbnRoKG8sZSk/XCJkYXRlXCI6dm9pZCAwLFwiYXJpYS1zZWxlY3RlZFwiOnM/bi5pc1NlbGVjdGVkTW9udGgobyxlLHMpOnZvaWQgMH0sbi5nZXRNb250aENvbnRlbnQoZSkpfSkpKX0pKX0sbi5yZW5kZXJRdWFydGVycz1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuc2VsZWN0ZWQ7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXdyYXBwZXJcIn0sWzEsMiwzLDRdLm1hcCgoZnVuY3Rpb24oZSxhKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTphLHJlZjpuLlFVQVJURVJfUkVGU1thXSxyb2xlOlwib3B0aW9uXCIsb25DbGljazpmdW5jdGlvbih0KXtuLm9uUXVhcnRlckNsaWNrKHQsZSl9LG9uS2V5RG93bjpmdW5jdGlvbih0KXtuLm9uUXVhcnRlcktleURvd24odCxlKX0sb25Nb3VzZUVudGVyOm4ucHJvcHMudXNlUG9pbnRlckV2ZW50P3ZvaWQgMDpmdW5jdGlvbigpe3JldHVybiBuLm9uUXVhcnRlck1vdXNlRW50ZXIoZSl9LG9uUG9pbnRlckVudGVyOm4ucHJvcHMudXNlUG9pbnRlckV2ZW50P2Z1bmN0aW9uKCl7cmV0dXJuIG4ub25RdWFydGVyTW91c2VFbnRlcihlKX06dm9pZCAwLGNsYXNzTmFtZTpuLmdldFF1YXJ0ZXJDbGFzc05hbWVzKGUpLFwiYXJpYS1zZWxlY3RlZFwiOnI/bi5pc1NlbGVjdGVkUXVhcnRlcih0LGUscik6dm9pZCAwLHRhYkluZGV4Ok51bWJlcihuLmdldFF1YXJ0ZXJUYWJJbmRleChlKSksXCJhcmlhLWN1cnJlbnRcIjpuLmlzQ3VycmVudFF1YXJ0ZXIodCxlKT9cImRhdGVcIjp2b2lkIDB9LG4uZ2V0UXVhcnRlckNvbnRlbnQoZSkpfSkpKX0sbi5nZXRDbGFzc05hbWVzPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyxyPWUuc2VsZWN0aW5nRGF0ZSxhPWUuc2VsZWN0c1N0YXJ0LG89ZS5zZWxlY3RzRW5kLHM9ZS5zaG93TW9udGhZZWFyUGlja2VyLGk9ZS5zaG93UXVhcnRlclllYXJQaWNrZXIsbD1lLnNob3dXZWVrUGlja2VyO3JldHVybiB0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19tb250aFwiLHtcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2VcIjpyJiYoYXx8byl9LHtcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoUGlja2VyXCI6c30se1wicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlclBpY2tlclwiOml9LHtcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWtQaWNrZXJcIjpsfSl9LG59cmV0dXJuIHZlKG4sZSksbi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuc2hvd01vbnRoWWVhclBpY2tlcixyPWUuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyLG49ZS5kYXksYT1lLmFyaWFMYWJlbFByZWZpeCxvPXZvaWQgMD09PWE/XCJNb250aCBcIjphLHM9bz9vLnRyaW0oKStcIiBcIjpcIlwiO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOnRoaXMuZ2V0Q2xhc3NOYW1lcygpLG9uTW91c2VMZWF2ZTp0aGlzLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6dGhpcy5oYW5kbGVNb3VzZUxlYXZlLG9uUG9pbnRlckxlYXZlOnRoaXMucHJvcHMudXNlUG9pbnRlckV2ZW50P3RoaXMuaGFuZGxlTW91c2VMZWF2ZTp2b2lkIDAsXCJhcmlhLWxhYmVsXCI6XCJcIi5jb25jYXQocykuY29uY2F0KENlKG4sXCJNTU1NLCB5eXl5XCIsdGhpcy5wcm9wcy5sb2NhbGUpKSxyb2xlOlwibGlzdGJveFwifSx0P3RoaXMucmVuZGVyTW9udGhzKCk6cj90aGlzLnJlbmRlclF1YXJ0ZXJzKCk6dGhpcy5yZW5kZXJXZWVrcygpKX0sbn0oci5Db21wb25lbnQpLE50PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuaXNTZWxlY3RlZE1vbnRoPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3BzLm1vbnRoPT09ZX0sdC5yZW5kZXJPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvcHMubW9udGhOYW1lcy5tYXAoKGZ1bmN0aW9uKGUscil7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6dC5pc1NlbGVjdGVkTW9udGgocik/XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24gcmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLS1zZWxlY3RlZF9tb250aFwiOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uXCIsa2V5OmUsb25DbGljazp0Lm9uQ2hhbmdlLmJpbmQodCxyKSxcImFyaWEtc2VsZWN0ZWRcIjp0LmlzU2VsZWN0ZWRNb250aChyKT9cInRydWVcIjp2b2lkIDB9LHQuaXNTZWxlY3RlZE1vbnRoKHIpP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLS1zZWxlY3RlZFwifSxcIuKck1wiKTpcIlwiLGUpfSkpfSx0Lm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3BzLm9uQ2hhbmdlKGUpfSx0LmhhbmRsZUNsaWNrT3V0c2lkZT1mdW5jdGlvbigpe3JldHVybiB0LnByb3BzLm9uQ2FuY2VsKCl9LHR9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93blwifSx0aGlzLnJlbmRlck9wdGlvbnMoKSl9LHR9KHIuQ29tcG9uZW50KSxPdD1mZS5kZWZhdWx0KE50KSxJdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LnN0YXRlPXtkcm9wZG93blZpc2libGU6ITF9LHQucmVuZGVyU2VsZWN0T3B0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLHtrZXk6ZSx2YWx1ZTp0fSxlKX0pKX0sdC5yZW5kZXJTZWxlY3RNb2RlPWZ1bmN0aW9uKGUpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIix7dmFsdWU6dC5wcm9wcy5tb250aCxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1zZWxlY3RcIixvbkNoYW5nZTpmdW5jdGlvbihlKXtyZXR1cm4gdC5vbkNoYW5nZShwYXJzZUludChlLnRhcmdldC52YWx1ZSkpfX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zKGUpKX0sdC5yZW5kZXJSZWFkVmlldz1mdW5jdGlvbihlLHIpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7a2V5OlwicmVhZFwiLHN0eWxlOnt2aXNpYmlsaXR5OmU/XCJ2aXNpYmxlXCI6XCJoaWRkZW5cIn0sY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3XCIsb25DbGljazp0LnRvZ2dsZURyb3Bkb3dufSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvd1wifSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLXNlbGVjdGVkLW1vbnRoXCJ9LHJbdC5wcm9wcy5tb250aF0pKX0sdC5yZW5kZXJEcm9wZG93bj1mdW5jdGlvbihlKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE90LGdlKHtrZXk6XCJkcm9wZG93blwifSx0LnByb3BzLHttb250aE5hbWVzOmUsb25DaGFuZ2U6dC5vbkNoYW5nZSxvbkNhbmNlbDp0LnRvZ2dsZURyb3Bkb3dufSkpfSx0LnJlbmRlclNjcm9sbE1vZGU9ZnVuY3Rpb24oZSl7dmFyIHI9dC5zdGF0ZS5kcm9wZG93blZpc2libGUsbj1bdC5yZW5kZXJSZWFkVmlldyghcixlKV07cmV0dXJuIHImJm4udW5zaGlmdCh0LnJlbmRlckRyb3Bkb3duKGUpKSxufSx0Lm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3QudG9nZ2xlRHJvcGRvd24oKSxlIT09dC5wcm9wcy5tb250aCYmdC5wcm9wcy5vbkNoYW5nZShlKX0sdC50b2dnbGVEcm9wZG93bj1mdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHtkcm9wZG93blZpc2libGU6IXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlfSl9LHR9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLHI9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdLm1hcCh0aGlzLnByb3BzLnVzZVNob3J0TW9udGhJbkRyb3Bkb3duP2Z1bmN0aW9uKGUpe3JldHVybiBWZShlLHQucHJvcHMubG9jYWxlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIEJlKGUsdC5wcm9wcy5sb2NhbGUpfSk7c3dpdGNoKHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKXtjYXNlXCJzY3JvbGxcIjplPXRoaXMucmVuZGVyU2Nyb2xsTW9kZShyKTticmVhaztjYXNlXCJzZWxlY3RcIjplPXRoaXMucmVuZGVyU2VsZWN0TW9kZShyKX1yZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLWNvbnRhaW5lciByZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXItLVwiLmNvbmNhdCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl9LGUpfSx0fShyLkNvbXBvbmVudCk7ZnVuY3Rpb24gVHQoZSx0KXtmb3IodmFyIHI9W10sbj1OZShlKSxhPU5lKHQpOyFOLmlzQWZ0ZXIobixhKTspci5wdXNoKE1lKG4pKSxuPWkuYWRkTW9udGhzKG4sMSk7cmV0dXJuIHJ9dmFyIFJ0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIodCl7dmFyIHI9ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIHIucmVuZGVyT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiByLnN0YXRlLm1vbnRoWWVhcnNMaXN0Lm1hcCgoZnVuY3Rpb24oZSl7dmFyIHQ9UC5nZXRUaW1lKGUpLG49TGUoci5wcm9wcy5kYXRlLGUpJiZBZShyLnByb3BzLmRhdGUsZSk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6bj9cInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uLS1zZWxlY3RlZF9tb250aC15ZWFyXCI6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvblwiLGtleTp0LG9uQ2xpY2s6ci5vbkNoYW5nZS5iaW5kKHIsdCksXCJhcmlhLXNlbGVjdGVkXCI6bj9cInRydWVcIjp2b2lkIDB9LG4/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbi0tc2VsZWN0ZWRcIn0sXCLinJNcIik6XCJcIixDZShlLHIucHJvcHMuZGF0ZUZvcm1hdCxyLnByb3BzLmxvY2FsZSkpfSkpfSxyLm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiByLnByb3BzLm9uQ2hhbmdlKGUpfSxyLmhhbmRsZUNsaWNrT3V0c2lkZT1mdW5jdGlvbigpe3IucHJvcHMub25DYW5jZWwoKX0sci5zdGF0ZT17bW9udGhZZWFyc0xpc3Q6VHQoci5wcm9wcy5taW5EYXRlLHIucHJvcHMubWF4RGF0ZSl9LHJ9cmV0dXJuIHZlKHIsZSksci5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dC5jbHN4KHtcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd25cIjohMCxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tLXNjcm9sbGFibGVcIjp0aGlzLnByb3BzLnNjcm9sbGFibGVNb250aFllYXJEcm9wZG93bn0pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOmV9LHRoaXMucmVuZGVyT3B0aW9ucygpKX0scn0oci5Db21wb25lbnQpLEx0PWZlLmRlZmF1bHQoUnQpLEF0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuc3RhdGU9e2Ryb3Bkb3duVmlzaWJsZTohMX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPU5lKHQucHJvcHMubWluRGF0ZSkscj1OZSh0LnByb3BzLm1heERhdGUpLG49W107IU4uaXNBZnRlcihlLHIpOyl7dmFyIGE9UC5nZXRUaW1lKGUpO24ucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIix7a2V5OmEsdmFsdWU6YX0sQ2UoZSx0LnByb3BzLmRhdGVGb3JtYXQsdC5wcm9wcy5sb2NhbGUpKSksZT1pLmFkZE1vbnRocyhlLDEpfXJldHVybiBufSx0Lm9uU2VsZWN0Q2hhbmdlPWZ1bmN0aW9uKGUpe3Qub25DaGFuZ2UocGFyc2VJbnQoZS50YXJnZXQudmFsdWUpKX0sdC5yZW5kZXJTZWxlY3RNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiLHt2YWx1ZTpQLmdldFRpbWUoTmUodC5wcm9wcy5kYXRlKSksY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1zZWxlY3RcIixvbkNoYW5nZTp0Lm9uU2VsZWN0Q2hhbmdlfSx0LnJlbmRlclNlbGVjdE9wdGlvbnMoKSl9LHQucmVuZGVyUmVhZFZpZXc9ZnVuY3Rpb24oZSl7dmFyIHI9Q2UodC5wcm9wcy5kYXRlLHQucHJvcHMuZGF0ZUZvcm1hdCx0LnByb3BzLmxvY2FsZSk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6XCJyZWFkXCIsc3R5bGU6e3Zpc2liaWxpdHk6ZT9cInZpc2libGVcIjpcImhpZGRlblwifSxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlld1wiLG9uQ2xpY2s6dC50b2dnbGVEcm9wZG93bn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvd1wifSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tc2VsZWN0ZWQtbW9udGgteWVhclwifSxyKSl9LHQucmVuZGVyRHJvcGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEx0LGdlKHtrZXk6XCJkcm9wZG93blwifSx0LnByb3BzLHtvbkNoYW5nZTp0Lm9uQ2hhbmdlLG9uQ2FuY2VsOnQudG9nZ2xlRHJvcGRvd259KSl9LHQucmVuZGVyU2Nyb2xsTW9kZT1mdW5jdGlvbigpe3ZhciBlPXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlLHI9W3QucmVuZGVyUmVhZFZpZXcoIWUpXTtyZXR1cm4gZSYmci51bnNoaWZ0KHQucmVuZGVyRHJvcGRvd24oKSkscn0sdC5vbkNoYW5nZT1mdW5jdGlvbihlKXt0LnRvZ2dsZURyb3Bkb3duKCk7dmFyIHI9TWUoZSk7TGUodC5wcm9wcy5kYXRlLHIpJiZBZSh0LnByb3BzLmRhdGUscil8fHQucHJvcHMub25DaGFuZ2Uocil9LHQudG9nZ2xlRHJvcGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7ZHJvcGRvd25WaXNpYmxlOiF0LnN0YXRlLmRyb3Bkb3duVmlzaWJsZX0pfSx0fXJldHVybiB2ZSh0LGUpLHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlO3N3aXRjaCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl7Y2FzZVwic2Nyb2xsXCI6ZT10aGlzLnJlbmRlclNjcm9sbE1vZGUoKTticmVhaztjYXNlXCJzZWxlY3RcIjplPXRoaXMucmVuZGVyU2VsZWN0TW9kZSgpfXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXIgcmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXItLVwiLmNvbmNhdCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl9LGUpfSx0fShyLkNvbXBvbmVudCksRnQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciByPW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gci5zdGF0ZT17aGVpZ2h0Om51bGx9LHIuc2Nyb2xsVG9UaGVTZWxlY3RlZFRpbWU9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIGUsbixhO3IubGlzdCYmKHIubGlzdC5zY3JvbGxUb3A9bnVsbCE9PShhPXIuY2VudGVyTGkmJnQuY2FsY0NlbnRlclBvc2l0aW9uKHIucHJvcHMubW9udGhSZWY/ci5wcm9wcy5tb250aFJlZi5jbGllbnRIZWlnaHQtKG51bGwhPT0obj1udWxsPT09KGU9ci5oZWFkZXIpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNsaWVudEhlaWdodCkmJnZvaWQgMCE9PW4/bjowKTpyLmxpc3QuY2xpZW50SGVpZ2h0LHIuY2VudGVyTGkpKSYmdm9pZCAwIT09YT9hOjApfSkpfSxyLmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGUpe3ZhciB0LG47KHIucHJvcHMubWluVGltZXx8ci5wcm9wcy5tYXhUaW1lKSYmYXQoZSxyLnByb3BzKXx8KHIucHJvcHMuZXhjbHVkZVRpbWVzfHxyLnByb3BzLmluY2x1ZGVUaW1lc3x8ci5wcm9wcy5maWx0ZXJUaW1lKSYmbnQoZSxyLnByb3BzKXx8bnVsbD09PShuPSh0PXIucHJvcHMpLm9uQ2hhbmdlKXx8dm9pZCAwPT09bnx8bi5jYWxsKHQsZSl9LHIuaXNTZWxlY3RlZFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHIucHJvcHMuc2VsZWN0ZWQmJih0PXIucHJvcHMuc2VsZWN0ZWQsbj1lLHZ0KHQpLmdldFRpbWUoKT09PXZ0KG4pLmdldFRpbWUoKSk7dmFyIHQsbn0sci5pc0Rpc2FibGVkVGltZT1mdW5jdGlvbihlKXtyZXR1cm4oci5wcm9wcy5taW5UaW1lfHxyLnByb3BzLm1heFRpbWUpJiZhdChlLHIucHJvcHMpfHwoci5wcm9wcy5leGNsdWRlVGltZXN8fHIucHJvcHMuaW5jbHVkZVRpbWVzfHxyLnByb3BzLmZpbHRlclRpbWUpJiZudChlLHIucHJvcHMpfSxyLmxpQ2xhc3Nlcz1mdW5jdGlvbihlKXt2YXIgbixhPVtcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtXCIsci5wcm9wcy50aW1lQ2xhc3NOYW1lP3IucHJvcHMudGltZUNsYXNzTmFtZShlKTp2b2lkIDBdO3JldHVybiByLmlzU2VsZWN0ZWRUaW1lKGUpJiZhLnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWRcIiksci5pc0Rpc2FibGVkVGltZShlKSYmYS5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWRpc2FibGVkXCIpLHIucHJvcHMuaW5qZWN0VGltZXMmJigzNjAwKmIuZ2V0SG91cnMoZSkrNjAqXy5nZXRNaW51dGVzKGUpK1kuZ2V0U2Vjb25kcyhlKSklKDYwKihudWxsIT09KG49ci5wcm9wcy5pbnRlcnZhbHMpJiZ2b2lkIDAhPT1uP246dC5kZWZhdWx0UHJvcHMuaW50ZXJ2YWxzKSkhPTAmJmEucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1pbmplY3RlZFwiKSxhLmpvaW4oXCIgXCIpfSxyLmhhbmRsZU9uS2V5RG93bj1mdW5jdGlvbihlLHQpe3ZhciBuLGE7ZS5rZXk9PT1EZS5TcGFjZSYmKGUucHJldmVudERlZmF1bHQoKSxlLmtleT1EZS5FbnRlciksKGUua2V5PT09RGUuQXJyb3dVcHx8ZS5rZXk9PT1EZS5BcnJvd0xlZnQpJiZlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZlLnRhcmdldC5wcmV2aW91c1NpYmxpbmcmJihlLnByZXZlbnREZWZhdWx0KCksZS50YXJnZXQucHJldmlvdXNTaWJsaW5nIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUudGFyZ2V0LnByZXZpb3VzU2libGluZy5mb2N1cygpKSwoZS5rZXk9PT1EZS5BcnJvd0Rvd258fGUua2V5PT09RGUuQXJyb3dSaWdodCkmJmUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUudGFyZ2V0Lm5leHRTaWJsaW5nJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUudGFyZ2V0Lm5leHRTaWJsaW5nIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUudGFyZ2V0Lm5leHRTaWJsaW5nLmZvY3VzKCkpLGUua2V5PT09RGUuRW50ZXImJnIuaGFuZGxlQ2xpY2sodCksbnVsbD09PShhPShuPXIucHJvcHMpLmhhbmRsZU9uS2V5RG93bil8fHZvaWQgMD09PWF8fGEuY2FsbChuLGUpfSxyLnJlbmRlclRpbWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLG49W10sYT1yLnByb3BzLmZvcm1hdD9yLnByb3BzLmZvcm1hdDpcInBcIixvPW51bGwhPT0oZT1yLnByb3BzLmludGVydmFscykmJnZvaWQgMCE9PWU/ZTp0LmRlZmF1bHRQcm9wcy5pbnRlcnZhbHMsaT1yLnByb3BzLnNlbGVjdGVkfHxyLnByb3BzLm9wZW5Ub0RhdGV8fE1lKCksbD1QZShpKSxjPXIucHJvcHMuaW5qZWN0VGltZXMmJnIucHJvcHMuaW5qZWN0VGltZXMuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5nZXRUaW1lKCktdC5nZXRUaW1lKCl9KSkscD02MCpmdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLGUuZ2V0RGF0ZSgpKSxyPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSxlLmdldE1vbnRoKCksZS5nZXREYXRlKCksMjQpO3JldHVybiBNYXRoLnJvdW5kKCgrci0rdCkvMzZlNSl9KGkpLGQ9cC9vLHU9MDt1PGQ7dSsrKXt2YXIgZj1zLmFkZE1pbnV0ZXMobCx1Km8pO2lmKG4ucHVzaChmKSxjKXt2YXIgaD1mdChsLGYsdSxvLGMpO249bi5jb25jYXQoaCl9fXZhciBtPW4ucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiB0LmdldFRpbWUoKTw9aS5nZXRUaW1lKCk/dDplfSksblswXSk7cmV0dXJuIG4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIix7a2V5OmUudmFsdWVPZigpLG9uQ2xpY2s6ci5oYW5kbGVDbGljay5iaW5kKHIsZSksY2xhc3NOYW1lOnIubGlDbGFzc2VzKGUpLHJlZjpmdW5jdGlvbih0KXtlPT09bSYmKHIuY2VudGVyTGk9dCl9LG9uS2V5RG93bjpmdW5jdGlvbih0KXtyLmhhbmRsZU9uS2V5RG93bih0LGUpfSx0YWJJbmRleDplPT09bT8wOi0xLHJvbGU6XCJvcHRpb25cIixcImFyaWEtc2VsZWN0ZWRcIjpyLmlzU2VsZWN0ZWRUaW1lKGUpP1widHJ1ZVwiOnZvaWQgMCxcImFyaWEtZGlzYWJsZWRcIjpyLmlzRGlzYWJsZWRUaW1lKGUpP1widHJ1ZVwiOnZvaWQgMH0sQ2UoZSxhLHIucHJvcHMubG9jYWxlKSl9KSl9LHJ9cmV0dXJuIHZlKHQsZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2ludGVydmFsczozMCx0b2RheUJ1dHRvbjpudWxsLHRpbWVDYXB0aW9uOlwiVGltZVwifX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMuc2Nyb2xsVG9UaGVTZWxlY3RlZFRpbWUoKSx0aGlzLnByb3BzLm1vbnRoUmVmJiZ0aGlzLmhlYWRlciYmdGhpcy5zZXRTdGF0ZSh7aGVpZ2h0OnRoaXMucHJvcHMubW9udGhSZWYuY2xpZW50SGVpZ2h0LXRoaXMuaGVhZGVyLmNsaWVudEhlaWdodH0pfSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZSxyPXRoaXMsbj10aGlzLnN0YXRlLmhlaWdodDtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIFwiLmNvbmNhdCgobnVsbCE9PShlPXRoaXMucHJvcHMudG9kYXlCdXR0b24pJiZ2b2lkIDAhPT1lP2U6dC5kZWZhdWx0UHJvcHMudG9kYXlCdXR0b24pP1wicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXItLXdpdGgtdG9kYXktYnV0dG9uXCI6XCJcIil9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXIgcmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lIFwiLmNvbmNhdCh0aGlzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seT9cInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZS0tb25seVwiOlwiXCIpLHJlZjpmdW5jdGlvbihlKXtyLmhlYWRlcj1lfX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyXCJ9LHRoaXMucHJvcHMudGltZUNhcHRpb24pKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZVwifSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3hcIn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0XCIscmVmOmZ1bmN0aW9uKGUpe3IubGlzdD1lfSxzdHlsZTpuP3toZWlnaHQ6bn06e30scm9sZTpcImxpc3Rib3hcIixcImFyaWEtbGFiZWxcIjp0aGlzLnByb3BzLnRpbWVDYXB0aW9ufSx0aGlzLnJlbmRlclRpbWVzKCkpKSkpfSx0LmNhbGNDZW50ZXJQb3NpdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiB0Lm9mZnNldFRvcC0oZS8yLXQuY2xpZW50SGVpZ2h0LzIpfSx0fShyLkNvbXBvbmVudCksSHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihuKXt2YXIgYT1lLmNhbGwodGhpcyxuKXx8dGhpcztyZXR1cm4gYS5ZRUFSX1JFRlM9eWUoW10sQXJyYXkoYS5wcm9wcy55ZWFySXRlbU51bWJlciksITApLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gci5jcmVhdGVSZWYoKX0pKSxhLmlzRGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGplKGUse21pbkRhdGU6YS5wcm9wcy5taW5EYXRlLG1heERhdGU6YS5wcm9wcy5tYXhEYXRlLGV4Y2x1ZGVEYXRlczphLnByb3BzLmV4Y2x1ZGVEYXRlcyxpbmNsdWRlRGF0ZXM6YS5wcm9wcy5pbmNsdWRlRGF0ZXMsZmlsdGVyRGF0ZTphLnByb3BzLmZpbHRlckRhdGV9KX0sYS5pc0V4Y2x1ZGVkPWZ1bmN0aW9uKGUpe3JldHVybiBVZShlLHtleGNsdWRlRGF0ZXM6YS5wcm9wcy5leGNsdWRlRGF0ZXN9KX0sYS5zZWxlY3RpbmdEYXRlPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG51bGwhPT0oZT1hLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT1lP2U6YS5wcm9wcy5wcmVTZWxlY3Rpb259LGEudXBkYXRlRm9jdXNPblBhZ2luYXRlPWZ1bmN0aW9uKGUpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIHQscjtudWxsPT09KHI9bnVsbD09PSh0PWEuWUVBUl9SRUZTW2VdKXx8dm9pZCAwPT09dD92b2lkIDA6dC5jdXJyZW50KXx8dm9pZCAwPT09cnx8ci5mb2N1cygpfSkpfSxhLmhhbmRsZVllYXJDbGljaz1mdW5jdGlvbihlLHQpe2EucHJvcHMub25EYXlDbGljayYmYS5wcm9wcy5vbkRheUNsaWNrKGUsdCl9LGEuaGFuZGxlWWVhck5hdmlnYXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcixuLG8scyxpPWEucHJvcHMsbD1pLmRhdGUsYz1pLnllYXJJdGVtTnVtYmVyO2lmKHZvaWQgMCE9PWwmJnZvaWQgMCE9PWMpe3ZhciBwPW10KGwsYykuc3RhcnRQZXJpb2Q7YS5pc0Rpc2FibGVkKHQpfHxhLmlzRXhjbHVkZWQodCl8fChudWxsPT09KG49KHI9YS5wcm9wcykuc2V0UHJlU2VsZWN0aW9uKXx8dm9pZCAwPT09bnx8bi5jYWxsKHIsdCksZS1wPDA/YS51cGRhdGVGb2N1c09uUGFnaW5hdGUoYy0ocC1lKSk6ZS1wPj1jP2EudXBkYXRlRm9jdXNPblBhZ2luYXRlKE1hdGguYWJzKGMtKGUtcCkpKTpudWxsPT09KHM9bnVsbD09PShvPWEuWUVBUl9SRUZTW2UtcF0pfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmN1cnJlbnQpfHx2b2lkIDA9PT1zfHxzLmZvY3VzKCkpfX0sYS5pc1NhbWVEYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSGUoZSx0KX0sYS5pc0N1cnJlbnRZZWFyPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09eC5nZXRZZWFyKE1lKCkpfSxhLmlzUmFuZ2VTdGFydD1mdW5jdGlvbihlKXtyZXR1cm4gYS5wcm9wcy5zdGFydERhdGUmJmEucHJvcHMuZW5kRGF0ZSYmTGUoRy5zZXRZZWFyKE1lKCksZSksYS5wcm9wcy5zdGFydERhdGUpfSxhLmlzUmFuZ2VFbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGEucHJvcHMuc3RhcnREYXRlJiZhLnByb3BzLmVuZERhdGUmJkxlKEcuc2V0WWVhcihNZSgpLGUpLGEucHJvcHMuZW5kRGF0ZSl9LGEuaXNJblJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBKZShlLGEucHJvcHMuc3RhcnREYXRlLGEucHJvcHMuZW5kRGF0ZSl9LGEuaXNJblNlbGVjdGluZ1JhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWEucHJvcHMscj10LnNlbGVjdHNTdGFydCxuPXQuc2VsZWN0c0VuZCxvPXQuc2VsZWN0c1JhbmdlLHM9dC5zdGFydERhdGUsaT10LmVuZERhdGU7cmV0dXJuISghKHJ8fG58fG8pfHwhYS5zZWxlY3RpbmdEYXRlKCkpJiYociYmaT9KZShlLGEuc2VsZWN0aW5nRGF0ZSgpLGkpOihuJiZzfHwhKCFvfHwhc3x8aSkpJiZKZShlLHMsYS5zZWxlY3RpbmdEYXRlKCkpKX0sYS5pc1NlbGVjdGluZ1JhbmdlU3RhcnQ9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIWEuaXNJblNlbGVjdGluZ1JhbmdlKGUpKXJldHVybiExO3ZhciByPWEucHJvcHMsbj1yLnN0YXJ0RGF0ZSxvPXIuc2VsZWN0c1N0YXJ0LHM9Ry5zZXRZZWFyKE1lKCksZSk7cmV0dXJuIExlKHMsbz9udWxsIT09KHQ9YS5zZWxlY3RpbmdEYXRlKCkpJiZ2b2lkIDAhPT10P3Q6bnVsbDpudWxsIT1uP246bnVsbCl9LGEuaXNTZWxlY3RpbmdSYW5nZUVuZD1mdW5jdGlvbihlKXt2YXIgdDtpZighYS5pc0luU2VsZWN0aW5nUmFuZ2UoZSkpcmV0dXJuITE7dmFyIHI9YS5wcm9wcyxuPXIuZW5kRGF0ZSxvPXIuc2VsZWN0c0VuZCxzPXIuc2VsZWN0c1JhbmdlLGk9Ry5zZXRZZWFyKE1lKCksZSk7cmV0dXJuIExlKGksb3x8cz9udWxsIT09KHQ9YS5zZWxlY3RpbmdEYXRlKCkpJiZ2b2lkIDAhPT10P3Q6bnVsbDpudWxsIT1uP246bnVsbCl9LGEuaXNLZXlib2FyZFNlbGVjdGVkPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PWEucHJvcHMuZGF0ZSYmbnVsbCE9YS5wcm9wcy5zZWxlY3RlZCYmbnVsbCE9YS5wcm9wcy5wcmVTZWxlY3Rpb24pe3ZhciB0PU9lKEcuc2V0WWVhcihhLnByb3BzLmRhdGUsZSkpO3JldHVybiFhLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uJiYhYS5wcm9wcy5pbmxpbmUmJiFIZSh0LE9lKGEucHJvcHMuc2VsZWN0ZWQpKSYmSGUodCxPZShhLnByb3BzLnByZVNlbGVjdGlvbikpfX0sYS5vblllYXJDbGljaz1mdW5jdGlvbihlLHQpe3ZhciByPWEucHJvcHMuZGF0ZTt2b2lkIDAhPT1yJiZhLmhhbmRsZVllYXJDbGljayhPZShHLnNldFllYXIocix0KSksZSl9LGEub25ZZWFyS2V5RG93bj1mdW5jdGlvbihlLHQpe3ZhciByLG4sbz1lLmtleSxzPWEucHJvcHMsaT1zLmRhdGUsbD1zLnllYXJJdGVtTnVtYmVyLGM9cy5oYW5kbGVPbktleURvd247aWYobyE9PURlLlRhYiYmZS5wcmV2ZW50RGVmYXVsdCgpLCFhLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uKXN3aXRjaChvKXtjYXNlIERlLkVudGVyOmlmKG51bGw9PWEucHJvcHMuc2VsZWN0ZWQpYnJlYWs7YS5vblllYXJDbGljayhlLHQpLG51bGw9PT0obj0ocj1hLnByb3BzKS5zZXRQcmVTZWxlY3Rpb24pfHx2b2lkIDA9PT1ufHxuLmNhbGwocixhLnByb3BzLnNlbGVjdGVkKTticmVhaztjYXNlIERlLkFycm93UmlnaHQ6aWYobnVsbD09YS5wcm9wcy5wcmVTZWxlY3Rpb24pYnJlYWs7YS5oYW5kbGVZZWFyTmF2aWdhdGlvbih0KzEsZC5hZGRZZWFycyhhLnByb3BzLnByZVNlbGVjdGlvbiwxKSk7YnJlYWs7Y2FzZSBEZS5BcnJvd0xlZnQ6aWYobnVsbD09YS5wcm9wcy5wcmVTZWxlY3Rpb24pYnJlYWs7YS5oYW5kbGVZZWFyTmF2aWdhdGlvbih0LTEsaWUuc3ViWWVhcnMoYS5wcm9wcy5wcmVTZWxlY3Rpb24sMSkpO2JyZWFrO2Nhc2UgRGUuQXJyb3dVcDppZih2b2lkIDA9PT1pfHx2b2lkIDA9PT1sfHxudWxsPT1hLnByb3BzLnByZVNlbGVjdGlvbilicmVhazt2YXIgcD1tdChpLGwpLnN0YXJ0UGVyaW9kO2lmKChoPXQtKGY9MykpPHApe3ZhciB1PWwlZjt0Pj1wJiZ0PHArdT9mPXU6Zis9dSxoPXQtZn1hLmhhbmRsZVllYXJOYXZpZ2F0aW9uKGgsaWUuc3ViWWVhcnMoYS5wcm9wcy5wcmVTZWxlY3Rpb24sZikpO2JyZWFrO2Nhc2UgRGUuQXJyb3dEb3duOmlmKHZvaWQgMD09PWl8fHZvaWQgMD09PWx8fG51bGw9PWEucHJvcHMucHJlU2VsZWN0aW9uKWJyZWFrO3ZhciBmLGgsbT1tdChpLGwpLmVuZFBlcmlvZDtpZigoaD10KyhmPTMpKT5tKXt1PWwlZjt0PD1tJiZ0Pm0tdT9mPXU6Zis9dSxoPXQrZn1hLmhhbmRsZVllYXJOYXZpZ2F0aW9uKGgsZC5hZGRZZWFycyhhLnByb3BzLnByZVNlbGVjdGlvbixmKSl9YyYmYyhlKX0sYS5nZXRZZWFyQ2xhc3NOYW1lcz1mdW5jdGlvbihlKXt2YXIgcj1hLnByb3BzLG49ci5kYXRlLG89ci5taW5EYXRlLHM9ci5tYXhEYXRlLGk9ci5zZWxlY3RlZCxsPXIuZXhjbHVkZURhdGVzLGM9ci5pbmNsdWRlRGF0ZXMscD1yLmZpbHRlckRhdGUsZD1yLnllYXJDbGFzc05hbWU7cmV0dXJuIHQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dFwiLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1cIi5jb25jYXQoZSksbj9udWxsPT1kP3ZvaWQgMDpkKEcuc2V0WWVhcihuLGUpKTp2b2lkIDAse1wicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RlZFwiOmk/ZT09PXguZ2V0WWVhcihpKTp2b2lkIDAsXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkXCI6KG98fHN8fGx8fGN8fHApJiZaZShlLGEucHJvcHMpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZFwiOmEuaXNLZXlib2FyZFNlbGVjdGVkKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1yYW5nZS1zdGFydFwiOmEuaXNSYW5nZVN0YXJ0KGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1yYW5nZS1lbmRcIjphLmlzUmFuZ2VFbmQoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlXCI6YS5pc0luUmFuZ2UoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZVwiOmEuaXNJblNlbGVjdGluZ1JhbmdlKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RpbmctcmFuZ2Utc3RhcnRcIjphLmlzU2VsZWN0aW5nUmFuZ2VTdGFydChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0aW5nLXJhbmdlLWVuZFwiOmEuaXNTZWxlY3RpbmdSYW5nZUVuZChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tdG9kYXlcIjphLmlzQ3VycmVudFllYXIoZSl9KX0sYS5nZXRZZWFyVGFiSW5kZXg9ZnVuY3Rpb24oZSl7cmV0dXJuIGEucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb258fG51bGw9PWEucHJvcHMucHJlU2VsZWN0aW9uP1wiLTFcIjplPT09eC5nZXRZZWFyKGEucHJvcHMucHJlU2VsZWN0aW9uKT9cIjBcIjpcIi0xXCJ9LGEuZ2V0WWVhckNvbnRhaW5lckNsYXNzTmFtZXM9ZnVuY3Rpb24oKXt2YXIgZT1hLnByb3BzLHI9ZS5zZWxlY3RpbmdEYXRlLG49ZS5zZWxlY3RzU3RhcnQsbz1lLnNlbGVjdHNFbmQscz1lLnNlbGVjdHNSYW5nZTtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhclwiLHtcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZVwiOnImJihufHxvfHxzKX0pfSxhLmdldFllYXJDb250ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhLnByb3BzLnJlbmRlclllYXJDb250ZW50P2EucHJvcHMucmVuZGVyWWVhckNvbnRlbnQoZSk6ZX0sYX1yZXR1cm4gdmUobixlKSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9W10scj10aGlzLnByb3BzLG49ci5kYXRlLGE9ci55ZWFySXRlbU51bWJlcixvPXIub25ZZWFyTW91c2VFbnRlcixzPXIub25ZZWFyTW91c2VMZWF2ZTtpZih2b2lkIDA9PT1uKXJldHVybiBudWxsO2Zvcih2YXIgaT1tdChuLGEpLGw9aS5zdGFydFBlcmlvZCxjPWkuZW5kUGVyaW9kLHA9ZnVuY3Rpb24ocil7dC5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtyZWY6ZC5ZRUFSX1JFRlNbci1sXSxvbkNsaWNrOmZ1bmN0aW9uKHQpe2Uub25ZZWFyQ2xpY2sodCxyKX0sb25LZXlEb3duOmZ1bmN0aW9uKHQpe0R0KHQpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQua2V5PURlLkVudGVyKSxlLm9uWWVhcktleURvd24odCxyKX0sdGFiSW5kZXg6TnVtYmVyKGQuZ2V0WWVhclRhYkluZGV4KHIpKSxjbGFzc05hbWU6ZC5nZXRZZWFyQ2xhc3NOYW1lcyhyKSxvbk1vdXNlRW50ZXI6ZC5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOmZ1bmN0aW9uKGUpe3JldHVybiBvKGUscil9LG9uUG9pbnRlckVudGVyOmQucHJvcHMudXNlUG9pbnRlckV2ZW50P2Z1bmN0aW9uKGUpe3JldHVybiBvKGUscil9OnZvaWQgMCxvbk1vdXNlTGVhdmU6ZC5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOmZ1bmN0aW9uKGUpe3JldHVybiBzKGUscil9LG9uUG9pbnRlckxlYXZlOmQucHJvcHMudXNlUG9pbnRlckV2ZW50P2Z1bmN0aW9uKGUpe3JldHVybiBzKGUscil9OnZvaWQgMCxrZXk6cixcImFyaWEtY3VycmVudFwiOmQuaXNDdXJyZW50WWVhcihyKT9cImRhdGVcIjp2b2lkIDB9LGQuZ2V0WWVhckNvbnRlbnQocikpKX0sZD10aGlzLHU9bDt1PD1jO3UrKylwKHUpO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOnRoaXMuZ2V0WWVhckNvbnRhaW5lckNsYXNzTmFtZXMoKX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItd3JhcHBlclwiLG9uTW91c2VMZWF2ZTp0aGlzLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6dGhpcy5wcm9wcy5jbGVhclNlbGVjdGluZ0RhdGUsb25Qb2ludGVyTGVhdmU6dGhpcy5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dGhpcy5wcm9wcy5jbGVhclNlbGVjdGluZ0RhdGU6dm9pZCAwfSx0KSl9LG59KHIuQ29tcG9uZW50KTtmdW5jdGlvbiBXdChlLHQscixuKXtmb3IodmFyIGE9W10sbz0wO288Mip0KzE7bysrKXt2YXIgcz1lK3QtbyxpPSEwO3ImJihpPXguZ2V0WWVhcihyKTw9cyksbiYmaSYmKGk9eC5nZXRZZWFyKG4pPj1zKSxpJiZhLnB1c2gocyl9cmV0dXJuIGF9dmFyIFF0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7bi5yZW5kZXJPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcy55ZWFyLHQ9bi5zdGF0ZS55ZWFyc0xpc3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTplPT09dD9cInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uIHJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLS1zZWxlY3RlZF95ZWFyXCI6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvblwiLGtleTp0LG9uQ2xpY2s6bi5vbkNoYW5nZS5iaW5kKG4sdCksXCJhcmlhLXNlbGVjdGVkXCI6ZT09PXQ/XCJ0cnVlXCI6dm9pZCAwfSxlPT09dD91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLS1zZWxlY3RlZFwifSxcIuKck1wiKTpcIlwiLHQpfSkpLHI9bi5wcm9wcy5taW5EYXRlP3guZ2V0WWVhcihuLnByb3BzLm1pbkRhdGUpOm51bGwsYT1uLnByb3BzLm1heERhdGU/eC5nZXRZZWFyKG4ucHJvcHMubWF4RGF0ZSk6bnVsbDtyZXR1cm4gYSYmbi5zdGF0ZS55ZWFyc0xpc3QuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1hfSkpfHx0LnVuc2hpZnQodWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uXCIsa2V5OlwidXBjb21pbmdcIixvbkNsaWNrOm4uaW5jcmVtZW50WWVhcnN9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbiByZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycyByZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZ1wifSkpKSxyJiZuLnN0YXRlLnllYXJzTGlzdC5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXJ9KSl8fHQucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb25cIixrZXk6XCJwcmV2aW91c1wiLG9uQ2xpY2s6bi5kZWNyZW1lbnRZZWFyc30sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYVwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uIHJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzIHJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzXCJ9KSkpLHR9LG4ub25DaGFuZ2U9ZnVuY3Rpb24oZSl7bi5wcm9wcy5vbkNoYW5nZShlKX0sbi5oYW5kbGVDbGlja091dHNpZGU9ZnVuY3Rpb24oKXtuLnByb3BzLm9uQ2FuY2VsKCl9LG4uc2hpZnRZZWFycz1mdW5jdGlvbihlKXt2YXIgdD1uLnN0YXRlLnllYXJzTGlzdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0K2V9KSk7bi5zZXRTdGF0ZSh7eWVhcnNMaXN0OnR9KX0sbi5pbmNyZW1lbnRZZWFycz1mdW5jdGlvbigpe3JldHVybiBuLnNoaWZ0WWVhcnMoMSl9LG4uZGVjcmVtZW50WWVhcnM9ZnVuY3Rpb24oKXtyZXR1cm4gbi5zaGlmdFllYXJzKC0xKX07dmFyIGE9dC55ZWFyRHJvcGRvd25JdGVtTnVtYmVyLG89dC5zY3JvbGxhYmxlWWVhckRyb3Bkb3duLHM9YXx8KG8/MTA6NSk7cmV0dXJuIG4uc3RhdGU9e3llYXJzTGlzdDpXdChuLnByb3BzLnllYXIscyxuLnByb3BzLm1pbkRhdGUsbi5wcm9wcy5tYXhEYXRlKX0sbi5kcm9wZG93blJlZj1yLmNyZWF0ZVJlZigpLG59cmV0dXJuIHZlKG4sZSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRyb3Bkb3duUmVmLmN1cnJlbnQ7aWYoZSl7dmFyIHQ9ZS5jaGlsZHJlbj9BcnJheS5mcm9tKGUuY2hpbGRyZW4pOm51bGwscj10P3QuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXJpYVNlbGVjdGVkfSkpOm51bGw7ZS5zY3JvbGxUb3A9ciYmciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50P3Iub2Zmc2V0VG9wKyhyLmNsaWVudEhlaWdodC1lLmNsaWVudEhlaWdodCkvMjooZS5zY3JvbGxIZWlnaHQtZS5jbGllbnRIZWlnaHQpLzJ9fSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmNsc3goe1wicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93blwiOiEwLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi0tc2Nyb2xsYWJsZVwiOnRoaXMucHJvcHMuc2Nyb2xsYWJsZVllYXJEcm9wZG93bn0pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOmUscmVmOnRoaXMuZHJvcGRvd25SZWZ9LHRoaXMucmVuZGVyT3B0aW9ucygpKX0sbn0oci5Db21wb25lbnQpLHF0PWZlLmRlZmF1bHQoUXQpLEt0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuc3RhdGU9e2Ryb3Bkb3duVmlzaWJsZTohMX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXQucHJvcHMubWluRGF0ZT94LmdldFllYXIodC5wcm9wcy5taW5EYXRlKToxOTAwLHI9dC5wcm9wcy5tYXhEYXRlP3guZ2V0WWVhcih0LnByb3BzLm1heERhdGUpOjIxMDAsbj1bXSxhPWU7YTw9cjthKyspbi5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLHtrZXk6YSx2YWx1ZTphfSxhKSk7cmV0dXJuIG59LHQub25TZWxlY3RDaGFuZ2U9ZnVuY3Rpb24oZSl7dC5vbkNoYW5nZShwYXJzZUludChlLnRhcmdldC52YWx1ZSkpfSx0LnJlbmRlclNlbGVjdE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIse3ZhbHVlOnQucHJvcHMueWVhcixjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXNlbGVjdFwiLG9uQ2hhbmdlOnQub25TZWxlY3RDaGFuZ2V9LHQucmVuZGVyU2VsZWN0T3B0aW9ucygpKX0sdC5yZW5kZXJSZWFkVmlldz1mdW5jdGlvbihlKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTpcInJlYWRcIixzdHlsZTp7dmlzaWJpbGl0eTplP1widmlzaWJsZVwiOlwiaGlkZGVuXCJ9LGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3XCIsb25DbGljazpmdW5jdGlvbihlKXtyZXR1cm4gdC50b2dnbGVEcm9wZG93bihlKX19LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3dcIn0pLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLXNlbGVjdGVkLXllYXJcIn0sdC5wcm9wcy55ZWFyKSl9LHQucmVuZGVyRHJvcGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHF0LGdlKHtrZXk6XCJkcm9wZG93blwifSx0LnByb3BzLHtvbkNoYW5nZTp0Lm9uQ2hhbmdlLG9uQ2FuY2VsOnQudG9nZ2xlRHJvcGRvd259KSl9LHQucmVuZGVyU2Nyb2xsTW9kZT1mdW5jdGlvbigpe3ZhciBlPXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlLHI9W3QucmVuZGVyUmVhZFZpZXcoIWUpXTtyZXR1cm4gZSYmci51bnNoaWZ0KHQucmVuZGVyRHJvcGRvd24oKSkscn0sdC5vbkNoYW5nZT1mdW5jdGlvbihlKXt0LnRvZ2dsZURyb3Bkb3duKCksZSE9PXQucHJvcHMueWVhciYmdC5wcm9wcy5vbkNoYW5nZShlKX0sdC50b2dnbGVEcm9wZG93bj1mdW5jdGlvbihlKXt0LnNldFN0YXRlKHtkcm9wZG93blZpc2libGU6IXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlfSwoZnVuY3Rpb24oKXt0LnByb3BzLmFkanVzdERhdGVPbkNoYW5nZSYmdC5oYW5kbGVZZWFyQ2hhbmdlKHQucHJvcHMuZGF0ZSxlKX0pKX0sdC5oYW5kbGVZZWFyQ2hhbmdlPWZ1bmN0aW9uKGUscil7dC5vblNlbGVjdChlLHIpLHQuc2V0T3BlbigpfSx0Lm9uU2VsZWN0PWZ1bmN0aW9uKGUscil7dC5wcm9wcy5vblNlbGVjdCYmdC5wcm9wcy5vblNlbGVjdChlLHIpfSx0LnNldE9wZW49ZnVuY3Rpb24oKXt0LnByb3BzLnNldE9wZW4mJnQucHJvcHMuc2V0T3BlbighMCl9LHR9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU7c3dpdGNoKHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKXtjYXNlXCJzY3JvbGxcIjplPXRoaXMucmVuZGVyU2Nyb2xsTW9kZSgpO2JyZWFrO2Nhc2VcInNlbGVjdFwiOmU9dGhpcy5yZW5kZXJTZWxlY3RNb2RlKCl9cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lciByZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tXCIuY29uY2F0KHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKX0sZSl9LHR9KHIuQ29tcG9uZW50KSxCdD1bXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXNlbGVjdFwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtc2VsZWN0XCIsXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXNlbGVjdFwiXSxWdD1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKG8pe3ZhciBzPWUuY2FsbCh0aGlzLG8pfHx0aGlzO3JldHVybiBzLm1vbnRoQ29udGFpbmVyPXZvaWQgMCxzLmhhbmRsZUNsaWNrT3V0c2lkZT1mdW5jdGlvbihlKXtzLnByb3BzLm9uQ2xpY2tPdXRzaWRlKGUpfSxzLnNldENsaWNrT3V0c2lkZVJlZj1mdW5jdGlvbigpe3JldHVybiBzLmNvbnRhaW5lclJlZi5jdXJyZW50fSxzLmhhbmRsZURyb3Bkb3duRm9jdXM9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGE7bj1lLnRhcmdldCxhPShuLmNsYXNzTmFtZXx8XCJcIikuc3BsaXQoL1xccysvKSxCdC5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gYS5pbmRleE9mKGUpPj0wfSkpJiYobnVsbD09PShyPSh0PXMucHJvcHMpLm9uRHJvcGRvd25Gb2N1cyl8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpKX0scy5nZXREYXRlSW5WaWV3PWZ1bmN0aW9uKCl7dmFyIGU9cy5wcm9wcyx0PWUucHJlU2VsZWN0aW9uLHI9ZS5zZWxlY3RlZCxuPWUub3BlblRvRGF0ZSxhPWN0KHMucHJvcHMpLG89cHQocy5wcm9wcyksaT1NZSgpLGw9bnx8cnx8dDtyZXR1cm4gbHx8KGEmJk8uaXNCZWZvcmUoaSxhKT9hOm8mJk4uaXNBZnRlcihpLG8pP286aSl9LHMuaW5jcmVhc2VNb250aD1mdW5jdGlvbigpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0ZTtyZXR1cm57ZGF0ZTppLmFkZE1vbnRocyh0LDEpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZU1vbnRoQ2hhbmdlKHMuc3RhdGUuZGF0ZSl9KSl9LHMuZGVjcmVhc2VNb250aD1mdW5jdGlvbigpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0ZTtyZXR1cm57ZGF0ZTphZS5zdWJNb250aHModCwxKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVNb250aENoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmhhbmRsZURheUNsaWNrPWZ1bmN0aW9uKGUsdCxyKXtzLnByb3BzLm9uU2VsZWN0KGUsdCxyKSxzLnByb3BzLnNldFByZVNlbGVjdGlvbiYmcy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24oZSl9LHMuaGFuZGxlRGF5TW91c2VFbnRlcj1mdW5jdGlvbihlKXtzLnNldFN0YXRlKHtzZWxlY3RpbmdEYXRlOmV9KSxzLnByb3BzLm9uRGF5TW91c2VFbnRlciYmcy5wcm9wcy5vbkRheU1vdXNlRW50ZXIoZSl9LHMuaGFuZGxlTW9udGhNb3VzZUxlYXZlPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZSh7c2VsZWN0aW5nRGF0ZTp2b2lkIDB9KSxzLnByb3BzLm9uTW9udGhNb3VzZUxlYXZlJiZzLnByb3BzLm9uTW9udGhNb3VzZUxlYXZlKCl9LHMuaGFuZGxlWWVhck1vdXNlRW50ZXI9ZnVuY3Rpb24oZSx0KXtzLnNldFN0YXRlKHtzZWxlY3RpbmdEYXRlOkcuc2V0WWVhcihNZSgpLHQpfSkscy5wcm9wcy5vblllYXJNb3VzZUVudGVyJiZzLnByb3BzLm9uWWVhck1vdXNlRW50ZXIoZSx0KX0scy5oYW5kbGVZZWFyTW91c2VMZWF2ZT1mdW5jdGlvbihlLHQpe3MucHJvcHMub25ZZWFyTW91c2VMZWF2ZSYmcy5wcm9wcy5vblllYXJNb3VzZUxlYXZlKGUsdCl9LHMuaGFuZGxlWWVhckNoYW5nZT1mdW5jdGlvbihlKXtzLnByb3BzLm9uWWVhckNoYW5nZSYmKHMucHJvcHMub25ZZWFyQ2hhbmdlKGUpLHMuc2V0U3RhdGUoe2lzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiEwfSkpLHMucHJvcHMuYWRqdXN0RGF0ZU9uQ2hhbmdlJiYocy5wcm9wcy5vblNlbGVjdCYmcy5wcm9wcy5vblNlbGVjdChlKSxzLnByb3BzLnNldE9wZW4mJnMucHJvcHMuc2V0T3BlbighMCkpLHMucHJvcHMuc2V0UHJlU2VsZWN0aW9uJiZzLnByb3BzLnNldFByZVNlbGVjdGlvbihlKX0scy5oYW5kbGVNb250aENoYW5nZT1mdW5jdGlvbihlKXtzLmhhbmRsZUN1c3RvbU1vbnRoQ2hhbmdlKGUpLHMucHJvcHMuYWRqdXN0RGF0ZU9uQ2hhbmdlJiYocy5wcm9wcy5vblNlbGVjdCYmcy5wcm9wcy5vblNlbGVjdChlKSxzLnByb3BzLnNldE9wZW4mJnMucHJvcHMuc2V0T3BlbighMCkpLHMucHJvcHMuc2V0UHJlU2VsZWN0aW9uJiZzLnByb3BzLnNldFByZVNlbGVjdGlvbihlKX0scy5oYW5kbGVDdXN0b21Nb250aENoYW5nZT1mdW5jdGlvbihlKXtzLnByb3BzLm9uTW9udGhDaGFuZ2UmJihzLnByb3BzLm9uTW9udGhDaGFuZ2UoZSkscy5zZXRTdGF0ZSh7aXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITB9KSl9LHMuaGFuZGxlTW9udGhZZWFyQ2hhbmdlPWZ1bmN0aW9uKGUpe3MuaGFuZGxlWWVhckNoYW5nZShlKSxzLmhhbmRsZU1vbnRoQ2hhbmdlKGUpfSxzLmNoYW5nZVllYXI9ZnVuY3Rpb24oZSl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24odCl7dmFyIHI9dC5kYXRlO3JldHVybntkYXRlOkcuc2V0WWVhcihyLE51bWJlcihlKSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmNoYW5nZU1vbnRoPWZ1bmN0aW9uKGUpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuZGF0ZTtyZXR1cm57ZGF0ZTokLnNldE1vbnRoKHIsTnVtYmVyKGUpKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVNb250aENoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmNoYW5nZU1vbnRoWWVhcj1mdW5jdGlvbihlKXtzLnNldFN0YXRlKChmdW5jdGlvbih0KXt2YXIgcj10LmRhdGU7cmV0dXJue2RhdGU6Ry5zZXRZZWFyKCQuc2V0TW9udGgocixDLmdldE1vbnRoKGUpKSx4LmdldFllYXIoZSkpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZU1vbnRoWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmhlYWRlcj1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT1zLnN0YXRlLmRhdGUpO3ZhciByPXhlKGUscy5wcm9wcy5sb2NhbGUscy5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KSxuPVtdO3JldHVybiBzLnByb3BzLnNob3dXZWVrTnVtYmVycyYmbi5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6XCJXXCIsY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVcIn0scy5wcm9wcy53ZWVrTGFiZWx8fFwiI1wiKSksbi5jb25jYXQoWzAsMSwyLDMsNCw1LDZdLm1hcCgoZnVuY3Rpb24oZSl7dmFyIG49YS5hZGREYXlzKHIsZSksbz1zLmZvcm1hdFdlZWtkYXkobixzLnByb3BzLmxvY2FsZSksaT1zLnByb3BzLndlZWtEYXlDbGFzc05hbWU/cy5wcm9wcy53ZWVrRGF5Q2xhc3NOYW1lKG4pOnZvaWQgMDtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTplLFwiYXJpYS1sYWJlbFwiOkNlKG4sXCJFRUVFXCIscy5wcm9wcy5sb2NhbGUpLGNsYXNzTmFtZTp0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZVwiLGkpfSxvKX0pKSl9LHMuZm9ybWF0V2Vla2RheT1mdW5jdGlvbihlLHQpe3JldHVybiBzLnByb3BzLmZvcm1hdFdlZWtEYXk/ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0KENlKGUsXCJFRUVFXCIscikpfShlLHMucHJvcHMuZm9ybWF0V2Vla0RheSx0KTpzLnByb3BzLnVzZVdlZWtkYXlzU2hvcnQ/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gQ2UoZSxcIkVFRVwiLHQpfShlLHQpOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIENlKGUsXCJFRUVFRUVcIix0KX0oZSx0KX0scy5kZWNyZWFzZVllYXI9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKChmdW5jdGlvbihlKXt2YXIgdCxyPWUuZGF0ZTtyZXR1cm57ZGF0ZTppZS5zdWJZZWFycyhyLHMucHJvcHMuc2hvd1llYXJQaWNrZXI/bnVsbCE9PSh0PXMucHJvcHMueWVhckl0ZW1OdW1iZXIpJiZ2b2lkIDAhPT10P3Q6bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXI6MSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmNsZWFyU2VsZWN0aW5nRGF0ZT1mdW5jdGlvbigpe3Muc2V0U3RhdGUoe3NlbGVjdGluZ0RhdGU6dm9pZCAwfSl9LHMucmVuZGVyUHJldmlvdXNCdXR0b249ZnVuY3Rpb24oKXt2YXIgZTtpZighcy5wcm9wcy5yZW5kZXJDdXN0b21IZWFkZXIpe3ZhciB0O3N3aXRjaCghMCl7Y2FzZSBzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXI6dD1pdChzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dZZWFyUGlja2VyOnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLnllYXJJdGVtTnVtYmVyLG89dm9pZCAwPT09YT9TZTphLHM9bXQoT2UoaWUuc3ViWWVhcnMoZSxvKSksbykuZW5kUGVyaW9kLGk9biYmeC5nZXRZZWFyKG4pO3JldHVybiBpJiZpPnN8fCExfShzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcjp0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz1yZS5zdGFydE9mWWVhcihlKSxzPW9lLnN1YlF1YXJ0ZXJzKG8sMSk7cmV0dXJuIG4mJmguZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhuLHMpPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBoLmRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMoZSxzKT4wfSkpfHwhMX0ocy5zdGF0ZS5kYXRlLHMucHJvcHMpO2JyZWFrO2RlZmF1bHQ6dD1vdChzLnN0YXRlLmRhdGUscy5wcm9wcyl9aWYoKChudWxsIT09KGU9cy5wcm9wcy5mb3JjZVNob3dNb250aE5hdmlnYXRpb24pJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMuZm9yY2VTaG93TW9udGhOYXZpZ2F0aW9uKXx8cy5wcm9wcy5zaG93RGlzYWJsZWRNb250aE5hdmlnYXRpb258fCF0KSYmIXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5KXt2YXIgcj1bXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uXCIsXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1wcmV2aW91c1wiXSxhPXMuZGVjcmVhc2VNb250aDsocy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcikmJihhPXMuZGVjcmVhc2VZZWFyKSx0JiZzLnByb3BzLnNob3dEaXNhYmxlZE1vbnRoTmF2aWdhdGlvbiYmKHIucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXByZXZpb3VzLS1kaXNhYmxlZFwiKSxhPXZvaWQgMCk7dmFyIG89cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcixpPXMucHJvcHMsbD1pLnByZXZpb3VzTW9udGhCdXR0b25MYWJlbCxjPXZvaWQgMD09PWw/bi5kZWZhdWx0UHJvcHMucHJldmlvdXNNb250aEJ1dHRvbkxhYmVsOmwscD1pLnByZXZpb3VzWWVhckJ1dHRvbkxhYmVsLGQ9dm9pZCAwPT09cD9uLmRlZmF1bHRQcm9wcy5wcmV2aW91c1llYXJCdXR0b25MYWJlbDpwLHU9cy5wcm9wcyxmPXUucHJldmlvdXNNb250aEFyaWFMYWJlbCxtPXZvaWQgMD09PWY/XCJzdHJpbmdcIj09dHlwZW9mIGM/YzpcIlByZXZpb3VzIE1vbnRoXCI6Zix2PXUucHJldmlvdXNZZWFyQXJpYUxhYmVsLGc9dm9pZCAwPT09dj9cInN0cmluZ1wiPT10eXBlb2YgZD9kOlwiUHJldmlvdXMgWWVhclwiOnY7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLHt0eXBlOlwiYnV0dG9uXCIsY2xhc3NOYW1lOnIuam9pbihcIiBcIiksb25DbGljazphLG9uS2V5RG93bjpzLnByb3BzLmhhbmRsZU9uS2V5RG93bixcImFyaWEtbGFiZWxcIjpvP2c6bX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6W1wicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uXCIsXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLXByZXZpb3VzXCJdLmpvaW4oXCIgXCIpfSxvP2Q6YykpfX19LHMuaW5jcmVhc2VZZWFyPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24oZSl7dmFyIHQscj1lLmRhdGU7cmV0dXJue2RhdGU6ZC5hZGRZZWFycyhyLHMucHJvcHMuc2hvd1llYXJQaWNrZXI/bnVsbCE9PSh0PXMucHJvcHMueWVhckl0ZW1OdW1iZXIpJiZ2b2lkIDAhPT10P3Q6bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXI6MSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLnJlbmRlck5leHRCdXR0b249ZnVuY3Rpb24oKXt2YXIgZTtpZighcy5wcm9wcy5yZW5kZXJDdXN0b21IZWFkZXIpe3ZhciB0O3N3aXRjaCghMCl7Y2FzZSBzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXI6dD1sdChzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dZZWFyUGlja2VyOnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1heERhdGUsYT1yLnllYXJJdGVtTnVtYmVyLG89dm9pZCAwPT09YT9TZTphLHM9bXQoZC5hZGRZZWFycyhlLG8pLG8pLnN0YXJ0UGVyaW9kLGk9biYmeC5nZXRZZWFyKG4pO3JldHVybiBpJiZpPHN8fCExfShzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcjp0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5tYXhEYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz1ELmVuZE9mWWVhcihlKSxzPWwuYWRkUXVhcnRlcnMobywxKTtyZXR1cm4gbiYmaC5kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKHMsbik+MHx8YSYmYS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIGguZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhzLGUpPjB9KSl8fCExfShzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7ZGVmYXVsdDp0PXN0KHMuc3RhdGUuZGF0ZSxzLnByb3BzKX1pZigoKG51bGwhPT0oZT1zLnByb3BzLmZvcmNlU2hvd01vbnRoTmF2aWdhdGlvbikmJnZvaWQgMCE9PWU/ZTpuLmRlZmF1bHRQcm9wcy5mb3JjZVNob3dNb250aE5hdmlnYXRpb24pfHxzLnByb3BzLnNob3dEaXNhYmxlZE1vbnRoTmF2aWdhdGlvbnx8IXQpJiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpe3ZhciByPVtcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb25cIixcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHRcIl07cy5wcm9wcy5zaG93VGltZVNlbGVjdCYmci5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10aW1lXCIpLHMucHJvcHMudG9kYXlCdXR0b24mJnIucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLXdpdGgtdG9kYXktYnV0dG9uXCIpO3ZhciBhPXMuaW5jcmVhc2VNb250aDsocy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcikmJihhPXMuaW5jcmVhc2VZZWFyKSx0JiZzLnByb3BzLnNob3dEaXNhYmxlZE1vbnRoTmF2aWdhdGlvbiYmKHIucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLWRpc2FibGVkXCIpLGE9dm9pZCAwKTt2YXIgbz1zLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyfHxzLnByb3BzLnNob3dZZWFyUGlja2VyLGk9cy5wcm9wcyxjPWkubmV4dE1vbnRoQnV0dG9uTGFiZWwscD12b2lkIDA9PT1jP24uZGVmYXVsdFByb3BzLm5leHRNb250aEJ1dHRvbkxhYmVsOmMsdT1pLm5leHRZZWFyQnV0dG9uTGFiZWwsZj12b2lkIDA9PT11P24uZGVmYXVsdFByb3BzLm5leHRZZWFyQnV0dG9uTGFiZWw6dSxtPXMucHJvcHMsdj1tLm5leHRNb250aEFyaWFMYWJlbCxnPXZvaWQgMD09PXY/XCJzdHJpbmdcIj09dHlwZW9mIHA/cDpcIk5leHQgTW9udGhcIjp2LHk9bS5uZXh0WWVhckFyaWFMYWJlbCxrPXZvaWQgMD09PXk/XCJzdHJpbmdcIj09dHlwZW9mIGY/ZjpcIk5leHQgWWVhclwiOnk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLHt0eXBlOlwiYnV0dG9uXCIsY2xhc3NOYW1lOnIuam9pbihcIiBcIiksb25DbGljazphLG9uS2V5RG93bjpzLnByb3BzLmhhbmRsZU9uS2V5RG93bixcImFyaWEtbGFiZWxcIjpvP2s6Z30sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6W1wicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uXCIsXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLW5leHRcIl0uam9pbihcIiBcIil9LG8/ZjpwKSl9fX0scy5yZW5kZXJDdXJyZW50TW9udGg9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9cy5zdGF0ZS5kYXRlKTt2YXIgdD1bXCJyZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoXCJdO3JldHVybiBzLnByb3BzLnNob3dZZWFyRHJvcGRvd24mJnQucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgtLWhhc1llYXJEcm9wZG93blwiKSxzLnByb3BzLnNob3dNb250aERyb3Bkb3duJiZ0LnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLS1oYXNNb250aERyb3Bkb3duXCIpLHMucHJvcHMuc2hvd01vbnRoWWVhckRyb3Bkb3duJiZ0LnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLS1oYXNNb250aFllYXJEcm9wZG93blwiKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLHtjbGFzc05hbWU6dC5qb2luKFwiIFwiKX0sQ2UoZSxzLnByb3BzLmRhdGVGb3JtYXQscy5wcm9wcy5sb2NhbGUpKX0scy5yZW5kZXJZZWFyRHJvcGRvd249ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSYmKGU9ITEpLHMucHJvcHMuc2hvd1llYXJEcm9wZG93biYmIWUpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLdCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHtkYXRlOnMuc3RhdGUuZGF0ZSxvbkNoYW5nZTpzLmNoYW5nZVllYXIseWVhcjp4LmdldFllYXIocy5zdGF0ZS5kYXRlKX0pKX0scy5yZW5kZXJNb250aERyb3Bkb3duPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPSExKSxzLnByb3BzLnNob3dNb250aERyb3Bkb3duJiYhZSlyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEl0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse21vbnRoOkMuZ2V0TW9udGgocy5zdGF0ZS5kYXRlKSxvbkNoYW5nZTpzLmNoYW5nZU1vbnRofSkpfSxzLnJlbmRlck1vbnRoWWVhckRyb3Bkb3duPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPSExKSxzLnByb3BzLnNob3dNb250aFllYXJEcm9wZG93biYmIWUpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBdCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHtkYXRlOnMuc3RhdGUuZGF0ZSxvbkNoYW5nZTpzLmNoYW5nZU1vbnRoWWVhcn0pKX0scy5oYW5kbGVUb2RheUJ1dHRvbkNsaWNrPWZ1bmN0aW9uKGUpe3MucHJvcHMub25TZWxlY3QoVGUoKSxlKSxzLnByb3BzLnNldFByZVNlbGVjdGlvbiYmcy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24oVGUoKSl9LHMucmVuZGVyVG9kYXlCdXR0b249ZnVuY3Rpb24oKXtpZihzLnByb3BzLnRvZGF5QnV0dG9uJiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190b2RheS1idXR0b25cIixvbkNsaWNrOnMuaGFuZGxlVG9kYXlCdXR0b25DbGlja30scy5wcm9wcy50b2RheUJ1dHRvbil9LHMucmVuZGVyRGVmYXVsdEhlYWRlcj1mdW5jdGlvbihlKXt2YXIgdD1lLm1vbnRoRGF0ZSxyPWUuaTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciBcIi5jb25jYXQocy5wcm9wcy5zaG93VGltZVNlbGVjdD9cInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0taGFzLXRpbWUtc2VsZWN0XCI6XCJcIil9LHMucmVuZGVyQ3VycmVudE1vbnRoKHQpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXJfX2Ryb3Bkb3duIHJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlcl9fZHJvcGRvd24tLVwiLmNvbmNhdChzLnByb3BzLmRyb3Bkb3duTW9kZSksb25Gb2N1czpzLmhhbmRsZURyb3Bkb3duRm9jdXN9LHMucmVuZGVyTW9udGhEcm9wZG93bigwIT09cikscy5yZW5kZXJNb250aFllYXJEcm9wZG93bigwIT09cikscy5yZW5kZXJZZWFyRHJvcGRvd24oMCE9PXIpKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVzXCJ9LHMuaGVhZGVyKHQpKSl9LHMucmVuZGVyQ3VzdG9tSGVhZGVyPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbj1lLm1vbnRoRGF0ZSxhPWUuaTtpZihzLnByb3BzLnNob3dUaW1lU2VsZWN0JiYhcy5zdGF0ZS5tb250aENvbnRhaW5lcnx8cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpcmV0dXJuIG51bGw7dmFyIG89b3Qocy5zdGF0ZS5kYXRlLHMucHJvcHMpLGk9c3Qocy5zdGF0ZS5kYXRlLHMucHJvcHMpLGw9aXQocy5zdGF0ZS5kYXRlLHMucHJvcHMpLGM9bHQocy5zdGF0ZS5kYXRlLHMucHJvcHMpLHA9IXMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlciYmIXMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyJiYhcy5wcm9wcy5zaG93WWVhclBpY2tlcjtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciByZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLWN1c3RvbVwiLG9uRm9jdXM6cy5wcm9wcy5vbkRyb3Bkb3duRm9jdXN9LG51bGw9PT0ocj0odD1zLnByb3BzKS5yZW5kZXJDdXN0b21IZWFkZXIpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmNhbGwodCxnZShnZSh7fSxzLnN0YXRlKSx7Y3VzdG9tSGVhZGVyQ291bnQ6YSxtb250aERhdGU6bixjaGFuZ2VNb250aDpzLmNoYW5nZU1vbnRoLGNoYW5nZVllYXI6cy5jaGFuZ2VZZWFyLGRlY3JlYXNlTW9udGg6cy5kZWNyZWFzZU1vbnRoLGluY3JlYXNlTW9udGg6cy5pbmNyZWFzZU1vbnRoLGRlY3JlYXNlWWVhcjpzLmRlY3JlYXNlWWVhcixpbmNyZWFzZVllYXI6cy5pbmNyZWFzZVllYXIscHJldk1vbnRoQnV0dG9uRGlzYWJsZWQ6byxuZXh0TW9udGhCdXR0b25EaXNhYmxlZDppLHByZXZZZWFyQnV0dG9uRGlzYWJsZWQ6bCxuZXh0WWVhckJ1dHRvbkRpc2FibGVkOmN9KSkscCYmdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lc1wifSxzLmhlYWRlcihuKSkpfSxzLnJlbmRlclllYXJIZWFkZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tb250aERhdGUscj1zLnByb3BzLGE9ci5zaG93WWVhclBpY2tlcixvPXIueWVhckl0ZW1OdW1iZXIsaT1tdCh0LHZvaWQgMD09PW8/bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXI6byksbD1pLnN0YXJ0UGVyaW9kLGM9aS5lbmRQZXJpb2Q7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXIgcmVhY3QtZGF0ZXBpY2tlci15ZWFyLWhlYWRlclwifSxhP1wiXCIuY29uY2F0KGwsXCIgLSBcIikuY29uY2F0KGMpOnguZ2V0WWVhcih0KSl9LHMucmVuZGVySGVhZGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWUubW9udGhEYXRlLHI9ZS5pLG49e21vbnRoRGF0ZTp0LGk6dm9pZCAwPT09cj8wOnJ9O3N3aXRjaCghMCl7Y2FzZSB2b2lkIDAhPT1zLnByb3BzLnJlbmRlckN1c3RvbUhlYWRlcjpyZXR1cm4gcy5yZW5kZXJDdXN0b21IZWFkZXIobik7Y2FzZSBzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyfHxzLnByb3BzLnNob3dZZWFyUGlja2VyOnJldHVybiBzLnJlbmRlclllYXJIZWFkZXIobik7ZGVmYXVsdDpyZXR1cm4gcy5yZW5kZXJEZWZhdWx0SGVhZGVyKG4pfX0scy5yZW5kZXJNb250aHM9ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKCFzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSYmIXMucHJvcHMuc2hvd1llYXJQaWNrZXIpe2Zvcih2YXIgcj1bXSxhPW51bGwhPT0oZT1zLnByb3BzLm1vbnRoc1Nob3duKSYmdm9pZCAwIT09ZT9lOm4uZGVmYXVsdFByb3BzLm1vbnRoc1Nob3duLG89cy5wcm9wcy5zaG93UHJldmlvdXNNb250aHM/YS0xOjAsbD1zLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyP2QuYWRkWWVhcnMocy5zdGF0ZS5kYXRlLG8pOmFlLnN1Yk1vbnRocyhzLnN0YXRlLmRhdGUsbyksYz1udWxsIT09KHQ9cy5wcm9wcy5tb250aFNlbGVjdGVkSW4pJiZ2b2lkIDAhPT10P3Q6byxwPTA7cDxhOysrcCl7dmFyIHU9cC1jK28sZj1zLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyP2QuYWRkWWVhcnMobCx1KTppLmFkZE1vbnRocyhsLHUpLGg9XCJtb250aC1cIi5jb25jYXQocCksbT1wPGEtMSx2PXA+MDtyLnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTpoLHJlZjpmdW5jdGlvbihlKXtzLm1vbnRoQ29udGFpbmVyPW51bGwhPWU/ZTp2b2lkIDB9LGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWNvbnRhaW5lclwifSxzLnJlbmRlckhlYWRlcih7bW9udGhEYXRlOmYsaTpwfSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHh0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse2FyaWFMYWJlbFByZWZpeDpzLnByb3BzLm1vbnRoQXJpYUxhYmVsUHJlZml4LGRheTpmLG9uRGF5Q2xpY2s6cy5oYW5kbGVEYXlDbGljayxoYW5kbGVPbktleURvd246cy5wcm9wcy5oYW5kbGVPbkRheUtleURvd24saGFuZGxlT25Nb250aEtleURvd246cy5wcm9wcy5oYW5kbGVPbktleURvd24sb25EYXlNb3VzZUVudGVyOnMuaGFuZGxlRGF5TW91c2VFbnRlcixvbk1vdXNlTGVhdmU6cy5oYW5kbGVNb250aE1vdXNlTGVhdmUsb3JkZXJJbkRpc3BsYXk6cCxzZWxlY3RpbmdEYXRlOnMuc3RhdGUuc2VsZWN0aW5nRGF0ZSxtb250aFNob3dzRHVwbGljYXRlRGF5c0VuZDptLG1vbnRoU2hvd3NEdXBsaWNhdGVEYXlzU3RhcnQ6dn0pKSkpfXJldHVybiByfX0scy5yZW5kZXJZZWFycz1mdW5jdGlvbigpe2lmKCFzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSlyZXR1cm4gcy5wcm9wcy5zaG93WWVhclBpY2tlcj91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tY29udGFpbmVyXCJ9LHMucmVuZGVySGVhZGVyKHttb250aERhdGU6cy5zdGF0ZS5kYXRlfSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEh0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse3NlbGVjdGluZ0RhdGU6cy5zdGF0ZS5zZWxlY3RpbmdEYXRlLGRhdGU6cy5zdGF0ZS5kYXRlLG9uRGF5Q2xpY2s6cy5oYW5kbGVEYXlDbGljayxjbGVhclNlbGVjdGluZ0RhdGU6cy5jbGVhclNlbGVjdGluZ0RhdGUsb25ZZWFyTW91c2VFbnRlcjpzLmhhbmRsZVllYXJNb3VzZUVudGVyLG9uWWVhck1vdXNlTGVhdmU6cy5oYW5kbGVZZWFyTW91c2VMZWF2ZX0pKSk6dm9pZCAwfSxzLnJlbmRlclRpbWVTZWN0aW9uPWZ1bmN0aW9uKCl7aWYocy5wcm9wcy5zaG93VGltZVNlbGVjdCYmKHMuc3RhdGUubW9udGhDb250YWluZXJ8fHMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5KSlyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEZ0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse29uQ2hhbmdlOnMucHJvcHMub25UaW1lQ2hhbmdlLGZvcm1hdDpzLnByb3BzLnRpbWVGb3JtYXQsaW50ZXJ2YWxzOnMucHJvcHMudGltZUludGVydmFscyxtb250aFJlZjpzLnN0YXRlLm1vbnRoQ29udGFpbmVyfSkpfSxzLnJlbmRlcklucHV0VGltZVNlY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT1zLnByb3BzLnNlbGVjdGVkP25ldyBEYXRlKHMucHJvcHMuc2VsZWN0ZWQpOnZvaWQgMCx0PWUmJl9lKGUpJiZCb29sZWFuKHMucHJvcHMuc2VsZWN0ZWQpP1wiXCIuY29uY2F0KGh0KGUuZ2V0SG91cnMoKSksXCI6XCIpLmNvbmNhdChodChlLmdldE1pbnV0ZXMoKSkpOlwiXCI7aWYocy5wcm9wcy5zaG93VGltZUlucHV0KXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQod3QsZ2Uoe30sbi5kZWZhdWx0UHJvcHMscy5wcm9wcyx7ZGF0ZTplLHRpbWVTdHJpbmc6dCxvbkNoYW5nZTpzLnByb3BzLm9uVGltZUNoYW5nZX0pKX0scy5yZW5kZXJBcmlhTGl2ZVJlZ2lvbj1mdW5jdGlvbigpe3ZhciBlLHQscj1tdChzLnN0YXRlLmRhdGUsbnVsbCE9PShlPXMucHJvcHMueWVhckl0ZW1OdW1iZXIpJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXIpLGE9ci5zdGFydFBlcmlvZCxvPXIuZW5kUGVyaW9kO3JldHVybiB0PXMucHJvcHMuc2hvd1llYXJQaWNrZXI/XCJcIi5jb25jYXQoYSxcIiAtIFwiKS5jb25jYXQobyk6cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcj94LmdldFllYXIocy5zdGF0ZS5kYXRlKTpcIlwiLmNvbmNhdChCZShDLmdldE1vbnRoKHMuc3RhdGUuZGF0ZSkscy5wcm9wcy5sb2NhbGUpLFwiIFwiKS5jb25jYXQoeC5nZXRZZWFyKHMuc3RhdGUuZGF0ZSkpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7cm9sZTpcImFsZXJ0XCIsXCJhcmlhLWxpdmVcIjpcInBvbGl0ZVwiLGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2FyaWEtbGl2ZVwifSxzLnN0YXRlLmlzUmVuZGVyQXJpYUxpdmVNZXNzYWdlJiZ0KX0scy5yZW5kZXJDaGlsZHJlbj1mdW5jdGlvbigpe2lmKHMucHJvcHMuY2hpbGRyZW4pcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19jaGlsZHJlbi1jb250YWluZXJcIn0scy5wcm9wcy5jaGlsZHJlbil9LHMuY29udGFpbmVyUmVmPXIuY3JlYXRlUmVmKCkscy5zdGF0ZT17ZGF0ZTpzLmdldERhdGVJblZpZXcoKSxzZWxlY3RpbmdEYXRlOnZvaWQgMCxtb250aENvbnRhaW5lcjp2b2lkIDAsaXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITF9LHN9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue21vbnRoc1Nob3duOjEsZm9yY2VTaG93TW9udGhOYXZpZ2F0aW9uOiExLHRpbWVDYXB0aW9uOlwiVGltZVwiLHByZXZpb3VzWWVhckJ1dHRvbkxhYmVsOlwiUHJldmlvdXMgWWVhclwiLG5leHRZZWFyQnV0dG9uTGFiZWw6XCJOZXh0IFllYXJcIixwcmV2aW91c01vbnRoQnV0dG9uTGFiZWw6XCJQcmV2aW91cyBNb250aFwiLG5leHRNb250aEJ1dHRvbkxhYmVsOlwiTmV4dCBNb250aFwiLHllYXJJdGVtTnVtYmVyOlNlfX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5wcm9wcy5zaG93VGltZVNlbGVjdCYmKHRoaXMuYXNzaWduTW9udGhDb250YWluZXI9dm9pZCBlLnNldFN0YXRlKHttb250aENvbnRhaW5lcjplLm1vbnRoQ29udGFpbmVyfSkpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZighdGhpcy5wcm9wcy5wcmVTZWxlY3Rpb258fEhlKHRoaXMucHJvcHMucHJlU2VsZWN0aW9uLGUucHJlU2VsZWN0aW9uKSYmdGhpcy5wcm9wcy5tb250aFNlbGVjdGVkSW49PT1lLm1vbnRoU2VsZWN0ZWRJbil0aGlzLnByb3BzLm9wZW5Ub0RhdGUmJiFIZSh0aGlzLnByb3BzLm9wZW5Ub0RhdGUsZS5vcGVuVG9EYXRlKSYmdGhpcy5zZXRTdGF0ZSh7ZGF0ZTp0aGlzLnByb3BzLm9wZW5Ub0RhdGV9KTtlbHNle3ZhciByPSFBZSh0aGlzLnN0YXRlLmRhdGUsdGhpcy5wcm9wcy5wcmVTZWxlY3Rpb24pO3RoaXMuc2V0U3RhdGUoe2RhdGU6dGhpcy5wcm9wcy5wcmVTZWxlY3Rpb259LChmdW5jdGlvbigpe3JldHVybiByJiZ0LmhhbmRsZUN1c3RvbU1vbnRoQ2hhbmdlKHQuc3RhdGUuZGF0ZSl9KSl9fSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmNvbnRhaW5lcnx8a2U7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtzdHlsZTp7ZGlzcGxheTpcImNvbnRlbnRzXCJ9LHJlZjp0aGlzLmNvbnRhaW5lclJlZn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGUse2NsYXNzTmFtZTp0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyXCIsdGhpcy5wcm9wcy5jbGFzc05hbWUse1wicmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5XCI6dGhpcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHl9KSxzaG93VGltZTp0aGlzLnByb3BzLnNob3dUaW1lU2VsZWN0fHx0aGlzLnByb3BzLnNob3dUaW1lSW5wdXQsc2hvd1RpbWVTZWxlY3RPbmx5OnRoaXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5fSx0aGlzLnJlbmRlckFyaWFMaXZlUmVnaW9uKCksdGhpcy5yZW5kZXJQcmV2aW91c0J1dHRvbigpLHRoaXMucmVuZGVyTmV4dEJ1dHRvbigpLHRoaXMucmVuZGVyTW9udGhzKCksdGhpcy5yZW5kZXJZZWFycygpLHRoaXMucmVuZGVyVG9kYXlCdXR0b24oKSx0aGlzLnJlbmRlclRpbWVTZWN0aW9uKCksdGhpcy5yZW5kZXJJbnB1dFRpbWVTZWN0aW9uKCksdGhpcy5yZW5kZXJDaGlsZHJlbigpKSl9LG59KHIuQ29tcG9uZW50KSxqdD1mdW5jdGlvbihlKXt2YXIgdD1lLmljb24scj1lLmNsYXNzTmFtZSxuPXZvaWQgMD09PXI/XCJcIjpyLGE9ZS5vbkNsaWNrLG89XCJyZWFjdC1kYXRlcGlja2VyX19jYWxlbmRhci1pY29uXCI7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaVwiLHtjbGFzc05hbWU6XCJcIi5jb25jYXQobyxcIiBcIikuY29uY2F0KHQsXCIgXCIpLmNvbmNhdChuKSxcImFyaWEtaGlkZGVuXCI6XCJ0cnVlXCIsb25DbGljazphfSk6dWUuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudCh0KT91ZS5kZWZhdWx0LmNsb25lRWxlbWVudCh0LHtjbGFzc05hbWU6XCJcIi5jb25jYXQodC5wcm9wcy5jbGFzc05hbWV8fFwiXCIsXCIgXCIpLmNvbmNhdChvLFwiIFwiKS5jb25jYXQobiksb25DbGljazpmdW5jdGlvbihlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnByb3BzLm9uQ2xpY2smJnQucHJvcHMub25DbGljayhlKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiZhKGUpfX0pOnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN2Z1wiLHtjbGFzc05hbWU6XCJcIi5jb25jYXQobyxcIiBcIikuY29uY2F0KG4pLHhtbG5zOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIix2aWV3Qm94OlwiMCAwIDQ0OCA1MTJcIixvbkNsaWNrOmF9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInBhdGhcIix7ZDpcIk05NiAzMlY2NEg0OEMyMS41IDY0IDAgODUuNSAwIDExMnY0OEg0NDhWMTEyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4SDM1MlYzMmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMlY2NEgxNjBWMzJjMC0xNy43LTE0LjMtMzItMzItMzJTOTYgMTQuMyA5NiAzMnpNNDQ4IDE5MkgwVjQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OEg0MDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhWMTkyelwifSkpfSxVdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciByPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiByLnBvcnRhbFJvb3Q9bnVsbCxyLmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikscn1yZXR1cm4gdmUodCxlKSx0LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMucG9ydGFsUm9vdD0odGhpcy5wcm9wcy5wb3J0YWxIb3N0fHxkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQodGhpcy5wcm9wcy5wb3J0YWxJZCksdGhpcy5wb3J0YWxSb290fHwodGhpcy5wb3J0YWxSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5wb3J0YWxSb290LnNldEF0dHJpYnV0ZShcImlkXCIsdGhpcy5wcm9wcy5wb3J0YWxJZCksKHRoaXMucHJvcHMucG9ydGFsSG9zdHx8ZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcy5wb3J0YWxSb290KSksdGhpcy5wb3J0YWxSb290LmFwcGVuZENoaWxkKHRoaXMuZWwpfSx0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMucG9ydGFsUm9vdCYmdGhpcy5wb3J0YWxSb290LnJlbW92ZUNoaWxkKHRoaXMuZWwpfSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaGUuZGVmYXVsdC5jcmVhdGVQb3J0YWwodGhpcy5wcm9wcy5jaGlsZHJlbix0aGlzLmVsKX0sdH0oci5Db21wb25lbnQpLCR0PWZ1bmN0aW9uKGUpe3JldHVybihlIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnR8fCFlLmRpc2FibGVkKSYmLTEhPT1lLnRhYkluZGV4fSx6dD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLmdldFRhYkNoaWxkcmVuPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG51bGw9PT0oZT1uLnRhYkxvb3BSZWYuY3VycmVudCl8fHZvaWQgMD09PWU/dm9pZCAwOmUucXVlcnlTZWxlY3RvckFsbChcIlt0YWJpbmRleF0sIGEsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWFcIiksMSwtMSkuZmlsdGVyKCR0KX0sbi5oYW5kbGVGb2N1c1N0YXJ0PWZ1bmN0aW9uKCl7dmFyIGU9bi5nZXRUYWJDaGlsZHJlbigpO2UmJmUubGVuZ3RoPjEmJmVbZS5sZW5ndGgtMV0uZm9jdXMoKX0sbi5oYW5kbGVGb2N1c0VuZD1mdW5jdGlvbigpe3ZhciBlPW4uZ2V0VGFiQ2hpbGRyZW4oKTtlJiZlLmxlbmd0aD4xJiZlWzBdLmZvY3VzKCl9LG4udGFiTG9vcFJlZj1yLmNyZWF0ZVJlZigpLG59cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuKG51bGwhPT0oZT10aGlzLnByb3BzLmVuYWJsZVRhYkxvb3ApJiZ2b2lkIDAhPT1lP2U6dC5kZWZhdWx0UHJvcHMuZW5hYmxlVGFiTG9vcCk/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RhYi1sb29wXCIscmVmOnRoaXMudGFiTG9vcFJlZn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RhYi1sb29wX19zdGFydFwiLHRhYkluZGV4OjAsb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzU3RhcnR9KSx0aGlzLnByb3BzLmNoaWxkcmVuLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190YWItbG9vcF9fZW5kXCIsdGFiSW5kZXg6MCxvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXNFbmR9KSk6dGhpcy5wcm9wcy5jaGlsZHJlbn0sdC5kZWZhdWx0UHJvcHM9e2VuYWJsZVRhYkxvb3A6ITB9LHR9KHIuQ29tcG9uZW50KTt2YXIgWHQsR3Q9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2hpZGVQb3BwZXI6ITB9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsYT1lLmNsYXNzTmFtZSxvPWUud3JhcHBlckNsYXNzTmFtZSxzPWUuaGlkZVBvcHBlcixpPXZvaWQgMD09PXM/bi5kZWZhdWx0UHJvcHMuaGlkZVBvcHBlcjpzLGw9ZS5wb3BwZXJDb21wb25lbnQsYz1lLnRhcmdldENvbXBvbmVudCxwPWUuZW5hYmxlVGFiTG9vcCxkPWUucG9wcGVyT25LZXlEb3duLHU9ZS5wb3J0YWxJZCxmPWUucG9ydGFsSG9zdCxoPWUucG9wcGVyUHJvcHMsbT1lLnNob3dBcnJvdyx2PXZvaWQgMDtpZighaSl7dmFyIGc9dC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlci1wb3BwZXJcIixhKTt2PXVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh6dCx7ZW5hYmxlVGFiTG9vcDpwfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOmgucmVmcy5zZXRGbG9hdGluZyxzdHlsZTpoLmZsb2F0aW5nU3R5bGVzLGNsYXNzTmFtZTpnLFwiZGF0YS1wbGFjZW1lbnRcIjpoLnBsYWNlbWVudCxvbktleURvd246ZH0sbCxtJiZ1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoY2UuRmxvYXRpbmdBcnJvdyx7cmVmOmguYXJyb3dSZWYsY29udGV4dDpoLmNvbnRleHQsZmlsbDpcImN1cnJlbnRDb2xvclwiLHN0cm9rZVdpZHRoOjEsaGVpZ2h0Ojgsd2lkdGg6MTYsc3R5bGU6e3RyYW5zZm9ybTpcInRyYW5zbGF0ZVkoLTFweClcIn0sY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGVcIn0pKSl9dGhpcy5wcm9wcy5wb3BwZXJDb250YWluZXImJih2PXIuY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLnBvcHBlckNvbnRhaW5lcix7fSx2KSksdSYmIWkmJih2PXVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChVdCx7cG9ydGFsSWQ6dSxwb3J0YWxIb3N0OmZ9LHYpKTt2YXIgeT10LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyLXdyYXBwZXJcIixvKTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHVlLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOmgucmVmcy5zZXRSZWZlcmVuY2UsY2xhc3NOYW1lOnl9LGMpLHYpfSxufShyLkNvbXBvbmVudCksSnQ9KFh0PUd0LGZ1bmN0aW9uKGUpe3ZhciB0LG49XCJib29sZWFuXCIhPXR5cGVvZiBlLmhpZGVQb3BwZXJ8fGUuaGlkZVBvcHBlcixhPXIudXNlUmVmKG51bGwpLG89Y2UudXNlRmxvYXRpbmcoZ2Uoe29wZW46IW4sd2hpbGVFbGVtZW50c01vdW50ZWQ6Y2UuYXV0b1VwZGF0ZSxwbGFjZW1lbnQ6ZS5wb3BwZXJQbGFjZW1lbnQsbWlkZGxld2FyZTp5ZShbY2UuZmxpcCh7cGFkZGluZzoxNX0pLGNlLm9mZnNldCgxMCksY2UuYXJyb3coe2VsZW1lbnQ6YX0pXSxudWxsIT09KHQ9ZS5wb3BwZXJNb2RpZmllcnMpJiZ2b2lkIDAhPT10P3Q6W10sITApfSxlLnBvcHBlclByb3BzKSkscz1nZShnZSh7fSxlKSx7aGlkZVBvcHBlcjpuLHBvcHBlclByb3BzOmdlKGdlKHt9LG8pLHthcnJvd1JlZjphfSl9KTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFh0LGdlKHt9LHMpKX0pLFp0PVwicmVhY3QtZGF0ZXBpY2tlci1pZ25vcmUtb25jbGlja291dHNpZGVcIixlcj1mZS5kZWZhdWx0KFZ0KTt2YXIgdHI9XCJEYXRlIGlucHV0IG5vdCB2YWxpZC5cIixycj1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKG8pe3ZhciBzPWUuY2FsbCh0aGlzLG8pfHx0aGlzO3JldHVybiBzLmNhbGVuZGFyPW51bGwscy5pbnB1dD1udWxsLHMuZ2V0UHJlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHMucHJvcHMub3BlblRvRGF0ZT9zLnByb3BzLm9wZW5Ub0RhdGU6cy5wcm9wcy5zZWxlY3RzRW5kJiZzLnByb3BzLnN0YXJ0RGF0ZT9zLnByb3BzLnN0YXJ0RGF0ZTpzLnByb3BzLnNlbGVjdHNTdGFydCYmcy5wcm9wcy5lbmREYXRlP3MucHJvcHMuZW5kRGF0ZTpNZSgpfSxzLm1vZGlmeUhvbGlkYXlzPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG51bGw9PT0oZT1zLnByb3BzLmhvbGlkYXlzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7dmFyIHI9bmV3IERhdGUodC5kYXRlKTtyZXR1cm4gX2Uocik/eWUoeWUoW10sZSwhMCksW2dlKGdlKHt9LHQpLHtkYXRlOnJ9KV0sITEpOmV9KSxbXSl9LHMuY2FsY0luaXRpYWxTdGF0ZT1mdW5jdGlvbigpe3ZhciBlLHQ9cy5nZXRQcmVTZWxlY3Rpb24oKSxyPWN0KHMucHJvcHMpLG49cHQocy5wcm9wcyksYT1yJiZPLmlzQmVmb3JlKHQsUGUocikpP3I6biYmTi5pc0FmdGVyKHQsUmUobikpP246dDtyZXR1cm57b3BlbjpzLnByb3BzLnN0YXJ0T3Blbnx8ITEscHJldmVudEZvY3VzOiExLGlucHV0VmFsdWU6bnVsbCxwcmVTZWxlY3Rpb246bnVsbCE9PShlPXMucHJvcHMuc2VsZWN0c1JhbmdlP3MucHJvcHMuc3RhcnREYXRlOnMucHJvcHMuc2VsZWN0ZWQpJiZ2b2lkIDAhPT1lP2U6YSxoaWdobGlnaHREYXRlczpkdChzLnByb3BzLmhpZ2hsaWdodERhdGVzKSxmb2N1c2VkOiExLHNob3VsZEZvY3VzRGF5SW5saW5lOiExLGlzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiExLHdhc0hpZGRlbjohMX19LHMucmVzZXRIaWRkZW5TdGF0dXM9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKGdlKGdlKHt9LHMuc3RhdGUpLHt3YXNIaWRkZW46ITF9KSl9LHMuc2V0SGlkZGVuU3RhdHVzPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZShnZShnZSh7fSxzLnN0YXRlKSx7d2FzSGlkZGVuOiEwfSkpfSxzLnNldEhpZGRlblN0YXRlT25WaXNpYmlsaXR5SGlkZGVuPWZ1bmN0aW9uKCl7XCJoaWRkZW5cIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmcy5zZXRIaWRkZW5TdGF0dXMoKX0scy5jbGVhclByZXZlbnRGb2N1c1RpbWVvdXQ9ZnVuY3Rpb24oKXtzLnByZXZlbnRGb2N1c1RpbWVvdXQmJmNsZWFyVGltZW91dChzLnByZXZlbnRGb2N1c1RpbWVvdXQpfSxzLnNldEZvY3VzPWZ1bmN0aW9uKCl7cy5pbnB1dCYmcy5pbnB1dC5mb2N1cyYmcy5pbnB1dC5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pfSxzLnNldEJsdXI9ZnVuY3Rpb24oKXtzLmlucHV0JiZzLmlucHV0LmJsdXImJnMuaW5wdXQuYmx1cigpLHMuY2FuY2VsRm9jdXNJbnB1dCgpfSxzLnNldE9wZW49ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD0hMSkscy5zZXRTdGF0ZSh7b3BlbjplLHByZVNlbGVjdGlvbjplJiZzLnN0YXRlLm9wZW4/cy5zdGF0ZS5wcmVTZWxlY3Rpb246cy5jYWxjSW5pdGlhbFN0YXRlKCkucHJlU2VsZWN0aW9uLGxhc3RQcmVTZWxlY3RDaGFuZ2U6YXJ9LChmdW5jdGlvbigpe2V8fHMuc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3JldHVybntmb2N1c2VkOiEhdCYmZS5mb2N1c2VkfX0pLChmdW5jdGlvbigpeyF0JiZzLnNldEJsdXIoKSxzLnNldFN0YXRlKHtpbnB1dFZhbHVlOm51bGx9KX0pKX0pKX0scy5pbnB1dE9rPWZ1bmN0aW9uKCl7cmV0dXJuIEkuaXNEYXRlKHMuc3RhdGUucHJlU2VsZWN0aW9uKX0scy5pc0NhbGVuZGFyT3Blbj1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1zLnByb3BzLm9wZW4/cy5zdGF0ZS5vcGVuJiYhcy5wcm9wcy5kaXNhYmxlZCYmIXMucHJvcHMucmVhZE9ubHk6cy5wcm9wcy5vcGVufSxzLmhhbmRsZUZvY3VzPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbj1zLnN0YXRlLndhc0hpZGRlbixhPSFufHxzLnN0YXRlLm9wZW47biYmcy5yZXNldEhpZGRlblN0YXR1cygpLCFzLnN0YXRlLnByZXZlbnRGb2N1cyYmYSYmKG51bGw9PT0ocj0odD1zLnByb3BzKS5vbkZvY3VzKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSkscy5wcm9wcy5wcmV2ZW50T3Blbk9uRm9jdXN8fHMucHJvcHMucmVhZE9ubHl8fHMuc2V0T3BlbighMCkpLHMuc2V0U3RhdGUoe2ZvY3VzZWQ6ITB9KX0scy5zZW5kRm9jdXNCYWNrVG9JbnB1dD1mdW5jdGlvbigpe3MucHJldmVudEZvY3VzVGltZW91dCYmcy5jbGVhclByZXZlbnRGb2N1c1RpbWVvdXQoKSxzLnNldFN0YXRlKHtwcmV2ZW50Rm9jdXM6ITB9LChmdW5jdGlvbigpe3MucHJldmVudEZvY3VzVGltZW91dD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Muc2V0Rm9jdXMoKSxzLnNldFN0YXRlKHtwcmV2ZW50Rm9jdXM6ITF9KX0pKX0pKX0scy5jYW5jZWxGb2N1c0lucHV0PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHMuaW5wdXRGb2N1c1RpbWVvdXQpLHMuaW5wdXRGb2N1c1RpbWVvdXQ9dm9pZCAwfSxzLmRlZmVyRm9jdXNJbnB1dD1mdW5jdGlvbigpe3MuY2FuY2VsRm9jdXNJbnB1dCgpLHMuaW5wdXRGb2N1c1RpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gcy5zZXRGb2N1cygpfSksMSl9LHMuaGFuZGxlRHJvcGRvd25Gb2N1cz1mdW5jdGlvbigpe3MuY2FuY2VsRm9jdXNJbnB1dCgpfSxzLmhhbmRsZUJsdXI9ZnVuY3Rpb24oZSl7dmFyIHQscjsoIXMuc3RhdGUub3Blbnx8cy5wcm9wcy53aXRoUG9ydGFsfHxzLnByb3BzLnNob3dUaW1lSW5wdXQpJiYobnVsbD09PShyPSh0PXMucHJvcHMpLm9uQmx1cil8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpKSxzLnNldFN0YXRlKHtmb2N1c2VkOiExfSl9LHMuaGFuZGxlQ2FsZW5kYXJDbGlja091dHNpZGU9ZnVuY3Rpb24oZSl7dmFyIHQscjtzLnByb3BzLmlubGluZXx8cy5zZXRPcGVuKCExKSxudWxsPT09KHI9KHQ9cy5wcm9wcykub25DbGlja091dHNpZGUpfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKSxzLnByb3BzLndpdGhQb3J0YWwmJmUucHJldmVudERlZmF1bHQoKX0scy5oYW5kbGVDaGFuZ2U9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07dmFyIHI9ZVswXTtpZighcy5wcm9wcy5vbkNoYW5nZVJhd3x8KHMucHJvcHMub25DaGFuZ2VSYXcuYXBwbHkocyxlKSxyJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiByLmlzRGVmYXVsdFByZXZlbnRlZCYmIXIuaXNEZWZhdWx0UHJldmVudGVkKCkpKXtzLnNldFN0YXRlKHtpbnB1dFZhbHVlOihudWxsPT1yP3ZvaWQgMDpyLnRhcmdldClpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQ/ci50YXJnZXQudmFsdWU6bnVsbCxsYXN0UHJlU2VsZWN0Q2hhbmdlOm5yfSk7dmFyIGE9cy5wcm9wcyxvPWEuZGF0ZUZvcm1hdCxpPXZvaWQgMD09PW8/bi5kZWZhdWx0UHJvcHMuZGF0ZUZvcm1hdDpvLGw9YS5zdHJpY3RQYXJzaW5nLGM9dm9pZCAwPT09bD9uLmRlZmF1bHRQcm9wcy5zdHJpY3RQYXJzaW5nOmwscD1mdW5jdGlvbihlLHQscixuLGEpe3ZhciBvLHM9bnVsbCxpPUtlKHIpfHxLZShxZSgpKSxsPSEwO2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG89Sy5wYXJzZShlLHQsbmV3IERhdGUse2xvY2FsZTppLHVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VuczohMCx1c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zOiEwfSk7biYmKGw9X2UobyxhKSYmZT09PUNlKG8sdCxyKSksX2UobyxhKSYmbCYmKHM9byl9KSkscztpZihzPUsucGFyc2UoZSx0LG5ldyBEYXRlLHtsb2NhbGU6aSx1c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM6ITAsdXNlQWRkaXRpb25hbERheU9mWWVhclRva2VuczohMH0pLG4pbD1fZShzKSYmZT09PUNlKHMsdCxyKTtlbHNlIGlmKCFfZShzKSl7dmFyIGM9KG51bGwhPT0obz10Lm1hdGNoKGJlKSkmJnZvaWQgMCE9PW8/bzpbXSkubWFwKChmdW5jdGlvbihlKXt2YXIgdD1lWzBdO2lmKFwicFwiPT09dHx8XCJQXCI9PT10KXt2YXIgcj1rLmxvbmdGb3JtYXR0ZXJzW3RdO3JldHVybiBpP3IoZSxpLmZvcm1hdExvbmcpOnR9cmV0dXJuIGV9KSkuam9pbihcIlwiKTtlLmxlbmd0aD4wJiYocz1LLnBhcnNlKGUsYy5zbGljZSgwLGUubGVuZ3RoKSxuZXcgRGF0ZSx7dXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zOiEwLHVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM6ITB9KSksX2Uocyl8fChzPW5ldyBEYXRlKGUpKX1yZXR1cm4gX2UocykmJmw/czpudWxsfSgobnVsbD09cj92b2lkIDA6ci50YXJnZXQpaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50P3IudGFyZ2V0LnZhbHVlOlwiXCIsaSxzLnByb3BzLmxvY2FsZSxjLHMucHJvcHMubWluRGF0ZSk7cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkmJnMucHJvcHMuc2VsZWN0ZWQmJnAmJiFIZShwLHMucHJvcHMuc2VsZWN0ZWQpJiYocD1WLnNldChzLnByb3BzLnNlbGVjdGVkLHtob3VyczpiLmdldEhvdXJzKHApLG1pbnV0ZXM6Xy5nZXRNaW51dGVzKHApLHNlY29uZHM6WS5nZXRTZWNvbmRzKHApfSkpLCFwJiYobnVsbD09cj92b2lkIDA6ci50YXJnZXQpaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50JiYobnVsbD09cj92b2lkIDA6ci50YXJnZXQudmFsdWUpfHxzLnNldFNlbGVjdGVkKHAsciwhMCl9fSxzLmhhbmRsZVNlbGVjdD1mdW5jdGlvbihlLHQscil7aWYocy5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0JiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdCYmcy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpLHMucHJvcHMub25DaGFuZ2VSYXcmJnMucHJvcHMub25DaGFuZ2VSYXcodCkscy5zZXRTZWxlY3RlZChlLHQsITEscikscy5wcm9wcy5zaG93RGF0ZVNlbGVjdCYmcy5zZXRTdGF0ZSh7aXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITB9KSwhcy5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0fHxzLnByb3BzLnNob3dUaW1lU2VsZWN0KXMuc2V0UHJlU2VsZWN0aW9uKGUpO2Vsc2UgaWYoIXMucHJvcHMuaW5saW5lKXtzLnByb3BzLnNlbGVjdHNSYW5nZXx8cy5zZXRPcGVuKCExKTt2YXIgbj1zLnByb3BzLGE9bi5zdGFydERhdGUsbz1uLmVuZERhdGU7IWF8fG98fCFzLnByb3BzLnN3YXBSYW5nZSYmeXQoZSxhKXx8cy5zZXRPcGVuKCExKX19LHMuc2V0U2VsZWN0ZWQ9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGE9ZTtpZihzLnByb3BzLnNob3dZZWFyUGlja2VyKXtpZihudWxsIT09YSYmWmUoeC5nZXRZZWFyKGEpLHMucHJvcHMpKXJldHVybn1lbHNlIGlmKHMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcil7aWYobnVsbCE9PWEmJiRlKGEscy5wcm9wcykpcmV0dXJufWVsc2UgaWYobnVsbCE9PWEmJmplKGEscy5wcm9wcykpcmV0dXJuO3ZhciBvPXMucHJvcHMsaT1vLm9uQ2hhbmdlLGw9by5zZWxlY3RzUmFuZ2UsYz1vLnN0YXJ0RGF0ZSxwPW8uZW5kRGF0ZSxkPW8uc2VsZWN0c011bHRpcGxlLHU9by5zZWxlY3RlZERhdGVzLGY9by5taW5UaW1lLGg9by5zd2FwUmFuZ2U7aWYoIVdlKHMucHJvcHMuc2VsZWN0ZWQsYSl8fHMucHJvcHMuYWxsb3dTYW1lRGF5fHxsfHxkKWlmKG51bGwhPT1hJiYoIXMucHJvcHMuc2VsZWN0ZWR8fHImJihzLnByb3BzLnNob3dUaW1lU2VsZWN0fHxzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seXx8cy5wcm9wcy5zaG93VGltZUlucHV0KXx8KGE9WWUoYSx7aG91cjpiLmdldEhvdXJzKHMucHJvcHMuc2VsZWN0ZWQpLG1pbnV0ZTpfLmdldE1pbnV0ZXMocy5wcm9wcy5zZWxlY3RlZCksc2Vjb25kOlkuZ2V0U2Vjb25kcyhzLnByb3BzLnNlbGVjdGVkKX0pKSxyfHwhcy5wcm9wcy5zaG93VGltZVNlbGVjdCYmIXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5fHxmJiYoYT1ZZShhLHtob3VyOmYuZ2V0SG91cnMoKSxtaW51dGU6Zi5nZXRNaW51dGVzKCksc2Vjb25kOmYuZ2V0U2Vjb25kcygpfSkpLHMucHJvcHMuaW5saW5lfHxzLnNldFN0YXRlKHtwcmVTZWxlY3Rpb246YX0pLHMucHJvcHMuZm9jdXNTZWxlY3RlZE1vbnRofHxzLnNldFN0YXRlKHttb250aFNlbGVjdGVkSW46bn0pKSxsKXt2YXIgbT1jJiYhcCx2PWMmJnA7IWMmJiFwP2koW2EsbnVsbF0sdCk6bSYmKG51bGw9PT1hP2koW251bGwsbnVsbF0sdCk6eXQoYSxjKT9pKGg/W2EsY106W2EsbnVsbF0sdCk6aShbYyxhXSx0KSksdiYmaShbYSxudWxsXSx0KX1lbHNlIGlmKGQpe2lmKG51bGwhPT1hKWlmKG51bGw9PXU/dm9pZCAwOnUubGVuZ3RoKWlmKHUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIEhlKGUsYSl9KSkpaSh1LmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIUhlKGUsYSl9KSksdCk7ZWxzZSBpKHllKHllKFtdLHUsITApLFthXSwhMSksdCk7ZWxzZSBpKFthXSx0KX1lbHNlIGkoYSx0KTtyfHwocy5wcm9wcy5vblNlbGVjdChhLHQpLHMuc2V0U3RhdGUoe2lucHV0VmFsdWU6bnVsbH0pKX0scy5zZXRQcmVTZWxlY3Rpb249ZnVuY3Rpb24oZSl7dmFyIHQ9SS5pc0RhdGUocy5wcm9wcy5taW5EYXRlKSxyPUkuaXNEYXRlKHMucHJvcHMubWF4RGF0ZSksbj0hMDtpZihlKXt2YXIgYT1QZShlKTtpZih0JiZyKW49UWUoZSxzLnByb3BzLm1pbkRhdGUscy5wcm9wcy5tYXhEYXRlKTtlbHNlIGlmKHQpe3ZhciBvPVBlKHMucHJvcHMubWluRGF0ZSk7bj1OLmlzQWZ0ZXIoZSxvKXx8V2UoYSxvKX1lbHNlIGlmKHIpe3ZhciBpPVJlKHMucHJvcHMubWF4RGF0ZSk7bj1PLmlzQmVmb3JlKGUsaSl8fFdlKGEsaSl9fW4mJnMuc2V0U3RhdGUoe3ByZVNlbGVjdGlvbjplfSl9LHMudG9nZ2xlQ2FsZW5kYXI9ZnVuY3Rpb24oKXtzLnNldE9wZW4oIXMuc3RhdGUub3Blbil9LHMuaGFuZGxlVGltZUNoYW5nZT1mdW5jdGlvbihlKXtpZighcy5wcm9wcy5zZWxlY3RzUmFuZ2UmJiFzLnByb3BzLnNlbGVjdHNNdWx0aXBsZSl7dmFyIHQ9cy5wcm9wcy5zZWxlY3RlZD9zLnByb3BzLnNlbGVjdGVkOnMuZ2V0UHJlU2VsZWN0aW9uKCkscj1zLnByb3BzLnNlbGVjdGVkP2U6WWUodCx7aG91cjpiLmdldEhvdXJzKGUpLG1pbnV0ZTpfLmdldE1pbnV0ZXMoZSl9KTtzLnNldFN0YXRlKHtwcmVTZWxlY3Rpb246cn0pLHMucHJvcHMub25DaGFuZ2Uocikscy5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0JiYhcy5wcm9wcy5zaG93VGltZUlucHV0JiYocy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpLHMuc2V0T3BlbighMSkpLHMucHJvcHMuc2hvd1RpbWVJbnB1dCYmcy5zZXRPcGVuKCEwKSwocy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHl8fHMucHJvcHMuc2hvd1RpbWVTZWxlY3QpJiZzLnNldFN0YXRlKHtpc1JlbmRlckFyaWFMaXZlTWVzc2FnZTohMH0pLHMuc2V0U3RhdGUoe2lucHV0VmFsdWU6bnVsbH0pfX0scy5vbklucHV0Q2xpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0O3MucHJvcHMuZGlzYWJsZWR8fHMucHJvcHMucmVhZE9ubHl8fHMuc2V0T3BlbighMCksbnVsbD09PSh0PShlPXMucHJvcHMpLm9uSW5wdXRDbGljayl8fHZvaWQgMD09PXR8fHQuY2FsbChlKX0scy5vbklucHV0S2V5RG93bj1mdW5jdGlvbihlKXt2YXIgdCxyLG4sYSxvO251bGw9PT0ocj0odD1zLnByb3BzKS5vbktleURvd24pfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKTt2YXIgaT1lLmtleTtpZihzLnN0YXRlLm9wZW58fHMucHJvcHMuaW5saW5lfHxzLnByb3BzLnByZXZlbnRPcGVuT25Gb2N1cyl7aWYocy5zdGF0ZS5vcGVuKXtpZihpPT09RGUuQXJyb3dEb3dufHxpPT09RGUuQXJyb3dVcCl7ZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBsPXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5P1wiLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtW3RhYmluZGV4PScwJ11cIjpzLnByb3BzLnNob3dXZWVrUGlja2VyJiZzLnByb3BzLnNob3dXZWVrTnVtYmVycz8nLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyW3RhYmluZGV4PVwiMFwiXSc6cy5wcm9wcy5zaG93RnVsbE1vbnRoWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyPycucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dFt0YWJpbmRleD1cIjBcIl0nOicucmVhY3QtZGF0ZXBpY2tlcl9fZGF5W3RhYmluZGV4PVwiMFwiXScsYz0obnVsbD09PShuPXMuY2FsZW5kYXIpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmNvbXBvbmVudE5vZGUpaW5zdGFuY2VvZiBFbGVtZW50JiZzLmNhbGVuZGFyLmNvbXBvbmVudE5vZGUucXVlcnlTZWxlY3RvcihsKTtyZXR1cm4gdm9pZChjIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmMuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSl9dmFyIHA9TWUocy5zdGF0ZS5wcmVTZWxlY3Rpb24pO2k9PT1EZS5FbnRlcj8oZS5wcmV2ZW50RGVmYXVsdCgpLHMuaW5wdXRPaygpJiZzLnN0YXRlLmxhc3RQcmVTZWxlY3RDaGFuZ2U9PT1hcj8ocy5oYW5kbGVTZWxlY3QocCxlKSwhcy5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0JiZzLnNldFByZVNlbGVjdGlvbihwKSk6cy5zZXRPcGVuKCExKSk6aT09PURlLkVzY2FwZT8oZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2VuZEZvY3VzQmFja1RvSW5wdXQoKSxzLnNldE9wZW4oITEpKTppPT09RGUuVGFiJiZzLnNldE9wZW4oITEpLHMuaW5wdXRPaygpfHxudWxsPT09KG89KGE9cy5wcm9wcykub25JbnB1dEVycm9yKXx8dm9pZCAwPT09b3x8by5jYWxsKGEse2NvZGU6MSxtc2c6dHJ9KX19ZWxzZSBpIT09RGUuQXJyb3dEb3duJiZpIT09RGUuQXJyb3dVcCYmaSE9PURlLkVudGVyfHxzLm9uSW5wdXRDbGljaygpfSxzLm9uUG9ydGFsS2V5RG93bj1mdW5jdGlvbihlKXtlLmtleT09PURlLkVzY2FwZSYmKGUucHJldmVudERlZmF1bHQoKSxzLnNldFN0YXRlKHtwcmV2ZW50Rm9jdXM6ITB9LChmdW5jdGlvbigpe3Muc2V0T3BlbighMSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzLnNldEZvY3VzKCkscy5zZXRTdGF0ZSh7cHJldmVudEZvY3VzOiExfSl9KSl9KSkpfSxzLm9uRGF5S2V5RG93bj1mdW5jdGlvbihlKXt2YXIgdCxyLG4sbyxsPXMucHJvcHMsYz1sLm1pbkRhdGUsdT1sLm1heERhdGUsZj1sLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uLGg9bC5zaG93V2Vla1BpY2tlcixtPWwuc2hvdWxkQ2xvc2VPblNlbGVjdCx2PWwubG9jYWxlLGc9bC5jYWxlbmRhclN0YXJ0RGF5LEQ9bC5hZGp1c3REYXRlT25DaGFuZ2Usaz1sLmlubGluZTtpZihudWxsPT09KHI9KHQ9cy5wcm9wcykub25LZXlEb3duKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSksIWYpe3ZhciB3PWUua2V5LFM9ZS5zaGlmdEtleSxiPU1lKHMuc3RhdGUucHJlU2VsZWN0aW9uKSxNPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dDtzd2l0Y2goZSl7Y2FzZSBEZS5BcnJvd1JpZ2h0OnI9aD9wLmFkZFdlZWtzKHQsMSk6YS5hZGREYXlzKHQsMSk7YnJlYWs7Y2FzZSBEZS5BcnJvd0xlZnQ6cj1oP3NlLnN1YldlZWtzKHQsMSk6bmUuc3ViRGF5cyh0LDEpO2JyZWFrO2Nhc2UgRGUuQXJyb3dVcDpyPXNlLnN1YldlZWtzKHQsMSk7YnJlYWs7Y2FzZSBEZS5BcnJvd0Rvd246cj1wLmFkZFdlZWtzKHQsMSk7YnJlYWs7Y2FzZSBEZS5QYWdlVXA6cj1TP2llLnN1YlllYXJzKHQsMSk6YWUuc3ViTW9udGhzKHQsMSk7YnJlYWs7Y2FzZSBEZS5QYWdlRG93bjpyPVM/ZC5hZGRZZWFycyh0LDEpOmkuYWRkTW9udGhzKHQsMSk7YnJlYWs7Y2FzZSBEZS5Ib21lOnI9eGUodCx2LGcpO2JyZWFrO2Nhc2UgRGUuRW5kOnI9ZnVuY3Rpb24oZSl7cmV0dXJuIHkuZW5kT2ZXZWVrKGUpfSh0KX1yZXR1cm4gcn07aWYodz09PURlLkVudGVyKXJldHVybiBlLnByZXZlbnREZWZhdWx0KCkscy5oYW5kbGVTZWxlY3QoYixlKSx2b2lkKCFtJiZzLnNldFByZVNlbGVjdGlvbihiKSk7aWYodz09PURlLkVzY2FwZSlyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2V0T3BlbighMSksdm9pZChzLmlucHV0T2soKXx8bnVsbD09PShvPShuPXMucHJvcHMpLm9uSW5wdXRFcnJvcil8fHZvaWQgMD09PW98fG8uY2FsbChuLHtjb2RlOjEsbXNnOnRyfSkpO3ZhciBfPW51bGw7c3dpdGNoKHcpe2Nhc2UgRGUuQXJyb3dMZWZ0OmNhc2UgRGUuQXJyb3dSaWdodDpjYXNlIERlLkFycm93VXA6Y2FzZSBEZS5BcnJvd0Rvd246Y2FzZSBEZS5QYWdlVXA6Y2FzZSBEZS5QYWdlRG93bjpjYXNlIERlLkhvbWU6Y2FzZSBEZS5FbmQ6Xz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj1lLG49ITEsYT0wLG89TShlLHQpOyFuOyl7aWYoYT49NDApe289dDticmVha31jJiZvPGMmJihyPURlLkFycm93UmlnaHQsbz1qZShjLHMucHJvcHMpP00ocixvKTpjKSx1JiZvPnUmJihyPURlLkFycm93TGVmdCxvPWplKHUscy5wcm9wcyk/TShyLG8pOnUpLGplKG8scy5wcm9wcyk/KHIhPT1EZS5QYWdlVXAmJnIhPT1EZS5Ib21lfHwocj1EZS5BcnJvd1JpZ2h0KSxyIT09RGUuUGFnZURvd24mJnIhPT1EZS5FbmR8fChyPURlLkFycm93TGVmdCksbz1NKHIsbykpOm49ITAsYSsrfXJldHVybiBvfSh3LGIpfWlmKF8pe2lmKGUucHJldmVudERlZmF1bHQoKSxzLnNldFN0YXRlKHtsYXN0UHJlU2VsZWN0Q2hhbmdlOmFyfSksRCYmcy5zZXRTZWxlY3RlZChfKSxzLnNldFByZVNlbGVjdGlvbihfKSxrKXt2YXIgRT1DLmdldE1vbnRoKGIpLFk9Qy5nZXRNb250aChfKSxQPXguZ2V0WWVhcihiKSxOPXguZ2V0WWVhcihfKTtFIT09WXx8UCE9PU4/cy5zZXRTdGF0ZSh7c2hvdWxkRm9jdXNEYXlJbmxpbmU6ITB9KTpzLnNldFN0YXRlKHtzaG91bGRGb2N1c0RheUlubGluZTohMX0pfX1lbHNlIHMucHJvcHMub25JbnB1dEVycm9yJiZzLnByb3BzLm9uSW5wdXRFcnJvcih7Y29kZToxLG1zZzp0cn0pfX0scy5vblBvcHBlcktleURvd249ZnVuY3Rpb24oZSl7ZS5rZXk9PT1EZS5Fc2NhcGUmJihlLnByZXZlbnREZWZhdWx0KCkscy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpKX0scy5vbkNsZWFyQ2xpY2s9ZnVuY3Rpb24oZSl7ZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2VuZEZvY3VzQmFja1RvSW5wdXQoKTt2YXIgdD1zLnByb3BzLHI9dC5zZWxlY3RzUmFuZ2Usbj10Lm9uQ2hhbmdlO24ocj9bbnVsbCxudWxsXTpudWxsLGUpLHMucHJvcHMuc2VsZWN0c1JhbmdlP3MucHJvcHMub25DaGFuZ2UoW251bGwsbnVsbF0sZSk6cy5wcm9wcy5vbkNoYW5nZShudWxsLGUpLHMuc2V0U3RhdGUoe2lucHV0VmFsdWU6bnVsbH0pfSxzLmNsZWFyPWZ1bmN0aW9uKCl7cy5vbkNsZWFyQ2xpY2soKX0scy5vblNjcm9sbD1mdW5jdGlvbihlKXtcImJvb2xlYW5cIj09dHlwZW9mIHMucHJvcHMuY2xvc2VPblNjcm9sbCYmcy5wcm9wcy5jbG9zZU9uU2Nyb2xsP2UudGFyZ2V0IT09ZG9jdW1lbnQmJmUudGFyZ2V0IT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZlLnRhcmdldCE9PWRvY3VtZW50LmJvZHl8fHMuc2V0T3BlbighMSk6XCJmdW5jdGlvblwiPT10eXBlb2Ygcy5wcm9wcy5jbG9zZU9uU2Nyb2xsJiZzLnByb3BzLmNsb3NlT25TY3JvbGwoZSkmJnMuc2V0T3BlbighMSl9LHMucmVuZGVyQ2FsZW5kYXI9ZnVuY3Rpb24oKXt2YXIgZSx0O3JldHVybiBzLnByb3BzLmlubGluZXx8cy5pc0NhbGVuZGFyT3BlbigpP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChlcixnZSh7cmVmOmZ1bmN0aW9uKGUpe3MuY2FsZW5kYXI9ZX19LHMucHJvcHMscy5zdGF0ZSx7c2V0T3BlbjpzLnNldE9wZW4sZGF0ZUZvcm1hdDpudWxsIT09KGU9cy5wcm9wcy5kYXRlRm9ybWF0Q2FsZW5kYXIpJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMuZGF0ZUZvcm1hdENhbGVuZGFyLG9uU2VsZWN0OnMuaGFuZGxlU2VsZWN0LG9uQ2xpY2tPdXRzaWRlOnMuaGFuZGxlQ2FsZW5kYXJDbGlja091dHNpZGUsaG9saWRheXM6dXQocy5tb2RpZnlIb2xpZGF5cygpKSxvdXRzaWRlQ2xpY2tJZ25vcmVDbGFzczpadCxvbkRyb3Bkb3duRm9jdXM6cy5oYW5kbGVEcm9wZG93bkZvY3VzLG9uVGltZUNoYW5nZTpzLmhhbmRsZVRpbWVDaGFuZ2UsY2xhc3NOYW1lOnMucHJvcHMuY2FsZW5kYXJDbGFzc05hbWUsY29udGFpbmVyOnMucHJvcHMuY2FsZW5kYXJDb250YWluZXIsaGFuZGxlT25LZXlEb3duOnMucHJvcHMub25LZXlEb3duLGhhbmRsZU9uRGF5S2V5RG93bjpzLm9uRGF5S2V5RG93bixzZXRQcmVTZWxlY3Rpb246cy5zZXRQcmVTZWxlY3Rpb24sZHJvcGRvd25Nb2RlOm51bGwhPT0odD1zLnByb3BzLmRyb3Bkb3duTW9kZSkmJnZvaWQgMCE9PXQ/dDpuLmRlZmF1bHRQcm9wcy5kcm9wZG93bk1vZGV9KSxzLnByb3BzLmNoaWxkcmVuKTpudWxsfSxzLnJlbmRlckFyaWFMaXZlUmVnaW9uPWZ1bmN0aW9uKCl7dmFyIGUsdD1zLnByb3BzLHI9dC5kYXRlRm9ybWF0LGE9dm9pZCAwPT09cj9uLmRlZmF1bHRQcm9wcy5kYXRlRm9ybWF0OnIsbz10LmxvY2FsZSxpPXMucHJvcHMuc2hvd1RpbWVJbnB1dHx8cy5wcm9wcy5zaG93VGltZVNlbGVjdD9cIlBQUFBwXCI6XCJQUFBQXCI7cmV0dXJuIGU9cy5wcm9wcy5zZWxlY3RzUmFuZ2U/XCJTZWxlY3RlZCBzdGFydCBkYXRlOiBcIi5jb25jYXQoRWUocy5wcm9wcy5zdGFydERhdGUse2RhdGVGb3JtYXQ6aSxsb2NhbGU6b30pLFwiLiBcIikuY29uY2F0KHMucHJvcHMuZW5kRGF0ZT9cIkVuZCBkYXRlOiBcIitFZShzLnByb3BzLmVuZERhdGUse2RhdGVGb3JtYXQ6aSxsb2NhbGU6b30pOlwiXCIpOnMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5P1wiU2VsZWN0ZWQgdGltZTogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6YSxsb2NhbGU6b30pKTpzLnByb3BzLnNob3dZZWFyUGlja2VyP1wiU2VsZWN0ZWQgeWVhcjogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6XCJ5eXl5XCIsbG9jYWxlOm99KSk6cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyP1wiU2VsZWN0ZWQgbW9udGg6IFwiLmNvbmNhdChFZShzLnByb3BzLnNlbGVjdGVkLHtkYXRlRm9ybWF0OlwiTU1NTSB5eXl5XCIsbG9jYWxlOm99KSk6cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXI/XCJTZWxlY3RlZCBxdWFydGVyOiBcIi5jb25jYXQoRWUocy5wcm9wcy5zZWxlY3RlZCx7ZGF0ZUZvcm1hdDpcInl5eXksIFFRUVwiLGxvY2FsZTpvfSkpOlwiU2VsZWN0ZWQgZGF0ZTogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6aSxsb2NhbGU6b30pKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse3JvbGU6XCJhbGVydFwiLFwiYXJpYS1saXZlXCI6XCJwb2xpdGVcIixjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19hcmlhLWxpdmVcIn0sZSl9LHMucmVuZGVyRGF0ZUlucHV0PWZ1bmN0aW9uKCl7dmFyIGUsYSxvLGk9dC5jbHN4KHMucHJvcHMuY2xhc3NOYW1lLCgoZT17fSlbWnRdPXMuc3RhdGUub3BlbixlKSksbD1zLnByb3BzLmN1c3RvbUlucHV0fHx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLHt0eXBlOlwidGV4dFwifSksYz1zLnByb3BzLmN1c3RvbUlucHV0UmVmfHxcInJlZlwiLHA9cy5wcm9wcyxkPXAuZGF0ZUZvcm1hdCx1PXZvaWQgMD09PWQ/bi5kZWZhdWx0UHJvcHMuZGF0ZUZvcm1hdDpkLGY9cC5sb2NhbGUsaD1cInN0cmluZ1wiPT10eXBlb2Ygcy5wcm9wcy52YWx1ZT9zLnByb3BzLnZhbHVlOlwic3RyaW5nXCI9PXR5cGVvZiBzLnN0YXRlLmlucHV0VmFsdWU/cy5zdGF0ZS5pbnB1dFZhbHVlOnMucHJvcHMuc2VsZWN0c1JhbmdlP2Z1bmN0aW9uKGUsdCxyKXtpZighZSlyZXR1cm5cIlwiO3ZhciBuPUVlKGUsciksYT10P0VlKHQscik6XCJcIjtyZXR1cm5cIlwiLmNvbmNhdChuLFwiIC0gXCIpLmNvbmNhdChhKX0ocy5wcm9wcy5zdGFydERhdGUscy5wcm9wcy5lbmREYXRlLHtkYXRlRm9ybWF0OnUsbG9jYWxlOmZ9KTpzLnByb3BzLnNlbGVjdHNNdWx0aXBsZT9mdW5jdGlvbihlLHQpe2lmKCEobnVsbD09ZT92b2lkIDA6ZS5sZW5ndGgpKXJldHVyblwiXCI7dmFyIHI9ZVswXT9FZShlWzBdLHQpOlwiXCI7aWYoMT09PWUubGVuZ3RoKXJldHVybiByO2lmKDI9PT1lLmxlbmd0aCYmZVsxXSl7dmFyIG49RWUoZVsxXSx0KTtyZXR1cm5cIlwiLmNvbmNhdChyLFwiLCBcIikuY29uY2F0KG4pfXZhciBhPWUubGVuZ3RoLTE7cmV0dXJuXCJcIi5jb25jYXQocixcIiAoK1wiKS5jb25jYXQoYSxcIilcIil9KG51bGwhPT0obz1zLnByb3BzLnNlbGVjdGVkRGF0ZXMpJiZ2b2lkIDAhPT1vP286W10se2RhdGVGb3JtYXQ6dSxsb2NhbGU6Zn0pOkVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6dSxsb2NhbGU6Zn0pO3JldHVybiByLmNsb25lRWxlbWVudChsLCgoYT17fSlbY109ZnVuY3Rpb24oZSl7cy5pbnB1dD1lfSxhLnZhbHVlPWgsYS5vbkJsdXI9cy5oYW5kbGVCbHVyLGEub25DaGFuZ2U9cy5oYW5kbGVDaGFuZ2UsYS5vbkNsaWNrPXMub25JbnB1dENsaWNrLGEub25Gb2N1cz1zLmhhbmRsZUZvY3VzLGEub25LZXlEb3duPXMub25JbnB1dEtleURvd24sYS5pZD1zLnByb3BzLmlkLGEubmFtZT1zLnByb3BzLm5hbWUsYS5mb3JtPXMucHJvcHMuZm9ybSxhLmF1dG9Gb2N1cz1zLnByb3BzLmF1dG9Gb2N1cyxhLnBsYWNlaG9sZGVyPXMucHJvcHMucGxhY2Vob2xkZXJUZXh0LGEuZGlzYWJsZWQ9cy5wcm9wcy5kaXNhYmxlZCxhLmF1dG9Db21wbGV0ZT1zLnByb3BzLmF1dG9Db21wbGV0ZSxhLmNsYXNzTmFtZT10LmNsc3gobC5wcm9wcy5jbGFzc05hbWUsaSksYS50aXRsZT1zLnByb3BzLnRpdGxlLGEucmVhZE9ubHk9cy5wcm9wcy5yZWFkT25seSxhLnJlcXVpcmVkPXMucHJvcHMucmVxdWlyZWQsYS50YWJJbmRleD1zLnByb3BzLnRhYkluZGV4LGFbXCJhcmlhLWRlc2NyaWJlZGJ5XCJdPXMucHJvcHMuYXJpYURlc2NyaWJlZEJ5LGFbXCJhcmlhLWludmFsaWRcIl09cy5wcm9wcy5hcmlhSW52YWxpZCxhW1wiYXJpYS1sYWJlbGxlZGJ5XCJdPXMucHJvcHMuYXJpYUxhYmVsbGVkQnksYVtcImFyaWEtcmVxdWlyZWRcIl09cy5wcm9wcy5hcmlhUmVxdWlyZWQsYSkpfSxzLnJlbmRlckNsZWFyQnV0dG9uPWZ1bmN0aW9uKCl7dmFyIGU9cy5wcm9wcyxyPWUuaXNDbGVhcmFibGUsbj1lLmRpc2FibGVkLGE9ZS5zZWxlY3RlZCxvPWUuc3RhcnREYXRlLGk9ZS5lbmREYXRlLGw9ZS5jbGVhckJ1dHRvblRpdGxlLGM9ZS5jbGVhckJ1dHRvbkNsYXNzTmFtZSxwPXZvaWQgMD09PWM/XCJcIjpjLGQ9ZS5hcmlhTGFiZWxDbG9zZSx1PXZvaWQgMD09PWQ/XCJDbG9zZVwiOmQsZj1lLnNlbGVjdGVkRGF0ZXM7cmV0dXJuIHImJihudWxsIT1hfHxudWxsIT1vfHxudWxsIT1pfHwobnVsbD09Zj92b2lkIDA6Zi5sZW5ndGgpKT91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIix7dHlwZTpcImJ1dHRvblwiLGNsYXNzTmFtZTp0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uXCIscCx7XCJyZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uLS1kaXNhYmxlZFwiOm59KSxkaXNhYmxlZDpuLFwiYXJpYS1sYWJlbFwiOnUsb25DbGljazpzLm9uQ2xlYXJDbGljayx0aXRsZTpsLHRhYkluZGV4Oi0xfSk6bnVsbH0scy5zdGF0ZT1zLmNhbGNJbml0aWFsU3RhdGUoKSxzLnByZXZlbnRGb2N1c1RpbWVvdXQ9dm9pZCAwLHN9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FsbG93U2FtZURheTohMSxkYXRlRm9ybWF0OlwiTU0vZGQveXl5eVwiLGRhdGVGb3JtYXRDYWxlbmRhcjpcIkxMTEwgeXl5eVwiLG9uQ2hhbmdlOmZ1bmN0aW9uKCl7fSxkaXNhYmxlZDohMSxkaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbjohMSxkcm9wZG93bk1vZGU6XCJzY3JvbGxcIixvbkZvY3VzOmZ1bmN0aW9uKCl7fSxvbkJsdXI6ZnVuY3Rpb24oKXt9LG9uS2V5RG93bjpmdW5jdGlvbigpe30sb25JbnB1dENsaWNrOmZ1bmN0aW9uKCl7fSxvblNlbGVjdDpmdW5jdGlvbigpe30sb25DbGlja091dHNpZGU6ZnVuY3Rpb24oKXt9LG9uTW9udGhDaGFuZ2U6ZnVuY3Rpb24oKXt9LG9uQ2FsZW5kYXJPcGVuOmZ1bmN0aW9uKCl7fSxvbkNhbGVuZGFyQ2xvc2U6ZnVuY3Rpb24oKXt9LHByZXZlbnRPcGVuT25Gb2N1czohMSxvblllYXJDaGFuZ2U6ZnVuY3Rpb24oKXt9LG9uSW5wdXRFcnJvcjpmdW5jdGlvbigpe30sbW9udGhzU2hvd246MSxyZWFkT25seTohMSx3aXRoUG9ydGFsOiExLHNlbGVjdHNEaXNhYmxlZERheXNJblJhbmdlOiExLHNob3VsZENsb3NlT25TZWxlY3Q6ITAsc2hvd1RpbWVTZWxlY3Q6ITEsc2hvd1RpbWVJbnB1dDohMSxzaG93UHJldmlvdXNNb250aHM6ITEsc2hvd01vbnRoWWVhclBpY2tlcjohMSxzaG93RnVsbE1vbnRoWWVhclBpY2tlcjohMSxzaG93VHdvQ29sdW1uTW9udGhZZWFyUGlja2VyOiExLHNob3dGb3VyQ29sdW1uTW9udGhZZWFyUGlja2VyOiExLHNob3dZZWFyUGlja2VyOiExLHNob3dRdWFydGVyWWVhclBpY2tlcjohMSxzaG93V2Vla1BpY2tlcjohMSxzdHJpY3RQYXJzaW5nOiExLHN3YXBSYW5nZTohMSx0aW1lSW50ZXJ2YWxzOjMwLHRpbWVDYXB0aW9uOlwiVGltZVwiLHByZXZpb3VzTW9udGhBcmlhTGFiZWw6XCJQcmV2aW91cyBNb250aFwiLHByZXZpb3VzTW9udGhCdXR0b25MYWJlbDpcIlByZXZpb3VzIE1vbnRoXCIsbmV4dE1vbnRoQXJpYUxhYmVsOlwiTmV4dCBNb250aFwiLG5leHRNb250aEJ1dHRvbkxhYmVsOlwiTmV4dCBNb250aFwiLHByZXZpb3VzWWVhckFyaWFMYWJlbDpcIlByZXZpb3VzIFllYXJcIixwcmV2aW91c1llYXJCdXR0b25MYWJlbDpcIlByZXZpb3VzIFllYXJcIixuZXh0WWVhckFyaWFMYWJlbDpcIk5leHQgWWVhclwiLG5leHRZZWFyQnV0dG9uTGFiZWw6XCJOZXh0IFllYXJcIix0aW1lSW5wdXRMYWJlbDpcIlRpbWVcIixlbmFibGVUYWJMb29wOiEwLHllYXJJdGVtTnVtYmVyOlNlLGZvY3VzU2VsZWN0ZWRNb250aDohMSxzaG93UG9wcGVyQXJyb3c6ITAsZXhjbHVkZVNjcm9sbGJhcjohMCxjdXN0b21UaW1lSW5wdXQ6bnVsbCxjYWxlbmRhclN0YXJ0RGF5OnZvaWQgMCx0b2dnbGVDYWxlbmRhck9uSWNvbkNsaWNrOiExLHVzZVBvaW50ZXJFdmVudDohMX19LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLHRoaXMub25TY3JvbGwsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsdGhpcy5zZXRIaWRkZW5TdGF0ZU9uVmlzaWJpbGl0eUhpZGRlbil9LG4ucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciByLG4sYSxvLHMsaTtlLmlubGluZSYmKHM9ZS5zZWxlY3RlZCxpPXRoaXMucHJvcHMuc2VsZWN0ZWQscyYmaT9DLmdldE1vbnRoKHMpIT09Qy5nZXRNb250aChpKXx8eC5nZXRZZWFyKHMpIT09eC5nZXRZZWFyKGkpOnMhPT1pKSYmdGhpcy5zZXRQcmVTZWxlY3Rpb24odGhpcy5wcm9wcy5zZWxlY3RlZCksdm9pZCAwIT09dGhpcy5zdGF0ZS5tb250aFNlbGVjdGVkSW4mJmUubW9udGhzU2hvd24hPT10aGlzLnByb3BzLm1vbnRoc1Nob3duJiZ0aGlzLnNldFN0YXRlKHttb250aFNlbGVjdGVkSW46MH0pLGUuaGlnaGxpZ2h0RGF0ZXMhPT10aGlzLnByb3BzLmhpZ2hsaWdodERhdGVzJiZ0aGlzLnNldFN0YXRlKHtoaWdobGlnaHREYXRlczpkdCh0aGlzLnByb3BzLmhpZ2hsaWdodERhdGVzKX0pLHQuZm9jdXNlZHx8V2UoZS5zZWxlY3RlZCx0aGlzLnByb3BzLnNlbGVjdGVkKXx8dGhpcy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTpudWxsfSksdC5vcGVuIT09dGhpcy5zdGF0ZS5vcGVuJiYoITE9PT10Lm9wZW4mJiEwPT09dGhpcy5zdGF0ZS5vcGVuJiYobnVsbD09PShuPShyPXRoaXMucHJvcHMpLm9uQ2FsZW5kYXJPcGVuKXx8dm9pZCAwPT09bnx8bi5jYWxsKHIpKSwhMD09PXQub3BlbiYmITE9PT10aGlzLnN0YXRlLm9wZW4mJihudWxsPT09KG89KGE9dGhpcy5wcm9wcykub25DYWxlbmRhckNsb3NlKXx8dm9pZCAwPT09b3x8by5jYWxsKGEpKSl9LG4ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5jbGVhclByZXZlbnRGb2N1c1RpbWVvdXQoKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLHRoaXMub25TY3JvbGwsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsdGhpcy5zZXRIaWRkZW5TdGF0ZU9uVmlzaWJpbGl0eUhpZGRlbil9LG4ucHJvdG90eXBlLnJlbmRlcklucHV0Q29udGFpbmVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyxyPWUuc2hvd0ljb24sbj1lLmljb24sYT1lLmNhbGVuZGFySWNvbkNsYXNzbmFtZSxvPWUuY2FsZW5kYXJJY29uQ2xhc3NOYW1lLHM9ZS50b2dnbGVDYWxlbmRhck9uSWNvbkNsaWNrLGk9dGhpcy5zdGF0ZS5vcGVuO3JldHVybiBhJiZjb25zb2xlLndhcm4oXCJjYWxlbmRhckljb25DbGFzc25hbWUgcHJvcHMgaXMgZGVwcmVjYXRlZC4gc2hvdWxkIHVzZSBjYWxlbmRhckljb25DbGFzc05hbWUgcHJvcHMuXCIpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXJcIi5jb25jYXQocj9cIiByZWFjdC1kYXRlcGlja2VyX192aWV3LWNhbGVuZGFyLWljb25cIjpcIlwiKX0sciYmdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGp0LGdlKHtpY29uOm4sY2xhc3NOYW1lOnQuY2xzeChvLCFvJiZhLGkmJlwicmVhY3QtZGF0ZXBpY2tlci1pZ25vcmUtb25jbGlja291dHNpZGVcIil9LHM/e29uQ2xpY2s6dGhpcy50b2dnbGVDYWxlbmRhcn06bnVsbCkpLHRoaXMuc3RhdGUuaXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2UmJnRoaXMucmVuZGVyQXJpYUxpdmVSZWdpb24oKSx0aGlzLnJlbmRlckRhdGVJbnB1dCgpLHRoaXMucmVuZGVyQ2xlYXJCdXR0b24oKSl9LG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVuZGVyQ2FsZW5kYXIoKTtpZih0aGlzLnByb3BzLmlubGluZSlyZXR1cm4gZTtpZih0aGlzLnByb3BzLndpdGhQb3J0YWwpe3ZhciB0PXRoaXMuc3RhdGUub3Blbj91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoenQse2VuYWJsZVRhYkxvb3A6dGhpcy5wcm9wcy5lbmFibGVUYWJMb29wfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsXCIsdGFiSW5kZXg6LTEsb25LZXlEb3duOnRoaXMub25Qb3J0YWxLZXlEb3dufSxlKSk6bnVsbDtyZXR1cm4gdGhpcy5zdGF0ZS5vcGVuJiZ0aGlzLnByb3BzLnBvcnRhbElkJiYodD11ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVXQsZ2Uoe3BvcnRhbElkOnRoaXMucHJvcHMucG9ydGFsSWR9LHRoaXMucHJvcHMpLHQpKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixudWxsLHRoaXMucmVuZGVySW5wdXRDb250YWluZXIoKSx0KX1yZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEp0LGdlKHt9LHRoaXMucHJvcHMse2NsYXNzTmFtZTp0aGlzLnByb3BzLnBvcHBlckNsYXNzTmFtZSxoaWRlUG9wcGVyOiF0aGlzLmlzQ2FsZW5kYXJPcGVuKCksdGFyZ2V0Q29tcG9uZW50OnRoaXMucmVuZGVySW5wdXRDb250YWluZXIoKSxwb3BwZXJDb21wb25lbnQ6ZSxwb3BwZXJPbktleURvd246dGhpcy5vblBvcHBlcktleURvd24sc2hvd0Fycm93OnRoaXMucHJvcHMuc2hvd1BvcHBlckFycm93fSkpfSxufShyLkNvbXBvbmVudCksbnI9XCJpbnB1dFwiLGFyPVwibmF2aWdhdGVcIjtlLkNhbGVuZGFyQ29udGFpbmVyPWtlLGUuZGVmYXVsdD1ycixlLmdldERlZmF1bHRMb2NhbGU9cWUsZS5yZWdpc3RlckxvY2FsZT1mdW5jdGlvbihlLHQpe3ZhciByPXdlKCk7ci5fX2xvY2FsZURhdGFfX3x8KHIuX19sb2NhbGVEYXRhX189e30pLHIuX19sb2NhbGVEYXRhX19bZV09dH0sZS5zZXREZWZhdWx0TG9jYWxlPWZ1bmN0aW9uKGUpe3dlKCkuX19sb2NhbGVJZF9fPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSkpO1xuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBTY2hlZHVsZXIgPSByZXF1aXJlKCdzY2hlZHVsZXInKTtcblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbnZhciBzdXBwcmVzc1dhcm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHNldFN1cHByZXNzV2FybmluZyhuZXdTdXBwcmVzc1dhcm5pbmcpIHtcbiAge1xuICAgIHN1cHByZXNzV2FybmluZyA9IG5ld1N1cHByZXNzV2FybmluZztcbiAgfVxufSAvLyBJbiBERVYsIGNhbGxzIHRvIGNvbnNvbGUud2FybiBhbmQgY29uc29sZS5lcnJvciBnZXQgcmVwbGFjZWRcbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBpZiAoIXN1cHByZXNzV2FybmluZykge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxudmFyIEZ1bmN0aW9uQ29tcG9uZW50ID0gMDtcbnZhciBDbGFzc0NvbXBvbmVudCA9IDE7XG52YXIgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCA9IDI7IC8vIEJlZm9yZSB3ZSBrbm93IHdoZXRoZXIgaXQgaXMgZnVuY3Rpb24gb3IgY2xhc3NcblxudmFyIEhvc3RSb290ID0gMzsgLy8gUm9vdCBvZiBhIGhvc3QgdHJlZS4gQ291bGQgYmUgbmVzdGVkIGluc2lkZSBhbm90aGVyIG5vZGUuXG5cbnZhciBIb3N0UG9ydGFsID0gNDsgLy8gQSBzdWJ0cmVlLiBDb3VsZCBiZSBhbiBlbnRyeSBwb2ludCB0byBhIGRpZmZlcmVudCByZW5kZXJlci5cblxudmFyIEhvc3RDb21wb25lbnQgPSA1O1xudmFyIEhvc3RUZXh0ID0gNjtcbnZhciBGcmFnbWVudCA9IDc7XG52YXIgTW9kZSA9IDg7XG52YXIgQ29udGV4dENvbnN1bWVyID0gOTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSAxMDtcbnZhciBGb3J3YXJkUmVmID0gMTE7XG52YXIgUHJvZmlsZXIgPSAxMjtcbnZhciBTdXNwZW5zZUNvbXBvbmVudCA9IDEzO1xudmFyIE1lbW9Db21wb25lbnQgPSAxNDtcbnZhciBTaW1wbGVNZW1vQ29tcG9uZW50ID0gMTU7XG52YXIgTGF6eUNvbXBvbmVudCA9IDE2O1xudmFyIEluY29tcGxldGVDbGFzc0NvbXBvbmVudCA9IDE3O1xudmFyIERlaHlkcmF0ZWRGcmFnbWVudCA9IDE4O1xudmFyIFN1c3BlbnNlTGlzdENvbXBvbmVudCA9IDE5O1xudmFyIFNjb3BlQ29tcG9uZW50ID0gMjE7XG52YXIgT2Zmc2NyZWVuQ29tcG9uZW50ID0gMjI7XG52YXIgTGVnYWN5SGlkZGVuQ29tcG9uZW50ID0gMjM7XG52YXIgQ2FjaGVDb21wb25lbnQgPSAyNDtcbnZhciBUcmFjaW5nTWFya2VyQ29tcG9uZW50ID0gMjU7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoID0gdHJ1ZTsgLy8gVE9ETzogTmVlZCB0byByZXZpZXcgdGhpcyBjb2RlIG9uZSBtb3JlIHRpbWUgYmVmb3JlIGxhbmRpbmdcbi8vIHRoZSByZWFjdC1yZWNvbmNpbGVyIHBhY2thZ2UuXG5cbnZhciBlbmFibGVOZXdSZWNvbmNpbGVyID0gZmFsc2U7IC8vIFN1cHBvcnQgbGVnYWN5IFByaW1lciBzdXBwb3J0IG9uIGludGVybmFsIEZCIHd3d1xuXG52YXIgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiA9IGZhbHNlOyAvLyBGQi1vbmx5IHVzYWdlLiBUaGUgbmV3IEFQSSBoYXMgZGlmZmVyZW50IHNlbWFudGljcy5cblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcblxudmFyIGVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2sgPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpenpcbi8vIFJlYWN0IERPTSBDaG9wcGluZyBCbG9ja1xuLy9cbi8vIFNpbWlsYXIgdG8gbWFpbiBDaG9wcGluZyBCbG9jayBidXQgb25seSBmbGFncyByZWxhdGVkIHRvIFJlYWN0IERPTS4gVGhlc2UgYXJlXG4vLyBncm91cGVkIGJlY2F1c2Ugd2Ugd2lsbCBsaWtlbHkgYmF0Y2ggYWxsIG9mIHRoZW0gaW50byBhIHNpbmdsZSBtYWpvciByZWxlYXNlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpc2FibGUgc3VwcG9ydCBmb3IgY29tbWVudCBub2RlcyBhcyBSZWFjdCBET00gY29udGFpbmVycy4gQWxyZWFkeSBkaXNhYmxlZFxuLy8gaW4gb3BlbiBzb3VyY2UsIGJ1dCB3d3cgY29kZWJhc2Ugc3RpbGwgcmVsaWVzIG9uIGl0LiBOZWVkIHRvIHJlbW92ZS5cblxudmFyIGRpc2FibGVDb21tZW50c0FzRE9NQ29udGFpbmVycyA9IHRydWU7IC8vIERpc2FibGUgamF2YXNjcmlwdDogVVJMIHN0cmluZ3MgaW4gaHJlZiBmb3IgWFNTIHByb3RlY3Rpb24uXG4vLyBhbmQgY2xpZW50IHJlbmRlcmluZywgbW9zdGx5IHRvIGFsbG93IEpTWCBhdHRyaWJ1dGVzIHRvIGFwcGx5IHRvIHRoZSBjdXN0b21cbi8vIGVsZW1lbnQncyBvYmplY3QgcHJvcGVydGllcyBpbnN0ZWFkIG9mIG9ubHkgSFRNTCBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTM0N1xuXG52YXIgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA9IGZhbHNlOyAvLyBEaXNhYmxlcyBjaGlsZHJlbiBmb3IgPHRleHRhcmVhPiBlbGVtZW50c1xudmFyIHdhcm5BYm91dFN0cmluZ1JlZnMgPSB0cnVlOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVidWdnaW5nIGFuZCBEZXZUb29sc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFkZHMgdXNlciB0aW1pbmcgbWFya3MgZm9yIGUuZy4gc3RhdGUgdXBkYXRlcywgc3VzcGVuc2UsIGFuZCB3b3JrIGxvb3Agc3R1ZmYsXG4vLyBmb3IgYW4gZXhwZXJpbWVudGFsIHRpbWVsaW5lIHRvb2wuXG5cbnZhciBlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIgPSB0cnVlOyAvLyBIZWxwcyBpZGVudGlmeSBzaWRlIGVmZmVjdHMgaW4gcmVuZGVyLXBoYXNlIGxpZmVjeWNsZSBob29rcyBhbmQgc2V0U3RhdGVcblxudmFyIGVuYWJsZVByb2ZpbGVyVGltZXIgPSB0cnVlOyAvLyBSZWNvcmQgZHVyYXRpb25zIGZvciBjb21taXQgYW5kIHBhc3NpdmUgZWZmZWN0cyBwaGFzZXMuXG5cbnZhciBlbmFibGVQcm9maWxlckNvbW1pdEhvb2tzID0gdHJ1ZTsgLy8gUGhhc2UgcGFyYW0gcGFzc2VkIHRvIG9uUmVuZGVyIGNhbGxiYWNrIGRpZmZlcmVudGlhdGVzIGJldHdlZW4gYW4gXCJ1cGRhdGVcIiBhbmQgYSBcImNhc2NhZGluZy11cGRhdGVcIi5cblxudmFyIGFsbE5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoKTtcbi8qKlxuICogTWFwcGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIGV2ZW50IG5hbWVcbiAqL1xuXG5cbnZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0ge307XG4vKipcbiAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcmVnaXN0cmF0aW9uIG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLFxuICogdXNlZCB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgZXZlbnQgaGFuZGxlcnMuIEF2YWlsYWJsZVxuICogb25seSBpbiB0cnVlLlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuXG52YXIgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9ICB7fSA7IC8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25seSB1c2UgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyBpbiB0cnVlXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUgKyAnQ2FwdHVyZScsIGRlcGVuZGVuY2llcyk7XG59XG5mdW5jdGlvbiByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0pIHtcbiAgICAgIGVycm9yKCdFdmVudFJlZ2lzdHJ5OiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSAnICsgJ3JlZ2lzdHJhdGlvbiBuYW1lLCBgJXNgLicsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0gPSBkZXBlbmRlbmNpZXM7XG5cbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHJlZ2lzdHJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA9IHJlZ2lzdHJhdGlvbk5hbWU7XG5cbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uRG91YmxlQ2xpY2snKSB7XG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2sgPSByZWdpc3RyYXRpb25OYW1lO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYWxsTmF0aXZlRXZlbnRzLmFkZChkZXBlbmRlbmNpZXNbaV0pO1xuICB9XG59XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnKTtcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIGF0dHJpYnV0ZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBhdHRyaWJ1dGVOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgcHJvcCBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBwcm9wTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgQ1NTIHByb3BlcnR5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrSHRtbFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIEhUTUwgbWFya3VwIHVzZXMgYSB2YWx1ZSBvZiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ0Zvcm0gZmllbGQgdmFsdWVzICh2YWx1ZSwgY2hlY2tlZCwgZGVmYXVsdFZhbHVlLCBvciBkZWZhdWx0Q2hlY2tlZCBwcm9wcyknICsgJyBtdXN0IGJlIHN0cmluZ3MsIG5vdCAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbi8vIEEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuLy8gSXQgaXMgaGFuZGxlZCBieSBSZWFjdCBzZXBhcmF0ZWx5IGFuZCBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxudmFyIFJFU0VSVkVEID0gMDsgLy8gQSBzaW1wbGUgc3RyaW5nIGF0dHJpYnV0ZS5cbi8vIEF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpbHRlciBhcmUgcHJlc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuXG5cbnZhciBTVFJJTkcgPSAxOyAvLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cblxudmFyIEJPT0xFQU5JU0hfU1RSSU5HID0gMjsgLy8gQSByZWFsIGJvb2xlYW4gYXR0cmlidXRlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG5cbnZhciBCT09MRUFOID0gMzsgLy8gQW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG4vLyBGb3IgYW55IG90aGVyIHZhbHVlLCBzaG91bGQgYmUgcHJlc2VudCB3aXRoIHRoYXQgdmFsdWUuXG5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBOVU1FUklDID0gNTsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgUE9TSVRJVkVfTlVNRVJJQyA9IDY7XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gXCI6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXCI7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxudmFyIEFUVFJJQlVURV9OQU1FX0NIQVIgPSBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgXCJcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MFwiO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbnZhciB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGlzQXR0cmlidXRlTmFtZVNhZmUoYXR0cmlidXRlTmFtZSkge1xuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWC50ZXN0KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuXG4gIHtcbiAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgbmFtZTogYCVzYCcsIGF0dHJpYnV0ZU5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAobmFtZS5sZW5ndGggPiAyICYmIChuYW1lWzBdID09PSAnbycgfHwgbmFtZVswXSA9PT0gJ08nKSAmJiAobmFtZVsxXSA9PT0gJ24nIHx8IG5hbWVbMV0gPT09ICdOJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdmdW5jdGlvbic6IC8vICRGbG93SXNzdWUgc3ltYm9sIGlzIHBlcmZlY3RseSB2YWxpZCBoZXJlXG5cbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiAhcHJvcGVydHlJbmZvLmFjY2VwdHNCb29sZWFucztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJlZml4ID0gbmFtZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsIDUpO1xuICAgICAgICAgIHJldHVybiBwcmVmaXggIT09ICdkYXRhLScgJiYgcHJlZml4ICE9PSAnYXJpYS0nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuXG4gICAgc3dpdGNoIChwcm9wZXJ0eUluZm8udHlwZSkge1xuICAgICAgY2FzZSBCT09MRUFOOlxuICAgICAgICByZXR1cm4gIXZhbHVlO1xuXG4gICAgICBjYXNlIE9WRVJMT0FERURfQk9PTEVBTjpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTtcblxuICAgICAgY2FzZSBOVU1FUklDOlxuICAgICAgICByZXR1cm4gaXNOYU4odmFsdWUpO1xuXG4gICAgICBjYXNlIFBPU0lUSVZFX05VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSkgfHwgdmFsdWUgPCAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldFByb3BlcnR5SW5mbyhuYW1lKSB7XG4gIHJldHVybiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gcHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCB0eXBlLCBtdXN0VXNlUHJvcGVydHksIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWVzcGFjZSwgc2FuaXRpemVVUkwsIHJlbW92ZUVtcHR5U3RyaW5nKSB7XG4gIHRoaXMuYWNjZXB0c0Jvb2xlYW5zID0gdHlwZSA9PT0gQk9PTEVBTklTSF9TVFJJTkcgfHwgdHlwZSA9PT0gQk9PTEVBTiB8fCB0eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU47XG4gIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gIHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlID0gYXR0cmlidXRlTmFtZXNwYWNlO1xuICB0aGlzLm11c3RVc2VQcm9wZXJ0eSA9IG11c3RVc2VQcm9wZXJ0eTtcbiAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBuYW1lO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnNhbml0aXplVVJMID0gc2FuaXRpemVVUkw7XG4gIHRoaXMucmVtb3ZlRW1wdHlTdHJpbmcgPSByZW1vdmVFbXB0eVN0cmluZztcbn0gLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGlzIGxpc3QsIGJlIHN1cmUgdG8gYWxzbyBhZGQgdGhlbSB0b1xuLy8gdGhlIGBwb3NzaWJsZVN0YW5kYXJkTmFtZXNgIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3Rcbi8vIG5hbWUgd2FybmluZ3MuXG5cblxudmFyIHByb3BlcnRpZXMgPSB7fTsgLy8gVGhlc2UgcHJvcHMgYXJlIHJlc2VydmVkIGJ5IFJlYWN0LiBUaGV5IHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG5cbnZhciByZXNlcnZlZFByb3BzID0gWydjaGlsZHJlbicsICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsIC8vIFRPRE86IFRoaXMgcHJldmVudHMgdGhlIGFzc2lnbm1lbnQgb2YgZGVmYXVsdFZhbHVlIHRvIHJlZ3VsYXJcbi8vIGVsZW1lbnRzIChub3QganVzdCBpbnB1dHMpLiBOb3cgdGhhdCBSZWFjdERPTUlucHV0IGFzc2lnbnMgdG8gdGhlXG4vLyBkZWZhdWx0VmFsdWUgcHJvcGVydHkgLS0gZG8gd2UgbmVlZCB0aGlzP1xuJ2RlZmF1bHRWYWx1ZScsICdkZWZhdWx0Q2hlY2tlZCcsICdpbm5lckhUTUwnLCAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJywgJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsICdzdHlsZSddO1xuXG5yZXNlcnZlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUkVTRVJWRUQsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBBIGZldyBSZWFjdCBzdHJpbmcgYXR0cmlidXRlcyBoYXZlIGEgZGlmZmVyZW50IG5hbWUuXG4vLyBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIFJlYWN0IHByb3AgbmFtZXMgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lcy5cblxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cblxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5cblsnYXV0b1JldmVyc2UnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmb2N1c2FibGUnLCAncHJlc2VydmVBbHBoYSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMuXG5cblsnYWxsb3dGdWxsU2NyZWVuJywgJ2FzeW5jJywgLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJywgJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsICdmb3JtTm9WYWxpZGF0ZScsICdoaWRkZW4nLCAnbG9vcCcsICdub01vZHVsZScsICdub1ZhbGlkYXRlJywgJ29wZW4nLCAncGxheXNJbmxpbmUnLCAncmVhZE9ubHknLCAncmVxdWlyZWQnLCAncmV2ZXJzZWQnLCAnc2NvcGVkJywgJ3NlYW1sZXNzJywgLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblxuWydjaGVja2VkJywgLy8gTm90ZTogYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbi8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuIFdlIGhhdmUgc3BlY2lhbCBsb2dpYyBmb3IgaGFuZGxpbmcgdGhpcy5cbidtdWx0aXBsZScsICdtdXRlZCcsICdzZWxlY3RlZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgdHJ1ZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFyZSBcIm92ZXJsb2FkZWQgYm9vbGVhbnNcIjogdGhleSBiZWhhdmUgbGlrZVxuLy8gYm9vbGVhbnMsIGJ1dCBjYW4gYWxzbyBhY2NlcHQgYSBzdHJpbmcgdmFsdWUuXG5cblsnY2FwdHVyZScsICdkb3dubG9hZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblxuWydjb2xzJywgJ3Jvd3MnLCAnc2l6ZScsICdzcGFuJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBQT1NJVElWRV9OVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgbnVtYmVycy5cblxuWydyb3dTcGFuJywgJ3N0YXJ0J10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBOVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pO1xudmFyIENBTUVMSVpFID0gL1tcXC1cXDpdKFthLXpdKS9nO1xuXG52YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICByZXR1cm4gdG9rZW5bMV0udG9VcHBlckNhc2UoKTtcbn07IC8vIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBTVkcgYXR0cmlidXRlcyB0aGF0IG5lZWQgc3BlY2lhbCBjYXNpbmcsIG5hbWVzcGFjaW5nLFxuLy8gb3IgYm9vbGVhbiB2YWx1ZSBhc3NpZ25tZW50LiBSZWd1bGFyIGF0dHJpYnV0ZXMgdGhhdCBqdXN0IGFjY2VwdCBzdHJpbmdzXG4vLyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcmUgb21pdHRlZCwganVzdCBsaWtlIGluIHRoZSBIVE1MIGF0dHJpYnV0ZSBmaWx0ZXIuXG4vLyBTb21lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGhhcmQgdG8gZmluZC4gVGhpcyBsaXN0IHdhcyBjcmVhdGVkIGJ5XG4vLyBzY3JhcGluZyB0aGUgTUROIGRvY3VtZW50YXRpb24uXG5cblxuWydhY2NlbnQtaGVpZ2h0JywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhcmFiaWMtZm9ybScsICdiYXNlbGluZS1zaGlmdCcsICdjYXAtaGVpZ2h0JywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnZG9taW5hbnQtYmFzZWxpbmUnLCAnZW5hYmxlLWJhY2tncm91bmQnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdnbHlwaC1uYW1lJywgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLCAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLCAnaG9yaXotYWR2LXgnLCAnaG9yaXotb3JpZ2luLXgnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2xldHRlci1zcGFjaW5nJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnb3ZlcmxpbmUtcG9zaXRpb24nLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJywgJ3BhaW50LW9yZGVyJywgJ3Bhbm9zZS0xJywgJ3BvaW50ZXItZXZlbnRzJywgJ3JlbmRlcmluZy1pbnRlbnQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlLXdpZHRoJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd1bmRlcmxpbmUtcG9zaXRpb24nLCAndW5kZXJsaW5lLXRoaWNrbmVzcycsICd1bmljb2RlLWJpZGknLCAndW5pY29kZS1yYW5nZScsICd1bml0cy1wZXItZW0nLCAndi1hbHBoYWJldGljJywgJ3YtaGFuZ2luZycsICd2LWlkZW9ncmFwaGljJywgJ3YtbWF0aGVtYXRpY2FsJywgJ3ZlY3Rvci1lZmZlY3QnLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd29yZC1zcGFjaW5nJywgJ3dyaXRpbmctbW9kZScsICd4bWxuczp4bGluaycsICd4LWhlaWdodCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhsaW5rIG5hbWVzcGFjZS5cblxuWyd4bGluazphY3R1YXRlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6cm9sZScsICd4bGluazpzaG93JywgJ3hsaW5rOnRpdGxlJywgJ3hsaW5rOnR5cGUnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeG1sIG5hbWVzcGFjZS5cblxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZSBleGlzdHMgYm90aCBpbiBIVE1MIGFuZCBTVkcuXG4vLyBUaGUgYXR0cmlidXRlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUgaW4gU1ZHIHNvIHdlIGNhbid0IGp1c3QgdXNlXG4vLyB0aGUgUmVhY3QgbmFtZSBsaWtlIHdlIGRvIGZvciBhdHRyaWJ1dGVzIHRoYXQgZXhpc3Qgb25seSBpbiBIVE1MLlxuXG5bJ3RhYkluZGV4JywgJ2Nyb3NzT3JpZ2luJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZXMgYWNjZXB0IFVSTHMuIFRoZXNlIG11c3Qgbm90IGFsbG93IGphdmFzY3JpcHQ6IFVSTFMuXG4vLyBUaGVzZSB3aWxsIGFsc28gbmVlZCB0byBhY2NlcHQgVHJ1c3RlZCBUeXBlcyBvYmplY3QgaW4gdGhlIGZ1dHVyZS5cblxudmFyIHhsaW5rSHJlZiA9ICd4bGlua0hyZWYnO1xucHJvcGVydGllc1t4bGlua0hyZWZdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZCgneGxpbmtIcmVmJywgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4neGxpbms6aHJlZicsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbmZhbHNlKTtcblsnc3JjJywgJ2hyZWYnLCAnYWN0aW9uJywgJ2Zvcm1BY3Rpb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIHRydWUsIC8vIHNhbml0aXplVVJMXG4gIHRydWUpO1xufSk7XG5cbi8vIGFuZCBhbnkgbmV3bGluZSBvciB0YWIgYXJlIGZpbHRlcmVkIG91dCBhcyBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBVUkwuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1wYXJzaW5nXG4vLyBUYWIgb3IgbmV3bGluZSBhcmUgZGVmaW5lZCBhcyBcXHJcXG5cXHQ6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktdGFiLW9yLW5ld2xpbmVcbi8vIEEgQzAgY29udHJvbCBpcyBhIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlIFxcdTAwMDAgTlVMTCB0byBcXHUwMDFGXG4vLyBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FLCBpbmNsdXNpdmU6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYzAtY29udHJvbC1vci1zcGFjZVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbnZhciBpc0phdmFTY3JpcHRQcm90b2NvbCA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyXFxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSpcXDovaTtcbnZhciBkaWRXYXJuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNhbml0aXplVVJMKHVybCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuICYmIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QodXJsKSkge1xuICAgICAgZGlkV2FybiA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdBIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0IHdpbGwgYmxvY2sgamF2YXNjcmlwdDogVVJMcyBhcyBhIHNlY3VyaXR5IHByZWNhdXRpb24uICcgKyAnVXNlIGV2ZW50IGhhbmRsZXJzIGluc3RlYWQgaWYgeW91IGNhbi4gSWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgdW5zYWZlIEhUTUwgdHJ5ICcgKyAndXNpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgaW5zdGVhZC4gUmVhY3Qgd2FzIHBhc3NlZCAlcy4nLCBKU09OLnN0cmluZ2lmeSh1cmwpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuICAgICAgcmV0dXJuIG5vZGVbcHJvcGVydHlOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBjaGVjayBwcm90ZWN0cyBtdWx0aXBsZSB1c2VzIG9mIGBleHBlY3RlZGAsIHdoaWNoIGlzIHdoeSB0aGVcbiAgICAgIC8vIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uIHJ1bGUgaXMgZGlzYWJsZWQgaW4gc2V2ZXJhbCBzcG90c1xuICAgICAgLy8gYmVsb3cuXG4gICAgICB7XG4gICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oZXhwZWN0ZWQsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZ1bGx5IGRpc2FibGVkIGphdmFzY3JpcHQ6IFVSTHMsIGFuZCBpZlxuICAgICAgICAvLyB0aGUgaHlkcmF0aW9uIGlzIHN1Y2Nlc3NmdWwgb2YgYSBqYXZhc2NyaXB0OiBVUkwsIHdlXG4gICAgICAgIC8vIHN0aWxsIHdhbnQgdG8gd2FybiBvbiB0aGUgY2xpZW50LlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgICAgc2FuaXRpemVVUkwoJycgKyBleHBlY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2UgaGFkIGFuIGF0dHJpYnV0ZSBidXQgc2hvdWxkbid0IGhhdmUgaGFkIG9uZSwgc28gcmVhZCBpdFxuICAgICAgICAgIC8vIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGJvb2xlYW4sIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHZhbHVlIGlzXG4gICAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBleHBlY3RlZC5cbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgIH0gLy8gRXZlbiBpZiB0aGlzIHByb3BlcnR5IHVzZXMgYSBuYW1lc3BhY2Ugd2UgdXNlIGdldEF0dHJpYnV0ZVxuICAgICAgICAvLyBiZWNhdXNlIHdlIGFzc3VtZSBpdHMgbmFtZXNwYWNlZCBuYW1lIGlzIHRoZSBzYW1lIGFzIG91ciBjb25maWcuXG4gICAgICAgIC8vIFRvIHVzZSBnZXRBdHRyaWJ1dGVOUyB3ZSBuZWVkIHRoZSBsb2NhbCBuYW1lIHdoaWNoIHdlIGRvbid0IGhhdmVcbiAgICAgICAgLy8gaW4gb3VyIGNvbmZpZyBhdG0uXG5cblxuICAgICAgICBzdHJpbmdWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT09IG51bGwgPyBleHBlY3RlZCA6IHN0cmluZ1ZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIGF0dHJpYnV0ZSBvbiBhIG5vZGUuIE9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICogVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLiBTb21lXG4gKiBhdHRyaWJ1dGVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICB7XG4gICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKGV4cGVjdGVkLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUsIHZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuXG4gIGlmIChzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHZhbHVlID0gbnVsbDtcbiAgfVxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAge1xuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKTtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbnZhciBSRUFDVF9DQUNIRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY2FjaGUnKTtcbnZhciBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QudHJhY2luZ19tYXJrZXInKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShjdG9yLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGN0b3IsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUZpYmVyKGZpYmVyKSB7XG4gIHZhciBvd25lciA9ICBmaWJlci5fZGVidWdPd25lciA/IGZpYmVyLl9kZWJ1Z093bmVyLnR5cGUgOiBudWxsIDtcbiAgdmFyIHNvdXJjZSA9ICBmaWJlci5fZGVidWdTb3VyY2UgO1xuXG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdMYXp5Jyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZS5yZW5kZXIpO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZCh3b3JrSW5Qcm9ncmVzcykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIGRvIHtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVGaWJlcihub2RlKTtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlKTtcblxuICAgIHJldHVybiBpbmZvO1xuICB9IGNhdGNoICh4KSB7XG4gICAgcmV0dXJuICdcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiAnICsgeC5tZXNzYWdlICsgJ1xcbicgKyB4LnN0YWNrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lJDEob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGVcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSQxKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB7XG4gIHZhciB0YWcgPSBmaWJlci50YWcsXG4gICAgICB0eXBlID0gZmliZXIudHlwZTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ0NhY2hlJztcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZSQxKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgY2FzZSBEZWh5ZHJhdGVkRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0RlaHlkcmF0ZWRGcmFnbWVudCc7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUkMSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIC8vIEhvc3QgY29tcG9uZW50IHR5cGUgaXMgdGhlIGRpc3BsYXkgbmFtZSAoZS5nLiBcImRpdlwiLCBcIlZpZXdcIilcbiAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiAnUm9vdCc7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuICdUZXh0JztcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIC8vIE5hbWUgY29tZXMgZnJvbSB0aGUgdHlwZSBpbiB0aGlzIGNhc2U7IHdlIGRvbid0IGhhdmUgYSB0YWcuXG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgY2FzZSBNb2RlOlxuICAgICAgaWYgKHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUpIHtcbiAgICAgICAgLy8gRG9uJ3QgYmUgbGVzcyBzcGVjaWZpYyB0aGFuIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGVcbiAgICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNb2RlJztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdPZmZzY3JlZW4nO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU2NvcGUnO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1RyYWNpbmdNYXJrZXInO1xuICAgIC8vIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgdGFncyBjb21lIGZyb20gdGhlIHVzZXItcHJvdmlkZWQgdHlwZTpcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IC8vIFNhZmUgYmVjYXVzZSBpZiBjdXJyZW50IGZpYmVyIGV4aXN0cywgd2UgYXJlIHJlY29uY2lsaW5nLFxuICAgIC8vIGFuZCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSB3b3JrLWluLXByb2dyZXNzIHZlcnNpb24uXG5cblxuICAgIHJldHVybiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoY3VycmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG4gICAgY3VycmVudCA9IG51bGw7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0Q3VycmVudEZpYmVyKGZpYmVyKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IGZpYmVyID09PSBudWxsID8gbnVsbCA6IGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXY7XG4gICAgY3VycmVudCA9IGZpYmVyO1xuICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiBzZXRJc1JlbmRlcmluZyhyZW5kZXJpbmcpIHtcbiAge1xuICAgIGlzUmVuZGVyaW5nID0gcmVuZGVyaW5nO1xuICB9XG59XG5cbi8vIEZsb3cgZG9lcyBub3QgYWxsb3cgc3RyaW5nIGNvbmNhdGVuYXRpb24gb2YgbW9zdCBub24tc3RyaW5nIHR5cGVzLiBUbyB3b3JrXG4vLyBhcm91bmQgdGhpcyBsaW1pdGF0aW9uLCB3ZSB1c2UgYW4gb3BhcXVlIHR5cGUgdGhhdCBjYW4gb25seSBiZSBvYnRhaW5lZCBieVxuLy8gcGFzc2luZyB0aGUgdmFsdWUgdGhyb3VnaCBnZXRUb1N0cmluZ1ZhbHVlIGZpcnN0LlxuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gVGhlIGNvZXJjaW9uIHNhZmV0eSBjaGVjayBpcyBwZXJmb3JtZWQgaW4gZ2V0VG9TdHJpbmdWYWx1ZSgpLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSB7XG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZnVuY3Rpb24sIHN5bWJvbCBhcmUgYXNzaWduZWQgYXMgZW1wdHkgc3RyaW5nc1xuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbnZhciBoYXNSZWFkT25seVZhbHVlID0ge1xuICBidXR0b246IHRydWUsXG4gIGNoZWNrYm94OiB0cnVlLFxuICBpbWFnZTogdHJ1ZSxcbiAgaGlkZGVuOiB0cnVlLFxuICByYWRpbzogdHJ1ZSxcbiAgcmVzZXQ6IHRydWUsXG4gIHN1Ym1pdDogdHJ1ZVxufTtcbmZ1bmN0aW9uIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHModGFnTmFtZSwgcHJvcHMpIHtcbiAge1xuICAgIGlmICghKGhhc1JlYWRPbmx5VmFsdWVbcHJvcHMudHlwZV0gfHwgcHJvcHMub25DaGFuZ2UgfHwgcHJvcHMub25JbnB1dCB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy52YWx1ZSA9PSBudWxsKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuXG4gICAgaWYgKCEocHJvcHMub25DaGFuZ2UgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMuY2hlY2tlZCA9PSBudWxsKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NoZWNrYWJsZShlbGVtKSB7XG4gIHZhciB0eXBlID0gZWxlbS50eXBlO1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhY2tlcihub2RlKSB7XG4gIHJldHVybiBub2RlLl92YWx1ZVRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIGRldGFjaFRyYWNrZXIobm9kZSkge1xuICBub2RlLl92YWx1ZVRyYWNrZXIgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlID0gJyc7XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKGlzQ2hlY2thYmxlKG5vZGUpKSB7XG4gICAgdmFsdWUgPSBub2RlLmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gbm9kZS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJhY2tWYWx1ZU9uTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZUZpZWxkID0gaXNDaGVja2FibGUobm9kZSkgPyAnY2hlY2tlZCcgOiAndmFsdWUnO1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHZhbHVlRmllbGQpO1xuXG4gIHtcbiAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24obm9kZVt2YWx1ZUZpZWxkXSk7XG4gIH1cblxuICB2YXIgY3VycmVudFZhbHVlID0gJycgKyBub2RlW3ZhbHVlRmllbGRdOyAvLyBpZiBzb21lb25lIGhhcyBhbHJlYWR5IGRlZmluZWQgYSB2YWx1ZSBvciBTYWZhcmksIHRoZW4gYmFpbFxuICAvLyBhbmQgZG9uJ3QgdHJhY2sgdmFsdWUgd2lsbCBjYXVzZSBvdmVyIHJlcG9ydGluZyBvZiBjaGFuZ2VzLFxuICAvLyBidXQgaXQncyBiZXR0ZXIgdGhlbiBhIGhhcmQgZmFpbHVyZVxuICAvLyAobmVlZGVkIGZvciBjZXJ0YWluIHRlc3RzIHRoYXQgc3B5T24gaW5wdXQgdmFsdWVzIGFuZCBTYWZhcmkpXG5cbiAgaWYgKG5vZGUuaGFzT3duUHJvcGVydHkodmFsdWVGaWVsZCkgfHwgdHlwZW9mIGRlc2NyaXB0b3IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkZXNjcmlwdG9yLmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5zZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQsXG4gICAgICBzZXQgPSBkZXNjcmlwdG9yLnNldDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0LmNhbGwodGhpcyk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgIH1cbiAgfSk7IC8vIFdlIGNvdWxkJ3ZlIHBhc3NlZCB0aGlzIHRoZSBmaXJzdCB0aW1lXG4gIC8vIGJ1dCBpdCB0cmlnZ2VycyBhIGJ1ZyBpbiBJRTExIGFuZCBFZGdlIDE0LzE1LlxuICAvLyBDYWxsaW5nIGRlZmluZVByb3BlcnR5KCkgYWdhaW4gc2hvdWxkIGJlIGVxdWl2YWxlbnQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE3NjhcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZVxuICB9KTtcbiAgdmFyIHRyYWNrZXIgPSB7XG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfSxcbiAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfSxcbiAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRldGFjaFRyYWNrZXIobm9kZSk7XG4gICAgICBkZWxldGUgbm9kZVt2YWx1ZUZpZWxkXTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0cmFja2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjayhub2RlKSB7XG4gIGlmIChnZXRUcmFja2VyKG5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG5cblxuICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpO1xufVxuZnVuY3Rpb24gdXBkYXRlVmFsdWVJZkNoYW5nZWQobm9kZSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIobm9kZSk7IC8vIGlmIHRoZXJlIGlzIG5vIHRyYWNrZXIgYXQgdGhpcyBwb2ludCBpdCdzIHVubGlrZWx5XG4gIC8vIHRoYXQgdHJ5aW5nIGFnYWluIHdpbGwgc3VjY2VlZFxuXG4gIGlmICghdHJhY2tlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxhc3RWYWx1ZSA9IHRyYWNrZXIuZ2V0VmFsdWUoKTtcbiAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUobm9kZSk7XG5cbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG4gIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG4gIHJldHVybiBob3N0UHJvcHM7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlKGVsZW1lbnQsIHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdpbnB1dCcsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5jaGVja2VkICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRDaGVja2VkIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSBjaGVja2VkIHByb3AsIG9yIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG5cbiAgICAgIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCA/ICcnIDogcHJvcHMuZGVmYXVsdFZhbHVlO1xuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbENoZWNrZWQ6IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCxcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUgIT0gbnVsbCA/IHByb3BzLnZhbHVlIDogZGVmYXVsdFZhbHVlKSxcbiAgICBjb250cm9sbGVkOiBpc0NvbnRyb2xsZWQocHJvcHMpXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuXG4gIGlmIChjaGVja2VkICE9IG51bGwpIHtcbiAgICBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsICdjaGVja2VkJywgY2hlY2tlZCwgZmFsc2UpO1xuICB9XG59XG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgdmFyIGNvbnRyb2xsZWQgPSBpc0NvbnRyb2xsZWQocHJvcHMpO1xuXG4gICAgaWYgKCFub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiBjb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgY2hhbmdpbmcgYW4gdW5jb250cm9sbGVkIGlucHV0IHRvIGJlIGNvbnRyb2xsZWQuICcgKyAnVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IHRoZSB2YWx1ZSBjaGFuZ2luZyBmcm9tIHVuZGVmaW5lZCB0byAnICsgJ2EgZGVmaW5lZCB2YWx1ZSwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmICFjb250cm9sbGVkICYmICFkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgY2hhbmdpbmcgYSBjb250cm9sbGVkIGlucHV0IHRvIGJlIHVuY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gYSBkZWZpbmVkIHRvICcgKyAndW5kZWZpbmVkLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKTtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciB0eXBlID0gcHJvcHMudHlwZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHZhbHVlID09PSAwICYmIG5vZGUudmFsdWUgPT09ICcnIHx8IC8vIFdlIGV4cGxpY2l0bHkgd2FudCB0byBjb2VyY2UgdG8gbnVtYmVyIGhlcmUgaWYgcG9zc2libGUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIG5vZGUudmFsdWUgIT0gdmFsdWUpIHtcbiAgICAgICAgbm9kZS52YWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0Jykge1xuICAgIC8vIFN1Ym1pdC9yZXNldCBpbnB1dHMgbmVlZCB0aGUgYXR0cmlidXRlIHJlbW92ZWQgY29tcGxldGVseSB0byBhdm9pZFxuICAgIC8vIGJsYW5rLXRleHQgYnV0dG9ucy5cbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBjb21lcyBmcm9tIGEgY2FzY2FkZSBvZlxuICAgIC8vIHByb3BlcnRpZXM6XG4gICAgLy8gIDEuIFRoZSB2YWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAyLiBUaGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDMuIE90aGVyd2lzZSB0aGVyZSBzaG91bGQgYmUgbm8gY2hhbmdlXG4gICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB7XG4gICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgaXQgb25seSBjaGFuZ2VzIHdoZW4gaXQgbmVlZHNcbiAgICAvLyB0byBiZSByZW1vdmVkLCBzdWNoIGFzIHRyYW5zaXRpb25pbmcgZnJvbSBhIGNoZWNrYm94IGludG8gYSB0ZXh0IGlucHV0XG4gICAgaWYgKHByb3BzLmNoZWNrZWQgPT0gbnVsbCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFwcm9wcy5kZWZhdWx0Q2hlY2tlZDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIoZWxlbWVudCwgcHJvcHMsIGlzSHlkcmF0aW5nKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgLy8gZnJvbSBiZWluZyBsb3N0IGR1cmluZyBTU1IgaHlkcmF0aW9uLlxuXG4gIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSB8fCBwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdmFyIGlzQnV0dG9uID0gdHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JzsgLy8gQXZvaWQgc2V0dGluZyB2YWx1ZSBhdHRyaWJ1dGUgb24gc3VibWl0L3Jlc2V0IGlucHV0cyBhcyBpdCBvdmVycmlkZXMgdGhlXG4gICAgLy8gZGVmYXVsdCB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYnJvd3Nlci4gU2VlOiAjMTI4NzJcblxuICAgIGlmIChpc0J1dHRvbiAmJiAocHJvcHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBwcm9wcy52YWx1ZSA9PT0gbnVsbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7IC8vIERvIG5vdCBhc3NpZ24gdmFsdWUgaWYgaXQgaXMgYWxyZWFkeSBzZXQuIFRoaXMgcHJldmVudHMgdXNlciB0ZXh0IGlucHV0XG4gICAgLy8gZnJvbSBiZWluZyBsb3N0IGR1cmluZyBTU1IgaHlkcmF0aW9uLlxuXG4gICAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgICAge1xuICAgICAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIHByb3BlcnR5IHNob3VsZCB1c2VcbiAgICAgICAgLy8gdGhlIHdyYXBwZXJTdGF0ZS5faW5pdGlhbFZhbHVlIHByb3BlcnR5LiBUaGlzIHVzZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMy4gQW4gZW1wdHkgc3RyaW5nXG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgICAgICBub2RlLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIHN5bmNocm9uaXplZCB0byB0aGUgcHJvcGVydHksXG4gICAgICAvLyBzbyB3ZSBhc3NpZ24gZGVmYXVsdFZhbHVlIHRvIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgLy8gYXNzaWdubWVudCBzdGVwIGFib3ZlLlxuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgfVxuICB9IC8vIE5vcm1hbGx5LCB3ZSdkIGp1c3QgZG8gYG5vZGUuY2hlY2tlZCA9IG5vZGUuY2hlY2tlZGAgdXBvbiBpbml0aWFsIG1vdW50LCBsZXNzIHRoaXMgYnVnXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgY2hyb21lIGJ1ZyB3aGVyZSBzZXR0aW5nIGRlZmF1bHRDaGVja2VkXG4gIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS5cbiAgLy8gUmVmZXJlbmNlOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD02MDg0MTZcbiAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSB1bnNldCBuYW1lIHRvIGF2b2lkIGRpc3J1cHRpbmcgcmFkaW8gYnV0dG9uIGdyb3Vwcy5cblxuXG4gIHZhciBuYW1lID0gbm9kZS5uYW1lO1xuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9ICcnO1xuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGJvdGggdGhlIGNoZWNrZWQgcHJvcGVydHkgYW5kXG4gICAgLy8gYXR0cmlidXRlIGFyZSBhc3NpZ25lZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIGRlZmF1bHRDaGVja2VkLiBUaGlzIHVzZXM6XG4gICAgLy9cbiAgICAvLyAgIDEuIFRoZSBjaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMi4gVGhlIGRlZmF1bHRDaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMy4gT3RoZXJ3aXNlLCBmYWxzZVxuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XG4gIH1cblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSBuYW1lO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdXBkYXRlV3JhcHBlcihub2RlLCBwcm9wcyk7XG4gIHVwZGF0ZU5hbWVkQ291c2lucyhub2RlLCBwcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU5hbWVkQ291c2lucyhyb290Tm9kZSwgcHJvcHMpIHtcbiAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuXG4gIGlmIChwcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5hbWUgIT0gbnVsbCkge1xuICAgIHZhciBxdWVyeVJvb3QgPSByb290Tm9kZTtcblxuICAgIHdoaWxlIChxdWVyeVJvb3QucGFyZW50Tm9kZSkge1xuICAgICAgcXVlcnlSb290ID0gcXVlcnlSb290LnBhcmVudE5vZGU7XG4gICAgfSAvLyBJZiBgcm9vdE5vZGUuZm9ybWAgd2FzIG5vbi1udWxsLCB0aGVuIHdlIGNvdWxkIHRyeSBgZm9ybS5lbGVtZW50c2AsXG4gICAgLy8gYnV0IHRoYXQgc29tZXRpbWVzIGJlaGF2ZXMgc3RyYW5nZWx5IGluIElFOC4gV2UgY291bGQgYWxzbyB0cnkgdXNpbmdcbiAgICAvLyBgZm9ybS5nZXRFbGVtZW50c0J5TmFtZWAsIGJ1dCB0aGF0IHdpbGwgb25seSByZXR1cm4gZGlyZWN0IGNoaWxkcmVuXG4gICAgLy8gYW5kIHdvbid0IGluY2x1ZGUgaW5wdXRzIHRoYXQgdXNlIHRoZSBIVE1MNSBgZm9ybT1gIGF0dHJpYnV0ZS4gU2luY2VcbiAgICAvLyB0aGUgaW5wdXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gYSBmb3JtLiBJdCBtaWdodCBub3QgZXZlbiBiZSBpbiB0aGVcbiAgICAvLyBkb2N1bWVudC4gTGV0J3MganVzdCB1c2UgdGhlIGxvY2FsIGBxdWVyeVNlbGVjdG9yQWxsYCB0byBlbnN1cmUgd2UgZG9uJ3RcbiAgICAvLyBtaXNzIGFueXRoaW5nLlxuXG5cbiAgICB7XG4gICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKG5hbWUsICduYW1lJyk7XG4gICAgfVxuXG4gICAgdmFyIGdyb3VwID0gcXVlcnlSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9JyArIEpTT04uc3RyaW5naWZ5KCcnICsgbmFtZSkgKyAnXVt0eXBlPVwicmFkaW9cIl0nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvdGhlck5vZGUgPSBncm91cFtpXTtcblxuICAgICAgaWYgKG90aGVyTm9kZSA9PT0gcm9vdE5vZGUgfHwgb3RoZXJOb2RlLmZvcm0gIT09IHJvb3ROb2RlLmZvcm0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIFRoaXMgd2lsbCB0aHJvdyBpZiByYWRpbyBidXR0b25zIHJlbmRlcmVkIGJ5IGRpZmZlcmVudCBjb3BpZXMgb2YgUmVhY3RcbiAgICAgIC8vIGFuZCB0aGUgc2FtZSBuYW1lIGFyZSByZW5kZXJlZCBpbnRvIHRoZSBzYW1lIGZvcm0gKHNhbWUgYXMgIzE5MzkpLlxuICAgICAgLy8gVGhhdCdzIHByb2JhYmx5IG9rYXk7IHdlIGRvbid0IHN1cHBvcnQgaXQganVzdCBhcyB3ZSBkb24ndCBzdXBwb3J0XG4gICAgICAvLyBtaXhpbmcgUmVhY3QgcmFkaW8gYnV0dG9ucyB3aXRoIG5vbi1SZWFjdCBvbmVzLlxuXG5cbiAgICAgIHZhciBvdGhlclByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShvdGhlck5vZGUpO1xuXG4gICAgICBpZiAoIW90aGVyUHJvcHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgJyArICdzYW1lIGBuYW1lYCBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfSAvLyBXZSBuZWVkIHVwZGF0ZSB0aGUgdHJhY2tlZCB2YWx1ZSBvbiB0aGUgbmFtZWQgY291c2luIHNpbmNlIHRoZSB2YWx1ZVxuICAgICAgLy8gd2FzIGNoYW5nZWQgYnV0IHRoZSBpbnB1dCBzYXcgbm8gZXZlbnQgb3IgdmFsdWUgc2V0XG5cblxuICAgICAgdXBkYXRlVmFsdWVJZkNoYW5nZWQob3RoZXJOb2RlKTsgLy8gSWYgdGhpcyBpcyBhIGNvbnRyb2xsZWQgcmFkaW8gYnV0dG9uIGdyb3VwLCBmb3JjaW5nIHRoZSBpbnB1dCB0aGF0XG4gICAgICAvLyB3YXMgcHJldmlvdXNseSBjaGVja2VkIHRvIHVwZGF0ZSB3aWxsIGNhdXNlIGl0IHRvIGJlIGNvbWUgcmUtY2hlY2tlZFxuICAgICAgLy8gYXMgYXBwcm9wcmlhdGUuXG5cbiAgICAgIHVwZGF0ZVdyYXBwZXIob3RoZXJOb2RlLCBvdGhlclByb3BzKTtcbiAgICB9XG4gIH1cbn0gLy8gSW4gQ2hyb21lLCBhc3NpZ25pbmcgZGVmYXVsdFZhbHVlIHRvIGNlcnRhaW4gaW5wdXQgdHlwZXMgdHJpZ2dlcnMgaW5wdXQgdmFsaWRhdGlvbi5cbi8vIEZvciBudW1iZXIgaW5wdXRzLCB0aGUgZGlzcGxheSB2YWx1ZSBsb3NlcyB0cmFpbGluZyBkZWNpbWFsIHBvaW50cy4gRm9yIGVtYWlsIGlucHV0cyxcbi8vIENocm9tZSByYWlzZXMgXCJUaGUgc3BlY2lmaWVkIHZhbHVlIDx4PiBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIuXG4vL1xuLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRWYWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXNcbi8vIHdoZW4gdGhlIHVzZXIgaXMgaW5wdXR0aW5nIHRleHRcbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTNcblxuXG5mdW5jdGlvbiBzZXREZWZhdWx0VmFsdWUobm9kZSwgdHlwZSwgdmFsdWUpIHtcbiAgaWYgKCAvLyBGb2N1c2VkIG51bWJlciBpbnB1dHMgc3luY2hyb25pemUgb24gYmx1ci4gU2VlIENoYW5nZUV2ZW50UGx1Z2luLmpzXG4gIHR5cGUgIT09ICdudW1iZXInIHx8IGdldEFjdGl2ZUVsZW1lbnQobm9kZS5vd25lckRvY3VtZW50KSAhPT0gbm9kZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5kZWZhdWx0VmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IGZhbHNlO1xudmFyIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSBmYWxzZTtcbnZhciBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IGZhbHNlO1xuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxvcHRpb24+IGhvc3QgY29tcG9uZW50IHRoYXQgd2FybnMgd2hlbiBgc2VsZWN0ZWRgIGlzIHNldC5cbiAqL1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHtcbiAgICAvLyBJZiBhIHZhbHVlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiB0aGUgY2hpbGRyZW4gbXVzdCBiZSBzaW1wbGUuXG4gICAgaWYgKHByb3BzLnZhbHVlID09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdvYmplY3QnICYmIHByb3BzLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZGlkV2FybkludmFsaWRDaGlsZCkge1xuICAgICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgaW5mZXIgdGhlIG9wdGlvbiB2YWx1ZSBvZiBjb21wbGV4IGNoaWxkcmVuLiAnICsgJ1Bhc3MgYSBgdmFsdWVgIHByb3Agb3IgdXNlIGEgcGxhaW4gc3RyaW5nIGFzIGNoaWxkcmVuIHRvIDxvcHRpb24+LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZElubmVySFRNTCkge1xuICAgICAgICAgIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdQYXNzIGEgYHZhbHVlYCBwcm9wIGlmIHlvdSBzZXQgZGFuZ2Vyb3VzbHlJbm5lckhUTUwgc28gUmVhY3Qga25vd3MgJyArICd3aGljaCB2YWx1ZSBzaG91bGQgYmUgc2VsZWN0ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFRPRE86IFJlbW92ZSBzdXBwb3J0IGZvciBgc2VsZWN0ZWRgIGluIDxvcHRpb24+LlxuXG5cbiAgICBpZiAocHJvcHMuc2VsZWN0ZWQgIT0gbnVsbCAmJiAhZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24pIHtcbiAgICAgIGVycm9yKCdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVjdD4gaW5zdGVhZCBvZiAnICsgJ3NldHRpbmcgYHNlbGVjdGVkYCBvbiA8b3B0aW9uPi4nKTtcblxuICAgICAgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIHZhbHVlPVwiXCIgc2hvdWxkIG1ha2UgYSB2YWx1ZSBhdHRyaWJ1dGUgKCM2MjE5KVxuICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHRvU3RyaW5nKGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpKSk7XG4gIH1cbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDE7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICBpZiAob3duZXJOYW1lKSB7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciB2YWx1ZVByb3BOYW1lcyA9IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107XG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdzZWxlY3QnLCBwcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcblxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcE5hbWVJc0FycmF5ID0gaXNBcnJheShwcm9wc1twcm9wTmFtZV0pO1xuXG4gICAgICBpZiAocHJvcHMubXVsdGlwbGUgJiYgIXByb3BOYW1lSXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGFuIGFycmF5IGlmICcgKyAnYG11bHRpcGxlYCBpcyB0cnVlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKTtcbiAgICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIHByb3BOYW1lSXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMobm9kZSwgbXVsdGlwbGUsIHByb3BWYWx1ZSwgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gIHZhciBvcHRpb25zID0gbm9kZS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHZhciBzZWxlY3RlZFZhbHVlcyA9IHByb3BWYWx1ZTtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gUHJlZml4IHRvIGF2b2lkIGNoYW9zIHdpdGggc3BlY2lhbCBrZXlzLlxuICAgICAgc2VsZWN0ZWRWYWx1ZVsnJCcgKyBzZWxlY3RlZFZhbHVlc1tpXV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRpb25zW19pXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkICYmIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgdmFyIF9zZWxlY3RlZFZhbHVlID0gdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wVmFsdWUpKTtcblxuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3B0aW9ucy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICBpZiAob3B0aW9uc1tfaTJdLnZhbHVlID09PSBfc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW19pMl0uc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICBvcHRpb25zW19pMl0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZmF1bHRTZWxlY3RlZCA9PT0gbnVsbCAmJiAhb3B0aW9uc1tfaTJdLmRpc2FibGVkKSB7XG4gICAgICAgIGRlZmF1bHRTZWxlY3RlZCA9IG9wdGlvbnNbX2kyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFNlbGVjdGVkICE9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0U2VsZWN0ZWQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMShlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgfSk7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcyk7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgd2FzTXVsdGlwbGU6ICEhcHJvcHMubXVsdGlwbGVcbiAgfTtcblxuICB7XG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxKSB7XG4gICAgICBlcnJvcignU2VsZWN0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBzZWxlY3QgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICBub2RlLm11bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RVcGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHdhc011bHRpcGxlID0gbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO1xuICBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmICh3YXNNdWx0aXBsZSAhPT0gISFwcm9wcy5tdWx0aXBsZSkge1xuICAgIC8vIEZvciBzaW1wbGljaXR5LCByZWFwcGx5IGBkZWZhdWx0VmFsdWVgIGlmIGBtdWx0aXBsZWAgaXMgdG9nZ2xlZC5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBzZWxlY3QgYmFjayB0byBpdHMgZGVmYXVsdCB1bnNlbGVjdGVkIHN0YXRlLlxuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5tdWx0aXBsZSA/IFtdIDogJycsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IGZhbHNlO1xuXG4vKipcbiAqIEltcGxlbWVudHMgYSA8dGV4dGFyZWE+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgYHZhbHVlYCwgYW5kXG4gKiBgZGVmYXVsdFZhbHVlYC4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIHRyYWRpdGlvbmFsIERPTSBBUEkgYmVjYXVzZSB2YWx1ZSBpc1xuICogdXN1YWxseSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGVcbiAqIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsXG4gKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRoZSBwcm9wXG4gKiBgZGVmYXVsdFZhbHVlYCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBjaGlsZHJlbiBjb250ZW50IChkZXByZWNhdGVkKS5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi4nKTtcbiAgfSAvLyBBbHdheXMgc2V0IGNoaWxkcmVuIHRvIHRoZSBzYW1lIHRoaW5nLiBJbiBJRTksIHRoZSBzZWxlY3Rpb24gcmFuZ2Ugd2lsbFxuICAvLyBnZXQgcmVzZXQgaWYgYHRleHRDb250ZW50YCBpcyBtdXRhdGVkLiAgV2UgY291bGQgYWRkIGEgY2hlY2sgaW4gc2V0VGV4dENvbnRlbnRcbiAgLy8gdG8gb25seSBzZXQgdGhlIHZhbHVlIGlmL3doZW4gdGhlIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgbm9kZSB2YWx1ZSAod2hpY2ggd291bGRcbiAgLy8gY29tcGxldGVseSBzb2x2ZSB0aGlzIElFOSBidWcpLCBidXQgU2ViYXN0aWFuK1NvcGhpZSBzZWVtZWQgdG8gbGlrZSB0aGlzXG4gIC8vIHNvbHV0aW9uLiBUaGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbiBvciBvYmplY3Qgc28gdGhhdCdzIHdoeSBpdCdzIGZvcmNlZFxuICAvLyB0byBiZSBhIHN0cmluZy5cblxuXG4gIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGlsZHJlbjogdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSlcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3RleHRhcmVhJywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcpO1xuXG4gICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRpYWxWYWx1ZSA9IHByb3BzLnZhbHVlOyAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuXG4gIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJyk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJZiB5b3Ugc3VwcGx5IGBkZWZhdWx0VmFsdWVgIG9uIGEgPHRleHRhcmVhPiwgZG8gbm90IHBhc3MgY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCc8dGV4dGFyZWE+IGNhbiBvbmx5IGhhdmUgYXQgbW9zdCBvbmUgY2hpbGQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlblswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNoaWxkcmVuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdFZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgaW5pdGlhbFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShpbml0aWFsVmFsdWUpXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgIHZhciBuZXdWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTsgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGxvc2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5nZWRcblxuICAgIGlmIChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCAmJiBub2RlLmRlZmF1bHRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhkZWZhdWx0VmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90XG4gIC8vIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLlxuXG4gIHZhciB0ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQ7IC8vIE9ubHkgc2V0IG5vZGUudmFsdWUgaWYgdGV4dENvbnRlbnQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkXG4gIC8vIGluaXRpYWwgdmFsdWUuIEluIElFMTAvSUUxMSB0aGVyZSBpcyBhIGJ1ZyB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgYXR0cmlidXRlXG4gIC8vIHdpbGwgcG9wdWxhdGUgdGV4dENvbnRlbnQgYXMgd2VsbC5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTAxNTI1L1xuXG4gIGlmICh0ZXh0Q29udGVudCA9PT0gbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSkge1xuICAgIGlmICh0ZXh0Q29udGVudCAhPT0gJycgJiYgdGV4dENvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0ZXh0Q29udGVudDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZVxuICB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpO1xufVxuXG52YXIgSFRNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG52YXIgTUFUSF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCc7XG52YXIgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7IC8vIEFzc3VtZXMgdGhlcmUgaXMgbm8gcGFyZW50IG5hbWVzcGFjZS5cblxuZnVuY3Rpb24gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3ZnJzpcbiAgICAgIHJldHVybiBTVkdfTkFNRVNQQUNFO1xuXG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PSBudWxsIHx8IHBhcmVudE5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAvLyBObyAob3IgZGVmYXVsdCkgcGFyZW50IG5hbWVzcGFjZTogcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuICAgIHJldHVybiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAocGFyZW50TmFtZXNwYWNlID09PSBTVkdfTkFNRVNQQUNFICYmIHR5cGUgPT09ICdmb3JlaWduT2JqZWN0Jykge1xuICAgIC8vIFdlJ3JlIGxlYXZpbmcgU1ZHLlxuICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfSAvLyBCeSBkZWZhdWx0LCBwYXNzIG5hbWVzcGFjZSBiZWxvdy5cblxuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lcjtcbi8qKlxuICogU2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG5cbiAgICBpZiAoISgnaW5uZXJIVE1MJyBpbiBub2RlKSkge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBpbm5lckhUTUwgZm9yIFNWRyBub2Rlcywgc28gaW5zdGVhZCB3ZSBpbmplY3QgdGhlXG4gICAgICAvLyBuZXcgbWFya3VwIGluIGEgdGVtcCBub2RlIGFuZCB0aGVuIG1vdmUgdGhlIGNoaWxkIG5vZGVzIGFjcm9zcyBpbnRvXG4gICAgICAvLyB0aGUgdGFyZ2V0IG5vZGVcbiAgICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyID0gcmV1c2FibGVTVkdDb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHN2Zz4nICsgaHRtbC52YWx1ZU9mKCkudG9TdHJpbmcoKSArICc8L3N2Zz4nO1xuICAgICAgdmFyIHN2Z05vZGUgPSByZXVzYWJsZVNWR0NvbnRhaW5lci5maXJzdENoaWxkO1xuXG4gICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHN2Z05vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLmFwcGVuZENoaWxkKHN2Z05vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBub2RlLmlubmVySFRNTCA9IGh0bWw7XG59KTtcblxuLyoqXG4gKiBIVE1MIG5vZGVUeXBlIHZhbHVlcyB0aGF0IHJlcHJlc2VudCB0aGUgdHlwZSBvZiB0aGUgbm9kZVxuICovXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG52YXIgRE9DVU1FTlRfTk9ERSA9IDk7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG4vKipcbiAqIFNldCB0aGUgdGV4dENvbnRlbnQgcHJvcGVydHkgb2YgYSBub2RlLiBGb3IgdGV4dCB1cGRhdGVzLCBpdCdzIGZhc3RlclxuICogdG8gc2V0IHRoZSBgbm9kZVZhbHVlYCBvZiB0aGUgVGV4dCBub2RlIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmdcbiAqIGAudGV4dENvbnRlbnRgIHdoaWNoIHdpbGwgcmVtb3ZlIHRoZSBleGlzdGluZyBub2RlIGFuZCBjcmVhdGUgYSBuZXcgb25lLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChub2RlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0KSB7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG5cbiAgICBpZiAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkID09PSBub2RlLmxhc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gdGV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn07XG5cbi8vIExpc3QgZGVyaXZlZCBmcm9tIEdlY2tvIHNvdXJjZSBjb2RlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvNGU2MzhlZmM3MS9sYXlvdXQvc3R5bGUvdGVzdC9wcm9wZXJ0eV9kYXRhYmFzZS5qc1xudmFyIHNob3J0aGFuZFRvTG9uZ2hhbmQgPSB7XG4gIGFuaW1hdGlvbjogWydhbmltYXRpb25EZWxheScsICdhbmltYXRpb25EaXJlY3Rpb24nLCAnYW5pbWF0aW9uRHVyYXRpb24nLCAnYW5pbWF0aW9uRmlsbE1vZGUnLCAnYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQnLCAnYW5pbWF0aW9uTmFtZScsICdhbmltYXRpb25QbGF5U3RhdGUnLCAnYW5pbWF0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgYmFja2dyb3VuZDogWydiYWNrZ3JvdW5kQXR0YWNobWVudCcsICdiYWNrZ3JvdW5kQ2xpcCcsICdiYWNrZ3JvdW5kQ29sb3InLCAnYmFja2dyb3VuZEltYWdlJywgJ2JhY2tncm91bmRPcmlnaW4nLCAnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJywgJ2JhY2tncm91bmRSZXBlYXQnLCAnYmFja2dyb3VuZFNpemUnXSxcbiAgYmFja2dyb3VuZFBvc2l0aW9uOiBbJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWSddLFxuICBib3JkZXI6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrRW5kOiBbJ2JvcmRlckJsb2NrRW5kQ29sb3InLCAnYm9yZGVyQmxvY2tFbmRTdHlsZScsICdib3JkZXJCbG9ja0VuZFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrU3RhcnQ6IFsnYm9yZGVyQmxvY2tTdGFydENvbG9yJywgJ2JvcmRlckJsb2NrU3RhcnRTdHlsZScsICdib3JkZXJCbG9ja1N0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyQm90dG9tOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJ10sXG4gIGJvcmRlckNvbG9yOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclRvcENvbG9yJ10sXG4gIGJvcmRlckltYWdlOiBbJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCddLFxuICBib3JkZXJJbmxpbmVFbmQ6IFsnYm9yZGVySW5saW5lRW5kQ29sb3InLCAnYm9yZGVySW5saW5lRW5kU3R5bGUnLCAnYm9yZGVySW5saW5lRW5kV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lU3RhcnQ6IFsnYm9yZGVySW5saW5lU3RhcnRDb2xvcicsICdib3JkZXJJbmxpbmVTdGFydFN0eWxlJywgJ2JvcmRlcklubGluZVN0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyTGVmdDogWydib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCddLFxuICBib3JkZXJSYWRpdXM6IFsnYm9yZGVyQm90dG9tTGVmdFJhZGl1cycsICdib3JkZXJCb3R0b21SaWdodFJhZGl1cycsICdib3JkZXJUb3BMZWZ0UmFkaXVzJywgJ2JvcmRlclRvcFJpZ2h0UmFkaXVzJ10sXG4gIGJvcmRlclJpZ2h0OiBbJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJ10sXG4gIGJvcmRlclN0eWxlOiBbJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclRvcFN0eWxlJ10sXG4gIGJvcmRlclRvcDogWydib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJXaWR0aDogWydib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BXaWR0aCddLFxuICBjb2x1bW5SdWxlOiBbJ2NvbHVtblJ1bGVDb2xvcicsICdjb2x1bW5SdWxlU3R5bGUnLCAnY29sdW1uUnVsZVdpZHRoJ10sXG4gIGNvbHVtbnM6IFsnY29sdW1uQ291bnQnLCAnY29sdW1uV2lkdGgnXSxcbiAgZmxleDogWydmbGV4QmFzaXMnLCAnZmxleEdyb3cnLCAnZmxleFNocmluayddLFxuICBmbGV4RmxvdzogWydmbGV4RGlyZWN0aW9uJywgJ2ZsZXhXcmFwJ10sXG4gIGZvbnQ6IFsnZm9udEZhbWlseScsICdmb250RmVhdHVyZVNldHRpbmdzJywgJ2ZvbnRLZXJuaW5nJywgJ2ZvbnRMYW5ndWFnZU92ZXJyaWRlJywgJ2ZvbnRTaXplJywgJ2ZvbnRTaXplQWRqdXN0JywgJ2ZvbnRTdHJldGNoJywgJ2ZvbnRTdHlsZScsICdmb250VmFyaWFudCcsICdmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJywgJ2ZvbnRXZWlnaHQnLCAnbGluZUhlaWdodCddLFxuICBmb250VmFyaWFudDogWydmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJ10sXG4gIGdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWQ6IFsnZ3JpZEF1dG9Db2x1bW5zJywgJ2dyaWRBdXRvRmxvdycsICdncmlkQXV0b1Jvd3MnLCAnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGdyaWRBcmVhOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0JywgJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRDb2x1bW46IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnXSxcbiAgZ3JpZENvbHVtbkdhcDogWydjb2x1bW5HYXAnXSxcbiAgZ3JpZEdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWRSb3c6IFsnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZFJvd0dhcDogWydyb3dHYXAnXSxcbiAgZ3JpZFRlbXBsYXRlOiBbJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBsaXN0U3R5bGU6IFsnbGlzdFN0eWxlSW1hZ2UnLCAnbGlzdFN0eWxlUG9zaXRpb24nLCAnbGlzdFN0eWxlVHlwZSddLFxuICBtYXJnaW46IFsnbWFyZ2luQm90dG9tJywgJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnLCAnbWFyZ2luVG9wJ10sXG4gIG1hcmtlcjogWydtYXJrZXJFbmQnLCAnbWFya2VyTWlkJywgJ21hcmtlclN0YXJ0J10sXG4gIG1hc2s6IFsnbWFza0NsaXAnLCAnbWFza0NvbXBvc2l0ZScsICdtYXNrSW1hZ2UnLCAnbWFza01vZGUnLCAnbWFza09yaWdpbicsICdtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknLCAnbWFza1JlcGVhdCcsICdtYXNrU2l6ZSddLFxuICBtYXNrUG9zaXRpb246IFsnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJ10sXG4gIG91dGxpbmU6IFsnb3V0bGluZUNvbG9yJywgJ291dGxpbmVTdHlsZScsICdvdXRsaW5lV2lkdGgnXSxcbiAgb3ZlcmZsb3c6IFsnb3ZlcmZsb3dYJywgJ292ZXJmbG93WSddLFxuICBwYWRkaW5nOiBbJ3BhZGRpbmdCb3R0b20nLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0JywgJ3BhZGRpbmdUb3AnXSxcbiAgcGxhY2VDb250ZW50OiBbJ2FsaWduQ29udGVudCcsICdqdXN0aWZ5Q29udGVudCddLFxuICBwbGFjZUl0ZW1zOiBbJ2FsaWduSXRlbXMnLCAnanVzdGlmeUl0ZW1zJ10sXG4gIHBsYWNlU2VsZjogWydhbGlnblNlbGYnLCAnanVzdGlmeVNlbGYnXSxcbiAgdGV4dERlY29yYXRpb246IFsndGV4dERlY29yYXRpb25Db2xvcicsICd0ZXh0RGVjb3JhdGlvbkxpbmUnLCAndGV4dERlY29yYXRpb25TdHlsZSddLFxuICB0ZXh0RW1waGFzaXM6IFsndGV4dEVtcGhhc2lzQ29sb3InLCAndGV4dEVtcGhhc2lzU3R5bGUnXSxcbiAgdHJhbnNpdGlvbjogWyd0cmFuc2l0aW9uRGVsYXknLCAndHJhbnNpdGlvbkR1cmF0aW9uJywgJ3RyYW5zaXRpb25Qcm9wZXJ0eScsICd0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgd29yZFdyYXA6IFsnb3ZlcmZsb3dXcmFwJ11cbn07XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG52YXIgaXNVbml0bGVzc051bWJlciA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG4gIGFzcGVjdFJhdGlvOiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZEFyZWE6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7XG4gIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpO1xufVxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107IC8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG5cbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHtcbiAgICByZXR1cm4gdmFsdWUgKyAncHgnOyAvLyBQcmVzdW1lcyBpbXBsaWNpdCAncHgnIHN1ZmZpeCBmb3IgdW5pdGxlc3MgbnVtYmVyc1xuICB9XG5cbiAge1xuICAgIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gIH1cblxuICByZXR1cm4gKCcnICsgdmFsdWUpLnRyaW0oKTtcbn1cblxudmFyIHVwcGVyY2FzZVBhdHRlcm4gPSAvKFtBLVpdKS9nO1xudmFyIG1zUGF0dGVybiA9IC9ebXMtLztcbi8qKlxuICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ2JhY2tncm91bmRDb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ01velRyYW5zaXRpb24nKVxuICogICA8IFwiLW1vei10cmFuc2l0aW9uXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ21zVHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbXMtdHJhbnNpdGlvblwiXG4gKlxuICogQXMgTW9kZXJuaXpyIHN1Z2dlc3RzIChodHRwOi8vbW9kZXJuaXpyLmNvbS9kb2NzLyNwcmVmaXhlZCksIGFuIGBtc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gYC1tcy1gLlxuICovXG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZVN0eWxlTmFtZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgJy0kMScpLnRvTG93ZXJDYXNlKCkucmVwbGFjZShtc1BhdHRlcm4sICctbXMtJyk7XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vICdtc1RyYW5zZm9ybScgaXMgY29ycmVjdCwgYnV0IHRoZSBvdGhlciBwcmVmaXhlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWRcbiAgdmFyIGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybiA9IC9eKD86d2Via2l0fG1venxvKVtBLVpdLztcbiAgdmFyIG1zUGF0dGVybiQxID0gL14tbXMtLztcbiAgdmFyIGh5cGhlblBhdHRlcm4gPSAvLSguKS9nOyAvLyBzdHlsZSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb25cblxuICB2YXIgYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuID0gLztcXHMqJC87XG4gIHZhciB3YXJuZWRTdHlsZU5hbWVzID0ge307XG4gIHZhciB3YXJuZWRTdHlsZVZhbHVlcyA9IHt9O1xuICB2YXIgd2FybmVkRm9yTmFOVmFsdWUgPSBmYWxzZTtcbiAgdmFyIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSBmYWxzZTtcblxuICB2YXIgY2FtZWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGh5cGhlblBhdHRlcm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHtcbiAgICAgIHJldHVybiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIC8vIEFzIEFuZGkgU21pdGggc3VnZ2VzdHNcbiAgICAvLyAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4XG4gICAgLy8gaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBgbXNgLlxuICAgIGNhbWVsaXplKG5hbWUucmVwbGFjZShtc1BhdHRlcm4kMSwgJ21zLScpKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlVmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoXCJTdHlsZSBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb24uIFwiICsgJ1RyeSBcIiVzOiAlc1wiIGluc3RlYWQuJywgbmFtZSwgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNOYU4gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9yTmFOVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JOYU5WYWx1ZSA9IHRydWU7XG5cbiAgICBlcnJvcignYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9ySW5maW5pdHlWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BJbmZpbml0eWAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzTmFOKG5hbWUsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlJDEgPSB3YXJuVmFsaWRTdHlsZTtcblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGNyZWF0ZXMgYSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBzdHlsZVxuICogYXR0cmlidXRlIGdlbmVyYXRlZCBieSBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuIEl0IGJ5LXBhc3NlcyB3YXJuaW5ncyBhbmRcbiAqIHNlY3VyaXR5IGNoZWNrcyBzbyBpdCdzIG5vdCBzYWZlIHRvIHVzZSB0aGlzIHZhbHVlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuXG4gKiBjb21wYXJpc29uLiBJdCBpcyBvbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMoc3R5bGVzKSB7XG4gIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9ICcnO1xuICAgIHZhciBkZWxpbWl0ZXIgPSAnJztcblxuICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cbiAgICAgIGlmIChzdHlsZVZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcbiAgICAgICAgc2VyaWFsaXplZCArPSBkZWxpbWl0ZXIgKyAoaXNDdXN0b21Qcm9wZXJ0eSA/IHN0eWxlTmFtZSA6IGh5cGhlbmF0ZVN0eWxlTmFtZShzdHlsZU5hbWUpKSArICc6JztcbiAgICAgICAgc2VyaWFsaXplZCArPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG4gICAgICAgIGRlbGltaXRlciA9ICc7JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZCB8fCBudWxsO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBtdWx0aXBsZSBzdHlsZXMgb24gYSBub2RlLiAgSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXNcbiAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICovXG5cbmZ1bmN0aW9uIHNldFZhbHVlRm9yU3R5bGVzKG5vZGUsIHN0eWxlcykge1xuICB2YXIgc3R5bGUgPSBub2RlLnN0eWxlO1xuXG4gIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuXG4gICAge1xuICAgICAgaWYgKCFpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICAgIHdhcm5WYWxpZFN0eWxlJDEoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlVmFsdWUgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGlzQ3VzdG9tUHJvcGVydHkpO1xuXG4gICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgc3R5bGVOYW1lID0gJ2Nzc0Zsb2F0JztcbiAgICB9XG5cbiAgICBpZiAoaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBzdHlsZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVFbXB0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG59XG4vKipcbiAqIEdpdmVuIHtjb2xvcjogJ3JlZCcsIG92ZXJmbG93OiAnaGlkZGVuJ30gcmV0dXJucyB7XG4gKiAgIGNvbG9yOiAnY29sb3InLFxuICogICBvdmVyZmxvd1g6ICdvdmVyZmxvdycsXG4gKiAgIG92ZXJmbG93WTogJ292ZXJmbG93JyxcbiAqIH0uIFRoaXMgY2FuIGJlIHJlYWQgYXMgXCJ0aGUgb3ZlcmZsb3dZIHByb3BlcnR5IHdhcyBzZXQgYnkgdGhlIG92ZXJmbG93XG4gKiBzaG9ydGhhbmRcIi4gVGhhdCBpcywgdGhlIHZhbHVlcyBhcmUgdGhlIHByb3BlcnR5IHRoYXQgZWFjaCB3YXMgZGVyaXZlZCBmcm9tLlxuICovXG5cblxuZnVuY3Rpb24gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlcykge1xuICB2YXIgZXhwYW5kZWQgPSB7fTtcblxuICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgdmFyIGxvbmdoYW5kcyA9IHNob3J0aGFuZFRvTG9uZ2hhbmRba2V5XSB8fCBba2V5XTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9uZ2hhbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBleHBhbmRlZFtsb25naGFuZHNbaV1dID0ga2V5O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbmRlZDtcbn1cbi8qKlxuICogV2hlbiBtaXhpbmcgc2hvcnRoYW5kIGFuZCBsb25naGFuZCBwcm9wZXJ0eSBuYW1lcywgd2Ugd2FybiBkdXJpbmcgdXBkYXRlcyBpZlxuICogd2UgZXhwZWN0IGFuIGluY29ycmVjdCByZXN1bHQgdG8gb2NjdXIuIEluIHBhcnRpY3VsYXIsIHdlIHdhcm4gZm9yOlxuICpcbiAqIFVwZGF0aW5nIGEgc2hvcnRoYW5kIHByb3BlcnR5IChsb25naGFuZCBnZXRzIG92ZXJ3cml0dGVuKTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnYmF6JywgZm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJ2JheidcbiAqIFJlbW92aW5nIGEgc2hvcnRoYW5kIHByb3BlcnR5IChsb25naGFuZCBnZXRzIGxvc3QgdG9vKTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250VmFyaWFudDogJ2Jhcid9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnQgPSAnJ1xuICogUmVtb3ZpbmcgYSBsb25naGFuZCBwcm9wZXJ0eSAoc2hvdWxkIHJldmVydCB0byBzaG9ydGhhbmQ7IGRvZXNuJ3QpOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdmb28nfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250VmFyaWFudCA9ICcnXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0U3R5bGVzKSB7XG4gIHtcbiAgICBpZiAoIW5leHRTdHlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXhwYW5kZWRVcGRhdGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlVXBkYXRlcyk7XG4gICAgdmFyIGV4cGFuZGVkU3R5bGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKG5leHRTdHlsZXMpO1xuICAgIHZhciB3YXJuZWRBYm91dCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGV4cGFuZGVkVXBkYXRlcykge1xuICAgICAgdmFyIG9yaWdpbmFsS2V5ID0gZXhwYW5kZWRVcGRhdGVzW2tleV07XG4gICAgICB2YXIgY29ycmVjdE9yaWdpbmFsS2V5ID0gZXhwYW5kZWRTdHlsZXNba2V5XTtcblxuICAgICAgaWYgKGNvcnJlY3RPcmlnaW5hbEtleSAmJiBvcmlnaW5hbEtleSAhPT0gY29ycmVjdE9yaWdpbmFsS2V5KSB7XG4gICAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3JpZ2luYWxLZXkgKyAnLCcgKyBjb3JyZWN0T3JpZ2luYWxLZXk7XG5cbiAgICAgICAgaWYgKHdhcm5lZEFib3V0W3dhcm5pbmdLZXldKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzIGEgc3R5bGUgcHJvcGVydHkgZHVyaW5nIHJlcmVuZGVyICglcykgd2hlbiBhICcgKyAnY29uZmxpY3RpbmcgcHJvcGVydHkgaXMgc2V0ICglcykgY2FuIGxlYWQgdG8gc3R5bGluZyBidWdzLiBUbyAnICsgXCJhdm9pZCB0aGlzLCBkb24ndCBtaXggc2hvcnRoYW5kIGFuZCBub24tc2hvcnRoYW5kIHByb3BlcnRpZXMgXCIgKyAnZm9yIHRoZSBzYW1lIHZhbHVlOyBpbnN0ZWFkLCByZXBsYWNlIHRoZSBzaG9ydGhhbmQgd2l0aCAnICsgJ3NlcGFyYXRlIHZhbHVlcy4nLCBpc1ZhbHVlRW1wdHkoc3R5bGVVcGRhdGVzW29yaWdpbmFsS2V5XSkgPyAnUmVtb3ZpbmcnIDogJ1VwZGF0aW5nJywgb3JpZ2luYWxLZXksIGNvcnJlY3RPcmlnaW5hbEtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3Mgc2hvdWxkIG9taXQgdGhlaXIgY2xvc2UgdGFnLiBXZSBrZWVwIGEgbGlzdCBmb3Jcbi8vIHRob3NlIHNwZWNpYWwtY2FzZSB0YWdzLlxudmFyIG9taXR0ZWRDbG9zZVRhZ3MgPSB7XG4gIGFyZWE6IHRydWUsXG4gIGJhc2U6IHRydWUsXG4gIGJyOiB0cnVlLFxuICBjb2w6IHRydWUsXG4gIGVtYmVkOiB0cnVlLFxuICBocjogdHJ1ZSxcbiAgaW1nOiB0cnVlLFxuICBpbnB1dDogdHJ1ZSxcbiAga2V5Z2VuOiB0cnVlLFxuICBsaW5rOiB0cnVlLFxuICBtZXRhOiB0cnVlLFxuICBwYXJhbTogdHJ1ZSxcbiAgc291cmNlOiB0cnVlLFxuICB0cmFjazogdHJ1ZSxcbiAgd2JyOiB0cnVlIC8vIE5PVEU6IG1lbnVpdGVtJ3MgY2xvc2UgdGFnIHNob3VsZCBiZSBvbWl0dGVkLCBidXQgdGhhdCBjYXVzZXMgcHJvYmxlbXMuXG5cbn07XG5cbi8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy5cblxudmFyIHZvaWRFbGVtZW50VGFncyA9IGFzc2lnbih7XG4gIG1lbnVpdGVtOiB0cnVlXG59LCBvbWl0dGVkQ2xvc2VUYWdzKTtcblxudmFyIEhUTUwgPSAnX19odG1sJztcblxuZnVuY3Rpb24gYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKSB7XG4gIGlmICghcHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gTm90ZSB0aGUgdXNlIG9mIGA9PWAgd2hpY2ggY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZC5cblxuXG4gIGlmICh2b2lkRWxlbWVudFRhZ3NbdGFnXSkge1xuICAgIGlmIChwcm9wcy5jaGlsZHJlbiAhPSBudWxsIHx8IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0YWcgKyBcIiBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIFwiICsgJ3VzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgaWYgKHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gJ29iamVjdCcgfHwgIShIVE1MIGluIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIG11c3QgYmUgaW4gdGhlIGZvcm0gYHtfX2h0bWw6IC4uLn1gLiAnICsgJ1BsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgJyArICdmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKCFwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgJiYgcHJvcHMuY29udGVudEVkaXRhYmxlICYmIHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLnN0eWxlICE9IG51bGwgJiYgdHlwZW9mIHByb3BzLnN0eWxlICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGluZyBmcm9tIHN0eWxlIHByb3BlcnRpZXMgdG8gdmFsdWVzLCAnICsgXCJub3QgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBzdHlsZT17e21hcmdpblJpZ2h0OiBzcGFjaW5nICsgJ2VtJ319IHdoZW4gXCIgKyAndXNpbmcgSlNYLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ3VzdG9tQ29tcG9uZW50KHRhZ05hbWUsIHByb3BzKSB7XG4gIGlmICh0YWdOYW1lLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHN3aXRjaCAodGFnTmFtZSkge1xuICAgIC8vIFRoZXNlIGFyZSByZXNlcnZlZCBTVkcgYW5kIE1hdGhNTCBlbGVtZW50cy5cbiAgICAvLyBXZSBkb24ndCBtaW5kIHRoaXMgbGlzdCB0b28gbXVjaCBiZWNhdXNlIHdlIGV4cGVjdCBpdCB0byBuZXZlciBncm93LlxuICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byB0cmFjayB0aGUgbmFtZXNwYWNlIGluIGEgZmV3IHBsYWNlcyB3aGljaCBpcyBjb252b2x1dGVkLlxuICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjdXN0b20tZWxlbWVudHMtY29yZS1jb25jZXB0c1xuICAgIGNhc2UgJ2Fubm90YXRpb24teG1sJzpcbiAgICBjYXNlICdjb2xvci1wcm9maWxlJzpcbiAgICBjYXNlICdmb250LWZhY2UnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1zcmMnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS11cmknOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1mb3JtYXQnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1uYW1lJzpcbiAgICBjYXNlICdtaXNzaW5nLWdseXBoJzpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoZSBIVE1MIG9yIFNWRyBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0LCBiZSBzdXJlIHRvXG4vLyBhbHNvIGFkZCB0aGVtIHRvIHRoaXMgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdCBuYW1lXG4vLyB3YXJuaW5ncy5cbnZhciBwb3NzaWJsZVN0YW5kYXJkTmFtZXMgPSB7XG4gIC8vIEhUTUxcbiAgYWNjZXB0OiAnYWNjZXB0JyxcbiAgYWNjZXB0Y2hhcnNldDogJ2FjY2VwdENoYXJzZXQnLFxuICAnYWNjZXB0LWNoYXJzZXQnOiAnYWNjZXB0Q2hhcnNldCcsXG4gIGFjY2Vzc2tleTogJ2FjY2Vzc0tleScsXG4gIGFjdGlvbjogJ2FjdGlvbicsXG4gIGFsbG93ZnVsbHNjcmVlbjogJ2FsbG93RnVsbFNjcmVlbicsXG4gIGFsdDogJ2FsdCcsXG4gIGFzOiAnYXMnLFxuICBhc3luYzogJ2FzeW5jJyxcbiAgYXV0b2NhcGl0YWxpemU6ICdhdXRvQ2FwaXRhbGl6ZScsXG4gIGF1dG9jb21wbGV0ZTogJ2F1dG9Db21wbGV0ZScsXG4gIGF1dG9jb3JyZWN0OiAnYXV0b0NvcnJlY3QnLFxuICBhdXRvZm9jdXM6ICdhdXRvRm9jdXMnLFxuICBhdXRvcGxheTogJ2F1dG9QbGF5JyxcbiAgYXV0b3NhdmU6ICdhdXRvU2F2ZScsXG4gIGNhcHR1cmU6ICdjYXB0dXJlJyxcbiAgY2VsbHBhZGRpbmc6ICdjZWxsUGFkZGluZycsXG4gIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnLFxuICBjaGFsbGVuZ2U6ICdjaGFsbGVuZ2UnLFxuICBjaGFyc2V0OiAnY2hhclNldCcsXG4gIGNoZWNrZWQ6ICdjaGVja2VkJyxcbiAgY2hpbGRyZW46ICdjaGlsZHJlbicsXG4gIGNpdGU6ICdjaXRlJyxcbiAgY2xhc3M6ICdjbGFzc05hbWUnLFxuICBjbGFzc2lkOiAnY2xhc3NJRCcsXG4gIGNsYXNzbmFtZTogJ2NsYXNzTmFtZScsXG4gIGNvbHM6ICdjb2xzJyxcbiAgY29sc3BhbjogJ2NvbFNwYW4nLFxuICBjb250ZW50OiAnY29udGVudCcsXG4gIGNvbnRlbnRlZGl0YWJsZTogJ2NvbnRlbnRFZGl0YWJsZScsXG4gIGNvbnRleHRtZW51OiAnY29udGV4dE1lbnUnLFxuICBjb250cm9sczogJ2NvbnRyb2xzJyxcbiAgY29udHJvbHNsaXN0OiAnY29udHJvbHNMaXN0JyxcbiAgY29vcmRzOiAnY29vcmRzJyxcbiAgY3Jvc3NvcmlnaW46ICdjcm9zc09yaWdpbicsXG4gIGRhbmdlcm91c2x5c2V0aW5uZXJodG1sOiAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLFxuICBkYXRhOiAnZGF0YScsXG4gIGRhdGV0aW1lOiAnZGF0ZVRpbWUnLFxuICBkZWZhdWx0OiAnZGVmYXVsdCcsXG4gIGRlZmF1bHRjaGVja2VkOiAnZGVmYXVsdENoZWNrZWQnLFxuICBkZWZhdWx0dmFsdWU6ICdkZWZhdWx0VmFsdWUnLFxuICBkZWZlcjogJ2RlZmVyJyxcbiAgZGlyOiAnZGlyJyxcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGRpc2FibGVwaWN0dXJlaW5waWN0dXJlOiAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLFxuICBkaXNhYmxlcmVtb3RlcGxheWJhY2s6ICdkaXNhYmxlUmVtb3RlUGxheWJhY2snLFxuICBkb3dubG9hZDogJ2Rvd25sb2FkJyxcbiAgZHJhZ2dhYmxlOiAnZHJhZ2dhYmxlJyxcbiAgZW5jdHlwZTogJ2VuY1R5cGUnLFxuICBlbnRlcmtleWhpbnQ6ICdlbnRlcktleUhpbnQnLFxuICBmb3I6ICdodG1sRm9yJyxcbiAgZm9ybTogJ2Zvcm0nLFxuICBmb3JtbWV0aG9kOiAnZm9ybU1ldGhvZCcsXG4gIGZvcm1hY3Rpb246ICdmb3JtQWN0aW9uJyxcbiAgZm9ybWVuY3R5cGU6ICdmb3JtRW5jVHlwZScsXG4gIGZvcm1ub3ZhbGlkYXRlOiAnZm9ybU5vVmFsaWRhdGUnLFxuICBmb3JtdGFyZ2V0OiAnZm9ybVRhcmdldCcsXG4gIGZyYW1lYm9yZGVyOiAnZnJhbWVCb3JkZXInLFxuICBoZWFkZXJzOiAnaGVhZGVycycsXG4gIGhlaWdodDogJ2hlaWdodCcsXG4gIGhpZGRlbjogJ2hpZGRlbicsXG4gIGhpZ2g6ICdoaWdoJyxcbiAgaHJlZjogJ2hyZWYnLFxuICBocmVmbGFuZzogJ2hyZWZMYW5nJyxcbiAgaHRtbGZvcjogJ2h0bWxGb3InLFxuICBodHRwZXF1aXY6ICdodHRwRXF1aXYnLFxuICAnaHR0cC1lcXVpdic6ICdodHRwRXF1aXYnLFxuICBpY29uOiAnaWNvbicsXG4gIGlkOiAnaWQnLFxuICBpbWFnZXNpemVzOiAnaW1hZ2VTaXplcycsXG4gIGltYWdlc3Jjc2V0OiAnaW1hZ2VTcmNTZXQnLFxuICBpbm5lcmh0bWw6ICdpbm5lckhUTUwnLFxuICBpbnB1dG1vZGU6ICdpbnB1dE1vZGUnLFxuICBpbnRlZ3JpdHk6ICdpbnRlZ3JpdHknLFxuICBpczogJ2lzJyxcbiAgaXRlbWlkOiAnaXRlbUlEJyxcbiAgaXRlbXByb3A6ICdpdGVtUHJvcCcsXG4gIGl0ZW1yZWY6ICdpdGVtUmVmJyxcbiAgaXRlbXNjb3BlOiAnaXRlbVNjb3BlJyxcbiAgaXRlbXR5cGU6ICdpdGVtVHlwZScsXG4gIGtleXBhcmFtczogJ2tleVBhcmFtcycsXG4gIGtleXR5cGU6ICdrZXlUeXBlJyxcbiAga2luZDogJ2tpbmQnLFxuICBsYWJlbDogJ2xhYmVsJyxcbiAgbGFuZzogJ2xhbmcnLFxuICBsaXN0OiAnbGlzdCcsXG4gIGxvb3A6ICdsb29wJyxcbiAgbG93OiAnbG93JyxcbiAgbWFuaWZlc3Q6ICdtYW5pZmVzdCcsXG4gIG1hcmdpbndpZHRoOiAnbWFyZ2luV2lkdGgnLFxuICBtYXJnaW5oZWlnaHQ6ICdtYXJnaW5IZWlnaHQnLFxuICBtYXg6ICdtYXgnLFxuICBtYXhsZW5ndGg6ICdtYXhMZW5ndGgnLFxuICBtZWRpYTogJ21lZGlhJyxcbiAgbWVkaWFncm91cDogJ21lZGlhR3JvdXAnLFxuICBtZXRob2Q6ICdtZXRob2QnLFxuICBtaW46ICdtaW4nLFxuICBtaW5sZW5ndGg6ICdtaW5MZW5ndGgnLFxuICBtdWx0aXBsZTogJ211bHRpcGxlJyxcbiAgbXV0ZWQ6ICdtdXRlZCcsXG4gIG5hbWU6ICduYW1lJyxcbiAgbm9tb2R1bGU6ICdub01vZHVsZScsXG4gIG5vbmNlOiAnbm9uY2UnLFxuICBub3ZhbGlkYXRlOiAnbm9WYWxpZGF0ZScsXG4gIG9wZW46ICdvcGVuJyxcbiAgb3B0aW11bTogJ29wdGltdW0nLFxuICBwYXR0ZXJuOiAncGF0dGVybicsXG4gIHBsYWNlaG9sZGVyOiAncGxhY2Vob2xkZXInLFxuICBwbGF5c2lubGluZTogJ3BsYXlzSW5saW5lJyxcbiAgcG9zdGVyOiAncG9zdGVyJyxcbiAgcHJlbG9hZDogJ3ByZWxvYWQnLFxuICBwcm9maWxlOiAncHJvZmlsZScsXG4gIHJhZGlvZ3JvdXA6ICdyYWRpb0dyb3VwJyxcbiAgcmVhZG9ubHk6ICdyZWFkT25seScsXG4gIHJlZmVycmVycG9saWN5OiAncmVmZXJyZXJQb2xpY3knLFxuICByZWw6ICdyZWwnLFxuICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgcmV2ZXJzZWQ6ICdyZXZlcnNlZCcsXG4gIHJvbGU6ICdyb2xlJyxcbiAgcm93czogJ3Jvd3MnLFxuICByb3dzcGFuOiAncm93U3BhbicsXG4gIHNhbmRib3g6ICdzYW5kYm94JyxcbiAgc2NvcGU6ICdzY29wZScsXG4gIHNjb3BlZDogJ3Njb3BlZCcsXG4gIHNjcm9sbGluZzogJ3Njcm9sbGluZycsXG4gIHNlYW1sZXNzOiAnc2VhbWxlc3MnLFxuICBzZWxlY3RlZDogJ3NlbGVjdGVkJyxcbiAgc2hhcGU6ICdzaGFwZScsXG4gIHNpemU6ICdzaXplJyxcbiAgc2l6ZXM6ICdzaXplcycsXG4gIHNwYW46ICdzcGFuJyxcbiAgc3BlbGxjaGVjazogJ3NwZWxsQ2hlY2snLFxuICBzcmM6ICdzcmMnLFxuICBzcmNkb2M6ICdzcmNEb2MnLFxuICBzcmNsYW5nOiAnc3JjTGFuZycsXG4gIHNyY3NldDogJ3NyY1NldCcsXG4gIHN0YXJ0OiAnc3RhcnQnLFxuICBzdGVwOiAnc3RlcCcsXG4gIHN0eWxlOiAnc3R5bGUnLFxuICBzdW1tYXJ5OiAnc3VtbWFyeScsXG4gIHRhYmluZGV4OiAndGFiSW5kZXgnLFxuICB0YXJnZXQ6ICd0YXJnZXQnLFxuICB0aXRsZTogJ3RpdGxlJyxcbiAgdHlwZTogJ3R5cGUnLFxuICB1c2VtYXA6ICd1c2VNYXAnLFxuICB2YWx1ZTogJ3ZhbHVlJyxcbiAgd2lkdGg6ICd3aWR0aCcsXG4gIHdtb2RlOiAnd21vZGUnLFxuICB3cmFwOiAnd3JhcCcsXG4gIC8vIFNWR1xuICBhYm91dDogJ2Fib3V0JyxcbiAgYWNjZW50aGVpZ2h0OiAnYWNjZW50SGVpZ2h0JyxcbiAgJ2FjY2VudC1oZWlnaHQnOiAnYWNjZW50SGVpZ2h0JyxcbiAgYWNjdW11bGF0ZTogJ2FjY3VtdWxhdGUnLFxuICBhZGRpdGl2ZTogJ2FkZGl0aXZlJyxcbiAgYWxpZ25tZW50YmFzZWxpbmU6ICdhbGlnbm1lbnRCYXNlbGluZScsXG4gICdhbGlnbm1lbnQtYmFzZWxpbmUnOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICBhbGxvd3Jlb3JkZXI6ICdhbGxvd1Jlb3JkZXInLFxuICBhbHBoYWJldGljOiAnYWxwaGFiZXRpYycsXG4gIGFtcGxpdHVkZTogJ2FtcGxpdHVkZScsXG4gIGFyYWJpY2Zvcm06ICdhcmFiaWNGb3JtJyxcbiAgJ2FyYWJpYy1mb3JtJzogJ2FyYWJpY0Zvcm0nLFxuICBhc2NlbnQ6ICdhc2NlbnQnLFxuICBhdHRyaWJ1dGVuYW1lOiAnYXR0cmlidXRlTmFtZScsXG4gIGF0dHJpYnV0ZXR5cGU6ICdhdHRyaWJ1dGVUeXBlJyxcbiAgYXV0b3JldmVyc2U6ICdhdXRvUmV2ZXJzZScsXG4gIGF6aW11dGg6ICdhemltdXRoJyxcbiAgYmFzZWZyZXF1ZW5jeTogJ2Jhc2VGcmVxdWVuY3knLFxuICBiYXNlbGluZXNoaWZ0OiAnYmFzZWxpbmVTaGlmdCcsXG4gICdiYXNlbGluZS1zaGlmdCc6ICdiYXNlbGluZVNoaWZ0JyxcbiAgYmFzZXByb2ZpbGU6ICdiYXNlUHJvZmlsZScsXG4gIGJib3g6ICdiYm94JyxcbiAgYmVnaW46ICdiZWdpbicsXG4gIGJpYXM6ICdiaWFzJyxcbiAgYnk6ICdieScsXG4gIGNhbGNtb2RlOiAnY2FsY01vZGUnLFxuICBjYXBoZWlnaHQ6ICdjYXBIZWlnaHQnLFxuICAnY2FwLWhlaWdodCc6ICdjYXBIZWlnaHQnLFxuICBjbGlwOiAnY2xpcCcsXG4gIGNsaXBwYXRoOiAnY2xpcFBhdGgnLFxuICAnY2xpcC1wYXRoJzogJ2NsaXBQYXRoJyxcbiAgY2xpcHBhdGh1bml0czogJ2NsaXBQYXRoVW5pdHMnLFxuICBjbGlwcnVsZTogJ2NsaXBSdWxlJyxcbiAgJ2NsaXAtcnVsZSc6ICdjbGlwUnVsZScsXG4gIGNvbG9yOiAnY29sb3InLFxuICBjb2xvcmludGVycG9sYXRpb246ICdjb2xvckludGVycG9sYXRpb24nLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbic6ICdjb2xvckludGVycG9sYXRpb24nLFxuICBjb2xvcmludGVycG9sYXRpb25maWx0ZXJzOiAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnOiAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsXG4gIGNvbG9ycHJvZmlsZTogJ2NvbG9yUHJvZmlsZScsXG4gICdjb2xvci1wcm9maWxlJzogJ2NvbG9yUHJvZmlsZScsXG4gIGNvbG9ycmVuZGVyaW5nOiAnY29sb3JSZW5kZXJpbmcnLFxuICAnY29sb3ItcmVuZGVyaW5nJzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgY29udGVudHNjcmlwdHR5cGU6ICdjb250ZW50U2NyaXB0VHlwZScsXG4gIGNvbnRlbnRzdHlsZXR5cGU6ICdjb250ZW50U3R5bGVUeXBlJyxcbiAgY3Vyc29yOiAnY3Vyc29yJyxcbiAgY3g6ICdjeCcsXG4gIGN5OiAnY3knLFxuICBkOiAnZCcsXG4gIGRhdGF0eXBlOiAnZGF0YXR5cGUnLFxuICBkZWNlbGVyYXRlOiAnZGVjZWxlcmF0ZScsXG4gIGRlc2NlbnQ6ICdkZXNjZW50JyxcbiAgZGlmZnVzZWNvbnN0YW50OiAnZGlmZnVzZUNvbnN0YW50JyxcbiAgZGlyZWN0aW9uOiAnZGlyZWN0aW9uJyxcbiAgZGlzcGxheTogJ2Rpc3BsYXknLFxuICBkaXZpc29yOiAnZGl2aXNvcicsXG4gIGRvbWluYW50YmFzZWxpbmU6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgJ2RvbWluYW50LWJhc2VsaW5lJzogJ2RvbWluYW50QmFzZWxpbmUnLFxuICBkdXI6ICdkdXInLFxuICBkeDogJ2R4JyxcbiAgZHk6ICdkeScsXG4gIGVkZ2Vtb2RlOiAnZWRnZU1vZGUnLFxuICBlbGV2YXRpb246ICdlbGV2YXRpb24nLFxuICBlbmFibGViYWNrZ3JvdW5kOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gICdlbmFibGUtYmFja2dyb3VuZCc6ICdlbmFibGVCYWNrZ3JvdW5kJyxcbiAgZW5kOiAnZW5kJyxcbiAgZXhwb25lbnQ6ICdleHBvbmVudCcsXG4gIGV4dGVybmFscmVzb3VyY2VzcmVxdWlyZWQ6ICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgZmlsbDogJ2ZpbGwnLFxuICBmaWxsb3BhY2l0eTogJ2ZpbGxPcGFjaXR5JyxcbiAgJ2ZpbGwtb3BhY2l0eSc6ICdmaWxsT3BhY2l0eScsXG4gIGZpbGxydWxlOiAnZmlsbFJ1bGUnLFxuICAnZmlsbC1ydWxlJzogJ2ZpbGxSdWxlJyxcbiAgZmlsdGVyOiAnZmlsdGVyJyxcbiAgZmlsdGVycmVzOiAnZmlsdGVyUmVzJyxcbiAgZmlsdGVydW5pdHM6ICdmaWx0ZXJVbml0cycsXG4gIGZsb29kb3BhY2l0eTogJ2Zsb29kT3BhY2l0eScsXG4gICdmbG9vZC1vcGFjaXR5JzogJ2Zsb29kT3BhY2l0eScsXG4gIGZsb29kY29sb3I6ICdmbG9vZENvbG9yJyxcbiAgJ2Zsb29kLWNvbG9yJzogJ2Zsb29kQ29sb3InLFxuICBmb2N1c2FibGU6ICdmb2N1c2FibGUnLFxuICBmb250ZmFtaWx5OiAnZm9udEZhbWlseScsXG4gICdmb250LWZhbWlseSc6ICdmb250RmFtaWx5JyxcbiAgZm9udHNpemU6ICdmb250U2l6ZScsXG4gICdmb250LXNpemUnOiAnZm9udFNpemUnLFxuICBmb250c2l6ZWFkanVzdDogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgJ2ZvbnQtc2l6ZS1hZGp1c3QnOiAnZm9udFNpemVBZGp1c3QnLFxuICBmb250c3RyZXRjaDogJ2ZvbnRTdHJldGNoJyxcbiAgJ2ZvbnQtc3RyZXRjaCc6ICdmb250U3RyZXRjaCcsXG4gIGZvbnRzdHlsZTogJ2ZvbnRTdHlsZScsXG4gICdmb250LXN0eWxlJzogJ2ZvbnRTdHlsZScsXG4gIGZvbnR2YXJpYW50OiAnZm9udFZhcmlhbnQnLFxuICAnZm9udC12YXJpYW50JzogJ2ZvbnRWYXJpYW50JyxcbiAgZm9udHdlaWdodDogJ2ZvbnRXZWlnaHQnLFxuICAnZm9udC13ZWlnaHQnOiAnZm9udFdlaWdodCcsXG4gIGZvcm1hdDogJ2Zvcm1hdCcsXG4gIGZyb206ICdmcm9tJyxcbiAgZng6ICdmeCcsXG4gIGZ5OiAnZnknLFxuICBnMTogJ2cxJyxcbiAgZzI6ICdnMicsXG4gIGdseXBobmFtZTogJ2dseXBoTmFtZScsXG4gICdnbHlwaC1uYW1lJzogJ2dseXBoTmFtZScsXG4gIGdseXBob3JpZW50YXRpb25ob3Jpem9udGFsOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCc6ICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsXG4gIGdseXBob3JpZW50YXRpb252ZXJ0aWNhbDogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsXG4gICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCc6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICBnbHlwaHJlZjogJ2dseXBoUmVmJyxcbiAgZ3JhZGllbnR0cmFuc2Zvcm06ICdncmFkaWVudFRyYW5zZm9ybScsXG4gIGdyYWRpZW50dW5pdHM6ICdncmFkaWVudFVuaXRzJyxcbiAgaGFuZ2luZzogJ2hhbmdpbmcnLFxuICBob3JpemFkdng6ICdob3JpekFkdlgnLFxuICAnaG9yaXotYWR2LXgnOiAnaG9yaXpBZHZYJyxcbiAgaG9yaXpvcmlnaW54OiAnaG9yaXpPcmlnaW5YJyxcbiAgJ2hvcml6LW9yaWdpbi14JzogJ2hvcml6T3JpZ2luWCcsXG4gIGlkZW9ncmFwaGljOiAnaWRlb2dyYXBoaWMnLFxuICBpbWFnZXJlbmRlcmluZzogJ2ltYWdlUmVuZGVyaW5nJyxcbiAgJ2ltYWdlLXJlbmRlcmluZyc6ICdpbWFnZVJlbmRlcmluZycsXG4gIGluMjogJ2luMicsXG4gIGluOiAnaW4nLFxuICBpbmxpc3Q6ICdpbmxpc3QnLFxuICBpbnRlcmNlcHQ6ICdpbnRlcmNlcHQnLFxuICBrMTogJ2sxJyxcbiAgazI6ICdrMicsXG4gIGszOiAnazMnLFxuICBrNDogJ2s0JyxcbiAgazogJ2snLFxuICBrZXJuZWxtYXRyaXg6ICdrZXJuZWxNYXRyaXgnLFxuICBrZXJuZWx1bml0bGVuZ3RoOiAna2VybmVsVW5pdExlbmd0aCcsXG4gIGtlcm5pbmc6ICdrZXJuaW5nJyxcbiAga2V5cG9pbnRzOiAna2V5UG9pbnRzJyxcbiAga2V5c3BsaW5lczogJ2tleVNwbGluZXMnLFxuICBrZXl0aW1lczogJ2tleVRpbWVzJyxcbiAgbGVuZ3RoYWRqdXN0OiAnbGVuZ3RoQWRqdXN0JyxcbiAgbGV0dGVyc3BhY2luZzogJ2xldHRlclNwYWNpbmcnLFxuICAnbGV0dGVyLXNwYWNpbmcnOiAnbGV0dGVyU3BhY2luZycsXG4gIGxpZ2h0aW5nY29sb3I6ICdsaWdodGluZ0NvbG9yJyxcbiAgJ2xpZ2h0aW5nLWNvbG9yJzogJ2xpZ2h0aW5nQ29sb3InLFxuICBsaW1pdGluZ2NvbmVhbmdsZTogJ2xpbWl0aW5nQ29uZUFuZ2xlJyxcbiAgbG9jYWw6ICdsb2NhbCcsXG4gIG1hcmtlcmVuZDogJ21hcmtlckVuZCcsXG4gICdtYXJrZXItZW5kJzogJ21hcmtlckVuZCcsXG4gIG1hcmtlcmhlaWdodDogJ21hcmtlckhlaWdodCcsXG4gIG1hcmtlcm1pZDogJ21hcmtlck1pZCcsXG4gICdtYXJrZXItbWlkJzogJ21hcmtlck1pZCcsXG4gIG1hcmtlcnN0YXJ0OiAnbWFya2VyU3RhcnQnLFxuICAnbWFya2VyLXN0YXJ0JzogJ21hcmtlclN0YXJ0JyxcbiAgbWFya2VydW5pdHM6ICdtYXJrZXJVbml0cycsXG4gIG1hcmtlcndpZHRoOiAnbWFya2VyV2lkdGgnLFxuICBtYXNrOiAnbWFzaycsXG4gIG1hc2tjb250ZW50dW5pdHM6ICdtYXNrQ29udGVudFVuaXRzJyxcbiAgbWFza3VuaXRzOiAnbWFza1VuaXRzJyxcbiAgbWF0aGVtYXRpY2FsOiAnbWF0aGVtYXRpY2FsJyxcbiAgbW9kZTogJ21vZGUnLFxuICBudW1vY3RhdmVzOiAnbnVtT2N0YXZlcycsXG4gIG9mZnNldDogJ29mZnNldCcsXG4gIG9wYWNpdHk6ICdvcGFjaXR5JyxcbiAgb3BlcmF0b3I6ICdvcGVyYXRvcicsXG4gIG9yZGVyOiAnb3JkZXInLFxuICBvcmllbnQ6ICdvcmllbnQnLFxuICBvcmllbnRhdGlvbjogJ29yaWVudGF0aW9uJyxcbiAgb3JpZ2luOiAnb3JpZ2luJyxcbiAgb3ZlcmZsb3c6ICdvdmVyZmxvdycsXG4gIG92ZXJsaW5lcG9zaXRpb246ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgJ292ZXJsaW5lLXBvc2l0aW9uJzogJ292ZXJsaW5lUG9zaXRpb24nLFxuICBvdmVybGluZXRoaWNrbmVzczogJ292ZXJsaW5lVGhpY2tuZXNzJyxcbiAgJ292ZXJsaW5lLXRoaWNrbmVzcyc6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gIHBhaW50b3JkZXI6ICdwYWludE9yZGVyJyxcbiAgJ3BhaW50LW9yZGVyJzogJ3BhaW50T3JkZXInLFxuICBwYW5vc2UxOiAncGFub3NlMScsXG4gICdwYW5vc2UtMSc6ICdwYW5vc2UxJyxcbiAgcGF0aGxlbmd0aDogJ3BhdGhMZW5ndGgnLFxuICBwYXR0ZXJuY29udGVudHVuaXRzOiAncGF0dGVybkNvbnRlbnRVbml0cycsXG4gIHBhdHRlcm50cmFuc2Zvcm06ICdwYXR0ZXJuVHJhbnNmb3JtJyxcbiAgcGF0dGVybnVuaXRzOiAncGF0dGVyblVuaXRzJyxcbiAgcG9pbnRlcmV2ZW50czogJ3BvaW50ZXJFdmVudHMnLFxuICAncG9pbnRlci1ldmVudHMnOiAncG9pbnRlckV2ZW50cycsXG4gIHBvaW50czogJ3BvaW50cycsXG4gIHBvaW50c2F0eDogJ3BvaW50c0F0WCcsXG4gIHBvaW50c2F0eTogJ3BvaW50c0F0WScsXG4gIHBvaW50c2F0ejogJ3BvaW50c0F0WicsXG4gIHByZWZpeDogJ3ByZWZpeCcsXG4gIHByZXNlcnZlYWxwaGE6ICdwcmVzZXJ2ZUFscGhhJyxcbiAgcHJlc2VydmVhc3BlY3RyYXRpbzogJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLFxuICBwcmltaXRpdmV1bml0czogJ3ByaW1pdGl2ZVVuaXRzJyxcbiAgcHJvcGVydHk6ICdwcm9wZXJ0eScsXG4gIHI6ICdyJyxcbiAgcmFkaXVzOiAncmFkaXVzJyxcbiAgcmVmeDogJ3JlZlgnLFxuICByZWZ5OiAncmVmWScsXG4gIHJlbmRlcmluZ2ludGVudDogJ3JlbmRlcmluZ0ludGVudCcsXG4gICdyZW5kZXJpbmctaW50ZW50JzogJ3JlbmRlcmluZ0ludGVudCcsXG4gIHJlcGVhdGNvdW50OiAncmVwZWF0Q291bnQnLFxuICByZXBlYXRkdXI6ICdyZXBlYXREdXInLFxuICByZXF1aXJlZGV4dGVuc2lvbnM6ICdyZXF1aXJlZEV4dGVuc2lvbnMnLFxuICByZXF1aXJlZGZlYXR1cmVzOiAncmVxdWlyZWRGZWF0dXJlcycsXG4gIHJlc291cmNlOiAncmVzb3VyY2UnLFxuICByZXN0YXJ0OiAncmVzdGFydCcsXG4gIHJlc3VsdDogJ3Jlc3VsdCcsXG4gIHJlc3VsdHM6ICdyZXN1bHRzJyxcbiAgcm90YXRlOiAncm90YXRlJyxcbiAgcng6ICdyeCcsXG4gIHJ5OiAncnknLFxuICBzY2FsZTogJ3NjYWxlJyxcbiAgc2VjdXJpdHk6ICdzZWN1cml0eScsXG4gIHNlZWQ6ICdzZWVkJyxcbiAgc2hhcGVyZW5kZXJpbmc6ICdzaGFwZVJlbmRlcmluZycsXG4gICdzaGFwZS1yZW5kZXJpbmcnOiAnc2hhcGVSZW5kZXJpbmcnLFxuICBzbG9wZTogJ3Nsb3BlJyxcbiAgc3BhY2luZzogJ3NwYWNpbmcnLFxuICBzcGVjdWxhcmNvbnN0YW50OiAnc3BlY3VsYXJDb25zdGFudCcsXG4gIHNwZWN1bGFyZXhwb25lbnQ6ICdzcGVjdWxhckV4cG9uZW50JyxcbiAgc3BlZWQ6ICdzcGVlZCcsXG4gIHNwcmVhZG1ldGhvZDogJ3NwcmVhZE1ldGhvZCcsXG4gIHN0YXJ0b2Zmc2V0OiAnc3RhcnRPZmZzZXQnLFxuICBzdGRkZXZpYXRpb246ICdzdGREZXZpYXRpb24nLFxuICBzdGVtaDogJ3N0ZW1oJyxcbiAgc3RlbXY6ICdzdGVtdicsXG4gIHN0aXRjaHRpbGVzOiAnc3RpdGNoVGlsZXMnLFxuICBzdG9wY29sb3I6ICdzdG9wQ29sb3InLFxuICAnc3RvcC1jb2xvcic6ICdzdG9wQ29sb3InLFxuICBzdG9wb3BhY2l0eTogJ3N0b3BPcGFjaXR5JyxcbiAgJ3N0b3Atb3BhY2l0eSc6ICdzdG9wT3BhY2l0eScsXG4gIHN0cmlrZXRocm91Z2hwb3NpdGlvbjogJ3N0cmlrZXRocm91Z2hQb3NpdGlvbicsXG4gICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJzogJ3N0cmlrZXRocm91Z2hQb3NpdGlvbicsXG4gIHN0cmlrZXRocm91Z2h0aGlja25lc3M6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJzogJ3N0cmlrZXRocm91Z2hUaGlja25lc3MnLFxuICBzdHJpbmc6ICdzdHJpbmcnLFxuICBzdHJva2U6ICdzdHJva2UnLFxuICBzdHJva2VkYXNoYXJyYXk6ICdzdHJva2VEYXNoYXJyYXknLFxuICAnc3Ryb2tlLWRhc2hhcnJheSc6ICdzdHJva2VEYXNoYXJyYXknLFxuICBzdHJva2VkYXNob2Zmc2V0OiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gICdzdHJva2UtZGFzaG9mZnNldCc6ICdzdHJva2VEYXNob2Zmc2V0JyxcbiAgc3Ryb2tlbGluZWNhcDogJ3N0cm9rZUxpbmVjYXAnLFxuICAnc3Ryb2tlLWxpbmVjYXAnOiAnc3Ryb2tlTGluZWNhcCcsXG4gIHN0cm9rZWxpbmVqb2luOiAnc3Ryb2tlTGluZWpvaW4nLFxuICAnc3Ryb2tlLWxpbmVqb2luJzogJ3N0cm9rZUxpbmVqb2luJyxcbiAgc3Ryb2tlbWl0ZXJsaW1pdDogJ3N0cm9rZU1pdGVybGltaXQnLFxuICAnc3Ryb2tlLW1pdGVybGltaXQnOiAnc3Ryb2tlTWl0ZXJsaW1pdCcsXG4gIHN0cm9rZXdpZHRoOiAnc3Ryb2tlV2lkdGgnLFxuICAnc3Ryb2tlLXdpZHRoJzogJ3N0cm9rZVdpZHRoJyxcbiAgc3Ryb2tlb3BhY2l0eTogJ3N0cm9rZU9wYWNpdHknLFxuICAnc3Ryb2tlLW9wYWNpdHknOiAnc3Ryb2tlT3BhY2l0eScsXG4gIHN1cHByZXNzY29udGVudGVkaXRhYmxld2FybmluZzogJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZycsXG4gIHN1cHByZXNzaHlkcmF0aW9ud2FybmluZzogJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsXG4gIHN1cmZhY2VzY2FsZTogJ3N1cmZhY2VTY2FsZScsXG4gIHN5c3RlbWxhbmd1YWdlOiAnc3lzdGVtTGFuZ3VhZ2UnLFxuICB0YWJsZXZhbHVlczogJ3RhYmxlVmFsdWVzJyxcbiAgdGFyZ2V0eDogJ3RhcmdldFgnLFxuICB0YXJnZXR5OiAndGFyZ2V0WScsXG4gIHRleHRhbmNob3I6ICd0ZXh0QW5jaG9yJyxcbiAgJ3RleHQtYW5jaG9yJzogJ3RleHRBbmNob3InLFxuICB0ZXh0ZGVjb3JhdGlvbjogJ3RleHREZWNvcmF0aW9uJyxcbiAgJ3RleHQtZGVjb3JhdGlvbic6ICd0ZXh0RGVjb3JhdGlvbicsXG4gIHRleHRsZW5ndGg6ICd0ZXh0TGVuZ3RoJyxcbiAgdGV4dHJlbmRlcmluZzogJ3RleHRSZW5kZXJpbmcnLFxuICAndGV4dC1yZW5kZXJpbmcnOiAndGV4dFJlbmRlcmluZycsXG4gIHRvOiAndG8nLFxuICB0cmFuc2Zvcm06ICd0cmFuc2Zvcm0nLFxuICB0eXBlb2Y6ICd0eXBlb2YnLFxuICB1MTogJ3UxJyxcbiAgdTI6ICd1MicsXG4gIHVuZGVybGluZXBvc2l0aW9uOiAndW5kZXJsaW5lUG9zaXRpb24nLFxuICAndW5kZXJsaW5lLXBvc2l0aW9uJzogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgdW5kZXJsaW5ldGhpY2tuZXNzOiAndW5kZXJsaW5lVGhpY2tuZXNzJyxcbiAgJ3VuZGVybGluZS10aGlja25lc3MnOiAndW5kZXJsaW5lVGhpY2tuZXNzJyxcbiAgdW5pY29kZTogJ3VuaWNvZGUnLFxuICB1bmljb2RlYmlkaTogJ3VuaWNvZGVCaWRpJyxcbiAgJ3VuaWNvZGUtYmlkaSc6ICd1bmljb2RlQmlkaScsXG4gIHVuaWNvZGVyYW5nZTogJ3VuaWNvZGVSYW5nZScsXG4gICd1bmljb2RlLXJhbmdlJzogJ3VuaWNvZGVSYW5nZScsXG4gIHVuaXRzcGVyZW06ICd1bml0c1BlckVtJyxcbiAgJ3VuaXRzLXBlci1lbSc6ICd1bml0c1BlckVtJyxcbiAgdW5zZWxlY3RhYmxlOiAndW5zZWxlY3RhYmxlJyxcbiAgdmFscGhhYmV0aWM6ICd2QWxwaGFiZXRpYycsXG4gICd2LWFscGhhYmV0aWMnOiAndkFscGhhYmV0aWMnLFxuICB2YWx1ZXM6ICd2YWx1ZXMnLFxuICB2ZWN0b3JlZmZlY3Q6ICd2ZWN0b3JFZmZlY3QnLFxuICAndmVjdG9yLWVmZmVjdCc6ICd2ZWN0b3JFZmZlY3QnLFxuICB2ZXJzaW9uOiAndmVyc2lvbicsXG4gIHZlcnRhZHZ5OiAndmVydEFkdlknLFxuICAndmVydC1hZHYteSc6ICd2ZXJ0QWR2WScsXG4gIHZlcnRvcmlnaW54OiAndmVydE9yaWdpblgnLFxuICAndmVydC1vcmlnaW4teCc6ICd2ZXJ0T3JpZ2luWCcsXG4gIHZlcnRvcmlnaW55OiAndmVydE9yaWdpblknLFxuICAndmVydC1vcmlnaW4teSc6ICd2ZXJ0T3JpZ2luWScsXG4gIHZoYW5naW5nOiAndkhhbmdpbmcnLFxuICAndi1oYW5naW5nJzogJ3ZIYW5naW5nJyxcbiAgdmlkZW9ncmFwaGljOiAndklkZW9ncmFwaGljJyxcbiAgJ3YtaWRlb2dyYXBoaWMnOiAndklkZW9ncmFwaGljJyxcbiAgdmlld2JveDogJ3ZpZXdCb3gnLFxuICB2aWV3dGFyZ2V0OiAndmlld1RhcmdldCcsXG4gIHZpc2liaWxpdHk6ICd2aXNpYmlsaXR5JyxcbiAgdm1hdGhlbWF0aWNhbDogJ3ZNYXRoZW1hdGljYWwnLFxuICAndi1tYXRoZW1hdGljYWwnOiAndk1hdGhlbWF0aWNhbCcsXG4gIHZvY2FiOiAndm9jYWInLFxuICB3aWR0aHM6ICd3aWR0aHMnLFxuICB3b3Jkc3BhY2luZzogJ3dvcmRTcGFjaW5nJyxcbiAgJ3dvcmQtc3BhY2luZyc6ICd3b3JkU3BhY2luZycsXG4gIHdyaXRpbmdtb2RlOiAnd3JpdGluZ01vZGUnLFxuICAnd3JpdGluZy1tb2RlJzogJ3dyaXRpbmdNb2RlJyxcbiAgeDE6ICd4MScsXG4gIHgyOiAneDInLFxuICB4OiAneCcsXG4gIHhjaGFubmVsc2VsZWN0b3I6ICd4Q2hhbm5lbFNlbGVjdG9yJyxcbiAgeGhlaWdodDogJ3hIZWlnaHQnLFxuICAneC1oZWlnaHQnOiAneEhlaWdodCcsXG4gIHhsaW5rYWN0dWF0ZTogJ3hsaW5rQWN0dWF0ZScsXG4gICd4bGluazphY3R1YXRlJzogJ3hsaW5rQWN0dWF0ZScsXG4gIHhsaW5rYXJjcm9sZTogJ3hsaW5rQXJjcm9sZScsXG4gICd4bGluazphcmNyb2xlJzogJ3hsaW5rQXJjcm9sZScsXG4gIHhsaW5raHJlZjogJ3hsaW5rSHJlZicsXG4gICd4bGluazpocmVmJzogJ3hsaW5rSHJlZicsXG4gIHhsaW5rcm9sZTogJ3hsaW5rUm9sZScsXG4gICd4bGluazpyb2xlJzogJ3hsaW5rUm9sZScsXG4gIHhsaW5rc2hvdzogJ3hsaW5rU2hvdycsXG4gICd4bGluazpzaG93JzogJ3hsaW5rU2hvdycsXG4gIHhsaW5rdGl0bGU6ICd4bGlua1RpdGxlJyxcbiAgJ3hsaW5rOnRpdGxlJzogJ3hsaW5rVGl0bGUnLFxuICB4bGlua3R5cGU6ICd4bGlua1R5cGUnLFxuICAneGxpbms6dHlwZSc6ICd4bGlua1R5cGUnLFxuICB4bWxiYXNlOiAneG1sQmFzZScsXG4gICd4bWw6YmFzZSc6ICd4bWxCYXNlJyxcbiAgeG1sbGFuZzogJ3htbExhbmcnLFxuICAneG1sOmxhbmcnOiAneG1sTGFuZycsXG4gIHhtbG5zOiAneG1sbnMnLFxuICAneG1sOnNwYWNlJzogJ3htbFNwYWNlJyxcbiAgeG1sbnN4bGluazogJ3htbG5zWGxpbmsnLFxuICAneG1sbnM6eGxpbmsnOiAneG1sbnNYbGluaycsXG4gIHhtbHNwYWNlOiAneG1sU3BhY2UnLFxuICB5MTogJ3kxJyxcbiAgeTI6ICd5MicsXG4gIHk6ICd5JyxcbiAgeWNoYW5uZWxzZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3InLFxuICB6OiAneicsXG4gIHpvb21hbmRwYW46ICd6b29tQW5kUGFuJ1xufTtcblxudmFyIGFyaWFQcm9wZXJ0aWVzID0ge1xuICAnYXJpYS1jdXJyZW50JzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtZGVzY3JpcHRpb24nOiAwLFxuICAnYXJpYS1kZXRhaWxzJzogMCxcbiAgJ2FyaWEtZGlzYWJsZWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1oaWRkZW4nOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1pbnZhbGlkJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEta2V5c2hvcnRjdXRzJzogMCxcbiAgJ2FyaWEtbGFiZWwnOiAwLFxuICAnYXJpYS1yb2xlZGVzY3JpcHRpb24nOiAwLFxuICAvLyBXaWRnZXQgQXR0cmlidXRlc1xuICAnYXJpYS1hdXRvY29tcGxldGUnOiAwLFxuICAnYXJpYS1jaGVja2VkJzogMCxcbiAgJ2FyaWEtZXhwYW5kZWQnOiAwLFxuICAnYXJpYS1oYXNwb3B1cCc6IDAsXG4gICdhcmlhLWxldmVsJzogMCxcbiAgJ2FyaWEtbW9kYWwnOiAwLFxuICAnYXJpYS1tdWx0aWxpbmUnOiAwLFxuICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnOiAwLFxuICAnYXJpYS1vcmllbnRhdGlvbic6IDAsXG4gICdhcmlhLXBsYWNlaG9sZGVyJzogMCxcbiAgJ2FyaWEtcHJlc3NlZCc6IDAsXG4gICdhcmlhLXJlYWRvbmx5JzogMCxcbiAgJ2FyaWEtcmVxdWlyZWQnOiAwLFxuICAnYXJpYS1zZWxlY3RlZCc6IDAsXG4gICdhcmlhLXNvcnQnOiAwLFxuICAnYXJpYS12YWx1ZW1heCc6IDAsXG4gICdhcmlhLXZhbHVlbWluJzogMCxcbiAgJ2FyaWEtdmFsdWVub3cnOiAwLFxuICAnYXJpYS12YWx1ZXRleHQnOiAwLFxuICAvLyBMaXZlIFJlZ2lvbiBBdHRyaWJ1dGVzXG4gICdhcmlhLWF0b21pYyc6IDAsXG4gICdhcmlhLWJ1c3knOiAwLFxuICAnYXJpYS1saXZlJzogMCxcbiAgJ2FyaWEtcmVsZXZhbnQnOiAwLFxuICAvLyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtZHJvcGVmZmVjdCc6IDAsXG4gICdhcmlhLWdyYWJiZWQnOiAwLFxuICAvLyBSZWxhdGlvbnNoaXAgQXR0cmlidXRlc1xuICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogMCxcbiAgJ2FyaWEtY29sY291bnQnOiAwLFxuICAnYXJpYS1jb2xpbmRleCc6IDAsXG4gICdhcmlhLWNvbHNwYW4nOiAwLFxuICAnYXJpYS1jb250cm9scyc6IDAsXG4gICdhcmlhLWRlc2NyaWJlZGJ5JzogMCxcbiAgJ2FyaWEtZXJyb3JtZXNzYWdlJzogMCxcbiAgJ2FyaWEtZmxvd3RvJzogMCxcbiAgJ2FyaWEtbGFiZWxsZWRieSc6IDAsXG4gICdhcmlhLW93bnMnOiAwLFxuICAnYXJpYS1wb3NpbnNldCc6IDAsXG4gICdhcmlhLXJvd2NvdW50JzogMCxcbiAgJ2FyaWEtcm93aW5kZXgnOiAwLFxuICAnYXJpYS1yb3dzcGFuJzogMCxcbiAgJ2FyaWEtc2V0c2l6ZSc6IDBcbn07XG5cbnZhciB3YXJuZWRQcm9wZXJ0aWVzID0ge307XG52YXIgckFSSUEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciByQVJJQUNhbWVsID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KHRhZ05hbWUsIG5hbWUpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChyQVJJQUNhbWVsLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBhcmlhTmFtZSA9ICdhcmlhLScgKyBuYW1lLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgY29ycmVjdE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShhcmlhTmFtZSkgPyBhcmlhTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoY29ycmVjdE5hbWUgPT0gbnVsbCkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBBUklBIGF0dHJpYnV0ZXMgZm9sbG93IHRoZSBwYXR0ZXJuIGFyaWEtKiBhbmQgbXVzdCBiZSBsb3dlcmNhc2UuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cblxuXG4gICAgICBpZiAobmFtZSAhPT0gY29ycmVjdE5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgY29ycmVjdE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAockFSSUEudGVzdChuYW1lKSkge1xuICAgICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IGxvd2VyQ2FzZWROYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG5cbiAgICAgIGlmIChzdGFuZGFyZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cblxuXG4gICAgICBpZiAobmFtZSAhPT0gc3RhbmRhcmROYW1lKSB7XG4gICAgICAgIGVycm9yKCdVbmtub3duIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgdmFyIGludmFsaWRQcm9wcyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkodHlwZSwga2V5KTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIGludmFsaWRQcm9wcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gaW52YWxpZFByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gICAgfSkuam9pbignLCAnKTtcblxuICAgIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3AgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH0gZWxzZSBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGFyaWEgcHJvcHMgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXModHlwZSwgcHJvcHMpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZU51bGwgPSBmYWxzZTtcbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQxKHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAodHlwZSAhPT0gJ2lucHV0JyAmJiB0eXBlICE9PSAndGV4dGFyZWEnICYmIHR5cGUgIT09ICdzZWxlY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BzICE9IG51bGwgJiYgcHJvcHMudmFsdWUgPT09IG51bGwgJiYgIWRpZFdhcm5WYWx1ZU51bGwpIHtcbiAgICAgIGRpZFdhcm5WYWx1ZU51bGwgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcgJiYgcHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBhcnJheSB3aGVuIGBtdWx0aXBsZWAgaXMgc2V0IHRvIGB0cnVlYCAnICsgJ3RvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAnICsgJ2ZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIHZhciB3YXJuZWRQcm9wZXJ0aWVzJDEgPSB7fTtcbiAgdmFyIEVWRU5UX05BTUVfUkVHRVggPSAvXm9uLi87XG4gIHZhciBJTlZBTElEX0VWRU5UX05BTUVfUkVHRVggPSAvXm9uW15BLVpdLztcbiAgdmFyIHJBUklBJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbiAgdmFyIHJBUklBQ2FtZWwkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuICB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAodGFnTmFtZSwgbmFtZSwgdmFsdWUsIGV2ZW50UmVnaXN0cnkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICBlcnJvcignUmVhY3QgdXNlcyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVseSBvbiB0aGUgZXZlbnQgc3lzdGVtIGJlaW5nIGluamVjdGVkIG9uIHRoZSBzZXJ2ZXIuXG5cblxuICAgIGlmIChldmVudFJlZ2lzdHJ5ICE9IG51bGwpIHtcbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0gZXZlbnRSZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBJdCB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiAnICsgJ1JlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBMZXQgdGhlIEFSSUEgYXR0cmlidXRlIGhvb2sgdmFsaWRhdGUgQVJJQSBhdHRyaWJ1dGVzXG5cblxuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIGVycm9yKCdEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2t1cCBkb2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgZXJyb3IoJ1RoZSBgYXJpYWAgYXR0cmlidXRlIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGluIFJlYWN0LiAnICsgJ1Bhc3MgaW5kaXZpZHVhbCBgYXJpYS1gIGF0dHJpYnV0ZXMgaW5zdGVhZC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhIGAlc2AgZm9yIGEgc3RyaW5nIGF0dHJpYnV0ZSBgaXNgLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCBuYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEOyAvLyBLbm93biBhdHRyaWJ1dGVzIHNob3VsZCBtYXRjaCB0aGUgY2FzaW5nIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydHkgY29uZmlnLlxuXG4gICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIERPTSBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgZXJyb3IoJ1JlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYCVzYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIElmIHlvdSAnICsgJ2ludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSAnICsgJ2F0dHJpYnV0ZSwgc3BlbGwgaXQgYXMgbG93ZXJjYXNlIGAlc2AgaW5zdGVhZC4gJyArICdJZiB5b3UgYWNjaWRlbnRhbGx5IHBhc3NlZCBpdCBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCwgcmVtb3ZlICcgKyAnaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuJywgbmFtZSwgbG93ZXJDYXNlZE5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUsIG5hbWUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuXG5cbiAgICBpZiAoaXNSZXNlcnZlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuXG5cbiAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuXG5cbiAgICBpZiAoKHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZScpICYmIHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIHRoZSBzdHJpbmcgYCVzYCBmb3IgdGhlIGJvb2xlYW4gYXR0cmlidXRlIGAlc2AuICcgKyAnJXMgJyArICdEaWQgeW91IG1lYW4gJXM9eyVzfT8nLCB2YWx1ZSwgbmFtZSwgdmFsdWUgPT09ICdmYWxzZScgPyAnVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuJyA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG52YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIHtcbiAgICB2YXIgdW5rbm93blByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSQxKHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAodW5rbm93blByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHByb3AgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIGl0IGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZXMgZm9yIHByb3BzICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIHRoZW0gaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG59XG5cbnZhciBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSA9IDE7XG52YXIgSVNfTk9OX0RFTEVHQVRFRCA9IDEgPDwgMTtcbnZhciBJU19DQVBUVVJFX1BIQVNFID0gMSA8PCAyO1xuLy8gc2V0IHRvIExFR0FDWV9GQl9TVVBQT1JULiBMRUdBQ1lfRkJfU1VQUE9SVCBvbmx5IGdldHMgc2V0IHdoZW5cbi8vIHdlIGNhbGwgd2lsbERlZmVyTGF0ZXJGb3JMZWdhY3lGQlN1cHBvcnQsIHRodXMgbm90IGJhaWxpbmcgb3V0XG4vLyB3aWxsIHJlc3VsdCBpbiBlbmRsZXNzIGN5Y2xlcyBsaWtlIGFuIGluZmluaXRlIGxvb3AuXG4vLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gZGVmZXIgZHVyaW5nIGV2ZW50IHJlcGxheWluZy5cblxudmFyIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TID0gSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgfCBJU19OT05fREVMRUdBVEVEIHwgSVNfQ0FQVFVSRV9QSEFTRTtcblxuLy8gVGhpcyBleGlzdHMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIFJlYWN0RE9NRXZlbnRSZXBsYXlpbmdcbi8vIGFuZCBET01QbHVnaW5FdmVudFN5c3RlbS5cbnZhciBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsO1xuZnVuY3Rpb24gc2V0UmVwbGF5aW5nRXZlbnQoZXZlbnQpIHtcbiAge1xuICAgIGlmIChjdXJyZW50UmVwbGF5aW5nRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBldmVudDtcbn1cbmZ1bmN0aW9uIHJlc2V0UmVwbGF5aW5nRXZlbnQoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudFJlcGxheWluZ0V2ZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBub3QgYmUgbnVsbC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG59XG5mdW5jdGlvbiBpc1JlcGxheWluZ0V2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBldmVudCA9PT0gY3VycmVudFJlcGxheWluZ0V2ZW50O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHRhcmdldCBub2RlIGZyb20gYSBuYXRpdmUgYnJvd3NlciBldmVudCBieSBhY2NvdW50aW5nIGZvclxuICogaW5jb25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7RE9NRXZlbnRUYXJnZXR9IFRhcmdldCBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSB7XG4gIC8vIEZhbGxiYWNrIHRvIG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgZm9yIElFOVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyNTA2XG4gIHZhciB0YXJnZXQgPSBuYXRpdmVFdmVudC50YXJnZXQgfHwgbmF0aXZlRXZlbnQuc3JjRWxlbWVudCB8fCB3aW5kb3c7IC8vIE5vcm1hbGl6ZSBTVkcgPHVzZT4gZWxlbWVudCBldmVudHMgIzQ5NjNcblxuICBpZiAodGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSB7XG4gICAgdGFyZ2V0ID0gdGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50O1xuICB9IC8vIFNhZmFyaSBtYXkgZmlyZSBldmVudHMgb24gdGV4dCBub2RlcyAoTm9kZS5URVhUX05PREUgaXMgMykuXG4gIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfcHJvcGVydGllcy5odG1sXG5cblxuICByZXR1cm4gdGFyZ2V0Lm5vZGVUeXBlID09PSBURVhUX05PREUgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldDtcbn1cblxudmFyIHJlc3RvcmVJbXBsID0gbnVsbDtcbnZhciByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbnZhciByZXN0b3JlUXVldWUgPSBudWxsO1xuXG5mdW5jdGlvbiByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpIHtcbiAgLy8gV2UgcGVyZm9ybSB0aGlzIHRyYW5zbGF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB3ZVxuICAvLyBhbHdheXMgcmVjZWl2ZSB0aGUgY29ycmVjdCBmaWJlciBoZXJlXG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXQpO1xuXG4gIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgIC8vIFVubW91bnRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVzdG9yZUltcGwgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFJlc3RvcmVJbXBsZW1lbnRhdGlvbigpIG5lZWRzIHRvIGJlIGNhbGxlZCB0byBoYW5kbGUgYSB0YXJnZXQgZm9yIGNvbnRyb2xsZWQgJyArICdldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB2YXIgc3RhdGVOb2RlID0gaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGU7IC8vIEd1YXJkIGFnYWluc3QgRmliZXIgYmVpbmcgdW5tb3VudGVkLlxuXG4gIGlmIChzdGF0ZU5vZGUpIHtcbiAgICB2YXIgX3Byb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gICAgcmVzdG9yZUltcGwoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUsIGludGVybmFsSW5zdGFuY2UudHlwZSwgX3Byb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oaW1wbCkge1xuICByZXN0b3JlSW1wbCA9IGltcGw7XG59XG5mdW5jdGlvbiBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCkge1xuICBpZiAocmVzdG9yZVRhcmdldCkge1xuICAgIGlmIChyZXN0b3JlUXVldWUpIHtcbiAgICAgIHJlc3RvcmVRdWV1ZS5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVRdWV1ZSA9IFt0YXJnZXRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlVGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG59XG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlSWZOZWVkZWQoKSB7XG4gIGlmICghcmVzdG9yZVRhcmdldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG4gIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCk7XG5cbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cbi8vIERlZmF1bHRzXG5cbnZhciBiYXRjaGVkVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoZm4sIGJvb2trZWVwaW5nKSB7XG4gIHJldHVybiBmbihib29ra2VlcGluZyk7XG59O1xuXG52YXIgZmx1c2hTeW5jSW1wbCA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmluaXNoRXZlbnRIYW5kbGVyKCkge1xuICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgLy8gd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjk4XG4gIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG5cbiAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgLy8gSWYgYSBjb250cm9sbGVkIGV2ZW50IHdhcyBmaXJlZCwgd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2ZcbiAgICAvLyB0aGUgRE9NIG5vZGUgYmFjayB0byB0aGUgY29udHJvbGxlZCB2YWx1ZS4gVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBSZWFjdFxuICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICAvLyBUT0RPOiBSZXN0b3JlIHN0YXRlIGluIHRoZSBtaWNyb3Rhc2ssIGFmdGVyIHRoZSBkaXNjcmV0ZSB1cGRhdGVzIGZsdXNoLFxuICAgIC8vIGluc3RlYWQgb2YgZWFybHkgZmx1c2hpbmcgdGhlbSBoZXJlLlxuICAgIGZsdXNoU3luY0ltcGwoKTtcbiAgICByZXN0b3JlU3RhdGVJZk5lZWRlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBhLCBiKSB7XG4gIGlmIChpc0luc2lkZUV2ZW50SGFuZGxlcikge1xuICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlIGFub3RoZXIgYmF0Y2gsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdFxuICAgIC8vIGZ1bGx5IGNvbXBsZXRlcyBiZWZvcmUgcmVzdG9yaW5nIHN0YXRlLlxuICAgIHJldHVybiBmbihhLCBiKTtcbiAgfVxuXG4gIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIHJldHVybiBiYXRjaGVkVXBkYXRlc0ltcGwoZm4sIGEsIGIpO1xuICB9IGZpbmFsbHkge1xuICAgIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG4gICAgZmluaXNoRXZlbnRIYW5kbGVyKCk7XG4gIH1cbn0gLy8gVE9ETzogUmVwbGFjZSB3aXRoIGZsdXNoU3luY1xuZnVuY3Rpb24gc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihfYmF0Y2hlZFVwZGF0ZXNJbXBsLCBfZGlzY3JldGVVcGRhdGVzSW1wbCwgX2ZsdXNoU3luY0ltcGwpIHtcbiAgYmF0Y2hlZFVwZGF0ZXNJbXBsID0gX2JhdGNoZWRVcGRhdGVzSW1wbDtcbiAgZmx1c2hTeW5jSW1wbCA9IF9mbHVzaFN5bmNJbXBsO1xufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykge1xuICByZXR1cm4gdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYSc7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUsIHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ29uQ2xpY2snOlxuICAgIGNhc2UgJ29uQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZURvd24nOlxuICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZVVwJzpcbiAgICBjYXNlICdvbk1vdXNlVXBDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRW50ZXInOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgc3RhdGVOb2RlID0gaW5zdC5zdGF0ZU5vZGU7XG5cbiAgaWYgKHN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MgKGV4OiBvbmxvYWQgZXZlbnRzIGluIGluY3JlbWVudGFsIG1vZGUpLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gIGlmIChwcm9wcyA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcblxuICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC50eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lciAmJiB0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBgXCIgKyByZWdpc3RyYXRpb25OYW1lICsgXCJgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYFwiICsgdHlwZW9mIGxpc3RlbmVyICsgXCJgIHR5cGUuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG52YXIgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTsgLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0IGV2ZW50cyB3aXRoIHBhc3NpdmUgbGlzdGVuZXJzXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9OyAvLyAkRmxvd0ZpeE1lOiBJZ25vcmUgRmxvdyBjb21wbGFpbmluZyBhYm91dCBuZWVkaW5nIGEgdmFsdWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcHRpb25zLCAncGFzc2l2ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kO1xuXG57XG4gIC8vIEluIERFViBtb2RlLCB3ZSBzd2FwIG91dCBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgZm9yIGEgc3BlY2lhbCB2ZXJzaW9uXG4gIC8vIHRoYXQgcGxheXMgbW9yZSBuaWNlbHkgd2l0aCB0aGUgYnJvd3NlcidzIERldlRvb2xzLiBUaGUgaWRlYSBpcyB0byBwcmVzZXJ2ZVxuICAvLyBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvci4gQmVjYXVzZSBSZWFjdCB3cmFwcyBhbGwgdXNlci1wcm92aWRlZFxuICAvLyBmdW5jdGlvbnMgaW4gaW52b2tlR3VhcmRlZENhbGxiYWNrLCBhbmQgdGhlIHByb2R1Y3Rpb24gdmVyc2lvbiBvZlxuICAvLyBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgdXNlcyBhIHRyeS1jYXRjaCwgYWxsIHVzZXIgZXhjZXB0aW9ucyBhcmUgdHJlYXRlZFxuICAvLyBsaWtlIGNhdWdodCBleGNlcHRpb25zLCBhbmQgdGhlIERldlRvb2xzIHdvbid0IHBhdXNlIHVubGVzcyB0aGUgZGV2ZWxvcGVyXG4gIC8vIHRha2VzIHRoZSBleHRyYSBzdGVwIG9mIGVuYWJsaW5nIHBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zLiBUaGlzIGlzXG4gIC8vIHVuaW50dWl0aXZlLCB0aG91Z2gsIGJlY2F1c2UgZXZlbiB0aG91Z2ggUmVhY3QgaGFzIGNhdWdodCB0aGUgZXJyb3IsIGZyb21cbiAgLy8gdGhlIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLCB0aGUgZXJyb3IgaXMgdW5jYXVnaHQuXG4gIC8vXG4gIC8vIFRvIHByZXNlcnZlIHRoZSBleHBlY3RlZCBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvciwgd2UgZG9uJ3QgdXNlIGFcbiAgLy8gdHJ5LWNhdGNoIGluIERFVi4gSW5zdGVhZCwgd2Ugc3luY2hyb25vdXNseSBkaXNwYXRjaCBhIGZha2UgZXZlbnQgdG8gYSBmYWtlXG4gIC8vIERPTSBub2RlLCBhbmQgY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyXG4gIC8vIGZvciB0aGF0IGZha2UgZXZlbnQuIElmIHRoZSBjYWxsYmFjayB0aHJvd3MsIHRoZSBlcnJvciBpcyBcImNhcHR1cmVkXCIgdXNpbmdcbiAgLy8gYSBnbG9iYWwgZXZlbnQgaGFuZGxlci4gQnV0IGJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbnMgaW4gYSBkaWZmZXJlbnRcbiAgLy8gZXZlbnQgbG9vcCBjb250ZXh0LCBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIG5vcm1hbCBwcm9ncmFtIGZsb3cuXG4gIC8vIEVmZmVjdGl2ZWx5LCB0aGlzIGdpdmVzIHVzIHRyeS1jYXRjaCBiZWhhdmlvciB3aXRob3V0IGFjdHVhbGx5IHVzaW5nXG4gIC8vIHRyeS1jYXRjaC4gTmVhdCFcbiAgLy8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgc3BlY2lhbFxuICAvLyBERVYgdmVyc2lvbiBvZiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2KG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIC8vIElmIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3Qgd2Uga25vdyBmb3Igc3VyZSB3ZSB3aWxsIGNyYXNoIGluIHRoaXMgbWV0aG9kXG4gICAgICAvLyB3aGVuIHdlIGNhbGwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKS4gSG93ZXZlciB0aGlzIGNhbiBjYXVzZSBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9yczogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzM0ODJcbiAgICAgIC8vIFNvIHdlIHByZWVtcHRpdmVseSB0aHJvdyB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UgaW5zdGVhZC5cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IGRvY3VtZW50ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBkb2N1bWVudGAgZ2xvYmFsIHdhcyBkZWZpbmVkIHdoZW4gUmVhY3Qgd2FzIGluaXRpYWxpemVkLCBidXQgaXMgbm90ICcgKyAnZGVmaW5lZCBhbnltb3JlLiBUaGlzIGNhbiBoYXBwZW4gaW4gYSB0ZXN0IGVudmlyb25tZW50IGlmIGEgY29tcG9uZW50ICcgKyAnc2NoZWR1bGVzIGFuIHVwZGF0ZSBmcm9tIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjaywgYnV0IHRoZSB0ZXN0IGhhcyBhbHJlYWR5ICcgKyAnZmluaXNoZWQgcnVubmluZy4gVG8gc29sdmUgdGhpcywgeW91IGNhbiBlaXRoZXIgdW5tb3VudCB0aGUgY29tcG9uZW50IGF0ICcgKyAndGhlIGVuZCBvZiB5b3VyIHRlc3QgKGFuZCBlbnN1cmUgdGhhdCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgZ2V0ICcgKyAnY2FuY2VsZWQgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YCksIG9yIHlvdSBjYW4gY2hhbmdlIHRoZSB0ZXN0IGl0c2VsZiAnICsgJ3RvIGJlIGFzeW5jaHJvbm91cy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgdmFyIGRpZENhbGwgPSBmYWxzZTsgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuXG4gICAgICB2YXIgZGlkRXJyb3IgPSB0cnVlOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdmFsdWUgb2Ygd2luZG93LmV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlc2V0IGl0XG4gICAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrIHRvIGxldCB1c2VyIGNvZGUgYWNjZXNzIHdpbmRvdy5ldmVudCBpbiB0aGVcbiAgICAgIC8vIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdC5cblxuICAgICAgdmFyIHdpbmRvd0V2ZW50ID0gd2luZG93LmV2ZW50OyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgZGVzY3JpcHRvciBvZiB3aW5kb3cuZXZlbnQgdG8gcmVzdG9yZSBpdCBhZnRlciBldmVudFxuICAgICAgLy8gZGlzcGF0Y2hpbmc6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2ODhcblxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgZnVuY3Rpb24gcmVzdG9yZUFmdGVyRGlzcGF0Y2goKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBXZSBjaGVjayBmb3Igd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpIHRvIHByZXZlbnQgdGhlXG4gICAgICAgIC8vIHdpbmRvdy5ldmVudCBhc3NpZ25tZW50IGluIGJvdGggSUUgPD0gMTAgYXMgdGhleSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAvLyBcIk1lbWJlciBub3QgZm91bmRcIiBpbiBzdHJpY3QgbW9kZSwgYW5kIGluIEZpcmVmb3ggd2hpY2ggZG9lcyBub3RcbiAgICAgICAgLy8gc3VwcG9ydCB3aW5kb3cuZXZlbnQuXG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhbiBldmVudCBoYW5kbGVyIGZvciBvdXIgZmFrZSBldmVudC4gV2Ugd2lsbCBzeW5jaHJvbm91c2x5XG4gICAgICAvLyBkaXNwYXRjaCBvdXIgZmFrZSBldmVudCB1c2luZyBgZGlzcGF0Y2hFdmVudGAuIEluc2lkZSB0aGUgaGFuZGxlciwgd2VcbiAgICAgIC8vIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2suXG5cblxuICAgICAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICAgICAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKCkge1xuICAgICAgICBkaWRDYWxsID0gdHJ1ZTtcbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9IC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cblxuICAgICAgdmFyIGVycm9yOyAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cblxuICAgICAgdmFyIGRpZFNldEVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgaXNDcm9zc09yaWdpbkVycm9yID0gZmFsc2U7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0Vycm9yKGV2ZW50KSB7XG4gICAgICAgIGVycm9yID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGRpZFNldEVycm9yID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwgJiYgZXZlbnQuY29sbm8gPT09IDAgJiYgZXZlbnQubGluZW5vID09PSAwKSB7XG4gICAgICAgICAgaXNDcm9zc09yaWdpbkVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7Ly8gSWdub3JlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYSBmYWtlIGV2ZW50IHR5cGUuXG5cblxuICAgICAgdmFyIGV2dFR5cGUgPSBcInJlYWN0LVwiICsgKG5hbWUgPyBuYW1lIDogJ2ludm9rZWd1YXJkZWRjYWxsYmFjaycpOyAvLyBBdHRhY2ggb3VyIGV2ZW50IGhhbmRsZXJzXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcbiAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQuIElmIHRoZSB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICAvLyBlcnJvcnMsIGl0IHdpbGwgdHJpZ2dlciBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIuXG5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkQ2FsbCAmJiBkaWRFcnJvcikge1xuICAgICAgICBpZiAoIWRpZFNldEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGVycm9yZWQsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgbmV2ZXIgZmlyZWQuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignQW4gZXJyb3Igd2FzIHRocm93biBpbnNpZGUgb25lIG9mIHlvdXIgY29tcG9uZW50cywgYnV0IFJlYWN0ICcgKyBcImRvZXNuJ3Qga25vdyB3aGF0IGl0IHdhcy4gVGhpcyBpcyBsaWtlbHkgZHVlIHRvIGJyb3dzZXIgXCIgKyAnZmxha2luZXNzLiBSZWFjdCBkb2VzIGl0cyBiZXN0IHRvIHByZXNlcnZlIHRoZSBcIlBhdXNlIG9uICcgKyAnZXhjZXB0aW9uc1wiIGJlaGF2aW9yIG9mIHRoZSBEZXZUb29scywgd2hpY2ggcmVxdWlyZXMgc29tZSAnICsgXCJERVYtbW9kZSBvbmx5IHRyaWNrcy4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXNlIGRvbid0IHdvcmsgaW4gXCIgKyAneW91ciBicm93c2VyLiBUcnkgdHJpZ2dlcmluZyB0aGUgZXJyb3IgaW4gcHJvZHVjdGlvbiBtb2RlLCAnICsgJ29yIHN3aXRjaGluZyB0byBhIG1vZGVybiBicm93c2VyLiBJZiB5b3Ugc3VzcGVjdCB0aGF0IHRoaXMgaXMgJyArICdhY3R1YWxseSBhbiBpc3N1ZSB3aXRoIFJlYWN0LCBwbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Nyb3NzT3JpZ2luRXJyb3IpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFwiQSBjcm9zcy1vcmlnaW4gZXJyb3Igd2FzIHRocm93bi4gUmVhY3QgZG9lc24ndCBoYXZlIGFjY2VzcyB0byBcIiArICd0aGUgYWN0dWFsIGVycm9yIG9iamVjdCBpbiBkZXZlbG9wbWVudC4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Nyb3Nzb3JpZ2luLWVycm9yIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgIH0gLy8gUmVtb3ZlIG91ciBldmVudCBsaXN0ZW5lcnNcblxuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoYW5kbGVXaW5kb3dFcnJvcik7XG5cbiAgICAgIGlmICghZGlkQ2FsbCkge1xuICAgICAgICAvLyBTb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcsIGFuZCBvdXIgZXZlbnQgd2FzIG5vdCBkaXNwYXRjaGVkLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NzM0XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY1ODVcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBwcm9kdWN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICByZXR1cm4gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwkMSA9IGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGw7XG5cbnZhciBoYXNFcnJvciA9IGZhbHNlO1xudmFyIGNhdWdodEVycm9yID0gbnVsbDsgLy8gVXNlZCBieSBldmVudCBzeXN0ZW0gdG8gY2FwdHVyZS9yZXRocm93IHRoZSBmaXJzdCBlcnJvci5cblxudmFyIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xudmFyIHJldGhyb3dFcnJvciA9IG51bGw7XG52YXIgcmVwb3J0ZXIgPSB7XG4gIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59O1xuLyoqXG4gKiBDYWxsIGEgZnVuY3Rpb24gd2hpbGUgZ3VhcmRpbmcgYWdhaW5zdCBlcnJvcnMgdGhhdCBoYXBwZW5zIHdpdGhpbiBpdC5cbiAqIFJldHVybnMgYW4gZXJyb3IgaWYgaXQgdGhyb3dzLCBvdGhlcndpc2UgbnVsbC5cbiAqXG4gKiBJbiBwcm9kdWN0aW9uLCB0aGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgdHJ5LWNhdGNoLiBUaGUgcmVhc29uIHdlIGRvbid0XG4gKiB1c2UgYSB0cnktY2F0Y2ggZGlyZWN0bHkgaXMgc28gdGhhdCB3ZSBjYW4gc3dhcCBvdXQgYSBkaWZmZXJlbnRcbiAqIGltcGxlbWVudGF0aW9uIGluIERFViBtb2RlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBoYXNFcnJvciA9IGZhbHNlO1xuICBjYXVnaHRFcnJvciA9IG51bGw7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwkMS5hcHBseShyZXBvcnRlciwgYXJndW1lbnRzKTtcbn1cbi8qKlxuICogU2FtZSBhcyBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGJ1dCBpbnN0ZWFkIG9mIHJldHVybmluZyBhbiBlcnJvciwgaXQgc3RvcmVzXG4gKiBpdCBpbiBhIGdsb2JhbCBzbyBpdCBjYW4gYmUgcmV0aHJvd24gYnkgYHJldGhyb3dDYXVnaHRFcnJvcmAgbGF0ZXIuXG4gKiBUT0RPOiBTZWUgaWYgY2F1Z2h0RXJyb3IgYW5kIHJldGhyb3dFcnJvciBjYW4gYmUgdW5pZmllZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgaWYgKCFoYXNSZXRocm93RXJyb3IpIHtcbiAgICAgIGhhc1JldGhyb3dFcnJvciA9IHRydWU7XG4gICAgICByZXRocm93RXJyb3IgPSBlcnJvcjtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRHVyaW5nIGV4ZWN1dGlvbiBvZiBndWFyZGVkIGZ1bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdoaWNoXG4gKiB3ZSB3aWxsIHJldGhyb3cgdG8gYmUgaGFuZGxlZCBieSB0aGUgdG9wIGxldmVsIGVycm9yIGhhbmRsZXIuXG4gKi9cblxuZnVuY3Rpb24gcmV0aHJvd0NhdWdodEVycm9yKCkge1xuICBpZiAoaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gcmV0aHJvd0Vycm9yO1xuICAgIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xuICAgIHJldGhyb3dFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0NhdWdodEVycm9yKCkge1xuICByZXR1cm4gaGFzRXJyb3I7XG59XG5mdW5jdGlvbiBjbGVhckNhdWdodEVycm9yKCkge1xuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjYXVnaHRFcnJvcjtcbiAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgIGNhdWdodEVycm9yID0gbnVsbDtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhckNhdWdodEVycm9yIHdhcyBjYWxsZWQgYnV0IG5vIGVycm9yIHdhcyBjYXB0dXJlZC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbi8qKlxuICogYFJlYWN0SW5zdGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVmdWxcbiAqIGluc3RhbmNlIChrZXkpIGFuZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHZhbHVlKS4gVGhpcyBhbGxvd3MgcHVibGljXG4gKiBtZXRob2RzIHRvIGFjY2VwdCB0aGUgdXNlciBmYWNpbmcgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgYW5kIG1hcCB0aGVtIGJhY2tcbiAqIHRvIGludGVybmFsIG1ldGhvZHMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIGN1cnJlbnRseSBzaGFyZWQgYW5kIGFzc3VtZWQgdG8gYmUgc3RhdGVsZXNzLlxuICogSWYgdGhpcyBiZWNvbWVzIGFuIGFjdHVhbCBNYXAsIHRoYXQgd2lsbCBicmVhay5cbiAqL1xuZnVuY3Rpb24gZ2V0KGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscztcbn1cbmZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHMgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIGtleS5fcmVhY3RJbnRlcm5hbHMgPSB2YWx1ZTtcbn1cblxuLy8gRG9uJ3QgY2hhbmdlIHRoZXNlIHR3byB2YWx1ZXMuIFRoZXkncmUgdXNlZCBieSBSZWFjdCBEZXYgVG9vbHMuXG52YXIgTm9GbGFncyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBQZXJmb3JtZWRXb3JrID1cbi8qICAgICAgICAgICAgICAgICovXG4xOyAvLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cblxudmFyIFBsYWNlbWVudCA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgVXBkYXRlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBDaGlsZERlbGV0aW9uID1cbi8qICAgICAgICAgICAgICAgICovXG4xNjtcbnZhciBDb250ZW50UmVzZXQgPVxuLyogICAgICAgICAgICAgICAgICovXG4zMjtcbnZhciBDYWxsYmFjayA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG42NDtcbnZhciBEaWRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMjg7XG52YXIgRm9yY2VDbGllbnRSZW5kZXIgPVxuLyogICAgICAgICAgICAqL1xuMjU2O1xudmFyIFJlZiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUxMjtcbnZhciBTbmFwc2hvdCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4xMDI0O1xudmFyIFBhc3NpdmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbjIwNDg7XG52YXIgSHlkcmF0aW5nID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuNDA5NjtcbnZhciBWaXNpYmlsaXR5ID1cbi8qICAgICAgICAgICAgICAgICAgICovXG44MTkyO1xudmFyIFN0b3JlQ29uc2lzdGVuY3kgPVxuLyogICAgICAgICAgICAgKi9cbjE2Mzg0O1xudmFyIExpZmVjeWNsZUVmZmVjdE1hc2sgPSBQYXNzaXZlIHwgVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBTbmFwc2hvdCB8IFN0b3JlQ29uc2lzdGVuY3k7IC8vIFVuaW9uIG9mIGFsbCBjb21taXQgZmxhZ3MgKGZsYWdzIHdpdGggdGhlIGxpZmV0aW1lIG9mIGEgcGFydGljdWxhciBjb21taXQpXG5cbnZhciBIb3N0RWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAgICAgICovXG4zMjc2NzsgLy8gVGhlc2UgYXJlIG5vdCByZWFsbHkgc2lkZSBlZmZlY3RzLCBidXQgd2Ugc3RpbGwgcmV1c2UgdGhpcyBmaWVsZC5cblxudmFyIEluY29tcGxldGUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjMyNzY4O1xudmFyIFNob3VsZENhcHR1cmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjY1NTM2O1xudmFyIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UgPVxuLyogKi9cbjEzMTA3MjtcbnZhciBGb3JrZWQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMDQ4NTc2OyAvLyBTdGF0aWMgdGFncyBkZXNjcmliZSBhc3BlY3RzIG9mIGEgZmliZXIgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLFxuLy8gZS5nLiBhIGZpYmVyIHVzZXMgYSBwYXNzaXZlIGVmZmVjdCAoZXZlbiBpZiB0aGVyZSBhcmUgbm8gdXBkYXRlcyBvbiB0aGlzIHBhcnRpY3VsYXIgcmVuZGVyKS5cbi8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZWZlciBtb3JlIHdvcmsgaW4gdGhlIHVubW91bnQgY2FzZSxcbi8vIHNpbmNlIHdlIGNhbiBkZWZlciB0cmF2ZXJzaW5nIHRoZSB0cmVlIGR1cmluZyBsYXlvdXQgdG8gbG9vayBmb3IgUGFzc2l2ZSBlZmZlY3RzLFxuLy8gYW5kIGluc3RlYWQgcmVseSBvbiB0aGUgc3RhdGljIGZsYWcgYXMgYSBzaWduYWwgdGhhdCB0aGVyZSBtYXkgYmUgY2xlYW51cCB3b3JrLlxuXG52YXIgUmVmU3RhdGljID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjA5NzE1MjtcbnZhciBMYXlvdXRTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgICovXG40MTk0MzA0O1xudmFyIFBhc3NpdmVTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgKi9cbjgzODg2MDg7IC8vIFRoZXNlIGZsYWdzIGFsbG93IHVzIHRvIHRyYXZlcnNlIHRvIGZpYmVycyB0aGF0IGhhdmUgZWZmZWN0cyBvbiBtb3VudFxuLy8gd2l0aG91dCB0cmF2ZXJzaW5nIHRoZSBlbnRpcmUgdHJlZSBhZnRlciBldmVyeSBjb21taXQgZm9yXG4vLyBkb3VibGUgaW52b2tpbmdcblxudmFyIE1vdW50TGF5b3V0RGV2ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE2Nzc3MjE2O1xudmFyIE1vdW50UGFzc2l2ZURldiA9XG4vKiAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyOyAvLyBHcm91cHMgb2YgZmxhZ3MgdGhhdCBhcmUgdXNlZCBpbiB0aGUgY29tbWl0IHBoYXNlIHRvIHNraXAgb3ZlciB0cmVlcyB0aGF0XG4vLyBkb24ndCBjb250YWluIGVmZmVjdHMsIGJ5IGNoZWNraW5nIHN1YnRyZWVGbGFncy5cblxudmFyIEJlZm9yZU11dGF0aW9uTWFzayA9IC8vIFRPRE86IFJlbW92ZSBVcGRhdGUgZmxhZyBmcm9tIGJlZm9yZSBtdXRhdGlvbiBwaGFzZSBieSByZS1sYW5kaW5nIFZpc2liaWxpdHlcbi8vIGZsYWcgbG9naWMgKHNlZSAjMjAwNDMpXG5VcGRhdGUgfCBTbmFwc2hvdCB8ICggMCk7XG52YXIgTXV0YXRpb25NYXNrID0gUGxhY2VtZW50IHwgVXBkYXRlIHwgQ2hpbGREZWxldGlvbiB8IENvbnRlbnRSZXNldCB8IFJlZiB8IEh5ZHJhdGluZyB8IFZpc2liaWxpdHk7XG52YXIgTGF5b3V0TWFzayA9IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgVmlzaWJpbGl0eTsgLy8gVE9ETzogU3BsaXQgaW50byBQYXNzaXZlTW91bnRNYXNrIGFuZCBQYXNzaXZlVW5tb3VudE1hc2tcblxudmFyIFBhc3NpdmVNYXNrID0gUGFzc2l2ZSB8IENoaWxkRGVsZXRpb247IC8vIFVuaW9uIG9mIHRhZ3MgdGhhdCBkb24ndCBnZXQgcmVzZXQgb24gY2xvbmVzLlxuLy8gVGhpcyBhbGxvd3MgY2VydGFpbiBjb25jZXB0cyB0byBwZXJzaXN0IHdpdGhvdXQgcmVjYWxjdWxhdGluZyB0aGVtLFxuLy8gZS5nLiB3aGV0aGVyIGEgc3VidHJlZSBjb250YWlucyBwYXNzaXZlIGVmZmVjdHMgb3IgcG9ydGFscy5cblxudmFyIFN0YXRpY01hc2sgPSBMYXlvdXRTdGF0aWMgfCBQYXNzaXZlU3RhdGljIHwgUmVmU3RhdGljO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbmZ1bmN0aW9uIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpIHtcbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgdmFyIG5lYXJlc3RNb3VudGVkID0gZmliZXI7XG5cbiAgaWYgKCFmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoaXMgbWlnaHQgYmUgYSBuZXcgdHJlZSB0aGF0IGlzbid0IGluc2VydGVkXG4gICAgLy8geWV0LiBJZiBpdCBpcywgdGhlbiBpdCB3aWxsIGhhdmUgYSBwZW5kaW5nIGluc2VydGlvbiBlZmZlY3Qgb24gaXQuXG4gICAgdmFyIG5leHROb2RlID0gbm9kZTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcblxuICAgICAgaWYgKChub2RlLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9yIGluLXByb2dyZXNzIGh5ZHJhdGlvbi4gVGhlIG5lYXJlc3QgcG9zc2libGVcbiAgICAgICAgLy8gbW91bnRlZCBmaWJlciBpcyB0aGUgcGFyZW50IGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gaWYgdGhhdCBvbmUgaXMgc3RpbGwgbW91bnRlZC5cbiAgICAgICAgbmVhcmVzdE1vdW50ZWQgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dE5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChuZXh0Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIG5lYXJlc3RNb3VudGVkO1xuICB9IC8vIElmIHdlIGRpZG4ndCBoaXQgdGhlIHJvb3QsIHRoYXQgbWVhbnMgdGhhdCB3ZSdyZSBpbiBhbiBkaXNjb25uZWN0ZWQgdHJlZVxuICAvLyB0aGF0IGhhcyBiZWVuIHVubW91bnRlZC5cblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lckZyb21GaWJlcihmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Um9vdCA/IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7XG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5mdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXJGaWJlcikgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgaWYgKCFmaWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzTW91bnRlZChmaWJlcikge1xuICBpZiAoZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgIT09IGZpYmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoIWFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZC5cbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBmaWJlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIElmIHdlIGhhdmUgdHdvIHBvc3NpYmxlIGJyYW5jaGVzLCB3ZSdsbCB3YWxrIGJhY2t3YXJkcyB1cCB0byB0aGUgcm9vdFxuICAvLyB0byBzZWUgd2hhdCBwYXRoIHRoZSByb290IHBvaW50cyB0by4gT24gdGhlIHdheSB3ZSBtYXkgaGl0IG9uZSBvZiB0aGVcbiAgLy8gc3BlY2lhbCBjYXNlcyBhbmQgd2UnbGwgZGVhbCB3aXRoIHRoZW0uXG5cblxuICB2YXIgYSA9IGZpYmVyO1xuICB2YXIgYiA9IGFsdGVybmF0ZTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBwYXJlbnRBID0gYS5yZXR1cm47XG5cbiAgICBpZiAocGFyZW50QSA9PT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgYXQgdGhlIHJvb3QuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50QiA9IHBhcmVudEEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKHBhcmVudEIgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZXJlIGlzIG5vIGFsdGVybmF0ZS4gVGhpcyBpcyBhbiB1bnVzdWFsIGNhc2UuIEN1cnJlbnRseSwgaXQgb25seVxuICAgICAgLy8gaGFwcGVucyB3aGVuIGEgU3VzcGVuc2UgY29tcG9uZW50IGlzIGhpZGRlbi4gQW4gZXh0cmEgZnJhZ21lbnQgZmliZXJcbiAgICAgIC8vIGlzIGluc2VydGVkIGluIGJldHdlZW4gdGhlIFN1c3BlbnNlIGZpYmVyIGFuZCBpdHMgY2hpbGRyZW4uIFNraXBcbiAgICAgIC8vIG92ZXIgdGhpcyBleHRyYSBmcmFnbWVudCBmaWJlciBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dCBwYXJlbnQuXG4gICAgICB2YXIgbmV4dFBhcmVudCA9IHBhcmVudEEucmV0dXJuO1xuXG4gICAgICBpZiAobmV4dFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICBhID0gYiA9IG5leHRQYXJlbnQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBJZiB0aGVyZSdzIG5vIHBhcmVudCwgd2UncmUgYXQgdGhlIHJvb3QuXG5cblxuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiBib3RoIGNvcGllcyBvZiB0aGUgcGFyZW50IGZpYmVyIHBvaW50IHRvIHRoZSBzYW1lIGNoaWxkLCB3ZSBjYW5cbiAgICAvLyBhc3N1bWUgdGhhdCB0aGUgY2hpbGQgaXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW4gd2UgYmFpbG91dCBvbiBsb3dcbiAgICAvLyBwcmlvcml0eTogdGhlIGJhaWxlZCBvdXQgZmliZXIncyBjaGlsZCByZXVzZXMgdGhlIGN1cnJlbnQgY2hpbGQuXG5cblxuICAgIGlmIChwYXJlbnRBLmNoaWxkID09PSBwYXJlbnRCLmNoaWxkKSB7XG4gICAgICB2YXIgY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkID09PSBhKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gZmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQiBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBhbHRlcm5hdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9IC8vIFdlIHNob3VsZCBuZXZlciBoYXZlIGFuIGFsdGVybmF0ZSBmb3IgYW55IG1vdW50aW5nIG5vZGUuIFNvIHRoZSBvbmx5XG4gICAgICAvLyB3YXkgdGhpcyBjb3VsZCBwb3NzaWJseSBoYXBwZW4gaXMgaWYgdGhpcyB3YXMgdW5tb3VudGVkLCBpZiBhdCBhbGwuXG5cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGEucmV0dXJuICE9PSBiLnJldHVybikge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVyIG9mIEEgYW5kIHRoZSByZXR1cm4gcG9pbnRlciBvZiBCIHBvaW50IHRvIGRpZmZlcmVudFxuICAgICAgLy8gZmliZXJzLiBXZSBhc3N1bWUgdGhhdCByZXR1cm4gcG9pbnRlcnMgbmV2ZXIgY3Jpc3MtY3Jvc3MsIHNvIEEgbXVzdFxuICAgICAgLy8gYmVsb25nIHRvIHRoZSBjaGlsZCBzZXQgb2YgQS5yZXR1cm4sIGFuZCBCIG11c3QgYmVsb25nIHRvIHRoZSBjaGlsZFxuICAgICAgLy8gc2V0IG9mIEIucmV0dXJuLlxuICAgICAgYSA9IHBhcmVudEE7XG4gICAgICBiID0gcGFyZW50QjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVycyBwb2ludCB0byB0aGUgc2FtZSBmaWJlci4gV2UnbGwgaGF2ZSB0byB1c2UgdGhlXG4gICAgICAvLyBkZWZhdWx0LCBzbG93IHBhdGg6IHNjYW4gdGhlIGNoaWxkIHNldHMgb2YgZWFjaCBwYXJlbnQgYWx0ZXJuYXRlIHRvIHNlZVxuICAgICAgLy8gd2hpY2ggY2hpbGQgYmVsb25ncyB0byB3aGljaCBzZXQuXG4gICAgICAvL1xuICAgICAgLy8gU2VhcmNoIHBhcmVudCBBJ3MgY2hpbGQgc2V0XG4gICAgICB2YXIgZGlkRmluZENoaWxkID0gZmFsc2U7XG4gICAgICB2YXIgX2NoaWxkID0gcGFyZW50QS5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQidzIGNoaWxkIHNldFxuICAgICAgICBfY2hpbGQgPSBwYXJlbnRCLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2hpbGQgd2FzIG5vdCBmb3VuZCBpbiBlaXRoZXIgcGFyZW50IHNldC4gVGhpcyBpbmRpY2F0ZXMgYSBidWcgJyArICdpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYS5hbHRlcm5hdGUgIT09IGIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJldHVybiBmaWJlcnMgc2hvdWxkIGFsd2F5cyBiZSBlYWNoIG90aGVycycgYWx0ZXJuYXRlcy4gXCIgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH0gLy8gSWYgdGhlIHJvb3QgaXMgbm90IGEgaG9zdCBjb250YWluZXIsIHdlJ3JlIGluIGEgZGlzY29ubmVjdGVkIHRyZWUuIEkuZS5cbiAgLy8gdW5tb3VudGVkLlxuXG5cbiAgaWYgKGEudGFnICE9PSBIb3N0Um9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG5cbiAgaWYgKGEuc3RhdGVOb2RlLmN1cnJlbnQgPT09IGEpIHtcbiAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIE90aGVyd2lzZSBCIGhhcyB0byBiZSBjdXJyZW50IGJyYW5jaC5cblxuXG4gIHJldHVybiBhbHRlcm5hdGU7XG59XG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcihwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGNoaWxkKTtcblxuICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgaWYgKGNoaWxkLnRhZyAhPT0gSG9zdFBvcnRhbCkge1xuICAgICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjaGlsZCk7XG5cbiAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRoaXMgbW9kdWxlIG9ubHkgZXhpc3RzIGFzIGFuIEVTTSB3cmFwcGVyIGFyb3VuZCB0aGUgZXh0ZXJuYWwgQ29tbW9uSlNcbnZhciBzY2hlZHVsZUNhbGxiYWNrID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG52YXIgY2FuY2VsQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG52YXIgc2hvdWxkWWllbGQgPSBTY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQ7XG52YXIgcmVxdWVzdFBhaW50ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3JlcXVlc3RQYWludDtcbnZhciBub3cgPSBTY2hlZHVsZXIudW5zdGFibGVfbm93O1xudmFyIGdldEN1cnJlbnRQcmlvcml0eUxldmVsID0gU2NoZWR1bGVyLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5O1xudmFyIE5vcm1hbFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5O1xudmFyIExvd1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5O1xudmFyIElkbGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JZGxlUHJpb3JpdHk7XG4vLyB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3Qgb24gdGhlIHNjaGVkdWxlciwgYnV0IGl0ICpkb2VzKlxuLy8gb24gc2NoZWR1bGVyL3Vuc3RhYmxlX21vY2ssIHdoaWNoIHdlJ2xsIG5lZWQgZm9yIGludGVybmFsIHRlc3RpbmdcbnZhciB1bnN0YWJsZV95aWVsZFZhbHVlID0gU2NoZWR1bGVyLnVuc3RhYmxlX3lpZWxkVmFsdWU7XG52YXIgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWU7XG5cbnZhciByZW5kZXJlcklEID0gbnVsbDtcbnZhciBpbmplY3RlZEhvb2sgPSBudWxsO1xudmFyIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBudWxsO1xudmFyIGhhc0xvZ2dlZEVycm9yID0gZmFsc2U7XG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGluamVjdEludGVybmFscyhpbnRlcm5hbHMpIHtcbiAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTm8gRGV2VG9vbHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuICBpZiAoaG9vay5pc0Rpc2FibGVkKSB7XG4gICAgLy8gVGhpcyBpc24ndCBhIHJlYWwgcHJvcGVydHkgb24gdGhlIGhvb2ssIGJ1dCBpdCBjYW4gYmUgc2V0IHRvIG9wdCBvdXRcbiAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzM4NzdcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaG9vay5zdXBwb3J0c0ZpYmVyKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1RoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBSZWFjdCBEZXZUb29scyBpcyB0b28gb2xkIGFuZCB3aWxsIG5vdCB3b3JrICcgKyAnd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycpO1xuICAgIH0gLy8gRGV2VG9vbHMgZXhpc3RzLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgRmliZXIuXG5cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAvLyBDb25kaXRpb25hbGx5IGluamVjdCB0aGVzZSBob29rcyBvbmx5IGlmIFRpbWVsaW5lIHByb2ZpbGVyIGlzIHN1cHBvcnRlZCBieSB0aGlzIGJ1aWxkLlxuICAgICAgLy8gVGhpcyBnaXZlcyBEZXZUb29scyBhIHdheSB0byBmZWF0dXJlIGRldGVjdCB0aGF0IGlzbid0IHRpZWQgdG8gdmVyc2lvbiBudW1iZXJcbiAgICAgIC8vIChzaW5jZSBwcm9maWxpbmcgYW5kIHRpbWVsaW5lIGFyZSBjb250cm9sbGVkIGJ5IGRpZmZlcmVudCBmZWF0dXJlIGZsYWdzKS5cbiAgICAgIGludGVybmFscyA9IGFzc2lnbih7fSwgaW50ZXJuYWxzLCB7XG4gICAgICAgIGdldExhbmVMYWJlbE1hcDogZ2V0TGFuZUxhYmVsTWFwLFxuICAgICAgICBpbmplY3RQcm9maWxpbmdIb29rczogaW5qZWN0UHJvZmlsaW5nSG9va3NcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcmVySUQgPSBob29rLmluamVjdChpbnRlcm5hbHMpOyAvLyBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBpbmplY3RlZCwgc28gbm93IGl0IGlzIHNhZmUgdG8gc2V0IHVwIGhvb2tzLlxuXG4gICAgaW5qZWN0ZWRIb29rID0gaG9vaztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQ2F0Y2ggYWxsIGVycm9ycyBiZWNhdXNlIGl0IGlzIHVuc2FmZSB0byB0aHJvdyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMuJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaG9vay5jaGVja0RDRSkge1xuICAgIC8vIFRoaXMgaXMgdGhlIHJlYWwgRGV2VG9vbHMuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBob29rIGluc3RhbGxlZCBieSBGYXN0IFJlZnJlc2ggcnVudGltZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG9uU2NoZWR1bGVSb290KHJvb3QsIGNoaWxkcmVuKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgY2hpbGRyZW4pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICggIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3Qocm9vdCwgZXZlbnRQcmlvcml0eSkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGRpZEVycm9yID0gKHJvb3QuY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpID09PSBEaWRDYXB0dXJlO1xuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgICAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHk7XG5cbiAgICAgICAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7XG4gICAgICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgSWRsZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBzY2hlZHVsZXJQcmlvcml0eSwgZGlkRXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHVuZGVmaW5lZCwgZGlkRXJyb3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvblBvc3RDb21taXRSb290KHJvb3QpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvbkNvbW1pdFVubW91bnQoZmliZXIpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudChyZW5kZXJlcklELCBmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKG5ld0lzU3RyaWN0TW9kZSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiB1bnN0YWJsZV95aWVsZFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBXZSdyZSBpbiBhIHRlc3QgYmVjYXVzZSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZSBvbmx5IGV4aXN0c1xuICAgICAgLy8gaW4gU2NoZWR1bGVyTW9jay4gVG8gcmVkdWNlIHRoZSBub2lzZSBpbiBzdHJpY3QgbW9kZSB0ZXN0cyxcbiAgICAgIC8vIHN1cHByZXNzIHdhcm5pbmdzIGFuZCBkaXNhYmxlIHNjaGVkdWxlciB5aWVsZGluZyBkdXJpbmcgdGhlIGRvdWJsZSByZW5kZXJcbiAgICAgIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlKG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgICBzZXRTdXBwcmVzc1dhcm5pbmcobmV3SXNTdHJpY3RNb2RlKTtcbiAgICB9XG5cbiAgICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUocmVuZGVyZXJJRCwgbmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIFByb2ZpbGVyIEFQSSBob29rc1xuXG5mdW5jdGlvbiBpbmplY3RQcm9maWxpbmdIb29rcyhwcm9maWxpbmdIb29rcykge1xuICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzID0gcHJvZmlsaW5nSG9va3M7XG59XG5cbmZ1bmN0aW9uIGdldExhbmVMYWJlbE1hcCgpIHtcbiAge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGxhbmUgPSAxO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IFRvdGFsTGFuZXM7IGluZGV4KyspIHtcbiAgICAgIHZhciBsYWJlbCA9IGdldExhYmVsRm9yTGFuZShsYW5lKTtcbiAgICAgIG1hcC5zZXQobGFuZSwgbGFiZWwpO1xuICAgICAgbGFuZSAqPSAyO1xuICAgIH1cblxuICAgIHJldHVybiBtYXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21taXRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZChmaWJlciwgd2FrZWFibGUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJZaWVsZGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBOb01vZGUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7IC8vIFRPRE86IFJlbW92ZSBDb25jdXJyZW50TW9kZSBieSByZWFkaW5nIGZyb20gdGhlIHJvb3QgdGFnIGluc3RlYWRcblxudmFyIENvbmN1cnJlbnRNb2RlID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMTtcbnZhciBQcm9maWxlTW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgU3RyaWN0TGVnYWN5TW9kZSA9XG4vKiAgICAgICAgICAgICAgICovXG44O1xudmFyIFN0cmljdEVmZmVjdHNNb2RlID1cbi8qICAgICAgICAgICAgICAqL1xuMTY7XG5cbi8vIFRPRE86IFRoaXMgaXMgcHJldHR5IHdlbGwgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzLiBNYXliZSB3ZSBjYW4gZHJvcCBpdC5cbnZhciBjbHozMiA9IE1hdGguY2x6MzIgPyBNYXRoLmNsejMyIDogY2x6MzJGYWxsYmFjazsgLy8gQ291bnQgbGVhZGluZyB6ZXJvcy5cbi8vIEJhc2VkIG9uOlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9jbHozMlxuXG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgTE4yID0gTWF0aC5MTjI7XG5cbmZ1bmN0aW9uIGNsejMyRmFsbGJhY2soeCkge1xuICB2YXIgYXNVaW50ID0geCA+Pj4gMDtcblxuICBpZiAoYXNVaW50ID09PSAwKSB7XG4gICAgcmV0dXJuIDMyO1xuICB9XG5cbiAgcmV0dXJuIDMxIC0gKGxvZyhhc1VpbnQpIC8gTE4yIHwgMCkgfCAwO1xufVxuXG4vLyBJZiB0aG9zZSB2YWx1ZXMgYXJlIGNoYW5nZWQgdGhhdCBwYWNrYWdlIHNob3VsZCBiZSByZWJ1aWx0IGFuZCByZWRlcGxveWVkLlxuXG52YXIgVG90YWxMYW5lcyA9IDMxO1xudmFyIE5vTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBOb0xhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIFN5bmNMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAqL1xuMjtcbnZhciBJbnB1dENvbnRpbnVvdXNMYW5lID1cbi8qICAgICAgICAgICAgICovXG40O1xudmFyIERlZmF1bHRIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgKi9cbjg7XG52YXIgRGVmYXVsdExhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjMyO1xudmFyIFRyYW5zaXRpb25MYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQxOTQyNDA7XG52YXIgVHJhbnNpdGlvbkxhbmUxID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY0O1xudmFyIFRyYW5zaXRpb25MYW5lMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMjg7XG52YXIgVHJhbnNpdGlvbkxhbmUzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBUcmFuc2l0aW9uTGFuZTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTEyO1xudmFyIFRyYW5zaXRpb25MYW5lNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMDI0O1xudmFyIFRyYW5zaXRpb25MYW5lNiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4yMDQ4O1xudmFyIFRyYW5zaXRpb25MYW5lNyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIFRyYW5zaXRpb25MYW5lOCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG44MTkyO1xudmFyIFRyYW5zaXRpb25MYW5lOSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xNjM4NDtcbnZhciBUcmFuc2l0aW9uTGFuZTEwID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMzI3Njg7XG52YXIgVHJhbnNpdGlvbkxhbmUxMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY1NTM2O1xudmFyIFRyYW5zaXRpb25MYW5lMTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMzEwNzI7XG52YXIgVHJhbnNpdGlvbkxhbmUxMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI2MjE0NDtcbnZhciBUcmFuc2l0aW9uTGFuZTE0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTI0Mjg4O1xudmFyIFRyYW5zaXRpb25MYW5lMTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMDQ4NTc2O1xudmFyIFRyYW5zaXRpb25MYW5lMTYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4yMDk3MTUyO1xudmFyIFJldHJ5TGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEzMDAyMzQyNDtcbnZhciBSZXRyeUxhbmUxID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE5NDMwNDtcbnZhciBSZXRyeUxhbmUyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuODM4ODYwODtcbnZhciBSZXRyeUxhbmUzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTY3NzcyMTY7XG52YXIgUmV0cnlMYW5lNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyO1xudmFyIFJldHJ5TGFuZTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG42NzEwODg2NDtcbnZhciBTb21lUmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcbnZhciBTZWxlY3RpdmVIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICovXG4xMzQyMTc3Mjg7XG52YXIgTm9uSWRsZUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjY4NDM1NDU1O1xudmFyIElkbGVIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgICAgKi9cbjI2ODQzNTQ1NjtcbnZhciBJZGxlTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG41MzY4NzA5MTI7XG52YXIgT2Zmc2NyZWVuTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMTA3Mzc0MTgyNDsgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgZXhwZXJpbWVudGFsIHRpbWVsaW5lIChyZWFjdC1kZXZ0b29scy10aW1lbGluZSlcbi8vIEl0IHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgTGFuZXMgdmFsdWVzIGFib3ZlLlxuXG5mdW5jdGlvbiBnZXRMYWJlbEZvckxhbmUobGFuZSkge1xuICB7XG4gICAgaWYgKGxhbmUgJiBTeW5jTGFuZSkge1xuICAgICAgcmV0dXJuICdTeW5jJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElucHV0Q29udGludW91c0xhbmUpIHtcbiAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIERlZmF1bHRIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0RlZmF1bHRIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgRGVmYXVsdExhbmUpIHtcbiAgICAgIHJldHVybiAnRGVmYXVsdCc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdUcmFuc2l0aW9uSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykge1xuICAgICAgcmV0dXJuICdUcmFuc2l0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFJldHJ5TGFuZXMpIHtcbiAgICAgIHJldHVybiAnUmV0cnknO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdTZWxlY3RpdmVIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSWRsZUh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnSWRsZUh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJZGxlTGFuZSkge1xuICAgICAgcmV0dXJuICdJZGxlJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgIHJldHVybiAnT2Zmc2NyZWVuJztcbiAgICB9XG4gIH1cbn1cbnZhciBOb1RpbWVzdGFtcCA9IC0xO1xudmFyIG5leHRUcmFuc2l0aW9uTGFuZSA9IFRyYW5zaXRpb25MYW5lMTtcbnZhciBuZXh0UmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobGFuZXMpIHtcbiAgc3dpdGNoIChnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSkge1xuICAgIGNhc2UgU3luY0xhbmU6XG4gICAgICByZXR1cm4gU3luY0xhbmU7XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNMYW5lO1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgICByZXR1cm4gRGVmYXVsdExhbmU7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgICAgcmV0dXJuIGxhbmVzICYgVHJhbnNpdGlvbkxhbmVzO1xuXG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIHJldHVybiBsYW5lcyAmIFJldHJ5TGFuZXM7XG5cbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSWRsZUh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gSWRsZUh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElkbGVMYW5lOlxuICAgICAgcmV0dXJuIElkbGVMYW5lO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5MYW5lOlxuICAgICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBlcnJvcignU2hvdWxkIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFuZXMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGJlIHJlYWNoYWJsZSwgYnV0IGFzIGEgZmFsbGJhY2ssIHJldHVybiB0aGUgZW50aXJlIGJpdG1hc2suXG5cblxuICAgICAgcmV0dXJuIGxhbmVzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5leHRMYW5lcyhyb290LCB3aXBMYW5lcykge1xuICAvLyBFYXJseSBiYWlsb3V0IGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyB3b3JrIGxlZnQuXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAocGVuZGluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH1cblxuICB2YXIgbmV4dExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lczsgLy8gRG8gbm90IHdvcmsgb24gYW55IGlkbGUgd29yayB1bnRpbCBhbGwgdGhlIG5vbi1pZGxlIHdvcmsgaGFzIGZpbmlzaGVkLFxuICAvLyBldmVuIGlmIHRoZSB3b3JrIGlzIHN1c3BlbmRlZC5cblxuICB2YXIgbm9uSWRsZVBlbmRpbmdMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIE5vbklkbGVMYW5lcztcblxuICBpZiAobm9uSWRsZVBlbmRpbmdMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHZhciBub25JZGxlVW5ibG9ja2VkTGFuZXMgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzO1xuXG4gICAgaWYgKG5vbklkbGVVbmJsb2NrZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVVuYmxvY2tlZExhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5vbklkbGVQaW5nZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiBwaW5nZWRMYW5lcztcblxuICAgICAgaWYgKG5vbklkbGVQaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlUGluZ2VkTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGUgb25seSByZW1haW5pbmcgd29yayBpcyBJZGxlLlxuICAgIHZhciB1bmJsb2NrZWRMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgIGlmICh1bmJsb2NrZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXModW5ibG9ja2VkTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGluZ2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpZiB3ZSdyZSBzdXNwZW5kZWRcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGluIHRoaXMgcGF0aCBpZiBhIGZhbGxiYWNrIHRpbWVyIGlzIG5vdCBzY2hlZHVsZWQuXG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH0gLy8gSWYgd2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVuZGVyLCBzd2l0Y2hpbmcgbGFuZXMgd2lsbCBpbnRlcnJ1cHRcbiAgLy8gaXQgYW5kIHdlJ2xsIGxvc2Ugb3VyIHByb2dyZXNzLiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHRoZSBuZXcgbGFuZXMgYXJlXG4gIC8vIGhpZ2hlciBwcmlvcml0eS5cblxuXG4gIGlmICh3aXBMYW5lcyAhPT0gTm9MYW5lcyAmJiB3aXBMYW5lcyAhPT0gbmV4dExhbmVzICYmIC8vIElmIHdlIGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgdGhlbiBpbnRlcnJ1cHRpbmcgaXMgZmluZS4gRG9uJ3RcbiAgLy8gYm90aGVyIHdhaXRpbmcgdW50aWwgdGhlIHJvb3QgaXMgY29tcGxldGUuXG4gICh3aXBMYW5lcyAmIHN1c3BlbmRlZExhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIHZhciBuZXh0TGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTtcbiAgICB2YXIgd2lwTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUod2lwTGFuZXMpO1xuXG4gICAgaWYgKCAvLyBUZXN0cyB3aGV0aGVyIHRoZSBuZXh0IGxhbmUgaXMgZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgd2lwXG4gICAgLy8gb25lLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGJpdHMgZGVjcmVhc2UgaW4gcHJpb3JpdHkgYXMgeW91IGdvIGxlZnQuXG4gICAgbmV4dExhbmUgPj0gd2lwTGFuZSB8fCAvLyBEZWZhdWx0IHByaW9yaXR5IHVwZGF0ZXMgc2hvdWxkIG5vdCBpbnRlcnJ1cHQgdHJhbnNpdGlvbiB1cGRhdGVzLiBUaGVcbiAgICAvLyBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBkZWZhdWx0IHVwZGF0ZXMgYW5kIHRyYW5zaXRpb24gdXBkYXRlcyBpcyB0aGF0XG4gICAgLy8gZGVmYXVsdCB1cGRhdGVzIGRvIG5vdCBzdXBwb3J0IHJlZnJlc2ggdHJhbnNpdGlvbnMuXG4gICAgbmV4dExhbmUgPT09IERlZmF1bHRMYW5lICYmICh3aXBMYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgICAgLy8gS2VlcCB3b3JraW5nIG9uIHRoZSBleGlzdGluZyBpbi1wcm9ncmVzcyB0cmVlLiBEbyBub3QgaW50ZXJydXB0LlxuICAgICAgcmV0dXJuIHdpcExhbmVzO1xuICAgIH1cbiAgfVxuXG4gIGlmICgobmV4dExhbmVzICYgSW5wdXRDb250aW51b3VzTGFuZSkgIT09IE5vTGFuZXMpIHtcbiAgICAvLyBXaGVuIHVwZGF0ZXMgYXJlIHN5bmMgYnkgZGVmYXVsdCwgd2UgZW50YW5nbGUgY29udGludW91cyBwcmlvcml0eSB1cGRhdGVzXG4gICAgLy8gYW5kIGRlZmF1bHQgdXBkYXRlcywgc28gdGhleSByZW5kZXIgaW4gdGhlIHNhbWUgYmF0Y2guIFRoZSBvbmx5IHJlYXNvblxuICAgIC8vIHRoZXkgdXNlIHNlcGFyYXRlIGxhbmVzIGlzIGJlY2F1c2UgY29udGludW91cyB1cGRhdGVzIHNob3VsZCBpbnRlcnJ1cHRcbiAgICAvLyB0cmFuc2l0aW9ucywgYnV0IGRlZmF1bHQgdXBkYXRlcyBzaG91bGQgbm90LlxuICAgIG5leHRMYW5lcyB8PSBwZW5kaW5nTGFuZXMgJiBEZWZhdWx0TGFuZTtcbiAgfSAvLyBDaGVjayBmb3IgZW50YW5nbGVkIGxhbmVzIGFuZCBhZGQgdGhlbSB0byB0aGUgYmF0Y2guXG4gIC8vXG4gIC8vIEEgbGFuZSBpcyBzYWlkIHRvIGJlIGVudGFuZ2xlZCB3aXRoIGFub3RoZXIgd2hlbiBpdCdzIG5vdCBhbGxvd2VkIHRvIHJlbmRlclxuICAvLyBpbiBhIGJhdGNoIHRoYXQgZG9lcyBub3QgYWxzbyBpbmNsdWRlIHRoZSBvdGhlciBsYW5lLiBUeXBpY2FsbHkgd2UgZG8gdGhpc1xuICAvLyB3aGVuIG11bHRpcGxlIHVwZGF0ZXMgaGF2ZSB0aGUgc2FtZSBzb3VyY2UsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gcmVzcG9uZCB0b1xuICAvLyB0aGUgbW9zdCByZWNlbnQgZXZlbnQgZnJvbSB0aGF0IHNvdXJjZS5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IHdlIGFwcGx5IGVudGFuZ2xlbWVudHMgKmFmdGVyKiBjaGVja2luZyBmb3IgcGFydGlhbCB3b3JrIGFib3ZlLlxuICAvLyBUaGlzIG1lYW5zIHRoYXQgaWYgYSBsYW5lIGlzIGVudGFuZ2xlZCBkdXJpbmcgYW4gaW50ZXJsZWF2ZWQgZXZlbnQgd2hpbGVcbiAgLy8gaXQncyBhbHJlYWR5IHJlbmRlcmluZywgd2Ugd29uJ3QgaW50ZXJydXB0IGl0LiBUaGlzIGlzIGludGVudGlvbmFsLCBzaW5jZVxuICAvLyBlbnRhbmdsZW1lbnQgaXMgdXN1YWxseSBcImJlc3QgZWZmb3J0XCI6IHdlJ2xsIHRyeSBvdXIgYmVzdCB0byByZW5kZXIgdGhlXG4gIC8vIGxhbmVzIGluIHRoZSBzYW1lIGJhdGNoLCBidXQgaXQncyBub3Qgd29ydGggdGhyb3dpbmcgb3V0IHBhcnRpYWxseVxuICAvLyBjb21wbGV0ZWQgd29yayBpbiBvcmRlciB0byBkbyBpdC5cbiAgLy8gVE9ETzogUmVjb25zaWRlciB0aGlzLiBUaGUgY291bnRlci1hcmd1bWVudCBpcyB0aGF0IHRoZSBwYXJ0aWFsIHdvcmtcbiAgLy8gcmVwcmVzZW50cyBhbiBpbnRlcm1lZGlhdGUgc3RhdGUsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gc2hvdyB0byB0aGUgdXNlci5cbiAgLy8gQW5kIGJ5IHNwZW5kaW5nIGV4dHJhIHRpbWUgZmluaXNoaW5nIGl0LCB3ZSdyZSBpbmNyZWFzaW5nIHRoZSBhbW91bnQgb2ZcbiAgLy8gdGltZSBpdCB0YWtlcyB0byBzaG93IHRoZSBmaW5hbCBzdGF0ZSwgd2hpY2ggaXMgd2hhdCB0aGV5IGFyZSBhY3R1YWxseVxuICAvLyB3YWl0aW5nIGZvci5cbiAgLy9cbiAgLy8gRm9yIHRob3NlIGV4Y2VwdGlvbnMgd2hlcmUgZW50YW5nbGVtZW50IGlzIHNlbWFudGljYWxseSBpbXBvcnRhbnQsIGxpa2VcbiAgLy8gdXNlTXV0YWJsZVNvdXJjZSwgd2Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHBhcnRpYWwgd29yayBhdCB0aGVcbiAgLy8gdGltZSB3ZSBhcHBseSB0aGUgZW50YW5nbGVtZW50LlxuXG5cbiAgdmFyIGVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcztcblxuICBpZiAoZW50YW5nbGVkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgICB2YXIgbGFuZXMgPSBuZXh0TGFuZXMgJiBlbnRhbmdsZWRMYW5lcztcblxuICAgIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgbmV4dExhbmVzIHw9IGVudGFuZ2xlbWVudHNbaW5kZXhdO1xuICAgICAgbGFuZXMgJj0gfmxhbmU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRMYW5lcztcbn1cbmZ1bmN0aW9uIGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpIHtcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXZlbnRUaW1lID0gZXZlbnRUaW1lc1tpbmRleF07XG5cbiAgICBpZiAoZXZlbnRUaW1lID4gbW9zdFJlY2VudEV2ZW50VGltZSkge1xuICAgICAgbW9zdFJlY2VudEV2ZW50VGltZSA9IGV2ZW50VGltZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxuXG4gIHJldHVybiBtb3N0UmVjZW50RXZlbnRUaW1lO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpIHtcbiAgc3dpdGNoIChsYW5lKSB7XG4gICAgY2FzZSBTeW5jTGFuZTpcbiAgICBjYXNlIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgLy8gVXNlciBpbnRlcmFjdGlvbnMgc2hvdWxkIGV4cGlyZSBzbGlnaHRseSBtb3JlIHF1aWNrbHkuXG4gICAgICAvL1xuICAgICAgLy8gTk9URTogVGhpcyBpcyBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29uc3RhbnQgYXMgaW4gU2NoZWR1bGVyLmpzLlxuICAgICAgLy8gV2hlbiB3ZSBtYWRlIGl0IGxhcmdlciwgYSBwcm9kdWN0IG1ldHJpYyBpbiB3d3cgcmVncmVzc2VkLCBzdWdnZXN0aW5nXG4gICAgICAvLyB0aGVyZSdzIGEgdXNlciBpbnRlcmFjdGlvbiB0aGF0J3MgYmVpbmcgc3RhcnZlZCBieSBhIHNlcmllcyBvZlxuICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlcy4gSWYgdGhhdCB0aGVvcnkgaXMgY29ycmVjdCwgdGhlIHByb3BlciBzb2x1dGlvbiBpc1xuICAgICAgLy8gdG8gZml4IHRoZSBzdGFydmF0aW9uLiBIb3dldmVyLCB0aGlzIHNjZW5hcmlvIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXRcbiAgICAgIC8vIGV4cGlyYXRpb24gdGltZXMgYXJlIGFuIGltcG9ydGFudCBzYWZlZ3VhcmQgd2hlbiBzdGFydmF0aW9uXG4gICAgICAvLyBkb2VzIGhhcHBlbi5cbiAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDI1MDtcblxuICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDUwMDA7XG5cbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgLy8gVE9ETzogUmV0cmllcyBzaG91bGQgYmUgYWxsb3dlZCB0byBleHBpcmUgaWYgdGhleSBhcmUgQ1BVIGJvdW5kIGZvclxuICAgICAgLy8gdG9vIGxvbmcsIGJ1dCB3aGVuIEkgbWFkZSB0aGlzIGNoYW5nZSBpdCBjYXVzZWQgYSBzcGlrZSBpbiBicm93c2VyXG4gICAgICAvLyBjcmFzaGVzLiBUaGVyZSBtdXN0IGJlIHNvbWUgb3RoZXIgdW5kZXJseWluZyBidWc7IG5vdCBzdXBlciB1cmdlbnQgYnV0XG4gICAgICAvLyBpZGVhbGx5IHNob3VsZCBmaWd1cmUgb3V0IHdoeSBhbmQgZml4IGl0LiBVbmZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmVcbiAgICAgIC8vIGEgcmVwcm8gZm9yIHRoZSBjcmFzaGVzLCBvbmx5IGRldGVjdGVkIHZpYSBwcm9kdWN0aW9uIG1ldHJpY3MuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG5cbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElkbGVMYW5lOlxuICAgIGNhc2UgT2Zmc2NyZWVuTGFuZTpcbiAgICAgIC8vIEFueXRoaW5nIGlkbGUgcHJpb3JpdHkgb3IgbG93ZXIgc2hvdWxkIG5ldmVyIGV4cGlyZS5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGFydmVkTGFuZXNBc0V4cGlyZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgLy8gVE9ETzogVGhpcyBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHdlIHlpZWxkLiBXZSBjYW4gb3B0aW1pemUgYnkgc3RvcmluZ1xuICAvLyB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lIG9uIHRoZSByb290LiBUaGVuIHVzZSB0aGF0IHRvIHF1aWNrbHkgYmFpbCBvdXRcbiAgLy8gb2YgdGhpcyBmdW5jdGlvbi5cbiAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzO1xuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7IC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcGVuZGluZyBsYW5lcyBhbmQgY2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGVpclxuICAvLyBleHBpcmF0aW9uIHRpbWUuIElmIHNvLCB3ZSdsbCBhc3N1bWUgdGhlIHVwZGF0ZSBpcyBiZWluZyBzdGFydmVkIGFuZCBtYXJrXG4gIC8vIGl0IGFzIGV4cGlyZWQgdG8gZm9yY2UgaXQgdG8gZmluaXNoLlxuXG4gIHZhciBsYW5lcyA9IHBlbmRpbmdMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciBleHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lc1tpbmRleF07XG5cbiAgICBpZiAoZXhwaXJhdGlvblRpbWUgPT09IE5vVGltZXN0YW1wKSB7XG4gICAgICAvLyBGb3VuZCBhIHBlbmRpbmcgbGFuZSB3aXRoIG5vIGV4cGlyYXRpb24gdGltZS4gSWYgaXQncyBub3Qgc3VzcGVuZGVkLCBvclxuICAgICAgLy8gaWYgaXQncyBwaW5nZWQsIGFzc3VtZSBpdCdzIENQVS1ib3VuZC4gQ29tcHV0ZSBhIG5ldyBleHBpcmF0aW9uIHRpbWVcbiAgICAgIC8vIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUuXG4gICAgICBpZiAoKGxhbmUgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMgfHwgKGxhbmUgJiBwaW5nZWRMYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgLy8gQXNzdW1lcyB0aW1lc3RhbXBzIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG4gICAgICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRoaXMgbGFuZSBleHBpcmVkXG4gICAgICByb290LmV4cGlyZWRMYW5lcyB8PSBsYW5lO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59IC8vIFRoaXMgcmV0dXJucyB0aGUgaGlnaGVzdCBwcmlvcml0eSBwZW5kaW5nIGxhbmVzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5XG4vLyBhcmUgc3VzcGVuZGVkLlxuXG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCkge1xuICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocm9vdC5wZW5kaW5nTGFuZXMpO1xufVxuZnVuY3Rpb24gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCkge1xuICB2YXIgZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiA9IHJvb3QucGVuZGluZ0xhbmVzICYgfk9mZnNjcmVlbkxhbmU7XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gZXZlcnl0aGluZ0J1dE9mZnNjcmVlbjtcbiAgfVxuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuICB9XG5cbiAgcmV0dXJuIE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc1N5bmNMYW5lKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBTeW5jTGFuZSkgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc05vbklkbGVXb3JrKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBOb25JZGxlTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgUmV0cnlMYW5lcykgPT09IGxhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMobGFuZXMpIHtcbiAgdmFyIFVyZ2VudExhbmVzID0gU3luY0xhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdExhbmU7XG4gIHJldHVybiAobGFuZXMgJiBVcmdlbnRMYW5lcykgPT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gbGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykge1xuXG4gIHZhciBTeW5jRGVmYXVsdExhbmVzID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSB8IElucHV0Q29udGludW91c0xhbmUgfCBEZWZhdWx0SHlkcmF0aW9uTGFuZSB8IERlZmF1bHRMYW5lO1xuICByZXR1cm4gKGxhbmVzICYgU3luY0RlZmF1bHRMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc0V4cGlyZWRMYW5lKHJvb3QsIGxhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYSBzZXBhcmF0ZSBjaGVjayBmcm9tIGluY2x1ZGVzQmxvY2tpbmdMYW5lIGJlY2F1c2UgYSBsYW5lIGNhblxuICAvLyBleHBpcmUgYWZ0ZXIgYSByZW5kZXIgaGFzIGFscmVhZHkgc3RhcnRlZC5cbiAgcmV0dXJuIChsYW5lcyAmIHJvb3QuZXhwaXJlZExhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGlzVHJhbnNpdGlvbkxhbmUobGFuZSkge1xuICByZXR1cm4gKGxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKSB7XG4gIC8vIEN5Y2xlIHRocm91Z2ggdGhlIGxhbmVzLCBhc3NpZ25pbmcgZWFjaCBuZXcgdHJhbnNpdGlvbiB0byB0aGUgbmV4dCBsYW5lLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIG1lYW5zIGV2ZXJ5IHRyYW5zaXRpb24gZ2V0cyBpdHMgb3duIGxhbmUsIHVudGlsIHdlXG4gIC8vIHJ1biBvdXQgb2YgbGFuZXMgYW5kIGN5Y2xlIGJhY2sgdG8gdGhlIGJlZ2lubmluZy5cbiAgdmFyIGxhbmUgPSBuZXh0VHJhbnNpdGlvbkxhbmU7XG4gIG5leHRUcmFuc2l0aW9uTGFuZSA8PD0gMTtcblxuICBpZiAoKG5leHRUcmFuc2l0aW9uTGFuZSAmIFRyYW5zaXRpb25MYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFJldHJ5TGFuZSgpIHtcbiAgdmFyIGxhbmUgPSBuZXh0UmV0cnlMYW5lO1xuICBuZXh0UmV0cnlMYW5lIDw8PSAxO1xuXG4gIGlmICgobmV4dFJldHJ5TGFuZSAmIFJldHJ5TGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgcmV0dXJuIGxhbmVzICYgLWxhbmVzO1xufVxuZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmUobGFuZXMpIHtcbiAgLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGdldHMgaW5saW5lZC4gT25seSBleGlzdHMgc28gdG8gY29tbXVuaWNhdGUgdGhhdCBpdFxuICAvLyBkb2Vzbid0IG1hdHRlciB3aGljaCBiaXQgaXMgc2VsZWN0ZWQ7IHlvdSBjYW4gcGljayBhbnkgYml0IHdpdGhvdXRcbiAgLy8gYWZmZWN0aW5nIHRoZSBhbGdvcml0aG1zIHdoZXJlIGl0cyB1c2VkLiBIZXJlIEknbSB1c2luZ1xuICAvLyBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lIGJlY2F1c2UgaXQgcmVxdWlyZXMgdGhlIGZld2VzdCBvcGVyYXRpb25zLlxuICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpIHtcbiAgcmV0dXJuIDMxIC0gY2x6MzIobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBsYW5lVG9JbmRleChsYW5lKSB7XG4gIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmUpO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlc1NvbWVMYW5lKGEsIGIpIHtcbiAgcmV0dXJuIChhICYgYikgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpc1N1YnNldE9mTGFuZXMoc2V0LCBzdWJzZXQpIHtcbiAgcmV0dXJuIChzZXQgJiBzdWJzZXQpID09PSBzdWJzZXQ7XG59XG5mdW5jdGlvbiBtZXJnZUxhbmVzKGEsIGIpIHtcbiAgcmV0dXJuIGEgfCBiO1xufVxuZnVuY3Rpb24gcmVtb3ZlTGFuZXMoc2V0LCBzdWJzZXQpIHtcbiAgcmV0dXJuIHNldCAmIH5zdWJzZXQ7XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhICYgYjtcbn0gLy8gU2VlbXMgcmVkdW5kYW50LCBidXQgaXQgY2hhbmdlcyB0aGUgdHlwZSBmcm9tIGEgc2luZ2xlIGxhbmUgKHVzZWQgZm9yXG4vLyB1cGRhdGVzKSB0byBhIGdyb3VwIG9mIGxhbmVzICh1c2VkIGZvciBmbHVzaGluZyB3b3JrKS5cblxuZnVuY3Rpb24gbGFuZVRvTGFuZXMobGFuZSkge1xuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGhpZ2hlclByaW9yaXR5TGFuZShhLCBiKSB7XG4gIC8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYml0IHJhbmdlcyBkZWNyZWFzZSBpbiBwcmlvcml0eSBhcyB5b3UgZ28gbGVmdC5cbiAgcmV0dXJuIGEgIT09IE5vTGFuZSAmJiBhIDwgYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gY3JlYXRlTGFuZU1hcChpbml0aWFsKSB7XG4gIC8vIEludGVudGlvbmFsbHkgcHVzaGluZyBvbmUgYnkgb25lLlxuICAvLyBodHRwczovL3Y4LmRldi9ibG9nL2VsZW1lbnRzLWtpbmRzI2F2b2lkLWNyZWF0aW5nLWhvbGVzXG4gIHZhciBsYW5lTWFwID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBUb3RhbExhbmVzOyBpKyspIHtcbiAgICBsYW5lTWFwLnB1c2goaW5pdGlhbCk7XG4gIH1cblxuICByZXR1cm4gbGFuZU1hcDtcbn1cbmZ1bmN0aW9uIG1hcmtSb290VXBkYXRlZChyb290LCB1cGRhdGVMYW5lLCBldmVudFRpbWUpIHtcbiAgcm9vdC5wZW5kaW5nTGFuZXMgfD0gdXBkYXRlTGFuZTsgLy8gSWYgdGhlcmUgYXJlIGFueSBzdXNwZW5kZWQgdHJhbnNpdGlvbnMsIGl0J3MgcG9zc2libGUgdGhpcyBuZXcgdXBkYXRlXG4gIC8vIGNvdWxkIHVuYmxvY2sgdGhlbS4gQ2xlYXIgdGhlIHN1c3BlbmRlZCBsYW5lcyBzbyB0aGF0IHdlIGNhbiB0cnkgcmVuZGVyaW5nXG4gIC8vIHRoZW0gYWdhaW4uXG4gIC8vXG4gIC8vIFRPRE86IFdlIHJlYWxseSBvbmx5IG5lZWQgdG8gdW5zdXNwZW5kIG9ubHkgbGFuZXMgdGhhdCBhcmUgaW4gdGhlXG4gIC8vIGBzdWJ0cmVlTGFuZXNgIG9mIHRoZSB1cGRhdGVkIGZpYmVyLCBvciB0aGUgdXBkYXRlIGxhbmVzIG9mIHRoZSByZXR1cm5cbiAgLy8gcGF0aC4gVGhpcyB3b3VsZCBleGNsdWRlIHN1c3BlbmRlZCB1cGRhdGVzIGluIGFuIHVucmVsYXRlZCBzaWJsaW5nIHRyZWUsXG4gIC8vIHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IGZvciB0aGlzIHVwZGF0ZSB0byB1bmJsb2NrIGl0LlxuICAvL1xuICAvLyBXZSBkb24ndCBkbyB0aGlzIGlmIHRoZSBpbmNvbWluZyB1cGRhdGUgaXMgaWRsZSwgYmVjYXVzZSB3ZSBuZXZlciBwcm9jZXNzXG4gIC8vIGlkbGUgdXBkYXRlcyB1bnRpbCBhZnRlciBhbGwgdGhlIHJlZ3VsYXIgdXBkYXRlcyBoYXZlIGZpbmlzaGVkOyB0aGVyZSdzIG5vXG4gIC8vIHdheSBpdCBjb3VsZCB1bmJsb2NrIGEgdHJhbnNpdGlvbi5cblxuICBpZiAodXBkYXRlTGFuZSAhPT0gSWRsZUxhbmUpIHtcbiAgICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgICByb290LnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleCh1cGRhdGVMYW5lKTsgLy8gV2UgY2FuIGFsd2F5cyBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdGltZXN0YW1wIGJlY2F1c2Ugd2UgcHJlZmVyIHRoZSBtb3N0XG4gIC8vIHJlY2VudCBldmVudCwgYW5kIHdlIGFzc3VtZSB0aW1lIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cblxuICBldmVudFRpbWVzW2luZGV4XSA9IGV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgfD0gc3VzcGVuZGVkTGFuZXM7XG4gIHJvb3QucGluZ2VkTGFuZXMgJj0gfnN1c3BlbmRlZExhbmVzOyAvLyBUaGUgc3VzcGVuZGVkIGxhbmVzIGFyZSBubyBsb25nZXIgQ1BVLWJvdW5kLiBDbGVhciB0aGVpciBleHBpcmF0aW9uIHRpbWVzLlxuXG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lcztcbiAgdmFyIGxhbmVzID0gc3VzcGVuZGVkTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzLCBldmVudFRpbWUpIHtcbiAgcm9vdC5waW5nZWRMYW5lcyB8PSByb290LnN1c3BlbmRlZExhbmVzICYgcGluZ2VkTGFuZXM7XG59XG5mdW5jdGlvbiBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKSB7XG4gIHZhciBub0xvbmdlclBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzICYgfnJlbWFpbmluZ0xhbmVzO1xuICByb290LnBlbmRpbmdMYW5lcyA9IHJlbWFpbmluZ0xhbmVzOyAvLyBMZXQncyB0cnkgZXZlcnl0aGluZyBhZ2FpblxuXG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICByb290LnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgcm9vdC5leHBpcmVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QubXV0YWJsZVJlYWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5lbnRhbmdsZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7IC8vIENsZWFyIHRoZSBsYW5lcyB0aGF0IG5vIGxvbmdlciBoYXZlIHBlbmRpbmcgd29ya1xuXG4gIHZhciBsYW5lcyA9IG5vTG9uZ2VyUGVuZGluZ0xhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZW50YW5nbGVtZW50c1tpbmRleF0gPSBOb0xhbmVzO1xuICAgIGV2ZW50VGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBlbnRhbmdsZWRMYW5lcykge1xuICAvLyBJbiBhZGRpdGlvbiB0byBlbnRhbmdsaW5nIGVhY2ggb2YgdGhlIGdpdmVuIGxhbmVzIHdpdGggZWFjaCBvdGhlciwgd2UgYWxzb1xuICAvLyBoYXZlIHRvIGNvbnNpZGVyIF90cmFuc2l0aXZlXyBlbnRhbmdsZW1lbnRzLiBGb3IgZWFjaCBsYW5lIHRoYXQgaXMgYWxyZWFkeVxuICAvLyBlbnRhbmdsZWQgd2l0aCAqYW55KiBvZiB0aGUgZ2l2ZW4gbGFuZXMsIHRoYXQgbGFuZSBpcyBub3cgdHJhbnNpdGl2ZWx5XG4gIC8vIGVudGFuZ2xlZCB3aXRoICphbGwqIHRoZSBnaXZlbiBsYW5lcy5cbiAgLy9cbiAgLy8gVHJhbnNsYXRlZDogSWYgQyBpcyBlbnRhbmdsZWQgd2l0aCBBLCB0aGVuIGVudGFuZ2xpbmcgQSB3aXRoIEIgYWxzb1xuICAvLyBlbnRhbmdsZXMgQyB3aXRoIEIuXG4gIC8vXG4gIC8vIElmIHRoaXMgaXMgaGFyZCB0byBncmFzcCwgaXQgbWlnaHQgaGVscCB0byBpbnRlbnRpb25hbGx5IGJyZWFrIHRoaXNcbiAgLy8gZnVuY3Rpb24gYW5kIGxvb2sgYXQgdGhlIHRlc3RzIHRoYXQgZmFpbCBpbiBSZWFjdFRyYW5zaXRpb24tdGVzdC5qcy4gVHJ5XG4gIC8vIGNvbW1lbnRpbmcgb3V0IG9uZSBvZiB0aGUgY29uZGl0aW9ucyBiZWxvdy5cbiAgdmFyIHJvb3RFbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXMgfD0gZW50YW5nbGVkTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgbGFuZXMgPSByb290RW50YW5nbGVkTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuXG4gICAgaWYgKCAvLyBJcyB0aGlzIG9uZSBvZiB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzP1xuICAgIGxhbmUgJiBlbnRhbmdsZWRMYW5lcyB8IC8vIElzIHRoaXMgbGFuZSB0cmFuc2l0aXZlbHkgZW50YW5nbGVkIHdpdGggdGhlIG5ld2x5IGVudGFuZ2xlZCBsYW5lcz9cbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSAmIGVudGFuZ2xlZExhbmVzKSB7XG4gICAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSB8PSBlbnRhbmdsZWRMYW5lcztcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcykge1xuICB2YXIgcmVuZGVyTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUocmVuZGVyTGFuZXMpO1xuICB2YXIgbGFuZTtcblxuICBzd2l0Y2ggKHJlbmRlckxhbmUpIHtcbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICBsYW5lID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICAgIGxhbmUgPSBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICBsYW5lID0gVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgICBsYW5lID0gSWRsZUh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBFdmVyeXRoaW5nIGVsc2UgaXMgYWxyZWFkeSBlaXRoZXIgYSBoeWRyYXRpb24gbGFuZSwgb3Igc2hvdWxkbid0XG4gICAgICAvLyBiZSByZXRyaWVkIGF0IGEgaHlkcmF0aW9uIGxhbmUuXG4gICAgICBsYW5lID0gTm9MYW5lO1xuICAgICAgYnJlYWs7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlIGxhbmUgd2UgY2hvc2UgaXMgc3VzcGVuZGVkLiBJZiBzbywgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZVxuICAvLyBhbHJlYWR5IGF0dGVtcHRlZCBhbmQgZmFpbGVkIHRvIGh5ZHJhdGUgYXQgdGhhdCBsZXZlbC4gQWxzbyBjaGVjayBpZiB3ZSdyZVxuICAvLyBhbHJlYWR5IHJlbmRlcmluZyB0aGF0IGxhbmUsIHdoaWNoIGlzIHJhcmUgYnV0IGNvdWxkIGhhcHBlbi5cblxuXG4gIGlmICgobGFuZSAmIChyb290LnN1c3BlbmRlZExhbmVzIHwgcmVuZGVyTGFuZXMpKSAhPT0gTm9MYW5lKSB7XG4gICAgLy8gR2l2ZSB1cCB0cnlpbmcgdG8gaHlkcmF0ZSBhbmQgZmFsbCBiYWNrIHRvIGNsaWVudCByZW5kZXIuXG4gICAgcmV0dXJuIE5vTGFuZTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIGZpYmVyLCBsYW5lcykge1xuXG4gIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDtcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTtcbiAgICB1cGRhdGVycy5hZGQoZmliZXIpO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpIHtcblxuICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXA7XG4gIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciB1cGRhdGVycyA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuXG4gICAgaWYgKHVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICB1cGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgIW1lbW9pemVkVXBkYXRlcnMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmFkZChmaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcyhyb290LCBsYW5lcykge1xuICB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudmFyIERpc2NyZXRlRXZlbnRQcmlvcml0eSA9IFN5bmNMYW5lO1xudmFyIENvbnRpbnVvdXNFdmVudFByaW9yaXR5ID0gSW5wdXRDb250aW51b3VzTGFuZTtcbnZhciBEZWZhdWx0RXZlbnRQcmlvcml0eSA9IERlZmF1bHRMYW5lO1xudmFyIElkbGVFdmVudFByaW9yaXR5ID0gSWRsZUxhbmU7XG52YXIgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gTm9MYW5lO1xuZnVuY3Rpb24gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCkge1xuICByZXR1cm4gY3VycmVudFVwZGF0ZVByaW9yaXR5O1xufVxuZnVuY3Rpb24gc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KG5ld1ByaW9yaXR5KSB7XG4gIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IG5ld1ByaW9yaXR5O1xufVxuZnVuY3Rpb24gcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5LCBmbikge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGN1cnJlbnRVcGRhdGVQcmlvcml0eTtcblxuICB0cnkge1xuICAgIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IHByaW9yaXR5O1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IHByZXZpb3VzUHJpb3JpdHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZ2hlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gbG93ZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgPT09IDAgfHwgYSA+IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGlzSGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhICE9PSAwICYmIGEgPCBiO1xufVxuZnVuY3Rpb24gbGFuZXNUb0V2ZW50UHJpb3JpdHkobGFuZXMpIHtcbiAgdmFyIGxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTtcblxuICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHksIGxhbmUpKSB7XG4gICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KENvbnRpbnVvdXNFdmVudFByaW9yaXR5LCBsYW5lKSkge1xuICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIGlmIChpbmNsdWRlc05vbklkbGVXb3JrKGxhbmUpKSB7XG4gICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xufVxuXG4vLyBUaGlzIGlzIGltcG9ydGVkIGJ5IHRoZSBldmVudCByZXBsYXlpbmcgaW1wbGVtZW50YXRpb24gaW4gUmVhY3QgRE9NLiBJdCdzXG4vLyBpbiBhIHNlcGFyYXRlIGZpbGUgdG8gYnJlYWsgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHJlbmRlcmVyIGFuZFxuLy8gdGhlIHJlY29uY2lsZXIuXG5mdW5jdGlvbiBpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpIHtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHJvb3QuY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gY3VycmVudFN0YXRlLmlzRGVoeWRyYXRlZDtcbn1cblxudmFyIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb247XG5cbmZ1bmN0aW9uIHNldEF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmbikge1xuICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uID0gZm47XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpIHtcbiAgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcik7XG59XG52YXIgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb247XG5mdW5jdGlvbiBzZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihmbikge1xuICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiA9IGZuO1xufVxudmFyIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eTtcbmZ1bmN0aW9uIHNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkgPSBmbjtcbn1cbnZhciBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMTtcbmZ1bmN0aW9uIHNldEdldEN1cnJlbnRVcGRhdGVQcmlvcml0eShmbikge1xuICBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMSA9IGZuO1xufVxudmFyIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5O1xuZnVuY3Rpb24gc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkgPSBmbjtcbn0gLy8gVE9ETzogVXBncmFkZSB0aGlzIGRlZmluaXRpb24gb25jZSB3ZSdyZSBvbiBhIG5ld2VyIHZlcnNpb24gb2YgRmxvdyB0aGF0XG4vLyBoYXMgdGhpcyBkZWZpbml0aW9uIGJ1aWx0LWluLlxuXG52YXIgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IGZhbHNlOyAvLyBUaGUgcXVldWUgb2YgZGlzY3JldGUgZXZlbnRzIHRvIGJlIHJlcGxheWVkLlxuXG52YXIgcXVldWVkRGlzY3JldGVFdmVudHMgPSBbXTsgLy8gSW5kaWNhdGVzIGlmIGFueSBjb250aW51b3VzIGV2ZW50IHRhcmdldHMgYXJlIG5vbi1udWxsIGZvciBlYXJseSBiYWlsb3V0LlxuLy8gaWYgdGhlIGxhc3QgdGFyZ2V0IHdhcyBkZWh5ZHJhdGVkLlxuXG52YXIgcXVldWVkRm9jdXMgPSBudWxsO1xudmFyIHF1ZXVlZERyYWcgPSBudWxsO1xudmFyIHF1ZXVlZE1vdXNlID0gbnVsbDsgLy8gRm9yIHBvaW50ZXIgZXZlbnRzIHRoZXJlIGNhbiBiZSBvbmUgbGF0ZXN0IGV2ZW50IHBlciBwb2ludGVySWQuXG5cbnZhciBxdWV1ZWRQb2ludGVycyA9IG5ldyBNYXAoKTtcbnZhciBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMgPSBuZXcgTWFwKCk7IC8vIFdlIGNvdWxkIGNvbnNpZGVyIHJlcGxheWluZyBzZWxlY3Rpb25jaGFuZ2UgYW5kIHRvdWNobW92ZXMgdG9vLlxuXG52YXIgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzID0gW107XG52YXIgZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzID0gWydtb3VzZWRvd24nLCAnbW91c2V1cCcsICd0b3VjaGNhbmNlbCcsICd0b3VjaGVuZCcsICd0b3VjaHN0YXJ0JywgJ2F1eGNsaWNrJywgJ2RibGNsaWNrJywgJ3BvaW50ZXJjYW5jZWwnLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcnVwJywgJ2RyYWdlbmQnLCAnZHJhZ3N0YXJ0JywgJ2Ryb3AnLCAnY29tcG9zaXRpb25lbmQnLCAnY29tcG9zaXRpb25zdGFydCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ2lucHV0JywgJ3RleHRJbnB1dCcsIC8vIEludGVudGlvbmFsbHkgY2FtZWxDYXNlXG4nY29weScsICdjdXQnLCAncGFzdGUnLCAnY2xpY2snLCAnY2hhbmdlJywgJ2NvbnRleHRtZW51JywgJ3Jlc2V0JywgJ3N1Ym1pdCddO1xuZnVuY3Rpb24gaXNEaXNjcmV0ZUV2ZW50VGhhdFJlcXVpcmVzSHlkcmF0aW9uKGV2ZW50VHlwZSkge1xuICByZXR1cm4gZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZXZlbnRUeXBlKSA+IC0xO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9ja2VkT246IGJsb2NrZWRPbixcbiAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICBldmVudFN5c3RlbUZsYWdzOiBldmVudFN5c3RlbUZsYWdzLFxuICAgIG5hdGl2ZUV2ZW50OiBuYXRpdmVFdmVudCxcbiAgICB0YXJnZXRDb250YWluZXJzOiBbdGFyZ2V0Q29udGFpbmVyXVxuICB9O1xufVxuXG5mdW5jdGlvbiBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5kZWxldGUocG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUoX3BvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoZXhpc3RpbmdRdWV1ZWRFdmVudCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKGV4aXN0aW5nUXVldWVkRXZlbnQgPT09IG51bGwgfHwgZXhpc3RpbmdRdWV1ZWRFdmVudC5uYXRpdmVFdmVudCAhPT0gbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9maWJlcjIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFyZ2V0LlxuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWVkRXZlbnQ7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0aGlzIGV4YWN0IGV2ZW50LCB0aGVuIGl0J3MgYmVjYXVzZVxuICAvLyB0aGUgZGlmZmVyZW50IGV2ZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgRE9NIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gV2UgY2FuIGFjY3VtdWxhdGUgdGhlIGZsYWdzLCBhbmQgdGhlIHRhcmdldENvbnRhaW5lcnMsIGFuZFxuICAvLyBzdG9yZSBhIHNpbmdsZSBldmVudCB0byBiZSByZXBsYXllZC5cblxuXG4gIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IGV4aXN0aW5nUXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIHRhcmdldENvbnRhaW5lcnMuaW5kZXhPZih0YXJnZXRDb250YWluZXIpID09PSAtMSkge1xuICAgIHRhcmdldENvbnRhaW5lcnMucHVzaCh0YXJnZXRDb250YWluZXIpO1xuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nUXVldWVkRXZlbnQ7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVGhlc2Ugc2V0IHJlbGF0ZWRUYXJnZXQgdG8gbnVsbCBiZWNhdXNlIHRoZSByZXBsYXllZCBldmVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgd2VcbiAgLy8gbW92ZWQgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cgKG5vIHRhcmdldCkgb250byB0aGUgdGFyZ2V0IG9uY2UgaXQgaHlkcmF0ZXMuXG4gIC8vIEluc3RlYWQgb2YgbXV0YXRpbmcgd2UgY291bGQgY2xvbmUgdGhlIGV2ZW50LlxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAge1xuICAgICAgICB2YXIgZm9jdXNFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRGb2N1cyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRm9jdXMsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGZvY3VzRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBkcmFnRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRHJhZywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZHJhZ0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRNb3VzZSA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkTW91c2UsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG1vdXNlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuc2V0KHBvaW50ZXJJZCwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVycy5nZXQocG9pbnRlcklkKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBwb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBfcG9pbnRlcklkMiA9IF9wb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuc2V0KF9wb2ludGVySWQyLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5nZXQoX3BvaW50ZXJJZDIpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIF9wb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGlzIHVuYmxvY2tlZC4gUmV0dXJucyB0cnVlIGlmIGl0J3MgdW5ibG9ja2VkLlxuXG5mdW5jdGlvbiBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hhcmVzIGEgbG90IG9mIGxvZ2ljIHdpdGggZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudC5cbiAgLy8gVHJ5IHRvIHVuaWZ5IHRoZW0uIEl0J3MgYSBiaXQgdHJpY2t5IHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHJldHVyblxuICAvLyB2YWx1ZXMuXG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBibG9ja2VkIG9uIGh5ZHJhdGluZyB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIC8vIEluY3JlYXNlIGl0cyBwcmlvcml0eS5cbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gaW5zdGFuY2U7XG4gICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocXVldWVkVGFyZ2V0LnByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7IC8vIFdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGEgd2F5IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZlxuICAgICAgICAgIC8vIGEgcm9vdCBvdGhlciB0aGFuIHN5bmMuXG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcXVldWVFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpIHtcbiAgLy8gVE9ETzogVGhpcyB3aWxsIHJlYWQgdGhlIHByaW9yaXR5IGlmIGl0J3MgZGlzcGF0Y2hlZCBieSB0aGUgUmVhY3RcbiAgLy8gZXZlbnQgc3lzdGVtIGJ1dCBub3QgbmF0aXZlIGV2ZW50cy4gU2hvdWxkIHJlYWQgd2luZG93LmV2ZW50LnR5cGUsIGxpa2VcbiAgLy8gd2UgZG8gZm9yIHVwZGF0ZXMgKGdldEN1cnJlbnRFdmVudFByaW9yaXR5KS5cbiAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDEoKTtcbiAgdmFyIHF1ZXVlZFRhcmdldCA9IHtcbiAgICBibG9ja2VkT246IG51bGwsXG4gICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgcHJpb3JpdHk6IHVwZGF0ZVByaW9yaXR5XG4gIH07XG4gIHZhciBpID0gMDtcblxuICBmb3IgKDsgaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgIC8vIFN0b3Agb25jZSB3ZSBoaXQgdGhlIGZpcnN0IHRhcmdldCB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW5cbiAgICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eSh1cGRhdGVQcmlvcml0eSwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW2ldLnByaW9yaXR5KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNwbGljZShpLCAwLCBxdWV1ZWRUYXJnZXQpO1xuXG4gIGlmIChpID09PSAwKSB7XG4gICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkge1xuICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBxdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuXG4gIHdoaWxlICh0YXJnZXRDb250YWluZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gdGFyZ2V0Q29udGFpbmVyc1swXTtcbiAgICB2YXIgbmV4dEJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQocXVldWVkRXZlbnQuZG9tRXZlbnROYW1lLCBxdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50KTtcblxuICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHZhciBuYXRpdmVFdmVudCA9IHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgbmF0aXZlRXZlbnRDbG9uZSA9IG5ldyBuYXRpdmVFdmVudC5jb25zdHJ1Y3RvcihuYXRpdmVFdmVudC50eXBlLCBuYXRpdmVFdmVudCk7XG4gICAgICAgIHNldFJlcGxheWluZ0V2ZW50KG5hdGl2ZUV2ZW50Q2xvbmUpO1xuICAgICAgICBuYXRpdmVFdmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChuYXRpdmVFdmVudENsb25lKTtcbiAgICAgICAgcmVzZXRSZXBsYXlpbmdFdmVudCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSdyZSBzdGlsbCBibG9ja2VkLiBUcnkgYWdhaW4gbGF0ZXIuXG4gICAgICB2YXIgX2ZpYmVyMyA9IGdldEluc3RhbmNlRnJvbU5vZGUobmV4dEJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIzICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjMpO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gVGhpcyB0YXJnZXQgY29udGFpbmVyIHdhcyBzdWNjZXNzZnVsbHkgZGlzcGF0Y2hlZC4gVHJ5IHRoZSBuZXh0LlxuXG5cbiAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKHF1ZXVlZEV2ZW50LCBrZXksIG1hcCkge1xuICBpZiAoYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkpIHtcbiAgICBtYXAuZGVsZXRlKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGF5VW5ibG9ja2VkRXZlbnRzKCkge1xuICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7XG5cblxuICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRGb2N1cykpIHtcbiAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVldWVkRHJhZyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZERyYWcpKSB7XG4gICAgcXVldWVkRHJhZyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRNb3VzZSkpIHtcbiAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gIH1cblxuICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7XG4gIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG51bGw7XG5cbiAgICBpZiAoIWhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQpIHtcbiAgICAgIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSB0cnVlOyAvLyBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGF0dGVtcHQgcmVwbGF5aW5nIGFzIG1hbnkgZXZlbnRzIGFzIGFyZVxuICAgICAgLy8gbm93IHVuYmxvY2tlZC4gVGhpcyBmaXJzdCBtaWdodCBub3QgYWN0dWFsbHkgYmUgdW5ibG9ja2VkIHlldC5cbiAgICAgIC8vIFdlIGNvdWxkIGNoZWNrIGl0IGVhcmx5IHRvIGF2b2lkIHNjaGVkdWxpbmcgYW4gdW5uZWNlc3NhcnkgY2FsbGJhY2suXG5cbiAgICAgIFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKFNjaGVkdWxlci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSwgcmVwbGF5VW5ibG9ja2VkRXZlbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV0cnlJZkJsb2NrZWRPbih1bmJsb2NrZWQpIHtcbiAgLy8gTWFyayBhbnl0aGluZyB0aGF0IHdhcyBibG9ja2VkIG9uIHRoaXMgYXMgbm8gbG9uZ2VyIGJsb2NrZWRcbiAgLy8gYW5kIGVsaWdpYmxlIGZvciBhIHJlcGxheS5cbiAgaWYgKHF1ZXVlZERpc2NyZXRlRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRGlzY3JldGVFdmVudHNbMF0sIHVuYmxvY2tlZCk7IC8vIFRoaXMgaXMgYSBleHBvbmVudGlhbCBzZWFyY2ggZm9yIGVhY2ggYm91bmRhcnkgdGhhdCBjb21taXRzLiBJIHRoaW5rIGl0J3NcbiAgICAvLyB3b3J0aCBpdCBiZWNhdXNlIHdlIGV4cGVjdCB2ZXJ5IGZldyBkaXNjcmV0ZSBldmVudHMgdG8gcXVldWUgdXAgYW5kIG9uY2VcbiAgICAvLyB3ZSBhcmUgYWN0dWFsbHkgZnVsbHkgdW5ibG9ja2VkIGl0IHdpbGwgYmUgZmFzdCB0byByZXBsYXkgdGhlbS5cblxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZWRFdmVudCA9IHF1ZXVlZERpc2NyZXRlRXZlbnRzW2ldO1xuXG4gICAgICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRm9jdXMsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkRHJhZyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREcmFnLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgaWYgKHF1ZXVlZE1vdXNlICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZE1vdXNlLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgdmFyIHVuYmxvY2sgPSBmdW5jdGlvbiAocXVldWVkRXZlbnQpIHtcbiAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpO1xuICB9O1xuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2godW5ibG9jayk7XG4gIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKHVuYmxvY2spO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHF1ZXVlZFRhcmdldCA9IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tfaV07XG5cbiAgICBpZiAocXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgbmV4dEV4cGxpY2l0VGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzWzBdO1xuXG4gICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuXG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KG5leHRFeHBsaWNpdFRhcmdldCk7XG5cbiAgICAgIGlmIChuZXh0RXhwbGljaXRUYXJnZXQuYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3JlIHVuYmxvY2tlZC5cbiAgICAgICAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOyAvLyBUT0RPOiBjYW4gd2Ugc3RvcCBleHBvcnRpbmcgdGhlc2U/XG5cbnZhciBfZW5hYmxlZCA9IHRydWU7IC8vIFRoaXMgaXMgZXhwb3J0ZWQgaW4gRkIgYnVpbGRzIGZvciB1c2UgYnkgbGVnYWN5IEZCIGxheWVyIGluZnJhLlxuLy8gV2UnZCBsaWtlIHRvIHJlbW92ZSB0aGlzIGJ1dCBpdCdzIG5vdCBjbGVhciBpZiB0aGlzIGlzIHNhZmUuXG5cbmZ1bmN0aW9uIHNldEVuYWJsZWQoZW5hYmxlZCkge1xuICBfZW5hYmxlZCA9ICEhZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGlzRW5hYmxlZCgpIHtcbiAgcmV0dXJuIF9lbmFibGVkO1xufVxuZnVuY3Rpb24gY3JlYXRlRXZlbnRMaXN0ZW5lcldyYXBwZXJXaXRoUHJpb3JpdHkodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgdmFyIGV2ZW50UHJpb3JpdHkgPSBnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSk7XG4gIHZhciBsaXN0ZW5lcldyYXBwZXI7XG5cbiAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7XG4gICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaERpc2NyZXRlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaENvbnRpbnVvdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICBkZWZhdWx0OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyV3JhcHBlci5iaW5kKG51bGwsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSk7XG4gICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKCFfZW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBkaXNwYXRjaEV2ZW50V2l0aEVuYWJsZUNhcHR1cmVQaGFzZVNlbGVjdGl2ZUh5ZHJhdGlvbldpdGhvdXREaXNjcmV0ZUV2ZW50UmVwbGF5KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIGJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHJldHVybl90YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpO1xuICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpKSB7XG4gICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdlIG5lZWQgdG8gY2xlYXIgb25seSBpZiB3ZSBkaWRuJ3QgcXVldWUgYmVjYXVzZVxuICAvLyBxdWV1ZWluZyBpcyBhY2N1bXVsYXRpdmUuXG5cblxuICBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuXG4gIGlmIChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSAmJiBpc0Rpc2NyZXRlRXZlbnRUaGF0UmVxdWlyZXNIeWRyYXRpb24oZG9tRXZlbnROYW1lKSkge1xuICAgIHdoaWxlIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIHZhciBmaWJlciA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcblxuICAgICAgaWYgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBibG9ja2VkT24pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgfVxuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoaXMgaXMgbm90IHJlcGxheWFibGUgc28gd2UnbGwgaW52b2tlIGl0IGJ1dCB3aXRob3V0IGEgdGFyZ2V0LFxuICAvLyBpbiBjYXNlIHRoZSBldmVudCBzeXN0ZW0gbmVlZHMgdG8gdHJhY2UgaXQuXG5cblxuICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgbnVsbCwgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxudmFyIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDsgLy8gUmV0dXJucyBhIFN1c3BlbnNlSW5zdGFuY2Ugb3IgQ29udGFpbmVyIGlmIGl0J3MgYmxvY2tlZC5cbi8vIFRoZSByZXR1cm5fdGFyZ2V0SW5zdCBmaWVsZCBhYm92ZSBpcyBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlLlxuXG5mdW5jdGlvbiBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICAvLyBUT0RPOiBXYXJuIGlmIF9lbmFibGVkIGlzIGZhbHNlLlxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHRyZWUgaGFzIGJlZW4gdW5tb3VudGVkIGFscmVhZHkuIERpc3BhdGNoIHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIGV2ZW50IHRvIGJlIHJlcGxheWVkIGxhdGVyLiBBYm9ydCBkaXNwYXRjaGluZyBzaW5jZSB3ZVxuICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhpcyBldmVudCBkaXNwYXRjaGVkIHR3aWNlIHRocm91Z2ggdGhlIGV2ZW50IHN5c3RlbS5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXNjcmV0ZSBldmVudCBpbiB0aGUgcXVldWUuIFNjaGVkdWxlIGFuIGluY3JlYXNlZFxuICAgICAgICAgIC8vIHByaW9yaXR5IGZvciB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIHNvbWV0aGluZyB3ZW50IHdyb25nIGJ1dCB0byBhdm9pZCBibG9ja2luZ1xuICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLCBkaXNwYXRjaCB0aGUgZXZlbnQgd2l0aG91dCBhIHRhcmdldC5cbiAgICAgICAgLy8gVE9ETzogV2Fybi5cblxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zIGR1cmluZyBhIHJlcGxheSBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgaXQgbWlnaHQgYmxvY2tcbiAgICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLlxuICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXJGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKG5lYXJlc3RNb3VudGVkICE9PSB0YXJnZXRJbnN0KSB7XG4gICAgICAgIC8vIElmIHdlIGdldCBhbiBldmVudCAoZXg6IGltZyBvbmxvYWQpIGJlZm9yZSBjb21taXR0aW5nIHRoYXRcbiAgICAgICAgLy8gY29tcG9uZW50J3MgbW91bnQsIGlnbm9yZSBpdCBmb3Igbm93ICh0aGF0IGlzLCB0cmVhdCBpdCBhcyBpZiBpdCB3YXMgYW5cbiAgICAgICAgLy8gZXZlbnQgb24gYSBub24tUmVhY3QgdHJlZSkuIFdlIG1pZ2h0IGFsc28gY29uc2lkZXIgcXVldWVpbmcgZXZlbnRzIGFuZFxuICAgICAgICAvLyBkaXNwYXRjaGluZyB0aGVtIGFmdGVyIHRoZSBtb3VudC5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0OyAvLyBXZSdyZSBub3QgYmxvY2tlZCBvbiBhbnl0aGluZy5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgLy8gVXNlZCBieSBTaW1wbGVFdmVudFBsdWdpbjpcbiAgICBjYXNlICdjYW5jZWwnOlxuICAgIGNhc2UgJ2NsaWNrJzpcbiAgICBjYXNlICdjbG9zZSc6XG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICBjYXNlICdkcmFnc3RhcnQnOlxuICAgIGNhc2UgJ2Ryb3AnOlxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnaW52YWxpZCc6XG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNldXAnOlxuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICBjYXNlICdwYXVzZSc6XG4gICAgY2FzZSAncGxheSc6XG4gICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6XG4gICAgY2FzZSAncG9pbnRlcmRvd24nOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgY2FzZSAncmF0ZWNoYW5nZSc6XG4gICAgY2FzZSAncmVzZXQnOlxuICAgIGNhc2UgJ3Jlc2l6ZSc6XG4gICAgY2FzZSAnc2Vla2VkJzpcbiAgICBjYXNlICdzdWJtaXQnOlxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgY2FzZSAndm9sdW1lY2hhbmdlJzogLy8gVXNlZCBieSBwb2x5ZmlsbHM6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdjaGFuZ2UnOlxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzpcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOiAvLyBPbmx5IGVuYWJsZUNyZWF0ZUV2ZW50SGFuZGxlQVBJOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnYmVmb3JlYmx1cic6XG4gICAgY2FzZSAnYWZ0ZXJibHVyJzogLy8gTm90IHVzZWQgYnkgUmVhY3QgYnV0IGNvdWxkIGJlIGJ5IHVzZXIgY29kZTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2JlZm9yZWlucHV0JzpcbiAgICBjYXNlICdibHVyJzpcbiAgICBjYXNlICdmdWxsc2NyZWVuY2hhbmdlJzpcbiAgICBjYXNlICdmb2N1cyc6XG4gICAgY2FzZSAnaGFzaGNoYW5nZSc6XG4gICAgY2FzZSAncG9wc3RhdGUnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnc2VsZWN0c3RhcnQnOlxuICAgICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdzY3JvbGwnOlxuICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd3aGVlbCc6IC8vIE5vdCB1c2VkIGJ5IFJlYWN0IGJ1dCBjb3VsZCBiZSBieSB1c2VyIGNvZGU6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdtb3VzZWVudGVyJzpcbiAgICBjYXNlICdtb3VzZWxlYXZlJzpcbiAgICBjYXNlICdwb2ludGVyZW50ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJsZWF2ZSc6XG4gICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG5cbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgIHtcbiAgICAgICAgLy8gV2UgbWlnaHQgYmUgaW4gdGhlIFNjaGVkdWxlciBjYWxsYmFjay5cbiAgICAgICAgLy8gRXZlbnR1YWxseSB0aGlzIG1lY2hhbmlzbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgY2hlY2tcbiAgICAgICAgLy8gb2YgdGhlIGN1cnJlbnQgcHJpb3JpdHkgb24gdGhlIG5hdGl2ZSBzY2hlZHVsZXIuXG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eSA9IGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCk7XG5cbiAgICAgICAgc3dpdGNoIChzY2hlZHVsZXJQcmlvcml0eSkge1xuICAgICAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAgICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBMb3dTY2hlZHVsZXJQcmlvcml0eSwgc29tZWhvdy4gTWF5YmUgdGhlIHNhbWUgbGFuZSBhcyBoeWRyYXRpb24uXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7XG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH0pO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7XG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG4vKipcbiAqIFRoZXNlIHZhcmlhYmxlcyBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0ZXh0IGNvbnRlbnQgb2YgYSB0YXJnZXQgbm9kZSxcbiAqIGFsbG93aW5nIGNvbXBhcmlzb24gb2YgY29udGVudCBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogSWRlbnRpZnkgdGhlIG5vZGUgd2hlcmUgc2VsZWN0aW9uIGN1cnJlbnRseSBiZWdpbnMsIHRoZW4gb2JzZXJ2ZVxuICogYm90aCBpdHMgdGV4dCBjb250ZW50IGFuZCBpdHMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgRE9NLiBTaW5jZSB0aGVcbiAqIGJyb3dzZXIgbWF5IG5hdGl2ZWx5IHJlcGxhY2UgdGhlIHRhcmdldCBub2RlIGR1cmluZyBjb21wb3NpdGlvbiwgd2UgY2FuXG4gKiB1c2UgaXRzIHBvc2l0aW9uIHRvIGZpbmQgaXRzIHJlcGxhY2VtZW50LlxuICpcbiAqXG4gKi9cbnZhciByb290ID0gbnVsbDtcbnZhciBzdGFydFRleHQgPSBudWxsO1xudmFyIGZhbGxiYWNrVGV4dCA9IG51bGw7XG5mdW5jdGlvbiBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJvb3QgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgc3RhcnRUZXh0ID0gZ2V0VGV4dCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0KCkge1xuICByb290ID0gbnVsbDtcbiAgc3RhcnRUZXh0ID0gbnVsbDtcbiAgZmFsbGJhY2tUZXh0ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldERhdGEoKSB7XG4gIGlmIChmYWxsYmFja1RleHQpIHtcbiAgICByZXR1cm4gZmFsbGJhY2tUZXh0O1xuICB9XG5cbiAgdmFyIHN0YXJ0O1xuICB2YXIgc3RhcnRWYWx1ZSA9IHN0YXJ0VGV4dDtcbiAgdmFyIHN0YXJ0TGVuZ3RoID0gc3RhcnRWYWx1ZS5sZW5ndGg7XG4gIHZhciBlbmQ7XG4gIHZhciBlbmRWYWx1ZSA9IGdldFRleHQoKTtcbiAgdmFyIGVuZExlbmd0aCA9IGVuZFZhbHVlLmxlbmd0aDtcblxuICBmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBzdGFydExlbmd0aDsgc3RhcnQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0XSAhPT0gZW5kVmFsdWVbc3RhcnRdKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgbWluRW5kID0gc3RhcnRMZW5ndGggLSBzdGFydDtcblxuICBmb3IgKGVuZCA9IDE7IGVuZCA8PSBtaW5FbmQ7IGVuZCsrKSB7XG4gICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRMZW5ndGggLSBlbmRdICE9PSBlbmRWYWx1ZVtlbmRMZW5ndGggLSBlbmRdKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgc2xpY2VUYWlsID0gZW5kID4gMSA/IDEgLSBlbmQgOiB1bmRlZmluZWQ7XG4gIGZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCBzbGljZVRhaWwpO1xuICByZXR1cm4gZmFsbGJhY2tUZXh0O1xufVxuZnVuY3Rpb24gZ2V0VGV4dCgpIHtcbiAgaWYgKCd2YWx1ZScgaW4gcm9vdCkge1xuICAgIHJldHVybiByb290LnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QudGV4dENvbnRlbnQ7XG59XG5cbi8qKlxuICogYGNoYXJDb2RlYCByZXByZXNlbnRzIHRoZSBhY3R1YWwgXCJjaGFyYWN0ZXIgY29kZVwiIGFuZCBpcyBzYWZlIHRvIHVzZSB3aXRoXG4gKiBgU3RyaW5nLmZyb21DaGFyQ29kZWAuIEFzIHN1Y2gsIG9ubHkga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gcHJpbnRhYmxlXG4gKiBjaGFyYWN0ZXJzIHByb2R1Y2UgYSB2YWxpZCBgY2hhckNvZGVgLCB0aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBFbnRlci5cbiAqIFRoZSBUYWIta2V5IGlzIGNvbnNpZGVyZWQgbm9uLXByaW50YWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBhIGBjaGFyQ29kZWAsXG4gKiBwcmVzdW1hYmx5IGJlY2F1c2UgaXQgZG9lcyBub3QgcHJvZHVjZSBhIHRhYi1jaGFyYWN0ZXIgaW4gYnJvd3NlcnMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7bnVtYmVyfSBOb3JtYWxpemVkIGBjaGFyQ29kZWAgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNoYXJDb2RlO1xuICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2ZW50LmtleUNvZGU7XG5cbiAgaWYgKCdjaGFyQ29kZScgaW4gbmF0aXZlRXZlbnQpIHtcbiAgICBjaGFyQ29kZSA9IG5hdGl2ZUV2ZW50LmNoYXJDb2RlOyAvLyBGRiBkb2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBmb3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBga2V5Q29kZWAuXG5cbiAgICBpZiAoY2hhckNvZGUgPT09IDAgJiYga2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgIGNoYXJDb2RlID0gMTM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElFOCBkb2VzIG5vdCBpbXBsZW1lbnQgYGNoYXJDb2RlYCwgYnV0IGBrZXlDb2RlYCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUuXG4gICAgY2hhckNvZGUgPSBrZXlDb2RlO1xuICB9IC8vIElFIGFuZCBFZGdlIChvbiBXaW5kb3dzKSBhbmQgQ2hyb21lIC8gU2FmYXJpIChvbiBXaW5kb3dzIGFuZCBMaW51eClcbiAgLy8gcmVwb3J0IEVudGVyIGFzIGNoYXJDb2RlIDEwIHdoZW4gY3RybCBpcyBwcmVzc2VkLlxuXG5cbiAgaWYgKGNoYXJDb2RlID09PSAxMCkge1xuICAgIGNoYXJDb2RlID0gMTM7XG4gIH0gLy8gU29tZSBub24tcHJpbnRhYmxlIGtleXMgYXJlIHJlcG9ydGVkIGluIGBjaGFyQ29kZWAvYGtleUNvZGVgLCBkaXNjYXJkIHRoZW0uXG4gIC8vIE11c3Qgbm90IGRpc2NhcmQgdGhlIChub24tKXByaW50YWJsZSBFbnRlci1rZXkuXG5cblxuICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhIGZhY3Rvcnkgc28gdGhhdCB3ZSBoYXZlIGRpZmZlcmVudCByZXR1cm5lZCBjb25zdHJ1Y3RvcnMuXG4vLyBJZiB3ZSBoYWQgYSBzaW5nbGUgY29uc3RydWN0b3IsIGl0IHdvdWxkIGJlIG1lZ2Ftb3JwaGljIGFuZCBlbmdpbmVzIHdvdWxkIGRlb3B0LlxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEludGVyZmFjZSkge1xuICAvKipcbiAgICogU3ludGhldGljIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZCBieSBldmVudCBwbHVnaW5zLCB0eXBpY2FsbHkgaW4gcmVzcG9uc2UgdG8gYVxuICAgKiB0b3AtbGV2ZWwgZXZlbnQgZGVsZWdhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBUaGVzZSBzeXN0ZW1zIHNob3VsZCBnZW5lcmFsbHkgdXNlIHBvb2xpbmcgdG8gcmVkdWNlIHRoZSBmcmVxdWVuY3kgb2YgZ2FyYmFnZVxuICAgKiBjb2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVcbiAgICogZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGludG8gdGhlIHBvb2wgYWZ0ZXIgYmVpbmcgZGlzcGF0Y2hlZC4gVXNlcnMgdGhhdFxuICAgKiBuZWVkIGEgcGVyc2lzdGVkIGV2ZW50IHNob3VsZCBpbnZva2UgYHBlcnNpc3RgLlxuICAgKlxuICAgKiBTeW50aGV0aWMgZXZlbnRzIChhbmQgc3ViY2xhc3NlcykgaW1wbGVtZW50IHRoZSBET00gTGV2ZWwgMyBFdmVudHMgQVBJIGJ5XG4gICAqIG5vcm1hbGl6aW5nIGJyb3dzZXIgcXVpcmtzLiBTdWJjbGFzc2VzIGRvIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRvIGltcGxlbWVudCBhXG4gICAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy5cbiAgICovXG4gIGZ1bmN0aW9uIFN5bnRoZXRpY0Jhc2VFdmVudChyZWFjdE5hbWUsIHJlYWN0RXZlbnRUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB0aGlzLl9yZWFjdE5hbWUgPSByZWFjdE5hbWU7XG4gICAgdGhpcy5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7XG4gICAgdGhpcy50eXBlID0gcmVhY3RFdmVudFR5cGU7XG4gICAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgIHRoaXMudGFyZ2V0ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcblxuICAgIGZvciAodmFyIF9wcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHtcbiAgICAgIGlmICghSW50ZXJmYWNlLmhhc093blByb3BlcnR5KF9wcm9wTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBub3JtYWxpemUgPSBJbnRlcmZhY2VbX3Byb3BOYW1lXTtcblxuICAgICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgICB0aGlzW19wcm9wTmFtZV0gPSBub3JtYWxpemUobmF0aXZlRXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbmF0aXZlRXZlbnRbX3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgIT0gbnVsbCA/IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgOiBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZSA9PT0gZmFsc2U7XG5cbiAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFzc2lnbihTeW50aGV0aWNCYXNlRXZlbnQucHJvdG90eXBlLCB7XG4gICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vICRGbG93Rml4TWUgLSBmbG93IGlzIG5vdCBhd2FyZSBvZiBgdW5rbm93bmAgaW4gSUVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LnJldHVyblZhbHVlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9LFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcblxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vICRGbG93Rml4TWUgLSBmbG93IGlzIG5vdCBhd2FyZSBvZiBgdW5rbm93bmAgaW4gSUVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAgIC8vIFRoZSBDaGFuZ2VFdmVudFBsdWdpbiByZWdpc3RlcnMgYSBcInByb3BlcnR5Y2hhbmdlXCIgZXZlbnQgZm9yXG4gICAgICAgIC8vIElFLiBUaGlzIGV2ZW50IGRvZXMgbm90IHN1cHBvcnQgYnViYmxpbmcgb3IgY2FuY2VsbGluZywgYW5kXG4gICAgICAgIC8vIGFueSByZWZlcmVuY2VzIHRvIGNhbmNlbEJ1YmJsZSB0aHJvdyBcIk1lbWJlciBub3QgZm91bmRcIi4gIEFcbiAgICAgICAgLy8gdHlwZW9mIGNoZWNrIG9mIFwidW5rbm93blwiIGNpcmN1bXZlbnRzIHRoaXMgaXNzdWUgKGFuZCBpcyBhbHNvXG4gICAgICAgIC8vIElFIHNwZWNpZmljKS5cbiAgICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXZSByZWxlYXNlIGFsbCBkaXNwYXRjaGVkIGBTeW50aGV0aWNFdmVudGBzIGFmdGVyIGVhY2ggZXZlbnQgbG9vcCwgYWRkaW5nXG4gICAgICogdGhlbSBiYWNrIGludG8gdGhlIHBvb2wuIFRoaXMgYWxsb3dzIGEgd2F5IHRvIGhvbGQgb250byBhIHJlZmVyZW5jZSB0aGF0XG4gICAgICogd29uJ3QgYmUgYWRkZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgICAqL1xuICAgIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHsvLyBNb2Rlcm4gZXZlbnQgc3lzdGVtIGRvZXNuJ3QgdXNlIHBvb2xpbmcuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzUGVyc2lzdGVudDogZnVuY3Rpb25UaGF0UmV0dXJuc1RydWVcbiAgfSk7XG4gIHJldHVybiBTeW50aGV0aWNCYXNlRXZlbnQ7XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIEV2ZW50SW50ZXJmYWNlID0ge1xuICBldmVudFBoYXNlOiAwLFxuICBidWJibGVzOiAwLFxuICBjYW5jZWxhYmxlOiAwLFxuICB0aW1lU3RhbXA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBldmVudC50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcbiAgfSxcbiAgZGVmYXVsdFByZXZlbnRlZDogMCxcbiAgaXNUcnVzdGVkOiAwXG59O1xudmFyIFN5bnRoZXRpY0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgVUlFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgdmlldzogMCxcbiAgZGV0YWlsOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChVSUV2ZW50SW50ZXJmYWNlKTtcbnZhciBsYXN0TW92ZW1lbnRYO1xudmFyIGxhc3RNb3ZlbWVudFk7XG52YXIgbGFzdE1vdXNlRXZlbnQ7XG5cbmZ1bmN0aW9uIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKGV2ZW50KSB7XG4gIGlmIChldmVudCAhPT0gbGFzdE1vdXNlRXZlbnQpIHtcbiAgICBpZiAobGFzdE1vdXNlRXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScpIHtcbiAgICAgIGxhc3RNb3ZlbWVudFggPSBldmVudC5zY3JlZW5YIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSBldmVudC5zY3JlZW5ZIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IDA7XG4gICAgICBsYXN0TW92ZW1lbnRZID0gMDtcbiAgICB9XG5cbiAgICBsYXN0TW91c2VFdmVudCA9IGV2ZW50O1xuICB9XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgTW91c2VFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgTW91c2VFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBzY3JlZW5YOiAwLFxuICBzY3JlZW5ZOiAwLFxuICBjbGllbnRYOiAwLFxuICBjbGllbnRZOiAwLFxuICBwYWdlWDogMCxcbiAgcGFnZVk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiAwLFxuICBidXR0b25zOiAwLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgfSxcbiAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WCcgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgfVxuXG4gICAgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpO1xuICAgIHJldHVybiBsYXN0TW92ZW1lbnRYO1xuICB9LFxuICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRZJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WTtcbiAgICB9IC8vIERvbid0IG5lZWQgdG8gY2FsbCB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZSgpIGhlcmVcbiAgICAvLyBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBoYXZlIGFscmVhZHkgcnVuIHdoZW4gbW92ZW1lbnRYXG4gICAgLy8gd2FzIGNvcGllZC5cblxuXG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFk7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KE1vdXNlRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIERyYWdFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBkYXRhVHJhbnNmZXI6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRHJhZ0V2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBGb2N1c0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgRm9jdXNFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICByZWxhdGVkVGFyZ2V0OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0ZvY3VzRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChGb2N1c0V2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWFuaW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQW5pbWF0aW9uRXZlbnRcbiAqL1xuXG52YXIgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGFuaW1hdGlvbk5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG5cbnZhciBDbGlwYm9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgY2xpcGJvYXJkRGF0YTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdjbGlwYm9hcmREYXRhJyBpbiBldmVudCA/IGV2ZW50LmNsaXBib2FyZERhdGEgOiB3aW5kb3cuY2xpcGJvYXJkRGF0YTtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNDbGlwYm9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENsaXBib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1jb21wb3NpdGlvbmV2ZW50c1xuICovXG5cbnZhciBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBkYXRhOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNVxuICogICAgICAvI2V2ZW50cy1pbnB1dGV2ZW50c1xuICovXG4vLyBIYXBwZW5zIHRvIHNoYXJlIHRoZSBzYW1lIGxpc3QgZm9yIG5vdy5cblxudmFyIFN5bnRoZXRpY0lucHV0RXZlbnQgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50O1xuLyoqXG4gKiBOb3JtYWxpemF0aW9uIG9mIGRlcHJlY2F0ZWQgSFRNTDUgYGtleWAgdmFsdWVzXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG5cbnZhciBub3JtYWxpemVLZXkgPSB7XG4gIEVzYzogJ0VzY2FwZScsXG4gIFNwYWNlYmFyOiAnICcsXG4gIExlZnQ6ICdBcnJvd0xlZnQnLFxuICBVcDogJ0Fycm93VXAnLFxuICBSaWdodDogJ0Fycm93UmlnaHQnLFxuICBEb3duOiAnQXJyb3dEb3duJyxcbiAgRGVsOiAnRGVsZXRlJyxcbiAgV2luOiAnT1MnLFxuICBNZW51OiAnQ29udGV4dE1lbnUnLFxuICBBcHBzOiAnQ29udGV4dE1lbnUnLFxuICBTY3JvbGw6ICdTY3JvbGxMb2NrJyxcbiAgTW96UHJpbnRhYmxlS2V5OiAnVW5pZGVudGlmaWVkJ1xufTtcbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBsZWdhY3kgYGtleUNvZGVgIHRvIEhUTUw1IGBrZXlgXG4gKiBPbmx5IHNwZWNpYWwga2V5cyBzdXBwb3J0ZWQsIGFsbCBvdGhlcnMgZGVwZW5kIG9uIGtleWJvYXJkIGxheW91dCBvciBicm93c2VyXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG5cbnZhciB0cmFuc2xhdGVUb0tleSA9IHtcbiAgJzgnOiAnQmFja3NwYWNlJyxcbiAgJzknOiAnVGFiJyxcbiAgJzEyJzogJ0NsZWFyJyxcbiAgJzEzJzogJ0VudGVyJyxcbiAgJzE2JzogJ1NoaWZ0JyxcbiAgJzE3JzogJ0NvbnRyb2wnLFxuICAnMTgnOiAnQWx0JyxcbiAgJzE5JzogJ1BhdXNlJyxcbiAgJzIwJzogJ0NhcHNMb2NrJyxcbiAgJzI3JzogJ0VzY2FwZScsXG4gICczMic6ICcgJyxcbiAgJzMzJzogJ1BhZ2VVcCcsXG4gICczNCc6ICdQYWdlRG93bicsXG4gICczNSc6ICdFbmQnLFxuICAnMzYnOiAnSG9tZScsXG4gICczNyc6ICdBcnJvd0xlZnQnLFxuICAnMzgnOiAnQXJyb3dVcCcsXG4gICczOSc6ICdBcnJvd1JpZ2h0JyxcbiAgJzQwJzogJ0Fycm93RG93bicsXG4gICc0NSc6ICdJbnNlcnQnLFxuICAnNDYnOiAnRGVsZXRlJyxcbiAgJzExMic6ICdGMScsXG4gICcxMTMnOiAnRjInLFxuICAnMTE0JzogJ0YzJyxcbiAgJzExNSc6ICdGNCcsXG4gICcxMTYnOiAnRjUnLFxuICAnMTE3JzogJ0Y2JyxcbiAgJzExOCc6ICdGNycsXG4gICcxMTknOiAnRjgnLFxuICAnMTIwJzogJ0Y5JyxcbiAgJzEyMSc6ICdGMTAnLFxuICAnMTIyJzogJ0YxMScsXG4gICcxMjMnOiAnRjEyJyxcbiAgJzE0NCc6ICdOdW1Mb2NrJyxcbiAgJzE0NSc6ICdTY3JvbGxMb2NrJyxcbiAgJzIyNCc6ICdNZXRhJ1xufTtcbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIGBrZXlgIHByb3BlcnR5LlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50S2V5KG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5rZXkpIHtcbiAgICAvLyBOb3JtYWxpemUgaW5jb25zaXN0ZW50IHZhbHVlcyByZXBvcnRlZCBieSBicm93c2VycyBkdWUgdG9cbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYSB3b3JraW5nIGRyYWZ0IHNwZWNpZmljYXRpb24uXG4gICAgLy8gRmlyZUZveCBpbXBsZW1lbnRzIGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQcmludGFibGVLZXlgIGZvciBhbGxcbiAgICAvLyBwcmludGFibGUgY2hhcmFjdGVycyAobm9ybWFsaXplZCB0byBgVW5pZGVudGlmaWVkYCksIGlnbm9yZSBpdC5cbiAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZlRXZlbnQua2V5O1xuXG4gICAgaWYgKGtleSAhPT0gJ1VuaWRlbnRpZmllZCcpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9IC8vIEJyb3dzZXIgZG9lcyBub3QgaW1wbGVtZW50IGBrZXlgLCBwb2x5ZmlsbCBhcyBtdWNoIG9mIGl0IGFzIHdlIGNhbi5cblxuXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgdmFyIGNoYXJDb2RlID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCk7IC8vIFRoZSBlbnRlci1rZXkgaXMgdGVjaG5pY2FsbHkgYm90aCBwcmludGFibGUgYW5kIG5vbi1wcmludGFibGUgYW5kIGNhblxuICAgIC8vIHRodXMgYmUgY2FwdHVyZWQgYnkgYGtleXByZXNzYCwgbm8gb3RoZXIgbm9uLXByaW50YWJsZSBrZXkgc2hvdWxkLlxuXG4gICAgcmV0dXJuIGNoYXJDb2RlID09PSAxMyA/ICdFbnRlcicgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgfVxuXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5ZG93bicgfHwgbmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgIC8vIFdoaWxlIHVzZXIga2V5Ym9hcmQgbGF5b3V0IGRldGVybWluZXMgdGhlIGFjdHVhbCBtZWFuaW5nIG9mIGVhY2hcbiAgICAvLyBga2V5Q29kZWAgdmFsdWUsIGFsbW9zdCBhbGwgZnVuY3Rpb24ga2V5cyBoYXZlIGEgdW5pdmVyc2FsIHZhbHVlLlxuICAgIHJldHVybiB0cmFuc2xhdGVUb0tleVtuYXRpdmVFdmVudC5rZXlDb2RlXSB8fCAnVW5pZGVudGlmaWVkJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBtb2RpZmllciBrZXkgdG8gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgaW4gdGhlIGV2ZW50LlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleXMtTW9kaWZpZXJzXG4gKi9cblxuXG52YXIgbW9kaWZpZXJLZXlUb1Byb3AgPSB7XG4gIEFsdDogJ2FsdEtleScsXG4gIENvbnRyb2w6ICdjdHJsS2V5JyxcbiAgTWV0YTogJ21ldGFLZXknLFxuICBTaGlmdDogJ3NoaWZ0S2V5J1xufTsgLy8gT2xkZXIgYnJvd3NlcnMgKFNhZmFyaSA8PSAxMCwgaU9TIFNhZmFyaSA8PSAxMC4yKSBkbyBub3Qgc3VwcG9ydFxuLy8gZ2V0TW9kaWZpZXJTdGF0ZS4gSWYgZ2V0TW9kaWZpZXJTdGF0ZSBpcyBub3Qgc3VwcG9ydGVkLCB3ZSBtYXAgaXQgdG8gYSBzZXQgb2Zcbi8vIG1vZGlmaWVyIGtleXMgZXhwb3NlZCBieSB0aGUgZXZlbnQuIEluIHRoaXMgY2FzZSwgTG9jay1rZXlzIGFyZSBub3Qgc3VwcG9ydGVkLlxuXG5mdW5jdGlvbiBtb2RpZmllclN0YXRlR2V0dGVyKGtleUFyZykge1xuICB2YXIgc3ludGhldGljRXZlbnQgPSB0aGlzO1xuICB2YXIgbmF0aXZlRXZlbnQgPSBzeW50aGV0aWNFdmVudC5uYXRpdmVFdmVudDtcblxuICBpZiAobmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZSkge1xuICAgIHJldHVybiBuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKGtleUFyZyk7XG4gIH1cblxuICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107XG4gIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgS2V5Ym9hcmRFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgS2V5Ym9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBjb2RlOiAwLFxuICBsb2NhdGlvbjogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgcmVwZWF0OiAwLFxuICBsb2NhbGU6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJyb3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG4gICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBBc3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gcHJvdmlkZXMgYSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJzLlxuICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBQb2ludGVyRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy9cbiAqL1xuXG52YXIgUG9pbnRlckV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIHBvaW50ZXJJZDogMCxcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgcHJlc3N1cmU6IDAsXG4gIHRhbmdlbnRpYWxQcmVzc3VyZTogMCxcbiAgdGlsdFg6IDAsXG4gIHRpbHRZOiAwLFxuICB0d2lzdDogMCxcbiAgcG9pbnRlclR5cGU6IDAsXG4gIGlzUHJpbWFyeTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNQb2ludGVyRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChQb2ludGVyRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFRvdWNoRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvdG91Y2gtZXZlbnRzL1xuICovXG5cbnZhciBUb3VjaEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHRvdWNoZXM6IDAsXG4gIHRhcmdldFRvdWNoZXM6IDAsXG4gIGNoYW5nZWRUb3VjaGVzOiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGVcbn0pO1xuXG52YXIgU3ludGhldGljVG91Y2hFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRvdWNoRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtY3NzMy10cmFuc2l0aW9ucy0yMDA5MDMyMC8jdHJhbnNpdGlvbi1ldmVudHMtXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UcmFuc2l0aW9uRXZlbnRcbiAqL1xuXG52YXIgVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBwcm9wZXJ0eU5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVhgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAocmlnaHQgaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWCcgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVggOiAwO1xuICB9LFxuICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWWAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVknIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFgIGZvciBJRTw5IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhIDogMDtcbiAgfSxcbiAgZGVsdGFaOiAwLFxuICAvLyBCcm93c2VycyB3aXRob3V0IFwiZGVsdGFNb2RlXCIgaXMgcmVwb3J0aW5nIGluIHJhdyB3aGVlbCBkZWx0YSB3aGVyZSBvbmVcbiAgLy8gbm90Y2ggb24gdGhlIHNjcm9sbCBpcyBhbHdheXMgKy8tIDEyMCwgcm91Z2hseSBlcXVpdmFsZW50IHRvIHBpeGVscy5cbiAgLy8gQSBnb29kIGFwcHJveGltYXRpb24gb2YgRE9NX0RFTFRBX0xJTkUgKDEpIGlzIDUlIG9mIHZpZXdwb3J0IHNpemUgb3JcbiAgLy8gfjQwIHBpeGVscywgZm9yIERPTV9ERUxUQV9TQ1JFRU4gKDIpIGl0IGlzIDg3LjUlIG9mIHZpZXdwb3J0IHNpemUuXG4gIGRlbHRhTW9kZTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNXaGVlbEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoV2hlZWxFdmVudEludGVyZmFjZSk7XG5cbnZhciBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl07IC8vIFRhYiwgUmV0dXJuLCBFc2MsIFNwYWNlXG5cbnZhciBTVEFSVF9LRVlDT0RFID0gMjI5O1xudmFyIGNhblVzZUNvbXBvc2l0aW9uRXZlbnQgPSBjYW5Vc2VET00gJiYgJ0NvbXBvc2l0aW9uRXZlbnQnIGluIHdpbmRvdztcbnZhciBkb2N1bWVudE1vZGUgPSBudWxsO1xuXG5pZiAoY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50KSB7XG4gIGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZTtcbn0gLy8gV2Via2l0IG9mZmVycyBhIHZlcnkgdXNlZnVsIGB0ZXh0SW5wdXRgIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgdG9cbi8vIGRpcmVjdGx5IHJlcHJlc2VudCBgYmVmb3JlSW5wdXRgLiBUaGUgSUUgYHRleHRpbnB1dGAgZXZlbnQgaXMgbm90IGFzXG4vLyB1c2VmdWwsIHNvIHdlIGRvbid0IHVzZSBpdC5cblxuXG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBjYW5Vc2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGU7IC8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkXG4vLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljXG4vLyBzcGFjZXMsIGZvciBpbnN0YW5jZSAoXFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuXG5cbnZhciB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9IGNhblVzZURPTSAmJiAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHwgZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50TW9kZSA+IDggJiYgZG9jdW1lbnRNb2RlIDw9IDExKTtcbnZhciBTUEFDRUJBUl9DT0RFID0gMzI7XG52YXIgU1BBQ0VCQVJfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoU1BBQ0VCQVJfQ09ERSk7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQmVmb3JlSW5wdXQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2tleXByZXNzJywgJ3RleHRJbnB1dCcsICdwYXN0ZSddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uRW5kJywgWydjb21wb3NpdGlvbmVuZCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uU3RhcnQnLCBbJ2NvbXBvc2l0aW9uc3RhcnQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblVwZGF0ZScsIFsnY29tcG9zaXRpb251cGRhdGUnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG59IC8vIFRyYWNrIHdoZXRoZXIgd2UndmUgZXZlciBoYW5kbGVkIGEga2V5cHJlc3Mgb24gdGhlIHNwYWNlIGtleS5cblxuXG52YXIgaGFzU3BhY2VLZXlwcmVzcyA9IGZhbHNlO1xuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhIG5hdGl2ZSBrZXlwcmVzcyBldmVudCBpcyBhc3N1bWVkIHRvIGJlIGEgY29tbWFuZC5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBGaXJlZm94IGZpcmVzIGBrZXlwcmVzc2AgZXZlbnRzIGZvciBrZXkgY29tbWFuZHNcbiAqIChjdXQsIGNvcHksIHNlbGVjdC1hbGwsIGV0Yy4pIGV2ZW4gdGhvdWdoIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZC5cbiAqL1xuXG5mdW5jdGlvbiBpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkge1xuICByZXR1cm4gKG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHwgbmF0aXZlRXZlbnQuYWx0S2V5IHx8IG5hdGl2ZUV2ZW50Lm1ldGFLZXkpICYmIC8vIGN0cmxLZXkgJiYgYWx0S2V5IGlzIGVxdWl2YWxlbnQgdG8gQWx0R3IsIGFuZCBpcyBub3QgYSBjb21tYW5kLlxuICAhKG5hdGl2ZUV2ZW50LmN0cmxLZXkgJiYgbmF0aXZlRXZlbnQuYWx0S2V5KTtcbn1cbi8qKlxuICogVHJhbnNsYXRlIG5hdGl2ZSB0b3AgbGV2ZWwgZXZlbnRzIGludG8gZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvblN0YXJ0JztcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvbkVuZCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbnVwZGF0ZSc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25VcGRhdGUnO1xuICB9XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIGJlc3QtZ3Vlc3MgbW9kZWwgdGhpbmsgdGhpcyBldmVudCBzaWduaWZpZXMgdGhhdFxuICogY29tcG9zaXRpb24gaGFzIGJlZ3VuP1xuICovXG5cblxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4gZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicgJiYgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERTtcbn1cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgbW9kZSB0aGluayB0aGF0IHRoaXMgZXZlbnQgaXMgdGhlIGVuZCBvZiBjb21wb3NpdGlvbj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgLy8gQ29tbWFuZCBrZXlzIGluc2VydCBvciBjbGVhciBJTUUgaW5wdXQuXG4gICAgICByZXR1cm4gRU5EX0tFWUNPREVTLmluZGV4T2YobmF0aXZlRXZlbnQua2V5Q29kZSkgIT09IC0xO1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgICAvLyBFeHBlY3QgSU1FIGtleUNvZGUgb24gZWFjaCBrZXlkb3duLiBJZiB3ZSBnZXQgYW55IG90aGVyXG4gICAgICAvLyBjb2RlIHdlIG11c3QgaGF2ZSBleGl0ZWQgZWFybGllci5cbiAgICAgIHJldHVybiBuYXRpdmVFdmVudC5rZXlDb2RlICE9PSBTVEFSVF9LRVlDT0RFO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgLy8gRXZlbnRzIGFyZSBub3QgcG9zc2libGUgd2l0aG91dCBjYW5jZWxsaW5nIElNRS5cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBHb29nbGUgSW5wdXQgVG9vbHMgcHJvdmlkZXMgY29tcG9zaXRpb24gZGF0YSB2aWEgYSBDdXN0b21FdmVudCxcbiAqIHdpdGggdGhlIGBkYXRhYCBwcm9wZXJ0eSBwb3B1bGF0ZWQgaW4gdGhlIGBkZXRhaWxgIG9iamVjdC4gSWYgdGhpc1xuICogaXMgYXZhaWxhYmxlIG9uIHRoZSBldmVudCBvYmplY3QsIHVzZSBpdC4gSWYgbm90LCB0aGlzIGlzIGEgcGxhaW5cbiAqIGNvbXBvc2l0aW9uIGV2ZW50IGFuZCB3ZSBoYXZlIG5vdGhpbmcgc3BlY2lhbCB0byBleHRyYWN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7P3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRldGFpbCA9IG5hdGl2ZUV2ZW50LmRldGFpbDtcblxuICBpZiAodHlwZW9mIGRldGFpbCA9PT0gJ29iamVjdCcgJiYgJ2RhdGEnIGluIGRldGFpbCkge1xuICAgIHJldHVybiBkZXRhaWwuZGF0YTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBDaGVjayBpZiBhIGNvbXBvc2l0aW9uIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgS29yZWFuIElNRS5cbiAqIE91ciBmYWxsYmFjayBtb2RlIGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIElFJ3MgS29yZWFuIElNRSxcbiAqIHNvIGp1c3QgdXNlIG5hdGl2ZSBjb21wb3NpdGlvbiBldmVudHMgd2hlbiBLb3JlYW4gSU1FIGlzIHVzZWQuXG4gKiBBbHRob3VnaCBDb21wb3NpdGlvbkV2ZW50LmxvY2FsZSBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLFxuICogaXQgaXMgYXZhaWxhYmxlIGluIElFLCB3aGVyZSBvdXIgZmFsbGJhY2sgbW9kZSBpcyBlbmFibGVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG5hdGl2ZUV2ZW50LmxvY2FsZSA9PT0gJ2tvJztcbn0gLy8gVHJhY2sgdGhlIGN1cnJlbnQgSU1FIGNvbXBvc2l0aW9uIHN0YXR1cywgaWYgYW55LlxuXG5cbnZhciBpc0NvbXBvc2luZyA9IGZhbHNlO1xuLyoqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuXG4gKi9cblxuZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGV2ZW50VHlwZTtcbiAgdmFyIGZhbGxiYWNrRGF0YTtcblxuICBpZiAoY2FuVXNlQ29tcG9zaXRpb25FdmVudCkge1xuICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSk7XG4gIH0gZWxzZSBpZiAoIWlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvblN0YXJ0JztcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25FbmQnO1xuICB9XG5cbiAgaWYgKCFldmVudFR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkpIHtcbiAgICAvLyBUaGUgY3VycmVudCBjb21wb3NpdGlvbiBpcyBzdG9yZWQgc3RhdGljYWxseSBhbmQgbXVzdCBub3QgYmVcbiAgICAvLyBvdmVyd3JpdHRlbiB3aGlsZSBjb21wb3NpdGlvbiBjb250aW51ZXMuXG4gICAgaWYgKCFpc0NvbXBvc2luZyAmJiBldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uU3RhcnQnKSB7XG4gICAgICBpc0NvbXBvc2luZyA9IGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvbkVuZCcpIHtcbiAgICAgIGlmIChpc0NvbXBvc2luZykge1xuICAgICAgICBmYWxsYmFja0RhdGEgPSBnZXREYXRhKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCBldmVudFR5cGUpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50KGV2ZW50VHlwZSwgZG9tRXZlbnROYW1lLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuXG4gICAgaWYgKGZhbGxiYWNrRGF0YSkge1xuICAgICAgLy8gSW5qZWN0IGRhdGEgZ2VuZXJhdGVkIGZyb20gZmFsbGJhY2sgcGF0aCBpbnRvIHRoZSBzeW50aGV0aWMgZXZlbnQuXG4gICAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIHByb3BlcnR5IG9mIG5hdGl2ZSBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlLlxuICAgICAgZXZlbnQuZGF0YSA9IGZhbGxiYWNrRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGN1c3RvbURhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcblxuICAgICAgaWYgKGN1c3RvbURhdGEgIT09IG51bGwpIHtcbiAgICAgICAgZXZlbnQuZGF0YSA9IGN1c3RvbURhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogSWYgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50cyBhcmUgYXZhaWxhYmxlLCBvdXIgZ29hbCBpcyB0byBtYWtlXG4gICAgICAgKiB1c2Ugb2YgdGhlbS4gSG93ZXZlciwgdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2U6IHRoZSBzcGFjZWJhciBrZXkuXG4gICAgICAgKiBJbiBXZWJraXQsIHByZXZlbnRpbmcgZGVmYXVsdCBvbiBhIHNwYWNlYmFyIGB0ZXh0SW5wdXRgIGV2ZW50XG4gICAgICAgKiBjYW5jZWxzIGNoYXJhY3RlciBpbnNlcnRpb24sIGJ1dCBpdCAqYWxzbyogY2F1c2VzIHRoZSBicm93c2VyXG4gICAgICAgKiB0byBmYWxsIGJhY2sgdG8gaXRzIGRlZmF1bHQgc3BhY2ViYXIgYmVoYXZpb3Igb2Ygc2Nyb2xsaW5nIHRoZVxuICAgICAgICogcGFnZS5cbiAgICAgICAqXG4gICAgICAgKiBUcmFja2luZyBhdDpcbiAgICAgICAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNTUxMDNcbiAgICAgICAqXG4gICAgICAgKiBUbyBhdm9pZCB0aGlzIGlzc3VlLCB1c2UgdGhlIGtleXByZXNzIGV2ZW50IGFzIGlmIG5vIGB0ZXh0SW5wdXRgXG4gICAgICAgKiBldmVudCBpcyBhdmFpbGFibGUuXG4gICAgICAgKi9cbiAgICAgIHZhciB3aGljaCA9IG5hdGl2ZUV2ZW50LndoaWNoO1xuXG4gICAgICBpZiAod2hpY2ggIT09IFNQQUNFQkFSX0NPREUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSB0cnVlO1xuICAgICAgcmV0dXJuIFNQQUNFQkFSX0NIQVI7XG5cbiAgICBjYXNlICd0ZXh0SW5wdXQnOlxuICAgICAgLy8gUmVjb3JkIHRoZSBjaGFyYWN0ZXJzIHRvIGJlIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICB2YXIgY2hhcnMgPSBuYXRpdmVFdmVudC5kYXRhOyAvLyBJZiBpdCdzIGEgc3BhY2ViYXIgY2hhcmFjdGVyLCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZFxuICAgICAgLy8gaXQgYXQgdGhlIGtleXByZXNzIGxldmVsIGFuZCBiYWlsIGltbWVkaWF0ZWx5LiBBbmRyb2lkIENocm9tZVxuICAgICAgLy8gZG9lc24ndCBnaXZlIHVzIGtleWNvZGVzLCBzbyB3ZSBuZWVkIHRvIGlnbm9yZSBpdC5cblxuICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJBUl9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFycztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBGb3Igb3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlIGB0ZXh0SW5wdXRgIGV2ZW50LCBleHRyYWN0IHRoZVxuICogYXBwcm9wcmlhdGUgc3RyaW5nIHRvIHVzZSBmb3IgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgY29tcG9zaW5nIChJTUUpIGFuZCB1c2luZyBhIGZhbGxiYWNrIHRvIGRvIHNvLFxuICAvLyB0cnkgdG8gZXh0cmFjdCB0aGUgY29tcG9zZWQgY2hhcmFjdGVycyBmcm9tIHRoZSBmYWxsYmFjayBvYmplY3QuXG4gIC8vIElmIGNvbXBvc2l0aW9uIGV2ZW50IGlzIGF2YWlsYWJsZSwgd2UgZXh0cmFjdCBhIHN0cmluZyBvbmx5IGF0XG4gIC8vIGNvbXBvc2l0aW9uZXZlbnQsIG90aGVyd2lzZSBleHRyYWN0IGl0IGF0IGZhbGxiYWNrIGV2ZW50cy5cbiAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NvbXBvc2l0aW9uZW5kJyB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIHZhciBjaGFycyA9IGdldERhdGEoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICBpc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGNoYXJzO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgICAvLyBJZiBhIHBhc3RlIGV2ZW50IG9jY3VycyBhZnRlciBhIGtleXByZXNzLCB0aHJvdyBvdXQgdGhlIGlucHV0XG4gICAgICAvLyBjaGFycy4gUGFzdGUgZXZlbnRzIHNob3VsZCBub3QgbGVhZCB0byBCZWZvcmVJbnB1dCBldmVudHMuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogQXMgb2YgdjI3LCBGaXJlZm94IG1heSBmaXJlIGtleXByZXNzIGV2ZW50cyBldmVuIHdoZW4gbm8gY2hhcmFjdGVyXG4gICAgICAgKiB3aWxsIGJlIGluc2VydGVkLiBBIGZldyBwb3NzaWJpbGl0aWVzOlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyBgMGAuIEFycm93IGtleXMsIEVzYyBrZXksIGV0Yy5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBubyBjaGFyIGlzIGF2YWlsYWJsZS5cbiAgICAgICAqICAgRXg6ICdBbHRHciArIGRgIGluIFBvbGlzaC4gVGhlcmUgaXMgbm8gbW9kaWZpZWQgY2hhcmFjdGVyIGZvclxuICAgICAgICogICB0aGlzIGtleSBjb21iaW5hdGlvbiBhbmQgbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gdGhlXG4gICAgICAgKiAgIGRvY3VtZW50LCBidXQgRkYgZmlyZXMgdGhlIGtleXByZXNzIGZvciBjaGFyIGNvZGUgYDEwMGAgYW55d2F5LlxuICAgICAgICogICBObyBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgYSBjb21tYW5kIGNvbWJpbmF0aW9uIGlzXG4gICAgICAgKiAgIGJlaW5nIHVzZWQuIEV4OiBgQ21kK0NgLiBObyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQsIGFuZCBub1xuICAgICAgICogICBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKi9cbiAgICAgIGlmICghaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIC8vIElFIGZpcmVzIHRoZSBga2V5cHJlc3NgIGV2ZW50IHdoZW4gYSB1c2VyIHR5cGVzIGFuIGVtb2ppIHZpYVxuICAgICAgICAvLyBUb3VjaCBrZXlib2FyZCBvZiBXaW5kb3dzLiAgSW4gc3VjaCBhIGNhc2UsIHRoZSBgY2hhcmAgcHJvcGVydHlcbiAgICAgICAgLy8gaG9sZHMgYW4gZW1vamkgY2hhcmFjdGVyIGxpa2UgYFxcdUQ4M0RcXHVERTBBYC4gIEJlY2F1c2UgaXRzIGxlbmd0aFxuICAgICAgICAvLyBpcyAyLCB0aGUgcHJvcGVydHkgYHdoaWNoYCBkb2VzIG5vdCByZXByZXNlbnQgYW4gZW1vamkgY29ycmVjdGx5LlxuICAgICAgICAvLyBJbiBzdWNoIGEgY2FzZSwgd2UgZGlyZWN0bHkgcmV0dXJuIHRoZSBgY2hhcmAgcHJvcGVydHkgaW5zdGVhZCBvZlxuICAgICAgICAvLyB1c2luZyBgd2hpY2hgLlxuICAgICAgICBpZiAobmF0aXZlRXZlbnQuY2hhciAmJiBuYXRpdmVFdmVudC5jaGFyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICByZXR1cm4gbmF0aXZlRXZlbnQuY2hhcjtcbiAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVFdmVudC53aGljaCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkgPyBudWxsIDogbmF0aXZlRXZlbnQuZGF0YTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBFeHRyYWN0IGEgU3ludGhldGljSW5wdXRFdmVudCBmb3IgYGJlZm9yZUlucHV0YCwgYmFzZWQgb24gZWl0aGVyIG5hdGl2ZVxuICogYHRleHRJbnB1dGAgb3IgZmFsbGJhY2sgYmVoYXZpb3IuXG4gKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGNoYXJzO1xuXG4gIGlmIChjYW5Vc2VUZXh0SW5wdXRFdmVudCkge1xuICAgIGNoYXJzID0gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBjaGFycyA9IGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSAvLyBJZiBubyBjaGFyYWN0ZXJzIGFyZSBiZWluZyBpbnNlcnRlZCwgbm8gQmVmb3JlSW5wdXQgZXZlbnQgc2hvdWxkXG4gIC8vIGJlIGZpcmVkLlxuXG5cbiAgaWYgKCFjaGFycykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCAnb25CZWZvcmVJbnB1dCcpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNJbnB1dEV2ZW50KCdvbkJlZm9yZUlucHV0JywgJ2JlZm9yZWlucHV0JywgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgICBldmVudC5kYXRhID0gY2hhcnM7XG4gIH1cbn1cbi8qKlxuICogQ3JlYXRlIGFuIGBvbkJlZm9yZUlucHV0YCBldmVudCB0byBtYXRjaFxuICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50cy1pbnB1dGV2ZW50cy5cbiAqXG4gKiBUaGlzIGV2ZW50IHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50XG4gKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmksIE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXJcbiAqIGBvbktleVByZXNzYCBhbmQgYG9uQ29tcG9zaXRpb25FbmRgLCBidXQgYmVmb3JlIGBvbklucHV0YC5cbiAqXG4gKiBgYmVmb3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2VycywgYW5kXG4gKiB0aGUgYGlucHV0YCBldmVudCBkb2VzIG5vdCBwcm92aWRlIGFueSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBoYXNcbiAqIGFjdHVhbGx5IGJlZW4gYWRkZWQsIGNvbnRyYXJ5IHRvIHRoZSBzcGVjLiBUaHVzLCBgdGV4dElucHV0YCBpcyB0aGUgYmVzdFxuICogYXZhaWxhYmxlIGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGluc2VydGVkXG4gKiBpbnRvIHRoZSB0YXJnZXQgbm9kZS5cbiAqXG4gKiBUaGlzIHBsdWdpbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1c1xuICogYWxsb3dpbmcgdXMgdG8gc2hhcmUgY29tcG9zaXRpb24gZmFsbGJhY2sgY29kZSBmb3IgYm90aCBgYmVmb3JlSW5wdXRgIGFuZFxuICogYGNvbXBvc2l0aW9uYCBldmVudCB0eXBlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3RoZS1pbnB1dC1lbGVtZW50Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnlcbiAqL1xudmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7XG4gIGNvbG9yOiB0cnVlLFxuICBkYXRlOiB0cnVlLFxuICBkYXRldGltZTogdHJ1ZSxcbiAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSxcbiAgZW1haWw6IHRydWUsXG4gIG1vbnRoOiB0cnVlLFxuICBudW1iZXI6IHRydWUsXG4gIHBhc3N3b3JkOiB0cnVlLFxuICByYW5nZTogdHJ1ZSxcbiAgc2VhcmNoOiB0cnVlLFxuICB0ZWw6IHRydWUsXG4gIHRleHQ6IHRydWUsXG4gIHRpbWU6IHRydWUsXG4gIHVybDogdHJ1ZSxcbiAgd2VlazogdHJ1ZVxufTtcblxuZnVuY3Rpb24gaXNUZXh0SW5wdXRFbGVtZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcpIHtcbiAgICByZXR1cm4gISFzdXBwb3J0ZWRJbnB1dFR5cGVzW2VsZW0udHlwZV07XG4gIH1cblxuICBpZiAobm9kZU5hbWUgPT09ICd0ZXh0YXJlYScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBOT1RFOiBUaGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGZvciBub24tZ2VuZXJpYyBldmVudHMgc3VjaCBhcyBgY2hhbmdlYCxcbiAqIGByZXNldGAsIGBsb2FkYCwgYGVycm9yYCwgYW5kIGBzZWxlY3RgLlxuICpcbiAqIEJvcnJvd3MgZnJvbSBNb2Rlcm5penIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVN1ZmZpeCBFdmVudCBuYW1lLCBlLmcuIFwiY2xpY2tcIi5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IGlzIHN1cHBvcnRlZC5cbiAqIEBpbnRlcm5hbFxuICogQGxpY2Vuc2UgTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUXG4gKi9cblxuZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgpIHtcbiAgaWYgKCFjYW5Vc2VET00pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZXZlbnROYW1lID0gJ29uJyArIGV2ZW50TmFtZVN1ZmZpeDtcbiAgdmFyIGlzU3VwcG9ydGVkID0gKGV2ZW50TmFtZSBpbiBkb2N1bWVudCk7XG5cbiAgaWYgKCFpc1N1cHBvcnRlZCkge1xuICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoZXZlbnROYW1lLCAncmV0dXJuOycpO1xuICAgIGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHJldHVybiBpc1N1cHBvcnRlZDtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMSgpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNoYW5nZScsIFsnY2hhbmdlJywgJ2NsaWNrJywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnLCAnaW5wdXQnLCAna2V5ZG93bicsICdrZXl1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KSB7XG4gIC8vIEZsYWcgdGhpcyBldmVudCBsb29wIGFzIG5lZWRpbmcgc3RhdGUgcmVzdG9yZS5cbiAgZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpO1xuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGluc3QsICdvbkNoYW5nZScpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudCgnb25DaGFuZ2UnLCAnY2hhbmdlJywgbnVsbCwgbmF0aXZlRXZlbnQsIHRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRm9yIElFIHNoaW1zXG4gKi9cblxuXG52YXIgYWN0aXZlRWxlbWVudCA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNoYW5nZWAgZXZlbnRcbiAqL1xuXG5mdW5jdGlvbiBzaG91bGRVc2VDaGFuZ2VFdmVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgPT09ICdzZWxlY3QnIHx8IG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ2ZpbGUnO1xufVxuXG5mdW5jdGlvbiBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQsIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSk7IC8vIElmIGNoYW5nZSBhbmQgcHJvcGVydHljaGFuZ2UgYnViYmxlZCwgd2UnZCBqdXN0IGJpbmQgdG8gaXQgbGlrZSBhbGwgdGhlXG4gIC8vIG90aGVyIGV2ZW50cyBhbmQgaGF2ZSBpdCBnbyB0aHJvdWdoIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci4gU2luY2UgaXRcbiAgLy8gZG9lc24ndCwgd2UgbWFudWFsbHkgbGlzdGVuIGZvciB0aGUgZXZlbnRzIGFuZCBzbyB3ZSBoYXZlIHRvIGVucXVldWUgYW5kXG4gIC8vIHByb2Nlc3MgdGhlIGFic3RyYWN0IGV2ZW50IG1hbnVhbGx5LlxuICAvL1xuICAvLyBCYXRjaGluZyBpcyBuZWNlc3NhcnkgaGVyZSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBhbGwgZXZlbnQgaGFuZGxlcnMgcnVuXG4gIC8vIGJlZm9yZSB0aGUgbmV4dCByZXJlbmRlciAoaW5jbHVkaW5nIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIHRvIGFuY2VzdG9yXG4gIC8vIGVsZW1lbnRzIGluc3RlYWQgb2YgZGlyZWN0bHkgb24gdGhlIGlucHV0KS4gV2l0aG91dCB0aGlzLCBjb250cm9sbGVkXG4gIC8vIGNvbXBvbmVudHMgZG9uJ3Qgd29yayBwcm9wZXJseSBpbiBjb25qdW5jdGlvbiB3aXRoIGV2ZW50IGJ1YmJsaW5nIGJlY2F1c2VcbiAgLy8gdGhlIGNvbXBvbmVudCBpcyByZXJlbmRlcmVkIGFuZCB0aGUgdmFsdWUgcmV2ZXJ0ZWQgYmVmb3JlIGFsbCB0aGUgZXZlbnRcbiAgLy8gaGFuZGxlcnMgY2FuIHJ1bi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzA4LlxuXG4gIGJhdGNoZWRVcGRhdGVzKHJ1bkV2ZW50SW5CYXRjaCwgZGlzcGF0Y2hRdWV1ZSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkV2ZW50SW5CYXRjaChkaXNwYXRjaFF1ZXVlKSB7XG4gIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIDApO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCkge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCk7XG5cbiAgaWYgKHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKHRhcmdldE5vZGUpKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgaW5wdXRgIGV2ZW50XG4gKi9cblxuXG52YXIgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gZmFsc2U7XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgLy8gSUU5IGNsYWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dlciBpdCB3aGVuXG4gIC8vIGRlbGV0aW5nIHRleHQsIHNvIHdlIGlnbm9yZSBpdHMgaW5wdXQgZXZlbnRzLlxuICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBpc0V2ZW50U3VwcG9ydGVkKCdpbnB1dCcpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDkpO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgU3RhcnRzIHRyYWNraW5nIHByb3BlcnR5Y2hhbmdlIGV2ZW50cyBvbiB0aGUgcGFzc2VkLWluIGVsZW1lbnRcbiAqIGFuZCBvdmVycmlkZSB0aGUgdmFsdWUgcHJvcGVydHkgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggdXNlciBldmVudHMgZnJvbVxuICogdmFsdWUgY2hhbmdlcyBpbiBKUy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgYWN0aXZlRWxlbWVudCA9IHRhcmdldDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICBhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgUmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZyb20gdGhlIGN1cnJlbnRseS10cmFja2VkIGVsZW1lbnQsXG4gKiBpZiBhbnkgZXhpc3RzLlxuICovXG5cblxuZnVuY3Rpb24gc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKSB7XG4gIGlmICghYWN0aXZlRWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFjdGl2ZUVsZW1lbnQuZGV0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG4gIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBIYW5kbGVzIGEgcHJvcGVydHljaGFuZ2UgZXZlbnQsIHNlbmRpbmcgYSBgY2hhbmdlYCBldmVudCBpZlxuICogdGhlIHZhbHVlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBoYXMgY2hhbmdlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0KSkge1xuICAgIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNpbicpIHtcbiAgICAvLyBJbiBJRTksIHByb3BlcnR5Y2hhbmdlIGZpcmVzIGZvciBtb3N0IGlucHV0IGV2ZW50cyBidXQgaXMgYnVnZ3kgYW5kXG4gICAgLy8gZG9lc24ndCBmaXJlIHdoZW4gdGV4dCBpcyBkZWxldGVkLCBidXQgY29udmVuaWVudGx5LCBzZWxlY3Rpb25jaGFuZ2VcbiAgICAvLyBhcHBlYXJzIHRvIGZpcmUgaW4gYWxsIG9mIHRoZSByZW1haW5pbmcgY2FzZXMgc28gd2UgY2F0Y2ggdGhvc2UgYW5kXG4gICAgLy8gZm9yd2FyZCB0aGUgZXZlbnQgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkXG4gICAgLy8gSW4gZWl0aGVyIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gY2FsbCB0aGUgZXZlbnQgaGFuZGxlciBpZiB0aGUgdmFsdWVcbiAgICAvLyBpcyBjaGFuZ2VkIGZyb20gSlMgc28gd2UgcmVkZWZpbmUgYSBzZXR0ZXIgZm9yIGAudmFsdWVgIHRoYXQgdXBkYXRlc1xuICAgIC8vIG91ciBhY3RpdmVFbGVtZW50VmFsdWUgdmFyaWFibGUsIGFsbG93aW5nIHVzIHRvIGlnbm9yZSB0aG9zZSBjaGFuZ2VzXG4gICAgLy9cbiAgICAvLyBzdG9wV2F0Y2hpbmcoKSBzaG91bGQgYmUgYSBub29wIGhlcmUgYnV0IHdlIGNhbGwgaXQganVzdCBpbiBjYXNlIHdlXG4gICAgLy8gbWlzc2VkIGEgYmx1ciBldmVudCBzb21laG93LlxuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gICAgc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCk7XG4gIH0gZWxzZSBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgfVxufSAvLyBGb3IgSUU4IGFuZCBJRTkuXG5cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3NlbGVjdGlvbmNoYW5nZScgfHwgZG9tRXZlbnROYW1lID09PSAna2V5dXAnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgLy8gT24gdGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCwgdGhlIHRhcmdldCBpcyBqdXN0IGRvY3VtZW50IHdoaWNoIGlzbid0XG4gICAgLy8gaGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIGtleWRvd24gYW5kIGtleXVwIGFyZW4ndCBuZWNlc3NhcnkuIElFOCBmYWlscyB0byBmaXJlXG4gICAgLy8gcHJvcGVydHljaGFuZ2Ugb24gdGhlIGZpcnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGFcbiAgICAvLyBzY3JpcHQgYW5kIGZpcmVzIG9ubHkga2V5ZG93biwga2V5cHJlc3MsIGtleXVwLiBDYXRjaGluZyBrZXl1cCB1c3VhbGx5XG4gICAgLy8gZ2V0cyBpdCBhbmQgY2F0Y2hpbmcga2V5ZG93biBsZXRzIHVzIGZpcmUgYW4gZXZlbnQgZm9yIHRoZSBmaXJzdFxuICAgIC8vIGtleXN0cm9rZSBpZiB1c2VyIGRvZXMgYSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodFxuICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIGtleXN0cm9rZSkuIE90aGVyIGlucHV0IG1ldGhvZHMgKGUuZy4sIHBhc3RlKSBzZWVtIHRvXG4gICAgLy8gZmlyZSBzZWxlY3Rpb25jaGFuZ2Ugbm9ybWFsbHkuXG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCk7XG4gIH1cbn1cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjbGlja2AgZXZlbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNsaWNrRXZlbnQoZWxlbSkge1xuICAvLyBVc2UgdGhlIGBjbGlja2AgZXZlbnQgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gY2hlY2tib3ggYW5kIHJhZGlvIGlucHV0cy5cbiAgLy8gVGhpcyBhcHByb2FjaCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMgbm90IGZpcmVcbiAgLy8gdW50aWwgYGJsdXJgIGluIElFOC5cbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtLnR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NsaWNrJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0T3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2lucHV0JyB8fCBkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKG5vZGUpIHtcbiAgdmFyIHN0YXRlID0gbm9kZS5fd3JhcHBlclN0YXRlO1xuXG4gIGlmICghc3RhdGUgfHwgIXN0YXRlLmNvbnRyb2xsZWQgfHwgbm9kZS50eXBlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBJZiBjb250cm9sbGVkLCBhc3NpZ24gdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBvbiBibHVyXG4gICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsICdudW1iZXInLCBub2RlLnZhbHVlKTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvbkNoYW5nZWAgZXZlbnQgdGhhdCBub3JtYWxpemVzIGNoYW5nZSBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLiBUaGlzIGV2ZW50IGZpcmVzIGF0IGEgdGltZSB3aGVuIGl0J3MgcG9zc2libGUgdG9cbiAqIGNoYW5nZSB0aGUgZWxlbWVudCdzIHZhbHVlIHdpdGhvdXQgc2VlaW5nIGEgZmxpY2tlci5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBzZWxlY3RcbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG4gIHZhciBnZXRUYXJnZXRJbnN0RnVuYywgaGFuZGxlRXZlbnRGdW5jO1xuXG4gIGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50O1xuICB9IGVsc2UgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSkge1xuICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0T3JDaGFuZ2VFdmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgICAgaGFuZGxlRXZlbnRGdW5jID0gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudDtcbiAgfVxuXG4gIGlmIChnZXRUYXJnZXRJbnN0RnVuYykge1xuICAgIHZhciBpbnN0ID0gZ2V0VGFyZ2V0SW5zdEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KTtcblxuICAgIGlmIChpbnN0KSB7XG4gICAgICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoaGFuZGxlRXZlbnRGdW5jKSB7XG4gICAgaGFuZGxlRXZlbnRGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0Tm9kZSwgdGFyZ2V0SW5zdCk7XG4gIH0gLy8gV2hlbiBibHVycmluZywgc2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUgZm9yIG51bWJlciBpbnB1dHNcblxuXG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c291dCcpIHtcbiAgICBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKHRhcmdldE5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDIoKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VFbnRlcicsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlTGVhdmUnLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Qb2ludGVyRW50ZXInLCBbJ3BvaW50ZXJvdXQnLCAncG9pbnRlcm92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckxlYXZlJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xufVxuLyoqXG4gKiBGb3IgYWxtb3N0IGV2ZXJ5IGludGVyYWN0aW9uIHdlIGNhcmUgYWJvdXQsIHRoZXJlIHdpbGwgYmUgYm90aCBhIHRvcC1sZXZlbFxuICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhhdCBvY2N1cnMuIE9ubHkgdXNlIGBtb3VzZW91dGAgc28gdGhhdFxuICogd2UgZG8gbm90IGV4dHJhY3QgZHVwbGljYXRlIGV2ZW50cy4gSG93ZXZlciwgbW92aW5nIHRoZSBtb3VzZSBpbnRvIHRoZVxuICogYnJvd3NlciBmcm9tIG91dHNpZGUgd2lsbCBub3QgZmlyZSBhIGBtb3VzZW91dGAgZXZlbnQuIEluIHRoaXMgY2FzZSwgd2UgdXNlXG4gKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVsIGV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQyKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIGlzT3ZlckV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdmVyJyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3Zlcic7XG4gIHZhciBpc091dEV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnO1xuXG4gIGlmIChpc092ZXJFdmVudCAmJiAhaXNSZXBsYXlpbmdFdmVudChuYXRpdmVFdmVudCkpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIG92ZXIgZXZlbnQgd2l0aCBhIHRhcmdldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IGRpc3BhdGNoZWRcbiAgICAvLyB0aGUgZXZlbnQgaW4gdGhlIG91dCBldmVudCBvZiB0aGUgb3RoZXIgdGFyZ2V0LiBJZiB0aGlzIGlzIHJlcGxheWVkLFxuICAgIC8vIHRoZW4gaXQncyBiZWNhdXNlIHdlIGNvdWxkbid0IGRpc3BhdGNoIGFnYWluc3QgdGhpcyB0YXJnZXQgcHJldmlvdXNseVxuICAgIC8vIHNvIHdlIGhhdmUgdG8gZG8gaXQgbm93IGluc3RlYWQuXG4gICAgdmFyIHJlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50O1xuXG4gICAgaWYgKHJlbGF0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSByZWxhdGVkIG5vZGUgaXMgbWFuYWdlZCBieSBSZWFjdCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGhhdmVcbiAgICAgIC8vIGFscmVhZHkgZGlzcGF0Y2hlZCB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgZHVyaW5nIGl0cyBtb3VzZW91dC5cbiAgICAgIGlmIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSB8fCBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChyZWxhdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc091dEV2ZW50ICYmICFpc092ZXJFdmVudCkge1xuICAgIC8vIE11c3Qgbm90IGJlIGEgbW91c2Ugb3IgcG9pbnRlciBpbiBvciBvdXQgLSBpZ25vcmluZy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgd2luOyAvLyBUT0RPOiB3aHkgaXMgdGhpcyBudWxsYWJsZSBpbiB0aGUgdHlwZXMgYnV0IHdlIHJlYWQgZnJvbSBpdD9cblxuICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChkb2MpIHtcbiAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW4gPSB3aW5kb3c7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZyb207XG4gIHZhciB0bztcblxuICBpZiAoaXNPdXRFdmVudCkge1xuICAgIHZhciBfcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuXG4gICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgdG8gPSBfcmVsYXRlZCA/IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKF9yZWxhdGVkKSA6IG51bGw7XG5cbiAgICBpZiAodG8gIT09IG51bGwpIHtcbiAgICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodG8pO1xuXG4gICAgICBpZiAodG8gIT09IG5lYXJlc3RNb3VudGVkIHx8IHRvLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiB0by50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHRvID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICBmcm9tID0gbnVsbDtcbiAgICB0byA9IHRhcmdldEluc3Q7XG4gIH1cblxuICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gIHZhciBsZWF2ZUV2ZW50VHlwZSA9ICdvbk1vdXNlTGVhdmUnO1xuICB2YXIgZW50ZXJFdmVudFR5cGUgPSAnb25Nb3VzZUVudGVyJztcbiAgdmFyIGV2ZW50VHlwZVByZWZpeCA9ICdtb3VzZSc7XG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJykge1xuICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICBsZWF2ZUV2ZW50VHlwZSA9ICdvblBvaW50ZXJMZWF2ZSc7XG4gICAgZW50ZXJFdmVudFR5cGUgPSAnb25Qb2ludGVyRW50ZXInO1xuICAgIGV2ZW50VHlwZVByZWZpeCA9ICdwb2ludGVyJztcbiAgfVxuXG4gIHZhciBmcm9tTm9kZSA9IGZyb20gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG4gIHZhciBsZWF2ZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IobGVhdmVFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdsZWF2ZScsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuICB2YXIgZW50ZXIgPSBudWxsOyAvLyBXZSBzaG91bGQgb25seSBwcm9jZXNzIHRoaXMgbmF0aXZlRXZlbnQgaWYgd2UgYXJlIHByb2Nlc3NpbmdcbiAgLy8gdGhlIGZpcnN0IGFuY2VzdG9yLiBOZXh0IHRpbWUsIHdlIHdpbGwgaWdub3JlIHRoZSBldmVudC5cblxuICB2YXIgbmF0aXZlVGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobmF0aXZlVGFyZ2V0SW5zdCA9PT0gdGFyZ2V0SW5zdCkge1xuICAgIHZhciBlbnRlckV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihlbnRlckV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJywgdG8sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZW50ZXJFdmVudC50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG4gICAgZW50ZXIgPSBlbnRlckV2ZW50O1xuICB9XG5cbiAgYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChvYmplY3RJcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjdXJyZW50S2V5ID0ga2V5c0FbaV07XG5cbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwgY3VycmVudEtleSkgfHwgIW9iamVjdElzKG9iakFbY3VycmVudEtleV0sIG9iakJbY3VycmVudEtleV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogR2l2ZW4gYW55IG5vZGUgcmV0dXJuIHRoZSBmaXJzdCBsZWFmIG5vZGUgd2l0aG91dCBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cblxuZnVuY3Rpb24gZ2V0TGVhZk5vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2RlID0gbm9kZS5maXJzdENoaWxkO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4vKipcbiAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIHdpdGhpbiBhIGNvbnRhaW5lci4gVGhpcyB3aWxsIHdhbGsgdXAgdGhlXG4gKiBET00gaWYgYSBub2RlJ3Mgc2libGluZ3MgaGF2ZSBiZWVuIGV4aGF1c3RlZC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4gez9ET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0U2libGluZ05vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG59XG4vKipcbiAqIEdldCBvYmplY3QgZGVzY3JpYmluZyB0aGUgbm9kZXMgd2hpY2ggY29udGFpbiBjaGFyYWN0ZXJzIGF0IG9mZnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IHJvb3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkge1xuICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJvb3QpO1xuICB2YXIgbm9kZVN0YXJ0ID0gMDtcbiAgdmFyIG5vZGVFbmQgPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgbm9kZUVuZCA9IG5vZGVTdGFydCArIG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICBpZiAobm9kZVN0YXJ0IDw9IG9mZnNldCAmJiBub2RlRW5kID49IG9mZnNldCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQgLSBub2RlU3RhcnRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbm9kZVN0YXJ0ID0gbm9kZUVuZDtcbiAgICB9XG5cbiAgICBub2RlID0gZ2V0TGVhZk5vZGUoZ2V0U2libGluZ05vZGUobm9kZSkpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBvdXRlck5vZGVcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0cyhvdXRlck5vZGUpIHtcbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBvdXRlck5vZGUub3duZXJEb2N1bWVudDtcbiAgdmFyIHdpbiA9IG93bmVyRG9jdW1lbnQgJiYgb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uICYmIHdpbi5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGFuY2hvck5vZGUgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7IC8vIEluIEZpcmVmb3gsIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBjYW4gYmUgXCJhbm9ueW1vdXMgZGl2c1wiLCBlLmcuIHRoZVxuICAvLyB1cC9kb3duIGJ1dHRvbnMgb24gYW4gPGlucHV0IHR5cGU9XCJudW1iZXJcIj4uIEFub255bW91cyBkaXZzIGRvIG5vdCBzZWVtIHRvXG4gIC8vIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgXCJQZXJtaXNzaW9uIGRlbmllZCBlcnJvclwiIGlmIGFueSBvZiBpdHNcbiAgLy8gcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZSB3YXkgdG8gYXZvaWQgZXJyb3JpbmdcbiAgLy8gaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmRcbiAgLy8gY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyN1xuXG4gIHRyeSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgYW5jaG9yTm9kZS5ub2RlVHlwZTtcbiAgICBmb2N1c05vZGUubm9kZVR5cGU7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTtcbn1cbi8qKlxuICogUmV0dXJucyB7c3RhcnQsIGVuZH0gd2hlcmUgYHN0YXJ0YCBpcyB0aGUgY2hhcmFjdGVyL2NvZGVwb2ludCBpbmRleCBvZlxuICogKGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCkgd2l0aGluIHRoZSB0ZXh0Q29udGVudCBvZiBgb3V0ZXJOb2RlYCwgYW5kXG4gKiBgZW5kYCBpcyB0aGUgaW5kZXggb2YgKGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpLlxuICpcbiAqIFJldHVybnMgbnVsbCBpZiB5b3UgcGFzcyBpbiBnYXJiYWdlIGlucHV0IGJ1dCB3ZSBzaG91bGQgcHJvYmFibHkganVzdCBjcmFzaC5cbiAqXG4gKiBFeHBvcnRlZCBvbmx5IGZvciB0ZXN0aW5nLlxuICovXG5cbmZ1bmN0aW9uIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gIHZhciBsZW5ndGggPSAwO1xuICB2YXIgc3RhcnQgPSAtMTtcbiAgdmFyIGVuZCA9IC0xO1xuICB2YXIgaW5kZXhXaXRoaW5BbmNob3IgPSAwO1xuICB2YXIgaW5kZXhXaXRoaW5Gb2N1cyA9IDA7XG4gIHZhciBub2RlID0gb3V0ZXJOb2RlO1xuICB2YXIgcGFyZW50Tm9kZSA9IG51bGw7XG5cbiAgb3V0ZXI6IHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHQgPSBudWxsO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBhbmNob3JOb2RlICYmIChhbmNob3JPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aCArIGFuY2hvck9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZvY3VzTm9kZSAmJiAoZm9jdXNPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBlbmQgPSBsZW5ndGggKyBmb2N1c09mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgICBsZW5ndGggKz0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5leHQgPSBub2RlLmZpcnN0Q2hpbGQpID09PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIGZpcnN0IGNoaWxkIGBuZXh0YC5cblxuXG4gICAgICBwYXJlbnROb2RlID0gbm9kZTtcbiAgICAgIG5vZGUgPSBuZXh0O1xuICAgIH1cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gb3V0ZXJOb2RlKSB7XG4gICAgICAgIC8vIElmIGBvdXRlck5vZGVgIGhhcyBjaGlsZHJlbiwgdGhpcyBpcyBhbHdheXMgdGhlIHNlY29uZCB0aW1lIHZpc2l0aW5nXG4gICAgICAgIC8vIGl0LiBJZiBpdCBoYXMgbm8gY2hpbGRyZW4sIHRoaXMgaXMgc3RpbGwgdGhlIGZpcnN0IGxvb3AsIGFuZCB0aGUgb25seVxuICAgICAgICAvLyB2YWxpZCBzZWxlY3Rpb24gaXMgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGJvdGggZXF1YWwgdG8gdGhpcyBub2RlXG4gICAgICAgIC8vIGFuZCBib3RoIG9mZnNldHMgMCwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIGhhdmUgaGFuZGxlZCBhYm92ZS5cbiAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBhbmNob3JOb2RlICYmICsraW5kZXhXaXRoaW5BbmNob3IgPT09IGFuY2hvck9mZnNldCkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGZvY3VzTm9kZSAmJiArK2luZGV4V2l0aGluRm9jdXMgPT09IGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5uZXh0U2libGluZykgIT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgbmV4dCBzaWJsaW5nIGBuZXh0YC5cblxuXG4gICAgbm9kZSA9IG5leHQ7XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCA9PT0gLTEpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIChXb3VsZCBoYXBwZW4gaWYgdGhlIGFuY2hvci9mb2N1cyBub2RlcyBhcmVuJ3RcbiAgICAvLyBhY3R1YWxseSBpbnNpZGUgdGhlIHBhc3NlZC1pbiBub2RlLilcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kXG4gIH07XG59XG4vKipcbiAqIEluIG1vZGVybiBub24tSUUgYnJvd3NlcnMsIHdlIGNhbiBzdXBwb3J0IGJvdGggZm9yd2FyZCBhbmQgYmFja3dhcmRcbiAqIHNlbGVjdGlvbnMuXG4gKlxuICogTm90ZTogSUUxMCsgc3VwcG9ydHMgdGhlIFNlbGVjdGlvbiBvYmplY3QsIGJ1dCBpdCBkb2VzIG5vdCBzdXBwb3J0XG4gKiB0aGUgYGV4dGVuZGAgbWV0aG9kLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4gaW4gbW9kZXJuIElFLCBpdCdzIG5vdCBwb3NzaWJsZVxuICogdG8gcHJvZ3JhbW1hdGljYWxseSBjcmVhdGUgYSBiYWNrd2FyZCBzZWxlY3Rpb24uIFRodXMsIGZvciBhbGwgSUVcbiAqIHZlcnNpb25zLCB3ZSB1c2UgdGhlIG9sZCBJRSBBUEkgdG8gY3JlYXRlIG91ciBzZWxlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHNcbiAqL1xuXG5mdW5jdGlvbiBzZXRPZmZzZXRzKG5vZGUsIG9mZnNldHMpIHtcbiAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgdmFyIHdpbiA9IGRvYyAmJiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93OyAvLyBFZGdlIGZhaWxzIHdpdGggXCJPYmplY3QgZXhwZWN0ZWRcIiBpbiBzb21lIHNjZW5hcmlvcy5cbiAgLy8gKEZvciBpbnN0YW5jZTogVGlueU1DRSBlZGl0b3IgdXNlZCBpbiBhIGxpc3QgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgcGFzdGluZyB0byBhZGQgbW9yZSxcbiAgLy8gZmFpbHMgd2hlbiBwYXN0aW5nIDEwMCsgaXRlbXMpXG5cbiAgaWYgKCF3aW4uZ2V0U2VsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgdmFyIGxlbmd0aCA9IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuICB2YXIgc3RhcnQgPSBNYXRoLm1pbihvZmZzZXRzLnN0YXJ0LCBsZW5ndGgpO1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogTWF0aC5taW4ob2Zmc2V0cy5lbmQsIGxlbmd0aCk7IC8vIElFIDExIHVzZXMgbW9kZXJuIHNlbGVjdGlvbiwgYnV0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZXh0ZW5kIG1ldGhvZC5cbiAgLy8gRmxpcCBiYWNrd2FyZCBzZWxlY3Rpb25zLCBzbyB3ZSBjYW4gc2V0IHdpdGggYSBzaW5nbGUgcmFuZ2UuXG5cbiAgaWYgKCFzZWxlY3Rpb24uZXh0ZW5kICYmIHN0YXJ0ID4gZW5kKSB7XG4gICAgdmFyIHRlbXAgPSBlbmQ7XG4gICAgZW5kID0gc3RhcnQ7XG4gICAgc3RhcnQgPSB0ZW1wO1xuICB9XG5cbiAgdmFyIHN0YXJ0TWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBzdGFydCk7XG4gIHZhciBlbmRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIGVuZCk7XG5cbiAgaWYgKHN0YXJ0TWFya2VyICYmIGVuZE1hcmtlcikge1xuICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMSAmJiBzZWxlY3Rpb24uYW5jaG9yTm9kZSA9PT0gc3RhcnRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0ID09PSBzdGFydE1hcmtlci5vZmZzZXQgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZSA9PT0gZW5kTWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ID09PSBlbmRNYXJrZXIub2Zmc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQoc3RhcnRNYXJrZXIubm9kZSwgc3RhcnRNYXJrZXIub2Zmc2V0KTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBzZWxlY3Rpb24uZXh0ZW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2Uuc2V0RW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREU7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZSkge1xuICBpZiAoIW91dGVyTm9kZSB8fCAhaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZSA9PT0gaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShvdXRlck5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUoaW5uZXJOb2RlKSkge1xuICAgIHJldHVybiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUucGFyZW50Tm9kZSk7XG4gIH0gZWxzZSBpZiAoJ2NvbnRhaW5zJyBpbiBvdXRlck5vZGUpIHtcbiAgICByZXR1cm4gb3V0ZXJOb2RlLmNvbnRhaW5zKGlubmVyTm9kZSk7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuICEhKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpbm5lck5vZGUpICYgMTYpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgY29udGFpbnNOb2RlKG5vZGUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW5GcmFtZShpZnJhbWUpIHtcbiAgdHJ5IHtcbiAgICAvLyBBY2Nlc3NpbmcgdGhlIGNvbnRlbnREb2N1bWVudCBvZiBhIEhUTUxJZnJhbWVFbGVtZW50IGNhbiBjYXVzZSB0aGUgYnJvd3NlclxuICAgIC8vIHRvIHRocm93LCBlLmcuIGlmIGl0IGhhcyBhIGNyb3NzLW9yaWdpbiBzcmMgYXR0cmlidXRlLlxuICAgIC8vIFNhZmFyaSB3aWxsIHNob3cgYW4gZXJyb3IgaW4gdGhlIGNvbnNvbGUgd2hlbiB0aGUgYWNjZXNzIHJlc3VsdHMgaW4gXCJCbG9ja2VkIGEgZnJhbWUgd2l0aCBvcmlnaW5cIi4gZS5nOlxuICAgIC8vIGlmcmFtZS5jb250ZW50RG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgLy8gQSBzYWZldHkgd2F5IGlzIHRvIGFjY2VzcyBvbmUgb2YgdGhlIGNyb3NzIG9yaWdpbiBwcm9wZXJ0aWVzOiBXaW5kb3cgb3IgTG9jYXRpb25cbiAgICAvLyBXaGljaCBtaWdodCByZXN1bHQgaW4gXCJTZWN1cml0eUVycm9yXCIgRE9NIEV4Y2VwdGlvbiBhbmQgaXQgaXMgY29tcGF0aWJsZSB0byBTYWZhcmkuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNpbnRlZ3JhdGlvbi13aXRoLWlkbFxuICAgIHJldHVybiB0eXBlb2YgaWZyYW1lLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZiA9PT0gJ3N0cmluZyc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50RGVlcCgpIHtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KCk7XG5cbiAgd2hpbGUgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW4uSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICBpZiAoaXNTYW1lT3JpZ2luRnJhbWUoZWxlbWVudCkpIHtcbiAgICAgIHdpbiA9IGVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQod2luLmRvY3VtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuLyoqXG4gKiBAUmVhY3RJbnB1dFNlbGVjdGlvbjogUmVhY3QgaW5wdXQgc2VsZWN0aW9uIG1vZHVsZS4gQmFzZWQgb24gU2VsZWN0aW9uLmpzLFxuICogYnV0IG1vZGlmaWVkIHRvIGJlIHN1aXRhYmxlIGZvciByZWFjdCBhbmQgaGFzIGEgY291cGxlIG9mIGJ1ZyBmaXhlcyAoZG9lc24ndFxuICogYXNzdW1lIGJ1dHRvbnMgaGF2ZSByYW5nZSBzZWxlY3Rpb25zIGFsbG93ZWQpLlxuICogSW5wdXQgc2VsZWN0aW9uIG1vZHVsZSBmb3IgUmVhY3QuXG4gKi9cblxuLyoqXG4gKiBAaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzOiB3ZSBnZXQgdGhlIGVsZW1lbnQgdHlwZXMgdGhhdCBzdXBwb3J0IHNlbGVjdGlvblxuICogZnJvbSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNkby1ub3QtYXBwbHksIGxvb2tpbmcgYXQgYHNlbGVjdGlvblN0YXJ0YFxuICogYW5kIGBzZWxlY3Rpb25FbmRgIHJvd3MuXG4gKi9cblxuXG5mdW5jdGlvbiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICd0ZXh0JyB8fCBlbGVtLnR5cGUgPT09ICdzZWFyY2gnIHx8IGVsZW0udHlwZSA9PT0gJ3RlbCcgfHwgZWxlbS50eXBlID09PSAndXJsJyB8fCBlbGVtLnR5cGUgPT09ICdwYXNzd29yZCcpIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpO1xufVxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKSB7XG4gIHZhciBmb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7XG4gIHJldHVybiB7XG4gICAgZm9jdXNlZEVsZW06IGZvY3VzZWRFbGVtLFxuICAgIHNlbGVjdGlvblJhbmdlOiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZm9jdXNlZEVsZW0pID8gZ2V0U2VsZWN0aW9uKGZvY3VzZWRFbGVtKSA6IG51bGxcbiAgfTtcbn1cbi8qKlxuICogQHJlc3RvcmVTZWxlY3Rpb246IElmIGFueSBzZWxlY3Rpb24gaW5mb3JtYXRpb24gd2FzIHBvdGVudGlhbGx5IGxvc3QsXG4gKiByZXN0b3JlIGl0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyB0aGF0IGNvdWxkIHJlbW92ZSBkb21cbiAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3VsdGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LlxuICovXG5cbmZ1bmN0aW9uIHJlc3RvcmVTZWxlY3Rpb24ocHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbikge1xuICB2YXIgY3VyRm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICB2YXIgcHJpb3JGb2N1c2VkRWxlbSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uZm9jdXNlZEVsZW07XG4gIHZhciBwcmlvclNlbGVjdGlvblJhbmdlID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5zZWxlY3Rpb25SYW5nZTtcblxuICBpZiAoY3VyRm9jdXNlZEVsZW0gIT09IHByaW9yRm9jdXNlZEVsZW0gJiYgaXNJbkRvY3VtZW50KHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgaWYgKHByaW9yU2VsZWN0aW9uUmFuZ2UgIT09IG51bGwgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgICBzZXRTZWxlY3Rpb24ocHJpb3JGb2N1c2VkRWxlbSwgcHJpb3JTZWxlY3Rpb25SYW5nZSk7XG4gICAgfSAvLyBGb2N1c2luZyBhIG5vZGUgY2FuIGNoYW5nZSB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB3aGljaCBpcyB1bmRlc2lyYWJsZVxuXG5cbiAgICB2YXIgYW5jZXN0b3JzID0gW107XG4gICAgdmFyIGFuY2VzdG9yID0gcHJpb3JGb2N1c2VkRWxlbTtcblxuICAgIHdoaWxlIChhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChhbmNlc3Rvci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGFuY2VzdG9ycy5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiBhbmNlc3RvcixcbiAgICAgICAgICBsZWZ0OiBhbmNlc3Rvci5zY3JvbGxMZWZ0LFxuICAgICAgICAgIHRvcDogYW5jZXN0b3Iuc2Nyb2xsVG9wXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IGFuY2VzdG9yc1tpXTtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxMZWZ0ID0gaW5mby5sZWZ0O1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbFRvcCA9IGluZm8udG9wO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBAZ2V0U2VsZWN0aW9uOiBHZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgZm9jdXNlZCB0ZXh0YXJlYSwgaW5wdXQgb3JcbiAqIGNvbnRlbnRFZGl0YWJsZSBub2RlLlxuICogLUBpbnB1dDogTG9vayB1cCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXRcbiAqIC1AcmV0dXJuIHtzdGFydDogc2VsZWN0aW9uU3RhcnQsIGVuZDogc2VsZWN0aW9uRW5kfVxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbihpbnB1dCkge1xuICB2YXIgc2VsZWN0aW9uO1xuXG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXIgd2l0aCBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSB7XG4gICAgICBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IGlucHV0LnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29udGVudCBlZGl0YWJsZSBvciBvbGQgSUUgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0gZ2V0T2Zmc2V0cyhpbnB1dCk7XG4gIH1cblxuICByZXR1cm4gc2VsZWN0aW9uIHx8IHtcbiAgICBzdGFydDogMCxcbiAgICBlbmQ6IDBcbiAgfTtcbn1cbi8qKlxuICogQHNldFNlbGVjdGlvbjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBmb2N1c2VzXG4gKiB0aGUgaW5wdXQuXG4gKiAtQGlucHV0ICAgICBTZXQgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0IG9yIHRleHRhcmVhXG4gKiAtQG9mZnNldHMgICBPYmplY3Qgb2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqXG4gKi9cblxuZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGlucHV0LCBvZmZzZXRzKSB7XG4gIHZhciBzdGFydCA9IG9mZnNldHMuc3RhcnQ7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZDtcblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSBzdGFydDtcbiAgfVxuXG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICBpbnB1dC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihlbmQsIGlucHV0LnZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0T2Zmc2V0cyhpbnB1dCwgb2Zmc2V0cyk7XG4gIH1cbn1cblxudmFyIHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCA9IGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPD0gMTE7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDMoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25TZWxlY3QnLCBbJ2ZvY3Vzb3V0JywgJ2NvbnRleHRtZW51JywgJ2RyYWdlbmQnLCAnZm9jdXNpbicsICdrZXlkb3duJywgJ2tleXVwJywgJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTtcbn1cblxudmFyIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG52YXIgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG52YXIgbW91c2VEb3duID0gZmFsc2U7XG4vKipcbiAqIEdldCBhbiBvYmplY3Qgd2hpY2ggaXMgYSB1bmlxdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBub3QgYmUgY29uc2lzdGVudCBhY3Jvc3Mgbm9kZXMgb3IgYnJvd3NlcnMsIGJ1dFxuICogdHdvIGlkZW50aWNhbCBzZWxlY3Rpb25zIG9uIHRoZSBzYW1lIG5vZGUgd2lsbCByZXR1cm4gaWRlbnRpY2FsIG9iamVjdHMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uJDEobm9kZSkge1xuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhub2RlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogbm9kZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogbm9kZS5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHJldHVybiB7XG4gICAgICBhbmNob3JOb2RlOiBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldDogc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZTogc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0OiBzZWxlY3Rpb24uZm9jdXNPZmZzZXRcbiAgICB9O1xuICB9XG59XG4vKipcbiAqIEdldCBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRhcmdldC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQoZXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIGV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gZXZlbnRUYXJnZXQgPyBldmVudFRhcmdldC5kb2N1bWVudCA6IGV2ZW50VGFyZ2V0Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gZXZlbnRUYXJnZXQgOiBldmVudFRhcmdldC5vd25lckRvY3VtZW50O1xufVxuLyoqXG4gKiBQb2xsIHNlbGVjdGlvbiB0byBzZWUgd2hldGhlciBpdCdzIGNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRUYXJnZXRcbiAqIEByZXR1cm4gez9TeW50aGV0aWNFdmVudH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgZWxlbWVudCwgYW5kIHRoYXQgdGhlIHVzZXIgaXMgbm90IGRyYWdnaW5nIGFcbiAgLy8gc2VsZWN0aW9uICh0aGlzIG1hdGNoZXMgbmF0aXZlIGBzZWxlY3RgIGV2ZW50IGJlaGF2aW9yKS4gSW4gSFRNTDUsIHNlbGVjdFxuICAvLyBmaXJlcyBvbmx5IG9uIGlucHV0IGFuZCB0ZXh0YXJlYSB0aHVzIGlmIHRoZXJlJ3Mgbm8gZm9jdXNlZCBlbGVtZW50IHdlXG4gIC8vIHdvbid0IGRpc3BhdGNoLlxuICB2YXIgZG9jID0gZ2V0RXZlbnRUYXJnZXREb2N1bWVudChuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKG1vdXNlRG93biB8fCBhY3RpdmVFbGVtZW50JDEgPT0gbnVsbCB8fCBhY3RpdmVFbGVtZW50JDEgIT09IGdldEFjdGl2ZUVsZW1lbnQoZG9jKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBPbmx5IGZpcmUgd2hlbiBzZWxlY3Rpb24gaGFzIGFjdHVhbGx5IGNoYW5nZWQuXG5cblxuICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbiQxKGFjdGl2ZUVsZW1lbnQkMSk7XG5cbiAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHtcbiAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcbiAgICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGFjdGl2ZUVsZW1lbnRJbnN0JDEsICdvblNlbGVjdCcpO1xuXG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uU2VsZWN0JywgJ3NlbGVjdCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgICB9KTtcbiAgICAgIGV2ZW50LnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQkMTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25TZWxlY3RgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBzZWxlY3QgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBjb250ZW50RWRpdGFibGVcbiAqXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSBuYXRpdmUgYnJvd3NlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICogLSBGaXJlcyBvbiBjb250ZW50RWRpdGFibGUgZmllbGRzIGFzIHdlbGwgYXMgaW5wdXRzLlxuICogLSBGaXJlcyBmb3IgY29sbGFwc2VkIHNlbGVjdGlvbi5cbiAqIC0gRmlyZXMgYWZ0ZXIgdXNlciBpbnB1dC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJykge1xuICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xuICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICBicmVhaztcbiAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cblxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBicmVhaztcbiAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgIC8vXG4gICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cblxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuICByZXR1cm4gcHJlZml4ZXM7XG59XG4vKipcbiAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuLyoqXG4gKiBFdmVudCBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRldGVjdGVkIGFuZCBwcmVmaXhlZCAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuLyoqXG4gKiBFbGVtZW50IHRvIGNoZWNrIGZvciBwcmVmaXhlcyBvbi5cbiAqL1xuXG52YXIgc3R5bGUgPSB7fTtcbi8qKlxuICogQm9vdHN0cmFwIGlmIGEgRE9NIGV4aXN0cy5cbiAqL1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7IC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsXG4gIC8vIHRoZSB1bi1wcmVmaXhlZCBcImFuaW1hdGlvblwiIGFuZCBcInRyYW5zaXRpb25cIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZVxuICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWRcbiAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC5cblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9IC8vIFNhbWUgYXMgYWJvdmVcblxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICB9XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBldmVudE5hbWU7XG4gIH1cblxuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTtcblxuICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7XG4gICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50TmFtZTtcbn1cblxudmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgQU5JTUFUSU9OX0lURVJBVElPTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKTtcbnZhciBBTklNQVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKTtcbnZhciBUUkFOU0lUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5cbnZhciB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKTsgLy8gTk9URTogQ2FwaXRhbGl6YXRpb24gaXMgaW1wb3J0YW50IGluIHRoaXMgbGlzdCFcbi8vXG4vLyBFLmcuIGl0IG5lZWRzIFwicG9pbnRlckRvd25cIiwgbm90IFwicG9pbnRlcmRvd25cIi5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBkZXJpdmUgYm90aCBSZWFjdCBuYW1lIChcIm9uUG9pbnRlckRvd25cIilcbi8vIGFuZCBET00gbmFtZSAoXCJwb2ludGVyZG93blwiKSBmcm9tIHRoZSBzYW1lIGxpc3QuXG4vL1xuLy8gRXhjZXB0aW9ucyB0aGF0IGRvbid0IG1hdGNoIHRoaXMgY29udmVudGlvbiBhcmUgbGlzdGVkIHNlcGFyYXRlbHkuXG4vL1xuLy8gcHJldHRpZXItaWdub3JlXG5cbnZhciBzaW1wbGVFdmVudFBsdWdpbkV2ZW50cyA9IFsnYWJvcnQnLCAnYXV4Q2xpY2snLCAnY2FuY2VsJywgJ2NhblBsYXknLCAnY2FuUGxheVRocm91Z2gnLCAnY2xpY2snLCAnY2xvc2UnLCAnY29udGV4dE1lbnUnLCAnY29weScsICdjdXQnLCAnZHJhZycsICdkcmFnRW5kJywgJ2RyYWdFbnRlcicsICdkcmFnRXhpdCcsICdkcmFnTGVhdmUnLCAnZHJhZ092ZXInLCAnZHJhZ1N0YXJ0JywgJ2Ryb3AnLCAnZHVyYXRpb25DaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnZ290UG9pbnRlckNhcHR1cmUnLCAnaW5wdXQnLCAnaW52YWxpZCcsICdrZXlEb3duJywgJ2tleVByZXNzJywgJ2tleVVwJywgJ2xvYWQnLCAnbG9hZGVkRGF0YScsICdsb2FkZWRNZXRhZGF0YScsICdsb2FkU3RhcnQnLCAnbG9zdFBvaW50ZXJDYXB0dXJlJywgJ21vdXNlRG93bicsICdtb3VzZU1vdmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3BvaW50ZXJDYW5jZWwnLCAncG9pbnRlckRvd24nLCAncG9pbnRlck1vdmUnLCAncG9pbnRlck91dCcsICdwb2ludGVyT3ZlcicsICdwb2ludGVyVXAnLCAncHJvZ3Jlc3MnLCAncmF0ZUNoYW5nZScsICdyZXNldCcsICdyZXNpemUnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdWJtaXQnLCAnc3VzcGVuZCcsICd0aW1lVXBkYXRlJywgJ3RvdWNoQ2FuY2VsJywgJ3RvdWNoRW5kJywgJ3RvdWNoU3RhcnQnLCAndm9sdW1lQ2hhbmdlJywgJ3Njcm9sbCcsICd0b2dnbGUnLCAndG91Y2hNb3ZlJywgJ3dhaXRpbmcnLCAnd2hlZWwnXTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSkge1xuICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVhY3ROYW1lLCBbZG9tRXZlbnROYW1lXSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlRXZlbnRzKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGV2ZW50TmFtZSA9IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzW2ldO1xuICAgIHZhciBkb21FdmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgY2FwaXRhbGl6ZWRFdmVudCA9IGV2ZW50TmFtZVswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnROYW1lLnNsaWNlKDEpO1xuICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCAnb24nICsgY2FwaXRhbGl6ZWRFdmVudCk7XG4gIH0gLy8gU3BlY2lhbCBjYXNlcyB3aGVyZSBldmVudCBuYW1lcyBkb24ndCBtYXRjaC5cblxuXG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX0VORCwgJ29uQW5pbWF0aW9uRW5kJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX0lURVJBVElPTiwgJ29uQW5pbWF0aW9uSXRlcmF0aW9uJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX1NUQVJULCAnb25BbmltYXRpb25TdGFydCcpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdkYmxjbGljaycsICdvbkRvdWJsZUNsaWNrJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2ZvY3VzaW4nLCAnb25Gb2N1cycpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdmb2N1c291dCcsICdvbkJsdXInKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChUUkFOU0lUSU9OX0VORCwgJ29uVHJhbnNpdGlvbkVuZCcpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7XG5cbiAgaWYgKHJlYWN0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICB2YXIgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdmb2N1cyc7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdibHVyJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjbGljayc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2V1cCc6IC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQU5JTUFUSU9OX0VORDpcbiAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUUkFOU0lUSU9OX0VORDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAge1xuICAgIC8vIFNvbWUgZXZlbnRzIGRvbid0IGJ1YmJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAvLyBJbiB0aGUgcGFzdCwgUmVhY3QgaGFzIGFsd2F5cyBidWJibGVkIHRoZW0sIGJ1dCB0aGlzIGNhbiBiZSBzdXJwcmlzaW5nLlxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRyeSBhbGlnbmluZyBjbG9zZXIgdG8gdGhlIGJyb3dzZXIgYmVoYXZpb3IgYnkgbm90IGJ1YmJsaW5nXG4gICAgLy8gdGhlbSBpbiBSZWFjdCBlaXRoZXIuIFdlJ2xsIHN0YXJ0IGJ5IG5vdCBidWJibGluZyBvblNjcm9sbCwgYW5kIHRoZW4gZXhwYW5kLlxuICAgIHZhciBhY2N1bXVsYXRlVGFyZ2V0T25seSA9ICFpbkNhcHR1cmVQaGFzZSAmJiAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYWRkIGFsbCBldmVudHMgZnJvbVxuICAgIC8vIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0IGluIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxuICAgIC8vIFRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHNwZWNpYWwgbGlzdC5cbiAgICAvLyBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRoYXQgY2FuIHdhaXQgdW50aWwgUmVhY3QgMTguXG4gICAgZG9tRXZlbnROYW1lID09PSAnc2Nyb2xsJztcblxuICAgIHZhciBfbGlzdGVuZXJzID0gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnQudHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5KTtcblxuICAgIGlmIChfbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgY3JlYXRlIGV2ZW50IGxhemlseS5cbiAgICAgIHZhciBfZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBfZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogX2xpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0b3AtbGV2ZWwgc2lkZSBlZmZlY3QuXG5yZWdpc3RlclNpbXBsZUV2ZW50cygpO1xucmVnaXN0ZXJFdmVudHMkMigpO1xucmVnaXN0ZXJFdmVudHMkMSgpO1xucmVnaXN0ZXJFdmVudHMkMygpO1xucmVnaXN0ZXJFdmVudHMoKTtcblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29uY2VwdCBvZiBhIFwiU2ltcGxlRXZlbnRQbHVnaW5cIi5cbiAgLy8gVGhpcyBpcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXZlbnQgc3lzdGVtLiBBbGxcbiAgLy8gdGhlIG90aGVyIHBsdWdpbnMgYXJlIGVzc2VudGlhbGx5IHBvbHlmaWxscy4gU28gdGhlIHBsdWdpblxuICAvLyBzaG91bGQgcHJvYmFibHkgYmUgaW5saW5lZCBzb21ld2hlcmUgYW5kIGhhdmUgaXRzIGxvZ2ljXG4gIC8vIGJlIGNvcmUgdGhlIHRvIGV2ZW50IHN5c3RlbS4gVGhpcyB3b3VsZCBwb3RlbnRpYWxseSBhbGxvd1xuICAvLyB1cyB0byBzaGlwIGJ1aWxkcyBvZiBSZWFjdCB3aXRob3V0IHRoZSBwb2x5ZmlsbGVkIHBsdWdpbnMgYmVsb3cuXG4gIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHZhciBzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUykgPT09IDA7IC8vIFdlIGRvbid0IHByb2Nlc3MgdGhlc2UgZXZlbnRzIHVubGVzcyB3ZSBhcmUgaW4gdGhlXG4gIC8vIGV2ZW50J3MgbmF0aXZlIFwiYnViYmxlXCIgcGhhc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2UncmVcbiAgLy8gbm90IGluIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0J3MgYmVjYXVzZSB3ZSBlbXVsYXRlXG4gIC8vIHRoZSBjYXB0dXJlIHBoYXNlIGhlcmUgc3RpbGwuIFRoaXMgaXMgYSB0cmFkZS1vZmYsXG4gIC8vIGJlY2F1c2UgaW4gYW4gaWRlYWwgd29ybGQgd2Ugd291bGQgbm90IGVtdWxhdGUgYW5kIHVzZVxuICAvLyB0aGUgcGhhc2VzIHByb3Blcmx5LCBsaWtlIHdlIGRvIHdpdGggdGhlIFNpbXBsZUV2ZW50XG4gIC8vIHBsdWdpbi4gSG93ZXZlciwgdGhlIHBsdWdpbnMgYmVsb3cgZWl0aGVyIGV4cGVjdFxuICAvLyBlbXVsYXRpb24gKEVudGVyTGVhdmUpIG9yIHVzZSBzdGF0ZSBsb2NhbGl6ZWQgdG8gdGhhdFxuICAvLyBwbHVnaW4gKEJlZm9yZUlucHV0LCBDaGFuZ2UsIFNlbGVjdCkuIFRoZSBzdGF0ZSBpblxuICAvLyB0aGVzZSBtb2R1bGVzIGNvbXBsaWNhdGVzIHRoaW5ncywgYXMgeW91J2xsIGVzc2VudGlhbGx5XG4gIC8vIGdldCB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwdHVyZSBwaGFzZSBldmVudCBtaWdodCBjaGFuZ2VcbiAgLy8gc3RhdGUsIG9ubHkgZm9yIHRoZSBmb2xsb3dpbmcgYnViYmxlIGV2ZW50IHRvIGNvbWUgaW5cbiAgLy8gbGF0ZXIgYW5kIG5vdCB0cmlnZ2VyIGFueXRoaW5nIGFzIHRoZSBzdGF0ZSBub3dcbiAgLy8gaW52YWxpZGF0ZXMgdGhlIGhldXJpc3RpY3Mgb2YgdGhlIGV2ZW50IHBsdWdpbi4gV2VcbiAgLy8gY291bGQgYWx0ZXIgYWxsIHRoZXNlIHBsdWdpbnMgdG8gd29yayBpbiBzdWNoIHdheXMsIGJ1dFxuICAvLyB0aGF0IG1pZ2h0IGNhdXNlIG90aGVyIHVua25vd24gc2lkZS1lZmZlY3RzIHRoYXQgd2VcbiAgLy8gY2FuJ3QgZm9yZXNlZSByaWdodCBub3cuXG5cbiAgaWYgKHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMpIHtcbiAgICBleHRyYWN0RXZlbnRzJDIoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyQzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufSAvLyBMaXN0IG9mIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgaW5kaXZpZHVhbGx5IGF0dGFjaGVkIHRvIG1lZGlhIGVsZW1lbnRzLlxuXG5cbnZhciBtZWRpYUV2ZW50VHlwZXMgPSBbJ2Fib3J0JywgJ2NhbnBsYXknLCAnY2FucGxheXRocm91Z2gnLCAnZHVyYXRpb25jaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnbG9hZGVkZGF0YScsICdsb2FkZWRtZXRhZGF0YScsICdsb2Fkc3RhcnQnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVjaGFuZ2UnLCAncmVzaXplJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VzcGVuZCcsICd0aW1ldXBkYXRlJywgJ3ZvbHVtZWNoYW5nZScsICd3YWl0aW5nJ107IC8vIFdlIHNob3VsZCBub3QgZGVsZWdhdGUgdGhlc2UgZXZlbnRzIHRvIHRoZSBjb250YWluZXIsIGJ1dCByYXRoZXJcbi8vIHNldCB0aGVtIG9uIHRoZSBhY3R1YWwgdGFyZ2V0IGVsZW1lbnQgaXRzZWxmLiBUaGlzIGlzIHByaW1hcmlseVxuLy8gYmVjYXVzZSB0aGVzZSBldmVudHMgZG8gbm90IGNvbnNpc3RlbnRseSBidWJibGUgaW4gdGhlIERPTS5cblxudmFyIG5vbkRlbGVnYXRlZEV2ZW50cyA9IG5ldyBTZXQoWydjYW5jZWwnLCAnY2xvc2UnLCAnaW52YWxpZCcsICdsb2FkJywgJ3Njcm9sbCcsICd0b2dnbGUnXS5jb25jYXQobWVkaWFFdmVudFR5cGVzKSk7XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8ICd1bmtub3duLWV2ZW50JztcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQ7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcih0eXBlLCBsaXN0ZW5lciwgdW5kZWZpbmVkLCBldmVudCk7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZUl0ZW1zSW5PcmRlcihldmVudCwgZGlzcGF0Y2hMaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciBwcmV2aW91c0luc3RhbmNlO1xuXG4gIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgIGZvciAodmFyIGkgPSBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRpID0gZGlzcGF0Y2hMaXN0ZW5lcnNbaV0sXG4gICAgICAgICAgaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5pbnN0YW5jZSxcbiAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBsaXN0ZW5lciA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmxpc3RlbmVyO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpO1xuICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2Rpc3BhdGNoTGlzdGVuZXJzJF9pID0gZGlzcGF0Y2hMaXN0ZW5lcnNbX2ldLFxuICAgICAgICAgIF9pbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5pbnN0YW5jZSxcbiAgICAgICAgICBfY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgIF9saXN0ZW5lciA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKF9pbnN0YW5jZSAhPT0gcHJldmlvdXNJbnN0YW5jZSAmJiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBfbGlzdGVuZXIsIF9jdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBfaW5zdGFuY2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2Rpc3BhdGNoUXVldWUkaSA9IGRpc3BhdGNoUXVldWVbaV0sXG4gICAgICAgIGV2ZW50ID0gX2Rpc3BhdGNoUXVldWUkaS5ldmVudCxcbiAgICAgICAgbGlzdGVuZXJzID0gX2Rpc3BhdGNoUXVldWUkaS5saXN0ZW5lcnM7XG4gICAgcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGxpc3RlbmVycywgaW5DYXB0dXJlUGhhc2UpOyAvLyAgZXZlbnQgc3lzdGVtIGRvZXNuJ3QgdXNlIHBvb2xpbmcuXG4gIH0gLy8gVGhpcyB3b3VsZCBiZSBhIGdvb2QgdGltZSB0byByZXRocm93IGlmIGFueSBvZiB0aGUgZXZlbnQgaGFuZGxlcnMgdGhyZXcuXG5cblxuICByZXRocm93Q2F1Z2h0RXJyb3IoKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7XG4gIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gIGV4dHJhY3RFdmVudHMkNShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0RWxlbWVudCkge1xuICB7XG4gICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBhIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoKSBjYWxsIGZvciBcIiVzXCIuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZG9tRXZlbnROYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciA9IGZhbHNlO1xuICB2YXIgbGlzdGVuZXJTZXQgPSBnZXRFdmVudExpc3RlbmVyU2V0KHRhcmdldEVsZW1lbnQpO1xuICB2YXIgbGlzdGVuZXJTZXRLZXkgPSBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuXG4gIGlmICghbGlzdGVuZXJTZXQuaGFzKGxpc3RlbmVyU2V0S2V5KSkge1xuICAgIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIGRvbUV2ZW50TmFtZSwgSVNfTk9OX0RFTEVHQVRFRCwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG4gICAgbGlzdGVuZXJTZXQuYWRkKGxpc3RlbmVyU2V0S2V5KTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHRhcmdldCkge1xuICB7XG4gICAgaWYgKG5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSAmJiAhaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9OYXRpdmVFdmVudCgpIGNhbGwgZm9yIFwiJXNcIiBpbiB0aGUgYnViYmxlIHBoYXNlLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGRvbUV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50U3lzdGVtRmxhZ3MgPSAwO1xuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgZXZlbnRTeXN0ZW1GbGFncyB8PSBJU19DQVBUVVJFX1BIQVNFO1xuICB9XG5cbiAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xufSAvLyBUaGlzIGlzIG9ubHkgdXNlZCBieSBjcmVhdGVFdmVudEhhbmRsZSB3aGVuIHRoZVxudmFyIGxpc3RlbmluZ01hcmtlciA9ICdfcmVhY3RMaXN0ZW5pbmcnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG5mdW5jdGlvbiBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCkge1xuICBpZiAoIXJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0pIHtcbiAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICBhbGxOYXRpdmVFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9tRXZlbnROYW1lKSB7XG4gICAgICAvLyBXZSBoYW5kbGUgc2VsZWN0aW9uY2hhbmdlIHNlcGFyYXRlbHkgYmVjYXVzZSBpdFxuICAgICAgLy8gZG9lc24ndCBidWJibGUgYW5kIG5lZWRzIHRvIGJlIG9uIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmIChkb21FdmVudE5hbWUgIT09ICdzZWxlY3Rpb25jaGFuZ2UnKSB7XG4gICAgICAgIGlmICghbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpKSB7XG4gICAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGZhbHNlLCByb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgdHJ1ZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICBpZiAob3duZXJEb2N1bWVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCBhbHNvIG5lZWRzIGRlZHVwbGljYXRpb25cbiAgICAgIC8vIGJ1dCBpdCBpcyBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQuXG4gICAgICBpZiAoIW93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgICAgICBvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0gPSB0cnVlO1xuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCdzZWxlY3Rpb25jaGFuZ2UnLCBmYWxzZSwgb3duZXJEb2N1bWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyLCBpc0RlZmVycmVkTGlzdGVuZXJGb3JMZWdhY3lGQlN1cHBvcnQpIHtcbiAgdmFyIGxpc3RlbmVyID0gY3JlYXRlRXZlbnRMaXN0ZW5lcldyYXBwZXJXaXRoUHJpb3JpdHkodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MpOyAvLyBJZiBwYXNzaXZlIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIHRoZSBldmVudCB3aWxsIGJlXG4gIC8vIGFjdGl2ZSBhbmQgbm90IHBhc3NpdmUuXG5cbiAgdmFyIGlzUGFzc2l2ZUxpc3RlbmVyID0gdW5kZWZpbmVkO1xuXG4gIGlmIChwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCkge1xuICAgIC8vIEJyb3dzZXJzIGludHJvZHVjZWQgYW4gaW50ZXJ2ZW50aW9uLCBtYWtpbmcgdGhlc2UgZXZlbnRzXG4gICAgLy8gcGFzc2l2ZSBieSBkZWZhdWx0IG9uIGRvY3VtZW50LiBSZWFjdCBkb2Vzbid0IGJpbmQgdGhlbVxuICAgIC8vIHRvIGRvY3VtZW50IGFueW1vcmUsIGJ1dCBjaGFuZ2luZyB0aGlzIG5vdyB3b3VsZCB1bmRvXG4gICAgLy8gdGhlIHBlcmZvcm1hbmNlIHdpbnMgZnJvbSB0aGUgY2hhbmdlLiBTbyB3ZSBlbXVsYXRlXG4gICAgLy8gdGhlIGV4aXN0aW5nIGJlaGF2aW9yIG1hbnVhbGx5IG9uIHRoZSByb290cyBub3cuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTY1MVxuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICd0b3VjaHN0YXJ0JyB8fCBkb21FdmVudE5hbWUgPT09ICd0b3VjaG1vdmUnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3doZWVsJykge1xuICAgICAgaXNQYXNzaXZlTGlzdGVuZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldENvbnRhaW5lciA9ICB0YXJnZXRDb250YWluZXI7XG4gIHZhciB1bnN1YnNjcmliZUxpc3RlbmVyOyAvLyBXaGVuIGxlZ2FjeUZCU3VwcG9ydCBpcyBlbmFibGVkLCBpdCdzIGZvciB3aGVuIHdlXG5cblxuICBpZiAoaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNQYXNzaXZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdyYW5kQ29udGFpbmVyID09PSB0YXJnZXRDb250YWluZXIgfHwgZ3JhbmRDb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBncmFuZENvbnRhaW5lci5wYXJlbnROb2RlID09PSB0YXJnZXRDb250YWluZXI7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIGFuY2VzdG9ySW5zdCA9IHRhcmdldEluc3Q7XG5cbiAgaWYgKChldmVudFN5c3RlbUZsYWdzICYgSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUpID09PSAwICYmIChldmVudFN5c3RlbUZsYWdzICYgSVNfTk9OX0RFTEVHQVRFRCkgPT09IDApIHtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyTm9kZSA9IHRhcmdldENvbnRhaW5lcjsgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBsZWdhY3kgRkIgc3VwcG9ydCBmbGFnLCB3ZVxuXG4gICAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSBiZWxvdyBsb2dpYyBhdHRlbXB0cyB0byB3b3JrIG91dCBpZiB3ZSBuZWVkIHRvIGNoYW5nZVxuICAgICAgLy8gdGhlIHRhcmdldCBmaWJlciB0byBhIGRpZmZlcmVudCBhbmNlc3Rvci4gV2UgaGFkIHNpbWlsYXIgbG9naWNcbiAgICAgIC8vIGluIHRoZSBsZWdhY3kgZXZlbnQgc3lzdGVtLCBleGNlcHQgdGhlIGJpZyBkaWZmZXJlbmNlIGJldHdlZW5cbiAgICAgIC8vIHN5c3RlbXMgaXMgdGhhdCB0aGUgbW9kZXJuIGV2ZW50IHN5c3RlbSBub3cgaGFzIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAvLyBhdHRhY2hlZCB0byBlYWNoIFJlYWN0IFJvb3QgYW5kIFJlYWN0IFBvcnRhbCBSb290LiBUb2dldGhlcixcbiAgICAgIC8vIHRoZSBET00gbm9kZXMgcmVwcmVzZW50aW5nIHRoZXNlIHJvb3RzIGFyZSB0aGUgXCJyb290Q29udGFpbmVyXCIuXG4gICAgICAvLyBUbyBmaWd1cmUgb3V0IHdoaWNoIGFuY2VzdG9yIGluc3RhbmNlIHdlIHNob3VsZCB1c2UsIHdlIHRyYXZlcnNlXG4gICAgICAvLyB1cCB0aGUgZmliZXIgdHJlZSBmcm9tIHRoZSB0YXJnZXQgaW5zdGFuY2UgYW5kIGF0dGVtcHQgdG8gZmluZFxuICAgICAgLy8gcm9vdCBib3VuZGFyaWVzIHRoYXQgbWF0Y2ggdGhhdCBvZiBvdXIgY3VycmVudCBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIElmIHdlIGZpbmQgdGhhdCBcInJvb3RDb250YWluZXJcIiwgd2UgZmluZCB0aGUgcGFyZW50IGZpYmVyXG4gICAgICAvLyBzdWItdHJlZSBmb3IgdGhhdCByb290IGFuZCBtYWtlIHRoYXQgb3VyIGFuY2VzdG9yIGluc3RhbmNlLlxuICAgICAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0O1xuXG4gICAgICBtYWluTG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9kZVRhZyA9IG5vZGUudGFnO1xuXG4gICAgICAgIGlmIChub2RlVGFnID09PSBIb3N0Um9vdCB8fCBub2RlVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBpZiAoaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoY29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICAgIC8vIFRoZSB0YXJnZXQgaXMgYSBwb3J0YWwsIGJ1dCBpdCdzIG5vdCB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvci5cbiAgICAgICAgICAgIC8vIE5vcm1hbGx5IHBvcnRhbHMgaGFuZGxlIHRoZWlyIG93biBldmVudHMgYWxsIHRoZSB3YXkgZG93biB0byB0aGUgcm9vdC5cbiAgICAgICAgICAgIC8vIFNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHN0b3Agbm93LiBIb3dldmVyLCB3ZSBkb24ndCBrbm93IGlmIHRoaXMgcG9ydGFsXG4gICAgICAgICAgICAvLyB3YXMgcGFydCBvZiAqb3VyKiByb290LlxuICAgICAgICAgICAgdmFyIGdyYW5kTm9kZSA9IG5vZGUucmV0dXJuO1xuXG4gICAgICAgICAgICB3aGlsZSAoZ3JhbmROb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBncmFuZFRhZyA9IGdyYW5kTm9kZS50YWc7XG5cbiAgICAgICAgICAgICAgaWYgKGdyYW5kVGFnID09PSBIb3N0Um9vdCB8fCBncmFuZFRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgICAgIHZhciBncmFuZENvbnRhaW5lciA9IGdyYW5kTm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihncmFuZENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3RDb250YWluZXIgd2UncmUgbG9va2luZyBmb3IgYW5kIHdlIGZvdW5kIGl0IGFzXG4gICAgICAgICAgICAgICAgICAvLyBhIHBhcmVudCBvZiB0aGUgUG9ydGFsLiBUaGF0IG1lYW5zIHdlIGNhbiBpZ25vcmUgaXQgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFBvcnRhbCB3aWxsIGJ1YmJsZSB0aHJvdWdoIHRvIHVzLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGdyYW5kTm9kZSA9IGdyYW5kTm9kZS5yZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBOb3cgd2UgbmVlZCB0byBmaW5kIGl0J3MgY29ycmVzcG9uZGluZyBob3N0IGZpYmVyIGluIHRoZSBvdGhlclxuICAgICAgICAgIC8vIHRyZWUuIFRvIGRvIHRoaXMgd2UgY2FuIHVzZSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSwgYnV0IHdlXG4gICAgICAgICAgLy8gbmVlZCB0byB2YWxpZGF0ZSB0aGF0IHRoZSBmaWJlciBpcyBhIGhvc3QgaW5zdGFuY2UsIG90aGVyd2lzZVxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdHJhdmVyc2UgdXAgdGhyb3VnaCB0aGUgRE9NIHRpbGwgd2UgZmluZCB0aGUgY29ycmVjdFxuICAgICAgICAgIC8vIG5vZGUgdGhhdCBpcyBmcm9tIHRoZSBvdGhlciB0cmVlLlxuXG5cbiAgICAgICAgICB3aGlsZSAoY29udGFpbmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudE5vZGUudGFnO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50VGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHBhcmVudFRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgICAgICAgbm9kZSA9IGFuY2VzdG9ySW5zdCA9IHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG1haW5Mb29wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgYW5jZXN0b3JJbnN0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHJldHVybiB7XG4gICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVTaW5nbGVQaGFzZUxpc3RlbmVycyh0YXJnZXRGaWJlciwgcmVhY3ROYW1lLCBuYXRpdmVFdmVudFR5cGUsIGluQ2FwdHVyZVBoYXNlLCBhY2N1bXVsYXRlVGFyZ2V0T25seSwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICE9PSBudWxsID8gcmVhY3ROYW1lICsgJ0NhcHR1cmUnIDogbnVsbDtcbiAgdmFyIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2UgPyBjYXB0dXJlTmFtZSA6IHJlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjtcbiAgdmFyIGxhc3RIb3N0Q29tcG9uZW50ID0gbnVsbDsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UyID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTIuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UyLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICBsYXN0SG9zdENvbXBvbmVudCA9IHN0YXRlTm9kZTsgLy8gY3JlYXRlRXZlbnRIYW5kbGUgbGlzdGVuZXJzXG5cblxuICAgICAgaWYgKHJlYWN0RXZlbnROYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdEV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgbGFzdEhvc3RDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgYXJlIG9ubHkgYWNjdW11bGF0aW5nIGV2ZW50cyBmb3IgdGhlIHRhcmdldCwgdGhlbiB3ZSBkb24ndFxuICAgIC8vIGNvbnRpbnVlIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBSZWFjdCBmaWJlciB0cmVlIHRvIGZpbmQgb3RoZXJcbiAgICAvLyBsaXN0ZW5lcnMuXG5cblxuICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkge1xuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgb25CZWZvcmVCbHVyIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gdGFrZVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEJlZm9yZUlucHV0RXZlbnRQbHVnaW5cbi8vIC0gQ2hhbmdlRXZlbnRQbHVnaW5cbi8vIC0gU2VsZWN0RXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhlc2UgcGx1Z2luc1xuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzICh2aWEgZW11bGF0aW9uKS5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgJ0NhcHR1cmUnO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTMgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMy5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTMudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTmFtZSk7XG5cbiAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0TmFtZSk7XG5cbiAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICBpZiAoaW5zdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjsgLy8gVE9ETzogSWYgdGhpcyBpcyBhIEhvc3RSb290IHdlIG1pZ2h0IHdhbnQgdG8gYmFpbCBvdXQuXG4gICAgLy8gVGhhdCBpcyBkZXBlbmRpbmcgb24gaWYgd2Ugd2FudCBuZXN0ZWQgc3VidHJlZXMgKGxheWVycykgdG8gYnViYmxlXG4gICAgLy8gZXZlbnRzIHRvIHRoZWlyIHBhcmVudC4gV2UgY291bGQgYWxzbyBnbyB0aHJvdWdoIHBhcmVudE5vZGUgb24gdGhlXG4gICAgLy8gaG9zdCBub2RlIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgZG9lc24ndCBsZXQgdXNcbiAgICAvLyBkbyB0aGUgcG9ydGFsIGZlYXR1cmUuXG4gIH0gd2hpbGUgKGluc3QgJiYgaW5zdC50YWcgIT09IEhvc3RDb21wb25lbnQpO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICB2YXIgbm9kZUEgPSBpbnN0QTtcbiAgdmFyIG5vZGVCID0gaW5zdEI7XG4gIHZhciBkZXB0aEEgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBBID0gbm9kZUE7IHRlbXBBOyB0ZW1wQSA9IGdldFBhcmVudCh0ZW1wQSkpIHtcbiAgICBkZXB0aEErKztcbiAgfVxuXG4gIHZhciBkZXB0aEIgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBCID0gbm9kZUI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfSAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBkZXB0aEEtLTtcbiAgfSAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhCIC0gZGVwdGhBID4gMCkge1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgICBkZXB0aEItLTtcbiAgfSAvLyBXYWxrIGluIGxvY2tzdGVwIHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cblxuXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcblxuICB3aGlsZSAoZGVwdGgtLSkge1xuICAgIGlmIChub2RlQSA9PT0gbm9kZUIgfHwgbm9kZUIgIT09IG51bGwgJiYgbm9kZUEgPT09IG5vZGVCLmFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIG5vZGVBO1xuICAgIH1cblxuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBldmVudCwgdGFyZ2V0LCBjb21tb24sIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuX3JlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXQ7XG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgaWYgKGluc3RhbmNlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBfaW5zdGFuY2U0ID0gaW5zdGFuY2UsXG4gICAgICAgIGFsdGVybmF0ZSA9IF9pbnN0YW5jZTQuYWx0ZXJuYXRlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2U0LnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlNC50YWc7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoaXMgcGx1Z2luXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMuXG5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBlbnRlckV2ZW50LCBmcm9tLCB0bykge1xuICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51bGw7XG5cbiAgaWYgKGZyb20gIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGZyb20sIGNvbW1vbiwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHRvICE9PSBudWxsICYmIGVudGVyRXZlbnQgIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGVudGVyRXZlbnQsIHRvLCBjb21tb24sIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSArIFwiX19cIiArIChjYXB0dXJlID8gJ2NhcHR1cmUnIDogJ2J1YmJsZScpO1xufVxuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HID0gJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyc7XG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBBVVRPRk9DVVMgPSAnYXV0b0ZvY3VzJztcbnZhciBDSElMRFJFTiA9ICdjaGlsZHJlbic7XG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwkMSA9ICdfX2h0bWwnO1xudmFyIHdhcm5lZFVua25vd25UYWdzO1xudmFyIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQ7XG52YXIgd2FybkZvclByb3BEaWZmZXJlbmNlO1xudmFyIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXM7XG52YXIgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyO1xudmFyIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmc7XG52YXIgbm9ybWFsaXplSFRNTDtcblxue1xuICB3YXJuZWRVbmtub3duVGFncyA9IHtcbiAgICAvLyBUaGVyZSBhcmUgd29ya2luZyBwb2x5ZmlsbHMgZm9yIDxkaWFsb2c+LiBMZXQgcGVvcGxlIHVzZSBpdC5cbiAgICBkaWFsb2c6IHRydWUsXG4gICAgLy8gRWxlY3Ryb24gc2hpcHMgYSBjdXN0b20gPHdlYnZpZXc+IHRhZyB0byBkaXNwbGF5IGV4dGVybmFsIHdlYiBjb250ZW50IGluXG4gICAgLy8gYW4gaXNvbGF0ZWQgZnJhbWUgYW5kIHByb2Nlc3MuXG4gICAgLy8gVGhpcyB0YWcgaXMgbm90IHByZXNlbnQgaW4gbm9uIEVsZWN0cm9uIGVudmlyb25tZW50cyBzdWNoIGFzIEpTRG9tIHdoaWNoXG4gICAgLy8gaXMgb2Z0ZW4gdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICAvLyBAc2VlIGh0dHBzOi8vZWxlY3Ryb25qcy5vcmcvZG9jcy9hcGkvd2Vidmlldy10YWdcbiAgICB3ZWJ2aWV3OiB0cnVlXG4gIH07XG5cbiAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcykge1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCB7XG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOiByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lczogcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1xuICAgIH0pO1xuICB9OyAvLyBJRSAxMSBwYXJzZXMgJiBub3JtYWxpemVzIHRoZSBzdHlsZSBhdHRyaWJ1dGUgYXMgb3Bwb3NlZCB0byBvdGhlclxuICAvLyBicm93c2Vycy4gSXQgYWRkcyBzcGFjZXMgYW5kIHNvcnRzIHRoZSBwcm9wZXJ0aWVzIGluIHNvbWVcbiAgLy8gbm9uLWFscGhhYmV0aWNhbCBvcmRlci4gSGFuZGxpbmcgdGhhdCB3b3VsZCByZXF1aXJlIHNvcnRpbmcgQ1NTXG4gIC8vIHByb3BlcnRpZXMgaW4gdGhlIGNsaWVudCAmIHNlcnZlciB2ZXJzaW9ucyBvciBhcHBseWluZ1xuICAvLyBgZXhwZWN0ZWRTdHlsZWAgdG8gYSB0ZW1wb3JhcnkgRE9NIG5vZGUgdG8gcmVhZCBpdHMgYHN0eWxlYCBhdHRyaWJ1dGVcbiAgLy8gbm9ybWFsaXplZC4gU2luY2UgaXQgb25seSBhZmZlY3RzIElFLCB3ZSdyZSBza2lwcGluZyBzdHlsZSB3YXJuaW5nc1xuICAvLyBpbiB0aGF0IGJyb3dzZXIgY29tcGxldGVseSBpbiBmYXZvciBvZiBkb2luZyBhbGwgdGhhdCB3b3JrLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTgwN1xuXG5cbiAgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZyA9IGNhblVzZURPTSAmJiAhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuXG4gIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwcm9wTmFtZSwgc2VydmVyVmFsdWUsIGNsaWVudFZhbHVlKSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRWYWx1ZSk7XG4gICAgdmFyIG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJWYWx1ZSk7XG5cbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclZhbHVlID09PSBub3JtYWxpemVkQ2xpZW50VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignUHJvcCBgJXNgIGRpZCBub3QgbWF0Y2guIFNlcnZlcjogJXMgQ2xpZW50OiAlcycsIHByb3BOYW1lLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkU2VydmVyVmFsdWUpLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkQ2xpZW50VmFsdWUpKTtcbiAgfTtcblxuICB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWVzKSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuICAgIHZhciBuYW1lcyA9IFtdO1xuICAgIGF0dHJpYnV0ZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIG5hbWVzLnB1c2gobmFtZSk7XG4gICAgfSk7XG5cbiAgICBlcnJvcignRXh0cmEgYXR0cmlidXRlcyBmcm9tIHRoZSBzZXJ2ZXI6ICVzJywgbmFtZXMpO1xuICB9O1xuXG4gIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgIGlmIChsaXN0ZW5lciA9PT0gZmFsc2UpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGBmYWxzZWAuXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgJXNgIHR5cGUuJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICB9XG4gIH07IC8vIFBhcnNlIHRoZSBIVE1MIGFuZCByZWFkIGl0IGJhY2sgdG8gbm9ybWFsaXplIHRoZSBIVE1MIHN0cmluZyBzbyB0aGF0IGl0XG4gIC8vIGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc29uLlxuXG5cbiAgbm9ybWFsaXplSFRNTCA9IGZ1bmN0aW9uIChwYXJlbnQsIGh0bWwpIHtcbiAgICAvLyBXZSBjb3VsZCBoYXZlIGNyZWF0ZWQgYSBzZXBhcmF0ZSBkb2N1bWVudCBoZXJlIHRvIGF2b2lkXG4gICAgLy8gcmUtaW5pdGlhbGl6aW5nIGN1c3RvbSBlbGVtZW50cyBpZiB0aGV5IGV4aXN0LiBCdXQgdGhpcyBicmVha3NcbiAgICAvLyBob3cgPG5vc2NyaXB0PiBpcyBiZWluZyBoYW5kbGVkLiBTbyB3ZSB1c2UgdGhlIHNhbWUgZG9jdW1lbnQuXG4gICAgLy8gU2VlIHRoZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzExMTU3LlxuICAgIHZhciB0ZXN0RWxlbWVudCA9IHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFID8gcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChwYXJlbnQudGFnTmFtZSkgOiBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMocGFyZW50Lm5hbWVzcGFjZVVSSSwgcGFyZW50LnRhZ05hbWUpO1xuICAgIHRlc3RFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlc3RFbGVtZW50LmlubmVySFRNTDtcbiAgfTtcbn0gLy8gSFRNTCBwYXJzaW5nIG5vcm1hbGl6ZXMgQ1IgYW5kIENSTEYgdG8gTEYuXG4vLyBJdCBhbHNvIGNhbiB0dXJuIFxcdTAwMDAgaW50byBcXHVGRkZEIGluc2lkZSBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NpbmdsZS1wYWdlLmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtXG4vLyBJZiB3ZSBoYXZlIGEgbWlzbWF0Y2gsIGl0IG1pZ2h0IGJlIGNhdXNlZCBieSB0aGF0LlxuLy8gV2Ugd2lsbCBzdGlsbCBwYXRjaCB1cCBpbiB0aGlzIGNhc2UgYnV0IG5vdCBmaXJlIHRoZSB3YXJuaW5nLlxuXG5cbnZhciBOT1JNQUxJWkVfTkVXTElORVNfUkVHRVggPSAvXFxyXFxuPy9nO1xudmFyIE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCA9IC9cXHUwMDAwfFxcdUZGRkQvZztcblxuZnVuY3Rpb24gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKG1hcmt1cCkge1xuICB7XG4gICAgY2hlY2tIdG1sU3RyaW5nQ29lcmNpb24obWFya3VwKTtcbiAgfVxuXG4gIHZhciBtYXJrdXBTdHJpbmcgPSB0eXBlb2YgbWFya3VwID09PSAnc3RyaW5nJyA/IG1hcmt1cCA6ICcnICsgbWFya3VwO1xuICByZXR1cm4gbWFya3VwU3RyaW5nLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCAnXFxuJykucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsICcnKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHNlcnZlclRleHQsIGNsaWVudFRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgdmFyIG5vcm1hbGl6ZWRDbGllbnRUZXh0ID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFRleHQpO1xuICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG5cbiAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID09PSBub3JtYWxpemVkQ2xpZW50VGV4dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRXYXJuRGV2KSB7XG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RleHQgY29udGVudCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6IFwiJXNcIiBDbGllbnQ6IFwiJXNcIicsIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0LCBub3JtYWxpemVkQ2xpZW50VGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ29uY3VycmVudE1vZGUgJiYgZW5hYmxlQ2xpZW50UmVuZGVyRmFsbGJhY2tPblRleHRNaXNtYXRjaCkge1xuICAgIC8vIEluIGNvbmN1cnJlbnQgcm9vdHMsIHdlIHRocm93IHdoZW4gdGhlcmUncyBhIHRleHQgbWlzbWF0Y2ggYW5kIHJldmVydCB0b1xuICAgIC8vIGNsaWVudCByZW5kZXJpbmcsIHVwIHRvIHRoZSBuZWFyZXN0IFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgIHRocm93IG5ldyBFcnJvcignVGV4dCBjb250ZW50IGRvZXMgbm90IG1hdGNoIHNlcnZlci1yZW5kZXJlZCBIVE1MLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAvLyBKdXN0IHNldCBpdCB1c2luZyB0aGUgb25jbGljayBwcm9wZXJ0eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbWFuYWdlIGFueVxuICAvLyBib29ra2VlcGluZyBmb3IgaXQuIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2xlYXIgaXQgd2hlbiB0aGUgbGlzdGVuZXIgaXNcbiAgLy8gcmVtb3ZlZC5cbiAgLy8gVE9ETzogT25seSBkbyB0aGlzIGZvciB0aGUgcmVsZXZhbnQgU2FmYXJpcyBtYXliZT9cbiAgbm9kZS5vbmNsaWNrID0gbm9vcDtcbn1cblxuZnVuY3Rpb24gc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgbmV4dFByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBmb3IgKHZhciBwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuXG5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyBpbml0aWFsIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIDx0ZXh0YXJlYT4gd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSA8dGV4dGFyZWE+IHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIHZhciBjYW5TZXRUZXh0Q29udGVudCA9IHRhZyAhPT0gJ3RleHRhcmVhJyB8fCBuZXh0UHJvcCAhPT0gJyc7XG5cbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIC8vIFRPRE86IEhhbmRsZSB3YXNDdXN0b21Db21wb25lbnRUYWdcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVQYXlsb2FkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHByb3BLZXkgPSB1cGRhdGVQYXlsb2FkW2ldO1xuICAgIHZhciBwcm9wVmFsdWUgPSB1cGRhdGVQYXlsb2FkW2kgKyAxXTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIHByb3BWYWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVyRWxlbWVudCwgcGFyZW50TmFtZXNwYWNlKSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG5cbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICB2YXIgZG9tRWxlbWVudDtcbiAgdmFyIG5hbWVzcGFjZVVSSSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIG5hbWVzcGFjZVVSSSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAge1xuICAgICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcyk7IC8vIFNob3VsZCB0aGlzIGNoZWNrIGJlIGdhdGVkIGJ5IHBhcmVudCBuYW1lc3BhY2U/IE5vdCBzdXJlIHdlIHdhbnQgdG9cbiAgICAgIC8vIGFsbG93IDxTVkc+IG9yIDxtQVRIPi5cblxuICAgICAgaWYgKCFpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiB0eXBlICE9PSB0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgZXJyb3IoJzwlcyAvPiBpcyB1c2luZyBpbmNvcnJlY3QgY2FzaW5nLiAnICsgJ1VzZSBQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzLCAnICsgJ29yIGxvd2VyY2FzZSBmb3IgSFRNTCBlbGVtZW50cy4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgc2NyaXB0IHZpYSAuaW5uZXJIVE1MIHNvIGl0cyBcInBhcnNlci1pbnNlcnRlZFwiIGZsYWcgaXNcbiAgICAgIC8vIHNldCB0byB0cnVlIGFuZCBpdCBkb2VzIG5vdCBleGVjdXRlXG4gICAgICB2YXIgZGl2ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZGl2LmlubmVySFRNTCA9ICc8c2NyaXB0PjwnICsgJy9zY3JpcHQ+JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHlpZWxkIGEgc2NyaXB0IGVsZW1lbnQuXG5cbiAgICAgIHZhciBmaXJzdENoaWxkID0gZGl2LmZpcnN0Q2hpbGQ7XG4gICAgICBkb21FbGVtZW50ID0gZGl2LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gJEZsb3dJc3N1ZSBgY3JlYXRlRWxlbWVudGAgc2hvdWxkIGJlIHVwZGF0ZWQgZm9yIFdlYiBDb21wb25lbnRzXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUsIHtcbiAgICAgICAgaXM6IHByb3BzLmlzXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VwYXJhdGUgZWxzZSBicmFuY2ggaW5zdGVhZCBvZiB1c2luZyBgcHJvcHMuaXMgfHwgdW5kZWZpbmVkYCBhYm92ZSBiZWNhdXNlIG9mIGEgRmlyZWZveCBidWcuXG4gICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC82ODk2XG4gICAgICAvLyBhbmQgZGlzY3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc2MjQwXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOyAvLyBOb3JtYWxseSBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCBpbiBgc2V0SW5pdGlhbERPTVByb3BlcnRpZXNgLCBob3dldmVyIHRoZSBgbXVsdGlwbGVgIGFuZCBgc2l6ZWBcbiAgICAgIC8vIGF0dHJpYnV0ZXMgb24gYHNlbGVjdGBzIG5lZWRzIHRvIGJlIGFkZGVkIGJlZm9yZSBgb3B0aW9uYHMgYXJlIGluc2VydGVkLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50czpcbiAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIGRvZXMgbm90IHNjcm9sbCB0byB0aGUgY29ycmVjdCBvcHRpb24gYmVjYXVzZSBzaW5ndWxhclxuICAgICAgLy8gIGBzZWxlY3RgIGVsZW1lbnRzIGF1dG9tYXRpY2FsbHkgcGljayB0aGUgZmlyc3QgaXRlbSAjMTMyMjJcbiAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIHNldCB0aGUgZmlyc3QgaXRlbSBhcyBzZWxlY3RlZCBkZXNwaXRlIHRoZSBgc2l6ZWAgYXR0cmlidXRlICMxNDIzOVxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMyMjJcbiAgICAgIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MjM5XG5cbiAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICB2YXIgbm9kZSA9IGRvbUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgICAgbm9kZS5tdWx0aXBsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMuc2l6ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgYSBzaXplIGdyZWF0ZXIgdGhhbiAxIGNhdXNlcyBhIHNlbGVjdCB0byBiZWhhdmUgbGlrZSBgbXVsdGlwbGU9dHJ1ZWAsIHdoZXJlXG4gICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBubyBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYSBzZWxlY3QgaW4gXCJzaW5nbGUgc2VsZWN0aW9uIG1vZGVcIi5cbiAgICAgICAgICBub2RlLnNpemUgPSBwcm9wcy5zaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHR5cGUpO1xuICB9XG5cbiAge1xuICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIWhhc093blByb3BlcnR5LmNhbGwod2FybmVkVW5rbm93blRhZ3MsIHR5cGUpKSB7XG4gICAgICAgIHdhcm5lZFVua25vd25UYWdzW3R5cGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIHRhZyA8JXM+IGlzIHVucmVjb2duaXplZCBpbiB0aGlzIGJyb3dzZXIuICcgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIFJlYWN0IGNvbXBvbmVudCwgc3RhcnQgaXRzIG5hbWUgd2l0aCAnICsgJ2FuIHVwcGVyY2FzZSBsZXR0ZXIuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KS5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcbn1cbmZ1bmN0aW9uIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICB9IC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG5cblxuICB2YXIgcHJvcHM7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgIGNhc2UgJ2VtYmVkJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBsb2FkIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgYWxsIHRoZSBtZWRpYSBldmVudHMuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCd0b2dnbGUnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKTtcbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG59IC8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cblxuZnVuY3Rpb24gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICB2YXIgbGFzdFByb3BzO1xuICB2YXIgbmV4dFByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGxhc3RQcm9wcyA9IGxhc3RSYXdQcm9wcztcbiAgICAgIG5leHRQcm9wcyA9IG5leHRSYXdQcm9wcztcblxuICAgICAgaWYgKHR5cGVvZiBsYXN0UHJvcHMub25DbGljayAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbmV4dFByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIG5leHRQcm9wcyk7XG4gIHZhciBwcm9wS2V5O1xuICB2YXIgc3R5bGVOYW1lO1xuICB2YXIgc3R5bGVVcGRhdGVzID0gbnVsbDtcblxuICBmb3IgKHByb3BLZXkgaW4gbGFzdFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHZhciBsYXN0U3R5bGUgPSBsYXN0UHJvcHNbcHJvcEtleV07XG5cbiAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RTdHlsZSkge1xuICAgICAgICBpZiAobGFzdFN0eWxlLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwgfHwgcHJvcEtleSA9PT0gQ0hJTERSRU4pIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IEFVVE9GT0NVUykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgZmliZXIgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbGwgb3RoZXIgZGVsZXRlZCBwcm9wZXJ0aWVzIHdlIGFkZCBpdCB0byB0aGUgcXVldWUuIFdlIHVzZVxuICAgICAgLy8gdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBpbiB0aGUgY29tbWl0IHBoYXNlIGluc3RlYWQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcbiAgICB2YXIgbGFzdFByb3AgPSBsYXN0UHJvcHMgIT0gbnVsbCA/IGxhc3RQcm9wc1twcm9wS2V5XSA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IG5leHRQcm9wID09PSBsYXN0UHJvcCB8fCBuZXh0UHJvcCA9PSBudWxsICYmIGxhc3RQcm9wID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAvLyBGcmVlemUgdGhlIG5leHQgc3R5bGUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBiZVxuICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFByb3ApIHtcbiAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFVwZGF0ZSBzdHlsZXMgdGhhdCBjaGFuZ2VkIHNpbmNlIGBsYXN0UHJvcGAuXG5cblxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxhc3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cbiAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICBpZiAoIXVwZGF0ZVBheWxvYWQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkLnB1c2gocHJvcEtleSwgc3R5bGVVcGRhdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciBsYXN0SHRtbCA9IGxhc3RQcm9wID8gbGFzdFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGxhc3RIdG1sICE9PSBuZXh0SHRtbCkge1xuICAgICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0SHRtbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCAnJyArIG5leHRQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICAvLyBXZSBlYWdlcmx5IGxpc3RlbiB0byB0aGlzIGV2ZW4gdGhvdWdoIHdlIGhhdmVuJ3QgY29tbWl0dGVkIHlldC5cbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZVBheWxvYWQgJiYgbGFzdFByb3AgIT09IG5leHRQcm9wKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgdGhlIFwiY3VycmVudFwiIHByb3BzIHBvaW50ZXIgZ2V0cyB1cGRhdGVkIHNvIHdlIG5lZWQgYSBjb21taXRcbiAgICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYW55IG90aGVyIHByb3BlcnR5IHdlIGFsd2F5cyBhZGQgaXQgdG8gdGhlIHF1ZXVlIGFuZCB0aGVuIHdlXG4gICAgICAvLyBmaWx0ZXIgaXQgb3V0IHVzaW5nIHRoZSBhbGxvd2VkIHByb3BlcnR5IGxpc3QgZHVyaW5nIHRoZSBjb21taXQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbmV4dFByb3ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdHlsZVVwZGF0ZXMpIHtcbiAgICB7XG4gICAgICB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0UHJvcHNbU1RZTEVdKTtcbiAgICB9XG5cbiAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2goU1RZTEUsIHN0eWxlVXBkYXRlcyk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn0gLy8gQXBwbHkgdGhlIGRpZmYuXG5cbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcykge1xuICAvLyBVcGRhdGUgY2hlY2tlZCAqYmVmb3JlKiBuYW1lLlxuICAvLyBJbiB0aGUgbWlkZGxlIG9mIGFuIHVwZGF0ZSwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBjaGVja2VkLlxuICAvLyBXaGVuIGEgY2hlY2tlZCByYWRpbyB0cmllcyB0byBjaGFuZ2UgbmFtZSwgYnJvd3NlciBtYWtlcyBhbm90aGVyIHJhZGlvJ3MgY2hlY2tlZCBmYWxzZS5cbiAgaWYgKHRhZyA9PT0gJ2lucHV0JyAmJiBuZXh0UmF3UHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuZXh0UmF3UHJvcHMubmFtZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlQ2hlY2tlZChkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHdhc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbGFzdFJhd1Byb3BzKTtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCBuZXh0UmF3UHJvcHMpOyAvLyBBcHBseSB0aGUgZGlmZi5cblxuICB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpOyAvLyBUT0RPOiBFbnN1cmUgdGhhdCBhbiB1cGRhdGUgZ2V0cyBzY2hlZHVsZWQgaWYgYW55IG9mIHRoZSBzcGVjaWFsIHByb3BzXG4gIC8vIGNoYW5nZWQuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBVcGRhdGUgdGhlIHdyYXBwZXIgYXJvdW5kIGlucHV0cyAqYWZ0ZXIqIHVwZGF0aW5nIHByb3BzLiBUaGlzIGhhcyB0b1xuICAgICAgLy8gaGFwcGVuIGFmdGVyIGB1cGRhdGVET01Qcm9wZXJ0aWVzYC4gT3RoZXJ3aXNlIEhUTUw1IGlucHV0IHZhbGlkYXRpb25zXG4gICAgICAvLyByYWlzZSB3YXJuaW5ncyBhbmQgcHJldmVudCB0aGUgbmV3IHZhbHVlIGZyb20gYmVpbmcgYXNzaWduZWQuXG4gICAgICB1cGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHVwZGF0ZVdyYXBwZXIkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgLy8gPHNlbGVjdD4gdmFsdWUgdXBkYXRlIG5lZWRzIHRvIG9jY3VyIGFmdGVyIDxvcHRpb24+IGNoaWxkcmVuXG4gICAgICAvLyByZWNvbmNpbGlhdGlvblxuICAgICAgcG9zdFVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BOYW1lKSB7XG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBwcm9wTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCFwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXSB8fCBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVyRWxlbWVudCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldikge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWc7XG4gIHZhciBleHRyYUF0dHJpYnV0ZU5hbWVzO1xuXG4gIHtcbiAgICBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2NhbmNlbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2xvc2UnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgIGNhc2UgJ2VtYmVkJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBsb2FkIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGVycm9yIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHJhd1Byb3BzKTtcblxuICB7XG4gICAgZXh0cmFBdHRyaWJ1dGVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVzW19pXS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjaGVja2VkJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzZWxlY3RlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IHVzZSB0aGUgb3JpZ2luYWwgbmFtZS5cbiAgICAgICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMDY3Ni5cbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVzW19pXS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7XG5cbiAgZm9yICh2YXIgcHJvcEtleSBpbiByYXdQcm9wcykge1xuICAgIGlmICghcmF3UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXh0UHJvcCA9IHJhd1Byb3BzW3Byb3BLZXldO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICAvLyBGb3IgdGV4dCBjb250ZW50IGNoaWxkcmVuIHdlIGNvbXBhcmUgYWdhaW5zdCB0ZXh0Q29udGVudC4gVGhpc1xuICAgICAgLy8gbWlnaHQgbWF0Y2ggYWRkaXRpb25hbCBIVE1MIHRoYXQgaXMgaGlkZGVuIHdoZW4gd2UgcmVhZCBpdCB1c2luZ1xuICAgICAgLy8gdGV4dENvbnRlbnQuIEUuZy4gXCJmb29cIiB3aWxsIG1hdGNoIFwiZjxzcGFuPm9vPC9zcGFuPlwiIGJ1dCB0aGF0IHN0aWxsXG4gICAgICAvLyBzYXRpc2ZpZXMgb3VyIHJlcXVpcmVtZW50LiBPdXIgcmVxdWlyZW1lbnQgaXMgbm90IHRvIHByb2R1Y2UgcGVyZmVjdFxuICAgICAgLy8gSFRNTCBhbmQgYXR0cmlidXRlcy4gSWRlYWxseSB3ZSBzaG91bGQgcHJlc2VydmUgc3RydWN0dXJlIGJ1dCBpdCdzXG4gICAgICAvLyBvayBub3QgdG8gaWYgdGhlIHZpc2libGUgY29udGVudCBpcyBzdGlsbCBlbm91Z2ggdG8gaW5kaWNhdGUgd2hhdFxuICAgICAgLy8gZXZlbiBsaXN0ZW5lcnMgdGhlc2Ugbm9kZXMgbWlnaHQgYmUgd2lyZWQgdXAgdG8uXG4gICAgICAvLyBUT0RPOiBXYXJuIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBhIHNpbmdsZSB0ZXh0Tm9kZSBhcyBhIGNoaWxkLlxuICAgICAgLy8gVE9ETzogU2hvdWxkIHdlIHVzZSBkb21FbGVtZW50LmZpcnN0Q2hpbGQubm9kZVZhbHVlIHRvIGNvbXBhcmU/XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudC50ZXh0Q29udGVudCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSAnJyArIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCAnJyArIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2hvdWxkV2FybkRldiAmJiB0cnVlICYmIC8vIENvbnZpbmNlIEZsb3cgd2UndmUgY2FsY3VsYXRlZCBpdCAoaXQncyBERVYtb25seSBpbiB0aGlzIG1ldGhvZC4pXG4gICAgdHlwZW9mIGlzQ3VzdG9tQ29tcG9uZW50VGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHByb3BlcnRpZXMgY29ycmVzcG9uZCB0byB0aGVpciBleHBlY3RlZCB2YWx1ZXMuXG4gICAgICB2YXIgc2VydmVyVmFsdWUgPSB2b2lkIDA7XG4gICAgICB2YXIgcHJvcGVydHlJbmZvID0gaXNDdXN0b21Db21wb25lbnRUYWcgJiYgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA/IG51bGwgOiBnZXRQcm9wZXJ0eUluZm8ocHJvcEtleSk7XG5cbiAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gPT09IHRydWUpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HIHx8IC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICBwcm9wS2V5ID09PSAndmFsdWUnIHx8IHByb3BLZXkgPT09ICdjaGVja2VkJyB8fCBwcm9wS2V5ID09PSAnc2VsZWN0ZWQnKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZEhUTUwgIT09IHNlcnZlckhUTUwpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuXG4gICAgICAgIGlmIChjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkU3R5bGUgPSBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMobmV4dFByb3ApO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRTdHlsZSAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgZXhwZWN0ZWRTdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmICFlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0KSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRJZ25vcmVBdHRyaWJ1dGUocHJvcEtleSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgJiYgIXNob3VsZFJlbW92ZUF0dHJpYnV0ZShwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICAgICAgdmFyIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIG93bk5hbWVzcGFjZSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0YWcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgc3RhbmRhcmROYW1lID0gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcEtleSk7XG5cbiAgICAgICAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG51bGwgJiYgc3RhbmRhcmROYW1lICE9PSBwcm9wS2V5KSB7XG4gICAgICAgICAgICAgIC8vIElmIGFuIFNWRyBwcm9wIGlzIHN1cHBsaWVkIHdpdGggYmFkIGNhc2luZywgaXQgd2lsbFxuICAgICAgICAgICAgICAvLyBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkIGZyb20gSFRNTCwgYnV0IHdpbGwgcHJvZHVjZSBhIG1pc21hdGNoXG4gICAgICAgICAgICAgIC8vIChhbmQgd291bGQgYmUgaW5jb3JyZWN0bHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCkuXG4gICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGFscmVhZHkgd2FybiBhYm91dCBiYWQgY2FzaW5nIGVsc2V3aGVyZS5cbiAgICAgICAgICAgICAgLy8gU28gd2UnbGwgc2tpcCB0aGUgbWlzbGVhZGluZyBleHRyYSBtaXNtYXRjaCB3YXJuaW5nIGluIHRoaXMgY2FzZS5cbiAgICAgICAgICAgICAgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gdHJ1ZTsgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuXG4gICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHN0YW5kYXJkTmFtZSk7XG4gICAgICAgICAgICB9IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuXG4gICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkb250V2FybkN1c3RvbUVsZW1lbnQgPSBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ICA7XG5cbiAgICAgICAgaWYgKCFkb250V2FybkN1c3RvbUVsZW1lbnQgJiYgbmV4dFByb3AgIT09IHNlcnZlclZhbHVlICYmICFpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoc2hvdWxkV2FybkRldikge1xuICAgICAgaWYgKCAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLnNpemUgPiAwICYmIHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMoZXh0cmFBdHRyaWJ1dGVOYW1lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAvLyBGb3IgaW5wdXQgYW5kIHRleHRhcmVhIHdlIGN1cnJlbnQgYWx3YXlzIHNldCB0aGUgdmFsdWUgcHJvcGVydHkgYXRcbiAgICAgIC8vIHBvc3QgbW91bnQgdG8gZm9yY2UgaXQgdG8gZGl2ZXJnZSBmcm9tIGF0dHJpYnV0ZXMuIEhvd2V2ZXIsIGZvclxuICAgICAgLy8gb3B0aW9uIGFuZCBzZWxlY3Qgd2UgZG9uJ3QgcXVpdGUgZG8gdGhlIHNhbWUgdGhpbmcgYW5kIHNlbGVjdFxuICAgICAgLy8gaXMgbm90IHJlc2lsaWVudCB0byB0aGUgRE9NIHN0YXRlIGNoYW5naW5nIHNvIHdlIGRvbid0IGRvIHRoYXQgaGVyZS5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIG5vdCBkb2luZyB0aGlzIGZvciBpbnB1dCBhbmQgdGV4dGFyZWEuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHJhd1Byb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59XG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRUZXh0KHRleHROb2RlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHZhciBpc0RpZmZlcmVudCA9IHRleHROb2RlLm5vZGVWYWx1ZSAhPT0gdGV4dDtcbiAgcmV0dXJuIGlzRGlmZmVyZW50O1xufVxuZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnROb2RlLCBjaGlsZCkge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSA8JXM+IGluIDwlcz4uJywgY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBjaGlsZCkge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gdGhlIHRleHQgbm9kZSBcIiVzXCIgaW4gPCVzPi4nLCBjaGlsZC5ub2RlVmFsdWUsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnROb2RlLCB0YWcsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIDwlcz4gaW4gPCVzPi4nLCB0YWcsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KSB7XG4gIHtcbiAgICBpZiAodGV4dCA9PT0gJycpIHtcbiAgICAgIC8vIFdlIGV4cGVjdCB0byBpbnNlcnQgZW1wdHkgdGV4dCBub2RlcyBzaW5jZSB0aGV5J3JlIG5vdCByZXByZXNlbnRlZCBpblxuICAgICAgLy8gdGhlIEhUTUwuXG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBzcGVjaWFsIGNhc2UgaWYgd2UgY2FuIGp1c3QgYXZvaWQgaW5zZXJ0aW5nIGVtcHR5XG4gICAgICAvLyB0ZXh0IG5vZGVzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgdGV4dCBub2RlIGZvciBcIiVzXCIgaW4gPCVzPi4nLCB0ZXh0LCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMoZG9tRWxlbWVudCwgdGFnLCBwcm9wcykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuICB9XG59XG5cbnZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyBUaGlzIHZhbGlkYXRpb24gY29kZSB3YXMgd3JpdHRlbiBiYXNlZCBvbiB0aGUgSFRNTDUgcGFyc2luZyBzcGVjOlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuICAvL1xuICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGNhdGNoIGFsbCBpbnZhbGlkIG5lc3RpbmcsIG5vciBkb2VzIGl0IHRyeSB0byAoYXMgaXQnc1xuICAvLyBub3QgY2xlYXIgd2hhdCBwcmFjdGljYWwgYmVuZWZpdCBkb2luZyBzbyBwcm92aWRlcyk7IGluc3RlYWQsIHdlIHdhcm4gb25seVxuICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciB3aWxsIGdpdmUgYSBwYXJzZSB0cmVlIGRpZmZlcmluZyBmcm9tIHdoYXQgUmVhY3RcbiAgLy8gaW50ZW5kZWQuIEZvciBleGFtcGxlLCA8Yj48ZGl2PjwvZGl2PjwvYj4gaXMgaW52YWxpZCBidXQgd2UgZG9uJ3Qgd2FyblxuICAvLyBiZWNhdXNlIGl0IHN0aWxsIHBhcnNlcyBjb3JyZWN0bHk7IHdlIGRvIHdhcm4gZm9yIG90aGVyIGNhc2VzIGxpa2UgbmVzdGVkXG4gIC8vIDxwPiB0YWdzIHdoZXJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBlbGVtZW50IGltcGxpY2l0bHkgY2xvc2VzIHRoZVxuICAvLyBmaXJzdCwgY2F1c2luZyBhIGNvbmZ1c2luZyBtZXNzLlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNzcGVjaWFsXG4gIHZhciBzcGVjaWFsVGFncyA9IFsnYWRkcmVzcycsICdhcHBsZXQnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2Jhc2UnLCAnYmFzZWZvbnQnLCAnYmdzb3VuZCcsICdibG9ja3F1b3RlJywgJ2JvZHknLCAnYnInLCAnYnV0dG9uJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NvbCcsICdjb2xncm91cCcsICdkZCcsICdkZXRhaWxzJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZW1iZWQnLCAnZmllbGRzZXQnLCAnZmlnY2FwdGlvbicsICdmaWd1cmUnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnZnJhbWUnLCAnZnJhbWVzZXQnLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaWZyYW1lJywgJ2ltZycsICdpbnB1dCcsICdpc2luZGV4JywgJ2xpJywgJ2xpbmsnLCAnbGlzdGluZycsICdtYWluJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRhJywgJ25hdicsICdub2VtYmVkJywgJ25vZnJhbWVzJywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdvbCcsICdwJywgJ3BhcmFtJywgJ3BsYWludGV4dCcsICdwcmUnLCAnc2NyaXB0JywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NvdXJjZScsICdzdHlsZScsICdzdW1tYXJ5JywgJ3RhYmxlJywgJ3Rib2R5JywgJ3RkJywgJ3RlbXBsYXRlJywgJ3RleHRhcmVhJywgJ3Rmb290JywgJ3RoJywgJ3RoZWFkJywgJ3RpdGxlJywgJ3RyJywgJ3RyYWNrJywgJ3VsJywgJ3dicicsICd4bXAnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcblxuICB2YXIgaW5TY29wZVRhZ3MgPSBbJ2FwcGxldCcsICdjYXB0aW9uJywgJ2h0bWwnLCAndGFibGUnLCAndGQnLCAndGgnLCAnbWFycXVlZScsICdvYmplY3QnLCAndGVtcGxhdGUnLCAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50XG4gIC8vIFRPRE86IERpc3Rpbmd1aXNoIGJ5IG5hbWVzcGFjZSBoZXJlIC0tIGZvciA8dGl0bGU+LCBpbmNsdWRpbmcgaXQgaGVyZVxuICAvLyBlcnJzIG9uIHRoZSBzaWRlIG9mIGZld2VyIHdhcm5pbmdzXG4gICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tYnV0dG9uLXNjb3BlXG5cbiAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjZ2VuZXJhdGUtaW1wbGllZC1lbmQtdGFnc1xuXG4gIHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3AnLCAncnAnLCAncnQnXTtcbiAgdmFyIGVtcHR5QW5jZXN0b3JJbmZvID0ge1xuICAgIGN1cnJlbnQ6IG51bGwsXG4gICAgZm9ybVRhZzogbnVsbCxcbiAgICBhVGFnSW5TY29wZTogbnVsbCxcbiAgICBidXR0b25UYWdJblNjb3BlOiBudWxsLFxuICAgIG5vYnJUYWdJblNjb3BlOiBudWxsLFxuICAgIHBUYWdJbkJ1dHRvblNjb3BlOiBudWxsLFxuICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGxcbiAgfTtcblxuICB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKG9sZEluZm8sIHRhZykge1xuICAgIHZhciBhbmNlc3RvckluZm8gPSBhc3NpZ24oe30sIG9sZEluZm8gfHwgZW1wdHlBbmNlc3RvckluZm8pO1xuXG4gICAgdmFyIGluZm8gPSB7XG4gICAgICB0YWc6IHRhZ1xuICAgIH07XG5cbiAgICBpZiAoaW5TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBudWxsO1xuICAgIH0gLy8gU2VlIHJ1bGVzIGZvciAnbGknLCAnZGQnLCAnZHQnIHN0YXJ0IHRhZ3MgaW5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG5cblxuICAgIGlmIChzcGVjaWFsVGFncy5pbmRleE9mKHRhZykgIT09IC0xICYmIHRhZyAhPT0gJ2FkZHJlc3MnICYmIHRhZyAhPT0gJ2RpdicgJiYgdGFnICE9PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgfVxuXG4gICAgYW5jZXN0b3JJbmZvLmN1cnJlbnQgPSBpbmZvO1xuXG4gICAgaWYgKHRhZyA9PT0gJ2Zvcm0nKSB7XG4gICAgICBhbmNlc3RvckluZm8uZm9ybVRhZyA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2EnKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdidXR0b24nKSB7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ25vYnInKSB7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbGknKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2RkJyB8fCB0YWcgPT09ICdkdCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ySW5mbztcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cblxuXG4gIHZhciBpc1RhZ1ZhbGlkV2l0aFBhcmVudCA9IGZ1bmN0aW9uICh0YWcsIHBhcmVudFRhZykge1xuICAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBpZiB3ZSdyZSBpbiBhbiB1bnVzdWFsIHBhcnNpbmcgbW9kZS4uLlxuICAgIHN3aXRjaCAocGFyZW50VGFnKSB7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5zZWxlY3RcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJ29wdGdyb3VwJyB8fCB0YWcgPT09ICcjdGV4dCc7XG5cbiAgICAgIGNhc2UgJ29wdGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsIHNlZWluZyBhbiA8b3B0aW9uPiBkb2Vzbid0IG1lYW4gd2UncmUgaW4gYSA8c2VsZWN0PlxuICAgICAgLy8gYnV0XG5cbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50ZFxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY2FwdGlvblxuICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvciBzaW5jZSB0aGVzZSBydWxlcyBmYWxsIGJhY2sgdG8gXCJpbiBib2R5XCIgbW9kZSBmb3JcbiAgICAgIC8vIGFsbCBleGNlcHQgc3BlY2lhbCB0YWJsZSBub2RlcyB3aGljaCBjYXVzZSBiYWQgcGFyc2luZyBiZWhhdmlvciBhbnl3YXkuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50clxuXG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0aCcgfHwgdGFnID09PSAndGQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRib2R5XG5cbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RyJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jb2xncm91cFxuXG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjb2wnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRhYmxlXG5cbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NhcHRpb24nIHx8IHRhZyA9PT0gJ2NvbGdyb3VwJyB8fCB0YWcgPT09ICd0Ym9keScgfHwgdGFnID09PSAndGZvb3QnIHx8IHRhZyA9PT0gJ3RoZWFkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5oZWFkXG5cbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnYmFzZScgfHwgdGFnID09PSAnYmFzZWZvbnQnIHx8IHRhZyA9PT0gJ2Jnc291bmQnIHx8IHRhZyA9PT0gJ2xpbmsnIHx8IHRhZyA9PT0gJ21ldGEnIHx8IHRhZyA9PT0gJ3RpdGxlJyB8fCB0YWcgPT09ICdub3NjcmlwdCcgfHwgdGFnID09PSAnbm9mcmFtZXMnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlbWFudGljcy5odG1sI3RoZS1odG1sLWVsZW1lbnRcblxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdoZWFkJyB8fCB0YWcgPT09ICdib2R5JyB8fCB0YWcgPT09ICdmcmFtZXNldCc7XG5cbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2ZyYW1lJztcblxuICAgICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2h0bWwnO1xuICAgIH0gLy8gUHJvYmFibHkgaW4gdGhlIFwiaW4gYm9keVwiIHBhcnNpbmcgbW9kZSwgc28gd2Ugb3V0bGF3IG9ubHkgdGFnIGNvbWJvc1xuICAgIC8vIHdoZXJlIHRoZSBwYXJzaW5nIHJ1bGVzIGNhdXNlIGltcGxpY2l0IG9wZW5zIG9yIGNsb3NlcyB0byBiZSBhZGRlZC5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG5cblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgIT09ICdoMScgJiYgcGFyZW50VGFnICE9PSAnaDInICYmIHBhcmVudFRhZyAhPT0gJ2gzJyAmJiBwYXJlbnRUYWcgIT09ICdoNCcgJiYgcGFyZW50VGFnICE9PSAnaDUnICYmIHBhcmVudFRhZyAhPT0gJ2g2JztcblxuICAgICAgY2FzZSAncnAnOlxuICAgICAgY2FzZSAncnQnOlxuICAgICAgICByZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpID09PSAtMTtcblxuICAgICAgY2FzZSAnYm9keSc6XG4gICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2NvbCc6XG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICBjYXNlICdmcmFtZXNldCc6XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgY2FzZSAndGgnOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndHInOlxuICAgICAgICAvLyBUaGVzZSB0YWdzIGFyZSBvbmx5IHZhbGlkIHdpdGggYSBmZXcgcGFyZW50cyB0aGF0IGhhdmUgc3BlY2lhbCBjaGlsZFxuICAgICAgICAvLyBwYXJzaW5nIHJ1bGVzIC0tIGlmIHdlJ3JlIGRvd24gaGVyZSwgdGhlbiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kXG4gICAgICAgIC8vIHNvIHdlIGFsbG93IGl0IG9ubHkgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBwYXJlbnQgaXMsIGFzIGFsbCBvdGhlclxuICAgICAgICAvLyBjYXNlcyBhcmUgaW52YWxpZC5cbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyA9PSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcgPSBmdW5jdGlvbiAodGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnYWRkcmVzcyc6XG4gICAgICBjYXNlICdhcnRpY2xlJzpcbiAgICAgIGNhc2UgJ2FzaWRlJzpcbiAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOlxuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGNhc2UgJ2Rpcic6XG4gICAgICBjYXNlICdkaXYnOlxuICAgICAgY2FzZSAnZGwnOlxuICAgICAgY2FzZSAnZmllbGRzZXQnOlxuICAgICAgY2FzZSAnZmlnY2FwdGlvbic6XG4gICAgICBjYXNlICdmaWd1cmUnOlxuICAgICAgY2FzZSAnZm9vdGVyJzpcbiAgICAgIGNhc2UgJ2hlYWRlcic6XG4gICAgICBjYXNlICdoZ3JvdXAnOlxuICAgICAgY2FzZSAnbWFpbic6XG4gICAgICBjYXNlICdtZW51JzpcbiAgICAgIGNhc2UgJ25hdic6XG4gICAgICBjYXNlICdvbCc6XG4gICAgICBjYXNlICdwJzpcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxuICAgICAgY2FzZSAnc3VtbWFyeSc6XG4gICAgICBjYXNlICd1bCc6XG4gICAgICBjYXNlICdwcmUnOlxuICAgICAgY2FzZSAnbGlzdGluZyc6XG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICBjYXNlICdocic6XG4gICAgICBjYXNlICd4bXAnOlxuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5mb3JtVGFnIHx8IGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnbGknOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2RkJzpcbiAgICAgIGNhc2UgJ2R0JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdhJzpcbiAgICAgICAgLy8gU3BlYyBzYXlzIHNvbWV0aGluZyBhYm91dCBzdG9yaW5nIGEgbGlzdCBvZiBtYXJrZXJzLCBidXQgaXQgc291bmRzXG4gICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhpcyBjaGVjay5cbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnbm9icic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgdmFyIGRpZFdhcm4kMSA9IHt9O1xuXG4gIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uIChjaGlsZFRhZywgY2hpbGRUZXh0LCBhbmNlc3RvckluZm8pIHtcbiAgICBhbmNlc3RvckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87XG4gICAgdmFyIHBhcmVudEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDtcbiAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZztcblxuICAgIGlmIChjaGlsZFRleHQgIT0gbnVsbCkge1xuICAgICAgaWYgKGNoaWxkVGFnICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZzogd2hlbiBjaGlsZFRleHQgaXMgcGFzc2VkLCBjaGlsZFRhZyBzaG91bGQgYmUgbnVsbCcpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZFRhZyA9ICcjdGV4dCc7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWRQYXJlbnQgPSBpc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGlsZFRhZywgcGFyZW50VGFnKSA/IG51bGwgOiBwYXJlbnRJbmZvO1xuICAgIHZhciBpbnZhbGlkQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgdmFyIGludmFsaWRQYXJlbnRPckFuY2VzdG9yID0gaW52YWxpZFBhcmVudCB8fCBpbnZhbGlkQW5jZXN0b3I7XG5cbiAgICBpZiAoIWludmFsaWRQYXJlbnRPckFuY2VzdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGFuY2VzdG9yVGFnID0gaW52YWxpZFBhcmVudE9yQW5jZXN0b3IudGFnO1xuICAgIHZhciB3YXJuS2V5ID0gISFpbnZhbGlkUGFyZW50ICsgJ3wnICsgY2hpbGRUYWcgKyAnfCcgKyBhbmNlc3RvclRhZztcblxuICAgIGlmIChkaWRXYXJuJDFbd2FybktleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuJDFbd2FybktleV0gPSB0cnVlO1xuICAgIHZhciB0YWdEaXNwbGF5TmFtZSA9IGNoaWxkVGFnO1xuICAgIHZhciB3aGl0ZXNwYWNlSW5mbyA9ICcnO1xuXG4gICAgaWYgKGNoaWxkVGFnID09PSAnI3RleHQnKSB7XG4gICAgICBpZiAoL1xcUy8udGVzdChjaGlsZFRleHQpKSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1RleHQgbm9kZXMnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnV2hpdGVzcGFjZSB0ZXh0IG5vZGVzJztcbiAgICAgICAgd2hpdGVzcGFjZUluZm8gPSBcIiBNYWtlIHN1cmUgeW91IGRvbid0IGhhdmUgYW55IGV4dHJhIHdoaXRlc3BhY2UgYmV0d2VlbiB0YWdzIG9uIFwiICsgJ2VhY2ggbGluZSBvZiB5b3VyIHNvdXJjZSBjb2RlLic7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJzwnICsgY2hpbGRUYWcgKyAnPic7XG4gICAgfVxuXG4gICAgaWYgKGludmFsaWRQYXJlbnQpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgIGlmIChhbmNlc3RvclRhZyA9PT0gJ3RhYmxlJyAmJiBjaGlsZFRhZyA9PT0gJ3RyJykge1xuICAgICAgICBpbmZvICs9ICcgQWRkIGEgPHRib2R5PiwgPHRoZWFkPiBvciA8dGZvb3Q+IHRvIHlvdXIgY29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5ICcgKyAndGhlIGJyb3dzZXIuJztcbiAgICAgIH1cblxuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgY2hpbGQgb2YgPCVzPi4lcyVzJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnLCB3aGl0ZXNwYWNlSW5mbywgaW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGRlc2NlbmRhbnQgb2YgJyArICc8JXM+LicsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZyk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMSA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnO1xudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xudmFyIFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSA9ICckPyc7XG52YXIgU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSA9ICckISc7XG52YXIgU1RZTEUkMSA9ICdzdHlsZSc7XG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZTtcbiAgdmFyIG5hbWVzcGFjZTtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuXG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlIERPQ1VNRU5UX05PREU6XG4gICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxuICAgICAge1xuICAgICAgICB0eXBlID0gbm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyAnI2RvY3VtZW50JyA6ICcjZnJhZ21lbnQnO1xuICAgICAgICB2YXIgcm9vdCA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIG5hbWVzcGFjZSA9IHJvb3QgPyByb290Lm5hbWVzcGFjZVVSSSA6IGdldENoaWxkTmFtZXNwYWNlKG51bGwsICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJJbnN0YW5jZS5wYXJlbnROb2RlIDogcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gY29udGFpbmVyLm5hbWVzcGFjZVVSSSB8fCBudWxsO1xuICAgICAgICB0eXBlID0gY29udGFpbmVyLnRhZ05hbWU7XG4gICAgICAgIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKG93bk5hbWVzcGFjZSwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgdmFsaWRhdGVkVGFnKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKHBhcmVudEhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZSwgdHlwZSk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgdmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcblxuICBzZXRFbmFibGVkKGZhbHNlKTtcbiAgcmV0dXJuIGFjdGl2ZUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcmVzZXRBZnRlckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIHJlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uSW5mb3JtYXRpb24pO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgLy8gVE9ETzogdGFrZSBuYW1lc3BhY2UgaW50byBhY2NvdW50IHdoZW4gdmFsaWRhdGluZy5cbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcodHlwZSwgbnVsbCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuXG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG5cbiAgdmFyIGRvbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIHBhcmVudE5hbWVzcGFjZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGRvbUVsZW1lbnQpO1xuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVVwZGF0ZShkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuXG4gICAgaWYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiAhPT0gdHlwZW9mIG9sZFByb3BzLmNoaWxkcmVuICYmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgc3RyaW5nID0gJycgKyBuZXdQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBvd25BbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaWZmUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpO1xufVxuZnVuY3Rpb24gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0YXJlYScgfHwgdHlwZSA9PT0gJ25vc2NyaXB0JyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09PSAnb2JqZWN0JyAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHRJbnN0YW5jZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgdGV4dCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcbiAgfVxuXG4gIHZhciB0ZXh0Tm9kZSA9IGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHRleHROb2RlKTtcbiAgcmV0dXJuIHRleHROb2RlO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkoKSB7XG4gIHZhciBjdXJyZW50RXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG5cbiAgaWYgKGN1cnJlbnRFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgcmV0dXJuIGdldEV2ZW50UHJpb3JpdHkoY3VycmVudEV2ZW50LnR5cGUpO1xufVxuLy8gaWYgYSBjb21wb25lbnQganVzdCBpbXBvcnRzIFJlYWN0RE9NIChlLmcuIGZvciBmaW5kRE9NTm9kZSkuXG4vLyBTb21lIGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBzZXRUaW1lb3V0IG9yIGNsZWFyVGltZW91dC5cblxudmFyIHNjaGVkdWxlVGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBjYW5jZWxUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBub1RpbWVvdXQgPSAtMTtcbnZhciBsb2NhbFByb21pc2UgPSB0eXBlb2YgUHJvbWlzZSA9PT0gJ2Z1bmN0aW9uJyA/IFByb21pc2UgOiB1bmRlZmluZWQ7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBzY2hlZHVsZU1pY3JvdGFzayA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJyA/IHF1ZXVlTWljcm90YXNrIDogdHlwZW9mIGxvY2FsUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGxvY2FsUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGhhbmRsZUVycm9ySW5OZXh0VGljayk7XG59IDogc2NoZWR1bGVUaW1lb3V0OyAvLyBUT0RPOiBEZXRlcm1pbmUgdGhlIGJlc3QgZmFsbGJhY2sgaGVyZS5cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3JJbk5leHRUaWNrKGVycm9yKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY29tbWl0TW91bnQoZG9tRWxlbWVudCwgdHlwZSwgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgLy8gRGVzcGl0ZSB0aGUgbmFtaW5nIHRoYXQgbWlnaHQgaW1wbHkgb3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCBvbmx5XG4gIC8vIGZpcmVzIGlmIHRoZXJlIGlzIGFuIGBVcGRhdGVgIGVmZmVjdCBzY2hlZHVsZWQgZHVyaW5nIG1vdW50aW5nLlxuICAvLyBUaGlzIGhhcHBlbnMgaWYgYGZpbmFsaXplSW5pdGlhbENoaWxkcmVuYCByZXR1cm5zIGB0cnVlYCAod2hpY2ggaXRcbiAgLy8gZG9lcyB0byBpbXBsZW1lbnQgdGhlIGBhdXRvRm9jdXNgIGF0dHJpYnV0ZSBvbiB0aGUgY2xpZW50KS4gQnV0XG4gIC8vIHRoZXJlIGFyZSBhbHNvIG90aGVyIGNhc2VzIHdoZW4gdGhpcyBtaWdodCBoYXBwZW4gKHN1Y2ggYXMgcGF0Y2hpbmdcbiAgLy8gdXAgdGV4dCBjb250ZW50IGR1cmluZyBoeWRyYXRpb24gbWlzbWF0Y2gpLiBTbyB3ZSdsbCBjaGVjayB0aGlzIGFnYWluLlxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdidXR0b24nOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGlmIChuZXdQcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgICAgZG9tRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAge1xuICAgICAgICBpZiAobmV3UHJvcHMuc3JjKSB7XG4gICAgICAgICAgZG9tRWxlbWVudC5zcmMgPSBuZXdQcm9wcy5zcmM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbW1pdFVwZGF0ZShkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIERPTSBub2RlLlxuICB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7IC8vIFVwZGF0ZSB0aGUgcHJvcHMgaGFuZGxlIHNvIHRoYXQgd2Uga25vdyB3aGljaCBwcm9wcyBhcmUgdGhlIG9uZXMgd2l0aFxuICAvLyB3aXRoIGN1cnJlbnQgZXZlbnQgaGFuZGxlcnMuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiByZXNldFRleHRDb250ZW50KGRvbUVsZW1lbnQpIHtcbiAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycpO1xufVxuZnVuY3Rpb24gY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IG5ld1RleHQ7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihjb250YWluZXIsIGNoaWxkKSB7XG4gIHZhciBwYXJlbnROb2RlO1xuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgY29udGFpbmVyKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnROb2RlID0gY29udGFpbmVyO1xuICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICB9IC8vIFRoaXMgY29udGFpbmVyIG1pZ2h0IGJlIHVzZWQgZm9yIGEgcG9ydGFsLlxuICAvLyBJZiBzb21ldGhpbmcgaW5zaWRlIGEgcG9ydGFsIGlzIGNsaWNrZWQsIHRoYXQgY2xpY2sgc2hvdWxkIGJ1YmJsZVxuICAvLyB0aHJvdWdoIHRoZSBSZWFjdCB0cmVlLiBIb3dldmVyLCBvbiBNb2JpbGUgU2FmYXJpIHRoZSBjbGljayB3b3VsZFxuICAvLyBuZXZlciBidWJibGUgdGhyb3VnaCB0aGUgKkRPTSogdHJlZSB1bmxlc3MgYW4gYW5jZXN0b3Igd2l0aCBvbmNsaWNrXG4gIC8vIGV2ZW50IGV4aXN0cy4gU28gd2Ugd291bGRuJ3Qgc2VlIGl0IGFuZCBkaXNwYXRjaCBpdC5cbiAgLy8gVGhpcyBpcyB3aHkgd2UgZW5zdXJlIHRoYXQgbm9uIFJlYWN0IHJvb3QgY29udGFpbmVycyBoYXZlIGlubGluZSBvbmNsaWNrXG4gIC8vIGRlZmluZWQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE5MThcblxuXG4gIHZhciByZWFjdFJvb3RDb250YWluZXIgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcblxuICBpZiAoKHJlYWN0Um9vdENvbnRhaW5lciA9PT0gbnVsbCB8fCByZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZCkgJiYgcGFyZW50Tm9kZS5vbmNsaWNrID09PSBudWxsKSB7XG4gICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChwYXJlbnROb2RlKTtcbiAgfVxufVxuZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKHBhcmVudEluc3RhbmNlLCBjaGlsZCwgYmVmb3JlQ2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG59XG5mdW5jdGlvbiBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShjb250YWluZXIsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihjb250YWluZXIsIGNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnkocGFyZW50SW5zdGFuY2UsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlOyAvLyBEZWxldGUgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIGRvIHtcbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5vZGUpO1xuXG4gICAgaWYgKG5leHROb2RlICYmIG5leHROb2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbmV4dE5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5leHROb2RlKTsgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG4gICAgICAgICAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9IHdoaWxlIChub2RlKTsgLy8gVE9ETzogV2Fybiwgd2UgZGlkbid0IGZpbmQgdGhlIGVuZCBjb21tZW50IGJvdW5kYXJ5LlxuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cblxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihjb250YWluZXIsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lci5wYXJlbnROb2RlLCBzdXNwZW5zZUluc3RhbmNlKTtcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShjb250YWluZXIsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuXG4gIHJldHJ5SWZCbG9ja2VkT24oY29udGFpbmVyKTtcbn1cbmZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgYWxsIGVsZW1lbnQgdHlwZXM/IFdoYXQgYWJvdXQgTWF0aE1MPyBTaG91bGQgd2VcbiAgLy8gcGFzcyBob3N0IGNvbnRleHQgdG8gdGhpcyBtZXRob2Q/XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZSA9IGluc3RhbmNlLnN0eWxlO1xuXG4gIGlmICh0eXBlb2Ygc3R5bGUuc2V0UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlKSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSAnJztcbn1cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEUkMV07XG4gIHZhciBkaXNwbGF5ID0gc3R5bGVQcm9wICE9PSB1bmRlZmluZWQgJiYgc3R5bGVQcm9wICE9PSBudWxsICYmIHN0eWxlUHJvcC5oYXNPd25Qcm9wZXJ0eSgnZGlzcGxheScpID8gc3R5bGVQcm9wLmRpc3BsYXkgOiBudWxsO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZSgnZGlzcGxheScsIGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjb250YWluZXIudGV4dENvbnRlbnQgPSAnJztcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICBpZiAoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycgfHwgaW5zdGFuY2Uubm9kZVR5cGUgIT09IFRFWFRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgdGV4dCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHN1c3BlbnNlIG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEE7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQTtcbn1cbmZ1bmN0aW9uIGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhpbnN0YW5jZSkge1xuICB2YXIgZGF0YXNldCA9IGluc3RhbmNlLm5leHRTaWJsaW5nICYmIGluc3RhbmNlLm5leHRTaWJsaW5nLmRhdGFzZXQ7XG4gIHZhciBkaWdlc3QsIG1lc3NhZ2UsIHN0YWNrO1xuXG4gIGlmIChkYXRhc2V0KSB7XG4gICAgZGlnZXN0ID0gZGF0YXNldC5kZ3N0O1xuXG4gICAge1xuICAgICAgbWVzc2FnZSA9IGRhdGFzZXQubXNnO1xuICAgICAgc3RhY2sgPSBkYXRhc2V0LnN0Y2s7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgZGlnZXN0OiBkaWdlc3QsXG4gICAgICBzdGFjazogc3RhY2tcbiAgICB9O1xuICB9IC8vIGxldCB2YWx1ZSA9IHttZXNzYWdlOiB1bmRlZmluZWQsIGhhc2g6IHVuZGVmaW5lZH07XG4gIC8vIGNvbnN0IG5leHRTaWJsaW5nID0gaW5zdGFuY2UubmV4dFNpYmxpbmc7XG4gIC8vIGlmIChuZXh0U2libGluZykge1xuICAvLyAgIGNvbnN0IGRhdGFzZXQgPSAoKG5leHRTaWJsaW5nOiBhbnkpOiBIVE1MVGVtcGxhdGVFbGVtZW50KS5kYXRhc2V0O1xuICAvLyAgIHZhbHVlLm1lc3NhZ2UgPSBkYXRhc2V0Lm1zZztcbiAgLy8gICB2YWx1ZS5oYXNoID0gZGF0YXNldC5oYXNoO1xuICAvLyAgIGlmICh0cnVlKSB7XG4gIC8vICAgICB2YWx1ZS5zdGFjayA9IGRhdGFzZXQuc3RhY2s7XG4gIC8vICAgfVxuICAvLyB9XG4gIC8vIHJldHVybiB2YWx1ZTtcblxufVxuZnVuY3Rpb24gcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoaW5zdGFuY2UsIGNhbGxiYWNrKSB7XG4gIGluc3RhbmNlLl9yZWFjdFJldHJ5ID0gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHtcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuXG4gICAgaWYgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBub2RlRGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlRGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShwYXJlbnRDb250YWluZXIuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLm5leHRTaWJsaW5nKTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgaW5zdGFuY2UpOyAvLyBUT0RPOiBQb3NzaWJseSBkZWZlciB0aGlzIHVudGlsIHRoZSBjb21taXQgcGhhc2Ugd2hlcmUgYWxsIHRoZSBldmVudHNcbiAgLy8gZ2V0IGF0dGFjaGVkLlxuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoaW5zdGFuY2UsIHByb3BzKTtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9IC8vIFRPRE86IFRlbXBvcmFyeSBoYWNrIHRvIGNoZWNrIGlmIHdlJ3JlIGluIGEgY29uY3VycmVudCByb290LiBXZSBjYW4gZGVsZXRlXG4gIC8vIHdoZW4gdGhlIGxlZ2FjeSByb290IEFQSSBpcyByZW1vdmVkLlxuXG5cbiAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVySW5zdGFuY2UsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dEluc3RhbmNlKTsgLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cbiAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRUZXh0KHRleHRJbnN0YW5jZSwgdGV4dCk7XG59XG5mdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfSAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG5cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gUmV0dXJucyB0aGUgU3VzcGVuc2VJbnN0YW5jZSBpZiB0aGlzIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuLy8gU3VzcGVuc2VJbnN0YW5jZS4gSS5lLiBpZiBpdHMgcHJldmlvdXMgc2libGluZyBpcyBhIENvbW1lbnQgd2l0aFxuLy8gU1VTUEVOU0VfeF9TVEFSVF9EQVRBLiBPdGhlcndpc2UsIG51bGwuXG5cbmZ1bmN0aW9uIGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0SW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMocGFyZW50VHlwZSkge1xuICByZXR1cm4gcGFyZW50VHlwZSAhPT0gJ2hlYWQnICYmIHBhcmVudFR5cGUgIT09ICdib2R5Jztcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICBjaGVja0ZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLm5vZGVWYWx1ZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBkaWROb3RNYXRjaEh5ZHJhdGVkVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIGlmIChwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgIHZhciBzaG91bGRXYXJuRGV2ID0gdHJ1ZTtcbiAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLm5vZGVWYWx1ZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcblxuICAgIGlmIChwYXJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Q29udGFpbmVyLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0ZXh0KSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnROb2RlLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCB0ZXh0KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudEluc3RhbmNlLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRJbnN0YW5jZSwgdGV4dCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAge1xuICAgIC8vIFRPRE86IFRoaXMgZ2V0cyBsb2dnZWQgYnkgb25SZWNvdmVyYWJsZUVycm9yLCB0b28sIHNvIHdlIHNob3VsZCBiZVxuICAgIC8vIGFibGUgdG8gcmVtb3ZlIGl0LlxuICAgIGVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaHlkcmF0aW9uLiBUaGUgc2VydmVyIEhUTUwgd2FzIHJlcGxhY2VkIHdpdGggY2xpZW50IGNvbnRlbnQgaW4gPCVzPi4nLCBwYXJlbnRDb250YWluZXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVQb3J0YWxNb3VudChwb3J0YWxJbnN0YW5jZSkge1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhwb3J0YWxJbnN0YW5jZSk7XG59XG5cbnZhciByYW5kb21LZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcbnZhciBpbnRlcm5hbEluc3RhbmNlS2V5ID0gJ19fcmVhY3RGaWJlciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsUHJvcHNLZXkgPSAnX19yZWFjdFByb3BzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleSA9ICdfX3JlYWN0Q29udGFpbmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5ID0gJ19fcmVhY3RFdmVudHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlckxpc3RlbmVyc0tleSA9ICdfX3JlYWN0TGlzdGVuZXJzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXkgPSAnX19yZWFjdEhhbmRsZXMkJyArIHJhbmRvbUtleTtcbmZ1bmN0aW9uIGRldGFjaERlbGV0ZWRJbnN0YW5jZShub2RlKSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb24gaG9zdCBjb21wb25lbnRzLiBJIGRvbid0IHRoaW5rIGFsbCBvZlxuICAvLyB0aGVzZSBmaWVsZHMgYXJlIHJlbGV2YW50LlxuICBkZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxQcm9wc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXldO1xufVxuZnVuY3Rpb24gcHJlY2FjaGVGaWJlck5vZGUoaG9zdEluc3QsIG5vZGUpIHtcbiAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGhvc3RJbnN0O1xufVxuZnVuY3Rpb24gbWFya0NvbnRhaW5lckFzUm9vdChob3N0Um9vdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gaG9zdFJvb3Q7XG59XG5mdW5jdGlvbiB1bm1hcmtDb250YWluZXJBc1Jvb3Qobm9kZSkge1xuICBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzQ29udGFpbmVyTWFya2VkQXNSb290KG5vZGUpIHtcbiAgcmV0dXJuICEhbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XTtcbn0gLy8gR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBjbG9zZXN0IEhvc3RDb21wb25lbnQgb3IgSG9zdFRleHQgZmliZXIgYW5jZXN0b3IuXG4vLyBJZiB0aGUgdGFyZ2V0IG5vZGUgaXMgcGFydCBvZiBhIGh5ZHJhdGVkIG9yIG5vdCB5ZXQgcmVuZGVyZWQgc3VidHJlZSwgdGhlblxuLy8gdGhpcyBtYXkgYWxzbyByZXR1cm4gYSBTdXNwZW5zZUNvbXBvbmVudCBvciBIb3N0Um9vdCB0byBpbmRpY2F0ZSB0aGF0LlxuLy8gQ29uY2VwdHVhbGx5IHRoZSBIb3N0Um9vdCBmaWJlciBpcyBhIGNoaWxkIG9mIHRoZSBDb250YWluZXIgbm9kZS4gU28gaWYgeW91XG4vLyBwYXNzIHRoZSBDb250YWluZXIgbm9kZSBhcyB0aGUgdGFyZ2V0Tm9kZSwgeW91IHdpbGwgbm90IGFjdHVhbGx5IGdldCB0aGVcbi8vIEhvc3RSb290IGJhY2suIFRvIGdldCB0byB0aGUgSG9zdFJvb3QsIHlvdSBuZWVkIHRvIHBhc3MgYSBjaGlsZCBvZiBpdC5cbi8vIFRoZSBzYW1lIHRoaW5nIGFwcGxpZXMgdG8gU3VzcGVuc2UgYm91bmRhcmllcy5cblxuZnVuY3Rpb24gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0Tm9kZSkge1xuICB2YXIgdGFyZ2V0SW5zdCA9IHRhcmdldE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgaWYgKHRhcmdldEluc3QpIHtcbiAgICAvLyBEb24ndCByZXR1cm4gSG9zdFJvb3Qgb3IgU3VzcGVuc2VDb21wb25lbnQgaGVyZS5cbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfSAvLyBJZiB0aGUgZGlyZWN0IGV2ZW50IHRhcmdldCBpc24ndCBhIFJlYWN0IG93bmVkIERPTSBub2RlLCB3ZSBuZWVkIHRvIGxvb2tcbiAgLy8gdG8gc2VlIGlmIG9uZSBvZiBpdHMgcGFyZW50cyBpcyBhIFJlYWN0IG93bmVkIERPTSBub2RlLlxuXG5cbiAgdmFyIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG5cbiAgd2hpbGUgKHBhcmVudE5vZGUpIHtcbiAgICAvLyBXZSdsbCBjaGVjayBpZiB0aGlzIGlzIGEgY29udGFpbmVyIHJvb3QgdGhhdCBjb3VsZCBpbmNsdWRlXG4gICAgLy8gUmVhY3Qgbm9kZXMgaW4gdGhlIGZ1dHVyZS4gV2UgbmVlZCB0byBjaGVjayB0aGlzIGZpcnN0IGJlY2F1c2VcbiAgICAvLyBpZiB3ZSdyZSBhIGNoaWxkIG9mIGEgZGVoeWRyYXRlZCBjb250YWluZXIsIHdlIG5lZWQgdG8gZmlyc3RcbiAgICAvLyBmaW5kIHRoYXQgaW5uZXIgY29udGFpbmVyIGJlZm9yZSBtb3Zpbmcgb24gdG8gZmluZGluZyB0aGUgcGFyZW50XG4gICAgLy8gaW5zdGFuY2UuIE5vdGUgdGhhdCB3ZSBkb24ndCBjaGVjayB0aGlzIGZpZWxkIG9uICB0aGUgdGFyZ2V0Tm9kZVxuICAgIC8vIGl0c2VsZiBiZWNhdXNlIHRoZSBmaWJlcnMgYXJlIGNvbmNlcHR1YWxseSBiZXR3ZWVuIHRoZSBjb250YWluZXJcbiAgICAvLyBub2RlIGFuZCB0aGUgZmlyc3QgY2hpbGQuIEl0IGlzbid0IHN1cnJvdW5kaW5nIHRoZSBjb250YWluZXIgbm9kZS5cbiAgICAvLyBJZiBpdCdzIG5vdCBhIGNvbnRhaW5lciwgd2UgY2hlY2sgaWYgaXQncyBhbiBpbnN0YW5jZS5cbiAgICB0YXJnZXRJbnN0ID0gcGFyZW50Tm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSB8fCBwYXJlbnROb2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gICAgaWYgKHRhcmdldEluc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgd2Fzbid0IHRoZSBkaXJlY3QgdGFyZ2V0IG9mIHRoZSBldmVudCwgd2UgbWlnaHQgaGF2ZVxuICAgICAgLy8gc3RlcHBlZCBwYXN0IGRlaHlkcmF0ZWQgRE9NIG5vZGVzIHRvIGdldCBoZXJlLiBIb3dldmVyIHRoZXkgY291bGRcbiAgICAgIC8vIGFsc28gaGF2ZSBiZWVuIG5vbi1SZWFjdCBub2Rlcy4gV2UgbmVlZCB0byBhbnN3ZXIgd2hpY2ggb25lLlxuICAgICAgLy8gSWYgd2UgdGhlIGluc3RhbmNlIGRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGRyZW4sIHRoZW4gdGhlcmUgY2FuJ3QgYmVcbiAgICAgIC8vIGEgbmVzdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IHdpdGhpbiBpdC4gU28gd2UgY2FuIHVzZSB0aGlzIGFzIGEgZmFzdFxuICAgICAgLy8gYmFpbG91dC4gTW9zdCBvZiB0aGUgdGltZSwgd2hlbiBwZW9wbGUgYWRkIG5vbi1SZWFjdCBjaGlsZHJlbiB0b1xuICAgICAgLy8gdGhlIHRyZWUsIGl0IGlzIHVzaW5nIGEgcmVmIHRvIGEgY2hpbGQtbGVzcyBET00gbm9kZS5cbiAgICAgIC8vIE5vcm1hbGx5IHdlJ2Qgb25seSBuZWVkIHRvIGNoZWNrIG9uZSBvZiB0aGUgZmliZXJzIGJlY2F1c2UgaWYgaXRcbiAgICAgIC8vIGhhcyBldmVyIGdvbmUgZnJvbSBoYXZpbmcgY2hpbGRyZW4gdG8gZGVsZXRpbmcgdGhlbSBvciB2aWNlIHZlcnNhXG4gICAgICAvLyBpdCB3b3VsZCBoYXZlIGRlbGV0ZWQgdGhlIGRlaHlkcmF0ZWQgYm91bmRhcnkgbmVzdGVkIGluc2lkZSBhbHJlYWR5LlxuICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhlIEhvc3RSb290IHN0YXJ0cyBvdXQgd2l0aCBhbiBhbHRlcm5hdGUgaXQgbWlnaHRcbiAgICAgIC8vIGhhdmUgb25lIG9uIHRoZSBhbHRlcm5hdGUgc28gd2UgbmVlZCB0byBjaGVjayBpbiBjYXNlIHRoaXMgd2FzIGFcbiAgICAgIC8vIHJvb3QuXG4gICAgICB2YXIgYWx0ZXJuYXRlID0gdGFyZ2V0SW5zdC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmICh0YXJnZXRJbnN0LmNoaWxkICE9PSBudWxsIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIG5vZGUgdGhhdCBza2lwcGVkIHBhc3QgaXNcbiAgICAgICAgLy8gbmVzdGVkIHdpdGhpbiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgYW5kIGlmIHNvLCB3aGljaCBvbmUuXG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXROb2RlKTtcblxuICAgICAgICB3aGlsZSAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3VzcGVuc2UgaW5zdGFuY2UuIFRoYXQgbWVhbnMgdGhhdCB3ZSBoYXZlbid0XG4gICAgICAgICAgLy8gaHlkcmF0ZWQgaXQgeWV0LiBFdmVuIHRob3VnaCB3ZSBsZWF2ZSB0aGUgY29tbWVudHMgaW4gdGhlXG4gICAgICAgICAgLy8gRE9NIGFmdGVyIGh5ZHJhdGluZywgYW5kIHRoZXJlIGFyZSBib3VuZGFyaWVzIGluIHRoZSBET01cbiAgICAgICAgICAvLyB0aGF0IGNvdWxkIGFscmVhZHkgYmUgaHlkcmF0ZWQsIHdlIHdvdWxkbid0IGhhdmUgZm91bmQgdGhlbVxuICAgICAgICAgIC8vIHRocm91Z2ggdGhpcyBwYXNzIHNpbmNlIGlmIHRoZSB0YXJnZXQgaXMgaHlkcmF0ZWQgaXQgd291bGRcbiAgICAgICAgICAvLyBoYXZlIGhhZCBhbiBpbnRlcm5hbEluc3RhbmNlS2V5IG9uIGl0LlxuICAgICAgICAgIC8vIExldCdzIGdldCB0aGUgZmliZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBTdXNwZW5zZUNvbXBvbmVudFxuICAgICAgICAgIC8vIGFzIHRoZSBkZWVwZXN0IGluc3RhbmNlLlxuICAgICAgICAgIHZhciB0YXJnZXRTdXNwZW5zZUluc3QgPSBzdXNwZW5zZUluc3RhbmNlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gICAgICAgICAgaWYgKHRhcmdldFN1c3BlbnNlSW5zdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFN1c3BlbnNlSW5zdDtcbiAgICAgICAgICB9IC8vIElmIHdlIGRvbid0IGZpbmQgYSBGaWJlciBvbiB0aGUgY29tbWVudCwgaXQgbWlnaHQgYmUgYmVjYXVzZVxuICAgICAgICAgIC8vIHdlIGhhdmVuJ3QgZ290dGVuIHRvIGh5ZHJhdGUgaXQgeWV0LiBUaGVyZSBtaWdodCBzdGlsbCBiZSBhXG4gICAgICAgICAgLy8gcGFyZW50IGJvdW5kYXJ5IHRoYXQgaGFzbid0IGFib3ZlIHRoaXMgb25lIHNvIHdlIG5lZWQgdG8gZmluZFxuICAgICAgICAgIC8vIHRoZSBvdXRlciBtb3N0IHRoYXQgaXMga25vd24uXG5cblxuICAgICAgICAgIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpOyAvLyBJZiB3ZSBkb24ndCBmaW5kIG9uZSwgdGhlbiB0aGF0IHNob3VsZCBtZWFuIHRoYXQgdGhlIHBhcmVudFxuICAgICAgICAgIC8vIGhvc3QgY29tcG9uZW50IGFsc28gaGFzbid0IGh5ZHJhdGVkIHlldC4gV2UgY2FuIHJldHVybiBpdFxuICAgICAgICAgIC8vIGJlbG93IHNpbmNlIGl0IHdpbGwgYmFpbCBvdXQgb24gdGhlIGlzTW91bnRlZCBjaGVjayBsYXRlci5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICB9XG5cbiAgICB0YXJnZXROb2RlID0gcGFyZW50Tm9kZTtcbiAgICBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdpdmVuIGEgRE9NIG5vZGUsIHJldHVybiB0aGUgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50XG4gKiBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgbm9kZSB3YXMgbm90IHJlbmRlcmVkIGJ5IHRoaXMgUmVhY3QuXG4gKi9cblxuZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKSB7XG4gIHZhciBpbnN0ID0gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSB8fCBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgaWYgKGluc3QudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGluc3QudGFnID09PSBIb3N0VGV4dCB8fCBpbnN0LnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICByZXR1cm4gaW5zdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdpdmVuIGEgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50LCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmdcbiAqIERPTSBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkge1xuICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgLy8gSW4gRmliZXIgdGhpcywgaXMganVzdCB0aGUgc3RhdGUgbm9kZSByaWdodCBub3cuIFdlIGFzc3VtZSBpdCB3aWxsIGJlXG4gICAgLy8gYSBob3N0IGNvbXBvbmVudCBvciBob3N0IHRleHQuXG4gICAgcmV0dXJuIGluc3Quc3RhdGVOb2RlO1xuICB9IC8vIFdpdGhvdXQgdGhpcyBmaXJzdCBpbnZhcmlhbnQsIHBhc3NpbmcgYSBub24tRE9NLWNvbXBvbmVudCB0cmlnZ2VycyB0aGUgbmV4dFxuICAvLyBpbnZhcmlhbnQgZm9yIGEgbWlzc2luZyBwYXJlbnQsIHdoaWNoIGlzIHN1cGVyIGNvbmZ1c2luZy5cblxuXG4gIHRocm93IG5ldyBFcnJvcignZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKTtcbn1cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZVtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsUHJvcHNLZXldID0gcHJvcHM7XG59XG5mdW5jdGlvbiBnZXRFdmVudExpc3RlbmVyU2V0KG5vZGUpIHtcbiAgdmFyIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcblxuICBpZiAoZWxlbWVudExpc3RlbmVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudExpc3RlbmVyU2V0O1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWx1ZVN0YWNrID0gW107XG52YXIgZmliZXJTdGFjaztcblxue1xuICBmaWJlclN0YWNrID0gW107XG59XG5cbnZhciBpbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IoZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgY3VycmVudDogZGVmYXVsdFZhbHVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBvcChjdXJzb3IsIGZpYmVyKSB7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBwb3AuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChmaWJlciAhPT0gZmliZXJTdGFja1tpbmRleF0pIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIEZpYmVyIHBvcHBlZC4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlU3RhY2tbaW5kZXhdO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IG51bGw7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gbnVsbDtcbiAgfVxuXG4gIGluZGV4LS07XG59XG5cbmZ1bmN0aW9uIHB1c2goY3Vyc29yLCB2YWx1ZSwgZmliZXIpIHtcbiAgaW5kZXgrKztcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBjdXJzb3IuY3VycmVudDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBmaWJlcjtcbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWU7XG59XG5cbnZhciB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQ7XG5cbntcbiAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0ID0ge307XG59XG5cbnZhciBlbXB0eUNvbnRleHRPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5Q29udGV4dE9iamVjdCk7XG59IC8vIEEgY3Vyc29yIHRvIHRoZSBjdXJyZW50IG1lcmdlZCBjb250ZXh0IG9iamVjdCBvbiB0aGUgc3RhY2suXG5cblxudmFyIGNvbnRleHRTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihlbXB0eUNvbnRleHRPYmplY3QpOyAvLyBBIGN1cnNvciB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG52YXIgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihmYWxzZSk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGNvbnRleHQgb2JqZWN0IHRoYXQgd2FzIG9uIHRoZSBzdGFjay5cbi8vIFdlIHVzZSB0aGlzIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHBhcmVudCBjb250ZXh0IGFmdGVyIHdlIGhhdmUgYWxyZWFkeVxuLy8gcHVzaGVkIHRoZSBuZXh0IGNvbnRleHQgcHJvdmlkZXIsIGFuZCBub3cgbmVlZCB0byBtZXJnZSB0aGVpciBjb250ZXh0cy5cblxudmFyIHByZXZpb3VzQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuZnVuY3Rpb24gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlcikge1xuICB7XG4gICAgaWYgKGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlciAmJiBpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAvLyBJZiB0aGUgZmliZXIgaXMgYSBjb250ZXh0IHByb3ZpZGVyIGl0c2VsZiwgd2hlbiB3ZSByZWFkIGl0cyBjb250ZXh0XG4gICAgICAvLyB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHB1c2hlZCBpdHMgb3duIGNoaWxkIGNvbnRleHQgb24gdGhlIHN0YWNrLiBBIGNvbnRleHRcbiAgICAgIC8vIHByb3ZpZGVyIHNob3VsZCBub3QgXCJzZWVcIiBpdHMgb3duIGNoaWxkIGNvbnRleHQuIFRoZXJlZm9yZSB3ZSByZWFkIHRoZVxuICAgICAgLy8gcHJldmlvdXMgKHBhcmVudCkgY29udGV4dCBpbnN0ZWFkIGZvciBhIGNvbnRleHQgcHJvdmlkZXIuXG4gICAgICByZXR1cm4gcHJldmlvdXNDb250ZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgbWFza2VkQ29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPSB1bm1hc2tlZENvbnRleHQ7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQgPSBtYXNrZWRDb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSB0eXBlLmNvbnRleHRUeXBlcztcblxuICAgIGlmICghY29udGV4dFR5cGVzKSB7XG4gICAgICByZXR1cm4gZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgIH0gLy8gQXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgdW5tYXNrZWQgY29udGV4dCBoYXMgY2hhbmdlZC5cbiAgICAvLyBGYWlsaW5nIHRvIGRvIHRoaXMgd2lsbCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgY2FsbHMgdG8gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5cbiAgICAvLyBUaGlzIG1heSB0cmlnZ2VyIGluZmluaXRlIGxvb3BzIGlmIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgY2FsbHMgc2V0U3RhdGUuXG5cblxuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID09PSB1bm1hc2tlZENvbnRleHQpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY29udGV4dCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGNvbnRleHRUeXBlcykge1xuICAgICAgY29udGV4dFtrZXldID0gdW5tYXNrZWRDb250ZXh0W2tleV07XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSk7XG4gICAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gICAgLy8gQ29udGV4dCBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgY2xhc3MgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBzbyBjaGVjayBmb3IgaW5zdGFuY2UuXG5cblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnRleHRDaGFuZ2VkKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcih0eXBlKSB7XG4gIHtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgIHJldHVybiBjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlciwgY29udGV4dCwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICBpZiAoY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGNvbnRleHQgZm91bmQgb24gc3RhY2suICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgdHlwZSwgcGFyZW50Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7IC8vIFRPRE8gKGJ2YXVnaG4pIFJlcGxhY2UgdGhpcyBiZWhhdmlvciB3aXRoIGFuIGludmFyaWFudCgpIGluIHRoZSBmdXR1cmUuXG4gICAgLy8gSXQgaGFzIG9ubHkgYmVlbiBhZGRlZCBpbiBGaWJlciB0byBtYXRjaCB0aGUgKHVuaW50ZW50aW9uYWwpIGJlaGF2aW9yIGluIFN0YWNrLlxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgaWYgKCF3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJyVzLmNoaWxkQ29udGV4dFR5cGVzIGlzIHNwZWNpZmllZCBidXQgdGhlcmUgaXMgbm8gZ2V0Q2hpbGRDb250ZXh0KCkgbWV0aG9kICcgKyAnb24gdGhlIGluc3RhbmNlLiBZb3UgY2FuIGVpdGhlciBkZWZpbmUgZ2V0Q2hpbGRDb250ZXh0KCkgb24gJXMgb3IgcmVtb3ZlICcgKyAnY2hpbGRDb250ZXh0VHlwZXMgZnJvbSBpdC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyZW50Q29udGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRDb250ZXh0ID0gaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0KCk7XG5cbiAgICBmb3IgKHZhciBjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dCkge1xuICAgICAgaWYgKCEoY29udGV4dEtleSBpbiBjaGlsZENvbnRleHRUeXBlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bicpICsgXCIuZ2V0Q2hpbGRDb250ZXh0KCk6IGtleSBcXFwiXCIgKyBjb250ZXh0S2V5ICsgXCJcXFwiIGlzIG5vdCBkZWZpbmVkIGluIGNoaWxkQ29udGV4dFR5cGVzLlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNoaWxkQ29udGV4dFR5cGVzLCBjaGlsZENvbnRleHQsICdjaGlsZCBjb250ZXh0JywgbmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2lnbih7fSwgcGFyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFdlIHB1c2ggdGhlIGNvbnRleHQgYXMgZWFybHkgYXMgcG9zc2libGUgdG8gZW5zdXJlIHN0YWNrIGludGVncml0eS5cbiAgICAvLyBJZiB0aGUgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QgeWV0LCB3ZSB3aWxsIHB1c2ggbnVsbCBhdCBmaXJzdCxcbiAgICAvLyBhbmQgcmVwbGFjZSBpdCBvbiB0aGUgc3RhY2sgbGF0ZXIgd2hlbiBpbnZhbGlkYXRpbmcgdGhlIGNvbnRleHQuXG5cbiAgICB2YXIgbWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCB8fCBlbXB0eUNvbnRleHRPYmplY3Q7IC8vIFJlbWVtYmVyIHRoZSBwYXJlbnQgY29udGV4dCBzbyB3ZSBjYW4gbWVyZ2Ugd2l0aCBpdCBsYXRlci5cbiAgICAvLyBJbmhlcml0IHRoZSBwYXJlbnQncyBkaWQtcGVyZm9ybS13b3JrIHZhbHVlIHRvIGF2b2lkIGluYWR2ZXJ0ZW50bHkgYmxvY2tpbmcgdXBkYXRlcy5cblxuICAgIHByZXZpb3VzQ29udGV4dCA9IGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgdHlwZSwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYW4gaW5zdGFuY2UgYnkgdGhpcyBwb2ludC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmIChkaWRDaGFuZ2UpIHtcbiAgICAgIC8vIE1lcmdlIHBhcmVudCBhbmQgb3duIGNvbnRleHQuXG4gICAgICAvLyBTa2lwIHRoaXMgaWYgd2UncmUgbm90IHVwZGF0aW5nIGR1ZSB0byBzQ1UuXG4gICAgICAvLyBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyaWx5IHJlY29tcHV0aW5nIG1lbW9pemVkIHZhbHVlcy5cbiAgICAgIHZhciBtZXJnZWRDb250ZXh0ID0gcHJvY2Vzc0NoaWxkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdHlwZSwgcHJldmlvdXNDb250ZXh0KTtcbiAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0ID0gbWVyZ2VkQ29udGV4dDsgLy8gUmVwbGFjZSB0aGUgb2xkIChvciBlbXB0eSkgY29udGV4dCB3aXRoIHRoZSBuZXcgb25lLlxuICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRvIHVud2luZCB0aGUgY29udGV4dCBpbiB0aGUgcmV2ZXJzZSBvcmRlci5cblxuICAgICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTsgLy8gTm93IHB1c2ggdGhlIG5ldyBjb250ZXh0IGFuZCBtYXJrIHRoYXQgaXQgaGFzIGNoYW5nZWQuXG5cbiAgICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBtZXJnZWRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIC8vIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgdXNlZCB3aXRoIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOyBub3Qgc3VyZSBpZiBpdFxuICAgIC8vIG1ha2VzIHNlbnNlIGVsc2V3aGVyZVxuICAgIGlmICghaXNGaWJlck1vdW50ZWQoZmliZXIpIHx8IGZpYmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc3VidHJlZSBwYXJlbnQgdG8gYmUgYSBtb3VudGVkIGNsYXNzIGNvbXBvbmVudC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICBkbyB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLmNvbnRleHQ7XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gbm9kZS50eXBlO1xuXG4gICAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1bmV4cGVjdGVkIGRldGFjaGVkIHN1YnRyZWUgcGFyZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxudmFyIExlZ2FjeVJvb3QgPSAwO1xudmFyIENvbmN1cnJlbnRSb290ID0gMTtcblxudmFyIHN5bmNRdWV1ZSA9IG51bGw7XG52YXIgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG52YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgLy8gUHVzaCB0aGlzIGNhbGxiYWNrIGludG8gYW4gaW50ZXJuYWwgcXVldWUuIFdlJ2xsIGZsdXNoIHRoZXNlIGVpdGhlciBpblxuICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuXG4gIGlmIChzeW5jUXVldWUgPT09IG51bGwpIHtcbiAgICBzeW5jUXVldWUgPSBbY2FsbGJhY2tdO1xuICB9IGVsc2Uge1xuICAgIC8vIFB1c2ggb250byBleGlzdGluZyBxdWV1ZS4gRG9uJ3QgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrIGJlY2F1c2VcbiAgICAvLyB3ZSBhbHJlYWR5IHNjaGVkdWxlZCBvbmUgd2hlbiB3ZSBjcmVhdGVkIHRoZSBxdWV1ZS5cbiAgICBzeW5jUXVldWUucHVzaChjYWxsYmFjayk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IHRydWU7XG4gIHNjaGVkdWxlU3luY0NhbGxiYWNrKGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKSB7XG4gIC8vIE9ubHkgZmx1c2hlcyB0aGUgcXVldWUgaWYgdGhlcmUncyBhIGxlZ2FjeSBzeW5jIGNhbGxiYWNrIHNjaGVkdWxlZC5cbiAgLy8gVE9ETzogVGhlcmUncyBvbmx5IGEgc2luZ2xlIHR5cGUgb2YgY2FsbGJhY2s6IHBlcmZvcm1TeW5jT25Xb3JrT25Sb290LiBTb1xuICAvLyBpdCBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgZm9yIHRoZSBxdWV1ZSB0byBiZSBhIGxpc3Qgb2Ygcm9vdHMgaW5zdGVhZCBvZiBhXG4gIC8vIGxpc3Qgb2YgZ2VuZXJpYyBjYWxsYmFja3MuIFRoZW4gd2UgY2FuIGhhdmUgdHdvOiBvbmUgZm9yIGxlZ2FjeSByb290cywgb25lXG4gIC8vIGZvciBjb25jdXJyZW50IHJvb3RzLiBBbmQgdGhpcyBtZXRob2Qgd291bGQgb25seSBmbHVzaCB0aGUgbGVnYWN5IG9uZXMuXG4gIGlmIChpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MpIHtcbiAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgfVxufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzKCkge1xuICBpZiAoIWlzRmx1c2hpbmdTeW5jUXVldWUgJiYgc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gdHJ1ZTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHByZXZpb3VzVXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgaXNTeW5jID0gdHJ1ZTtcbiAgICAgIHZhciBxdWV1ZSA9IHN5bmNRdWV1ZTsgLy8gVE9ETzogSXMgdGhpcyBuZWNlc3NhcnkgYW55bW9yZT8gVGhlIG9ubHkgdXNlciBjb2RlIHRoYXQgcnVucyBpbiB0aGlzXG4gICAgICAvLyBxdWV1ZSBpcyBpbiB0aGUgcmVuZGVyIG9yIGNvbW1pdCBwaGFzZXMuXG5cbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuXG4gICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHF1ZXVlW2ldO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKGlzU3luYyk7XG4gICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgIH1cblxuICAgICAgc3luY1F1ZXVlID0gbnVsbDtcbiAgICAgIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICBpZiAoc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHN5bmNRdWV1ZSA9IHN5bmNRdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICB9IC8vIFJlc3VtZSBmbHVzaGluZyBpbiB0aGUgbmV4dCB0aWNrXG5cblxuICAgICAgc2NoZWR1bGVDYWxsYmFjayhJbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tzKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNVcGRhdGVQcmlvcml0eSk7XG4gICAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRPRE86IFVzZSB0aGUgdW5pZmllZCBmaWJlciBzdGFjayBtb2R1bGUgaW5zdGVhZCBvZiB0aGlzIGxvY2FsIG9uZT9cbi8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGl0IHlldCB0byBkZXJpc2sgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIGJlY2F1c2Vcbi8vIHRoZSB3YXkgd2UgcHVzaC9wb3AgdGhlc2UgdmFsdWVzIGlzIGEgYml0IHVudXN1YWwuIElmIHRoZXJlJ3MgYSBtaXN0YWtlLCBJJ2Rcbi8vIHJhdGhlciB0aGUgaWRzIGJlIHdyb25nIHRoYW4gY3Jhc2ggdGhlIHdob2xlIHJlY29uY2lsZXIuXG52YXIgZm9ya1N0YWNrID0gW107XG52YXIgZm9ya1N0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVGb3JrUHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVGb3JrQ291bnQgPSAwO1xudmFyIGlkU3RhY2sgPSBbXTtcbnZhciBpZFN0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVDb250ZXh0SWQgPSAxO1xudmFyIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSAnJztcbmZ1bmN0aW9uIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JrZWQpICE9PSBOb0ZsYWdzO1xufVxuZnVuY3Rpb24gZ2V0Rm9ya3NBdExldmVsKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICByZXR1cm4gdHJlZUZvcmtDb3VudDtcbn1cbmZ1bmN0aW9uIGdldFRyZWVJZCgpIHtcbiAgdmFyIG92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgdmFyIGlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgaWQgPSBpZFdpdGhMZWFkaW5nQml0ICYgfmdldExlYWRpbmdCaXQoaWRXaXRoTGVhZGluZ0JpdCk7XG4gIHJldHVybiBpZC50b1N0cmluZygzMikgKyBvdmVyZmxvdztcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbikge1xuICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBhZnRlciB3ZSByZWNvbmNpbGUgYW4gYXJyYXkgKG9yIGl0ZXJhdG9yKSBvZiBjaGlsZFxuICAvLyBmaWJlcnMsIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdlIGtub3cgaG93IG1hbnkgY2hpbGRyZW4gaW5cbiAgLy8gdGhlIHdob2xlIHNldCB3aXRob3V0IGRvaW5nIGV4dHJhIHdvcmsgbGF0ZXIsIG9yIHN0b3JpbmcgYWRkdGlvbmFsXG4gIC8vIGluZm9ybWF0aW9uIG9uIHRoZSBmaWJlci5cbiAgLy9cbiAgLy8gVGhhdCdzIHdoeSB0aGlzIGZ1bmN0aW9uIGlzIHNlcGFyYXRlIGZyb20gcHVzaFRyZWVJZCDigJQgaXQncyBjYWxsZWQgZHVyaW5nXG4gIC8vIHRoZSByZW5kZXIgcGhhc2Ugb2YgdGhlIGZvcmsgcGFyZW50LCBub3QgdGhlIGNoaWxkLCB3aGljaCBpcyB3aGVyZSB3ZSBwdXNoXG4gIC8vIHRoZSBvdGhlciBjb250ZXh0IHZhbHVlcy5cbiAgLy9cbiAgLy8gSW4gdGhlIEZpenogaW1wbGVtZW50YXRpb24gdGhpcyBpcyBtdWNoIHNpbXBsZXIgYmVjYXVzZSB0aGUgY2hpbGQgaXNcbiAgLy8gcmVuZGVyZWQgaW4gdGhlIHNhbWUgY2FsbHN0YWNrIGFzIHRoZSBwYXJlbnQuXG4gIC8vXG4gIC8vIEl0IG1pZ2h0IGJlIGJldHRlciB0byBqdXN0IGFkZCBhIGBmb3Jrc2AgZmllbGQgdG8gdGhlIEZpYmVyIHR5cGUuIEl0IHdvdWxkXG4gIC8vIG1ha2UgdGhpcyBtb2R1bGUgc2ltcGxlci5cbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrQ291bnQ7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrUHJvdmlkZXI7XG4gIHRyZWVGb3JrUHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdHJlZUZvcmtDb3VudCA9IHRvdGFsQ2hpbGRyZW47XG59XG5mdW5jdGlvbiBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuLCBpbmRleCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgYmFzZUlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgYmFzZU92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdzsgLy8gVGhlIGxlZnRtb3N0IDEgbWFya3MgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIG5vbi1pbmNsdXNpdmUuIEl0J3Mgbm90IHBhcnRcbiAgLy8gb2YgdGhlIGlkOyB3ZSB1c2UgaXQgdG8gYWNjb3VudCBmb3IgbGVhZGluZyAwcy5cblxuICB2YXIgYmFzZUxlbmd0aCA9IGdldEJpdExlbmd0aChiYXNlSWRXaXRoTGVhZGluZ0JpdCkgLSAxO1xuICB2YXIgYmFzZUlkID0gYmFzZUlkV2l0aExlYWRpbmdCaXQgJiB+KDEgPDwgYmFzZUxlbmd0aCk7XG4gIHZhciBzbG90ID0gaW5kZXggKyAxO1xuICB2YXIgbGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgYmFzZUxlbmd0aDsgLy8gMzAgaXMgdGhlIG1heCBsZW5ndGggd2UgY2FuIHN0b3JlIHdpdGhvdXQgb3ZlcmZsb3dpbmcsIHRha2luZyBpbnRvXG4gIC8vIGNvbnNpZGVyYXRpb24gdGhlIGxlYWRpbmcgMSB3ZSB1c2UgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cblxuICBpZiAobGVuZ3RoID4gMzApIHtcbiAgICAvLyBXZSBvdmVyZmxvd2VkIHRoZSBiaXR3aXNlLXNhZmUgcmFuZ2UuIEZhbGwgYmFjayB0byBzbG93ZXIgYWxnb3JpdGhtLlxuICAgIC8vIFRoaXMgYnJhbmNoIGFzc3VtZXMgdGhlIGxlbmd0aCBvZiB0aGUgYmFzZSBpZCBpcyBncmVhdGVyIHRoYW4gNTsgaXQgd29uJ3RcbiAgICAvLyB3b3JrIGZvciBzbWFsbGVyIGlkcywgYmVjYXVzZSB5b3UgbmVlZCA1IGJpdHMgcGVyIGNoYXJhY3Rlci5cbiAgICAvL1xuICAgIC8vIFdlIGVuY29kZSB0aGUgaWQgaW4gbXVsdGlwbGUgc3RlcHM6IGZpcnN0IHRoZSBiYXNlIGlkLCB0aGVuIHRoZVxuICAgIC8vIHJlbWFpbmluZyBkaWdpdHMuXG4gICAgLy9cbiAgICAvLyBFYWNoIDUgYml0IHNlcXVlbmNlIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGJhc2UgMzIgY2hhcmFjdGVyLiBTbyBmb3JcbiAgICAvLyBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBpZCBpcyAyMyBiaXRzIGxvbmcsIHdlIGNhbiBjb252ZXJ0IDIwIG9mIHRob3NlXG4gICAgLy8gYml0cyBpbnRvIGEgc3RyaW5nIG9mIDQgY2hhcmFjdGVycywgd2l0aCAzIGJpdHMgbGVmdCBvdmVyLlxuICAgIC8vXG4gICAgLy8gRmlyc3QgY2FsY3VsYXRlIGhvdyBtYW55IGJpdHMgaW4gdGhlIGJhc2UgaWQgcmVwcmVzZW50IGEgY29tcGxldGVcbiAgICAvLyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLlxuICAgIHZhciBudW1iZXJPZk92ZXJmbG93Qml0cyA9IGJhc2VMZW5ndGggLSBiYXNlTGVuZ3RoICUgNTsgLy8gVGhlbiBjcmVhdGUgYSBiaXRtYXNrIHRoYXQgc2VsZWN0cyBvbmx5IHRob3NlIGJpdHMuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3dCaXRzID0gKDEgPDwgbnVtYmVyT2ZPdmVyZmxvd0JpdHMpIC0gMTsgLy8gU2VsZWN0IHRoZSBiaXRzLCBhbmQgY29udmVydCB0aGVtIHRvIGEgYmFzZSAzMiBzdHJpbmcuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3cgPSAoYmFzZUlkICYgbmV3T3ZlcmZsb3dCaXRzKS50b1N0cmluZygzMik7IC8vIE5vdyB3ZSBjYW4gcmVtb3ZlIHRob3NlIGJpdHMgZnJvbSB0aGUgYmFzZSBpZC5cblxuICAgIHZhciByZXN0T2ZCYXNlSWQgPSBiYXNlSWQgPj4gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7XG4gICAgdmFyIHJlc3RPZkJhc2VMZW5ndGggPSBiYXNlTGVuZ3RoIC0gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7IC8vIEZpbmFsbHksIGVuY29kZSB0aGUgcmVzdCBvZiB0aGUgYml0cyB1c2luZyB0aGUgbm9ybWFsIGFsZ29yaXRobS4gQmVjYXVzZVxuICAgIC8vIHdlIG1hZGUgbW9yZSByb29tLCB0aGlzIHRpbWUgaXQgd29uJ3Qgb3ZlcmZsb3cuXG5cbiAgICB2YXIgcmVzdE9mTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgcmVzdE9mTmV3Qml0cyA9IHNsb3QgPDwgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgaWQgPSByZXN0T2ZOZXdCaXRzIHwgcmVzdE9mQmFzZUlkO1xuICAgIHZhciBvdmVyZmxvdyA9IG5ld092ZXJmbG93ICsgYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IHJlc3RPZkxlbmd0aCB8IGlkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgfSBlbHNlIHtcbiAgICAvLyBOb3JtYWwgcGF0aFxuICAgIHZhciBuZXdCaXRzID0gc2xvdCA8PCBiYXNlTGVuZ3RoO1xuXG4gICAgdmFyIF9pZCA9IG5ld0JpdHMgfCBiYXNlSWQ7XG5cbiAgICB2YXIgX292ZXJmbG93ID0gYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IGxlbmd0aCB8IF9pZDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gX292ZXJmbG93O1xuICB9XG59XG5mdW5jdGlvbiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpOyAvLyBUaGlzIGNvbXBvbmVudCBtYXRlcmlhbGl6ZWQgYW4gaWQuIFRoaXMgd2lsbCBhZmZlY3QgYW55IGlkcyB0aGF0IGFwcGVhclxuICAvLyBpbiBpdHMgY2hpbGRyZW4uXG5cbiAgdmFyIHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBudW1iZXJPZkZvcmtzID0gMTtcbiAgICB2YXIgc2xvdEluZGV4ID0gMDtcbiAgICBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MpO1xuICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Qml0TGVuZ3RoKG51bWJlcikge1xuICByZXR1cm4gMzIgLSBjbHozMihudW1iZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRMZWFkaW5nQml0KGlkKSB7XG4gIHJldHVybiAxIDw8IGdldEJpdExlbmd0aChpZCkgLSAxO1xufVxuXG5mdW5jdGlvbiBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZXMuXG4gIC8vIFRoaXMgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIG90aGVyIGNvbnRleHQtbGlrZSBtb2R1bGVzIGluIEZpYmVyXG4gIC8vIGJlY2F1c2UgdGhlIHNhbWUgRmliZXIgbWF5IGFwcGVhciBvbiB0aGUgc3RhY2sgbXVsdGlwbGUgdGltZXMgYW5kIGZvclxuICAvLyBkaWZmZXJlbnQgcmVhc29ucy4gV2UgaGF2ZSB0byBrZWVwIHBvcHBpbmcgdW50aWwgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaXNcbiAgLy8gbm8gbG9uZ2VyIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVGb3JrUHJvdmlkZXIpIHtcbiAgICB0cmVlRm9ya1Byb3ZpZGVyID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdO1xuICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVGb3JrQ291bnQgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gIH1cblxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVDb250ZXh0UHJvdmlkZXIpIHtcbiAgICB0cmVlQ29udGV4dFByb3ZpZGVyID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dElkID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuXG4gIGlmICh0cmVlQ29udGV4dFByb3ZpZGVyICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0cmVlQ29udGV4dElkLFxuICAgICAgb3ZlcmZsb3c6IHRyZWVDb250ZXh0T3ZlcmZsb3dcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbmRlZENvbnRleHQpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0SWQgPSBzdXNwZW5kZWRDb250ZXh0LmlkO1xuICB0cmVlQ29udGV4dE92ZXJmbG93ID0gc3VzcGVuZGVkQ29udGV4dC5vdmVyZmxvdztcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RIeWRyYXRpbmcoKSB7XG4gIHtcbiAgICBpZiAoIWdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBiZSBoeWRyYXRpbmcuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlICcgKyAnYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTsgLy8gVGhpcyBmbGFnIGFsbG93cyBmb3Igd2FybmluZyBzdXByZXNzaW9uIHdoZW4gd2UgZXhwZWN0IHRoZXJlIHRvIGJlIG1pc21hdGNoZXNcbi8vIGR1ZSB0byBlYXJsaWVyIG1pc21hdGNoZXMgb3IgYSBzdXNwZW5kZWQgZmliZXIuXG5cbnZhciBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlOyAvLyBIeWRyYXRpb24gZXJyb3JzIHRoYXQgd2VyZSB0aHJvd24gaW5zaWRlIHRoaXMgYm91bmRhcnlcblxudmFyIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5JZkh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgZXJyb3IoJ1dlIHNob3VsZCBub3QgYmUgaHlkcmF0aW5nIGhlcmUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGEgYnVnLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIGRpZFN1c3BlbmRPckVycm9yREVWID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIHJldHVybiBkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnRlckh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlciwgc3VzcGVuc2VJbnN0YW5jZSwgdHJlZUNvbnRleHQpIHtcblxuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG5cbiAgaWYgKHRyZWVDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KGZpYmVyLCB0cmVlQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQsIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKTtcbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpIHtcbiAge1xuICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvckRFVikge1xuICAgICAgLy8gSW5zaWRlIGEgYm91bmRhcnkgdGhhdCBhbHJlYWR5IHN1c3BlbmRlZC4gV2UncmUgY3VycmVudGx5IHJlbmRlcmluZyB0aGVcbiAgICAgIC8vIHNpYmxpbmdzIG9mIGEgc3VzcGVuZGVkIG5vZGUuIFRoZSBtaXNtYXRjaCBtYXkgYmUgZHVlIHRvIHRoZSBtaXNzaW5nXG4gICAgICAvLyBkYXRhLCBzbyBpdCdzIHByb2JhYmx5IGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3R5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSwgX3Byb3BzLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdGV4dCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSByZXR1cm5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBfcGFyZW50SW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICAgICAgaWYgKF9wYXJlbnRJbnN0YW5jZSAhPT0gbnVsbCkgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIF90eXBlMiA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90eXBlMik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdGV4dDIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcbiAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIGluc3RhbmNlID0gY2FuSHlkcmF0ZUluc3RhbmNlKG5leHRJbnN0YW5jZSwgdHlwZSk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKG5leHRJbnN0YW5jZSwgdGV4dCk7XG5cbiAgICAgICAgaWYgKHRleHRJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IHRleHRJbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBUZXh0IEluc3RhbmNlcyBkb24ndCBoYXZlIGNoaWxkcmVuIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBoeWRyYXRlLlxuXG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKG5leHRJbnN0YW5jZSk7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHN1c3BlbnNlSW5zdGFuY2UsXG4gICAgICAgICAgICB0cmVlQ29udGV4dDogZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSxcbiAgICAgICAgICAgIHJldHJ5TGFuZTogT2Zmc2NyZWVuTGFuZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IHN1c3BlbnNlU3RhdGU7IC8vIFN0b3JlIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50IGFzIGEgY2hpbGQgZmliZXIuXG4gICAgICAgICAgLy8gVGhpcyBzaW1wbGlmaWVzIHRoZSBjb2RlIGZvciBnZXRIb3N0U2libGluZyBhbmQgZGVsZXRpbmcgbm9kZXMsXG4gICAgICAgICAgLy8gc2luY2UgaXQgZG9lc24ndCBoYXZlIHRvIGNvbnNpZGVyIGFsbCBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXkncmUgZGVoeWRyYXRlZCBvbmVzIG9yIG5vdC5cblxuICAgICAgICAgIHZhciBkZWh5ZHJhdGVkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgZGVoeWRyYXRlZEZyYWdtZW50LnJldHVybiA9IGZpYmVyO1xuICAgICAgICAgIGZpYmVyLmNoaWxkID0gZGVoeWRyYXRlZEZyYWdtZW50O1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFdoaWxlIGEgU3VzcGVuc2UgSW5zdGFuY2UgZG9lcyBoYXZlIGNoaWxkcmVuLCB3ZSB3b24ndCBzdGVwIGludG9cbiAgICAgICAgICAvLyBpdCBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIEluc3RlYWQsIHdlJ2xsIHJlZW50ZXIgaXQgbGF0ZXIuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikge1xuICByZXR1cm4gKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAoZmliZXIuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncztcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGZpYmVyKSB7XG4gIHRocm93IG5ldyBFcnJvcignSHlkcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBpbml0aWFsIFVJIGRvZXMgbm90IG1hdGNoIHdoYXQgd2FzICcgKyAncmVuZGVyZWQgb24gdGhlIHNlcnZlci4nKTtcbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuXG5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgIH0gLy8gSWYgd2UgY2FuJ3QgaHlkcmF0ZSB0aGlzIGluc3RhbmNlIGxldCdzIHRyeSB0aGUgbmV4dCBvbmUuXG4gICAgLy8gV2UgdXNlIHRoaXMgYXMgYSBoZXVyaXN0aWMuIEl0J3MgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBub3QgZGF0YSBzbyBpdFxuICAgIC8vIG1pZ2h0IGJlIGZsYXdlZCBvciB1bm5lY2Vzc2FyeS5cblxuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICAgIHZhciBwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmICghbmV4dEluc3RhbmNlIHx8ICF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuICAgICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBtYXRjaGVkIHRoZSBuZXh0IG9uZSwgd2UnbGwgbm93IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBvbmUgd2FzXG4gICAgLy8gc3VwZXJmbHVvdXMgYW5kIHdlJ2xsIGRlbGV0ZSBpdC4gU2luY2Ugd2UgY2FuJ3QgZWFnZXJseSBkZWxldGUgaXRcbiAgICAvLyB3ZSdsbCBoYXZlIHRvIHNjaGVkdWxlIGEgZGVsZXRpb24uIFRvIGRvIHRoYXQsIHRoaXMgbm9kZSBuZWVkcyBhIGR1bW15XG4gICAgLy8gZmliZXIgYXNzb2NpYXRlZCB3aXRoIGl0LlxuXG5cbiAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocHJldkh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG5cbiAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYgPSAhZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIHZhciB1cGRhdGVQYXlsb2FkID0gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCBmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBmaWJlciwgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICBmaWJlci51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAvLyBpcyBhIG5ldyByZWYgd2UgbWFyayB0aGlzIGFzIGFuIHVwZGF0ZS5cblxuICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciB0ZXh0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciB0ZXh0Q29udGVudCA9IGZpYmVyLm1lbW9pemVkUHJvcHM7XG4gIHZhciBzaG91bGRVcGRhdGUgPSBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIGZpYmVyKTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UgaXMgY2FsbGVkIGluIGEgY29udGV4dCB3aGVyZSB0aGVcbiAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgdmFyIHJldHVybkZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG5cbiAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdmFyIF9pc0NvbmN1cnJlbnRNb2RlMiA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFueSByZW1haW5pbmcgaHlkcmF0YWJsZSBub2Rlcywgd2UgbmVlZCB0byBkZWxldGUgdGhlbSBub3cuXG4gIC8vIFdlIG9ubHkgZG8gdGhpcyBkZWVwZXIgdGhhbiBoZWFkIGFuZCBib2R5IHNpbmNlIHRoZXkgdGVuZCB0byBoYXZlIHJhbmRvbVxuICAvLyBvdGhlciBub2RlcyBpbiB0aGVtLiBXZSBhbHNvIGlnbm9yZSBjb21wb25lbnRzIHdpdGggcHVyZSB0ZXh0IGNvbnRlbnQgaW5cbiAgLy8gc2lkZSBvZiB0aGVtLiBXZSBhbHNvIGRvbid0IGRlbGV0ZSBhbnl0aGluZyBpbnNpZGUgdGhlIHJvb3QgY29udGFpbmVyLlxuXG5cbiAgaWYgKGZpYmVyLnRhZyAhPT0gSG9zdFJvb3QgJiYgKGZpYmVyLnRhZyAhPT0gSG9zdENvbXBvbmVudCB8fCBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhmaWJlci50eXBlKSAmJiAhc2hvdWxkU2V0VGV4dENvbnRlbnQoZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcykpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICBpZiAobmV4dEluc3RhbmNlKSB7XG4gICAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcik7XG4gICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKG5leHRJbnN0YW5jZSkge1xuICAgICAgICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICAgICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpO1xuICB9IGVsc2Uge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBoeWRyYXRpb25QYXJlbnRGaWJlciA/IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhmaWJlci5zdGF0ZU5vZGUpIDogbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkge1xuICByZXR1cm4gaXNIeWRyYXRpbmcgJiYgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcikge1xuICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuXG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCkge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLiBUaGUgZXJyb3JzIHRoYXQgb2NjdXJyZWRcbiAgICAvLyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBhdHRlbXB0IGFyZSBub3cgcmVjb3ZlcmVkLiBXZSB3aWxsIGxvZyB0aGVtIGluXG4gICAgLy8gY29tbWl0IHBoYXNlLCBvbmNlIHRoZSBlbnRpcmUgdHJlZSBoYXMgZmluaXNoZWQuXG4gICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhoeWRyYXRpb25FcnJvcnMpO1xuICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNIeWRyYXRpbmcoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZztcbn1cblxuZnVuY3Rpb24gcXVldWVIeWRyYXRpb25FcnJvcihlcnJvcikge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzID09PSBudWxsKSB7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICBoeWRyYXRpb25FcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBOb1RyYW5zaXRpb24gPSBudWxsO1xuZnVuY3Rpb24gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkge1xuICByZXR1cm4gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cGUgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLlxuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgZG8gYW4gaW5pdGlhbCBwYXNzIHRvIGdhdGhlciBjb21wb25lbnQgbmFtZXNcbiAgICB2YXIgY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH0gLy8gRmluYWxseSwgd2UgZmx1c2ggYWxsIHRoZSB3YXJuaW5nc1xuICAgIC8vIFVOU0FGRV8gb25lcyBiZWZvcmUgdGhlIGRlcHJlY2F0ZWQgb25lcywgc2luY2UgdGhleSdsbCBiZSAnbG91ZGVyJ1xuXG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgXCIgKyAncmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczIgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMyKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsTW91bnQgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsTW91bnQgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczQgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgXCIqIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIHJlZmFjdG9yIHlvdXIgXCIgKyAnY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczQpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXM1ID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbFVwZGF0ZSBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsVXBkYXRlIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM1KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICB2YXIgc3RyaWN0Um9vdCA9IGZpbmRTdHJpY3RSb290KGZpYmVyKTtcblxuICAgIGlmIChzdHJpY3RSb290ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIFN0cmljdE1vZGUgY29tcG9uZW50IGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG5cblxuICAgIGlmIChkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZ2V0KHN0cmljdFJvb3QpO1xuXG4gICAgaWYgKGZpYmVyLnR5cGUuY29udGV4dFR5cGVzICE9IG51bGwgfHwgZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyAhPSBudWxsIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh3YXJuaW5nc0ZvclJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3YXJuaW5nc0ZvclJvb3QgPSBbXTtcbiAgICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgICAgfVxuXG4gICAgICB3YXJuaW5nc0ZvclJvb3QucHVzaChmaWJlcik7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyQXJyYXksIHN0cmljdFJvb3QpIHtcbiAgICAgIGlmIChmaWJlckFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdEZpYmVyID0gZmliZXJBcnJheVswXTtcbiAgICAgIHZhciB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIGZpYmVyQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKHVuaXF1ZU5hbWVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpcnN0RmliZXIpO1xuXG4gICAgICAgIGVycm9yKCdMZWdhY3kgY29udGV4dCBBUEkgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aGluIGEgc3RyaWN0LW1vZGUgdHJlZS4nICsgJ1xcblxcblRoZSBvbGQgQVBJIHdpbGwgYmUgc3VwcG9ydGVkIGluIGFsbCAxNi54IHJlbGVhc2VzLCBidXQgYXBwbGljYXRpb25zICcgKyAndXNpbmcgaXQgc2hvdWxkIG1pZ3JhdGUgdG8gdGhlIG5ldyB2ZXJzaW9uLicgKyAnXFxuXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJyArICdcXG5cXG5MZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBzb3J0ZWROYW1lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dE1hcHM7XG52YXIgZGlkV2FybkFib3V0R2VuZXJhdG9ycztcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xudmFyIG93bmVySGFzS2V5VXNlV2FybmluZztcbnZhciBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmc7XG5cbnZhciB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHt9O1xuXG57XG4gIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG4gIC8qKlxuICAgKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gICAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICAgKiB1cGRhdGVzLlxuICAgKi9cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0ge307XG5cbiAgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkLl9zdG9yZSB8fCBjaGlsZC5fc3RvcmUudmFsaWRhdGVkIHx8IGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGlsZC5fc3RvcmUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IENvbXBvbmVudCBpbiB3YXJuRm9yTWlzc2luZ0tleSBzaG91bGQgaGF2ZSBhIF9zdG9yZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAnICsgJ1wia2V5XCIgcHJvcC4gU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yICcgKyAnbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNSZWFjdENsYXNzKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUucHJvdG90eXBlICYmIHR5cGUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ7XG59XG5cbmZ1bmN0aW9uIGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCkge1xuICB2YXIgbWl4ZWRSZWYgPSBlbGVtZW50LnJlZjtcblxuICBpZiAobWl4ZWRSZWYgIT09IG51bGwgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ29iamVjdCcpIHtcbiAgICB7XG4gICAgICAvLyBUT0RPOiBDbGVhbiB0aGlzIHVwIG9uY2Ugd2UgdHVybiBvbiB0aGUgc3RyaW5nIHJlZiB3YXJuaW5nIGZvclxuICAgICAgLy8gZXZlcnlvbmUsIGJlY2F1c2UgdGhlIHN0cmljdCBtb2RlIGNhc2Ugd2lsbCBubyBsb25nZXIgYmUgcmVsZXZhbnRcbiAgICAgIGlmICgocmV0dXJuRmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgfHwgd2FybkFib3V0U3RyaW5nUmVmcykgJiYgLy8gV2Ugd2FybiBpbiBSZWFjdEVsZW1lbnQuanMgaWYgb3duZXIgYW5kIHNlbGYgYXJlIGVxdWFsIGZvciBzdHJpbmcgcmVmc1xuICAgICAgLy8gYmVjYXVzZSB0aGVzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb25cbiAgICAgIC8vIHVzaW5nIGEgY29kZW1vZC4gVGhlcmVmb3JlLCB3ZSBkb24ndCBoYXZlIHRvIHdhcm4gYWJvdXQgc3RyaW5nIHJlZnMgYWdhaW4uXG4gICAgICAhKGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX3NlbGYgJiYgZWxlbWVudC5fb3duZXIuc3RhdGVOb2RlICE9PSBlbGVtZW50Ll9zZWxmKSAmJiAvLyBXaWxsIGFscmVhZHkgdGhyb3cgd2l0aCBcIkZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnNcIlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lci50YWcgIT09IENsYXNzQ29tcG9uZW50KSAmJiAvLyBXaWxsIGFscmVhZHkgd2FybiB3aXRoIFwiRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmc1wiXG4gICAgICAhKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdmdW5jdGlvbicgJiYgIWlzUmVhY3RDbGFzcyhlbGVtZW50LnR5cGUpKSAmJiAvLyBXaWxsIGFscmVhZHkgdGhyb3cgd2l0aCBcIkVsZW1lbnQgcmVmIHdhcyBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKHNvbWVTdHJpbmdSZWYpIGJ1dCBubyBvd25lciB3YXMgc2V0XCJcbiAgICAgIGVsZW1lbnQuX293bmVyKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiBTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyAnICsgJ3dpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBXZSByZWNvbW1lbmQgdXNpbmcgJyArICd1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIG1peGVkUmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50Ll9vd25lcikge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgaW5zdDtcblxuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG5cbiAgICAgICAgaWYgKG93bmVyRmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSBzdHJpbmcgcmVmcy4gJyArICdXZSByZWNvbW1lbmQgdXNpbmcgdXNlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3QgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbnN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgb3duZXIgZm9yIHN0cmluZyByZWYgXCIgKyBtaXhlZFJlZiArIFwiLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBcIiArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfSAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0IHNvIEZsb3cga25vd3MgaXQgd29uJ3QgY2hhbmdlIGluIHRoZSBjbG9zdXJlXG5cblxuICAgICAgdmFyIHJlc29sdmVkSW5zdCA9IGluc3Q7XG5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24obWl4ZWRSZWYsICdyZWYnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0cmluZ1JlZiA9ICcnICsgbWl4ZWRSZWY7IC8vIENoZWNrIGlmIHByZXZpb3VzIHN0cmluZyByZWYgbWF0Y2hlcyBuZXcgc3RyaW5nIHJlZlxuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgY3VycmVudC5yZWYgPT09ICdmdW5jdGlvbicgJiYgY3VycmVudC5yZWYuX3N0cmluZ1JlZiA9PT0gc3RyaW5nUmVmKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50LnJlZjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVmcyA9IHJlc29sdmVkSW5zdC5yZWZzO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSByZWZzW3N0cmluZ1JlZl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmc1tzdHJpbmdSZWZdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBtaXhlZFJlZiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZWYgdG8gYmUgYSBmdW5jdGlvbiwgYSBzdHJpbmcsIGFuIG9iamVjdCByZXR1cm5lZCBieSBSZWFjdC5jcmVhdGVSZWYoKSwgb3IgbnVsbC4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IHJlZiB3YXMgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChcIiArIG1peGVkUmVmICsgXCIpIGJ1dCBubyBvd25lciB3YXMgc2V0LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mXCIgKyAnIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgZnVuY3Rpb24gY29tcG9uZW50XFxuJyArIFwiMi4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50J3MgcmVuZGVyIG1ldGhvZFxcblwiICsgJzMuIFlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWRcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVmcy1tdXN0LWhhdmUtb3duZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1peGVkUmVmO1xufVxuXG5mdW5jdGlvbiB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKSB7XG4gIHZhciBjaGlsZFN0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdDaGlsZCk7XG4gIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRTdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhuZXdDaGlsZCkuam9pbignLCAnKSArICd9JyA6IGNoaWxkU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG59XG5cbmZ1bmN0aW9uIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcikge1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0Z1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiAnICsgJ3lvdSByZXR1cm4gYSBDb21wb25lbnQgaW5zdGVhZCBvZiA8Q29tcG9uZW50IC8+IGZyb20gcmVuZGVyLiAnICsgJ09yIG1heWJlIHlvdSBtZWFudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuIGl0LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVMYXp5KGxhenlUeXBlKSB7XG4gIHZhciBwYXlsb2FkID0gbGF6eVR5cGUuX3BheWxvYWQ7XG4gIHZhciBpbml0ID0gbGF6eVR5cGUuX2luaXQ7XG4gIHJldHVybiBpbml0KHBheWxvYWQpO1xufSAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZXhpc3RzIGJlY2F1c2UgSSBleHBlY3QgdG8gY2xvbmUgdGhlIGNvZGUgaW4gZWFjaCBwYXRoXG4vLyB0byBiZSBhYmxlIHRvIG9wdGltaXplIGVhY2ggcGF0aCBpbmRpdmlkdWFsbHkgYnkgYnJhbmNoaW5nIGVhcmx5LiBUaGlzIG5lZWRzXG4vLyBhIGNvbXBpbGVyIG9yIHdlIGNhbiBkbyBpdCBtYW51YWxseS4gSGVscGVycyB0aGF0IGRvbid0IG5lZWQgdGhpcyBicmFuY2hpbmdcbi8vIGxpdmUgb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uLlxuXG5cbmZ1bmN0aW9uIENoaWxkUmVjb25jaWxlcihzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gIGZ1bmN0aW9uIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIFRPRE86IEZvciB0aGUgc2hvdWxkQ2xvbmUgY2FzZSwgdGhpcyBjb3VsZCBiZSBtaWNyby1vcHRpbWl6ZWQgYSBiaXQgYnlcbiAgICAvLyBhc3N1bWluZyB0aGF0IGFmdGVyIHRoZSBmaXJzdCBjaGlsZCB3ZSd2ZSBhbHJlYWR5IGFkZGVkIGV2ZXJ5dGhpbmcuXG5cblxuICAgIHZhciBjaGlsZFRvRGVsZXRlID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGRUb0RlbGV0ZSAhPT0gbnVsbCkge1xuICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpO1xuICAgICAgY2hpbGRUb0RlbGV0ZSA9IGNoaWxkVG9EZWxldGUuc2libGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkge1xuICAgIC8vIEFkZCB0aGUgcmVtYWluaW5nIGNoaWxkcmVuIHRvIGEgdGVtcG9yYXJ5IG1hcCBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZW0gYnlcbiAgICAvLyBrZXlzIHF1aWNrbHkuIEltcGxpY2l0IChudWxsKSBrZXlzIGdldCBhZGRlZCB0byB0aGlzIHNldCB3aXRoIHRoZWlyIGluZGV4XG4gICAgLy8gaW5zdGVhZC5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG5ldyBNYXAoKTtcbiAgICB2YXIgZXhpc3RpbmdDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGV4aXN0aW5nQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGlmIChleGlzdGluZ0NoaWxkLmtleSAhPT0gbnVsbCkge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmtleSwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmluZGV4LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdDaGlsZCA9IGV4aXN0aW5nQ2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gZXhpc3RpbmdDaGlsZHJlbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUZpYmVyKGZpYmVyLCBwZW5kaW5nUHJvcHMpIHtcbiAgICAvLyBXZSBjdXJyZW50bHkgc2V0IHNpYmxpbmcgdG8gbnVsbCBhbmQgaW5kZXggdG8gMCBoZXJlIGJlY2F1c2UgaXQgaXMgZWFzeVxuICAgIC8vIHRvIGZvcmdldCB0byBkbyBiZWZvcmUgcmV0dXJuaW5nIGl0LiBFLmcuIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuXG4gICAgdmFyIGNsb25lID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcyk7XG4gICAgY2xvbmUuaW5kZXggPSAwO1xuICAgIGNsb25lLnNpYmxpbmcgPSBudWxsO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SW5kZXgpIHtcbiAgICBuZXdGaWJlci5pbmRleCA9IG5ld0luZGV4O1xuXG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBEdXJpbmcgaHlkcmF0aW9uLCB0aGUgdXNlSWQgYWxnb3JpdGhtIG5lZWRzIHRvIGtub3cgd2hpY2ggZmliZXJzIGFyZVxuICAgICAgLy8gcGFydCBvZiBhIGxpc3Qgb2YgY2hpbGRyZW4gKGFycmF5cywgaXRlcmF0b3JzKS5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IEZvcmtlZDtcbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnQgPSBuZXdGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudC5pbmRleDtcblxuICAgICAgaWYgKG9sZEluZGV4IDwgbGFzdFBsYWNlZEluZGV4KSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBtb3ZlLlxuICAgICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGl0ZW0gY2FuIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgIHJldHVybiBvbGRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyBhbiBpbnNlcnRpb24uXG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYWNlU2luZ2xlQ2hpbGQobmV3RmliZXIpIHtcbiAgICAvLyBUaGlzIGlzIHNpbXBsZXIgZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS4gV2Ugb25seSBuZWVkIHRvIGRvIGFcbiAgICAvLyBwbGFjZW1lbnQgZm9yIGluc2VydGluZyBuZXcgY2hpbGRyZW4uXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZpYmVyO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBlbGVtZW50VHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LnByb3BzLmNoaWxkcmVuLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHwgKCAvLyBLZWVwIHRoaXMgY2hlY2sgaW5saW5lIHNvIGl0IG9ubHkgcnVucyBvbiB0aGUgZmFsc2UgcGF0aDpcbiAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY3VycmVudCwgZWxlbWVudCkgKSB8fCAvLyBMYXp5IHR5cGVzIHNob3VsZCByZWNvbmNpbGUgdGhlaXIgcmVzb2x2ZWQgdHlwZS5cbiAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSxcbiAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZVxuICAgICAgLy8gaXQgZG9lc24ndCByZXN1c3BlbmQuIFNvIHdlIGNhbid0IGxldCB0aGUgY2FsbCBiZWxvdyBzdXNwZW5kLlxuICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY3VycmVudC50eXBlKSB7XG4gICAgICAgIC8vIE1vdmUgYmFzZWQgb24gaW5kZXhcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZWxlbWVudC5wcm9wcyk7XG4gICAgICAgIGV4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7XG4gICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgIH1cbiAgICB9IC8vIEluc2VydFxuXG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50LCBwb3J0YWwsIGxhbmVzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEhvc3RQb3J0YWwgfHwgY3VycmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyAhPT0gcG9ydGFsLmNvbnRhaW5lckluZm8gfHwgY3VycmVudC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gIT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGZyYWdtZW50LCBsYW5lcywga2V5KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEZyYWdtZW50KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBrZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIGZyYWdtZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KCcnICsgbmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgICAgICAgIF9jcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgbnVsbCwgbmV3Q2hpbGQpO1xuICAgICAgICAgICAgX2NyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkMiA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZDIucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQyO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIG51bGwpO1xuXG4gICAgICAgIF9jcmVhdGVkMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVkMztcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFVwZGF0ZSB0aGUgZmliZXIgaWYgdGhlIGtleXMgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICB2YXIga2V5ID0gb2xkRmliZXIgIT09IG51bGwgPyBvbGRGaWJlci5rZXkgOiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgb2xkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMsIHNvIHdlIG5laXRoZXIgaGF2ZSB0byBjaGVjayB0aGUgb2xkIG5vclxuICAgICAgLy8gbmV3IG5vZGUgZm9yIHRoZSBrZXkuIElmIGJvdGggYXJlIHRleHQgbm9kZXMsIHRoZXkgbWF0Y2guXG4gICAgICB2YXIgbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBtYXRjaGVkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMiwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgIHJldHVybiB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMyA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIzLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFdhcm5zIGlmIHRoZXJlIGlzIGEgZHVwbGljYXRlIG9yIG1pc3Npbmcga2V5XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcikge1xuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnIHx8IGNoaWxkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBrbm93bktleXM7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoY2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgd2FybkZvck1pc3NpbmdLZXkoY2hpbGQsIHJldHVybkZpYmVyKTtcbiAgICAgICAgICB2YXIga2V5ID0gY2hpbGQua2V5O1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoa25vd25LZXlzID09PSBudWxsKSB7XG4gICAgICAgICAgICBrbm93bktleXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWtub3duS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IoJ0VuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgYCVzYC4gJyArICdLZXlzIHNob3VsZCBiZSB1bmlxdWUgc28gdGhhdCBjb21wb25lbnRzIG1haW50YWluIHRoZWlyIGlkZW50aXR5ICcgKyAnYWNyb3NzIHVwZGF0ZXMuIE5vbi11bmlxdWUga2V5cyBtYXkgY2F1c2UgY2hpbGRyZW4gdG8gYmUgJyArICdkdXBsaWNhdGVkIGFuZC9vciBvbWl0dGVkIOKAlCB0aGUgYmVoYXZpb3IgaXMgdW5zdXBwb3J0ZWQgYW5kICcgKyAnY291bGQgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24uJywga2V5KTtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gY2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBjaGlsZC5faW5pdDtcbiAgICAgICAgICB3YXJuT25JbnZhbGlkS2V5KGluaXQocGF5bG9hZCksIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrbm93bktleXM7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW4sIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBhbGdvcml0aG0gY2FuJ3Qgb3B0aW1pemUgYnkgc2VhcmNoaW5nIGZyb20gYm90aCBlbmRzIHNpbmNlIHdlXG4gICAgLy8gZG9uJ3QgaGF2ZSBiYWNrcG9pbnRlcnMgb24gZmliZXJzLiBJJ20gdHJ5aW5nIHRvIHNlZSBob3cgZmFyIHdlIGNhbiBnZXRcbiAgICAvLyB3aXRoIHRoYXQgbW9kZWwuIElmIGl0IGVuZHMgdXAgbm90IGJlaW5nIHdvcnRoIHRoZSB0cmFkZW9mZnMsIHdlIGNhblxuICAgIC8vIGFkZCBpdCBsYXRlci5cbiAgICAvLyBFdmVuIHdpdGggYSB0d28gZW5kZWQgb3B0aW1pemF0aW9uLCB3ZSdkIHdhbnQgdG8gb3B0aW1pemUgZm9yIHRoZSBjYXNlXG4gICAgLy8gd2hlcmUgdGhlcmUgYXJlIGZldyBjaGFuZ2VzIGFuZCBicnV0ZSBmb3JjZSB0aGUgY29tcGFyaXNvbiBpbnN0ZWFkIG9mXG4gICAgLy8gZ29pbmcgZm9yIHRoZSBNYXAuIEl0J2QgbGlrZSB0byBleHBsb3JlIGhpdHRpbmcgdGhhdCBwYXRoIGZpcnN0IGluXG4gICAgLy8gZm9yd2FyZC1vbmx5IG1vZGUgYW5kIG9ubHkgZ28gZm9yIHRoZSBNYXAgb25jZSB3ZSBub3RpY2UgdGhhdCB3ZSBuZWVkXG4gICAgLy8gbG90cyBvZiBsb29rIGFoZWFkLiBUaGlzIGRvZXNuJ3QgaGFuZGxlIHJldmVyc2FsIGFzIHdlbGwgYXMgdHdvIGVuZGVkXG4gICAgLy8gc2VhcmNoIGJ1dCB0aGF0J3MgdW51c3VhbC4gQmVzaWRlcywgZm9yIHRoZSB0d28gZW5kZWQgb3B0aW1pemF0aW9uIHRvXG4gICAgLy8gd29yayBvbiBJdGVyYWJsZXMsIHdlJ2QgbmVlZCB0byBjb3B5IHRoZSB3aG9sZSBzZXQuXG4gICAgLy8gSW4gdGhpcyBmaXJzdCBpdGVyYXRpb24sIHdlJ2xsIGp1c3QgbGl2ZSB3aXRoIGhpdHRpbmcgdGhlIGJhZCBjYXNlXG4gICAgLy8gKGFkZGluZyBldmVyeXRoaW5nIHRvIGEgTWFwKSBpbiBmb3IgZXZlcnkgaW5zZXJ0L21vdmUuXG4gICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNvZGUsIGFsc28gdXBkYXRlIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IoKSB3aGljaFxuICAgIC8vIHVzZXMgdGhlIHNhbWUgYWxnb3JpdGhtLlxuICAgIHtcbiAgICAgIC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG4gICAgdmFyIG9sZEZpYmVyID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgdmFyIGxhc3RQbGFjZWRJbmRleCA9IDA7XG4gICAgdmFyIG5ld0lkeCA9IDA7XG4gICAgdmFyIG5leHRPbGRGaWJlciA9IG51bGw7XG5cbiAgICBmb3IgKDsgb2xkRmliZXIgIT09IG51bGwgJiYgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKG5ld0lkeCA9PT0gbmV3Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgX251bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLlxuXG5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7IC8vIEtlZXAgc2Nhbm5pbmcgYW5kIHVzZSB0aGUgbWFwIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtcyBhcyBtb3Zlcy5cblxuICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyMiA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyMiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXIyLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjIua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyMi5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMiwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczIgPSBuZXdJZHg7XG4gICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW5JdGVyYWJsZSwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGFzIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkoKSxcbiAgICAvLyBidXQgdXNpbmcgdGhlIGl0ZXJhdG9yIGluc3RlYWQuXG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIG9iamVjdCBpcyBub3QgYW4gaXRlcmFibGUuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiAnICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHJlbmRlcmluZyBHZW5lcmF0b3JzIGJlY2F1c2UgaXQncyBhIG11dGF0aW9uLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI5OTVcbiAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgdG9TdHJpbmdUYWdcbiAgICAgIG5ld0NoaWxkcmVuSXRlcmFibGVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0dlbmVyYXRvcicpIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRHZW5lcmF0b3JzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIEdlbmVyYXRvcnMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzIGJlY2F1c2UgZW51bWVyYXRpbmcgYSBnZW5lcmF0b3IgbXV0YXRlcyBpdC4gJyArICdZb3UgbWF5IGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgd2l0aCBgQXJyYXkuZnJvbSgpYCBvciB0aGUgJyArICdgWy4uLnNwcmVhZF1gIG9wZXJhdG9yIGJlZm9yZSByZW5kZXJpbmcuIEtlZXAgaW4gbWluZCAnICsgJ3lvdSBtaWdodCBuZWVkIHRvIHBvbHlmaWxsIHRoZXNlIGZlYXR1cmVzIGZvciBvbGRlciBicm93c2Vycy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSB0cnVlO1xuICAgICAgfSAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cblxuXG4gICAgICBpZiAobmV3Q2hpbGRyZW5JdGVyYWJsZS5lbnRyaWVzID09PSBpdGVyYXRvckZuKSB7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgIGVycm9yKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgfSAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIC8vIFdlJ2xsIGdldCBhIGRpZmZlcmVudCBpdGVyYXRvciBsYXRlciBmb3IgdGhlIG1haW4gcGFzcy5cblxuXG4gICAgICB2YXIgX25ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgICBpZiAoX25ld0NoaWxkcmVuKSB7XG4gICAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuXG4gICAgICAgIHZhciBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCk7XG5cbiAgICAgICAgZm9yICg7ICFfc3RlcC5kb25lOyBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXdDaGlsZHJlbiA9IGl0ZXJhdG9yRm4uY2FsbChuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgIGlmIChuZXdDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGl0ZXJhYmxlIG9iamVjdCBwcm92aWRlZCBubyBpdGVyYXRvci4nKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzTmV3RmliZXIgPSBudWxsO1xuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuICAgIHZhciBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpO1xuXG4gICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICB2YXIgX25ld0ZpYmVyMyA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlcjMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMywgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMztcbiAgICAgIH1cblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLlxuXG5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7IC8vIEtlZXAgc2Nhbm5pbmcgYW5kIHVzZSB0aGUgbWFwIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtcyBhcyBtb3Zlcy5cblxuICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgdmFyIF9uZXdGaWJlcjQgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgaWYgKF9uZXdGaWJlcjQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyNC5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXI0LmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjQsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyNDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICB2YXIgX251bWJlck9mRm9ya3M0ID0gbmV3SWR4O1xuICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCwgbGFuZXMpIHtcbiAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGtleXMgb24gdGV4dCBub2RlcyBzaW5jZSB3ZSBkb24ndCBoYXZlIGFcbiAgICAvLyB3YXkgdG8gZGVmaW5lIHRoZW0uXG4gICAgaWYgKGN1cnJlbnRGaXJzdENoaWxkICE9PSBudWxsICYmIGN1cnJlbnRGaXJzdENoaWxkLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBub2RlIHNvIGxldCdzIGp1c3QgdXBkYXRlIGl0IGFuZCBkZWxldGVcbiAgICAgIC8vIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmcpO1xuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH0gLy8gVGhlIGV4aXN0aW5nIGZpcnN0IGNoaWxkIGlzIG5vdCBhIHRleHQgbm9kZSBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmVcbiAgICAvLyBhbmQgZGVsZXRlIHRoZSBleGlzdGluZyBvbmVzLlxuXG5cbiAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCwgbGFuZXMpIHtcbiAgICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gICAgdmFyIGNoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gRnJhZ21lbnQpIHtcbiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2hpbGQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjaGlsZCwgZWxlbWVudCkgKSB8fCAvLyBMYXp5IHR5cGVzIHNob3VsZCByZWNvbmNpbGUgdGhlaXIgcmVzb2x2ZWQgdHlwZS5cbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsXG4gICAgICAgICAgLy8gYmVjYXVzZSBob3QgcmVsb2FkaW5nIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gcHJvZCBiZWNhdXNlXG4gICAgICAgICAgLy8gaXQgZG9lc24ndCByZXN1c3BlbmQuIFNvIHdlIGNhbid0IGxldCB0aGUgY2FsbCBiZWxvdyBzdXNwZW5kLlxuICAgICAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcblxuICAgICAgICAgICAgdmFyIF9leGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzKTtcblxuICAgICAgICAgICAgX2V4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY2hpbGQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgX2V4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2V4aXN0aW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBEaWRuJ3QgbWF0Y2guXG5cblxuICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBlbGVtZW50LmtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY3JlYXRlZDQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgX2NyZWF0ZWQ0LnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGVsZW1lbnQpO1xuICAgICAgX2NyZWF0ZWQ0LnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIF9jcmVhdGVkNDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBwb3J0YWwsIGxhbmVzKSB7XG4gICAgdmFyIGtleSA9IHBvcnRhbC5rZXk7XG4gICAgdmFyIGNoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoY2hpbGQudGFnID09PSBIb3N0UG9ydGFsICYmIGNoaWxkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvID09PSBwb3J0YWwuY29udGFpbmVySW5mbyAmJiBjaGlsZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gPT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH0gLy8gVGhpcyBBUEkgd2lsbCB0YWcgdGhlIGNoaWxkcmVuIHdpdGggdGhlIHNpZGUtZWZmZWN0IG9mIHRoZSByZWNvbmNpbGlhdGlvblxuICAvLyBpdHNlbGYuIFRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2lkZS1lZmZlY3QgbGlzdCBhcyB3ZSBwYXNzIHRocm91Z2ggdGhlXG4gIC8vIGNoaWxkcmVuIGFuZCB0aGUgcGFyZW50LlxuXG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWN1cnNpdmUuXG4gICAgLy8gSWYgdGhlIHRvcCBsZXZlbCBpdGVtIGlzIGFuIGFycmF5LCB3ZSB0cmVhdCBpdCBhcyBhIHNldCBvZiBjaGlsZHJlbixcbiAgICAvLyBub3QgYXMgYSBmcmFnbWVudC4gTmVzdGVkIGFycmF5cyBvbiB0aGUgb3RoZXIgaGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXNcbiAgICAvLyBmcmFnbWVudCBub2Rlcy4gUmVjdXJzaW9uIGhhcHBlbnMgYXQgdGhlIG5vcm1hbCBmbG93LlxuICAgIC8vIEhhbmRsZSB0b3AgbGV2ZWwgdW5rZXllZCBmcmFnbWVudHMgYXMgaWYgdGhleSB3ZXJlIGFycmF5cy5cbiAgICAvLyBUaGlzIGxlYWRzIHRvIGFuIGFtYmlndWl0eSBiZXR3ZWVuIDw+e1suLi5dfTwvPiBhbmQgPD4uLi48Lz4uXG4gICAgLy8gV2UgdHJlYXQgdGhlIGFtYmlndW91cyBjYXNlcyBhYm92ZSB0aGUgc2FtZS5cbiAgICB2YXIgaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCA9IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwgJiYgbmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSAmJiBuZXdDaGlsZC5rZXkgPT09IG51bGw7XG5cbiAgICBpZiAoaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbjtcbiAgICB9IC8vIEhhbmRsZSBvYmplY3QgdHlwZXNcblxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0OyAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIG5vbi1yZWN1cnNpdmUuXG5cbiAgICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsICcnICsgbmV3Q2hpbGQsIGxhbmVzKSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH0gLy8gUmVtYWluaW5nIGNhc2VzIGFyZSBhbGwgdHJlYXRlZCBhcyBlbXB0eS5cblxuXG4gICAgcmV0dXJuIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gIH1cblxuICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnM7XG59XG5cbnZhciByZWNvbmNpbGVDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcih0cnVlKTtcbnZhciBtb3VudENoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKGZhbHNlKTtcbmZ1bmN0aW9uIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnQuY2hpbGQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3VtaW5nIHdvcmsgbm90IHlldCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjdXJyZW50Q2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXdDaGlsZDtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgd2hpbGUgKGN1cnJlbnRDaGlsZC5zaWJsaW5nICE9PSBudWxsKSB7XG4gICAgY3VycmVudENoaWxkID0gY3VycmVudENoaWxkLnNpYmxpbmc7XG4gICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5zaWJsaW5nID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTtcbiAgICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIG5ld0NoaWxkLnNpYmxpbmcgPSBudWxsO1xufSAvLyBSZXNldCBhIHdvcmtJblByb2dyZXNzIGNoaWxkIHNldCB0byBwcmVwYXJlIGl0IGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBsYW5lcykge1xuICB2YXIgY2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICByZXNldFdvcmtJblByb2dyZXNzKGNoaWxkLCBsYW5lcyk7XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHtcbiAge1xuICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuXG4gICAge1xuICAgICAgaWYgKGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHJlbmRlcmVyU2lnaWwpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3BQcm92aWRlcihjb250ZXh0LCBwcm92aWRlckZpYmVyKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuXG4gIHtcbiAgICB7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudCwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkge1xuICAvLyBVcGRhdGUgdGhlIGNoaWxkIGxhbmVzIG9mIGFsbCB0aGUgYW5jZXN0b3JzLCBpbmNsdWRpbmcgdGhlIGFsdGVybmF0ZXMuXG4gIHZhciBub2RlID0gcGFyZW50O1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKCFpc1N1YnNldE9mTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIG5vZGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgIWlzU3Vic2V0T2ZMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcHJvcGFnYXRpb25Sb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKG5vZGUgIT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgdGhlIHByb3BhZ2F0aW9uIHJvb3Qgd2hlbiBzY2hlZHVsaW5nIGNvbnRleHQgd29yay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VfZWFnZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcykge1xuXG4gIHZhciBmaWJlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIGlmIChmaWJlciAhPT0gbnVsbCkge1xuICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgIGZpYmVyLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG5leHRGaWJlciA9IHZvaWQgMDsgLy8gVmlzaXQgdGhpcyBmaWJlci5cblxuICAgIHZhciBsaXN0ID0gZmliZXIuZGVwZW5kZW5jaWVzO1xuXG4gICAgaWYgKGxpc3QgIT09IG51bGwpIHtcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0LmZpcnN0Q29udGV4dDtcblxuICAgICAgd2hpbGUgKGRlcGVuZGVuY3kgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRleHQgbWF0Y2hlcy5cbiAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgICAgIC8vIE1hdGNoISBTY2hlZHVsZSBhbiB1cGRhdGUgb24gdGhpcyBmaWJlci5cbiAgICAgICAgICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBmb3JjZSB1cGRhdGUgb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MuXG4gICAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpO1xuICAgICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlOyAvLyBUT0RPOiBCZWNhdXNlIHdlIGRvbid0IGhhdmUgYSB3b3JrLWluLXByb2dyZXNzLCB0aGlzIHdpbGwgYWRkIHRoZVxuICAgICAgICAgICAgLy8gdXBkYXRlIHRvIHRoZSBjdXJyZW50IGZpYmVyLCB0b28sIHdoaWNoIG1lYW5zIGl0IHdpbGwgcGVyc2lzdCBldmVuIGlmXG4gICAgICAgICAgICAvLyB0aGlzIHJlbmRlciBpcyB0aHJvd24gYXdheS4gU2luY2UgaXQncyBhIHJhY2UgY29uZGl0aW9uLCBub3Qgc3VyZSBpdCdzXG4gICAgICAgICAgICAvLyB3b3J0aCBmaXhpbmcuXG4gICAgICAgICAgICAvLyBJbmxpbmVkIGBlbnF1ZXVlVXBkYXRlYCB0byByZW1vdmUgaW50ZXJsZWF2ZWQgdXBkYXRlIGNoZWNrXG5cbiAgICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIDsgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcbiAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgICAgICAgICAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7IC8vIE1hcmsgdGhlIHVwZGF0ZWQgbGFuZXMgb24gdGhlIGxpc3QsIHRvby5cblxuICAgICAgICAgIGxpc3QubGFuZXMgPSBtZXJnZUxhbmVzKGxpc3QubGFuZXMsIHJlbmRlckxhbmVzKTsgLy8gU2luY2Ugd2UgYWxyZWFkeSBmb3VuZCBhIG1hdGNoLCB3ZSBjYW4gc3RvcCB0cmF2ZXJzaW5nIHRoZVxuICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC5cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGlzIGluIHRoaXMgc3VidHJlZSwgd2UgZG9uJ3Qga25vd1xuICAgICAgLy8gaWYgaXQgd2lsbCBoYXZlIGFueSBjb250ZXh0IGNvbnN1bWVycyBpbiBpdC4gVGhlIGJlc3Qgd2UgY2FuIGRvIGlzXG4gICAgICAvLyBtYXJrIGl0IGFzIGhhdmluZyB1cGRhdGVzLlxuICAgICAgdmFyIHBhcmVudFN1c3BlbnNlID0gZmliZXIucmV0dXJuO1xuXG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBqdXN0IGNhbWUgZnJvbSBhIHBhcmVudCBzbyB3ZSBtdXN0IGhhdmUgaGFkIGEgcGFyZW50LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRTdXNwZW5zZS5sYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50U3VzcGVuc2UubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfYWx0ZXJuYXRlID0gcGFyZW50U3VzcGVuc2UuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoX2FsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBfYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhfYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBwYXNzaW5nIHRoaXMgZmliZXIgYXMgdGhlIHBhcmVudFxuICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50IHRvIHNjaGVkdWxlIHRoaXMgZmliZXIgYXMgaGF2aW5nIHdvcmtcbiAgICAgIC8vIG9uIGl0cyBjaGlsZHJlbi4gV2UnbGwgdXNlIHRoZSBjaGlsZExhbmVzIG9uXG4gICAgICAvLyB0aGlzIGZpYmVyIHRvIGluZGljYXRlIHRoYXQgYSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG5cbiAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgocGFyZW50U3VzcGVuc2UsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5zaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcmF2ZXJzZSBkb3duLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICBuZXh0RmliZXIucmV0dXJuID0gZmliZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNoaWxkLiBUcmF2ZXJzZSB0byBuZXh0IHNpYmxpbmcuXG4gICAgICBuZXh0RmliZXIgPSBmaWJlcjtcblxuICAgICAgd2hpbGUgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dEZpYmVyID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIC8vIFdlJ3JlIGJhY2sgdG8gdGhlIHJvb3Qgb2YgdGhpcyBzdWJ0cmVlLiBFeGl0LlxuICAgICAgICAgIG5leHRGaWJlciA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2libGluZyA9IG5leHRGaWJlci5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgc2libGluZyB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgICAgICBzaWJsaW5nLnJldHVybiA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICAgICAgbmV4dEZpYmVyID0gc2libGluZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSAvLyBObyBtb3JlIHNpYmxpbmdzLiBUcmF2ZXJzZSB1cC5cblxuXG4gICAgICAgIG5leHRGaWJlciA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBuZXh0RmliZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuICB2YXIgZGVwZW5kZW5jaWVzID0gd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzO1xuXG4gIGlmIChkZXBlbmRlbmNpZXMgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICB2YXIgZmlyc3RDb250ZXh0ID0gZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dDtcblxuICAgICAgaWYgKGZpcnN0Q29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShkZXBlbmRlbmNpZXMubGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAgIC8vIENvbnRleHQgbGlzdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS4gTWFyayB0aGF0IHRoaXMgZmliZXIgcGVyZm9ybWVkIHdvcmsuXG4gICAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICAgICAgfSAvLyBSZXNldCB0aGUgd29yay1pbi1wcm9ncmVzcyBsaXN0XG5cblxuICAgICAgICBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlYWRDb250ZXh0KGNvbnRleHQpIHtcbiAge1xuICAgIC8vIFRoaXMgd2FybmluZyB3b3VsZCBmaXJlIGlmIHlvdSByZWFkIGNvbnRleHQgaW5zaWRlIGEgSG9vayBsaWtlIHVzZU1lbW8uXG4gICAgLy8gVW5saWtlIHRoZSBjbGFzcyBjaGVjayBiZWxvdywgaXQncyBub3QgZW5mb3JjZWQgaW4gcHJvZHVjdGlvbiBmb3IgcGVyZi5cbiAgICBpZiAoaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVikge1xuICAgICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB2YWx1ZSA9ICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgO1xuXG4gIGlmIChsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPT09IGNvbnRleHQpIDsgZWxzZSB7XG4gICAgdmFyIGNvbnRleHRJdGVtID0ge1xuICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIG1lbW9pemVkVmFsdWU6IHZhbHVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAobGFzdENvbnRleHREZXBlbmRlbmN5ID09PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICAgIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGVwZW5kZW5jeSBmb3IgdGhpcyBjb21wb25lbnQuIENyZWF0ZSBhIG5ldyBsaXN0LlxuXG5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGNvbnRleHRJdGVtO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIuZGVwZW5kZW5jaWVzID0ge1xuICAgICAgICBsYW5lczogTm9MYW5lcyxcbiAgICAgICAgZmlyc3RDb250ZXh0OiBjb250ZXh0SXRlbVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIGEgbmV3IGNvbnRleHQgaXRlbS5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGxhc3RDb250ZXh0RGVwZW5kZW5jeS5uZXh0ID0gY29udGV4dEl0ZW07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZW5kZXIuIFdoZW4gdGhpcyByZW5kZXIgZXhpdHMsIGVpdGhlciBiZWNhdXNlIGl0IGZpbmlzaGVzIG9yIGJlY2F1c2UgaXQgaXNcbi8vIGludGVycnVwdGVkLCB0aGUgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsIGJlIHRyYW5zZmVycmVkIG9udG8gdGhlIG1haW4gcGFydFxuLy8gb2YgdGhlIHF1ZXVlLlxuXG52YXIgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG5mdW5jdGlvbiBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKSB7XG4gIGlmIChjb25jdXJyZW50UXVldWVzID09PSBudWxsKSB7XG4gICAgY29uY3VycmVudFF1ZXVlcyA9IFtxdWV1ZV07XG4gIH0gZWxzZSB7XG4gICAgY29uY3VycmVudFF1ZXVlcy5wdXNoKHF1ZXVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpIHtcbiAgLy8gVHJhbnNmZXIgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgb250byB0aGUgbWFpbiBxdWV1ZS4gRWFjaCBxdWV1ZSBoYXMgYVxuICAvLyBgcGVuZGluZ2AgZmllbGQgYW5kIGFuIGBpbnRlcmxlYXZlZGAgZmllbGQuIFdoZW4gdGhleSBhcmUgbm90IG51bGwsIHRoZXlcbiAgLy8gcG9pbnQgdG8gdGhlIGxhc3Qgbm9kZSBpbiBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LiBXZSBuZWVkIHRvIGFwcGVuZCB0aGVcbiAgLy8gaW50ZXJsZWF2ZWQgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBwZW5kaW5nIGxpc3QgYnkgam9pbmluZyB0aGVtIGludG8gYVxuICAvLyBzaW5nbGUsIGNpcmN1bGFyIGxpc3QuXG4gIGlmIChjb25jdXJyZW50UXVldWVzICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jdXJyZW50UXVldWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVldWUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgdmFyIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gICAgICBpZiAobGFzdEludGVybGVhdmVkVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLmludGVybGVhdmVkID0gbnVsbDtcbiAgICAgICAgdmFyIGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dDtcbiAgICAgICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcXVldWUucGVuZGluZztcblxuICAgICAgICBpZiAobGFzdFBlbmRpbmdVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgICAgICBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlQW5kRWFnZXJseUJhaWxvdXQoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50Q2xhc3NVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSkge1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufSAvLyBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBiZSBkb25lIGZvciBiYWNrd2FyZHNcbi8vIGNvbXBhdGliaWxpdHkgYW5kIHNob3VsZCBhbHdheXMgYmUgYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nLlxuXG52YXIgdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Q7XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCBsYW5lKSB7XG4gIC8vIFVwZGF0ZSB0aGUgc291cmNlIGZpYmVyJ3MgbGFuZXNcbiAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIGxhbmUpO1xuICB9XG5cbiAge1xuICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgJiYgKHNvdXJjZUZpYmVyLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICB9XG4gIH0gLy8gV2FsayB0aGUgcGFyZW50IHBhdGggdG8gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMuXG5cblxuICB2YXIgbm9kZSA9IHNvdXJjZUZpYmVyO1xuICB2YXIgcGFyZW50ID0gc291cmNlRmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBwYXJlbnQuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50LmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIGFsdGVybmF0ZSA9IHBhcmVudC5hbHRlcm5hdGU7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICgocGFyZW50LmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gcGFyZW50O1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgdmFyIHJvb3QgPSBub2RlLnN0YXRlTm9kZTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgVXBkYXRlU3RhdGUgPSAwO1xudmFyIFJlcGxhY2VTdGF0ZSA9IDE7XG52YXIgRm9yY2VVcGRhdGUgPSAyO1xudmFyIENhcHR1cmVVcGRhdGUgPSAzOyAvLyBHbG9iYWwgc3RhdGUgdGhhdCBpcyByZXNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAuXG4vLyBJdCBzaG91bGQgb25seSBiZSByZWFkIHJpZ2h0IGFmdGVyIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAsIHZpYVxuLy8gYGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmdgLlxuXG52YXIgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlO1xudmFyIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZTtcblxue1xuICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gZmFsc2U7XG4gIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemVVcGRhdGVRdWV1ZShmaWJlcikge1xuICB2YXIgcXVldWUgPSB7XG4gICAgYmFzZVN0YXRlOiBmaWJlci5tZW1vaXplZFN0YXRlLFxuICAgIGZpcnN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBsYXN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBzaGFyZWQ6IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICAgIGxhbmVzOiBOb0xhbmVzXG4gICAgfSxcbiAgICBlZmZlY3RzOiBudWxsXG4gIH07XG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG59XG5mdW5jdGlvbiBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIENsb25lIHRoZSB1cGRhdGUgcXVldWUgZnJvbSBjdXJyZW50LiBVbmxlc3MgaXQncyBhbHJlYWR5IGEgY2xvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgIHZhciBjbG9uZSA9IHtcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSxcbiAgICAgIGxhc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUsXG4gICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsXG4gICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgIH07XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjbG9uZTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGV2ZW50VGltZTogZXZlbnRUaW1lLFxuICAgIGxhbmU6IGxhbmUsXG4gICAgdGFnOiBVcGRhdGVTdGF0ZSxcbiAgICBwYXlsb2FkOiBudWxsLFxuICAgIGNhbGxiYWNrOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIHtcbiAgICBpZiAoY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBzaGFyZWRRdWV1ZSAmJiAhZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSkge1xuICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgJyArICdmcm9tIGluc2lkZSBhbiB1cGRhdGUgZnVuY3Rpb24uIFVwZGF0ZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHB1cmUsICcgKyAnd2l0aCB6ZXJvIHNpZGUtZWZmZWN0cy4gQ29uc2lkZXIgdXNpbmcgY29tcG9uZW50RGlkVXBkYXRlIG9yIGEgJyArICdjYWxsYmFjay4nKTtcblxuICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZSgpKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1bnNhZmUgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gQWRkIGRpcmVjdGx5IHRvIHRoZSB1cGRhdGVcbiAgICAvLyBxdWV1ZSBzbyB3ZSBjYW4gcHJvY2VzcyBpdCBpbW1lZGlhdGVseSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyLlxuICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgfVxuXG4gICAgc2hhcmVkUXVldWUucGVuZGluZyA9IHVwZGF0ZTsgLy8gVXBkYXRlIHRoZSBjaGlsZExhbmVzIGV2ZW4gdGhvdWdoIHdlJ3JlIG1vc3QgbGlrZWx5IGFscmVhZHkgcmVuZGVyaW5nXG4gICAgLy8gdGhpcyBmaWJlci4gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaW4gdGhlIGNhc2Ugd2hlcmUgeW91XG4gICAgLy8gdXBkYXRlIGEgZGlmZmVyZW50IGNvbXBvbmVudCBkdXJpbmcgcmVuZGVyIHBoYXNlIHRoYW4gdGhlIG9uZSB0aGF0IGlzXG4gICAgLy8gY3VycmVudGx5IHJlbmRlcmluZ3MgKGEgcGF0dGVybiB0aGF0IGlzIGFjY29tcGFuaWVkIGJ5IGEgd2FybmluZykuXG5cbiAgICByZXR1cm4gdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgc2hhcmVkUXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHNoYXJlZFF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5IG11c3RcbiAgICAvLyBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaCByZXByZXNlbnRzXG4gICAgLy8gYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW50YW5nbGVcbiAgICAvLyBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmIHdlICpkb24ndCpcbiAgICAvLyBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgc2hhcmVkUXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY2FwdHVyZWRVcGRhdGUpIHtcbiAgLy8gQ2FwdHVyZWQgdXBkYXRlcyBhcmUgdXBkYXRlcyB0aGF0IGFyZSB0aHJvd24gYnkgYSBjaGlsZCBkdXJpbmcgdGhlIHJlbmRlclxuICAvLyBwaGFzZS4gVGhleSBzaG91bGQgYmUgZGlzY2FyZGVkIGlmIHRoZSByZW5kZXIgaXMgYWJvcnRlZC4gVGhlcmVmb3JlLFxuICAvLyB3ZSBzaG91bGQgb25seSBwdXQgdGhlbSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSwgbm90IHRoZSBjdXJyZW50IG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7IC8vIENoZWNrIGlmIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIGEgY2xvbmUuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICAgIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlblxuICAgICAgLy8gd2UgYmFpbCBvdXQgb24gYSBwYXJlbnQgZmliZXIgdGhhdCB0aGVuIGNhcHR1cmVzIGFuIGVycm9yIHRocm93biBieVxuICAgICAgLy8gYSBjaGlsZC4gU2luY2Ugd2Ugd2FudCB0byBhcHBlbmQgdGhlIHVwZGF0ZSBvbmx5IHRvIHRoZSB3b3JrLWluXG4gICAgICAvLyAtcHJvZ3Jlc3MgcXVldWUsIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHVwZGF0ZXMuIFdlIHVzdWFsbHkgY2xvbmUgZHVyaW5nXG4gICAgICAvLyBwcm9jZXNzVXBkYXRlUXVldWUsIGJ1dCB0aGF0IGRpZG4ndCBoYXBwZW4gaW4gdGhpcyBjYXNlIGJlY2F1c2Ugd2VcbiAgICAgIC8vIHNraXBwZWQgb3ZlciB0aGUgcGFyZW50IHdoZW4gd2UgYmFpbGVkIG91dC5cbiAgICAgIHZhciBuZXdGaXJzdCA9IG51bGw7XG4gICAgICB2YXIgbmV3TGFzdCA9IG51bGw7XG4gICAgICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdXBkYXRlcyBhbmQgY2xvbmUgdGhlbS5cbiAgICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGUuZXZlbnRUaW1lLFxuICAgICAgICAgICAgbGFuZTogdXBkYXRlLmxhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgICAgICBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7IC8vIEFwcGVuZCB0aGUgY2FwdHVyZWQgdXBkYXRlIHRoZSBlbmQgb2YgdGhlIGNsb25lZCBsaXN0LlxuXG5cbiAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgICBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBubyBiYXNlIHVwZGF0ZXMuXG4gICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSA9IHtcbiAgICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IG5ld0ZpcnN0LFxuICAgICAgICBsYXN0QmFzZVVwZGF0ZTogbmV3TGFzdCxcbiAgICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cblxuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gIH1cblxuICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIHByZXZTdGF0ZSwgbmV4dFByb3BzLCBpbnN0YW5jZSkge1xuICBzd2l0Y2ggKHVwZGF0ZS50YWcpIHtcbiAgICBjYXNlIFJlcGxhY2VTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICAgICAgfSAvLyBTdGF0ZSBvYmplY3RcblxuXG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYXB0dXJlVXBkYXRlOlxuICAgICAge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgfVxuICAgIC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFVwZGF0ZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgX3BheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcbiAgICAgICAgdmFyIHBhcnRpYWxTdGF0ZTtcblxuICAgICAgICBpZiAodHlwZW9mIF9wYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yY2VVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIGhhc0ZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmV2U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgcHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7XG4gIH1cblxuICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTsgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcy4gSWYgc28sIHRyYW5zZmVyIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7IC8vIFRoZSBwZW5kaW5nIHF1ZXVlIGlzIGNpcmN1bGFyLiBEaXNjb25uZWN0IHRoZSBwb2ludGVyIGJldHdlZW4gZmlyc3RcbiAgICAvLyBhbmQgbGFzdCBzbyB0aGF0IGl0J3Mgbm9uLWNpcmN1bGFyLlxuXG4gICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsOyAvLyBBcHBlbmQgcGVuZGluZyB1cGRhdGVzIHRvIGJhc2UgcXVldWVcblxuICAgIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH1cblxuICAgIGxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7IC8vIElmIHRoZXJlJ3MgYSBjdXJyZW50IHF1ZXVlLCBhbmQgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgYmFzZSBxdWV1ZSwgdGhlblxuICAgIC8vIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlIHVwZGF0ZXMgdG8gdGhhdCBxdWV1ZSwgdG9vLiBCZWNhdXNlIHRoZSBiYXNlXG4gICAgLy8gcXVldWUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgd2l0aCBubyBjeWNsZXMsIHdlIGNhbiBhcHBlbmQgdG8gYm90aFxuICAgIC8vIGxpc3RzIGFuZCB0YWtlIGFkdmFudGFnZSBvZiBzdHJ1Y3R1cmFsIHNoYXJpbmcuXG4gICAgLy8gVE9ETzogUGFzcyBgY3VycmVudGAgYXMgYXJndW1lbnRcblxuICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgdmFyIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSAhPT0gbGFzdEJhc2VVcGRhdGUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudExhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgYXMgd2UgcHJvY2VzcyB0aGUgcXVldWUuXG5cblxuICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHVwZGF0ZXMgdG8gY29tcHV0ZSB0aGUgcmVzdWx0LlxuICAgIHZhciBuZXdTdGF0ZSA9IHF1ZXVlLmJhc2VTdGF0ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmUgcmVuZGVyTGFuZXNcbiAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuICAgIHZhciBuZXdMYW5lcyA9IE5vTGFuZXM7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0xhc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcbiAgICAgIHZhciB1cGRhdGVFdmVudFRpbWUgPSB1cGRhdGUuZXZlbnRUaW1lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG5cblxuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIG5ld1N0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBuZXdTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdXBkYXRlLmNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiAvLyBJZiB0aGUgdXBkYXRlIHdhcyBhbHJlYWR5IGNvbW1pdHRlZCwgd2Ugc2hvdWxkIG5vdCBxdWV1ZSBpdHNcbiAgICAgICAgLy8gY2FsbGJhY2sgYWdhaW4uXG4gICAgICAgIHVwZGF0ZS5sYW5lICE9PSBOb0xhbmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAgIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gICAgLy8gYXJlIHJlbWFpbmluZy5cblxuICAgIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5zaGFyZWQuaW50ZXJsZWF2ZWQ7XG5cbiAgICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCBpbnRlcmxlYXZlZC5sYW5lKTtcbiAgICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gICAgfSBlbHNlIGlmIChmaXJzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAgcXVldWUuc2hhcmVkLmxhbmVzID0gTm9MYW5lcztcbiAgICB9IC8vIFNldCB0aGUgcmVtYWluaW5nIGV4cGlyYXRpb24gdGltZSB0byBiZSB3aGF0ZXZlciBpcyByZW1haW5pbmcgaW4gdGhlIHF1ZXVlLlxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIGZpbmUgYmVjYXVzZSB0aGUgb25seSB0d28gb3RoZXIgdGhpbmdzIHRoYXQgY29udHJpYnV0ZSB0b1xuICAgIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGVcbiAgICAvLyBiZWdpbiBwaGFzZSBieSB0aGUgdGltZSB3ZSBzdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZSwgc28gd2UndmUgYWxyZWFkeVxuICAgIC8vIGRlYWx0IHdpdGggdGhlIHByb3BzLiBDb250ZXh0IGluIGNvbXBvbmVudHMgdGhhdCBzcGVjaWZ5XG4gICAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3JcbiAgICAvLyB0aGF0IHJlZ2FyZGxlc3MuXG5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkICcgKyAoXCJyZWNlaXZlZDogXCIgKyBjYWxsYmFjaykpO1xuICB9XG5cbiAgY2FsbGJhY2suY2FsbChjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKSB7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkge1xuICByZXR1cm4gaGFzRm9yY2VVcGRhdGU7XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIGZpbmlzaGVkUXVldWUsIGluc3RhbmNlKSB7XG4gIC8vIENvbW1pdCB0aGUgZWZmZWN0c1xuICB2YXIgZWZmZWN0cyA9IGZpbmlzaGVkUXVldWUuZWZmZWN0cztcbiAgZmluaXNoZWRRdWV1ZS5lZmZlY3RzID0gbnVsbDtcblxuICBpZiAoZWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVmZmVjdCA9IGVmZmVjdHNbaV07XG4gICAgICB2YXIgY2FsbGJhY2sgPSBlZmZlY3QuY2FsbGJhY2s7XG5cbiAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcbnZhciBjb250ZXh0U3RhY2tDdXJzb3IkMSA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcblxuZnVuY3Rpb24gcmVxdWlyZWRDb250ZXh0KGMpIHtcbiAgaWYgKGMgPT09IE5PX0NPTlRFWFQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhvc3QgY29udGV4dCB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3RIb3N0Q29udGFpbmVyKCkge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICByZXR1cm4gcm9vdEluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRhaW5lcihmaWJlciwgbmV4dFJvb3RJbnN0YW5jZSkge1xuICAvLyBQdXNoIGN1cnJlbnQgcm9vdCBpbnN0YW5jZSBvbnRvIHRoZSBzdGFjaztcbiAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcmVzZXQgcm9vdCB3aGVuIHBvcnRhbHMgYXJlIHBvcHBlZC5cbiAgcHVzaChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgbmV4dFJvb3RJbnN0YW5jZSwgZmliZXIpOyAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpOyAvLyBGaW5hbGx5LCB3ZSBuZWVkIHRvIHB1c2ggdGhlIGhvc3QgY29udGV4dCB0byB0aGUgc3RhY2suXG4gIC8vIEhvd2V2ZXIsIHdlIGNhbid0IGp1c3QgY2FsbCBnZXRSb290SG9zdENvbnRleHQoKSBhbmQgcHVzaCBpdCBiZWNhdXNlXG4gIC8vIHdlJ2QgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZW50cmllcyBvbiB0aGUgc3RhY2sgZGVwZW5kaW5nIG9uXG4gIC8vIHdoZXRoZXIgZ2V0Um9vdEhvc3RDb250ZXh0KCkgdGhyb3dzIHNvbWV3aGVyZSBpbiByZW5kZXJlciBjb2RlIG9yIG5vdC5cbiAgLy8gU28gd2UgcHVzaCBhbiBlbXB0eSB2YWx1ZSBmaXJzdC4gVGhpcyBsZXRzIHVzIHNhZmVseSB1bndpbmQgb24gZXJyb3JzLlxuXG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIE5PX0NPTlRFWFQsIGZpYmVyKTtcbiAgdmFyIG5leHRSb290Q29udGV4dCA9IGdldFJvb3RIb3N0Q29udGV4dChuZXh0Um9vdEluc3RhbmNlKTsgLy8gTm93IHRoYXQgd2Uga25vdyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3csIHJlcGxhY2UgaXQuXG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRSb290Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGFpbmVyKGZpYmVyKSB7XG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcG9wKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RDb250ZXh0KCkge1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGV4dChmaWJlcikge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZ2V0Q2hpbGRIb3N0Q29udGV4dChjb250ZXh0LCBmaWJlci50eXBlKTsgLy8gRG9uJ3QgcHVzaCB0aGlzIEZpYmVyJ3MgY29udGV4dCB1bmxlc3MgaXQncyB1bmlxdWUuXG5cbiAgaWYgKGNvbnRleHQgPT09IG5leHRDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG5cbiAgcHVzaChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRleHQoZmliZXIpIHtcbiAgLy8gRG8gbm90IHBvcCB1bmxlc3MgdGhpcyBGaWJlciBwcm92aWRlZCB0aGUgY3VycmVudCBjb250ZXh0LlxuICAvLyBwdXNoSG9zdENvbnRleHQoKSBvbmx5IHB1c2hlcyBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cbiAgaWYgKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGZpYmVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG52YXIgRGVmYXVsdFN1c3BlbnNlQ29udGV4dCA9IDA7IC8vIFRoZSBTdXNwZW5zZSBDb250ZXh0IGlzIHNwbGl0IGludG8gdHdvIHBhcnRzLiBUaGUgbG93ZXIgYml0cyBpc1xuLy8gaW5oZXJpdGVkIGRlZXBseSBkb3duIHRoZSBzdWJ0cmVlLiBUaGUgdXBwZXIgYml0cyBvbmx5IGFmZmVjdFxuLy8gdGhpcyBpbW1lZGlhdGUgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGdldHMgcmVzZXQgZWFjaCBuZXdcbi8vIGJvdW5kYXJ5IG9yIHN1c3BlbnNlIGxpc3QuXG5cbnZhciBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayA9IDE7IC8vIFN1YnRyZWUgRmxhZ3M6XG4vLyBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgaW5kaWNhdGVzIHRoYXQgb25lIG9mIG91ciBwYXJlbnQgU3VzcGVuc2Vcbi8vIGJvdW5kYXJpZXMgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nIHZpc2libGUgbWFpbiBjb250ZW50LlxuLy8gRWl0aGVyIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgb3IgaXMgbm90IG1vdW50ZWQgYXQgYWxsLlxuLy8gV2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiBpdCBpcyBkZXNpcmFibGUgdG8gdHJpZ2dlciBhIGZhbGxiYWNrIGF0XG4vLyB0aGUgcGFyZW50LiBJZiBub3QsIHRoZW4gd2UgbWlnaHQgbmVlZCB0byB0cmlnZ2VyIHVuZGVzaXJhYmxlIGJvdW5kYXJpZXNcbi8vIGFuZC9vciBzdXNwZW5kIHRoZSBjb21taXQgdG8gYXZvaWQgaGlkaW5nIHRoZSBwYXJlbnQgY29udGVudC5cblxudmFyIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCA9IDE7IC8vIFNoYWxsb3cgRmxhZ3M6XG4vLyBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgY2FuIGJlIHVzZWQgYnkgU3VzcGVuc2VMaXN0IHRvIGZvcmNlIG5ld2x5IGFkZGVkXG4vLyBpdGVtcyBpbnRvIHRoZWlyIGZhbGxiYWNrIHN0YXRlIGR1cmluZyBvbmUgb2YgdGhlIHJlbmRlciBwYXNzZXMuXG5cbnZhciBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgPSAyO1xudmFyIHN1c3BlbnNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoRGVmYXVsdFN1c3BlbnNlQ29udGV4dCk7XG5mdW5jdGlvbiBoYXNTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgZmxhZykge1xuICByZXR1cm4gKHBhcmVudENvbnRleHQgJiBmbGFnKSAhPT0gMDtcbn1cbmZ1bmN0aW9uIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzaztcbn1cbmZ1bmN0aW9uIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgc2hhbGxvd0NvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayB8IHNoYWxsb3dDb250ZXh0O1xufVxuZnVuY3Rpb24gYWRkU3VidHJlZVN1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzdWJ0cmVlQ29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCB8IHN1YnRyZWVDb250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFN1c3BlbnNlQ29udGV4dChmaWJlciwgbmV3Q29udGV4dCkge1xuICBwdXNoKHN1c3BlbnNlU3RhY2tDdXJzb3IsIG5ld0NvbnRleHQsIGZpYmVyKTtcbn1cbmZ1bmN0aW9uIHBvcFN1c3BlbnNlQ29udGV4dChmaWJlcikge1xuICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uod29ya0luUHJvZ3Jlc3MsIGhhc0ludmlzaWJsZVBhcmVudCkge1xuICAvLyBJZiBpdCB3YXMgdGhlIHByaW1hcnkgY2hpbGRyZW4gdGhhdCBqdXN0IHN1c3BlbmRlZCwgY2FwdHVyZSBhbmQgcmVuZGVyIHRoZVxuICAvLyBmYWxsYmFjay4gT3RoZXJ3aXNlLCBkb24ndCBjYXB0dXJlIGFuZCBidWJibGUgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbHdheXMgY2FwdHVyZXMuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzOyAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuXG5cbiAge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIGl0J3MgYSBib3VuZGFyeSB3ZSBzaG91bGQgYXZvaWQsIHRoZW4gd2UgcHJlZmVyIHRvIGJ1YmJsZSB1cCB0byB0aGVcbn1cbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgdmFyIG5vZGUgPSByb3c7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgZGVoeWRyYXRlZCA9IHN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IG51bGwgfHwgaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhkZWh5ZHJhdGVkKSB8fCBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhkZWh5ZHJhdGVkKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3RcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaXQgc3VzcGVuZGVkIG9yIG5vdC5cbiAgICBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgTm9GbGFncyQxID1cbi8qICAgKi9cbjA7IC8vIFJlcHJlc2VudHMgd2hldGhlciBlZmZlY3Qgc2hvdWxkIGZpcmUuXG5cbnZhciBIYXNFZmZlY3QgPVxuLyogKi9cbjE7IC8vIFJlcHJlc2VudHMgdGhlIHBoYXNlIGluIHdoaWNoIHRoZSBlZmZlY3QgKG5vdCB0aGUgY2xlYW4tdXApIGZpcmVzLlxuXG52YXIgSW5zZXJ0aW9uID1cbi8qICAqL1xuMjtcbnZhciBMYXlvdXQgPVxuLyogICAgKi9cbjQ7XG52YXIgUGFzc2l2ZSQxID1cbi8qICAgKi9cbjg7XG5cbi8vIGFuZCBzaG91bGQgYmUgcmVzZXQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IHJlbmRlci5cbi8vIFRoaXMgdHJhY2tzIHdoaWNoIG11dGFibGUgc291cmNlcyBuZWVkIHRvIGJlIHJlc2V0IGFmdGVyIGEgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NTb3VyY2VzID0gW107XG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG11dGFibGVTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzc1NvdXJjZXNbaV07XG5cbiAgICB7XG4gICAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoID0gMDtcbn1cbi8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2ZXJzaW9uIHVzZWQgZm9yIHNlcnZlciByZW5kZXJpbmcgbWF0Y2hlcyB0aGUgb25lXG4vLyB0aGF0IGlzIGV2ZW50dWFsbHkgcmVhZCBkdXJpbmcgaHlkcmF0aW9uLlxuLy8gSWYgdGhleSBkb24ndCBtYXRjaCB0aGVyZSdzIGEgcG90ZW50aWFsIHRlYXIgYW5kIGEgZnVsbCBkZW9wdCByZW5kZXIgaXMgcmVxdWlyZWQuXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKSB7XG4gIHZhciBnZXRWZXJzaW9uID0gbXV0YWJsZVNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKG11dGFibGVTb3VyY2UuX3NvdXJjZSk7IC8vIFRPRE8gQ2xlYXIgdGhpcyBkYXRhIG9uY2UgYWxsIHBlbmRpbmcgaHlkcmF0aW9uIHdvcmsgaXMgZmluaXNoZWQuXG4gIC8vIFJldGFpbmluZyBpdCBmb3JldmVyIG1heSBpbnRlcmZlcmUgd2l0aCBHQy5cblxuICBpZiAocm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID09IG51bGwpIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBbbXV0YWJsZVNvdXJjZSwgdmVyc2lvbl07XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobXV0YWJsZVNvdXJjZSwgdmVyc2lvbik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdDtcblxue1xuICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG59XG5cbi8vIFRoZXNlIGFyZSBzZXQgcmlnaHQgYmVmb3JlIGNhbGxpbmcgdGhlIGNvbXBvbmVudC5cbnZhciByZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBJJ3ZlIG5hbWVkIGl0IGRpZmZlcmVudGx5IHRvIGRpc3Rpbmd1aXNoIGl0IGZyb21cbi8vIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDsgLy8gSG9va3MgYXJlIHN0b3JlZCBhcyBhIGxpbmtlZCBsaXN0IG9uIHRoZSBmaWJlcidzIG1lbW9pemVkU3RhdGUgZmllbGQuIFRoZVxuLy8gY3VycmVudCBob29rIGxpc3QgaXMgdGhlIGxpc3QgdGhhdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IGZpYmVyLiBUaGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBsaXN0IGlzIGEgbmV3IGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBmaWJlci5cblxudmFyIGN1cnJlbnRIb29rID0gbnVsbDtcbnZhciB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsOyAvLyBXaGV0aGVyIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpc1xuLy8gZG9lcyBub3QgZ2V0IHJlc2V0IGlmIHdlIGRvIGFub3RoZXIgcmVuZGVyIHBhc3M7IG9ubHkgd2hlbiB3ZSdyZSBjb21wbGV0ZWx5XG4vLyBmaW5pc2hlZCBldmFsdWF0aW5nIHRoaXMgY29tcG9uZW50LiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBzbyB3ZSBrbm93XG4vLyB3aGV0aGVyIHdlIG5lZWQgdG8gY2xlYXIgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYWZ0ZXIgYSB0aHJvdy5cblxudmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gV2hlcmUgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb25seSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MuIFRoaXNcbi8vIGdldHMgcmVzZXQgYWZ0ZXIgZWFjaCBhdHRlbXB0LlxuLy8gVE9ETzogTWF5YmUgdGhlcmUncyBzb21lIHdheSB0byBjb25zb2xpZGF0ZSB0aGlzIHdpdGhcbi8vIGBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlYC4gT3Igd2l0aCBgbnVtYmVyT2ZSZVJlbmRlcnNgLlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7IC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIHVzZUlkIGhvb2tzIGluIHRoaXMgY29tcG9uZW50LlxuXG52YXIgbG9jYWxJZENvdW50ZXIgPSAwOyAvLyBVc2VkIGZvciBpZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGNvbXBsZXRlbHkgY2xpZW50LXNpZGUgKGkuZS4gbm90IGR1cmluZ1xuLy8gaHlkcmF0aW9uKS4gVGhpcyBjb3VudGVyIGlzIGdsb2JhbCwgc28gY2xpZW50IGlkcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3Ncbi8vIHJlbmRlciBhdHRlbXB0cy5cblxudmFyIGdsb2JhbENsaWVudElkQ291bnRlciA9IDA7XG52YXIgUkVfUkVOREVSX0xJTUlUID0gMjU7IC8vIEluIERFViwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcmltaXRpdmUgaG9va1xuXG52YXIgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsOyAvLyBJbiBERVYsIHRoaXMgbGlzdCBlbnN1cmVzIHRoYXQgaG9va3MgYXJlIGNhbGxlZCBpbiB0aGUgc2FtZSBvcmRlciBiZXR3ZWVuIHJlbmRlcnMuXG4vLyBUaGUgbGlzdCBzdG9yZXMgdGhlIG9yZGVyIG9mIGhvb2tzIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsIHJlbmRlciAobW91bnQpLlxuLy8gU3Vic2VxdWVudCByZW5kZXJzICh1cGRhdGVzKSByZWZlcmVuY2UgdGhpcyBsaXN0LlxuXG52YXIgaG9va1R5cGVzRGV2ID0gbnVsbDtcbnZhciBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBJbiBERVYsIHRoaXMgdHJhY2tzIHdoZXRoZXIgY3VycmVudGx5IHJlbmRlcmluZyBjb21wb25lbnQgbmVlZHMgdG8gaWdub3JlXG4vLyB0aGUgZGVwZW5kZW5jaWVzIGZvciBIb29rcyB0aGF0IG5lZWQgdGhlbSAoZS5nLiB1c2VFZmZlY3Qgb3IgdXNlTWVtbykuXG4vLyBXaGVuIHRydWUsIHN1Y2ggSG9va3Mgd2lsbCBhbHdheXMgYmUgXCJyZW1vdW50ZWRcIi4gT25seSB1c2VkIGR1cmluZyBob3QgcmVsb2FkLlxuXG52YXIgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gbW91bnRIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgPT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc0RldiA9IFtob29rTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tUeXBlc0Rldi5wdXNoKGhvb2tOYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldisrO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2W2hvb2tUeXBlc1VwZGF0ZUluZGV4RGV2XSAhPT0gaG9va05hbWUpIHtcbiAgICAgICAgd2Fybk9uSG9va01pc21hdGNoSW5EZXYoaG9va05hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKSB7XG4gIHtcbiAgICBpZiAoZGVwcyAhPT0gdW5kZWZpbmVkICYmIGRlcHMgIT09IG51bGwgJiYgIWlzQXJyYXkoZGVwcykpIHtcbiAgICAgIC8vIFZlcmlmeSBkZXBzLCBidXQgb25seSBvbiBtb3VudCB0byBhdm9pZCBleHRyYSBjaGVja3MuXG4gICAgICAvLyBJdCdzIHVubGlrZWx5IHRoZWlyIHR5cGUgd291bGQgY2hhbmdlIGFzIHVzdWFsbHkgeW91IGRlZmluZSB0aGVtIGlubGluZS5cbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5IChpbnN0ZWFkLCByZWNlaXZlZCBgJXNgKS4gV2hlbiAnICsgJ3NwZWNpZmllZCwgdGhlIGZpbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkuJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIHR5cGVvZiBkZXBzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSG9va01pc21hdGNoSW5EZXYoY3VycmVudEhvb2tOYW1lKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSk7XG5cbiAgICBpZiAoIWRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHRhYmxlID0gJyc7XG4gICAgICAgIHZhciBzZWNvbmRDb2x1bW5TdGFydCA9IDMwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICB2YXIgb2xkSG9va05hbWUgPSBob29rVHlwZXNEZXZbaV07XG4gICAgICAgICAgdmFyIG5ld0hvb2tOYW1lID0gaSA9PT0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPyBjdXJyZW50SG9va05hbWUgOiBvbGRIb29rTmFtZTtcbiAgICAgICAgICB2YXIgcm93ID0gaSArIDEgKyBcIi4gXCIgKyBvbGRIb29rTmFtZTsgLy8gRXh0cmEgc3BhY2Ugc28gc2Vjb25kIGNvbHVtbiBsaW5lcyB1cFxuICAgICAgICAgIC8vIGxvbCBAIElFIG5vdCBzdXBwb3J0aW5nIFN0cmluZyNyZXBlYXRcblxuICAgICAgICAgIHdoaWxlIChyb3cubGVuZ3RoIDwgc2Vjb25kQ29sdW1uU3RhcnQpIHtcbiAgICAgICAgICAgIHJvdyArPSAnICc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93ICs9IG5ld0hvb2tOYW1lICsgJ1xcbic7XG4gICAgICAgICAgdGFibGUgKz0gcm93O1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJ1JlYWN0IGhhcyBkZXRlY3RlZCBhIGNoYW5nZSBpbiB0aGUgb3JkZXIgb2YgSG9va3MgY2FsbGVkIGJ5ICVzLiAnICsgJ1RoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgdGhlIFJ1bGVzIG9mIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3NcXG5cXG4nICsgJyAgIFByZXZpb3VzIHJlbmRlciAgICAgICAgICAgIE5leHQgcmVuZGVyXFxuJyArICcgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4nICsgJyVzJyArICcgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cXG4nLCBjb21wb25lbnROYW1lLCB0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93SW52YWxpZEhvb2tFcnJvcigpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG59XG5cbmZ1bmN0aW9uIGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpIHtcbiAge1xuICAgIGlmIChpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcykge1xuICAgICAgLy8gT25seSB0cnVlIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgYmVpbmcgaG90IHJlbG9hZGVkLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcmV2RGVwcyA9PT0gbnVsbCkge1xuICAgIHtcbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IG5vdCBkdXJpbmcgJyArICd0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsICcgKyAnaXRzIHR5cGUgY2Fubm90IGNoYW5nZSBiZXR3ZWVuIHJlbmRlcnMuJywgY3VycmVudEhvb2tOYW1lSW5EZXYpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCBib3RoZXIgY29tcGFyaW5nIGxlbmd0aHMgaW4gcHJvZCBiZWNhdXNlIHRoZXNlIGFycmF5cyBzaG91bGQgYmVcbiAgICAvLyBwYXNzZWQgaW5saW5lLlxuICAgIGlmIChuZXh0RGVwcy5sZW5ndGggIT09IHByZXZEZXBzLmxlbmd0aCkge1xuICAgICAgZXJyb3IoJ1RoZSBmaW5hbCBhcmd1bWVudCBwYXNzZWQgdG8gJXMgY2hhbmdlZCBzaXplIGJldHdlZW4gcmVuZGVycy4gVGhlICcgKyAnb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG4nICsgJ1ByZXZpb3VzOiAlc1xcbicgKyAnSW5jb21pbmc6ICVzJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIFwiW1wiICsgcHJldkRlcHMuam9pbignLCAnKSArIFwiXVwiLCBcIltcIiArIG5leHREZXBzLmpvaW4oJywgJykgKyBcIl1cIik7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2RGVwcy5sZW5ndGggJiYgaSA8IG5leHREZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG9iamVjdElzKG5leHREZXBzW2ldLCBwcmV2RGVwc1tpXSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZywgbmV4dFJlbmRlckxhbmVzKSB7XG4gIHJlbmRlckxhbmVzID0gbmV4dFJlbmRlckxhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcyA6IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gVXNlZCBmb3IgaG90IHJlbG9hZGluZzpcblxuICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnR5cGUgIT09IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlc2V0XG4gIC8vIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgLy8gd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgLy8gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG4gIC8vIFRPRE8gV2FybiBpZiBubyBob29rcyBhcmUgdXNlZCBhdCBhbGwgZHVyaW5nIG1vdW50LCB0aGVuIHNvbWUgYXJlIHVzZWQgZHVyaW5nIHVwZGF0ZS5cbiAgLy8gQ3VycmVudGx5IHdlIHdpbGwgaWRlbnRpZnkgdGhlIHVwZGF0ZSByZW5kZXIgYXMgYSBtb3VudCBiZWNhdXNlIG1lbW9pemVkU3RhdGUgPT09IG51bGwuXG4gIC8vIFRoaXMgaXMgdHJpY2t5IGJlY2F1c2UgaXQncyB2YWxpZCBmb3IgY2VydGFpbiB0eXBlcyBvZiBjb21wb25lbnRzIChlLmcuIFJlYWN0LmxhenkpXG4gIC8vIFVzaW5nIG1lbW9pemVkU3RhdGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1vdW50L3VwZGF0ZSBvbmx5IHdvcmtzIGlmIGF0IGxlYXN0IG9uZSBzdGF0ZWZ1bCBob29rIGlzIHVzZWQuXG4gIC8vIE5vbi1zdGF0ZWZ1bCBob29rcyAoZS5nLiBjb250ZXh0KSBkb24ndCBnZXQgYWRkZWQgdG8gbWVtb2l6ZWRTdGF0ZSxcbiAgLy8gc28gbWVtb2l6ZWRTdGF0ZSB3b3VsZCBiZSBudWxsIGR1cmluZyB1cGRhdGVzIGFuZCBtb3VudHMuXG5cbiAge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgIH0gZWxzZSBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgaGFuZGxlcyBhbiBlZGdlIGNhc2Ugd2hlcmUgYSBjb21wb25lbnQgaXMgdXBkYXRpbmcsXG4gICAgICAvLyBidXQgbm8gc3RhdGVmdWwgaG9va3MgaGF2ZSBiZWVuIHVzZWQuXG4gICAgICAvLyBXZSB3YW50IHRvIG1hdGNoIHRoZSBwcm9kdWN0aW9uIGNvZGUgYmVoYXZpb3IgKHdoaWNoIHdpbGwgdXNlIEhvb2tzRGlzcGF0Y2hlck9uTW91bnQpLFxuICAgICAgLy8gYnV0IHdpdGggdGhlIGV4dHJhIERFViB2YWxpZGF0aW9uIHRvIGVuc3VyZSBob29rcyBvcmRlcmluZyBoYXNuJ3QgY2hhbmdlZC5cbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBkb2VzIHRoYXQuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTsgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZVxuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpIHtcbiAgICAvLyBLZWVwIHJlbmRlcmluZyBpbiBhIGxvb3AgZm9yIGFzIGxvbmcgYXMgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgY29udGludWUgdG9cbiAgICAvLyBiZSBzY2hlZHVsZWQuIFVzZSBhIGNvdW50ZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy5cbiAgICB2YXIgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gICAgICBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgICAgIGlmIChudW1iZXJPZlJlUmVuZGVycyA+PSBSRV9SRU5ERVJfTElNSVQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgJyArICdhbiBpbmZpbml0ZSBsb29wLicpO1xuICAgICAgfVxuXG4gICAgICBudW1iZXJPZlJlUmVuZGVycyArPSAxO1xuXG4gICAgICB7XG4gICAgICAgIC8vIEV2ZW4gd2hlbiBob3QgcmVsb2FkaW5nLCBhbGxvdyBkZXBlbmRlbmNpZXMgdG8gc3RhYmlsaXplXG4gICAgICAgIC8vIGFmdGVyIGZpcnN0IHJlbmRlciB0byBwcmV2ZW50IGluZmluaXRlIHJlbmRlciBwaGFzZSB1cGRhdGVzLlxuICAgICAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuICAgICAgfSAvLyBTdGFydCBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXG5cbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gQWxzbyB2YWxpZGF0ZSBob29rIG9yZGVyIGZvciBjYXNjYWRpbmcgdXBkYXRlcy5cbiAgICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIH1cblxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWIDtcbiAgICAgIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpO1xuICAgIH0gd2hpbGUgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyk7XG4gIH0gLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG5cblxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICB9IC8vIFRoaXMgY2hlY2sgdXNlcyBjdXJyZW50SG9vayBzbyB0aGF0IGl0IHdvcmtzIHRoZSBzYW1lIGluIERFViBhbmQgcHJvZCBidW5kbGVzLlxuICAvLyBob29rVHlwZXNEZXYgY291bGQgY2F0Y2ggbW9yZSBjYXNlcyAoZS5nLiBjb250ZXh0KSBidXQgb25seSBpbiBERVYgYnVuZGxlcy5cblxuXG4gIHZhciBkaWRSZW5kZXJUb29GZXdIb29rcyA9IGN1cnJlbnRIb29rICE9PSBudWxsICYmIGN1cnJlbnRIb29rLm5leHQgIT09IG51bGw7XG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gQ29uZmlybSB0aGF0IGEgc3RhdGljIGZsYWcgd2FzIG5vdCBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZSBsYXN0XG4gICAgLy8gcmVuZGVyLiBJZiB0aGlzIGZpcmVzLCBpdCBzdWdnZXN0cyB0aGF0IHdlIGluY29ycmVjdGx5IHJlc2V0IHRoZSBzdGF0aWNcbiAgICAvLyBmbGFncyBpbiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGViYXNlLiBUaGlzIGhhcyBoYXBwZW5lZCBiZWZvcmUsIGZvclxuICAgIC8vIGV4YW1wbGUsIGluIHRoZSBTdXNwZW5zZUxpc3QgaW1wbGVtZW50YXRpb24uXG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2spICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTdGF0aWNNYXNrKSAmJiAvLyBEaXNhYmxlIHRoaXMgd2FybmluZyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBsZWdhY3kgU3VzcGVuc2UgaXMgd2VpcmRcbiAgICAvLyBhbmQgY3JlYXRlcyBmYWxzZSBwb3NpdGl2ZXMuIFRvIG1ha2UgdGhpcyB3b3JrIGluIGxlZ2FjeSBtb2RlLCB3ZSdkXG4gICAgLy8gbmVlZCB0byBtYXJrIGZpYmVycyB0aGF0IGNvbW1pdCBpbiBhbiBpbmNvbXBsZXRlIHN0YXRlLCBzb21laG93LiBGb3JcbiAgICAvLyBub3cgSSdsbCBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgbW9zdCBvZiB0aGUgYnVncyB0aGF0IHdvdWxkIHRyaWdnZXJcbiAgICAvLyBpdCBhcmUgZWl0aGVyIGV4Y2x1c2l2ZSB0byBjb25jdXJyZW50IG1vZGUgb3IgZXhpc3QgaW4gYm90aC5cbiAgICAoY3VycmVudC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogRXhwZWN0ZWQgc3RhdGljIGZsYWcgd2FzIG1pc3NpbmcuIFBsZWFzZSAnICsgJ25vdGlmeSB0aGUgUmVhY3QgdGVhbS4nKTtcbiAgICB9XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFRoaXMgaXMgcmVzZXQgYnkgY2hlY2tEaWRSZW5kZXJJZEhvb2tcbiAgLy8gbG9jYWxJZENvdW50ZXIgPSAwO1xuXG4gIGlmIChkaWRSZW5kZXJUb29GZXdIb29rcykge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgJyArICdlYXJseSByZXR1cm4gc3RhdGVtZW50LicpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuZnVuY3Rpb24gY2hlY2tEaWRSZW5kZXJJZEhvb2soKSB7XG4gIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBldmVyeSByZW5kZXJXaXRoSG9va3MgY2FsbC5cbiAgLy8gQ29uY2VwdHVhbGx5LCBpdCdzIHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiByZW5kZXJXaXRoSG9va3M7IGl0J3Mgb25seSBhXG4gIC8vIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIHVzaW5nIGFuIGFycmF5IHR1cGxlLlxuICB2YXIgZGlkUmVuZGVySWRIb29rID0gbG9jYWxJZENvdW50ZXIgIT09IDA7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgcmV0dXJuIGRpZFJlbmRlcklkSG9vaztcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIHJlc2V0IHRoZSBmbGFncyBoZXJlLCBiZWNhdXNlIHRoZXkncmUgcmVzZXQgaW4gdGhlXG4gIC8vIGNvbXBsZXRlIHBoYXNlIChidWJibGVQcm9wZXJ0aWVzKS5cblxuICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KE1vdW50UGFzc2l2ZURldiB8IE1vdW50TGF5b3V0RGV2IHwgUGFzc2l2ZSB8IFVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfihQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfVxuXG4gIGN1cnJlbnQubGFuZXMgPSByZW1vdmVMYW5lcyhjdXJyZW50LmxhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiByZXNldEhvb2tzQWZ0ZXJUaHJvdygpIHtcbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlKSB7XG4gICAgLy8gVGhlcmUgd2VyZSByZW5kZXIgcGhhc2UgdXBkYXRlcy4gVGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIHRoaXMgcmVuZGVyXG4gICAgLy8gcGhhc2UsIHdoaWNoIHdlIGFyZSBub3cgYWJvcnRpbmcuIFJlbW92ZSB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZXMgc29cbiAgICAvLyB0aGV5IGRvIG5vdCBwZXJzaXN0IHRvIHRoZSBuZXh0IHJlbmRlci4gRG8gbm90IHJlbW92ZSB1cGRhdGVzIGZyb20gaG9va3NcbiAgICAvLyB0aGF0IHdlcmVuJ3QgcHJvY2Vzc2VkLlxuICAgIC8vXG4gICAgLy8gT25seSByZXNldCB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZSBpZiBpdCBoYXMgYSBjbG9uZS4gSWYgaXQgZG9lc1xuICAgIC8vIG5vdCBoYXZlIGEgY2xvbmUsIHRoYXQgbWVhbnMgaXQgd2Fzbid0IHByb2Nlc3NlZCwgYW5kIHRoZSB1cGRhdGVzIHdlcmVcbiAgICAvLyBzY2hlZHVsZWQgYmVmb3JlIHdlIGVudGVyZWQgdGhlIHJlbmRlciBwaGFzZS5cbiAgICB2YXIgaG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhvb2sgPSBob29rLm5leHQ7XG4gICAgfVxuXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTtcbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlO1xuICBsb2NhbElkQ291bnRlciA9IDA7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICB2YXIgaG9vayA9IHtcbiAgICBtZW1vaXplZFN0YXRlOiBudWxsLFxuICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICBiYXNlUXVldWU6IG51bGwsXG4gICAgcXVldWU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gaG9vaztcbiAgfSBlbHNlIHtcbiAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gaG9vaztcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggZm9yIHVwZGF0ZXMgYW5kIGZvciByZS1yZW5kZXJzIHRyaWdnZXJlZCBieSBhXG4gIC8vIHJlbmRlciBwaGFzZSB1cGRhdGUuIEl0IGFzc3VtZXMgdGhlcmUgaXMgZWl0aGVyIGEgY3VycmVudCBob29rIHdlIGNhblxuICAvLyBjbG9uZSwgb3IgYSB3b3JrLWluLXByb2dyZXNzIGhvb2sgZnJvbSBhIHByZXZpb3VzIHJlbmRlciBwYXNzIHRoYXQgd2UgY2FuXG4gIC8vIHVzZSBhcyBhIGJhc2UuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgYmFzZSBsaXN0LCB3ZSBtdXN0IHN3aXRjaCB0b1xuICAvLyB0aGUgZGlzcGF0Y2hlciB1c2VkIGZvciBtb3VudHMuXG4gIHZhciBuZXh0Q3VycmVudEhvb2s7XG5cbiAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gIH1cblxuICB2YXIgbmV4dFdvcmtJblByb2dyZXNzSG9vaztcblxuICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gIH1cblxuICBpZiAobmV4dFdvcmtJblByb2dyZXNzSG9vayAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHdvcmstaW4tcHJvZ3Jlc3MuIFJldXNlIGl0LlxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICB9IGVsc2Uge1xuICAgIC8vIENsb25lIGZyb20gdGhlIGN1cnJlbnQgaG9vay5cbiAgICBpZiAobmV4dEN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIG1vcmUgaG9va3MgdGhhbiBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgICB2YXIgbmV3SG9vayA9IHtcbiAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsXG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRIb29rLmJhc2VTdGF0ZSxcbiAgICAgIGJhc2VRdWV1ZTogY3VycmVudEhvb2suYmFzZVF1ZXVlLFxuICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0LlxuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gbmV3SG9vaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IG5ld0hvb2s7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBsYXN0RWZmZWN0OiBudWxsLFxuICAgIHN0b3JlczogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogcmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaFJlZHVjZXJBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50ID0gY3VycmVudEhvb2s7IC8vIFRoZSBsYXN0IHJlYmFzZSB1cGRhdGUgdGhhdCBpcyBOT1QgcGFydCBvZiB0aGUgYmFzZSBzdGF0ZS5cblxuICB2YXIgYmFzZVF1ZXVlID0gY3VycmVudC5iYXNlUXVldWU7IC8vIFRoZSBsYXN0IHBlbmRpbmcgdXBkYXRlIHRoYXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gV2UgaGF2ZSBuZXcgdXBkYXRlcyB0aGF0IGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuICAgIC8vIFdlJ2xsIGFkZCB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuICAgIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAgIC8vIE1lcmdlIHRoZSBwZW5kaW5nIHF1ZXVlIGFuZCB0aGUgYmFzZSBxdWV1ZS5cbiAgICAgIHZhciBiYXNlRmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICAgIHZhciBwZW5kaW5nRmlyc3QgPSBwZW5kaW5nUXVldWUubmV4dDtcbiAgICAgIGJhc2VRdWV1ZS5uZXh0ID0gcGVuZGluZ0ZpcnN0O1xuICAgICAgcGVuZGluZ1F1ZXVlLm5leHQgPSBiYXNlRmlyc3Q7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN1cnJlbnQuYmFzZVF1ZXVlICE9PSBiYXNlUXVldWUpIHtcbiAgICAgICAgLy8gSW50ZXJuYWwgaW52YXJpYW50IHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGZlYXNpYmx5IGNvdWxkIGluXG4gICAgICAgIC8vIHRoZSBmdXR1cmUgaWYgd2UgaW1wbGVtZW50IHJlc3VtaW5nLCBvciBzb21lIGZvcm0gb2YgdGhhdC5cbiAgICAgICAgZXJyb3IoJ0ludGVybmFsIGVycm9yOiBFeHBlY3RlZCB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIHRvIGJlIGEgY2xvbmUuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdXJyZW50LmJhc2VRdWV1ZSA9IGJhc2VRdWV1ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIGEgcXVldWUgdG8gcHJvY2Vzcy5cbiAgICB2YXIgZmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICB2YXIgbmV3U3RhdGUgPSBjdXJyZW50LmJhc2VTdGF0ZTtcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3QmFzZVF1ZXVlRmlyc3QgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVMYXN0ID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3Q7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIGlmICh1cGRhdGUuaGFzRWFnZXJTdGF0ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIGlzIGEgc3RhdGUgdXBkYXRlIChub3QgYSByZWR1Y2VyKSBhbmQgd2FzIHByb2Nlc3NlZCBlYWdlcmx5LFxuICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGVcbiAgICAgICAgICBuZXdTdGF0ZSA9IHVwZGF0ZS5lYWdlclN0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwgJiYgdXBkYXRlICE9PSBmaXJzdCk7XG5cbiAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IG5ld0Jhc2VRdWV1ZUZpcnN0O1xuICAgIH0gLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIGhvb2suYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIGhvb2suYmFzZVF1ZXVlID0gbmV3QmFzZVF1ZXVlTGFzdDtcbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIEludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHN0b3JlZCBvbiBhIHNlcGFyYXRlIHF1ZXVlLiBXZSBhcmVuJ3QgZ29pbmcgdG9cbiAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgLy8gYXJlIHJlbWFpbmluZy5cblxuXG4gIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVybGVhdmVkID0gbGFzdEludGVybGVhdmVkO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIGludGVybGVhdmVkTGFuZSA9IGludGVybGVhdmVkLmxhbmU7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpO1xuICB9IGVsc2UgaWYgKGJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICBxdWV1ZS5sYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAocXVldWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyOyAvLyBUaGlzIGlzIGEgcmUtcmVuZGVyLiBBcHBseSB0aGUgbmV3IHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvIHRoZSBwcmV2aW91c1xuICAvLyB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gIHZhciBsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuICB2YXIgbmV3U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSBxdWV1ZSBkb2Vzbid0IHBlcnNpc3QgcGFzdCB0aGlzIHJlbmRlciBwYXNzLlxuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgIHZhciBmaXJzdFJlbmRlclBoYXNlVXBkYXRlID0gbGFzdFJlbmRlclBoYXNlVXBkYXRlLm5leHQ7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICAvLyBQcm9jZXNzIHRoaXMgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVcbiAgICAgIC8vIHByaW9yaXR5IGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnRcbiAgICAgIC8vIHJlbmRlcidzLlxuICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUpOyAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7IC8vIERvbid0IHBlcnNpc3QgdGhlIHN0YXRlIGFjY3VtdWxhdGVkIGZyb20gdGhlIHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvXG4gICAgLy8gdGhlIGJhc2Ugc3RhdGUgdW5sZXNzIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAvLyBUT0RPOiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBkZXNpcmVkIHNlbWFudGljcywgYnV0IGl0J3Mgd2hhdCB3ZVxuICAgIC8vIGRvIGZvciBnRFNGUC4gSSBjYW4ndCByZW1lbWJlciB3aHkuXG5cbiAgICBpZiAoaG9vay5iYXNlUXVldWUgPT09IG51bGwpIHtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBbbmV3U3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHRTbmFwc2hvdDtcbiAgdmFyIGlzSHlkcmF0aW5nID0gZ2V0SXNIeWRyYXRpbmcoKTtcblxuICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICBpZiAoZ2V0U2VydmVyU25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdldFNlcnZlclNuYXBzaG90LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgJyArICdzZXJ2ZXItcmVuZGVyZWQgY29udGVudC4gV2lsbCByZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICB9XG5cbiAgICBuZXh0U25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICBpZiAobmV4dFNuYXBzaG90ICE9PSBnZXRTZXJ2ZXJTbmFwc2hvdCgpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U2VydmVyU25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgIHtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuICAgIC8vXG4gICAgLy8gV2Ugd29uJ3QgZG8gdGhpcyBpZiB3ZSdyZSBoeWRyYXRpbmcgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQsIGJlY2F1c2UgaWZcbiAgICAvLyB0aGUgY29udGVudCBpcyBzdGFsZSwgaXQncyBhbHJlYWR5IHZpc2libGUgYW55d2F5LiBJbnN0ZWFkIHdlJ2xsIHBhdGNoXG4gICAgLy8gaXQgdXAgaW4gYSBwYXNzaXZlIGVmZmVjdC5cblxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgdmFyIGluc3QgPSB7XG4gICAgdmFsdWU6IG5leHRTbmFwc2hvdCxcbiAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3RcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IGluc3Q7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlLlxuXG4gIG1vdW50RWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gdXBkYXRlIHRoZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkcy4gV2Ugd2lsbCB1cGRhdGVcbiAgLy8gdGhpcyB3aGVuZXZlciBzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBvciB2YWx1ZSBjaGFuZ2VzLiBCZWNhdXNlIHRoZXJlJ3Mgbm9cbiAgLy8gY2xlYW4tdXAgZnVuY3Rpb24sIGFuZCB3ZSB0cmFjayB0aGUgZGVwcyBjb3JyZWN0bHksIHdlIGNhbiBjYWxsIHB1c2hFZmZlY3RcbiAgLy8gZGlyZWN0bHksIHdpdGhvdXQgc3RvcmluZyBhbnkgYWRkaXRpb25hbCBzdGF0ZS4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2VcbiAgLy8gZG9uJ3QgbmVlZCB0byBzZXQgYSBzdGF0aWMgZmxhZywgZWl0aGVyLlxuICAvLyBUT0RPOiBXZSBjYW4gbW92ZSB0aGlzIHRvIHRoZSBwYXNzaXZlIHBoYXNlIG9uY2Ugd2UgYWRkIGEgcHJlLWNvbW1pdFxuICAvLyBjb25zaXN0ZW5jeSBjaGVjay4gU2VlIHRoZSBuZXh0IGNvbW1lbnQuXG5cbiAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7XG4gIHJldHVybiBuZXh0U25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuICB2YXIgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgaWYgKCFvYmplY3RJcyhuZXh0U25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSkge1xuICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZTbmFwc2hvdCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHNuYXBzaG90Q2hhbmdlZCA9ICFvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG5cbiAgaWYgKHNuYXBzaG90Q2hhbmdlZCkge1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICB9XG5cbiAgdmFyIGluc3QgPSBob29rLnF1ZXVlO1xuICB1cGRhdGVFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFdoZW5ldmVyIGdldFNuYXBzaG90IG9yIHN1YnNjcmliZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UgaWYgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIG11dGF0aW9uLiBJbiBjb25jdXJyZW50IG1vZGVcbiAgLy8gdGhpcyBjYW4gaGFwcGVuIGFsbCB0aGUgdGltZSwgYnV0IGV2ZW4gaW4gc3luY2hyb25vdXMgbW9kZSwgYW4gZWFybGllclxuICAvLyBlZmZlY3QgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RvcmUuXG5cbiAgaWYgKGluc3QuZ2V0U25hcHNob3QgIT09IGdldFNuYXBzaG90IHx8IHNuYXBzaG90Q2hhbmdlZCB8fCAvLyBDaGVjayBpZiB0aGUgc3VzYmNyaWJlIGZ1bmN0aW9uIGNoYW5nZWQuIFdlIGNhbiBzYXZlIHNvbWUgbWVtb3J5IGJ5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgd2Ugc2NoZWR1bGVkIGEgc3Vic2NyaXB0aW9uIGVmZmVjdCBhYm92ZS5cbiAgd29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzSG9vay5tZW1vaXplZFN0YXRlLnRhZyAmIEhhc0VmZmVjdCkge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7XG4gICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIHJlbmRlcmVkU25hcHNob3QpIHtcbiAgZmliZXIuZmxhZ3MgfD0gU3RvcmVDb25zaXN0ZW5jeTtcbiAgdmFyIGNoZWNrID0ge1xuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdCxcbiAgICB2YWx1ZTogcmVuZGVyZWRTbmFwc2hvdFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICB9IGVsc2Uge1xuICAgIHZhciBzdG9yZXMgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICBpZiAoc3RvcmVzID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZXMucHVzaChjaGVjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0b3JlSW5zdGFuY2UoZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHtcbiAgLy8gVGhlc2UgYXJlIHVwZGF0ZWQgaW4gdGhlIHBhc3NpdmUgcGhhc2VcbiAgaW5zdC52YWx1ZSA9IG5leHRTbmFwc2hvdDtcbiAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBTb21ldGhpbmcgbWF5IGhhdmUgYmVlbiBtdXRhdGVkIGluIGJldHdlZW4gcmVuZGVyIGFuZCBjb21taXQuIFRoaXMgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGFuIGV2ZW50IHRoYXQgZmlyZWQgYmVmb3JlIHRoZSBwYXNzaXZlIGVmZmVjdHMsIG9yIGl0IGNvdWxkXG4gIC8vIGhhdmUgYmVlbiBpbiBhIGxheW91dCBlZmZlY3QuIEluIHRoYXQgY2FzZSwgd2Ugd291bGQgaGF2ZSB1c2VkIHRoZSBvbGRcbiAgLy8gc25hcHNobyBhbmQgZ2V0U25hcHNob3QgdmFsdWVzIHRvIGJhaWwgb3V0LiBXZSBuZWVkIHRvIGNoZWNrIG9uZSBtb3JlIHRpbWUuXG5cbiAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZVRvU3RvcmUoZmliZXIsIGluc3QsIHN1YnNjcmliZSkge1xuICB2YXIgaGFuZGxlU3RvcmVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhlIHN0b3JlIGNoYW5nZWQuIENoZWNrIGlmIHRoZSBzbmFwc2hvdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2VcbiAgICAvLyByZWFkIGZyb20gdGhlIHN0b3JlLlxuICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gICAgfVxuICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi5cblxuXG4gIHJldHVybiBzdWJzY3JpYmUoaGFuZGxlU3RvcmVDaGFuZ2UpO1xufVxuXG5mdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgdmFyIHByZXZWYWx1ZSA9IGluc3QudmFsdWU7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTtcbiAgICByZXR1cm4gIW9iamVjdElzKHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpIHtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlc1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZSgpO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoU2V0U3RhdGUuYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiByZXJlbmRlclJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiBwdXNoRWZmZWN0KHRhZywgY3JlYXRlLCBkZXN0cm95LCBkZXBzKSB7XG4gIHZhciBlZmZlY3QgPSB7XG4gICAgdGFnOiB0YWcsXG4gICAgY3JlYXRlOiBjcmVhdGUsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBkZXBzOiBkZXBzLFxuICAgIC8vIENpcmN1bGFyXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxhc3RFZmZlY3QgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKGxhc3RFZmZlY3QgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgbGFzdEVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgICAgZWZmZWN0Lm5leHQgPSBmaXJzdEVmZmVjdDtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3Q7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdDtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICB7XG4gICAgdmFyIF9yZWYyID0ge1xuICAgICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gICAgfTtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBfcmVmMjtcbiAgICByZXR1cm4gX3JlZjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICByZXR1cm4gaG9vay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCB1bmRlZmluZWQsIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIGRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGN1cnJlbnRIb29rICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZFZmZlY3QgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIGRlc3Ryb3kgPSBwcmV2RWZmZWN0LmRlc3Ryb3k7XG5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZFZmZlY3QuZGVwcztcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKE1vdW50UGFzc2l2ZURldiB8IFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChQYXNzaXZlIHwgUGFzc2l2ZVN0YXRpYywgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gIHtcbiAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgfVxuXG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0KGNyZWF0ZSwgcmVmKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlZkNhbGxiYWNrID0gcmVmO1xuXG4gICAgdmFyIF9pbnN0ID0gY3JlYXRlKCk7XG5cbiAgICByZWZDYWxsYmFjayhfaW5zdCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZkNhbGxiYWNrKG51bGwpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlZk9iamVjdCA9IHJlZjtcblxuICAgIHtcbiAgICAgIGlmICghcmVmT2JqZWN0Lmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSAnICsgJ3JlZiBjYWxsYmFjayBvciBSZWFjdC5jcmVhdGVSZWYoKSBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsICdhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMocmVmT2JqZWN0KS5qb2luKCcsICcpICsgJ30nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX2luc3QyID0gY3JlYXRlKCk7XG5cbiAgICByZWZPYmplY3QuY3VycmVudCA9IF9pbnN0MjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBudWxsO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7Ly8gVGhpcyBob29rIGlzIG5vcm1hbGx5IGEgbm8tb3AuXG4gIC8vIFRoZSByZWFjdC1kZWJ1Zy1ob29rcyBwYWNrYWdlIGluamVjdHMgaXRzIG93biBpbXBsZW1lbnRhdGlvblxuICAvLyBzbyB0aGF0IGUuZy4gRGV2VG9vbHMgY2FuIGRpc3BsYXkgY3VzdG9tIGhvb2sgdmFsdWVzLlxufVxuXG52YXIgdXBkYXRlRGVidWdWYWx1ZSA9IG1vdW50RGVidWdWYWx1ZTtcblxuZnVuY3Rpb24gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIG1vdW50TWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAvLyBBc3N1bWUgdGhlc2UgYXJlIGRlZmluZWQuIElmIHRoZXkncmUgbm90LCBhcmVIb29rSW5wdXRzRXF1YWwgd2lsbCB3YXJuLlxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHJlc29sdmVkQ3VycmVudEhvb2sgPSBjdXJyZW50SG9vaztcbiAgdmFyIHByZXZWYWx1ZSA9IHJlc29sdmVkQ3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVyZW5kZXIgZHVyaW5nIGEgbW91bnQuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYW4gdXBkYXRlLlxuICAgIHZhciBwcmV2VmFsdWUgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKSB7XG4gIHZhciBzaG91bGREZWZlclZhbHVlID0gIWluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKHJlbmRlckxhbmVzKTtcblxuICBpZiAoc2hvdWxkRGVmZXJWYWx1ZSkge1xuICAgIC8vIFRoaXMgaXMgYW4gdXJnZW50IHVwZGF0ZS4gSWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLCBrZWVwIHVzaW5nIHRoZVxuICAgIC8vIHByZXZpb3VzIHZhbHVlIGFuZCBzcGF3biBhIGRlZmVycmVkIHJlbmRlciB0byB1cGRhdGUgaXQgbGF0ZXIuXG4gICAgaWYgKCFvYmplY3RJcyh2YWx1ZSwgcHJldlZhbHVlKSkge1xuICAgICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCByZW5kZXJcbiAgICAgIHZhciBkZWZlcnJlZExhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgZGVmZXJyZWRMYW5lKTtcbiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoZGVmZXJyZWRMYW5lKTsgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBpbmNvbnNpc3RlbnRcbiAgICAgIC8vIGZyb20gdGhlIGxhdGVzdCB2YWx1ZS4gVGhlIG5hbWUgXCJiYXNlU3RhdGVcIiBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2VcbiAgICAgIC8vIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmcgYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYVxuICAgICAgLy8gbmV3IG9uZS5cblxuICAgICAgaG9vay5iYXNlU3RhdGUgPSB0cnVlO1xuICAgIH0gLy8gUmV1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG5cblxuICAgIHJldHVybiBwcmV2VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBub3QgYW4gdXJnZW50IHVwZGF0ZSwgc28gd2UgY2FuIHVzZSB0aGUgbGF0ZXN0IHZhbHVlIHJlZ2FyZGxlc3NcbiAgICAvLyBvZiB3aGF0IGl0IGlzLiBObyBuZWVkIHRvIGRlZmVyIGl0LlxuICAgIC8vIEhvd2V2ZXIsIGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBzcGF3bmVkIHJlbmRlciwgdGhlbiB3ZSBuZWVkIHRvIG1hcmtcbiAgICAvLyB0aGlzIGFzIGFuIHVwZGF0ZSB0byBwcmV2ZW50IHRoZSBmaWJlciBmcm9tIGJhaWxpbmcgb3V0LlxuICAgIC8vXG4gICAgLy8gYGJhc2VTdGF0ZWAgaXMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZW5kZXJlZFxuICAgIC8vIHZhbHVlLiBUaGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2UgdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZ1xuICAgIC8vIGEgc3RhdGUgaG9vayBmaWVsZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAoaG9vay5iYXNlU3RhdGUpIHtcbiAgICAgIC8vIEZsaXAgdGhpcyBiYWNrIHRvIGZhbHNlLlxuICAgICAgaG9vay5iYXNlU3RhdGUgPSBmYWxzZTtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihzZXRQZW5kaW5nLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoaGlnaGVyRXZlbnRQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5LCBDb250aW51b3VzRXZlbnRQcmlvcml0eSkpO1xuICBzZXRQZW5kaW5nKHRydWUpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2V0UGVuZGluZyhmYWxzZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUgPSBtb3VudFN0YXRlKGZhbHNlKSxcbiAgICAgIGlzUGVuZGluZyA9IF9tb3VudFN0YXRlWzBdLFxuICAgICAgc2V0UGVuZGluZyA9IF9tb3VudFN0YXRlWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgbmV2ZXIgY2hhbmdlcy5cblxuXG4gIHZhciBzdGFydCA9IHN0YXJ0VHJhbnNpdGlvbi5iaW5kKG51bGwsIHNldFBlbmRpbmcpO1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXJ0O1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIGlzUGVuZGluZyA9IF91cGRhdGVTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyVHJhbnNpdGlvbigpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3JlcmVuZGVyU3RhdGVbMF07XG5cbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHN0YXJ0ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG52YXIgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJZCgpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpOyAvLyBUT0RPOiBJbiBGaXp6LCBpZCBnZW5lcmF0aW9uIGlzIHNwZWNpZmljIHRvIGVhY2ggc2VydmVyIGNvbmZpZy4gTWF5YmUgd2VcbiAgLy8gc2hvdWxkIGRvIHRoaXMgaW4gRmliZXIsIHRvbz8gRGVmZXJyaW5nIHRoaXMgZGVjaXNpb24gZm9yIG5vdyBiZWNhdXNlXG4gIC8vIHRoZXJlJ3Mgbm8gb3RoZXIgcGxhY2UgdG8gc3RvcmUgdGhlIHByZWZpeCBleGNlcHQgZm9yIGFuIGludGVybmFsIGZpZWxkIG9uXG4gIC8vIHRoZSBwdWJsaWMgY3JlYXRlUm9vdCBvYmplY3QsIHdoaWNoIHRoZSBmaWJlciB0cmVlIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlXG4gIC8vIGEgcmVmZXJlbmNlIHRvLlxuXG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gcm9vdC5pZGVudGlmaWVyUHJlZml4O1xuICB2YXIgaWQ7XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICB2YXIgdHJlZUlkID0gZ2V0VHJlZUlkKCk7IC8vIFVzZSBhIGNhcHRpYWwgUiBwcmVmaXggZm9yIHNlcnZlci1nZW5lcmF0ZWQgaWRzLlxuXG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ1InICsgdHJlZUlkOyAvLyBVbmxlc3MgdGhpcyBpcyB0aGUgZmlyc3QgaWQgYXQgdGhpcyBsZXZlbCwgYXBwZW5kIGEgbnVtYmVyIGF0IHRoZSBlbmRcbiAgICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgdXNlSWQgaG9vayBhbW9uZyBhbGwgdGhlIHVzZUlkXG4gICAgLy8gaG9va3MgZm9yIHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbG9jYWxJZCA9IGxvY2FsSWRDb3VudGVyKys7XG5cbiAgICBpZiAobG9jYWxJZCA+IDApIHtcbiAgICAgIGlkICs9ICdIJyArIGxvY2FsSWQudG9TdHJpbmcoMzIpO1xuICAgIH1cblxuICAgIGlkICs9ICc6JztcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgYSBsb3dlcmNhc2UgciBwcmVmaXggZm9yIGNsaWVudC1nZW5lcmF0ZWQgaWRzLlxuICAgIHZhciBnbG9iYWxDbGllbnRJZCA9IGdsb2JhbENsaWVudElkQ291bnRlcisrO1xuICAgIGlkID0gJzonICsgaWRlbnRpZmllclByZWZpeCArICdyJyArIGdsb2JhbENsaWVudElkLnRvU3RyaW5nKDMyKSArICc6JztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGlkO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUlkKCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaWQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFNldFN0YXRlKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5oYXNFYWdlclN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICB1cGRhdGUuZWFnZXJTdGF0ZSA9IGVhZ2VyU3RhdGU7XG5cbiAgICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgICAgICAgLy8gRmFzdCBwYXRoLiBXZSBjYW4gYmFpbCBvdXQgd2l0aG91dCBzY2hlZHVsaW5nIFJlYWN0IHRvIHJlLXJlbmRlci5cbiAgICAgICAgICAgIC8vIEl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlYmFzZSB0aGlzIHVwZGF0ZSBsYXRlcixcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgcmUtcmVuZGVycyBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIGFuZCBieSB0aGF0XG4gICAgICAgICAgICAvLyB0aW1lIHRoZSByZWR1Y2VyIGhhcyBjaGFuZ2VkLlxuICAgICAgICAgICAgLy8gVE9ETzogRG8gd2Ugc3RpbGwgbmVlZCB0byBlbnRhbmdsZSB0cmFuc2l0aW9ucyBpbiB0aGlzIGNhc2U/XG4gICAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICByZXR1cm4gZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpIHtcbiAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFN0YXNoIGl0IGluIGEgbGF6aWx5LWNyZWF0ZWQgbWFwIG9mXG4gIC8vIHF1ZXVlIC0+IGxpbmtlZCBsaXN0IG9mIHVwZGF0ZXMuIEFmdGVyIHRoaXMgcmVuZGVyIHBhc3MsIHdlJ2xsIHJlc3RhcnRcbiAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSB0cnVlO1xuICB2YXIgcGVuZGluZyA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbn0gLy8gVE9ETzogTW92ZSB0byBSZWFjdEZpYmVyQ29uY3VycmVudFVwZGF0ZXM/XG5cblxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKSB7XG4gIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBxdWV1ZS5sYW5lczsgLy8gSWYgYW55IGVudGFuZ2xlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcgb24gdGhlIHJvb3QsIHRoZW4gdGhleVxuICAgIC8vIG11c3QgaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2hcbiAgICAvLyByZXByZXNlbnRzIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2VcbiAgICAvLyBtYXkgZW50YW5nbGUgbW9yZSB0aGFuIHdlIG5lZWQgdG8sIGJ1dCB0aGF0J3MgT0suIEluIGZhY3QgaXQncyB3b3JzZSBpZlxuICAgIC8vIHdlICpkb24ndCogZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuXG5cbiAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLlxuXG4gICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpO1xuICAgIHF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZlxuICAgIC8vIHRoZSBsYW5lIGZpbmlzaGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZW50YW5nbGVkIGl0LiBTbyB3ZSBuZWVkIHRvXG4gICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS5cblxuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lLCBhY3Rpb24pIHtcblxuICB7XG4gICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW5zZXJ0aW9uRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUxheW91dEVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNZW1vOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZHVjZXI6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVmOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlYnVnVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVmZXJyZWRWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VUcmFuc2l0aW9uOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU11dGFibGVTb3VyY2U6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3luY0V4dGVybmFsU3RvcmU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSWQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG59O1xuXG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcblxue1xuICB2YXIgd2FybkludmFsaWRDb250ZXh0QWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgfTtcblxuICB2YXIgd2FybkludmFsaWRIb29rQWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdEbyBub3QgY2FsbCBIb29rcyBpbnNpZGUgdXNlRWZmZWN0KC4uLiksIHVzZU1lbW8oLi4uKSwgb3Igb3RoZXIgYnVpbHQtaW4gSG9va3MuICcgKyAnWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3MnKTtcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xudmFyIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTtcbi8qKlxuICogVHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZC9jYXNjYWRpbmcgdXBkYXRlIChzY2hlZHVsZWQgZnJvbSBhIGxheW91dCBlZmZlY3QpLlxuICpcbiAqIFRoZSBvdmVyYWxsIHNlcXVlbmNlIGlzOlxuICogICAxLiByZW5kZXJcbiAqICAgMi4gY29tbWl0IChhbmQgY2FsbCBgb25SZW5kZXJgLCBgb25Db21taXRgKVxuICogICAzLiBjaGVjayBmb3IgbmVzdGVkIHVwZGF0ZXNcbiAqICAgNC4gZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIChhbmQgY2FsbCBgb25Qb3N0Q29tbWl0YClcbiAqXG4gKiBOZXN0ZWQgdXBkYXRlcyBhcmUgaWRlbnRpZmllZCBpbiBzdGVwIDMgYWJvdmUsXG4gKiBidXQgc3RlcCA0IHN0aWxsIGFwcGxpZXMgdG8gdGhlIHdvcmsgdGhhdCB3YXMganVzdCBjb21taXR0ZWQuXG4gKiBXZSB1c2UgdHdvIGZsYWdzIHRvIHRyYWNrIG5lc3RlZCB1cGRhdGVzIHRoZW46XG4gKiBvbmUgdHJhY2tzIHdoZXRoZXIgdGhlIHVwY29taW5nIHVwZGF0ZSBpcyBhIG5lc3RlZCB1cGRhdGUsXG4gKiBhbmQgdGhlIG90aGVyIHRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQgdXBkYXRlLlxuICogVGhlIGZpcnN0IHZhbHVlIGdldHMgc3luY2VkIHRvIHRoZSBzZWNvbmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UuXG4gKi9cblxudmFyIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xudmFyIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlSXNOZXN0ZWQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKSB7XG4gIHtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpIHtcbiAge1xuICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gbmVzdGVkVXBkYXRlU2NoZWR1bGVkO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbW1pdFRpbWUoKSB7XG4gIHJldHVybiBjb21taXRUaW1lO1xufVxuXG5mdW5jdGlvbiByZWNvcmRDb21taXRUaW1lKCkge1xuXG4gIGNvbW1pdFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IG5vdyQxKCk7XG5cbiAgaWYgKGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA8IDApIHtcbiAgICBmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBub3ckMSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShmaWJlciwgb3ZlcnJpZGVCYXNlVGltZSkge1xuXG4gIGlmIChwcm9maWxlclN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuXG4gICAgaWYgKG92ZXJyaWRlQmFzZVRpbWUpIHtcbiAgICAgIGZpYmVyLnNlbGZCYXNlRHVyYXRpb24gPSBlbGFwc2VkVGltZTtcbiAgICB9XG5cbiAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKSB7XG5cbiAgaWYgKGxheW91dEVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIGxheW91dEVmZmVjdFN0YXJ0VGltZTtcbiAgICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvclxuICAgIC8vIE9yIHRoZSByb290IChmb3IgdGhlIERldlRvb2xzIFByb2ZpbGVyIHRvIHJlYWQpXG5cbiAgICB2YXIgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAocGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHBhc3NpdmVFZmZlY3RTdGFydFRpbWU7XG4gICAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHBhcmVudFN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRGV0YWNoZWQgZmliZXJzIGhhdmUgdGhlaXIgc3RhdGUgbm9kZSBjbGVhcmVkIG91dC5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiBwb2ludGVyIGlzIGFsc28gY2xlYXJlZCBvdXQsXG4gICAgICAgICAgICAvLyBzbyB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlcG9ydCB0aGUgdGltZSBzcGVudCBpbiB0aGlzIFByb2ZpbGVyJ3Mgc3VidHJlZS5cbiAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpIHtcblxuICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpIHtcblxuICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmZXJBY3R1YWxEdXJhdGlvbihmaWJlcikge1xuICAvLyBUcmFuc2ZlciB0aW1lIHNwZW50IHJlbmRlcmluZyB0aGVzZSBjaGlsZHJlbiBzbyB3ZSBkb24ndCBsb3NlIGl0XG4gIC8vIGFmdGVyIHdlIHJlcmVuZGVyLiBUaGlzIGlzIHVzZWQgYXMgYSBoZWxwZXIgaW4gc3BlY2lhbCBjYXNlc1xuICAvLyB3aGVyZSB3ZSBzaG91bGQgY291bnQgdGhlIHdvcmsgb2YgbXVsdGlwbGUgcGFzc2VzLlxuICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQpIHtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIGJhc2VQcm9wcykge1xuICBpZiAoQ29tcG9uZW50ICYmIENvbXBvbmVudC5kZWZhdWx0UHJvcHMpIHtcbiAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMuIFRha2VuIGZyb20gUmVhY3RFbGVtZW50XG4gICAgdmFyIHByb3BzID0gYXNzaWduKHt9LCBiYXNlUHJvcHMpO1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSBDb21wb25lbnQuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICByZXR1cm4gYmFzZVByb3BzO1xufVxuXG52YXIgZmFrZUludGVybmFsSW5zdGFuY2UgPSB7fTtcbnZhciBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uSW52YWxpZENhbGxiYWNrO1xudmFyIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzO1xudmFyIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDE7XG5cbntcbiAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxID0gbmV3IFNldCgpO1xuICB2YXIgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrID0gbmV3IFNldCgpO1xuXG4gIHdhcm5PbkludmFsaWRDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIGlmIChjYWxsYmFjayA9PT0gbnVsbCB8fCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gY2FsbGVyTmFtZSArICdfJyArIGNhbGxiYWNrO1xuXG4gICAgaWYgKCFkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suaGFzKGtleSkpIHtcbiAgICAgIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KTtcblxuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCk6IEEgdmFsaWQgc3RhdGUgb2JqZWN0IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiAnICsgJ1lvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFRoaXMgaXMgc28gZ3Jvc3MgYnV0IGl0J3MgYXQgbGVhc3Qgbm9uLWNyaXRpY2FsIGFuZCBjYW4gYmUgcmVtb3ZlZCBpZlxuICAvLyBpdCBjYXVzZXMgcHJvYmxlbXMuIFRoaXMgaXMgbWVhbnQgdG8gZ2l2ZSBhIG5pY2VyIGVycm9yIG1lc3NhZ2UgZm9yXG4gIC8vIFJlYWN0RE9NMTUudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocmVhY3RET00xNkNvbXBvbmVudCxcbiAgLy8gLi4uKSkgd2hpY2ggb3RoZXJ3aXNlIHRocm93cyBhIFwiX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGEgZnVuY3Rpb25cIlxuICAvLyBleGNlcHRpb24uXG5cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmFrZUludGVybmFsSW5zdGFuY2UsICdfcHJvY2Vzc0NoaWxkQ29udGV4dCcsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgJyArICdtZWFucyB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgYW5kIGFyZSBhdHRlbXB0aW5nIHRvIG5lc3QgJyArICdhIFJlYWN0IDE1IHRyZWUgaW5zaWRlIGEgUmVhY3QgMTYgdHJlZSB1c2luZyAnICsgXCJ1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciwgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkLiBUcnkgXCIgKyAndG8gbWFrZSBzdXJlIHlvdSBoYXZlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QgKGFuZCBpZGVhbGx5LCBzd2l0Y2ggJyArICd0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXh0UHJvcHMpIHtcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUoY3RvciwgcGFydGlhbFN0YXRlKTtcbiAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgdmFyIG1lbW9pemVkU3RhdGUgPSBwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQgPyBwcmV2U3RhdGUgOiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cblxudmFyIGNsYXNzQ29tcG9uZW50VXBkYXRlciA9IHtcbiAgaXNNb3VudGVkOiBpc01vdW50ZWQsXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBSZXBsYWNlU3RhdGU7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAoaW5zdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcignJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlO1xuICB9XG5cbiAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWwob2xkUHJvcHMsIG5ld1Byb3BzKSB8fCAhc2hhbGxvd0VxdWFsKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgJiYgIWRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5oYXMoY3RvcikgJiYgLy8gU3RyaWN0IE1vZGUgaGFzIGl0cyBvd24gd2FybmluZyBmb3IgbGVnYWN5IGNvbnRleHQsIHNvIHdlIGNhbiBza2lwXG4gICAgICAvLyB0aGlzIG9uZS5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyB1c2VzIHRoZSBsZWdhY3kgY2hpbGRDb250ZXh0VHlwZXMgQVBJIHdoaWNoIGlzIG5vIGxvbmdlciAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFVzZSAnICsgJ1JlYWN0LmNyZWF0ZUNvbnRleHQoKSBpbnN0ZWFkXFxuXFxuLicgKyAnTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmhhcyhjdG9yKSAmJiAvLyBTdHJpY3QgTW9kZSBoYXMgaXRzIG93biB3YXJuaW5nIGZvciBsZWdhY3kgY29udGV4dCwgc28gd2UgY2FuIHNraXBcbiAgICAgIC8vIHRoaXMgb25lLlxuICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5hZGQoY3Rvcik7XG5cbiAgICAgICAgZXJyb3IoJyVzIHVzZXMgdGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgQVBJIHdoaWNoIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFVzZSAnICsgJ1JlYWN0LmNyZWF0ZUNvbnRleHQoKSB3aXRoIHN0YXRpYyBjb250ZXh0VHlwZSBpbnN0ZWFkLlxcblxcbicgKyAnTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnN0YW5jZS5jb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJ2NvbnRleHRUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3Rvci5jb250ZXh0VHlwZSAmJiBjdG9yLmNvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuaGFzKGN0b3IpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzLmFkZChjdG9yKTtcblxuICAgICAgICBlcnJvcignJXMgZGVjbGFyZXMgYm90aCBjb250ZXh0VHlwZXMgYW5kIGNvbnRleHRUeXBlIHN0YXRpYyBwcm9wZXJ0aWVzLiAnICsgJ1RoZSBsZWdhY3kgY29udGV4dFR5cGVzIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyAnICsgJ1RoZSBuYW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyAnICsgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChjdG9yLnByb3RvdHlwZSAmJiBjdG9yLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCAmJiB0eXBlb2YgaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkuICcgKyAnc2hvdWxkQ29tcG9uZW50VXBkYXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGV4dGVuZGluZyBSZWFjdC5QdXJlQ29tcG9uZW50LiAnICsgJ1BsZWFzZSBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB1c2VkLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQSBwdXJlIGNvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxVbm1vdW50KCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnSWYgeW91IG1lYW50IHRvIHVwZGF0ZSB0aGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdpbmcgcHJvcHMsICcgKyAndXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKS4gSWYgeW91IG1lYW50IHRvIGZldGNoIGRhdGEgb3IgJyArICdydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGhhc011dGF0ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzICE9PSBuZXdQcm9wcztcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gdW5kZWZpbmVkICYmIGhhc011dGF0ZWRQcm9wcykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZGVmYXVsdFByb3BzKSB7XG4gICAgICBlcnJvcignU2V0dGluZyBkZWZhdWx0UHJvcHMgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLicgKyAnIEluc3RlYWQsIGRlZmluZSBkZWZhdWx0UHJvcHMgYXMgYSBzdGF0aWMgcHJvcGVydHkgb24gJXMuJywgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICFkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuaGFzKGN0b3IpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuYWRkKGN0b3IpO1xuXG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS4gJyArICdUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBpcyBkZWZpbmVkIGFzIGEgc3RhdGljIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBfc3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICAgIGlmIChfc3RhdGUgJiYgKHR5cGVvZiBfc3RhdGUgIT09ICdvYmplY3QnIHx8IGlzQXJyYXkoX3N0YXRlKSkpIHtcbiAgICAgIGVycm9yKCclcy5zdGF0ZTogbXVzdCBiZSBzZXQgdG8gYW4gb2JqZWN0IG9yIG51bGwnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY3Rvci5jaGlsZENvbnRleHRUeXBlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGVycm9yKCclcy5nZXRDaGlsZENvbnRleHQoKTogY2hpbGRDb250ZXh0VHlwZXMgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvICcgKyAndXNlIGdldENoaWxkQ29udGV4dCgpLicsIG5hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnVwZGF0ZXIgPSBjbGFzc0NvbXBvbmVudFVwZGF0ZXI7XG4gIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBUaGUgaW5zdGFuY2UgbmVlZHMgYWNjZXNzIHRvIHRoZSBmaWJlciBzbyB0aGF0IGl0IGNhbiBzY2hlZHVsZSB1cGRhdGVzXG5cbiAgc2V0KGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAge1xuICAgIGluc3RhbmNlLl9yZWFjdEludGVybmFsSW5zdGFuY2UgPSBmYWtlSW50ZXJuYWxJbnN0YW5jZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBwcm9wcykge1xuICB2YXIgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBmYWxzZTtcbiAgdmFyIHVubWFza2VkQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAge1xuICAgIGlmICgnY29udGV4dFR5cGUnIGluIGN0b3IpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gLy8gQWxsb3cgbnVsbCBmb3IgY29uZGl0aW9uYWwgZGVjbGFyYXRpb25cbiAgICAgIGNvbnRleHRUeXBlID09PSBudWxsIHx8IGNvbnRleHRUeXBlICE9PSB1bmRlZmluZWQgJiYgY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSAmJiBjb250ZXh0VHlwZS5fY29udGV4dCA9PT0gdW5kZWZpbmVkOyAvLyBOb3QgYSA8Q29udGV4dC5Db25zdW1lcj5cblxuICAgICAgaWYgKCFpc1ZhbGlkICYmICFkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuaGFzKGN0b3IpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5hZGQoY3Rvcik7XG4gICAgICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuXG4gICAgICAgIGlmIChjb250ZXh0VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byB1bmRlZmluZWQuICcgKyAnVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGEgdHlwbyBvciBieSBtaXhpbmcgdXAgbmFtZWQgYW5kIGRlZmF1bHQgaW1wb3J0cy4gJyArICdUaGlzIGNhbiBhbHNvIGhhcHBlbiBkdWUgdG8gYSBjaXJjdWxhciBkZXBlbmRlbmN5LCBzbyAnICsgJ3RyeSBtb3ZpbmcgdGhlIGNyZWF0ZUNvbnRleHQoKSBjYWxsIHRvIGEgc2VwYXJhdGUgZmlsZS4nO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGEgJyArIHR5cGVvZiBjb250ZXh0VHlwZSArICcuJztcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LlByb3ZpZGVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gPENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuQ29uc3VtZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYW4gb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNvbnRleHRUeXBlKS5qb2luKCcsICcpICsgJ30uJztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCclcyBkZWZpbmVzIGFuIGludmFsaWQgY29udGV4dFR5cGUuICcgKyAnY29udGV4dFR5cGUgc2hvdWxkIHBvaW50IHRvIHRoZSBDb250ZXh0IG9iamVjdCByZXR1cm5lZCBieSBSZWFjdC5jcmVhdGVDb250ZXh0KCkuJXMnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCcsIGFkZGVuZHVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIGNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gY3Rvci5jb250ZXh0VHlwZXM7XG4gICAgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBjb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gICAgY29udGV4dCA9IGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID8gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSA6IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gSW5zdGFudGlhdGUgdHdpY2UgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlICE9PSBudWxsICYmIGluc3RhbmNlLnN0YXRlICE9PSB1bmRlZmluZWQgPyBpbnN0YW5jZS5zdGF0ZSA6IG51bGw7XG4gIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nICYmIHN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJ2Alc2AgdXNlcyBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBidXQgaXRzIGluaXRpYWwgc3RhdGUgaXMgJyArICclcy4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuIEluc3RlYWQsIGRlZmluZSB0aGUgaW5pdGlhbCBzdGF0ZSBieSAnICsgJ2Fzc2lnbmluZyBhbiBvYmplY3QgdG8gYHRoaXMuc3RhdGVgIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBgJXNgLiAnICsgJ1RoaXMgZW5zdXJlcyB0aGF0IGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGFyZ3VtZW50cyBoYXZlIGEgY29uc2lzdGVudCBzaGFwZS4nLCBjb21wb25lbnROYW1lLCBpbnN0YW5jZS5zdGF0ZSA9PT0gbnVsbCA/ICdudWxsJyA6ICd1bmRlZmluZWQnLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9IC8vIElmIG5ldyBjb21wb25lbnQgQVBJcyBhcmUgZGVmaW5lZCwgXCJ1bnNhZmVcIiBsaWZlY3ljbGVzIHdvbid0IGJlIGNhbGxlZC5cbiAgICAvLyBXYXJuIGFib3V0IHRoZXNlIGxpZmVjeWNsZXMgaWYgdGhleSBhcmUgcHJlc2VudC5cbiAgICAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgbWV0aG9kcyB0aG91Z2guXG5cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgZm91bmRXaWxsTW91bnROYW1lID0gbnVsbDtcbiAgICAgIHZhciBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gbnVsbDtcbiAgICAgIHZhciBmb3VuZFdpbGxVcGRhdGVOYW1lID0gbnVsbDtcblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ2NvbXBvbmVudFdpbGxNb3VudCc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdjb21wb25lbnRXaWxsVXBkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgdmFyIG5ld0FwaU5hbWUgPSB0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgPyAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCknIDogJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlKCknO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZXJyb3IoJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzJywgX2NvbXBvbmVudE5hbWUsIG5ld0FwaU5hbWUsIGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA6ICcnLCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsVXBkYXRlTmFtZSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIFJlYWN0RmliZXJDb250ZXh0IHVzdWFsbHkgdXBkYXRlcyB0aGlzIGNhY2hlIGJ1dCBjYW4ndCBmb3IgbmV3bHktY3JlYXRlZCBpbnN0YW5jZXMuXG5cblxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAob2xkU3RhdGUgIT09IGluc3RhbmNlLnN0YXRlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCkge1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gb2xkU3RhdGUpIHtcbiAgICB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gJyArIFwidGhpcy5zdGF0ZSBpcyBkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59IC8vIEludm9rZXMgdGhlIG1vdW50IGxpZmUtY3ljbGVzIG9uIGEgcHJldmlvdXNseSBuZXZlciByZW5kZXJlZCBpbnN0YW5jZS5cblxuXG5mdW5jdGlvbiBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgaW5zdGFuY2UucmVmcyA9IHt9O1xuICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPT09IG5ld1Byb3BzKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgIH1cblxuICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3M7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzMiA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFnczI7XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufSAvLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdW5yZXNvbHZlZE9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPyB1bnJlc29sdmVkT2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciB1bnJlc29sdmVkTmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gdW5yZXNvbHZlZE5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgPT09IHVucmVzb2x2ZWROZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSAmJiAhKGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICApKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkgfHwgLy8gVE9ETzogSW4gc29tZSBjYXNlcywgd2UnbGwgZW5kIHVwIGNoZWNraW5nIGlmIGNvbnRleHQgaGFzIGNoYW5nZWQgdHdpY2UsXG4gIC8vIGJvdGggYmVmb3JlIGFuZCBhZnRlciBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCBoYXMgYmVlbiBjYWxsZWQuIE5vdCBpZGVhbCxcbiAgLy8gYnV0IEknbSBsb2F0aCB0byByZWZhY3RvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgbWVtb2l6ZWRcbiAgLy8gY29tcG9uZW50cyBzbyBpdCdzIG5vdCB0aGF0IGNvbW1vbi5cbiAgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgIDtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBwcm9wcy9zdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpLFxuICAgIGRpZ2VzdDogbnVsbFxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZSh2YWx1ZSwgZGlnZXN0LCBzdGFjaykge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IG51bGwsXG4gICAgc3RhY2s6IHN0YWNrICE9IG51bGwgPyBzdGFjayA6IG51bGwsXG4gICAgZGlnZXN0OiBkaWdlc3QgIT0gbnVsbCA/IGRpZ2VzdCA6IG51bGxcbiAgfTtcbn1cblxuLy8gVGhpcyBtb2R1bGUgaXMgZm9ya2VkIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4vLyBCeSBkZWZhdWx0LCByZXR1cm4gYHRydWVgIHRvIGxvZyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUuXG4vLyBGb3JrcyBjYW4gcmV0dXJuIGBmYWxzZWAgaWYgdGhpcyBpc24ndCBkZXNpcmFibGUuXG5mdW5jdGlvbiBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbykge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbG9nQ2FwdHVyZWRFcnJvcihib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHRyeSB7XG4gICAgdmFyIGxvZ0Vycm9yID0gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pOyAvLyBBbGxvdyBpbmplY3RlZCBzaG93RXJyb3JEaWFsb2coKSB0byBwcmV2ZW50IGRlZmF1bHQgY29uc29sZS5lcnJvciBsb2dnaW5nLlxuICAgIC8vIFRoaXMgZW5hYmxlcyByZW5kZXJlcnMgbGlrZSBSZWFjdE5hdGl2ZSB0byBiZXR0ZXIgbWFuYWdlIHJlZGJveCBiZWhhdmlvci5cblxuICAgIGlmIChsb2dFcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgICBpZiAodHJ1ZSkge1xuICAgICAgdmFyIHNvdXJjZSA9IGVycm9ySW5mby5zb3VyY2U7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJyc7IC8vIEJyb3dzZXJzIHN1cHBvcnQgc2lsZW5jaW5nIHVuY2F1Z2h0IGVycm9ycyBieSBjYWxsaW5nXG4gICAgICAvLyBgcHJldmVudERlZmF1bHQoKWAgaW4gd2luZG93IGBlcnJvcmAgaGFuZGxlci5cbiAgICAgIC8vIFdlIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uIGFzIGFuIGV4cGFuZG8gb24gdGhlIGVycm9yLlxuXG4gICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgIGlmIChib3VuZGFyeS50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgLy8gVGhlIGVycm9yIGlzIHJlY292ZXJhYmxlIGFuZCB3YXMgc2lsZW5jZWQuXG4gICAgICAgICAgLy8gSWdub3JlIGl0IGFuZCBkb24ndCBwcmludCB0aGUgc3RhY2sgYWRkZW5kdW0uXG4gICAgICAgICAgLy8gVGhpcyBpcyBoYW5keSBmb3IgdGVzdGluZyBlcnJvciBib3VuZGFyaWVzIHdpdGhvdXQgbm9pc2UuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFRoZSBlcnJvciBpcyBmYXRhbC4gU2luY2UgdGhlIHNpbGVuY2luZyBtaWdodCBoYXZlXG4gICAgICAgIC8vIGJlZW4gYWNjaWRlbnRhbCwgd2UnbGwgc3VyZmFjZSBpdCBhbnl3YXkuXG4gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBicm93c2VyIHdvdWxkIGhhdmUgc2lsZW5jZWQgdGhlIG9yaWdpbmFsIGVycm9yXG4gICAgICAgIC8vIHNvIHdlJ2xsIHByaW50IGl0IGZpcnN0LCBhbmQgdGhlbiBwcmludCB0aGUgc3RhY2sgYWRkZW5kdW0uXG5cblxuICAgICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgICAgIC8vIEZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcyBibG9jaywgc2VlOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMzM4NFxuICAgICAgfVxuXG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IHNvdXJjZSA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoc291cmNlKSA6IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lID8gXCJUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIDxcIiArIGNvbXBvbmVudE5hbWUgKyBcIj4gY29tcG9uZW50OlwiIDogJ1RoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzOic7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU1lc3NhZ2U7XG5cbiAgICAgIGlmIChib3VuZGFyeS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Vycm9yLWJvdW5kYXJpZXMgdG8gbGVhcm4gbW9yZSBhYm91dCBlcnJvciBib3VuZGFyaWVzLic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGJvdW5kYXJ5KSB8fCAnQW5vbnltb3VzJztcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSBcIlJlYWN0IHdpbGwgdHJ5IHRvIHJlY3JlYXRlIHRoaXMgY29tcG9uZW50IHRyZWUgZnJvbSBzY3JhdGNoIFwiICsgKFwidXNpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHlvdSBwcm92aWRlZCwgXCIgKyBlcnJvckJvdW5kYXJ5TmFtZSArIFwiLlwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbWJpbmVkTWVzc2FnZSA9IGNvbXBvbmVudE5hbWVNZXNzYWdlICsgXCJcXG5cIiArIGNvbXBvbmVudFN0YWNrICsgXCJcXG5cXG5cIiArIChcIlwiICsgZXJyb3JCb3VuZGFyeU1lc3NhZ2UpOyAvLyBJbiBkZXZlbG9wbWVudCwgd2UgcHJvdmlkZSBvdXIgb3duIG1lc3NhZ2Ugd2l0aCBqdXN0IHRoZSBjb21wb25lbnQgc3RhY2suXG4gICAgICAvLyBXZSBkb24ndCBpbmNsdWRlIHRoZSBvcmlnaW5hbCBlcnJvciBtZXNzYWdlIGFuZCBKUyBzdGFjayBiZWNhdXNlIHRoZSBicm93c2VyXG4gICAgICAvLyBoYXMgYWxyZWFkeSBwcmludGVkIGl0LiBFdmVuIGlmIHRoZSBhcHBsaWNhdGlvbiBzd2FsbG93cyB0aGUgZXJyb3IsIGl0IGlzIHN0aWxsXG4gICAgICAvLyBkaXNwbGF5ZWQgYnkgdGhlIGJyb3dzZXIgdGhhbmtzIHRvIHRoZSBERVYtb25seSBmYWtlIGV2ZW50IHRyaWNrIGluIFJlYWN0RXJyb3JVdGlscy5cblxuICAgICAgY29uc29sZVsnZXJyb3InXShjb21iaW5lZE1lc3NhZ2UpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gcHJvZHVjdGlvbiwgd2UgcHJpbnQgdGhlIGVycm9yIGRpcmVjdGx5LlxuICAgICAgLy8gVGhpcyB3aWxsIGluY2x1ZGUgdGhlIG1lc3NhZ2UsIHRoZSBKUyBzdGFjaywgYW5kIGFueXRoaW5nIHRoZSBicm93c2VyIHdhbnRzIHRvIHNob3cuXG4gICAgICAvLyBXZSBwYXNzIHRoZSBlcnJvciBvYmplY3QgaW5zdGVhZCBvZiBjdXN0b20gbWVzc2FnZSBzbyB0aGF0IHRoZSBicm93c2VyIGRpc3BsYXlzIHRoZSBlcnJvciBuYXRpdmVseS5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdywgb3IgUmVhY3QgaW50ZXJuYWwgc3RhdGUgd2lsbCBnZXQgbWVzc2VkIHVwLlxuICAgIC8vIElmIGNvbnNvbGUuZXJyb3IgaXMgb3ZlcnJpZGRlbiwgb3IgbG9nQ2FwdHVyZWRFcnJvcigpIHNob3dzIGEgZGlhbG9nIHRoYXQgdGhyb3dzLFxuICAgIC8vIHdlIHdhbnQgdG8gcmVwb3J0IHRoaXMgZXJyb3Igb3V0c2lkZSBvZiB0aGUgbm9ybWFsIHN0YWNrIGFzIGEgbGFzdCByZXNvcnQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzE4OFxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgUG9zc2libHlXZWFrTWFwJDEgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpOyAvLyBVbm1vdW50IHRoZSByb290IGJ5IHJlbmRlcmluZyBudWxsLlxuXG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBudWxsXG4gIH07XG4gIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgb25VbmNhdWdodEVycm9yKGVycm9yKTtcbiAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICB9O1xuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7XG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPSBmaWJlci50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtcblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgdXBkYXRlLnBheWxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yJDEpO1xuICAgIH07XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGluc3QgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgaWYgKGluc3QgIT09IG51bGwgJiYgdHlwZW9mIGluc3QuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHtcbiAgICAgICAgbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpO1xuICAgICAgfVxuXG4gICAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuXG4gICAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUbyBwcmVzZXJ2ZSB0aGUgcHJlZXhpc3RpbmcgcmV0cnkgYmVoYXZpb3Igb2YgZXJyb3IgYm91bmRhcmllcyxcbiAgICAgICAgLy8gd2Uga2VlcCB0cmFjayBvZiB3aGljaCBvbmVzIGFscmVhZHkgZmFpbGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgICAgICAvLyBUaGlzIGdldHMgcmVzZXQgYmVmb3JlIHdlIHlpZWxkIGJhY2sgdG8gdGhlIGJyb3dzZXIuXG4gICAgICAgIC8vIFRPRE86IFdhcm4gaW4gc3RyaWN0IG1vZGUgaWYgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzXG4gICAgICAgIC8vIG5vdCBkZWZpbmVkLlxuICAgICAgICBtYXJrTGVnYWN5RXJyb3JCb3VuZGFyeUFzRmFpbGVkKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHRoaXMuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IkMSwge1xuICAgICAgICBjb21wb25lbnRTdGFjazogc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnXG4gICAgICB9KTtcblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIElmIGNvbXBvbmVudERpZENhdGNoIGlzIHRoZSBvbmx5IGVycm9yIGJvdW5kYXJ5IG1ldGhvZCBkZWZpbmVkLFxuICAgICAgICAgIC8vIHRoZW4gaXQgbmVlZHMgdG8gY2FsbCBzZXRTdGF0ZSB0byByZWNvdmVyIGZyb20gZXJyb3JzLlxuICAgICAgICAgIC8vIElmIG5vIHN0YXRlIHVwZGF0ZSBpcyBzY2hlZHVsZWQgdGhlbiB0aGUgYm91bmRhcnkgd2lsbCBzd2FsbG93IHRoZSBlcnJvci5cbiAgICAgICAgICBpZiAoIWluY2x1ZGVzU29tZUxhbmUoZmliZXIubGFuZXMsIFN5bmNMYW5lKSkge1xuICAgICAgICAgICAgZXJyb3IoJyVzOiBFcnJvciBib3VuZGFyaWVzIHNob3VsZCBpbXBsZW1lbnQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkuICcgKyAnSW4gdGhhdCBtZXRob2QsIHJldHVybiBhIHN0YXRlIHVwZGF0ZSB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2Ugb3IgZmFsbGJhY2sgVUkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCBsYW5lcykge1xuICAvLyBBdHRhY2ggYSBwaW5nIGxpc3RlbmVyXG4gIC8vXG4gIC8vIFRoZSBkYXRhIG1pZ2h0IHJlc29sdmUgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8gY29tbWl0IHRoZSBmYWxsYmFjay4gT3IsXG4gIC8vIGluIHRoZSBjYXNlIG9mIGEgcmVmcmVzaCwgd2UnbGwgbmV2ZXIgY29tbWl0IGEgZmFsbGJhY2suIFNvIHdlIG5lZWQgdG9cbiAgLy8gYXR0YWNoIGEgbGlzdGVuZXIgbm93LiBXaGVuIGl0IHJlc29sdmVzIChcInBpbmdzXCIpLCB3ZSBjYW4gZGVjaWRlIHdoZXRoZXIgdG9cbiAgLy8gdHJ5IHJlbmRlcmluZyB0aGUgdHJlZSBhZ2Fpbi5cbiAgLy9cbiAgLy8gT25seSBhdHRhY2ggYSBsaXN0ZW5lciBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGxhbmVzXG4gIC8vIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgKHdoaWNoIGFjdHMgbGlrZSBhIFwidGhyZWFkIElEXCIgaGVyZSkuXG4gIC8vXG4gIC8vIFdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGluIGNvbmN1cnJlbnQgbW9kZS4gTGVnYWN5IFN1c3BlbnNlIGFsd2F5c1xuICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgdmFyIHRocmVhZElEcztcblxuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwJDEoKTtcbiAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKTtcblxuICAgIGlmICh0aHJlYWRJRHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRocmVhZElEcy5oYXMobGFuZXMpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKGxhbmVzKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnNcbiAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FrZWFibGUudGhlbihwaW5nLCBwaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRhY2hSZXRyeUxpc3RlbmVyKHN1c3BlbnNlQm91bmRhcnksIHJvb3QsIHdha2VhYmxlLCBsYW5lcykge1xuICAvLyBSZXRyeSBsaXN0ZW5lclxuICAvL1xuICAvLyBJZiB0aGUgZmFsbGJhY2sgZG9lcyBjb21taXQsIHdlIG5lZWQgdG8gYXR0YWNoIGEgZGlmZmVyZW50IHR5cGUgb2ZcbiAgLy8gbGlzdGVuZXIuIFRoaXMgb25lIHNjaGVkdWxlcyBhbiB1cGRhdGUgb24gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IHRvIHR1cm5cbiAgLy8gdGhlIGZhbGxiYWNrIHN0YXRlIG9mZi5cbiAgLy9cbiAgLy8gU3Rhc2ggdGhlIHdha2VhYmxlIG9uIHRoZSBib3VuZGFyeSBmaWJlciBzbyB3ZSBjYW4gYWNjZXNzIGl0IGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UuXG4gIC8vXG4gIC8vIFdoZW4gdGhlIHdha2VhYmxlIHJlc29sdmVzLCB3ZSdsbCBhdHRlbXB0IHRvIHJlbmRlciB0aGUgYm91bmRhcnlcbiAgLy8gYWdhaW4gKFwicmV0cnlcIikuXG4gIHZhciB3YWtlYWJsZXMgPSBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgPT09IG51bGwpIHtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSBuZXcgU2V0KCk7XG4gICAgdXBkYXRlUXVldWUuYWRkKHdha2VhYmxlKTtcbiAgICBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWU7XG4gIH0gZWxzZSB7XG4gICAgd2FrZWFibGVzLmFkZCh3YWtlYWJsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRTdXNwZW5kZWRDb21wb25lbnQoc291cmNlRmliZXIsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBBIGxlZ2FjeSBtb2RlIFN1c3BlbnNlIHF1aXJrLCBvbmx5IHJlbGV2YW50IHRvIGhvb2sgY29tcG9uZW50cy5cblxuXG4gIHZhciB0YWcgPSBzb3VyY2VGaWJlci50YWc7XG5cbiAgaWYgKChzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgKHRhZyA9PT0gRnVuY3Rpb25Db21wb25lbnQgfHwgdGFnID09PSBGb3J3YXJkUmVmIHx8IHRhZyA9PT0gU2ltcGxlTWVtb0NvbXBvbmVudCkpIHtcbiAgICB2YXIgY3VycmVudFNvdXJjZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50U291cmNlKSB7XG4gICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IGN1cnJlbnRTb3VyY2UudXBkYXRlUXVldWU7XG4gICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gY3VycmVudFNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICAgICAgc291cmNlRmliZXIubGFuZXMgPSBjdXJyZW50U291cmNlLmxhbmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpIHtcbiAgdmFyIG5vZGUgPSByZXR1cm5GaWJlcjtcblxuICBkbyB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCAmJiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0gLy8gVGhpcyBib3VuZGFyeSBhbHJlYWR5IGNhcHR1cmVkIGR1cmluZyB0aGlzIHJlbmRlci4gQ29udGludWUgdG8gdGhlIG5leHRcbiAgICAvLyBib3VuZGFyeS5cblxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgbWFya3MgYSBTdXNwZW5zZSBib3VuZGFyeSBzbyB0aGF0IHdoZW4gd2UncmUgdW53aW5kaW5nIHRoZSBzdGFjayxcbiAgLy8gaXQgY2FwdHVyZXMgdGhlIHN1c3BlbmRlZCBcImV4Y2VwdGlvblwiIGFuZCBkb2VzIGEgc2Vjb25kIChmYWxsYmFjaykgcGFzcy5cbiAgaWYgKChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIExlZ2FjeSBNb2RlIFN1c3BlbnNlXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgYm91bmRhcnkgaXMgaW4gbGVnYWN5IG1vZGUsIHdlIHNob3VsZCAqbm90KlxuICAgIC8vIHN1c3BlbmQgdGhlIGNvbW1pdC4gUHJldGVuZCBhcyBpZiB0aGUgc3VzcGVuZGVkIGNvbXBvbmVudCByZW5kZXJlZFxuICAgIC8vIG51bGwgYW5kIGtlZXAgcmVuZGVyaW5nLiBXaGVuIHRoZSBTdXNwZW5zZSBib3VuZGFyeSBjb21wbGV0ZXMsXG4gICAgLy8gd2UnbGwgZG8gYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5ID09PSByZXR1cm5GaWJlcikge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZXJlIHdlIHN1c3BlbmRlZCB3aGlsZSByZWNvbmNpbGluZyB0aGUgY2hpbGRyZW4gb2ZcbiAgICAgIC8vIGEgU3VzcGVuc2UgYm91bmRhcnkncyBpbm5lciBPZmZzY3JlZW4gd3JhcHBlciBmaWJlci4gVGhpcyBoYXBwZW5zXG4gICAgICAvLyB3aGVuIGEgUmVhY3QubGF6eSBjb21wb25lbnQgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnkuXG4gICAgICAvL1xuICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcmllcyBhcmUgaW1wbGVtZW50ZWQgYXMgbXVsdGlwbGUgZmliZXJzLCBidXQgdGhleVxuICAgICAgLy8gYXJlIGEgc2luZ2xlIGNvbmNlcHR1YWwgdW5pdC4gVGhlIGxlZ2FjeSBtb2RlIGJlaGF2aW9yIHdoZXJlIHdlXG4gICAgICAvLyBwcmV0ZW5kIHRoZSBzdXNwZW5kZWQgZmliZXIgY29tbWl0dGVkIGFzIGBudWxsYCB3b24ndCB3b3JrLFxuICAgICAgLy8gYmVjYXVzZSBpbiB0aGlzIGNhc2UgdGhlIFwic3VzcGVuZGVkXCIgZmliZXIgaXMgdGhlIGlubmVyXG4gICAgICAvLyBPZmZzY3JlZW4gd3JhcHBlci5cbiAgICAgIC8vXG4gICAgICAvLyBCZWNhdXNlIHRoZSBjb250ZW50cyBvZiB0aGUgYm91bmRhcnkgaGF2ZW4ndCBzdGFydGVkIHJlbmRlcmluZ1xuICAgICAgLy8geWV0IChpLmUuIG5vdGhpbmcgaW4gdGhlIHRyZWUgaGFzIHBhcnRpYWxseSByZW5kZXJlZCkgd2UgY2FuXG4gICAgICAvLyBzd2l0Y2ggdG8gdGhlIHJlZ3VsYXIsIGNvbmN1cnJlbnQgbW9kZSBiZWhhdmlvcjogbWFyayB0aGVcbiAgICAgIC8vIGJvdW5kYXJ5IHdpdGggU2hvdWxkQ2FwdHVyZSBhbmQgZW50ZXIgdGhlIHVud2luZCBwaGFzZS5cbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgc291cmNlRmliZXIuZmxhZ3MgfD0gRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZTsgLy8gV2UncmUgZ29pbmcgdG8gY29tbWl0IHRoaXMgZmliZXIgZXZlbiB0aG91Z2ggaXQgZGlkbid0IGNvbXBsZXRlLlxuICAgICAgLy8gQnV0IHdlIHNob3VsZG4ndCBjYWxsIGFueSBsaWZlY3ljbGUgbWV0aG9kcyBvciBjYWxsYmFja3MuIFJlbW92ZVxuICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cblxuICAgICAgc291cmNlRmliZXIuZmxhZ3MgJj0gfihMaWZlY3ljbGVFZmZlY3RNYXNrIHwgSW5jb21wbGV0ZSk7XG5cbiAgICAgIGlmIChzb3VyY2VGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBjdXJyZW50U291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2VGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgbW91bnQuIENoYW5nZSB0aGUgdGFnIHNvIGl0J3Mgbm90IG1pc3Rha2VuIGZvciBhXG4gICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50IGlmIGl0IGlzIGRlbGV0ZWQuXG4gICAgICAgICAgc291cmNlRmliZXIudGFnID0gSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdoZW4gd2UgdHJ5IHJlbmRlcmluZyBhZ2Fpbiwgd2Ugc2hvdWxkIG5vdCByZXVzZSB0aGUgY3VycmVudCBmaWJlcixcbiAgICAgICAgICAvLyBzaW5jZSBpdCdzIGtub3duIHRvIGJlIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gVXNlIGEgZm9yY2UgdXBkYXRlIHRvXG4gICAgICAgICAgLy8gcHJldmVudCBhIGJhaWwgb3V0LlxuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIFN5bmNMYW5lKTtcbiAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG4gICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLiBNYXJrIGl0IHdpdGggU3luYyBwcmlvcml0eSB0b1xuICAgICAgLy8gaW5kaWNhdGUgdGhhdCBpdCBzdGlsbCBoYXMgcGVuZGluZyB3b3JrLlxuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xuICB9IC8vIENvbmZpcm1lZCB0aGF0IHRoZSBib3VuZGFyeSBpcyBpbiBhIGNvbmN1cnJlbnQgbW9kZSB0cmVlLiBDb250aW51ZVxuICAvLyB3aXRoIHRoZSBub3JtYWwgc3VzcGVuZCBwYXRoLlxuICAvL1xuICAvLyBBZnRlciB0aGlzIHdlJ2xsIHVzZSBhIHNldCBvZiBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXNcbiAgLy8gcmVuZGVyIHBhc3Mgd2lsbCBydW4gdG8gY29tcGxldGlvbiBvciByZXN0YXJ0IG9yIFwic3VzcGVuZFwiIHRoZSBjb21taXQuXG4gIC8vIFRoZSBhY3R1YWwgbG9naWMgZm9yIHRoaXMgaXMgc3ByZWFkIG91dCBpbiBkaWZmZXJlbnQgcGxhY2VzLlxuICAvL1xuICAvLyBUaGlzIGZpcnN0IHByaW5jaXBsZSBpcyB0aGF0IGlmIHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2hlbiB3ZSBjb21wbGV0ZVxuICAvLyBhIHJvb3QsIHRoZW4gd2Ugc2hvdWxkIGFsc28gcmVzdGFydCBpZiB3ZSBnZXQgYW4gdXBkYXRlIG9yIHBpbmcgdGhhdFxuICAvLyBtaWdodCB1bnN1c3BlbmQgaXQsIGFuZCB2aWNlIHZlcnNhLiBUaGUgb25seSByZWFzb24gdG8gc3VzcGVuZCBpc1xuICAvLyBiZWNhdXNlIHlvdSB0aGluayB5b3UgbWlnaHQgd2FudCB0byByZXN0YXJ0IGJlZm9yZSBjb21taXR0aW5nLiBIb3dldmVyLFxuICAvLyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVzdGFydCBvbmx5IHdoaWxlIGluIHRoZSBwZXJpb2Qgd2UncmUgc3VzcGVuZGVkLlxuICAvL1xuICAvLyBSZXN0YXJ0aW5nIHRvbyBhZ2dyZXNzaXZlbHkgaXMgYWxzbyBub3QgZ29vZCBiZWNhdXNlIGl0IHN0YXJ2ZXMgb3V0IGFueVxuICAvLyBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gU28gd2UgdXNlIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZW4uXG4gIC8vIFN1c3BlbnNlIEhldXJpc3RpY3NcbiAgLy9cbiAgLy8gSWYgbm90aGluZyB0aHJldyBhIFByb21pc2Ugb3IgYWxsIHRoZSBzYW1lIGZhbGxiYWNrcyBhcmUgYWxyZWFkeSBzaG93aW5nLFxuICAvLyB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBhbiBpbml0aWFsIHJlbmRlciBvZiBhIG5ldyB0cmVlIG9mIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gIC8vIHRob3NlIHRyaWdnZXIgYSBmYWxsYmFjaywgdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgY2FuIHNob3cgdGhlIGluaXRpYWwgbG9hZGluZyBzdGF0ZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLlxuICAvL1xuICAvLyBJZiB3ZSBoaXQgYSBcIkRlbGF5ZWRcIiBjYXNlLCBzdWNoIGFzIHdoZW4gd2UnZCBzd2l0Y2ggZnJvbSBjb250ZW50IGJhY2sgaW50b1xuICAvLyBhIGZhbGxiYWNrLCB0aGVuIHdlIHNob3VsZCBhbHdheXMgc3VzcGVuZC9yZXN0YXJ0LiBUcmFuc2l0aW9ucyBhcHBseVxuICAvLyB0byB0aGlzIGNhc2UuIElmIG5vbmUgaXMgZGVmaW5lZCwgSk5EIGlzIHVzZWQgaW5zdGVhZC5cbiAgLy9cbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgYW5kIGl0IGdldHMgXCJyZXRyaWVkXCIsIGFsbG93aW5nIHVzIHRvIHNob3dcbiAgLy8gYW5vdGhlciBsZXZlbCwgYnV0IHRoZXJlJ3Mgc3RpbGwgYW4gaW5uZXIgYm91bmRhcnkgdGhhdCB3b3VsZCBzaG93IGEgZmFsbGJhY2ssXG4gIC8vIHRoZW4gd2Ugc3VzcGVuZC9yZXN0YXJ0IGZvciA1MDBtcyBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNob3dlZCBhIGZhbGxiYWNrXG4gIC8vIGFueXdoZXJlIGluIHRoZSB0cmVlLiBUaGlzIGVmZmVjdGl2ZWx5IHRocm90dGxlcyBwcm9ncmVzc2l2ZSBsb2FkaW5nIGludG8gYVxuICAvLyBjb25zaXN0ZW50IHRyYWluIG9mIGNvbW1pdHMuIFRoaXMgYWxzbyBnaXZlcyB1cyBhbiBvcHBvcnR1bml0eSB0byByZXN0YXJ0IHRvXG4gIC8vIGdldCB0byB0aGUgY29tcGxldGVkIHN0YXRlIHNsaWdodGx5IGVhcmxpZXIuXG4gIC8vXG4gIC8vIElmIHRoZXJlJ3MgYW1iaWd1aXR5IGR1ZSB0byBiYXRjaGluZyBpdCdzIHJlc29sdmVkIGluIHByZWZlcmVuY2Ugb2Y6XG4gIC8vIDEpIFwiZGVsYXllZFwiLCAyKSBcImluaXRpYWwgcmVuZGVyXCIsIDMpIFwicmV0cnlcIi5cbiAgLy9cbiAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCBhIFwiYnVzeVwiIHN0YXRlIGRvZXNuJ3QgZ2V0IGZvcmNlIGNvbW1pdHRlZC4gV2Ugd2FudCB0b1xuICAvLyBlbnN1cmUgdGhhdCBuZXcgaW5pdGlhbCBsb2FkaW5nIHN0YXRlcyBjYW4gY29tbWl0IGFzIHNvb24gYXMgcG9zc2libGUuXG5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIFRPRE86IEkgdGhpbmsgd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSBub3cgdXNlIGBEaWRDYXB0dXJlYCBpblxuICAvLyB0aGUgYmVnaW4gcGhhc2UgdG8gcHJldmVudCBhbiBlYXJseSBiYWlsb3V0LlxuXG4gIHN1c3BlbnNlQm91bmRhcnkubGFuZXMgPSByb290UmVuZGVyTGFuZXM7XG4gIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xufVxuXG5mdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbihyb290LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHZhbHVlLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLlxuICBzb3VyY2VGaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuXG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCByb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVGhpcyBpcyBhIHdha2VhYmxlLiBUaGUgY29tcG9uZW50IHN1c3BlbmRlZC5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcbiAgICByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlcik7XG5cbiAgICB7XG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHZhciBzdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpO1xuXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gV2Ugb25seSBhdHRhY2ggcGluZyBsaXN0ZW5lcnMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gICAgICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG5cbiAgICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBib3VuZGFyeSB3YXMgZm91bmQuIFVubGVzcyB0aGlzIGlzIGEgc3luYyB1cGRhdGUsIHRoaXMgaXMgT0suXG4gICAgICAvLyBXZSBjYW4gc3VzcGVuZCBhbmQgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cbiAgICAgIGlmICghaW5jbHVkZXNTeW5jTGFuZShyb290UmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgc3luYyB1cGRhdGUuIFN1c3BlbmQuIFNpbmNlIHdlJ3JlIG5vdCBhY3RpdmF0aW5nIGFcbiAgICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIHRoaXMgd2lsbCB1bndpbmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgd2l0aG91dFxuICAgICAgICAvLyBwZXJmb3JtaW5nIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIGEgZmFsbGJhY2suIChUaGlzIGlzIGFyZ3VhYmx5IGhvd1xuICAgICAgICAvLyByZWZyZXNoIHRyYW5zaXRpb25zIHNob3VsZCB3b3JrLCB0b28sIHNpbmNlIHdlJ3JlIG5vdCBnb2luZyB0byBjb21taXRcbiAgICAgICAgLy8gdGhlIGZhbGxiYWNrcyBhbnl3YXkuKVxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGNhc2UgYWxzbyBhcHBsaWVzIHRvIGluaXRpYWwgaHlkcmF0aW9uLlxuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBUaGlzIGlzIGEgc3luYy9kaXNjcmV0ZSB1cGRhdGUuIFdlIHRyZWF0IHRoaXMgY2FzZSBsaWtlIGFuIGVycm9yXG4gICAgICAvLyBiZWNhdXNlIGRpc2NyZXRlIHJlbmRlcnMgYXJlIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBjb21wbGV0ZSB0cmVlXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggZXh0ZXJuYWwgc3RhdGUuXG5cblxuICAgICAgdmFyIHVuY2F1Z2h0U3VzcGVuc2VFcnJvciA9IG5ldyBFcnJvcignQSBjb21wb25lbnQgc3VzcGVuZGVkIHdoaWxlIHJlc3BvbmRpbmcgdG8gc3luY2hyb25vdXMgaW5wdXQuIFRoaXMgJyArICd3aWxsIGNhdXNlIHRoZSBVSSB0byBiZSByZXBsYWNlZCB3aXRoIGEgbG9hZGluZyBpbmRpY2F0b3IuIFRvICcgKyAnZml4LCB1cGRhdGVzIHRoYXQgc3VzcGVuZCBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ3dpdGggc3RhcnRUcmFuc2l0aW9uLicpOyAvLyBJZiB3ZSdyZSBvdXRzaWRlIGEgdHJhbnNpdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSByZWd1bGFyIGVycm9yIHBhdGguXG4gICAgICAvLyBUaGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgYnkgdGhlIG5lYXJlc3Qgc3VzcGVuc2UgYm91bmRhcnkuXG5cbiAgICAgIHZhbHVlID0gdW5jYXVnaHRTdXNwZW5zZUVycm9yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBlcnJvciwgbm90IGEgU3VzcGVuc2Ugd2FrZWFibGUuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuXG4gICAgICB2YXIgX3N1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7IC8vIElmIHRoZSBlcnJvciB3YXMgdGhyb3duIGR1cmluZyBoeWRyYXRpb24sIHdlIG1heSBiZSBhYmxlIHRvIHJlY292ZXIgYnlcbiAgICAgIC8vIGRpc2NhcmRpbmcgdGhlIGRlaHlkcmF0ZWQgY29udGVudCBhbmQgc3dpdGNoaW5nIHRvIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIC8vIEluc3RlYWQgb2Ygc3VyZmFjaW5nIHRoZSBlcnJvciwgZmluZCB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeVxuICAgICAgLy8gYW5kIHJlbmRlciBpdCBhZ2FpbiB3aXRob3V0IGh5ZHJhdGlvbi5cblxuXG4gICAgICBpZiAoX3N1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKChfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmIFNob3VsZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCB0cnkgcmVuZGVyaW5nIHRoZSBub3JtYWxcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhZ2Fpbiwgbm90IHRoZSBmYWxsYmFjay5cbiAgICAgICAgICBfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShfc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBFdmVuIHRob3VnaCB0aGUgdXNlciBtYXkgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgZXJyb3IsIHdlIHNob3VsZFxuICAgICAgICAvLyBzdGlsbCBsb2cgaXQgc28gaXQgY2FuIGJlIGZpeGVkLlxuXG4gICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IoY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gIHJlbmRlckRpZEVycm9yKHZhbHVlKTsgLy8gV2UgZGlkbid0IGZpbmQgYSBib3VuZGFyeSB0aGF0IGNvdWxkIGhhbmRsZSB0aGlzIHR5cGUgb2YgZXhjZXB0aW9uLiBTdGFydFxuICAvLyBvdmVyIGFuZCB0cmF2ZXJzZSBwYXJlbnQgcGF0aCBhZ2FpbiwgdGhpcyB0aW1lIHRyZWF0aW5nIHRoZSBleGNlcHRpb25cbiAgLy8gYXMgYW4gZXJyb3IuXG5cbiAgdmFyIHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpO1xuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF9lcnJvckluZm8sIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gQ2FwdHVyZSBhbmQgcmV0cnlcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MgJiYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCBpbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG5cbiAgICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBfbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIF91cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBlcnJvckluZm8sIF9sYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkQ2FjaGUoKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgc3VzcGVuZHMuIEl0IHJldHVybnMgdGhlXG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5BYm91dEJhZENsYXNzO1xudmFyIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzO1xudmFyIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHM7XG52YXIgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXI7XG52YXIgZGlkV2FybkFib3V0VGFpbE9wdGlvbnM7XG52YXIgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudDtcblxue1xuICBkaWRXYXJuQWJvdXRCYWRDbGFzcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyID0ge307XG4gIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zID0ge307XG4gIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgZnJlc2ggbmV3IGNvbXBvbmVudCB0aGF0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldCwgd2VcbiAgICAvLyB3b24ndCB1cGRhdGUgaXRzIGNoaWxkIHNldCBieSBhcHBseWluZyBtaW5pbWFsIHNpZGUtZWZmZWN0cy4gSW5zdGVhZCxcbiAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnNcbiAgICAvLyB3ZSBjYW4gb3B0aW1pemUgdGhpcyByZWNvbmNpbGlhdGlvbiBwYXNzIGJ5IG5vdCB0cmFja2luZyBzaWRlLWVmZmVjdHMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgd29yayBpbiBwcm9ncmVzcywgaXQgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYW55IHdvcmsgb24gdGhlc2UgY2hpbGRyZW4uIFRoZXJlZm9yZSwgd2UgdXNlXG4gICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXJcbiAgLy8gaWRlbnRpdGllcyBtYXRjaC5cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBmaXJzdCByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcmVuZGVyID0gQ29tcG9uZW50LnJlbmRlcjtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjsgLy8gVGhlIHJlc3QgaXMgYSBmb3JrIG9mIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50XG5cbiAgdmFyIG5leHRDaGlsZHJlbjtcbiAgdmFyIGhhc0lkO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB2YXIgdHlwZSA9IENvbXBvbmVudC50eXBlO1xuXG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiYgLy8gU2ltcGxlTWVtb0NvbXBvbmVudCBjb2RlcGF0aCBkb2Vzbid0IHJlc29sdmUgb3V0ZXIgcHJvcHMgZWl0aGVyLlxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gU2ltcGxlTWVtb0NvbXBvbmVudDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlZFR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlc29sdmVkVHlwZSwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggQ29tcG9uZW50LmRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICBlcnJvcignJXM6IFN1cHBvcnQgZm9yIGRlZmF1bHRQcm9wcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBtZW1vIGNvbXBvbmVudHMgJyArICdpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBVc2UgSmF2YVNjcmlwdCBkZWZhdWx0IHBhcmFtZXRlcnMgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICAgIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKENvbXBvbmVudC50eXBlLCBudWxsLCBuZXh0UHJvcHMsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCByZW5kZXJMYW5lcyk7XG4gICAgY2hpbGQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICAgIGNoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAge1xuICAgIHZhciBfdHlwZSA9IENvbXBvbmVudC50eXBlO1xuICAgIHZhciBfaW5uZXJQcm9wVHlwZXMgPSBfdHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAoX2lubmVyUHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgIGNoZWNrUHJvcFR5cGVzKF9pbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoX3R5cGUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhpcyBpcyBhbHdheXMgZXhhY3RseSBvbmUgY2hpbGRcblxuICB2YXIgaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ID0gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuXG4gIGlmICghaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KSB7XG4gICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBwcm9wcyB3aXRoIHJlc29sdmVkIGRlZmF1bHRQcm9wcyxcbiAgICAvLyB1bmxpa2UgY3VycmVudC5tZW1vaXplZFByb3BzIHdoaWNoIHdpbGwgYmUgdGhlIHVucmVzb2x2ZWQgb25lcy5cbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudENoaWxkLm1lbW9pemVkUHJvcHM7IC8vIERlZmF1bHQgdG8gc2hhbGxvdyBjb21wYXJpc29uXG5cbiAgICB2YXIgY29tcGFyZSA9IENvbXBvbmVudC5jb21wYXJlO1xuICAgIGNvbXBhcmUgPSBjb21wYXJlICE9PSBudWxsID8gY29tcGFyZSA6IHNoYWxsb3dFcXVhbDtcblxuICAgIGlmIChjb21wYXJlKHByZXZQcm9wcywgbmV4dFByb3BzKSAmJiBjdXJyZW50LnJlZiA9PT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIG5leHRQcm9wcyk7XG4gIG5ld0NoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIHJldHVybiBuZXdDaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGlubmVyIHJlbmRlciBzdXNwZW5kcy5cbiAgLy8gV2UnbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgZmluZSBvciBjYW4gY2F1c2UgaXNzdWVzLlxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIG91dGVyTWVtb1R5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcblxuICAgICAgaWYgKG91dGVyTWVtb1R5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAvLyBXZSB3YXJuIHdoZW4geW91IGRlZmluZSBwcm9wVHlwZXMgb24gbGF6eSgpXG4gICAgICAgIC8vIHNvIGxldCdzIGp1c3Qgc2tpcCBvdmVyIGl0IHRvIGZpbmQgbWVtbygpIG91dGVyIHdyYXBwZXIuXG4gICAgICAgIC8vIElubmVyIHByb3BzIGZvciBtZW1vIGFyZSB2YWxpZGF0ZWQgbGF0ZXIuXG4gICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gb3V0ZXJNZW1vVHlwZTtcbiAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gaW5pdChwYXlsb2FkKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBudWxsO1xuICAgICAgICB9IC8vIElubmVyIHByb3BUeXBlcyB3aWxsIGJlIHZhbGlkYXRlZCBpbiB0aGUgZnVuY3Rpb24gY29tcG9uZW50IHBhdGguXG5cblxuICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBvdXRlck1lbW9UeXBlICYmIG91dGVyTWVtb1R5cGUucHJvcFR5cGVzO1xuXG4gICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIChTaW1wbGVNZW1vQ29tcG9uZW50IGhhcyBubyBkZWZhdWx0UHJvcHMpXG4gICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3V0ZXJNZW1vVHlwZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJiAoIC8vIFByZXZlbnQgYmFpbG91dCBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZC5cbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhlIHByb3BzIGFyZSBzaGFsbG93bHkgZXF1YWwuIFJldXNlIHRoZSBwcmV2aW91cyBwcm9wcyBvYmplY3QsIGxpa2Ugd2VcbiAgICAgIC8vIHdvdWxkIGR1cmluZyBhIG5vcm1hbCBmaWJlciBiYWlsb3V0LlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgc3Ryb25nIGd1YXJhbnRlZXMgdGhhdCB0aGUgcHJvcHMgb2JqZWN0IGlzIHJlZmVyZW50aWFsbHlcbiAgICAgIC8vIGVxdWFsIGR1cmluZyB1cGRhdGVzIHdoZXJlIHdlIGNhbid0IGJhaWwgb3V0IGFueXdheSDigJQgbGlrZSBpZiB0aGUgcHJvcHNcbiAgICAgIC8vIGFyZSBzaGFsbG93bHkgZXF1YWwsIGJ1dCB0aGVyZSdzIGEgbG9jYWwgc3RhdGUgb3IgY29udGV4dCB1cGRhdGUgaW4gdGhlXG4gICAgICAvLyBzYW1lIGJhdGNoLlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIGFzIGEgcHJpbmNpcGxlLCB3ZSBzaG91bGQgYWltIHRvIG1ha2UgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnRcbiAgICAgIC8vIGFjcm9zcyBkaWZmZXJlbnQgd2F5cyBvZiBtZW1vaXppbmcgYSBjb21wb25lbnQuIEZvciBleGFtcGxlLCBSZWFjdC5tZW1vXG4gICAgICAvLyBoYXMgYSBkaWZmZXJlbnQgaW50ZXJuYWwgRmliZXIgbGF5b3V0IGlmIHlvdSBwYXNzIGEgbm9ybWFsIGZ1bmN0aW9uXG4gICAgICAvLyBjb21wb25lbnQgKFNpbXBsZU1lbW9Db21wb25lbnQpIHZlcnN1cyBpZiB5b3UgcGFzcyBhIGRpZmZlcmVudCB0eXBlXG4gICAgICAvLyBsaWtlIGZvcndhcmRSZWYgKE1lbW9Db21wb25lbnQpLiBCdXQgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG4gICAgICAvLyBXcmFwcGluZyBhIGNvbXBvbmVudCBpbiBmb3J3YXJkUmVmIChvciBSZWFjdC5sYXp5LCBldGMpIHNob3VsZG4ndFxuICAgICAgLy8gYWZmZWN0IHdoZXRoZXIgdGhlIHByb3BzIG9iamVjdCBpcyByZXVzZWQgZHVyaW5nIGEgYmFpbG91dC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gbmV4dFByb3BzID0gcHJldlByb3BzO1xuXG4gICAgICBpZiAoIWNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAvLyBUaGUgcGVuZGluZyBsYW5lcyB3ZXJlIGNsZWFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBiZWdpbldvcmsuIFdlJ3JlXG4gICAgICAgIC8vIGFib3V0IHRvIGJhaWwgb3V0LCBidXQgdGhlcmUgbWlnaHQgYmUgb3RoZXIgbGFuZXMgdGhhdCB3ZXJlbid0XG4gICAgICAgIC8vIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHJlbmRlci4gVXN1YWxseSwgdGhlIHByaW9yaXR5IGxldmVsIG9mIHRoZVxuICAgICAgICAvLyByZW1haW5pbmcgdXBkYXRlcyBpcyBhY2N1bXVsYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCAoaS5lLiB3aGVuIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZSkuIEJ1dCBzaW5jZSBzaW5jZVxuICAgICAgICAvLyB3ZSdyZSBiYWlsaW5nIG91dCBlYXJseSAqd2l0aG91dCogZXZhbHVhdGluZyB0aGUgY29tcG9uZW50LCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLlxuICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgYXBwbGllcyB0byBTaW1wbGVNZW1vQ29tcG9uZW50LCBub3QgTWVtb0NvbXBvbmVudCxcbiAgICAgICAgLy8gYmVjYXVzZSBhIE1lbW9Db21wb25lbnQgZmliZXIgZG9lcyBub3QgaGF2ZSBob29rcyBvciBhbiB1cGRhdGUgcXVldWU7XG4gICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAgICAgICAgLy8gY29udGFpbnMgaG9va3MuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhlIHJlc2V0IGF0IGluIGJlZ2luV29yayBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsO1xuXG4gIGlmIChuZXh0UHJvcHMubW9kZSA9PT0gJ2hpZGRlbicgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICkge1xuICAgIC8vIFJlbmRlcmluZyBhIGhpZGRlbiB0cmVlLlxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBsZWdhY3kgc3luYyBtb2RlLCBkb24ndCBkZWZlciB0aGUgc3VidHJlZS4gUmVuZGVyIGl0IG5vdy5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIGhvdyBPZmZzY3JlZW4gc2hvdWxkIHdvcmsgd2l0aCB0cmFuc2l0aW9ucyBpbiB0aGUgZnV0dXJlXG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgdmFyIHNwYXduZWRDYWNoZVBvb2wgPSBudWxsOyAvLyBXZSdyZSBoaWRkZW4sIGFuZCB3ZSdyZSBub3QgcmVuZGVyaW5nIGF0IE9mZnNjcmVlbi4gV2Ugd2lsbCBiYWlsIG91dFxuICAgICAgLy8gYW5kIHJlc3VtZSB0aGlzIHRyZWUgbGF0ZXIuXG5cbiAgICAgIHZhciBuZXh0QmFzZUxhbmVzO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lcztcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IG1lcmdlTGFuZXMocHJldkJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgICAgfSAvLyBTY2hlZHVsZSB0aGlzIGZpYmVyIHRvIHJlLXJlbmRlciBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuIFRoZW4gYmFpbG91dC5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgICAgIHZhciBfbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IG5leHRCYXNlTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogc3Bhd25lZENhY2hlUG9vbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIC8vIHRvIGF2b2lkIGEgcHVzaC9wb3AgbWlzYWxpZ25tZW50LlxuXG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgbmV4dEJhc2VMYW5lcyk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyLiBUaGUgc3Vycm91bmRpbmcgdmlzaWJsZSBjb250ZW50IGhhcyBhbHJlYWR5XG4gICAgICAvLyBjb21taXR0ZWQuIE5vdyB3ZSByZXN1bWUgcmVuZGVyaW5nIHRoZSBoaWRkZW4gdHJlZS5cbiAgICAgIC8vIFJlbmRlcmluZyBhdCBvZmZzY3JlZW4sIHNvIHdlIGNhbiBjbGVhciB0aGUgYmFzZSBsYW5lcy5cbiAgICAgIHZhciBfbmV4dFN0YXRlMiA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGUyOyAvLyBQdXNoIHRoZSBsYW5lcyB0aGF0IHdlcmUgc2tpcHBlZCB3aGVuIHdlIGJhaWxlZCBvdXQuXG5cbiAgICAgIHZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBwcmV2U3RhdGUgIT09IG51bGwgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIDogcmVuZGVyTGFuZXM7XG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVuZGVyaW5nIGEgdmlzaWJsZSB0cmVlLlxuICAgIHZhciBfc3VidHJlZVJlbmRlckxhbmVzO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgZ29pbmcgZnJvbSBoaWRkZW4gLT4gdmlzaWJsZS5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZTdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIHdlcmVuJ3QgcHJldmlvdXNseSBoaWRkZW4sIGFuZCB3ZSBzdGlsbCBhcmVuJ3QsIHNvIHRoZXJlJ3Mgbm90aGluZ1xuICAgICAgLy8gc3BlY2lhbCB0byBkby4gTmVlZCB0byBwdXNoIHRvIHRoZSBzdGFjayByZWdhcmRsZXNzLCB0aG91Z2gsIHRvIGF2b2lkXG4gICAgICAvLyBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB9XG5cbiAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIF9zdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59IC8vIE5vdGU6IFRoZXNlIGhhcHBlbiB0byBoYXZlIGlkZW50aWNhbCBiZWdpbiBwaGFzZXMsIGZvciBub3cuIFdlIHNob3VsZG4ndCBob2xkXG5cbmZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gICAge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICB2YXIgaGFzSWQ7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgLy8gVGhpcyBpcyB1c2VkIGJ5IERldlRvb2xzIHRvIGZvcmNlIGEgYm91bmRhcnkgdG8gZXJyb3IuXG4gICAgc3dpdGNoIChzaG91bGRFcnJvcih3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVE9ETyBUaGlzIHdheSBvZiByZXNldHRpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHN0YXRlIGlzIGEgaGFjay5cbiAgICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cblxuICAgICAgICAgIHZhciB0ZW1wSW5zdGFuY2UgPSBuZXcgY3Rvcih3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLCBfaW5zdGFuY2UuY29udGV4dCk7XG4gICAgICAgICAgdmFyIHN0YXRlID0gdGVtcEluc3RhbmNlLnN0YXRlO1xuXG4gICAgICAgICAgX2luc3RhbmNlLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKF9pbnN0YW5jZSwgc3RhdGUsIG51bGwpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuXG4gICAgICAgICAgdmFyIGVycm9yJDEgPSBuZXcgRXJyb3IoJ1NpbXVsYXRlZCBlcnJvciBjb21pbmcgZnJvbSBEZXZUb29scycpO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHdvcmtJblByb2dyZXNzKSwgbGFuZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuXG4gIHZhciBoYXNDb250ZXh0O1xuXG4gIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgaGFzQ29udGV4dCA9IHRydWU7XG4gICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gZWxzZSB7XG4gICAgaGFzQ29udGV4dCA9IGZhbHNlO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkVXBkYXRlO1xuXG4gIGlmIChpbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOyAvLyBJbiB0aGUgaW5pdGlhbCBwYXNzIHdlIG1pZ2h0IG5lZWQgdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZS5cblxuICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW4gYSByZXN1bWUsIHdlJ2xsIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSB3ZSBjYW4gcmV1c2UuXG4gICAgc2hvdWxkVXBkYXRlID0gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFVwZGF0ZSA9IHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgbmV4dFVuaXRPZldvcmsgPSBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgdmFyIGluc3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlICYmIGluc3QucHJvcHMgIT09IG5leHRQcm9wcykge1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgIGVycm9yKCdJdCBsb29rcyBsaWtlICVzIGlzIHJlYXNzaWduaW5nIGl0cyBvd24gYHRoaXMucHJvcHNgIHdoaWxlIHJlbmRlcmluZy4gJyArICdUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGNhbiBsZWFkIHRvIGNvbmZ1c2luZyBidWdzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoIXNob3VsZFVwZGF0ZSAmJiAhZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nXG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFJlcmVuZGVyXG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBuZXh0Q2hpbGRyZW47XG5cbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLFxuICAgIC8vIHVubW91bnQgYWxsIHRoZSBjaGlsZHJlbi4gY29tcG9uZW50RGlkQ2F0Y2ggd2lsbCBzY2hlZHVsZSBhbiB1cGRhdGUgdG9cbiAgICAvLyByZS1yZW5kZXIgYSBmYWxsYmFjay4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgbWlncmF0ZSBldmVyeW9uZSB0b1xuICAgIC8vIHRoZSBuZXcgQVBJLlxuICAgIC8vIFRPRE86IFdhcm4gaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuXG4gICAge1xuICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgICAgbmV4dENoaWxkcmVuID0gaW5zdGFuY2UucmVuZGVyKCk7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gSWYgd2UncmUgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZWNvbmNpbGUgd2l0aG91dCByZXVzaW5nIGFueSBvZlxuICAgIC8vIHRoZSBleGlzdGluZyBjaGlsZHJlbi4gQ29uY2VwdHVhbGx5LCB0aGUgbm9ybWFsIGNoaWxkcmVuIGFuZCB0aGUgY2hpbGRyZW5cbiAgICAvLyB0aGF0IGFyZSBzaG93biBvbiBlcnJvciBhcmUgdHdvIGRpZmZlcmVudCBzZXRzLCBzbyB3ZSBzaG91bGRuJ3QgcmV1c2VcbiAgICAvLyBub3JtYWwgY2hpbGRyZW4gZXZlbiBpZiB0aGVpciBpZGVudGl0aWVzIG1hdGNoLlxuICAgIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSAvLyBNZW1vaXplIHN0YXRlIHVzaW5nIHRoZSB2YWx1ZXMgd2UganVzdCB1c2VkIHRvIHJlbmRlci5cbiAgLy8gVE9ETzogUmVzdHJ1Y3R1cmUgc28gd2UgbmV2ZXIgcmVhZCB2YWx1ZXMgZnJvbSB0aGUgaW5zdGFuY2UuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7IC8vIFRoZSBjb250ZXh0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzbyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIGl0LlxuXG4gIGlmIChoYXNDb250ZXh0KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAocm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QucGVuZGluZ0NvbnRleHQsIHJvb3QucGVuZGluZ0NvbnRleHQgIT09IHJvb3QuY29udGV4dCk7XG4gIH0gZWxzZSBpZiAocm9vdC5jb250ZXh0KSB7XG4gICAgLy8gU2hvdWxkIGFsd2F5cyBiZSBzZXRcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LmNvbnRleHQsIGZhbHNlKTtcbiAgfVxuXG4gIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCByb290LmNvbnRhaW5lckluZm8pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlLmVsZW1lbnQ7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0U3RhdGUuZWxlbWVudDtcblxuICBpZiAoIHByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAvLyBUaGlzIGlzIGEgaHlkcmF0aW9uIHJvb3Qgd2hvc2Ugc2hlbGwgaGFzIG5vdCB5ZXQgaHlkcmF0ZWQuIFdlIHNob3VsZFxuICAgIC8vIGF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBGbGlwIGlzRGVoeWRyYXRlZCB0byBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHdoZW4gdGhpcyByZW5kZXJcbiAgICAvLyBmaW5pc2hlcywgdGhlIHJvb3Qgd2lsbCBubyBsb25nZXIgYmUgZGVoeWRyYXRlZC5cbiAgICB2YXIgb3ZlcnJpZGVTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IG5leHRDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogZmFsc2UsXG4gICAgICBjYWNoZTogbmV4dFN0YXRlLmNhY2hlLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbmV4dFN0YXRlLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsXG4gICAgICB0cmFuc2l0aW9uczogbmV4dFN0YXRlLnRyYW5zaXRpb25zXG4gICAgfTtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gYGJhc2VTdGF0ZWAgY2FuIGFsd2F5cyBiZSB0aGUgbGFzdCBzdGF0ZSBiZWNhdXNlIHRoZSByb290IGRvZXNuJ3RcbiAgICAvLyBoYXZlIHJlZHVjZXIgZnVuY3Rpb25zIHNvIGl0IGRvZXNuJ3QgbmVlZCByZWJhc2luZy5cblxuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGEgcHJldmlvdXMgYXR0ZW1wdCB0byBoeWRyYXRlIHRoZSBzaGVsbCwgc28gd2VcbiAgICAgIC8vIGZvcmNlZCBhIGNsaWVudCByZW5kZXIuXG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZy4gQmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVuZWQgb3V0c2lkZSAnICsgJ29mIGEgU3VzcGVuc2UgYm91bmRhcnksIHRoZSBlbnRpcmUgcm9vdCB3aWxsIHN3aXRjaCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyksIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT09IHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIF9yZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGlzIHJvb3QgcmVjZWl2ZWQgYW4gZWFybHkgdXBkYXRlLCBiZWZvcmUgYW55dGhpbmcgd2FzIGFibGUgJyArICdoeWRyYXRlLiBTd2l0Y2hlZCB0aGUgZW50aXJlIHJvb3QgdG8gY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICByZXR1cm4gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIF9yZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG91dGVybW9zdCBzaGVsbCBoYXMgbm90IGh5ZHJhdGVkIHlldC4gU3RhcnQgaHlkcmF0aW5nLlxuICAgICAgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHZhciBjaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICAgIHZhciBub2RlID0gY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSb290IGlzIG5vdCBkZWh5ZHJhdGVkLiBFaXRoZXIgdGhpcyBpcyBhIGNsaWVudC1vbmx5IHJvb3QsIG9yIGl0XG4gICAgLy8gYWxyZWFkeSBoeWRyYXRlZC5cbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbnVsbDtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGlzRGlyZWN0VGV4dENoaWxkID0gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgbmV4dFByb3BzKTtcblxuICBpZiAoaXNEaXJlY3RUZXh0Q2hpbGQpIHtcbiAgICAvLyBXZSBzcGVjaWFsIGNhc2UgYSBkaXJlY3QgdGV4dCBjaGlsZCBvZiBhIGhvc3Qgbm9kZS4gVGhpcyBpcyBhIGNvbW1vblxuICAgIC8vIGNhc2UuIFdlIHdvbid0IGhhbmRsZSBpdCBhcyBhIHJlaWZpZWQgY2hpbGQuIFdlIHdpbGwgaW5zdGVhZCBoYW5kbGVcbiAgICAvLyB0aGlzIGluIHRoZSBob3N0IGVudmlyb25tZW50IHRoYXQgYWxzbyBoYXMgYWNjZXNzIHRvIHRoaXMgcHJvcC4gVGhhdFxuICAgIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGFub3RoZXIgSG9zdFRleHQgZmliZXIgYW5kIHRyYXZlcnNpbmcgaXQuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChwcmV2UHJvcHMgIT09IG51bGwgJiYgc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJldlByb3BzKSkge1xuICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZyBmcm9tIGEgZGlyZWN0IHRleHQgY2hpbGQgdG8gYSBub3JtYWwgY2hpbGQsIG9yIHRvXG4gICAgLy8gZW1wdHksIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIHRleHQgY29udGVudCB0byBiZSByZXNldC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBpcyB0ZXJtaW5hbC4gV2UnbGwgZG8gdGhlIGNvbXBsZXRpb24gc3RlcFxuICAvLyBpbW1lZGlhdGVseSBhZnRlci5cblxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtb3VudExhenlDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVNZW1vQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LnR5cGUsIHJlc29sdmVkUHJvcHMpLCAvLyBUaGUgaW5uZXIgdHlwZSBjYW4gaGF2ZSBkZWZhdWx0cyB0b29cbiAgICAgICAgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gIH1cblxuICB2YXIgaGludCA9ICcnO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50ICE9PSBudWxsICYmIHR5cGVvZiBDb21wb25lbnQgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICBoaW50ID0gJyBEaWQgeW91IHdyYXAgYSBjb21wb25lbnQgaW4gUmVhY3QubGF6eSgpIG1vcmUgdGhhbiBvbmNlPyc7XG4gICAgfVxuICB9IC8vIFRoaXMgbWVzc2FnZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgbWVudGlvbiBGb3J3YXJkUmVmIG9yIE1lbW9Db21wb25lbnRcbiAgLy8gYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzZXBhcmF0ZSB0eXBlIG9mIHdvcmsgaXMgYW5cbiAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBcIiArIChcIkxhenkgZWxlbWVudCB0eXBlIG11c3QgcmVzb2x2ZSB0byBhIGNsYXNzIG9yIGZ1bmN0aW9uLlwiICsgaGludCkpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cbiAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7IC8vIFRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgYSBmb3JrIG9mIGB1cGRhdGVDbGFzc0NvbXBvbmVudGBcbiAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgaGFzSWQ7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBudWxsKTtcbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIHtcbiAgICAvLyBTdXBwb3J0IGZvciBtb2R1bGUgY29tcG9uZW50cyBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGJlaGluZCBhIGZsYWcuXG4gICAgLy8gV2hldGhlciBvciBub3QgaXQgd291bGQgY3Jhc2ggbGF0ZXIsIHdlIHdhbnQgdG8gc2hvdyBhIGdvb2QgbWVzc2FnZSBpbiBERVYgZmlyc3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICggLy8gUnVuIHRoZXNlIGNoZWNrcyBpbiBwcm9kdWN0aW9uIG9ubHkgaWYgdGhlIGZsYWcgaXMgb2ZmLlxuICAvLyBFdmVudHVhbGx5IHdlJ2xsIGRlbGV0ZSB0aGlzIGJyYW5jaCBhbHRvZ2V0aGVyLlxuICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4obnVsbCwgd29ya0luUHJvZ3Jlc3MsIHZhbHVlLCByZW5kZXJMYW5lcyk7XG5cbiAgICB7XG4gICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIHtcbiAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICBpZiAoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICB9XG5cbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8ICcnO1xuICAgICAgdmFyIGRlYnVnU291cmNlID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlO1xuXG4gICAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgICAgd2FybmluZ0tleSA9IGRlYnVnU291cmNlLmZpbGVOYW1lICsgJzonICsgZGVidWdTb3VyY2UubGluZU51bWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBDb21wb25lbnQuZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBTdXBwb3J0IGZvciBkZWZhdWx0UHJvcHMgd2lsbCBiZSByZW1vdmVkIGZyb20gZnVuY3Rpb24gY29tcG9uZW50cyAnICsgJ2luIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIFVzZSBKYXZhU2NyaXB0IGRlZmF1bHQgcGFyYW1ldGVycyBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lMyA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lM10pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBGdW5jdGlvbiBjb21wb25lbnRzIGRvIG5vdCBzdXBwb3J0IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4nLCBfY29tcG9uZW50TmFtZTMpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC5jb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lNCA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuJywgX2NvbXBvbmVudE5hbWU0KTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTVVNQRU5ERURfTUFSS0VSID0ge1xuICBkZWh5ZHJhdGVkOiBudWxsLFxuICB0cmVlQ29udGV4dDogbnVsbCxcbiAgcmV0cnlMYW5lOiBOb0xhbmVcbn07XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykge1xuICByZXR1cm4ge1xuICAgIGJhc2VMYW5lczogcmVuZGVyTGFuZXMsXG4gICAgY2FjaGVQb29sOiBnZXRTdXNwZW5kZWRDYWNoZSgpLFxuICAgIHRyYW5zaXRpb25zOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocHJldk9mZnNjcmVlblN0YXRlLCByZW5kZXJMYW5lcykge1xuICB2YXIgY2FjaGVQb29sID0gbnVsbDtcblxuICByZXR1cm4ge1xuICAgIGJhc2VMYW5lczogbWVyZ2VMYW5lcyhwcmV2T2Zmc2NyZWVuU3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyksXG4gICAgY2FjaGVQb29sOiBjYWNoZVBvb2wsXG4gICAgdHJhbnNpdGlvbnM6IHByZXZPZmZzY3JlZW5TdGF0ZS50cmFuc2l0aW9uc1xuICB9O1xufSAvLyBUT0RPOiBQcm9iYWJseSBzaG91bGQgaW5saW5lIHRoaXMgYmFja1xuXG5cbmZ1bmN0aW9uIHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2ssIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB3ZSBuZWVkIHRvXG4gIC8vIHJlbWFpbiBvbiB0aGF0IGZhbGxiYWNrIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY29udGVudCBoYXMgcmVzb2x2ZWQuXG4gIC8vIEZvciBleGFtcGxlLCBTdXNwZW5zZUxpc3QgY29vcmRpbmF0ZXMgd2hlbiBuZXN0ZWQgY29udGVudCBhcHBlYXJzLlxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIEN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIERvbid0IGhpZGUgaXQsIGV2ZW4gaWYgRm9yY2VTdXNwZW5zZUZhbGxiYWNrXG4gICAgICAvLyBpcyB0cnVlLiBNb3JlIHByZWNpc2UgbmFtZSBtaWdodCBiZSBcIkZvcmNlUmVtYWluU3VzcGVuc2VGYWxsYmFja1wiLlxuICAgICAgLy8gTm90ZTogVGhpcyBpcyBhIGZhY3RvcmluZyBzbWVsbC4gQ2FuJ3QgcmVtYWluIG9uIGEgZmFsbGJhY2sgaWYgdGhlcmUnc1xuICAgICAgLy8gbm8gZmFsbGJhY2sgdG8gcmVtYWluIG9uLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSAvLyBOb3QgY3VycmVudGx5IHNob3dpbmcgY29udGVudC4gQ29uc3VsdCB0aGUgU3VzcGVuc2UgY29udGV4dC5cblxuXG4gIHJldHVybiBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBnZXRSZW1haW5pbmdXb3JrSW5QcmltYXJ5VHJlZShjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBTaG91bGQgbm90IHJlbW92ZSByZW5kZXIgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBkdXJpbmcgdGhpcyByZW5kZXJcbiAgcmV0dXJuIHJlbW92ZUxhbmVzKGN1cnJlbnQuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gVGhpcyBpcyB1c2VkIGJ5IERldlRvb2xzIHRvIGZvcmNlIGEgYm91bmRhcnkgdG8gc3VzcGVuZC5cblxuICB7XG4gICAgaWYgKHNob3VsZFN1c3BlbmQod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIHZhciBzaG93RmFsbGJhY2sgPSBmYWxzZTtcbiAgdmFyIGRpZFN1c3BlbmQgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoZGlkU3VzcGVuZCB8fCBzaG91bGRSZW1haW5PbkZhbGxiYWNrKHN1c3BlbnNlQ29udGV4dCwgY3VycmVudCkpIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhpcyBib3VuZGFyeSdzIHN1YnRyZWUgYWxyZWFkeSBzdXNwZW5kZWQuIFN3aXRjaCB0b1xuICAgIC8vIHJlbmRlcmluZyB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgc2hvd0ZhbGxiYWNrID0gdHJ1ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+RGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBBdHRlbXB0aW5nIHRoZSBtYWluIGNvbnRlbnRcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBuZXcgbW91bnQgb3IgdGhpcyBib3VuZGFyeSBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIE1hcmsgdGhpcyBzdWJ0cmVlIGNvbnRleHQgYXMgaGF2aW5nIGF0IGxlYXN0IG9uZSBpbnZpc2libGUgcGFyZW50IHRoYXQgY291bGRcbiAgICAgIC8vIGhhbmRsZSB0aGUgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBBdm9pZGVkIGJvdW5kYXJpZXMgYXJlIG5vdCBjb25zaWRlcmVkIHNpbmNlIHRoZXkgY2Fubm90IGhhbmRsZSBwcmVmZXJyZWQgZmFsbGJhY2sgc3RhdGVzLlxuICAgICAge1xuICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBPSywgdGhlIG5leHQgcGFydCBpcyBjb25mdXNpbmcuIFdlJ3JlIGFib3V0IHRvIHJlY29uY2lsZSB0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkncyBjaGlsZHJlbi4gVGhpcyBpbnZvbHZlcyBzb21lIGN1c3RvbSByZWNvbmNpbGlhdGlvbiBsb2dpYy4gVHdvXG4gIC8vIG1haW4gcmVhc29ucyB0aGlzIGlzIHNvIGNvbXBsaWNhdGVkLlxuICAvL1xuICAvLyBGaXJzdCwgTGVnYWN5IE1vZGUgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGVcbiAgLy8gcHJpbWFyeSB0cmVlIHdpbGwgY29tbWl0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSwgc28gd2hlbiB3ZSBkbyB0aGVcbiAgLy8gc2Vjb25kIHBhc3MgdG8gcmVuZGVyIHRoZSBmYWxsYmFjaywgd2UgZG8gc29tZSBleGNlZWRpbmdseSwgdWgsIGNsZXZlclxuICAvLyBoYWNrcyB0byBtYWtlIHRoYXQgbm90IHRvdGFsbHkgYnJlYWsuIExpa2UgdHJhbnNmZXJyaW5nIGVmZmVjdHMgYW5kXG4gIC8vIGRlbGV0aW9ucyBmcm9tIGhpZGRlbiB0cmVlLiBJbiBDb25jdXJyZW50IE1vZGUsIGl0J3MgbXVjaCBzaW1wbGVyLFxuICAvLyBiZWNhdXNlIHdlIGJhaWxvdXQgb24gdGhlIHByaW1hcnkgdHJlZSBjb21wbGV0ZWx5IGFuZCBsZWF2ZSBpdCBpbiBpdHMgb2xkXG4gIC8vIHN0YXRlLCBubyBlZmZlY3RzLiBTYW1lIGFzIHdoYXQgd2UgZG8gZm9yIE9mZnNjcmVlbiAoZXhjZXB0IHRoYXRcbiAgLy8gT2Zmc2NyZWVuIGRvZXNuJ3QgaGF2ZSB0aGUgZmlyc3QgcmVuZGVyIHBhc3MpLlxuICAvL1xuICAvLyBTZWNvbmQgaXMgaHlkcmF0aW9uLiBEdXJpbmcgaHlkcmF0aW9uLCB0aGUgU3VzcGVuc2UgZmliZXIgaGFzIGEgc2xpZ2h0bHlcbiAgLy8gZGlmZmVyZW50IGxheW91dCwgd2hlcmUgdGhlIGNoaWxkIHBvaW50cyB0byBhIGRlaHlkcmF0ZWQgZnJhZ21lbnQsIHdoaWNoXG4gIC8vIGNvbnRhaW5zIHRoZSBET00gcmVuZGVyZWQgYnkgdGhlIHNlcnZlci5cbiAgLy9cbiAgLy8gVGhpcmQsIGV2ZW4gaWYgeW91IHNldCBhbGwgdGhhdCBhc2lkZSwgU3VzcGVuc2UgaXMgbGlrZSBlcnJvciBib3VuZGFyaWVzIGluXG4gIC8vIHRoYXQgd2UgZmlyc3Qgd2UgdHJ5IHRvIHJlbmRlciBvbmUgdHJlZSwgYW5kIGlmIHRoYXQgZmFpbHMsIHdlIHJlbmRlciBhZ2FpblxuICAvLyBhbmQgc3dpdGNoIHRvIGEgZGlmZmVyZW50IHRyZWUuIExpa2UgYSB0cnkvY2F0Y2ggYmxvY2suIFNvIHdlIGhhdmUgdG8gdHJhY2tcbiAgLy8gd2hpY2ggYnJhbmNoIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcuIElkZWFsbHkgd2Ugd291bGQgbW9kZWwgdGhpcyB1c2luZ1xuICAvLyBhIHN0YWNrLlxuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIC8vIFNwZWNpYWwgcGF0aCBmb3IgaHlkcmF0aW9uXG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGh5ZHJhdGluZywgdHJ5IHRvIGh5ZHJhdGUgdGhpcyBib3VuZGFyeS5cbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7IC8vIFRoaXMgY291bGQndmUgYmVlbiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50LlxuXG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICBpZiAoZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIGRlaHlkcmF0ZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBuZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcblxuICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgIHZhciBmYWxsYmFja0ZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50Lm1lbW9pemVkU3RhdGUgPSBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG5cbiAgICAgIHJldHVybiBmYWxsYmFja0ZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYW4gdXBkYXRlLlxuICAgIC8vIFNwZWNpYWwgcGF0aCBmb3IgaHlkcmF0aW9uXG4gICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBfZGVoeWRyYXRlZCA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICBpZiAoX2RlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZURlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZGlkU3VzcGVuZCwgbmV4dFByb3BzLCBfZGVoeWRyYXRlZCwgcHJldlN0YXRlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcbiAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuLCBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICB2YXIgcHJldk9mZnNjcmVlblN0YXRlID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlO1xuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5tZW1vaXplZFN0YXRlID0gcHJldk9mZnNjcmVlblN0YXRlID09PSBudWxsID8gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSA6IHVwZGF0ZVN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocHJldk9mZnNjcmVlblN0YXRlLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIuY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcblxuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDMgPSB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4yLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDM7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBtb2RlKTtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgICAvLyBjb21wbGV0ZWQsIGV2ZW4gdGhvdWdoIGl0J3MgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLlxuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBtb2RlKTtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIob2Zmc2NyZWVuUHJvcHMsIG1vZGUsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoZSBwcm9wcyBhcmd1bWVudCB0byBgY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlXG4gIC8vIHRoaXMgd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ob2Zmc2NyZWVuUHJvcHMsIG1vZGUsIE5vTGFuZXMsIG51bGwpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnQsIG9mZnNjcmVlblByb3BzKSB7XG4gIC8vIFRoZSBwcm9wcyBhcmd1bWVudCB0byBgY3JlYXRlV29ya0luUHJvZ3Jlc3NgIGlzIGBhbnlgIHR5cGVkLCBzbyB3ZSB1c2UgdGhpc1xuICAvLyB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNvbnN0cmFpbiBpdC5cbiAgcmV0dXJuIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIG9mZnNjcmVlblByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LCB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfSk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5sYW5lcyA9IHJlbmRlckxhbmVzO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBudWxsO1xuXG4gIGlmIChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgLy8gRGVsZXRlIHRoZSBmYWxsYmFjayBjaGlsZCBmcmFnbWVudFxuICAgIHZhciBkZWxldGlvbnMgPSB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBbY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudF07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50KTtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKCAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gIChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gTWFrZSBzdXJlIHdlJ3JlIG9uIHRoZSBzZWNvbmQgcGFzcywgaS5lLiB0aGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCB3YXNcbiAgLy8gYWxyZWFkeSBjbG9uZWQuIEluIGxlZ2FjeSBtb2RlLCB0aGUgb25seSBjYXNlIHdoZXJlIHRoaXMgaXNuJ3QgdHJ1ZSBpc1xuICAvLyB3aGVuIERldlRvb2xzIGZvcmNlcyB1cyB0byBkaXNwbGF5IGEgZmFsbGJhY2s7IHdlIHNraXAgdGhlIGZpcnN0IHJlbmRlclxuICAvLyBwYXNzIGVudGlyZWx5IGFuZCBnbyBzdHJhaWdodCB0byByZW5kZXJpbmcgdGhlIGZhbGxiYWNrLiAoSW4gQ29uY3VycmVudFxuICAvLyBNb2RlLCBTdXNwZW5zZUxpc3QgY2FuIGFsc28gdHJpZ2dlciB0aGlzIHNjZW5hcmlvLCBidXQgdGhpcyBpcyBhIGxlZ2FjeS1cbiAgLy8gb25seSBjb2RlcGF0aC4pXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQpIHtcbiAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IC8vIFRoZSBmYWxsYmFjayBmaWJlciB3YXMgYWRkZWQgYXMgYSBkZWxldGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuXG4gICAgLy8gSG93ZXZlciwgc2luY2Ugd2UncmUgZ29pbmcgdG8gcmVtYWluIG9uIHRoZSBmYWxsYmFjaywgd2Ugbm8gbG9uZ2VyIHdhbnRcbiAgICAvLyB0byBkZWxldGUgaXQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwgcHJpbWFyeUNoaWxkUHJvcHMpOyAvLyBTaW5jZSB3ZSdyZSByZXVzaW5nIGEgY3VycmVudCB0cmVlLCB3ZSBuZWVkIHRvIHJldXNlIHRoZSBmbGFncywgdG9vLlxuICAgIC8vIChXZSBkb24ndCBkbyB0aGlzIGluIGxlZ2FjeSBtb2RlLCBiZWNhdXNlIGluIGxlZ2FjeSBtb2RlIHdlIGRvbid0IHJlLXVzZVxuICAgIC8vIHRoZSBjdXJyZW50IHRyZWU7IHNlZSBwcmV2aW91cyBicmFuY2guKVxuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gIH1cblxuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmIChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCwgZmFsbGJhY2tDaGlsZHJlbik7XG4gIH0gZWxzZSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBGYWxsaW5nIGJhY2sgdG8gY2xpZW50IHJlbmRlcmluZy4gQmVjYXVzZSB0aGlzIGhhcyBwZXJmb3JtYW5jZVxuICAvLyBpbXBsaWNhdGlvbnMsIGl0J3MgY29uc2lkZXJlZCBhIHJlY292ZXJhYmxlIGVycm9yLCBldmVuIHRob3VnaCB0aGUgdXNlclxuICAvLyBsaWtlbHkgd29uJ3Qgb2JzZXJ2ZSBhbnl0aGluZyB3cm9uZyB3aXRoIHRoZSBVSS5cbiAgLy9cbiAgLy8gVGhlIGVycm9yIGlzIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCB0byBlbmZvcmNlIHRoYXQgZXZlcnkgY2FsbGVyIHByb3ZpZGVcbiAgLy8gYSBjdXN0b20gbWVzc2FnZSwgb3IgZXhwbGljaXRseSBvcHQgb3V0IChjdXJyZW50bHkgdGhlIG9ubHkgcGF0aCB0aGF0IG9wdHNcbiAgLy8gb3V0IGlzIGxlZ2FjeSBtb2RlOyBldmVyeSBjb25jdXJyZW50IHBhdGggcHJvdmlkZXMgYW4gZXJyb3IpLlxuICBpZiAocmVjb3ZlcmFibGVFcnJvciAhPT0gbnVsbCkge1xuICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IocmVjb3ZlcmFibGVFcnJvcik7XG4gIH0gLy8gVGhpcyB3aWxsIGFkZCB0aGUgb2xkIGZpYmVyIHRvIHRoZSBkZWxldGlvbiBsaXN0XG5cblxuICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBXZSdyZSBub3cgbm90IHN1c3BlbmRlZCBub3IgZGVoeWRyYXRlZC5cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgLy8gbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0FmdGVyUmV0cnlXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBmaWJlck1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBmaWJlck1vZGUpO1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgZmliZXJNb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSkgYWxyZWFkeSBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAvLyBXZSB3aWxsIGhhdmUgZHJvcHBlZCB0aGUgZWZmZWN0IGxpc3Qgd2hpY2ggY29udGFpbnMgdGhlXG4gICAgLy8gZGVsZXRpb24uIFdlIG5lZWQgdG8gcmVjb25jaWxlIHRvIGRlbGV0ZSB0aGUgY3VycmVudCBjaGlsZC5cbiAgICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlSW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7XG4gIC8vIER1cmluZyB0aGUgZmlyc3QgcGFzcywgd2UnbGwgYmFpbCBvdXQgYW5kIG5vdCBkcmlsbCBpbnRvIHRoZSBjaGlsZHJlbi5cbiAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgdGhlIGNvbnRlbnQgaW4gcGxhY2UgYW5kIHRyeSB0byBoeWRyYXRlIGl0IGxhdGVyLlxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHtcbiAgICAgIGVycm9yKCdDYW5ub3QgaHlkcmF0ZSBTdXNwZW5zZSBpbiBsZWdhY3kgbW9kZS4gU3dpdGNoIGZyb20gJyArICdSZWFjdERPTS5oeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lcikgdG8gJyArICdSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pJyArICcucmVuZGVyKGVsZW1lbnQpIG9yIHJlbW92ZSB0aGUgU3VzcGVuc2UgY29tcG9uZW50cyBmcm9tICcgKyAndGhlIHNlcnZlciByZW5kZXJlZCBjb21wb25lbnRzLicpO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoU3luY0xhbmUpO1xuICB9IGVsc2UgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgLy8gVGhpcyBpcyBhIGNsaWVudC1vbmx5IGJvdW5kYXJ5LiBTaW5jZSB3ZSB3b24ndCBnZXQgYW55IGNvbnRlbnQgZnJvbSB0aGUgc2VydmVyXG4gICAgLy8gZm9yIHRoaXMsIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhhdCBhdCBhIGhpZ2hlciBwcmlvcml0eSBiYXNlZCBvbiB3aGVuIGl0IHdvdWxkXG4gICAgLy8gaGF2ZSB0aW1lZCBvdXQuIEluIHRoZW9yeSB3ZSBjb3VsZCByZW5kZXIgaXQgaW4gdGhpcyBwYXNzIGJ1dCBpdCB3b3VsZCBoYXZlIHRoZVxuICAgIC8vIHdyb25nIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBpdCBhbmQgd2lsbCBwcmV2ZW50IGh5ZHJhdGlvbiBvZiBwYXJlbnQgcGF0aC5cbiAgICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB3b3JrIGxlZnQgb24gaXQgdG8gcmVuZGVyIGl0IGluIGEgc2VwYXJhdGUgY29tbWl0LlxuICAgIC8vIFRPRE8gVGhpcyB0aW1lIHNob3VsZCBiZSB0aGUgdGltZSBhdCB3aGljaCB0aGUgc2VydmVyIHJlbmRlcmVkIHJlc3BvbnNlIHRoYXQgaXNcbiAgICAvLyBhIHBhcmVudCB0byB0aGlzIGJvdW5kYXJ5IHdhcyBkaXNwbGF5ZWQuIEhvd2V2ZXIsIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBoYXZlXG4gICAgLy8gYSBwcm90b2NvbCB0byB0cmFuc2ZlciB0aGF0IHRpbWUsIHdlJ2xsIGp1c3QgZXN0aW1hdGUgaXQgYnkgdXNpbmcgdGhlIGN1cnJlbnRcbiAgICAvLyB0aW1lLiBUaGlzIHdpbGwgbWVhbiB0aGF0IFN1c3BlbnNlIHRpbWVvdXRzIGFyZSBzbGlnaHRseSBzaGlmdGVkIHRvIGxhdGVyIHRoYW5cbiAgICAvLyB0aGV5IHNob3VsZCBiZS5cbiAgICAvLyBTY2hlZHVsZSBhIG5vcm1hbCBwcmkgdXBkYXRlIHRvIHJlbmRlciB0aGlzIGNvbnRlbnQuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhEZWZhdWx0SHlkcmF0aW9uTGFuZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UnbGwgY29udGludWUgaHlkcmF0aW5nIHRoZSByZXN0IGF0IG9mZnNjcmVlbiBwcmlvcml0eSBzaW5jZSB3ZSdsbCBhbHJlYWR5XG4gICAgLy8gYmUgc2hvd2luZyB0aGUgcmlnaHQgY29udGVudCBjb21pbmcgZnJvbSB0aGUgc2VydmVyLCBpdCBpcyBubyBydXNoLlxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIHN1c3BlbnNlSW5zdGFuY2UsIHN1c3BlbnNlU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIGlmICghZGlkU3VzcGVuZCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHJlbmRlciBwYXNzLiBBdHRlbXB0IHRvIGh5ZHJhdGUuXG4gICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGJlIGh5ZHJhdGluZyBhdCB0aGlzIHBvaW50IGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IHBhc3MsXG4gICAgLy8gYnV0IGFmdGVyIHdlJ3ZlIGFscmVhZHkgY29tbWl0dGVkIG9uY2UuXG4gICAgd2FybklmSHlkcmF0aW5nKCk7XG5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgLy8gVE9ETzogV2hlbiB3ZSBkZWxldGUgbGVnYWN5IG1vZGUsIHdlIHNob3VsZCBtYWtlIHRoaXMgZXJyb3IgYXJndW1lbnRcbiAgICAgIC8vIHJlcXVpcmVkIOKAlCBldmVyeSBjb25jdXJyZW50IG1vZGUgcGF0aCB0aGF0IGNhdXNlcyBoeWRyYXRpb24gdG9cbiAgICAgIC8vIGRlLW9wdCB0byBjbGllbnQgcmVuZGVyaW5nIHNob3VsZCBoYXZlIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAgIC8vIFRoaXMgYm91bmRhcnkgaXMgaW4gYSBwZXJtYW5lbnQgZmFsbGJhY2sgc3RhdGUuIEluIHRoaXMgY2FzZSwgd2UnbGwgbmV2ZXJcbiAgICAgIC8vIGdldCBhbiB1cGRhdGUgYW5kIHdlJ2xsIG5ldmVyIGJlIGFibGUgdG8gaHlkcmF0ZSB0aGUgZmluYWwgY29udGVudC4gTGV0J3MganVzdCB0cnkgdGhlXG4gICAgICAvLyBjbGllbnQgc2lkZSByZW5kZXIgaW5zdGVhZC5cbiAgICAgIHZhciBkaWdlc3QsIG1lc3NhZ2UsIHN0YWNrO1xuXG4gICAgICB7XG4gICAgICAgIHZhciBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYgPSBnZXRTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2tFcnJvckRldGFpbHMoc3VzcGVuc2VJbnN0YW5jZSk7XG5cbiAgICAgICAgZGlnZXN0ID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLmRpZ2VzdDtcbiAgICAgICAgbWVzc2FnZSA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5tZXNzYWdlO1xuICAgICAgICBzdGFjayA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5zdGFjaztcbiAgICAgIH1cblxuICAgICAgdmFyIGVycm9yO1xuXG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdUaGUgc2VydmVyIGNvdWxkIG5vdCBmaW5pc2ggdGhpcyBTdXNwZW5zZSBib3VuZGFyeSwgbGlrZWx5ICcgKyAnZHVlIHRvIGFuIGVycm9yIGR1cmluZyBzZXJ2ZXIgcmVuZGVyaW5nLiBTd2l0Y2hlZCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjYXB0dXJlZFZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShlcnJvciwgZGlnZXN0LCBzdGFjayk7XG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBjYXB0dXJlZFZhbHVlKTtcbiAgICB9XG4gICAgLy8gYW55IGNvbnRleHQgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gdHJlYXQgaXMgYXMgaWYgdGhlIGlucHV0IG1pZ2h0IGhhdmUgY2hhbmdlZC5cblxuXG4gICAgdmFyIGhhc0NvbnRleHRDaGFuZ2VkID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgY3VycmVudC5jaGlsZExhbmVzKTtcblxuICAgIGlmIChkaWRSZWNlaXZlVXBkYXRlIHx8IGhhc0NvbnRleHRDaGFuZ2VkKSB7XG4gICAgICAvLyBUaGlzIGJvdW5kYXJ5IGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBmaXJzdCByZW5kZXIuIFRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgbm93IHVuYWJsZSB0b1xuICAgICAgLy8gaHlkcmF0ZSBpdC4gV2UgbWlnaHQgc3RpbGwgYmUgYWJsZSB0byBoeWRyYXRlIGl0IHVzaW5nIGEgaGlnaGVyIHByaW9yaXR5IGxhbmUuXG4gICAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSA9IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb24ocm9vdCwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIGlmIChhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBOb0xhbmUgJiYgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSAhPT0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUpIHtcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG11dGF0aW5nIHNpbmNlIHRoaXMgcmVuZGVyIHdpbGwgZ2V0IGludGVycnVwdGVkLiBUaGlzXG4gICAgICAgICAgLy8gaXMgb25lIG9mIHRoZSB2ZXJ5IHJhcmUgdGltZXMgd2hlcmUgd2UgbXV0YXRlIHRoZSBjdXJyZW50IHRyZWVcbiAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGF0dGVtcHRIeWRyYXRpb25BdExhbmU7IC8vIFRPRE86IElkZWFsbHkgdGhpcyB3b3VsZCBpbmhlcml0IHRoZSBldmVudCB0aW1lIG9mIHRoZSBjdXJyZW50IHJlbmRlclxuXG4gICAgICAgICAgdmFyIGV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuICAgICAgICAgIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lKTtcbiAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgY3VycmVudCwgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBJZiB3ZSBoYXZlIHNjaGVkdWxlZCBoaWdoZXIgcHJpIHdvcmsgYWJvdmUsIHRoaXMgd2lsbCBwcm9iYWJseSBqdXN0IGFib3J0IHRoZSByZW5kZXJcbiAgICAgIC8vIHNpbmNlIHdlIG5vdyBoYXZlIGhpZ2hlciBwcmlvcml0eSB3b3JrLCBidXQgaW4gY2FzZSBpdCBkb2Vzbid0LCB3ZSBuZWVkIHRvIHByZXBhcmUgdG9cbiAgICAgIC8vIHJlbmRlciBzb21ldGhpbmcsIGlmIHdlIHRpbWUgb3V0LiBFdmVuIGlmIHRoYXQgcmVxdWlyZXMgdXMgdG8gZGVsZXRlIGV2ZXJ5dGhpbmcgYW5kXG4gICAgICAvLyBza2lwIGh5ZHJhdGlvbi5cbiAgICAgIC8vIERlbGF5IGhhdmluZyB0byBkbyB0aGlzIGFzIGxvbmcgYXMgdGhlIHN1c3BlbnNlIHRpbWVvdXQgYWxsb3dzIHVzLlxuXG5cbiAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcblxuICAgICAgdmFyIF9jYXB0dXJlZFZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShuZXcgRXJyb3IoJ1RoaXMgU3VzcGVuc2UgYm91bmRhcnkgcmVjZWl2ZWQgYW4gdXBkYXRlIGJlZm9yZSBpdCBmaW5pc2hlZCAnICsgJ2h5ZHJhdGluZy4gVGhpcyBjYXVzZWQgdGhlIGJvdW5kYXJ5IHRvIHN3aXRjaCB0byBjbGllbnQgcmVuZGVyaW5nLiAnICsgJ1RoZSB1c3VhbCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gd3JhcCB0aGUgb3JpZ2luYWwgdXBkYXRlICcgKyAnaW4gc3RhcnRUcmFuc2l0aW9uLicpKTtcblxuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgX2NhcHR1cmVkVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgLy8gVGhpcyBjb21wb25lbnQgaXMgc3RpbGwgcGVuZGluZyBtb3JlIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBzbyB3ZSBjYW4ndCBoeWRyYXRlIGl0c1xuICAgICAgLy8gY29udGVudC4gV2UgdHJlYXQgaXQgYXMgaWYgdGhpcyBjb21wb25lbnQgc3VzcGVuZGVkIGl0c2VsZi4gSXQgbWlnaHQgc2VlbSBhcyBpZlxuICAgICAgLy8gd2UgY291bGQganVzdCB0cnkgdG8gcmVuZGVyIGl0IGNsaWVudC1zaWRlIGluc3RlYWQuIEhvd2V2ZXIsIHRoaXMgd2lsbCBwZXJmb3JtIGFcbiAgICAgIC8vIGxvdCBvZiB1bm5lY2Vzc2FyeSB3b3JrIGFuZCBpcyB1bmxpa2VseSB0byBjb21wbGV0ZSBzaW5jZSBpdCBvZnRlbiB3aWxsIHN1c3BlbmRcbiAgICAgIC8vIG9uIG1pc3NpbmcgZGF0YSBhbnl3YXkuIEFkZGl0aW9uYWxseSwgdGhlIHNlcnZlciBtaWdodCBiZSBhYmxlIHRvIHJlbmRlciBtb3JlXG4gICAgICAvLyB0aGFuIHdlIGNhbiBvbiB0aGUgY2xpZW50IHlldC4gSW4gdGhhdCBjYXNlIHdlJ2QgZW5kIHVwIHdpdGggbW9yZSBmYWxsYmFjayBzdGF0ZXNcbiAgICAgIC8vIG9uIHRoZSBjbGllbnQgdGhhbiBpZiB3ZSBqdXN0IGxlYXZlIGl0IGFsb25lLiBJZiB0aGUgc2VydmVyIHRpbWVzIG91dCBvciBlcnJvcnNcbiAgICAgIC8vIHRoZXNlIHNob3VsZCB1cGRhdGUgdGhpcyBib3VuZGFyeSB0byB0aGUgcGVybWFuZW50IEZhbGxiYWNrIHN0YXRlIGluc3RlYWQuXG4gICAgICAvLyBNYXJrIGl0IGFzIGhhdmluZyBjYXB0dXJlZCAoaS5lLiBzdXNwZW5kZWQpLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsgLy8gTGVhdmUgdGhlIGNoaWxkIGluIHBsYWNlLiBJLmUuIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gcmV0cnkgdGhpcyBib3VuZGFyeSBvbmNlIHRoZSBzZXJ2ZXIgaGFzIHNlbnQgdGhlIHJlc3VsdC5cblxuICAgICAgdmFyIHJldHJ5ID0gcmV0cnlEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeS5iaW5kKG51bGwsIGN1cnJlbnQpO1xuICAgICAgcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoc3VzcGVuc2VJbnN0YW5jZSwgcmV0cnkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGF0dGVtcHQuXG4gICAgICByZWVudGVySHlkcmF0aW9uU3RhdGVGcm9tRGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlSW5zdGFuY2UsIHN1c3BlbnNlU3RhdGUudHJlZUNvbnRleHQpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE1hcmsgdGhlIGNoaWxkcmVuIGFzIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGZhc3QgcGF0aCB0byBrbm93IHdoZXRoZXIgdGhpc1xuICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgLy8gbm9kZSBoYXMgZnVsbHkgbW91bnRlZCB5ZXQsIGFuZCBmb3Igc2NoZWR1bGluZyBldmVudCByZXBsYXlpbmcuXG4gICAgICAvLyBDb25jZXB0dWFsbHkgdGhpcyBpcyBzaW1pbGFyIHRvIFBsYWNlbWVudCBpbiB0aGF0IGEgbmV3IHN1YnRyZWUgaXNcbiAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgLy8gbXV0YXRpb25zIGJlY2F1c2UgaXQgYWxyZWFkeSBleGlzdHMuXG5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IEh5ZHJhdGluZztcbiAgICAgIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHJlbmRlciBwYXNzLiBXZSBhbHJlYWR5IGF0dGVtcHRlZCB0byBoeWRyYXRlZCwgYnV0XG4gICAgLy8gc29tZXRoaW5nIGVpdGhlciBzdXNwZW5kZWQgb3IgZXJyb3JlZC5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGh5ZHJhdGlvbi4gVHJ5IGFnYWluIHdpdGhvdXQgaHlkcmF0aW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuXG4gICAgICB2YXIgX2NhcHR1cmVkVmFsdWUyID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShuZXcgRXJyb3IoJ1RoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBoeWRyYXRpbmcgdGhpcyBTdXNwZW5zZSBib3VuZGFyeS4gJyArICdTd2l0Y2hlZCB0byBjbGllbnQgcmVuZGVyaW5nLicpKTtcblxuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgX2NhcHR1cmVkVmFsdWUyKTtcbiAgICB9IGVsc2UgaWYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQgYW5kIHdlIHNob3VsZCBzdGlsbCBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuXG4gICAgICAvLyBMZWF2ZSB0aGUgZXhpc3RpbmcgY2hpbGQgaW4gcGxhY2UuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFRoZSBkZWh5ZHJhdGVkIGNvbXBsZXRpb24gcGFzcyBleHBlY3RzIHRoaXMgZmxhZyB0byBiZSB0aGVyZVxuICAgICAgLy8gYnV0IHRoZSBub3JtYWwgc3VzcGVuc2UgcGFzcyBkb2Vzbid0LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN1c3BlbmRlZCBidXQgd2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuXG4gICAgICAvLyBUaGVyZWZvcmUgd2Ugbm93IGhhdmUgdG8gcmVuZGVyIHRoZSBmYWxsYmFjay5cbiAgICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0FmdGVyUmV0cnlXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihmaWJlciwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkge1xuICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KTtcbn1cblxuZnVuY3Rpb24gcHJvcGFnYXRlU3VzcGVuc2VDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBmaXJzdENoaWxkLCByZW5kZXJMYW5lcykge1xuICAvLyBNYXJrIGFueSBTdXNwZW5zZSBib3VuZGFyaWVzIHdpdGggZmFsbGJhY2tzIGFzIGhhdmluZyB3b3JrIHRvIGRvLlxuICAvLyBJZiB0aGV5IHdlcmUgcHJldmlvdXNseSBmb3JjZWQgaW50byBmYWxsYmFja3MsIHRoZXkgbWF5IG5vdyBiZSBhYmxlXG4gIC8vIHRvIHVuYmxvY2suXG4gIHZhciBub2RlID0gZmlyc3RDaGlsZDtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IG5vZGUubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlTGlzdENvbXBvbmVudCkge1xuICAgICAgLy8gSWYgdGhlIHRhaWwgaXMgaGlkZGVuIHRoZXJlIG1pZ2h0IG5vdCBiZSBhbiBTdXNwZW5zZSBib3VuZGFyaWVzXG4gICAgICAvLyB0byBzY2hlZHVsZSB3b3JrIG9uLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBvbiB0aGVcbiAgICAgIC8vIGxpc3QgaXRzZWxmLlxuICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byB0cmF2ZXJzZSB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIGxpc3Qgc2luY2VcbiAgICAgIC8vIHRoZSBsaXN0IHdpbGwgcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugd2hlbiBpdCByZXJlbmRlcnMuXG4gICAgICBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIobm9kZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kTGFzdENvbnRlbnRSb3coZmlyc3RDaGlsZCkge1xuICAvLyBUaGlzIGlzIGdvaW5nIHRvIGZpbmQgdGhlIGxhc3Qgcm93IGFtb25nIHRoZXNlIGNoaWxkcmVuIHRoYXQgaXMgYWxyZWFkeVxuICAvLyBzaG93aW5nIGNvbnRlbnQgb24gdGhlIHNjcmVlbiwgYXMgb3Bwb3NlZCB0byBiZWluZyBpbiBmYWxsYmFjayBzdGF0ZSBvclxuICAvLyBuZXcuIElmIGEgcm93IGhhcyBtdWx0aXBsZSBTdXNwZW5zZSBib3VuZGFyaWVzLCBhbnkgb2YgdGhlbSBiZWluZyBpbiB0aGVcbiAgLy8gZmFsbGJhY2sgc3RhdGUsIGNvdW50cyBhcyB0aGUgd2hvbGUgcm93IGJlaW5nIGluIGEgZmFsbGJhY2sgc3RhdGUuXG4gIC8vIE5vdGUgdGhhdCB0aGUgXCJyb3dzXCIgd2lsbCBiZSB3b3JrSW5Qcm9ncmVzcywgYnV0IGFueSBuZXN0ZWQgY2hpbGRyZW5cbiAgLy8gd2lsbCBzdGlsbCBiZSBjdXJyZW50IHNpbmNlIHdlIGhhdmVuJ3QgcmVuZGVyZWQgdGhlbSB5ZXQuIFRoZSBtb3VudGVkXG4gIC8vIG9yZGVyIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5ldyBvcmRlci4gV2UgdXNlIHRoZSBuZXcgb3JkZXIuXG4gIHZhciByb3cgPSBmaXJzdENoaWxkO1xuICB2YXIgbGFzdENvbnRlbnRSb3cgPSBudWxsO1xuXG4gIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkge1xuICAgICAgbGFzdENvbnRlbnRSb3cgPSByb3c7XG4gICAgfVxuXG4gICAgcm93ID0gcm93LnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbGFzdENvbnRlbnRSb3c7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmIChyZXZlYWxPcmRlciAhPT0gdW5kZWZpbmVkICYmIHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ3RvZ2V0aGVyJyAmJiAhZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdKSB7XG4gICAgICBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0gPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIHJldmVhbE9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICBzd2l0Y2ggKHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICd0b2dldGhlcic6XG4gICAgICAgICAgY2FzZSAnZm9yd2FyZHMnOlxuICAgICAgICAgIGNhc2UgJ2JhY2t3YXJkcyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnVXNlIGxvd2VyY2FzZSBcIiVzXCIgaW5zdGVhZC4nLCByZXZlYWxPcmRlciwgcmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdmb3J3YXJkJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnUmVhY3QgdXNlcyB0aGUgLXMgc3VmZml4IGluIHRoZSBzcGVsbGluZy4gVXNlIFwiJXNzXCIgaW5zdGVhZC4nLCByZXZlYWxPcmRlciwgcmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignJXMgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsIHJldmVhbE9yZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmICh0YWlsTW9kZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0pIHtcbiAgICAgIGlmICh0YWlsTW9kZSAhPT0gJ2NvbGxhcHNlZCcgJiYgdGFpbE1vZGUgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHRhaWwgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJjb2xsYXBzZWRcIiBvciBcImhpZGRlblwiPycsIHRhaWxNb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAocmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJzxTdXNwZW5zZUxpc3QgdGFpbD1cIiVzXCIgLz4gaXMgb25seSB2YWxpZCBpZiByZXZlYWxPcmRlciBpcyAnICsgJ1wiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBzcGVjaWZ5IHJldmVhbE9yZGVyPVwiZm9yd2FyZHNcIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoY2hpbGRTbG90LCBpbmRleCkge1xuICB7XG4gICAgdmFyIGlzQW5BcnJheSA9IGlzQXJyYXkoY2hpbGRTbG90KTtcbiAgICB2YXIgaXNJdGVyYWJsZSA9ICFpc0FuQXJyYXkgJiYgdHlwZW9mIGdldEl0ZXJhdG9yRm4oY2hpbGRTbG90KSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmIChpc0FuQXJyYXkgfHwgaXNJdGVyYWJsZSkge1xuICAgICAgdmFyIHR5cGUgPSBpc0FuQXJyYXkgPyAnYXJyYXknIDogJ2l0ZXJhYmxlJztcblxuICAgICAgZXJyb3IoJ0EgbmVzdGVkICVzIHdhcyBwYXNzZWQgdG8gcm93ICMlcyBpbiA8U3VzcGVuc2VMaXN0IC8+LiBXcmFwIGl0IGluICcgKyAnYW4gYWRkaXRpb25hbCBTdXNwZW5zZUxpc3QgdG8gY29uZmlndXJlIGl0cyByZXZlYWxPcmRlcjogJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj4gLi4uICcgKyAnPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+eyVzfTwvU3VzcGVuc2VMaXN0PiAuLi4gJyArICc8L1N1c3BlbnNlTGlzdD4nLCB0eXBlLCBpbmRleCwgdHlwZSk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihjaGlsZHJlbiwgcmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmICgocmV2ZWFsT3JkZXIgPT09ICdmb3J3YXJkcycgfHwgcmV2ZWFsT3JkZXIgPT09ICdiYWNrd2FyZHMnKSAmJiBjaGlsZHJlbiAhPT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuICE9PSBudWxsICYmIGNoaWxkcmVuICE9PSBmYWxzZSkge1xuICAgICAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoY2hpbGRyZW5baV0sIGkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjaGlsZHJlbkl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcblxuICAgICAgICAgIGlmIChjaGlsZHJlbkl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgdmFyIF9pID0gMDtcblxuICAgICAgICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IHN0ZXAgPSBjaGlsZHJlbkl0ZXJhdG9yLm5leHQoKSkge1xuICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoc3RlcC52YWx1ZSwgX2kpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgX2krKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3IoJ0Egc2luZ2xlIHJvdyB3YXMgcGFzc2VkIHRvIGEgPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj1cIiVzXCIgLz4uICcgKyAnVGhpcyBpcyBub3QgdXNlZnVsIHNpbmNlIGl0IG5lZWRzIG11bHRpcGxlIHJvd3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHBhc3MgbXVsdGlwbGUgY2hpbGRyZW4gb3IgYW4gYXJyYXk/JywgcmV2ZWFsT3JkZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgaXNCYWNrd2FyZHMsIHRhaWwsIGxhc3RDb250ZW50Um93LCB0YWlsTW9kZSkge1xuICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChyZW5kZXJTdGF0ZSA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgICBpc0JhY2t3YXJkczogaXNCYWNrd2FyZHMsXG4gICAgICByZW5kZXJpbmc6IG51bGwsXG4gICAgICByZW5kZXJpbmdTdGFydFRpbWU6IDAsXG4gICAgICBsYXN0OiBsYXN0Q29udGVudFJvdyxcbiAgICAgIHRhaWw6IHRhaWwsXG4gICAgICB0YWlsTW9kZTogdGFpbE1vZGVcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGNhbiByZXVzZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGZyb20gcHJldmlvdXMgcmVuZGVycy5cbiAgICByZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcyA9IGlzQmFja3dhcmRzO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gMDtcbiAgICByZW5kZXJTdGF0ZS5sYXN0ID0gbGFzdENvbnRlbnRSb3c7XG4gICAgcmVuZGVyU3RhdGUudGFpbCA9IHRhaWw7XG4gICAgcmVuZGVyU3RhdGUudGFpbE1vZGUgPSB0YWlsTW9kZTtcbiAgfVxufSAvLyBUaGlzIGNhbiBlbmQgdXAgcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50IG11bHRpcGxlIHBhc3Nlcy5cbi8vIFRoZSBmaXJzdCBwYXNzIHNwbGl0cyB0aGUgY2hpbGRyZW4gZmliZXJzIGludG8gdHdvIHNldHMuIEEgaGVhZCBhbmQgdGFpbC5cbi8vIFdlIGZpcnN0IHJlbmRlciB0aGUgaGVhZC4gSWYgYW55dGhpbmcgaXMgaW4gZmFsbGJhY2sgc3RhdGUsIHdlIGRvIGFub3RoZXJcbi8vIHBhc3MgdGhyb3VnaCBiZWdpbldvcmsgdG8gcmVyZW5kZXIgYWxsIGNoaWxkcmVuIChpbmNsdWRpbmcgdGhlIHRhaWwpIHdpdGhcbi8vIHRoZSBmb3JjZSBzdXNwZW5kIGNvbnRleHQuIElmIHRoZSBmaXJzdCByZW5kZXIgZGlkbid0IGhhdmUgYW55dGhpbmcgaW5cbi8vIGluIGZhbGxiYWNrIHN0YXRlLiBUaGVuIHdlIHJlbmRlciBlYWNoIHJvdyBpbiB0aGUgdGFpbCBvbmUtYnktb25lLlxuLy8gVGhhdCBoYXBwZW5zIGluIHRoZSBjb21wbGV0ZVdvcmsgcGhhc2Ugd2l0aG91dCBnb2luZyBiYWNrIHRvIGJlZ2luV29yay5cblxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcjtcbiAgdmFyIHRhaWxNb2RlID0gbmV4dFByb3BzLnRhaWw7XG4gIHZhciBuZXdDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihuZXdDaGlsZHJlbiwgcmV2ZWFsT3JkZXIpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3VsZEZvcmNlRmFsbGJhY2sgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuXG4gIGlmIChzaG91bGRGb3JjZUZhbGxiYWNrKSB7XG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAvLyBJZiB3ZSBwcmV2aW91c2x5IGZvcmNlZCBhIGZhbGxiYWNrLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHdvcmtcbiAgICAgIC8vIG9uIGFueSBuZXN0ZWQgYm91bmRhcmllcyB0byBsZXQgdGhlbSBrbm93IHRvIHRyeSB0byByZW5kZXJcbiAgICAgIC8vIGFnYWluLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvbnRleHQgdXBkYXRpbmcuXG4gICAgICBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLmNoaWxkLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgfVxuXG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgU3VzcGVuc2VMaXN0IGRvZXNuJ3Qgd29yayBzbyB3ZSBqdXN0XG4gICAgLy8gdXNlIG1ha2UgaXQgYSBub29wIGJ5IHRyZWF0aW5nIGl0IGFzIHRoZSBkZWZhdWx0IHJldmVhbE9yZGVyLlxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIpIHtcbiAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXN0Q29udGVudFJvdyA9IGZpbmRMYXN0Q29udGVudFJvdyh3b3JrSW5Qcm9ncmVzcy5jaGlsZCk7XG4gICAgICAgICAgdmFyIHRhaWw7XG5cbiAgICAgICAgICBpZiAobGFzdENvbnRlbnRSb3cgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSB3aG9sZSBsaXN0IGlzIHBhcnQgb2YgdGhlIHRhaWwuXG4gICAgICAgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBmYXN0IHBhdGggYnkganVzdCByZW5kZXJpbmcgdGhlIHRhaWwgbm93LlxuICAgICAgICAgICAgdGFpbCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSB0YWlsIHJvd3MgYWZ0ZXIgdGhlIGNvbnRlbnQgcm93LlxuICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZW0gc2VwYXJhdGVseSBsYXRlci5cbiAgICAgICAgICAgIHRhaWwgPSBsYXN0Q29udGVudFJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgbGFzdENvbnRlbnRSb3cuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICB0YWlsLCBsYXN0Q29udGVudFJvdywgdGFpbE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ2JhY2t3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBmaW5kIHRoZSBmaXJzdCByb3cgdGhhdCBoYXMgZXhpc3RpbmcgY29udGVudC5cbiAgICAgICAgICAvLyBBdCB0aGUgc2FtZSB0aW1lIHdlJ3JlIGdvaW5nIHRvIHJldmVyc2UgdGhlIGxpc3Qgb2YgZXZlcnl0aGluZ1xuICAgICAgICAgIC8vIHdlIHBhc3MgaW4gdGhlIG1lYW50aW1lLiBUaGF0J3MgZ29pbmcgdG8gYmUgb3VyIHRhaWwgaW4gcmV2ZXJzZVxuICAgICAgICAgIC8vIG9yZGVyLlxuICAgICAgICAgIHZhciBfdGFpbCA9IG51bGw7XG4gICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcblxuICAgICAgICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLlxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYWluIGNvbnRlbnQuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcm93O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5leHRSb3cgPSByb3cuc2libGluZztcbiAgICAgICAgICAgIHJvdy5zaWJsaW5nID0gX3RhaWw7XG4gICAgICAgICAgICBfdGFpbCA9IHJvdztcbiAgICAgICAgICAgIHJvdyA9IG5leHRSb3c7XG4gICAgICAgICAgfSAvLyBUT0RPOiBJZiB3b3JrSW5Qcm9ncmVzcy5jaGlsZCBpcyBudWxsLCB3ZSBjYW4gY29udGludWUgb24gdGhlIHRhaWwgaW1tZWRpYXRlbHkuXG5cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgdHJ1ZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBfdGFpbCwgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHRhaWxNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICd0b2dldGhlcic6XG4gICAgICAgIHtcbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIG51bGwsIC8vIHRhaWxcbiAgICAgICAgICBudWxsLCAvLyBsYXN0XG4gICAgICAgICAgdW5kZWZpbmVkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVGhlIGRlZmF1bHQgcmV2ZWFsIG9yZGVyIGlzIHRoZSBzYW1lIGFzIG5vdCBoYXZpbmdcbiAgICAgICAgICAvLyBhIGJvdW5kYXJ5LlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBQb3J0YWxzIGFyZSBzcGVjaWFsIGJlY2F1c2Ugd2UgZG9uJ3QgYXBwZW5kIHRoZSBjaGlsZHJlbiBkdXJpbmcgbW91bnRcbiAgICAvLyBidXQgYXQgY29tbWl0LiBUaGVyZWZvcmUgd2UgbmVlZCB0byB0cmFjayBpbnNlcnRpb25zIHdoaWNoIHRoZSBub3JtYWxcbiAgICAvLyBmbG93IGRvZXNuJ3QgZG8gZHVyaW5nIG1vdW50LiBUaGlzIGRvZXNuJ3QgaGFwcGVuIGF0IHRoZSByb290IGJlY2F1c2VcbiAgICAvLyB0aGUgcm9vdCBhbHdheXMgc3RhcnRzIHdpdGggYSBcImN1cnJlbnRcIiB3aXRoIGEgbnVsbCBjaGlsZC5cbiAgICAvLyBUT0RPOiBDb25zaWRlciB1bmlmeWluZyB0aGlzIHdpdGggaG93IHRoZSByb290IHdvcmtzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxudmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHByb3ZpZGVyVHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBjb250ZXh0ID0gcHJvdmlkZXJUeXBlLl9jb250ZXh0O1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIHZhciBuZXdWYWx1ZSA9IG5ld1Byb3BzLnZhbHVlO1xuXG4gIHtcbiAgICBpZiAoISgndmFsdWUnIGluIG5ld1Byb3BzKSkge1xuICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlcikge1xuICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RoZSBgdmFsdWVgIHByb3AgaXMgcmVxdWlyZWQgZm9yIHRoZSBgPENvbnRleHQuUHJvdmlkZXI+YC4gRGlkIHlvdSBtaXNzcGVsbCBpdCBvciBmb3JnZXQgdG8gcGFzcyBpdD8nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJvdmlkZXJQcm9wVHlwZXMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChwcm92aWRlclByb3BUeXBlcykge1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvdmlkZXJQcm9wVHlwZXMsIG5ld1Byb3BzLCAncHJvcCcsICdDb250ZXh0LlByb3ZpZGVyJyk7XG4gICAgfVxuICB9XG5cbiAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBuZXdWYWx1ZSk7XG5cbiAge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZFZhbHVlID0gb2xkUHJvcHMudmFsdWU7XG5cbiAgICAgIGlmIChvYmplY3RJcyhvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuXG4gICAgICAgIGlmIChvbGRQcm9wcy5jaGlsZHJlbiA9PT0gbmV3UHJvcHMuY2hpbGRyZW4gJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkpIHtcbiAgICAgICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgY29udGV4dCB2YWx1ZSBjaGFuZ2VkLiBTZWFyY2ggZm9yIG1hdGNoaW5nIGNvbnN1bWVycyBhbmQgc2NoZWR1bGVcbiAgICAgICAgLy8gdGhlbSB0byB1cGRhdGUuXG4gICAgICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRyZW4gPSBuZXdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxudmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVGhlIGxvZ2ljIGJlbG93IGZvciBDb250ZXh0IGRpZmZlcnMgZGVwZW5kaW5nIG9uIFBST0Qgb3IgREVWIG1vZGUuIEluXG4gIC8vIERFViBtb2RlLCB3ZSBjcmVhdGUgYSBzZXBhcmF0ZSBvYmplY3QgZm9yIENvbnRleHQuQ29uc3VtZXIgdGhhdCBhY3RzXG4gIC8vIGxpa2UgYSBwcm94eSB0byBDb250ZXh0LiBUaGlzIHByb3h5IG9iamVjdCBhZGRzIHVubmVjZXNzYXJ5IGNvZGUgaW4gUFJPRFxuICAvLyBzbyB3ZSB1c2UgdGhlIG9sZCBiZWhhdmlvdXIgKENvbnRleHQuQ29uc3VtZXIgcmVmZXJlbmNlcyBDb250ZXh0KSB0b1xuICAvLyByZWR1Y2Ugc2l6ZSBhbmQgb3ZlcmhlYWQuIFRoZSBzZXBhcmF0ZSBvYmplY3QgcmVmZXJlbmNlcyBjb250ZXh0IHZpYVxuICAvLyBhIHByb3BlcnR5IGNhbGxlZCBcIl9jb250ZXh0XCIsIHdoaWNoIGFsc28gZ2l2ZXMgdXMgdGhlIGFiaWxpdHkgdG8gY2hlY2tcbiAgLy8gaW4gREVWIG1vZGUgaWYgdGhpcyBwcm9wZXJ0eSBleGlzdHMgb3Igbm90IGFuZCB3YXJuIGlmIGl0IGRvZXMgbm90LlxuXG4gIHtcbiAgICBpZiAoY29udGV4dC5fY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIG1heSBiZSBiZWNhdXNlIGl0J3MgYSBDb250ZXh0IChyYXRoZXIgdGhhbiBhIENvbnN1bWVyKS5cbiAgICAgIC8vIE9yIGl0IG1heSBiZSBiZWNhdXNlIGl0J3Mgb2xkZXIgUmVhY3Qgd2hlcmUgdGhleSdyZSB0aGUgc2FtZSB0aGluZy5cbiAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB3YXJuIGlmIHdlJ3JlIHN1cmUgaXQncyBhIG5ldyBSZWFjdC5cbiAgICAgIGlmIChjb250ZXh0ICE9PSBjb250ZXh0LkNvbnN1bWVyKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyKSB7XG4gICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQ+IGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuX2NvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcmVuZGVyID0gbmV3UHJvcHMuY2hpbGRyZW47XG5cbiAge1xuICAgIGlmICh0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignQSBjb250ZXh0IGNvbnN1bWVyIHdhcyByZW5kZXJlZCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuLCBvciBhIGNoaWxkICcgKyBcInRoYXQgaXNuJ3QgYSBmdW5jdGlvbi4gQSBjb250ZXh0IGNvbnN1bWVyIGV4cGVjdHMgYSBzaW5nbGUgY2hpbGQgXCIgKyAndGhhdCBpcyBhIGZ1bmN0aW9uLiBJZiB5b3UgZGlkIHBhc3MgYSBmdW5jdGlvbiwgbWFrZSBzdXJlIHRoZXJlICcgKyAnaXMgbm8gdHJhaWxpbmcgb3IgbGVhZGluZyB3aGl0ZXNwYWNlIGFyb3VuZCBpdC4nKTtcbiAgICB9XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgbmV3VmFsdWUgPSByZWFkQ29udGV4dChjb250ZXh0KTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAgdmFyIG5ld0NoaWxkcmVuO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXdDaGlsZHJlbiA9IHJlbmRlcihuZXdWYWx1ZSk7XG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKSB7XG4gIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgbGF6eSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAgIC8vIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHkgY29tbWl0dGVkLlxuICAgICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgICAgY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gUmV1c2UgcHJldmlvdXMgZGVwZW5kZW5jaWVzXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgdXBkYXRlIFwiYmFzZVwiIHJlbmRlciB0aW1lcyBmb3IgYmFpbG91dHMuXG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgfVxuXG4gIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMpOyAvLyBDaGVjayBpZiB0aGUgY2hpbGRyZW4gaGF2ZSBhbnkgcGVuZGluZyB3b3JrLlxuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykpIHtcbiAgICAvLyBUaGUgY2hpbGRyZW4gZG9uJ3QgaGF2ZSBhbnkgd29yayBlaXRoZXIuIFdlIGNhbiBza2lwIHRoZW0uXG4gICAgLy8gVE9ETzogT25jZSB3ZSBhZGQgYmFjayByZXN1bWluZywgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBjaGlsZHJlbiBhcmVcbiAgICAvLyBhIHdvcmstaW4tcHJvZ3Jlc3Mgc2V0LiBJZiBzbywgd2UgbmVlZCB0byB0cmFuc2ZlciB0aGVpciBlZmZlY3RzLlxuICAgIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSAvLyBUaGlzIGZpYmVyIGRvZXNuJ3QgaGF2ZSB3b3JrLCBidXQgaXRzIHN1YnRyZWUgZG9lcy4gQ2xvbmUgdGhlIGNoaWxkXG4gIC8vIGZpYmVycyBhbmQgY29udGludWUuXG5cblxuICBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiByZW1vdW50RmliZXIoY3VycmVudCwgb2xkV29ya0luUHJvZ3Jlc3MsIG5ld1dvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICBpZiAocmV0dXJuRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzd2FwIHRoZSByb290IGZpYmVyLicpO1xuICAgIH0gLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBvbGQgY3VycmVudC5cbiAgICAvLyBJdCB3aWxsIGdldCBkZWxldGVkLlxuXG5cbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgb2xkV29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gQ29ubmVjdCB0byB0aGUgbmV3IHRyZWUuXG5cbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5pbmRleCA9IG9sZFdvcmtJblByb2dyZXNzLmluZGV4O1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBvbGRXb3JrSW5Qcm9ncmVzcy5zaWJsaW5nO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJldHVybiA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5yZWYgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFJlcGxhY2UgdGhlIGNoaWxkL3NpYmxpbmcgcG9pbnRlcnMgYWJvdmUgaXQuXG5cbiAgICBpZiAob2xkV29ya0luUHJvZ3Jlc3MgPT09IHJldHVybkZpYmVyLmNoaWxkKSB7XG4gICAgICByZXR1cm5GaWJlci5jaGlsZCA9IG5ld1dvcmtJblByb2dyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcHJldlNpYmxpbmcgPSByZXR1cm5GaWJlci5jaGlsZDtcblxuICAgICAgaWYgKHByZXZTaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcGFyZW50IHRvIGhhdmUgYSBjaGlsZC4nKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHByZXZTaWJsaW5nLnNpYmxpbmcgIT09IG9sZFdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHByZXZTaWJsaW5nID0gcHJldlNpYmxpbmcuc2libGluZztcblxuICAgICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJldmlvdXMgc2libGluZy4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcmV2U2libGluZy5zaWJsaW5nID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSAvLyBEZWxldGUgdGhlIG9sZCBmaWJlciBhbmQgcGxhY2UgdGhlIG5ldyBvbmUuXG4gICAgLy8gU2luY2UgdGhlIG9sZCBmaWJlciBpcyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgbWFudWFsbHkuXG5cblxuICAgIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY3VycmVudF07XG4gICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjdXJyZW50KTtcbiAgICB9XG5cbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7IC8vIFJlc3RhcnQgd29yayBmcm9tIHRoZSBuZXcgZmliZXIuXG5cbiAgICByZXR1cm4gbmV3V29ya0luUHJvZ3Jlc3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gQmVmb3JlIHBlcmZvcm1pbmcgYW4gZWFybHkgYmFpbG91dCwgd2UgbXVzdCBjaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZ1xuICAvLyB1cGRhdGVzIG9yIGNvbnRleHQuXG4gIHZhciB1cGRhdGVMYW5lcyA9IGN1cnJlbnQubGFuZXM7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUodXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vIHBlbmRpbmcgdXBkYXRlLCBidXQgYmVjYXVzZSBjb250ZXh0IGlzIHByb3BhZ2F0ZWQgbGF6aWx5LCB3ZSBuZWVkXG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBmaWJlciBkb2VzIG5vdCBoYXZlIGFueSBwZW5kaW5nIHdvcmsuIEJhaWxvdXQgd2l0aG91dCBlbnRlcmluZ1xuICAvLyB0aGUgYmVnaW4gcGhhc2UuIFRoZXJlJ3Mgc3RpbGwgc29tZSBib29ra2VlcGluZyB3ZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmVcbiAgLy8gaW4gdGhpcyBvcHRpbWl6ZWQgcGF0aCwgbW9zdGx5IHB1c2hpbmcgc3R1ZmYgb250byB0aGUgc3RhY2suXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudmFsdWU7XG4gICAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgICAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBuZXdWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHtcbiAgICAgICAgLy8gUHJvZmlsZXIgc2hvdWxkIG9ubHkgY2FsbCBvblJlbmRlciB3aGVuIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMgYWN0dWFsbHkgcmVuZGVyZWQuXG4gICAgICAgIHZhciBoYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgICAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuICAgICAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpOyAvLyBXZSBrbm93IHRoYXQgdGhpcyBjb21wb25lbnQgd2lsbCBzdXNwZW5kIGFnYWluIGJlY2F1c2UgaWYgaXQgaGFzXG4gICAgICAgICAgICAvLyBiZWVuIHVuc3VzcGVuZGVkIGl0IGhhcyBjb21taXR0ZWQgYXMgYSByZXNvbHZlZCBTdXNwZW5zZSBjb21wb25lbnQuXG4gICAgICAgICAgICAvLyBJZiBpdCBuZWVkcyB0byBiZSByZXRyaWVkLCBpdCBzaG91bGQgaGF2ZSB3b3JrIHNjaGVkdWxlZCBvbiBpdC5cblxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsgLy8gV2Ugc2hvdWxkIG5ldmVyIHJlbmRlciB0aGUgY2hpbGRyZW4gb2YgYSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IHVudGlsIHdlXG4gICAgICAgICAgICAvLyB1cGdyYWRlIGl0LiBXZSByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsuXG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0gLy8gSWYgdGhpcyBib3VuZGFyeSBpcyBjdXJyZW50bHkgdGltZWQgb3V0LCB3ZSBuZWVkIHRvIGRlY2lkZVxuICAgICAgICAgIC8vIHdoZXRoZXIgdG8gcmV0cnkgdGhlIHByaW1hcnkgY2hpbGRyZW4sIG9yIHRvIHNraXAgb3ZlciBpdCBhbmRcbiAgICAgICAgICAvLyBnbyBzdHJhaWdodCB0byB0aGUgZmFsbGJhY2suIENoZWNrIHRoZSBwcmlvcml0eSBvZiB0aGUgcHJpbWFyeVxuICAgICAgICAgIC8vIGNoaWxkIGZyYWdtZW50LlxuXG5cbiAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkTGFuZXMgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzO1xuXG4gICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHByaW1hcnlDaGlsZExhbmVzKSkge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFVzZSB0aGUgbm9ybWFsIHBhdGhcbiAgICAgICAgICAgIC8vIHRvIGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBwcmltYXJ5IGNoaWxkcmVuIGFnYWluLlxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50IGRvZXMgbm90IGhhdmUgcGVuZGluZyB3b3JrIG1hcmtlZFxuICAgICAgICAgICAgLy8gb24gaXRcbiAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpOyAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBkbyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgd2l0aCBzdWZmaWNpZW50XG4gICAgICAgICAgICAvLyBwcmlvcml0eS4gQmFpbG91dC5cblxuICAgICAgICAgICAgdmFyIGNoaWxkID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhlIGZhbGxiYWNrIGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBTa2lwIG92ZXIgdGhlXG4gICAgICAgICAgICAgIC8vIHByaW1hcnkgY2hpbGRyZW4gYW5kIHdvcmsgb24gdGhlIGZhbGxiYWNrLlxuICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2libGluZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vdGU6IFdlIGNhbiByZXR1cm4gYG51bGxgIGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGNoZWNrZWRcbiAgICAgICAgICAgICAgLy8gd2hldGhlciB0aGVyZSB3ZXJlIG5lc3RlZCBjb250ZXh0IGNvbnN1bWVycywgdmlhIHRoZSBjYWxsIHRvXG4gICAgICAgICAgICAgIC8vIGBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrYCBhYm92ZS5cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICAgIHZhciBfaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHtcbiAgICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdhcyBpbiBmYWxsYmFjayBzdGF0ZSBsYXN0IHRpbWUsIGFuZCB3ZSBoYXZlIGFsbCB0aGVcbiAgICAgICAgICAgIC8vIHNhbWUgY2hpbGRyZW4gdGhlbiB3ZSdyZSBzdGlsbCBpbiBwcm9ncmVzc2l2ZSBsb2FkaW5nIHN0YXRlLlxuICAgICAgICAgICAgLy8gU29tZXRoaW5nIG1pZ2h0IGdldCB1bmJsb2NrZWQgYnkgc3RhdGUgdXBkYXRlcyBvciByZXRyaWVzIGluIHRoZVxuICAgICAgICAgICAgLy8gdHJlZSB3aGljaCB3aWxsIGFmZmVjdCB0aGUgdGFpbC4gU28gd2UgbmVlZCB0byB1c2UgdGhlIG5vcm1hbFxuICAgICAgICAgICAgLy8gcGF0aCB0byBjb21wdXRlIHRoZSBjb3JyZWN0IHRhaWwuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfSAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cblxuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgfSAvLyBJZiBub3RoaW5nIHN1c3BlbmRlZCBiZWZvcmUgYW5kIHdlJ3JlIHJlbmRlcmluZyB0aGUgc2FtZSBjaGlsZHJlbixcbiAgICAgICAgLy8gdGhlbiB0aGUgdGFpbCBkb2Vzbid0IG1hdHRlci4gQW55dGhpbmcgbmV3IHRoYXQgc3VzcGVuZHMgd2lsbCB3b3JrXG4gICAgICAgIC8vIGluIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSwgc28gd2UgY2FuIGNvbnRpbnVlIGZyb20gdGhlIHN0YXRlIHdlIGhhZC5cblxuXG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIFwidG9nZXRoZXJcIiBtb2RlIGluIGNhc2Ugd2UndmUgc3RhcnRlZCBhIGRpZmZlcmVudFxuICAgICAgICAgIC8vIHVwZGF0ZSBpbiB0aGUgcGFzdCBidXQgZGlkbid0IGNvbXBsZXRlIGl0LlxuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuXG4gICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm9uZSBvZiB0aGUgY2hpbGRyZW4gaGFkIGFueSB3b3JrLCB0aGF0IG1lYW5zIHRoYXQgbm9uZSBvZlxuICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSB0cmVlIHN0aWxsIG5lZWRzIHRvIGJlIGRlZmVycmVkLiBUaGlzIGlzXG4gICAgICAgIC8vIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlIGxvZ2ljIHVzZWQgaW4gdGhlIG5vcm1hbCB1cGRhdGUgcGF0aCxcbiAgICAgICAgLy8gc28gd2UnbGwganVzdCBlbnRlciB0aGF0LiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHdlJ2xsIGJhaWwgb3V0XG4gICAgICAgIC8vIGF0IHRoZSBuZXh0IGxldmVsIGluc3RlYWQgb2YgdGhpcyBvbmUsIGJlY2F1c2UgdGhlIGNoaWxkIHByb3BzXG4gICAgICAgIC8vIGhhdmUgbm90IGNoYW5nZWQuIFdoaWNoIGlzIGZpbmUuXG4gICAgICAgIC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCByZWZhY3RvciBgYmVnaW5Xb3JrYCB0byBzcGxpdCB0aGUgYmFpbG91dFxuICAgICAgICAvLyBwYXRoIGZyb20gdGhlIG5vcm1hbCBwYXRoLiBJJ20gdGVtcHRlZCB0byBkbyBhIGxhYmVsZWQgYnJlYWsgaGVyZVxuICAgICAgICAvLyBidXQgSSB3b24ndCA6KVxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgJiYgY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB3aWxsIHJlc3RhcnQgdGhlIGJlZ2luIHBoYXNlIHdpdGggYSBuZXcgZmliZXIuXG4gICAgICByZXR1cm4gcmVtb3VudEZpYmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3Mua2V5LCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyIHx8IG51bGwsIHdvcmtJblByb2dyZXNzLm1vZGUsIHdvcmtJblByb2dyZXNzLmxhbmVzKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBoYXNDb250ZXh0Q2hhbmdlZCgpIHx8ICggLy8gRm9yY2UgYSByZS1yZW5kZXIgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQ6XG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICAvLyBJZiBwcm9wcyBvciBjb250ZXh0IGNoYW5nZWQsIG1hcmsgdGhlIGZpYmVyIGFzIGhhdmluZyBwZXJmb3JtZWQgd29yay5cbiAgICAgIC8vIFRoaXMgbWF5IGJlIHVuc2V0IGlmIHRoZSBwcm9wcyBhcmUgZGV0ZXJtaW5lZCB0byBiZSBlcXVhbCBsYXRlciAobWVtbykuXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBwcm9wcyBub3IgbGVnYWN5IGNvbnRleHQgY2hhbmdlcy4gQ2hlY2sgaWYgdGhlcmUncyBhIHBlbmRpbmdcbiAgICAgIC8vIHVwZGF0ZSBvciBjb250ZXh0IGNoYW5nZS5cbiAgICAgIHZhciBoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgPSBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmICghaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ICYmIC8vIElmIHRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIG9mIGFuIGVycm9yIG9yIHN1c3BlbnNlIGJvdW5kYXJ5LCB0aGVyZVxuICAgICAgLy8gbWF5IG5vdCBiZSB3b3JrIHNjaGVkdWxlZCBvbiBgY3VycmVudGAsIHNvIHdlIGNoZWNrIGZvciB0aGlzIGZsYWcuXG4gICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBObyBwZW5kaW5nIHVwZGF0ZXMgb3IgY29udGV4dC4gQmFpbCBvdXQgbm93LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb24gdGhpcyBmaWJlciwgYnV0IHRoZXJlIGFyZSBubyBuZXcgcHJvcHNcbiAgICAgICAgLy8gbm9yIGxlZ2FjeSBjb250ZXh0LiBTZXQgdGhpcyB0byBmYWxzZS4gSWYgYW4gdXBkYXRlIHF1ZXVlIG9yIGNvbnRleHRcbiAgICAgICAgLy8gY29uc3VtZXIgcHJvZHVjZXMgYSBjaGFuZ2VkIHZhbHVlLCBpdCB3aWxsIHNldCB0aGlzIHRvIHRydWUuIE90aGVyd2lzZSxcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aWxsIGFzc3VtZSB0aGUgY2hpbGRyZW4gaGF2ZSBub3QgY2hhbmdlZCBhbmQgYmFpbCBvdXQuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaXNGb3JrZWRDaGlsZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgY2hpbGQgYmVsb25ncyB0byBhIGxpc3Qgb2YgbXVsaXBsZSBjaGlsZHJlbiBpblxuICAgICAgLy8gaXRzIHBhcmVudC5cbiAgICAgIC8vXG4gICAgICAvLyBJbiBhIHRydWUgbXVsdGktdGhyZWFkZWQgaW1wbGVtZW50YXRpb24sIHdlIHdvdWxkIHJlbmRlciBjaGlsZHJlbiBvblxuICAgICAgLy8gcGFyYWxsZWwgdGhyZWFkcy4gVGhpcyB3b3VsZCByZXByZXNlbnQgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyByZW5kZXJcbiAgICAgIC8vIHRocmVhZCBmb3IgdGhpcyBzdWJ0cmVlLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIG9ubHkgdXNlIHRoaXMgZm9yIGlkIGdlbmVyYXRpb24gZHVyaW5nIGh5ZHJhdGlvbiwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gbG9naWMgaXMgbG9jYXRlZCBpbiB0aGlzIHNwZWNpYWwgYnJhbmNoLlxuICAgICAgdmFyIHNsb3RJbmRleCA9IHdvcmtJblByb2dyZXNzLmluZGV4O1xuICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBnZXRGb3Jrc0F0TGV2ZWwoKTtcbiAgICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gICAgfVxuICB9IC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNsZWFyIHBlbmRpbmcgdXBkYXRlIHByaW9yaXR5LlxuICAvLyBUT0RPOiBUaGlzIGFzc3VtZXMgdGhhdCB3ZSdyZSBhYm91dCB0byBldmFsdWF0ZSB0aGUgY29tcG9uZW50IGFuZCBwcm9jZXNzXG4gIC8vIHRoZSB1cGRhdGUgcXVldWUuIEhvd2V2ZXIsIHRoZXJlJ3MgYW4gZXhjZXB0aW9uOiBTaW1wbGVNZW1vQ29tcG9uZW50XG4gIC8vIHNvbWV0aW1lcyBiYWlscyBvdXQgbGF0ZXIgaW4gdGhlIGJlZ2luIHBoYXNlLiBUaGlzIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAvLyBtb3ZlIHRoaXMgYXNzaWdubWVudCBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIGFuZCBpbnRvIGVhY2ggYnJhbmNoLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuICAgICAgICByZXR1cm4gbW91bnRMYXp5Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciB1bnJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciByZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IENvbXBvbmVudCA/IHVucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCB1bnJlc29sdmVkUHJvcHMpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudCA/IF91bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQsIF91bnJlc29sdmVkUHJvcHMpO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudCwgX3Jlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IF90eXBlMi5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZTIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMi50eXBlLCBfcmVzb2x2ZWRQcm9wczMpO1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX3R5cGUyLCBfcmVzb2x2ZWRQcm9wczMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQyID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQyLCBfdW5yZXNvbHZlZFByb3BzNCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gXCIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFRhZyB0aGUgZmliZXIgd2l0aCBhbiB1cGRhdGUgZWZmZWN0LiBUaGlzIHR1cm5zIGEgUGxhY2VtZW50IGludG9cbiAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKSB7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICB9XG59XG5cbnZhciBhcHBlbmRBbGxDaGlsZHJlbjtcbnZhciB1cGRhdGVIb3N0Q29udGFpbmVyO1xudmFyIHVwZGF0ZUhvc3RDb21wb25lbnQkMTtcbnZhciB1cGRhdGVIb3N0VGV4dCQxO1xuXG57XG4gIC8vIE11dGF0aW9uIG1vZGVcbiAgYXBwZW5kQWxsQ2hpbGRyZW4gPSBmdW5jdGlvbiAocGFyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmVlZHNWaXNpYmlsaXR5VG9nZ2xlLCBpc0hpZGRlbikge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGNyZWF0ZWQgYnV0IHdlIG5lZWQgcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RDb250YWluZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHsvLyBOb29wXG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbXBvbmVudCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWQgdG9cbiAgICAvLyBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIEluIG11dGF0aW9uIG1vZGUsIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYSBiYWlsb3V0IGJlY2F1c2VcbiAgICAgIC8vIHdlIHdvbid0IHRvdWNoIHRoaXMgbm9kZSBldmVuIGlmIGNoaWxkcmVuIGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBnZXQgdXBkYXRlZCBiZWNhdXNlIG9uZSBvZiBvdXIgY2hpbGRyZW4gdXBkYXRlZCwgd2UgZG9uJ3RcbiAgICAvLyBoYXZlIG5ld1Byb3BzIHNvIHdlJ2xsIGhhdmUgdG8gcmV1c2UgdGhlbS5cbiAgICAvLyBUT0RPOiBTcGxpdCB0aGUgdXBkYXRlIEFQSSBhcyBzZXBhcmF0ZSBmb3IgdGhlIHByb3BzIHZzLiBjaGlsZHJlbi5cbiAgICAvLyBFdmVuIGJldHRlciB3b3VsZCBiZSBpZiBjaGlsZHJlbiB3ZXJlbid0IHNwZWNpYWwgY2FzZWQgYXQgYWxsIHRoby5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpOyAvLyBUT0RPOiBFeHBlcmllbmNpbmcgYW4gZXJyb3Igd2hlcmUgb2xkUHJvcHMgaXMgbnVsbC4gU3VnZ2VzdHMgYSBob3N0XG4gICAgLy8gY29tcG9uZW50IGlzIGhpdHRpbmcgdGhlIHJlc3VtZSBwYXRoLiBGaWd1cmUgb3V0IHdoeS4gUG9zc2libHlcbiAgICAvLyByZWxhdGVkIHRvIGBoaWRkZW5gLlxuXG4gICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBwcmVwYXJlVXBkYXRlKGluc3RhbmNlLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAgIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaXMgZG9uZSBpbiBjb21taXRXb3JrLlxuXG4gICAgaWYgKHVwZGF0ZVBheWxvYWQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0VGV4dCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBvbGRUZXh0LCBuZXdUZXh0KSB7XG4gICAgLy8gSWYgdGhlIHRleHQgZGlmZmVycywgbWFyayBpdCBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpbiBkb25lIGluIGNvbW1pdFdvcmsuXG4gICAgaWYgKG9sZFRleHQgIT09IG5ld1RleHQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2spIHtcbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAvLyBJZiB3ZSdyZSBoeWRyYXRpbmcsIHdlIHNob3VsZCBjb25zdW1lIGFzIG1hbnkgaXRlbXMgYXMgd2UgY2FuXG4gICAgLy8gc28gd2UgZG9uJ3QgbGVhdmUgYW55IGJlaGluZC5cbiAgICByZXR1cm47XG4gIH1cblxuICBzd2l0Y2ggKHJlbmRlclN0YXRlLnRhaWxNb2RlKSB7XG4gICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgIHtcbiAgICAgICAgLy8gQW55IGluc2VydGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgdGFpbCBsaXN0IGFmdGVyIHRoaXMgcG9pbnRcbiAgICAgICAgLy8gc2hvdWxkIGJlIGludmlzaWJsZS4gSWYgdGhlcmUgYXJlIGFscmVhZHkgbW91bnRlZCBib3VuZGFyaWVzXG4gICAgICAgIC8vIGFueXRoaW5nIGJlZm9yZSB0aGVtIGFyZSBub3QgY29uc2lkZXJlZCBmb3IgY29sbGFwc2luZy5cbiAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgd2hvbGUgdGFpbCB0byBmaW5kIGlmXG4gICAgICAgIC8vIHRoZXJlIGFyZSBhbnkuXG4gICAgICAgIHZhciB0YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBsYXN0VGFpbE5vZGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlICh0YWlsTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxhc3RUYWlsTm9kZSA9IHRhaWxOb2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRhaWxOb2RlID0gdGFpbE5vZGUuc2libGluZztcbiAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS5cblxuXG4gICAgICAgIGlmIChsYXN0VGFpbE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSB0YWlsIGFyZSBpbnNlcnRpb25zLlxuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIGxhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSAnY29sbGFwc2VkJzpcbiAgICAgIHtcbiAgICAgICAgLy8gQW55IGluc2VydGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgdGFpbCBsaXN0IGFmdGVyIHRoaXMgcG9pbnRcbiAgICAgICAgLy8gc2hvdWxkIGJlIGludmlzaWJsZS4gSWYgdGhlcmUgYXJlIGFscmVhZHkgbW91bnRlZCBib3VuZGFyaWVzXG4gICAgICAgIC8vIGFueXRoaW5nIGJlZm9yZSB0aGVtIGFyZSBub3QgY29uc2lkZXJlZCBmb3IgY29sbGFwc2luZy5cbiAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgd2hvbGUgdGFpbCB0byBmaW5kIGlmXG4gICAgICAgIC8vIHRoZXJlIGFyZSBhbnkuXG4gICAgICAgIHZhciBfdGFpbE5vZGUgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICB2YXIgX2xhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKF90YWlsTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChfdGFpbE5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBfbGFzdFRhaWxOb2RlID0gX3RhaWxOb2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90YWlsTm9kZSA9IF90YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKF9sYXN0VGFpbE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSB0YWlsIGFyZSBpbnNlcnRpb25zLlxuICAgICAgICAgIGlmICghaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrICYmIHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdlIHN1c3BlbmRlZCBkdXJpbmcgdGhlIGhlYWQuIFdlIHdhbnQgdG8gc2hvdyBhdCBsZWFzdCBvbmVcbiAgICAgICAgICAgIC8vIHJvdyBhdCB0aGUgdGFpbC4gU28gd2UnbGwga2VlcCBvbiBhbmQgY3V0IG9mZiB0aGUgcmVzdC5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZXRhY2ggdGhlIGluc2VydGlvbiBhZnRlciB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbnNlcnRlZC5cbiAgICAgICAgICBfbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYnViYmxlUHJvcGVydGllcyhjb21wbGV0ZWRXb3JrKSB7XG4gIHZhciBkaWRCYWlsb3V0ID0gY29tcGxldGVkV29yay5hbHRlcm5hdGUgIT09IG51bGwgJiYgY29tcGxldGVkV29yay5hbHRlcm5hdGUuY2hpbGQgPT09IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG4gIHZhciBuZXdDaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG5cbiAgaWYgKCFkaWRCYWlsb3V0KSB7XG4gICAgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG4gICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIHByb2ZpbGluZyBtb2RlLCByZXNldENoaWxkRXhwaXJhdGlvblRpbWUgaXMgYWxzbyB1c2VkIHRvIHJlc2V0XG4gICAgICAvLyBwcm9maWxlciBkdXJhdGlvbnMuXG4gICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgdmFyIHRyZWVCYXNlRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhjaGlsZC5sYW5lcywgY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gY2hpbGQuc3VidHJlZUZsYWdzO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gY2hpbGQuZmxhZ3M7IC8vIFdoZW4gYSBmaWJlciBpcyBjbG9uZWQsIGl0cyBhY3R1YWxEdXJhdGlvbiBpcyByZXNldCB0byAwLiBUaGlzIHZhbHVlIHdpbGxcbiAgICAgICAgLy8gb25seSBiZSB1cGRhdGVkIGlmIHdvcmsgaXMgZG9uZSBvbiB0aGUgZmliZXIgKGkuZS4gaXQgZG9lc24ndCBiYWlsb3V0KS5cbiAgICAgICAgLy8gV2hlbiB3b3JrIGlzIGRvbmUsIGl0IHNob3VsZCBidWJibGUgdG8gdGhlIHBhcmVudCdzIGFjdHVhbER1cmF0aW9uLiBJZlxuICAgICAgICAvLyB0aGUgZmliZXIgaGFzIG5vdCBiZWVuIGNsb25lZCB0aG91Z2gsIChtZWFuaW5nIG5vIHdvcmsgd2FzIGRvbmUpLCB0aGVuXG4gICAgICAgIC8vIHRoaXMgdmFsdWUgd2lsbCByZWZsZWN0IHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCB3b3JraW5nIG9uIGEgcHJldmlvdXNcbiAgICAgICAgLy8gcmVuZGVyLiBJbiB0aGF0IGNhc2UgaXQgc2hvdWxkIG5vdCBidWJibGUuIFdlIGRldGVybWluZSB3aGV0aGVyIGl0IHdhc1xuICAgICAgICAvLyBjbG9uZWQgYnkgY29tcGFyaW5nIHRoZSBjaGlsZCBwb2ludGVyLlxuXG4gICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB0cmVlQmFzZUR1cmF0aW9uICs9IGNoaWxkLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cblxuICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uO1xuICAgICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gdHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQubGFuZXMsIF9jaGlsZC5jaGlsZExhbmVzKSk7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQuc3VidHJlZUZsYWdzO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLmZsYWdzOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlXG4gICAgICAgIC8vIHNtZWxsIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGUgY29tbWl0IHBoYXNlIGlzIG5ldmVyIGNvbmN1cnJlbnQgd2l0aFxuICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC5cblxuICAgICAgICBfY2hpbGQucmV0dXJuID0gY29tcGxldGVkV29yaztcbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzO1xuICB9IGVsc2Uge1xuICAgIC8vIEJ1YmJsZSB1cCB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lLlxuICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgICAgLy8gcHJvZmlsZXIgZHVyYXRpb25zLlxuICAgICAgdmFyIF90cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgdmFyIF9jaGlsZDIgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkMiAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZDIubGFuZXMsIF9jaGlsZDIuY2hpbGRMYW5lcykpOyAvLyBcIlN0YXRpY1wiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0byxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXJcbiAgICAgICAgLy8gZmxhZ3MgaGF2ZSBhIGxpZmV0aW1lIG9ubHkgb2YgYSBzaW5nbGUgcmVuZGVyICsgY29tbWl0LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaWdub3JlIHRoZW0uXG5cbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuZmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBfdHJlZUJhc2VEdXJhdGlvbiArPSBfY2hpbGQyLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIF9jaGlsZDIgPSBfY2hpbGQyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IF90cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NoaWxkMyA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQzICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkMy5sYW5lcywgX2NoaWxkMy5jaGlsZExhbmVzKSk7IC8vIFwiU3RhdGljXCIgZmxhZ3Mgc2hhcmUgdGhlIGxpZmV0aW1lIG9mIHRoZSBmaWJlci9ob29rIHRoZXkgYmVsb25nIHRvLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgYnViYmxlIHRob3NlIHVwIGV2ZW4gZHVyaW5nIGEgYmFpbG91dC4gQWxsIHRoZSBvdGhlclxuICAgICAgICAvLyBmbGFncyBoYXZlIGEgbGlmZXRpbWUgb25seSBvZiBhIHNpbmdsZSByZW5kZXIgKyBjb21taXQsIHNvIHdlIHNob3VsZFxuICAgICAgICAvLyBpZ25vcmUgdGhlbS5cblxuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMy5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMy5mbGFncyAmIFN0YXRpY01hc2s7IC8vIFVwZGF0ZSB0aGUgcmV0dXJuIHBvaW50ZXIgc28gdGhlIHRyZWUgaXMgY29uc2lzdGVudC4gVGhpcyBpcyBhIGNvZGVcbiAgICAgICAgLy8gc21lbGwgYmVjYXVzZSBpdCBhc3N1bWVzIHRoZSBjb21taXQgcGhhc2UgaXMgbmV2ZXIgY29uY3VycmVudCB3aXRoXG4gICAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuIFdpbGwgYWRkcmVzcyBkdXJpbmcgcmVmYWN0b3IgdG8gYWx0ZXJuYXRlIG1vZGVsLlxuXG4gICAgICAgIF9jaGlsZDMucmV0dXJuID0gY29tcGxldGVkV29yaztcbiAgICAgICAgX2NoaWxkMyA9IF9jaGlsZDMuc2libGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7XG4gIH1cblxuICBjb21wbGV0ZWRXb3JrLmNoaWxkTGFuZXMgPSBuZXdDaGlsZExhbmVzO1xuICByZXR1cm4gZGlkQmFpbG91dDtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFN0YXRlKSB7XG4gIGlmIChoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkgJiYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlciB8IEluY29tcGxldGUgfCBTaG91bGRDYXB0dXJlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAobmV4dFN0YXRlICE9PSBudWxsICYmIG5leHRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgLy8gV2UgbWlnaHQgYmUgaW5zaWRlIGEgaHlkcmF0aW9uIHN0YXRlIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHBpY2tpbmcgdXAgdGhpc1xuICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LCBhbmQgYWxzbyBhZnRlciB3ZSd2ZSByZWVudGVyZWQgaXQgZm9yIGZ1cnRoZXIgaHlkcmF0aW9uLlxuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBpZiAoIXdhc0h5ZHJhdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudCB3YXMgY29tcGxldGVkIHdpdGhvdXQgYSBoeWRyYXRlZCBub2RlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHByZXBhcmVUb0h5ZHJhdGVIb3N0U3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAge1xuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIHZhciBpc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoaXNUaW1lZE91dFN1c3BlbnNlKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAocHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgcmVlbnRlcmVkIHRoaXMgYm91bmRhcnkgdG8gaHlkcmF0ZSBpdC4gSWYgc28sIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGh5ZHJhdGlvblxuICAgICAgLy8gc3RhdGUgc2luY2Ugd2UncmUgbm93IGV4aXRpbmcgb3V0IG9mIGl0LiBwb3BIeWRyYXRpb25TdGF0ZSBkb2Vzbid0IGRvIHRoYXQgZm9yIHVzLlxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuXG4gICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBib3VuZGFyeSBkaWQgbm90IHN1c3BlbmQgc28gaXQncyBub3cgaHlkcmF0ZWQgYW5kIHVuc3VzcGVuZGVkLlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQsIHdlIG5lZWQgdG8gc2NoZWR1bGUgYW4gZWZmZWN0IHRvIG1hcmsgdGhpcyBib3VuZGFyeVxuICAgICAgLy8gYXMgaGF2aW5nIGh5ZHJhdGVkIHNvIGV2ZW50cyBrbm93IHRoYXQgdGhleSdyZSBmcmVlIHRvIGJlIGludm9rZWQuXG4gICAgICAvLyBJdCdzIGFsc28gYSBzaWduYWwgdG8gcmVwbGF5IGV2ZW50cyBhbmQgdGhlIHN1c3BlbnNlIGNhbGxiYWNrLlxuICAgICAgLy8gSWYgc29tZXRoaW5nIHN1c3BlbmRlZCwgc2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCByZXRyeSBsaXN0ZW5lcnMuXG4gICAgICAvLyBTbyB3ZSBtaWdodCBhcyB3ZWxsIGFsd2F5cyBtYXJrIHRoaXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICB2YXIgX2lzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChfaXNUaW1lZE91dFN1c3BlbnNlKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKF9wcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IF9wcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhpcyB0cmVlLiBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLFxuICAgIC8vIHRoZXJlIG1heSBoYXZlIGJlZW4gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb25cbiAgICAvLyBhdHRlbXB0LiBJZiBzbywgYWRkIHRoZW0gdG8gYSBxdWV1ZSBzbyB3ZSBjYW4gbG9nIHRoZW0gaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlLlxuICAgIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCk7IC8vIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgU3VzcGVuc2UgcGF0aFxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuXG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgY2FzZSBNb2RlOlxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgZmliZXJSb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG5cbiAgICAgICAgaWYgKGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgIGZpYmVyUm9vdC5jb250ZXh0ID0gZmliZXJSb290LnBlbmRpbmdDb250ZXh0O1xuICAgICAgICAgIGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHBvcCBzbyB0aGF0IHdlIGNhbiBkZWxldGUgYW55IHJlbWFpbmluZyBjaGlsZHJlblxuICAgICAgICAgIC8vIHRoYXQgd2VyZW4ndCBoeWRyYXRlZC5cbiAgICAgICAgICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCB0aGVuIHdlJ2xsIG5lZWQgdG8gc2NoZWR1bGUgYW4gdXBkYXRlIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNvbW1pdCBzaWRlLWVmZmVjdHMgb24gdGhlIHJvb3QuXG4gICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGllbnQgcm9vdFxuICAgICAgICAgICAgICAhcHJldlN0YXRlLmlzRGVoeWRyYXRlZCB8fCAvLyBDaGVjayBpZiB3ZSByZXZlcnRlZCB0byBjbGllbnQgcmVuZGVyaW5nIChlLmcuIGR1ZSB0byBhbiBlcnJvcilcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9yY2VDbGllbnRSZW5kZXIpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGNsZWFyIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzdGFydCBvZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbW1pdC4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIG9mIFJlYWN0IHJlbmRlcmluZyBpbnRvIGFcbiAgICAgICAgICAgICAgICAvLyBjb250YWluZXIgd2l0aCBwcmV2aW91cyBjaGlsZHJlbi4gSXQncyBhbHNvIHNhZmUgdG8gZG8gZm9yXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlcyB0b28sIGJlY2F1c2UgY3VycmVudC5jaGlsZCB3b3VsZCBvbmx5IGJlIG51bGwgaWYgdGhlXG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgcmVuZGVyIHdhcyBudWxsIChzbyB0aGUgY29udGFpbmVyIHdvdWxkIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBiZSBlbXB0eSkuXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7IC8vIElmIHRoaXMgd2FzIGEgZm9yY2VkIGNsaWVudCByZW5kZXIsIHRoZXJlIG1heSBoYXZlIGJlZW5cbiAgICAgICAgICAgICAgICAvLyByZWNvdmVyYWJsZSBlcnJvcnMgZHVyaW5nIGZpcnN0IGh5ZHJhdGlvbiBhdHRlbXB0LiBJZiBzbywgYWRkXG4gICAgICAgICAgICAgICAgLy8gdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGUgY29tbWl0IHBoYXNlLlxuXG4gICAgICAgICAgICAgICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdXBkYXRlSG9zdENvbXBvbmVudCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50LnJlZiAhPT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfSAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuXG5cbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3JcbiAgICAgICAgICAvLyBib3R0b20tPnVwLiBUb3AtPmRvd24gaXMgZmFzdGVyIGluIElFMTEuXG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGFuZCBjcmVhdGVJbnN0YW5jZSBzdGVwIGludG8gdGhlIGJlZ2luUGhhc2VcbiAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLlxuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KSkge1xuICAgICAgICAgICAgICAvLyBJZiBjaGFuZ2VzIHRvIHRoZSBoeWRyYXRlZCBub2RlIG5lZWQgdG8gYmUgYXBwbGllZCBhdCB0aGVcbiAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLlxuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LlxuICAgICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBzdXBwb3J0cyBhdXRvLWZvY3VzIGZvciBjZXJ0YWluIGVsZW1lbnRzKS5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzdWNoIHJlbmRlcmVycyBnZXQgc2NoZWR1bGVkIGZvciBsYXRlciB3b3JrLlxuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgbmV3VGV4dCA9IG5ld1Byb3BzO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7IC8vIElmIHdlIGhhdmUgYW4gYWx0ZXJuYXRlLCB0aGF0IG1lYW5zIHRoaXMgaXMgYW4gdXBkYXRlIGFuZCB3ZSBuZWVkXG4gICAgICAgICAgLy8gdG8gc2NoZWR1bGUgYSBzaWRlLWVmZmVjdCB0byBkbyB0aGUgdXBkYXRlcy5cblxuICAgICAgICAgIHVwZGF0ZUhvc3RUZXh0JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV3VGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQyKSB7XG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjcmVhdGVUZXh0SW5zdGFuY2UobmV3VGV4dCwgX3Jvb3RDb250YWluZXJJbnN0YW5jZSwgX2N1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlOyAvLyBTcGVjaWFsIHBhdGggZm9yIGRlaHlkcmF0ZWQgYm91bmRhcmllcy4gV2UgbWF5IGV2ZW50dWFsbHkgbW92ZSB0aGlzXG4gICAgICAgIC8vIHRvIGl0cyBvd24gZmliZXIgdHlwZSBzbyB0aGF0IHdlIGNhbiBhZGQgb3RoZXIga2luZHMgb2YgaHlkcmF0aW9uXG4gICAgICAgIC8vIGJvdW5kYXJpZXMgdGhhdCBhcmVuJ3QgYXNzb2NpYXRlZCB3aXRoIGEgU3VzcGVuc2UgdHJlZS4gSW4gYW50aWNpcGF0aW9uXG4gICAgICAgIC8vIG9mIHN1Y2ggYSByZWZhY3RvciwgYWxsIHRoZSBoeWRyYXRpb24gbG9naWMgaXMgY29udGFpbmVkIGluXG4gICAgICAgIC8vIHRoaXMgYnJhbmNoLlxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBmYWxsdGhyb3VnaFRvTm9ybWFsU3VzcGVuc2VQYXRoID0gY29tcGxldGVEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFN0YXRlKTtcblxuICAgICAgICAgIGlmICghZmFsbHRocm91Z2hUb05vcm1hbFN1c3BlbnNlUGF0aCkge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UuIFRoZXJlIHdlcmUgcmVtYWluaW5nIHVuaHlkcmF0ZWQgbm9kZXMuIFdlIHRyZWF0XG4gICAgICAgICAgICAgIC8vIHRoaXMgYXMgYSBtaXNtYXRjaC4gUmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXG4gICAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIERpZCBub3QgZmluaXNoIGh5ZHJhdGluZywgZWl0aGVyIGJlY2F1c2UgdGhpcyBpcyB0aGUgaW5pdGlhbFxuICAgICAgICAgICAgICAvLyByZW5kZXIgb3IgYmVjYXVzZSBzb21ldGhpbmcgc3VzcGVuZGVkLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIENvbnRpbnVlIHdpdGggdGhlIG5vcm1hbCBTdXNwZW5zZSBwYXRoLlxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkLiBSZS1yZW5kZXIgd2l0aCB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lczsgLy8gRG8gbm90IHJlc2V0IHRoZSBlZmZlY3QgbGlzdC5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIC8vIGEgcGFzc2l2ZSBlZmZlY3QsIHdoaWNoIGlzIHdoZW4gd2UgcHJvY2VzcyB0aGUgdHJhbnNpdGlvbnNcblxuXG4gICAgICAgIGlmIChuZXh0RGlkVGltZW91dCAhPT0gcHJldkRpZFRpbWVvdXQpIHtcbiAgICAgICAgICAvLyBhbiBlZmZlY3QgdG8gdG9nZ2xlIHRoZSBzdWJ0cmVlJ3MgdmlzaWJpbGl0eS4gV2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIGZhbGxiYWNrIC0+IHByaW1hcnksIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgc2NoZWR1bGVzIHRoaXMgZWZmZWN0XG4gICAgICAgICAgLy8gYXMgcGFydCBvZiBpdHMgbm9ybWFsIGNvbXBsZXRlIHBoYXNlLiBCdXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIHByaW1hcnkgLT4gZmFsbGJhY2ssIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgZG9lcyBub3QgaGF2ZSBhIGNvbXBsZXRlXG4gICAgICAgICAgLy8gcGhhc2UuIFNvIHdlIG5lZWQgdG8gc2NoZWR1bGUgaXRzIGVmZmVjdCBoZXJlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgYWxzbyB1c2UgdGhpcyBmbGFnIHRvIGNvbm5lY3QvZGlzY29ubmVjdCB0aGUgZWZmZWN0cywgYnV0IHRoZSBzYW1lXG4gICAgICAgICAgLy8gbG9naWMgYXBwbGllczogd2hlbiByZS1jb25uZWN0aW5nLCB0aGUgT2Zmc2NyZWVuIGZpYmVyJ3MgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZSB3aWxsIGhhbmRsZSBzY2hlZHVsaW5nIHRoZSBlZmZlY3QuIEl0J3Mgb25seSB3aGVuIHRoZSBmYWxsYmFja1xuICAgICAgICAgIC8vIGlzIGFjdGl2ZSB0aGF0IHdlIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC5cblxuXG4gICAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICB2YXIgX29mZnNjcmVlbkZpYmVyMiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgX29mZnNjcmVlbkZpYmVyMi5mbGFncyB8PSBWaXNpYmlsaXR5OyAvLyBUT0RPOiBUaGlzIHdpbGwgc3RpbGwgc3VzcGVuZCBhIHN5bmNocm9ub3VzIHRyZWUgaWYgYW55dGhpbmdcbiAgICAgICAgICAgIC8vIGluIHRoZSBjb25jdXJyZW50IHRyZWUgYWxyZWFkeSBzdXNwZW5kZWQgZHVyaW5nIHRoaXMgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cblxuICAgICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGJhY2sgdG8gdGhyb3dFeGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIHRvbyBsYXRlXG4gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBsYXJnZSB0cmVlIHdoaWNoIGlzIGNvbW1vbiBmb3IgaW5pdGlhbCBsb2Fkcy4gV2VcbiAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAgIC8vIHRoaXMgbWFya2VyLCBhbmQgdGhpcyBpcyB0b28gbGF0ZS5cbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyByZW5kZXIgYWxyZWFkeSBoYWQgYSBwaW5nIG9yIGxvd2VyIHByaSB1cGRhdGVzLFxuICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gaW1tZWRpYXRlbHkgcmVzdGFydCBmcm9tIHdpdGhpbiB0aHJvd0V4Y2VwdGlvbi5cbiAgICAgICAgICAgICAgdmFyIGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCA9IGN1cnJlbnQgPT09IG51bGwgJiYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUgfHwgIWVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2spO1xuXG4gICAgICAgICAgICAgIGlmIChoYXNJbnZpc2libGVDaGlsZENvbnRleHQgfHwgaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGluIGFuIGludmlzaWJsZSB0cmVlIG9yIGEgbmV3IHJlbmRlciwgdGhlbiBzaG93aW5nXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIGZvciBsb25nZXIgaWYgcG9zc2libGUuXG4gICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdha2VhYmxlcyA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIGEgcmV0cnkgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UuXG4gICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICBwcmVwYXJlUG9ydGFsTW91bnQod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgfVxuXG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gU2FtZSBhcyBjbGFzcyBjb21wb25lbnQgY2FzZS4gSSBwdXQgaXQgZG93biBoZXJlIHNvIHRoYXQgdGhlIHRhZ3MgYXJlXG4gICAgICAgIC8vIHNlcXVlbnRpYWwgdG8gZW5zdXJlIHRoaXMgc3dpdGNoIGlzIGNvbXBpbGVkIHRvIGEganVtcCB0YWJsZS5cbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihfQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVuYWJsZXMuIEluc3RlYWQsIHdlJ2xsIHRyYW5zZmVyIGl0cyB0aGVuYWJsZXMgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBTdXNwZW5zZUxpc3Qgc28gdGhhdCBpdCBjYW4gcmV0cnkgaWYgdGhleSByZXNvbHZlLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgb2YgdGhlc2UgaW4gdGhlIGxpc3QgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgICAgICAgICAgICAvLyBnb2luZyB0byB3YWl0IGZvciBhbGwgb2YgdGhlbSBhbnl3YXksIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlclxuICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggb25lcyBnZXRzIHRvIHBpbmcuIEluIHRoZW9yeSB3ZSBjb3VsZCBnZXQgY2xldmVyIGFuZCBrZWVwXG4gICAgICAgICAgICAgICAgICAvLyB0cmFjayBvZiBob3cgbWFueSBkZXBlbmRlbmNpZXMgcmVtYWluIGJ1dCBpdCBnZXRzIHRyaWNreSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWVhbnRpbWUsIHdlIGNhbiBhZGQvcmVtb3ZlL2NoYW5nZSBpdGVtcyBhbmQgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmFpbCBvdXQgb2YgdGhlIGxvb3AgYmVmb3JlIGZpbmRpbmcgYW55IGJ1dCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IG1hdHRlciBzaW5jZSB0aGF0IG1lYW5zIHRoYXQgdGhlIG90aGVyIGJvdW5kYXJpZXMgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd2UgZGlkIGZpbmQgYWxyZWFkeSBoYXMgdGhlaXIgbGlzdGVuZXJzIGF0dGFjaGVkLlxuXG4gICAgICAgICAgICAgICAgICB2YXIgbmV3VGhlbmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgICAgICB9IC8vIFJlcmVuZGVyIHRoZSB3aG9sZSBsaXN0LCBidXQgdGhpcyB0aW1lLCB3ZSdsbCBmb3JjZSBmYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJlZm9yZSBkb2luZyB0aGUgc2Vjb25kIHBhc3Mgc2luY2UgdGhhdCdzIG5vdyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNoaWxkIGZpYmVycyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZS5cblxuXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICAgICAgICAgICAgcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOyAvLyBTZXQgdXAgdGhlIFN1c3BlbnNlIENvbnRleHQgdG8gZm9yY2Ugc3VzcGVuc2UgYW5kIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAvLyByZXJlbmRlciB0aGUgY2hpbGRyZW4uXG5cbiAgICAgICAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spKTsgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwgJiYgbm93KCkgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGJ1dCB3ZSBzdGlsbCBoYXZlIHJvd3NcbiAgICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgdGFpbC4gV2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gcmVuZGVyXG4gICAgICAgICAgICAgIC8vIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGUgdGFpbC5cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgcmVuZGVyZWQgcm93IHRvIHRoZSBjaGlsZCBsaXN0LlxuICAgICAgICAgIGlmICghZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIHZhciBfc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJlbmRlcmVkVGFpbCk7XG5cbiAgICAgICAgICAgIGlmIChfc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTsgLy8gRW5zdXJlIHdlIHRyYW5zZmVyIHRoZSB1cGRhdGUgcXVldWUgdG8gdGhlIHBhcmVudCBzbyB0aGF0IGl0IGRvZXNuJ3RcbiAgICAgICAgICAgICAgLy8gZ2V0IGxvc3QgaWYgdGhpcyByb3cgZW5kcyB1cCBkcm9wcGVkIGR1cmluZyBhIHNlY29uZCBwYXNzLlxuXG4gICAgICAgICAgICAgIHZhciBfbmV3VGhlbmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gX25ld1RoZW5hYmxlcztcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIHRydWUpOyAvLyBUaGlzIG1pZ2h0IGhhdmUgYmVlbiBtb2RpZmllZC5cblxuICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCA9PT0gbnVsbCAmJiByZW5kZXJTdGF0ZS50YWlsTW9kZSA9PT0gJ2hpZGRlbicgJiYgIXJlbmRlcmVkVGFpbC5hbHRlcm5hdGUgJiYgIWdldElzSHlkcmF0aW5nKCkgLy8gV2UgZG9uJ3QgY3V0IGl0IGlmIHdlJ3JlIGh5ZHJhdGluZy5cbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSdyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCAvLyBUaGUgdGltZSBpdCB0b29rIHRvIHJlbmRlciBsYXN0IHJvdyBpcyBncmVhdGVyIHRoYW4gdGhlIHJlbWFpbmluZ1xuICAgICAgICAgICAgLy8gdGltZSB3ZSBoYXZlIHRvIHJlbmRlci4gU28gcmVuZGVyaW5nIG9uZSBtb3JlIHJvdyB3b3VsZCBsaWtlbHlcbiAgICAgICAgICAgIC8vIGV4Y2VlZCBpdC5cbiAgICAgICAgICAgIG5vdygpICogMiAtIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSAmJiByZW5kZXJMYW5lcyAhPT0gT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdyBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBhbmQgd2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXJcbiAgICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdG8gcmVuZGVyIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGlzIHVzdWFsbHkgZmFzdGVyLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcykge1xuICAgICAgICAgICAgLy8gVGhlIGVmZmVjdCBsaXN0IG9mIHRoZSBiYWNrd2FyZHMgdGFpbCB3aWxsIGhhdmUgYmVlbiBhZGRlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIGVuZC4gVGhpcyBicmVha3MgdGhlIGd1YXJhbnRlZSB0aGF0IGxpZmUtY3ljbGVzIGZpcmUgaW5cbiAgICAgICAgICAgIC8vIHNpYmxpbmcgb3JkZXIgYnV0IHRoYXQgaXNuJ3QgYSBzdHJvbmcgZ3VhcmFudGVlIHByb21pc2VkIGJ5IFJlYWN0LlxuICAgICAgICAgICAgLy8gRXNwZWNpYWxseSBzaW5jZSB0aGVzZSBtaWdodCBhbHNvIGp1c3QgcG9wIGluIGR1cmluZyBmdXR1cmUgY29tbWl0cy5cbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICAgICAgICAgICAgcmVuZGVyZWRUYWlsLnNpYmxpbmcgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gcmVuZGVyU3RhdGUubGFzdDtcblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpYmxpbmcuc2libGluZyA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0ID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSB0YWlsIHJvd3MgdG8gcmVuZGVyLlxuICAgICAgICAgIC8vIFBvcCBhIHJvdy5cbiAgICAgICAgICB2YXIgbmV4dCA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbmV4dDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbmV4dC5zaWJsaW5nO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgICAgIG5leHQuc2libGluZyA9IG51bGw7IC8vIFJlc3RvcmUgdGhlIGNvbnRleHQuXG4gICAgICAgICAgLy8gVE9ETzogV2UgY2FuIHByb2JhYmx5IGp1c3QgYXZvaWQgcG9wcGluZyBpdCBpbnN0ZWFkIGFuZCBvbmx5XG4gICAgICAgICAgLy8gc2V0dGluZyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBnbyBmcm9tIG5vdCBzdXNwZW5kZWQgdG8gc3VzcGVuZGVkLlxuXG4gICAgICAgICAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcblxuICAgICAgICAgIGlmIChkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gRG8gYSBwYXNzIG92ZXIgdGhlIG5leHQgcm93LlxuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBfbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX3ByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgcHJldklzSGlkZGVuID0gX3ByZXZTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChwcmV2SXNIaWRkZW4gIT09IG5leHRJc0hpZGRlbiAmJiAoIC8vIExlZ2FjeUhpZGRlbiBkb2Vzbid0IGRvIGFueSBoaWRpbmcg4oCUIGl0IG9ubHkgcHJlLXJlbmRlcnMuXG4gICAgICAgICAgIWVuYWJsZUxlZ2FjeUhpZGRlbiApKSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBWaXNpYmlsaXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV4dElzSGlkZGVuIHx8ICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBmb3IgaGlkZGVuIGNoaWxkcmVuIHVubGVzcyB3ZSdyZSByZW5kZXJpbmdcbiAgICAgICAgICAvLyBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuXG4gICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoc3VidHJlZVJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGFuIGluc2VydGlvbiBvciB1cGRhdGUgaW4gdGhlIGhpZGRlbiBzdWJ0cmVlLlxuICAgICAgICAgICAgICAvLyBJZiBzbywgd2UgbmVlZCB0byBoaWRlIHRob3NlIG5vZGVzIGluIHRoZSBjb21taXQgcGhhc2UsIHNvXG4gICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGEgdmlzaWJpbGl0eSBlZmZlY3QuXG4gICAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICYgKFBsYWNlbWVudCB8IFVwZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBWaXNpYmlsaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBcIiArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIHVud2luZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcbiAgICAgICAgdmFyIF9mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmICgoX2ZsYWdzICYgU2hvdWxkQ2FwdHVyZSkgIT09IE5vRmxhZ3MgJiYgKF9mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyByZW5kZXIgdGhhdCB3YXNuJ3QgY2FwdHVyZWQgYnkgYSBzdXNwZW5zZVxuICAgICAgICAgIC8vIGJvdW5kYXJ5LiBEbyBhIHNlY29uZCBwYXNzIG9uIHRoZSByb290IHRvIHVubW91bnQgdGhlIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfSAvLyBXZSB1bndvdW5kIHRvIHRoZSByb290IHdpdGhvdXQgY29tcGxldGluZyBpdC4gRXhpdC5cblxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBUT0RPOiBwb3BIeWRyYXRpb25TdGF0ZVxuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsICYmIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhyZXcgaW4gbmV3bHkgbW91bnRlZCBkZWh5ZHJhdGVkIGNvbXBvbmVudC4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gJyArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9mbGFnczIgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoX2ZsYWdzMiAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFnczIgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7IC8vIENhcHR1cmVkIGEgc3VzcGVuc2UgZWZmZWN0LiBSZS1yZW5kZXIgdGhlIGJvdW5kYXJ5LlxuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpOyAvLyBTdXNwZW5zZUxpc3QgZG9lc24ndCBhY3R1YWxseSBjYXRjaCBhbnl0aGluZy4gSXQgc2hvdWxkJ3ZlIGJlZW5cbiAgICAgICAgLy8gY2F1Z2h0IGJ5IGEgbmVzdGVkIGJvdW5kYXJ5LiBJZiBub3QsIGl0IHNob3VsZCBidWJibGUgdGhyb3VnaC5cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmssIHJlbmRlckxhbmVzKSB7XG4gIC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuICBwb3BUcmVlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuXG4gIHN3aXRjaCAoaW50ZXJydXB0ZWRXb3JrLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IGludGVycnVwdGVkV29yay50eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuXG4gICAgICAgIGlmIChjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcG9wQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IGludGVycnVwdGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgY29udGV4dCA9IGludGVycnVwdGVkV29yay50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBwb3BSZW5kZXJMYW5lcyhpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbnVsbDtcblxue1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG5ldyBTZXQoKTtcbn0gLy8gVXNlZCBkdXJpbmcgdGhlIGNvbW1pdCBwaGFzZSB0byB0cmFjayB0aGUgc3RhdGUgb2YgdGhlIE9mZnNjcmVlbiBjb21wb25lbnQgc3RhY2suXG4vLyBBbGxvd3MgdXMgdG8gYXZvaWQgdHJhdmVyc2luZyB0aGUgcmV0dXJuIHBhdGggdG8gZmluZCB0aGUgbmVhcmVzdCBPZmZzY3JlZW4gYW5jZXN0b3IuXG4vLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVTdXNwZW5zZUxheW91dEVmZmVjdFNlbWFudGljcyBpcyBlbmFibGVkLlxuXG5cbnZhciBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBmYWxzZTtcbnZhciBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gZmFsc2U7XG52YXIgUG9zc2libHlXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgPyBXZWFrU2V0IDogU2V0O1xudmFyIG5leHRFZmZlY3QgPSBudWxsOyAvLyBVc2VkIGZvciBQcm9maWxpbmcgYnVpbGRzIHRvIHRyYWNrIHVwZGF0ZXJzLlxuXG52YXIgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbnZhciBpblByb2dyZXNzUm9vdCA9IG51bGw7XG5mdW5jdGlvbiByZXBvcnRVbmNhdWdodEVycm9ySW5ERVYoZXJyb3IpIHtcbiAgLy8gV3JhcHBpbmcgZWFjaCBzbWFsbCBwYXJ0IG9mIHRoZSBjb21taXQgcGhhc2UgaW50byBhIGd1YXJkZWRcbiAgLy8gY2FsbGJhY2sgaXMgYSBiaXQgdG9vIHNsb3cgKGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIxNjY2KS5cbiAgLy8gQnV0IHdlIHJlbHkgb24gaXQgdG8gc3VyZmFjZSBlcnJvcnMgdG8gREVWIHRvb2xzIGxpa2Ugb3ZlcmxheXNcbiAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjE3MTIpLlxuICAvLyBBcyBhIGNvbXByb21pc2UsIHJldGhyb3cgb25seSBjYXVnaHQgZXJyb3JzIGluIGEgZ3VhcmQuXG4gIHtcbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG4gICAgY2xlYXJDYXVnaHRFcnJvcigpO1xuICB9XG59XG5cbnZhciBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICggY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICB0cnkge1xuICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gIH1cbn07IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdHJ5IHtcbiAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCwgY3VycmVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IHVubW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKSB7XG4gIHRyeSB7XG4gICAgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyKGN1cnJlbnQsIGluc3RhbmNlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKSB7XG4gIHRyeSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5QXR0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdHJ5IHtcbiAgICBjb21taXRBdHRhY2hSZWYoY3VycmVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHZhciByZWYgPSBjdXJyZW50LnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciByZXRWYWw7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVuYWJsZVByb2ZpbGVyQ29tbWl0SG9va3MgJiYgY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgcmV0VmFsID0gcmVmKG51bGwpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0VmFsID0gcmVmKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXRWYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBhIGNhbGxiYWNrIHJlZiBpbiAlcy4gJyArICdBIGNhbGxiYWNrIHJlZiBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSkge1xuICB0cnkge1xuICAgIGRlc3Ryb3koKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cblxudmFyIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG52YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmlyc3RDaGlsZCkge1xuICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBwcmVwYXJlRm9yQ29tbWl0KHJvb3QuY29udGFpbmVySW5mbyk7XG4gIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfYmVnaW4oKTsgLy8gV2Ugbm8gbG9uZ2VyIG5lZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSBpbnN0YW5jZSBmaWJlclxuXG4gIHZhciBzaG91bGRGaXJlID0gc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyO1xuICBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbiAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcbiAgcmV0dXJuIHNob3VsZEZpcmU7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUaGlzIHBoYXNlIGlzIG9ubHkgdXNlZCBmb3IgYmVmb3JlQWN0aXZlSW5zdGFuY2VCbHVyLlxuXG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIEJlZm9yZU11dGF0aW9uTWFzaykgIT09IE5vRmxhZ3MgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaykge1xuICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcblxuICBpZiAoKGZsYWdzICYgU25hcHNob3QpICE9PSBOb0ZsYWdzKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG5cbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc25hcHNob3QgPSBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gcHJldlByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgcHJldlByb3BzKSwgcHJldlN0YXRlKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgZGlkV2FyblNldCA9IGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlO1xuXG4gICAgICAgICAgICAgIGlmIChzbmFwc2hvdCA9PT0gdW5kZWZpbmVkICYmICFkaWRXYXJuU2V0LmhhcyhmaW5pc2hlZFdvcmsudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBkaWRXYXJuU2V0LmFkZChmaW5pc2hlZFdvcmsudHlwZSk7XG5cbiAgICAgICAgICAgICAgICBlcnJvcignJXMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKTogQSBzbmFwc2hvdCB2YWx1ZSAob3IgbnVsbCkgJyArICdtdXN0IGJlIHJldHVybmVkLiBZb3UgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHNuYXBzaG90O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBjbGVhckNvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UgY29tcG9uZW50IHR5cGVzXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaywgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7XG4gICAgICAgIC8vIFVubW91bnRcbiAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcbiAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZmluaXNoZWRXb3JrLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG5cbiAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKChlZmZlY3QudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBNb3VudFxuXG5cbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlZmZlY3QuZGVzdHJveSA9IGNyZWF0ZSgpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG5cbiAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgaG9va05hbWUgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmICgoZWZmZWN0LnRhZyAmIExheW91dCkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVmZmVjdC50YWcgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VFZmZlY3QnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYWRkZW5kdW0gPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChkZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVzdHJveS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJ1xcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlICcgKyBob29rTmFtZSArICcoYXN5bmMgKCkgPT4gLi4uKSBvciByZXR1cm5lZCBhIFByb21pc2UuICcgKyAnSW5zdGVhZCwgd3JpdGUgdGhlIGFzeW5jIGZ1bmN0aW9uIGluc2lkZSB5b3VyIGVmZmVjdCAnICsgJ2FuZCBjYWxsIGl0IGltbWVkaWF0ZWx5OlxcblxcbicgKyBob29rTmFtZSArICcoKCkgPT4ge1xcbicgKyAnICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuJyArICcgICAgLy8gWW91IGNhbiBhd2FpdCBoZXJlXFxuJyArICcgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNeUFQSS5nZXREYXRhKHNvbWVJZCk7XFxuJyArICcgICAgLy8gLi4uXFxuJyArICcgIH1cXG4nICsgJyAgZmV0Y2hEYXRhKCk7XFxuJyArIFwifSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc24ndCBuZWVkIHByb3BzIG9yIHN0YXRlXFxuXFxuXCIgKyAnTGVhcm4gbW9yZSBhYm91dCBkYXRhIGZldGNoaW5nIHdpdGggSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ob29rcy1kYXRhLWZldGNoaW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQ6ICcgKyBkZXN0cm95O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvcignJXMgbXVzdCBub3QgcmV0dXJuIGFueXRoaW5nIGJlc2lkZXMgYSBmdW5jdGlvbiwgJyArICd3aGljaCBpcyB1c2VkIGZvciBjbGVhbi11cC4lcycsIGhvb2tOYW1lLCBhZGRlbmR1bSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcbiAge1xuICAgIC8vIE9ubHkgUHJvZmlsZXJzIHdpdGggd29yayBpbiB0aGVpciBzdWJ0cmVlIHdpbGwgaGF2ZSBhbiBVcGRhdGUgZWZmZWN0IHNjaGVkdWxlZC5cbiAgICBpZiAoKGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXNzaXZlRWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICBpZCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5pZCxcbiAgICAgICAgICAgICAgICBvblBvc3RDb21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUub25Qb3N0Q29tbWl0OyAvLyBUaGlzIHZhbHVlIHdpbGwgc3RpbGwgcmVmbGVjdCB0aGUgcHJldmlvdXMgY29tbWl0IHBoYXNlLlxuICAgICAgICAgICAgLy8gSXQgZG9lcyBub3QgZ2V0IHJlc2V0IHVudGlsIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjb21taXQgcGhhc2UuXG5cbiAgICAgICAgICAgIHZhciBjb21taXRUaW1lID0gZ2V0Q29tbWl0VGltZSgpO1xuICAgICAgICAgICAgdmFyIHBoYXNlID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSA9PT0gbnVsbCA/ICdtb3VudCcgOiAndXBkYXRlJztcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICduZXN0ZWQtdXBkYXRlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uUG9zdENvbW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblBvc3RDb21taXQoaWQsIHBoYXNlLCBwYXNzaXZlRWZmZWN0RHVyYXRpb24sIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgfSAvLyBCdWJibGUgdGltZXMgdG8gdGhlIG5leHQgbmVhcmVzdCBhbmNlc3RvciBQcm9maWxlci5cbiAgICAgICAgICAgIC8vIEFmdGVyIHdlIHByb2Nlc3MgdGhhdCBQcm9maWxlciwgd2UnbGwgYnViYmxlIGZ1cnRoZXIgdXAuXG5cblxuICAgICAgICAgICAgdmFyIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcblxuICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICggIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgbGF5b3V0IGVmZmVjdHMgaGF2ZSBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIChkdXJpbmcgbXV0YXRpb24gcGhhc2UpLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgICAgLy8gYnkgYSBjcmVhdGUgZnVuY3Rpb24gaW4gYW5vdGhlciBjb21wb25lbnQgZHVyaW5nIHRoZSBzYW1lIGNvbW1pdC5cbiAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgY3VycmVudC5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLlxuXG5cbiAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG5cbiAgICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgdXBkYXRlUXVldWUsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLlxuICAgICAgICAgIHZhciBfdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAoX3VwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBnZXRQdWJsaWNJbnN0YW5jZShmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIF91cGRhdGVRdWV1ZSwgX2luc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlMiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFJlbmRlcmVycyBtYXkgc2NoZWR1bGUgd29yayB0byBiZSBkb25lIGFmdGVyIGhvc3QgY29tcG9uZW50cyBhcmUgbW91bnRlZFxuICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgbWF5IHNjaGVkdWxlIGF1dG8tZm9jdXMgZm9yIGlucHV0cyBhbmQgZm9ybSBjb250cm9scykuXG4gICAgICAgICAgLy8gVGhlc2UgZWZmZWN0cyBzaG91bGQgb25seSBiZSBjb21taXR0ZWQgd2hlbiBjb21wb25lbnRzIGFyZSBmaXJzdCBtb3VudGVkLFxuICAgICAgICAgIC8vIGFrYSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQvYWx0ZXJuYXRlLlxuXG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgJiYgZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgICAgdmFyIHByb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICBjb21taXRNb3VudChfaW5zdGFuY2UyLCB0eXBlLCBwcm9wcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggcG9ydGFscy5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9maW5pc2hlZFdvcmskbWVtb2l6ZTIgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICBvbkNvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25Db21taXQsXG4gICAgICAgICAgICAgICAgb25SZW5kZXIgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uUmVuZGVyO1xuICAgICAgICAgICAgdmFyIGVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgIHZhciBjb21taXRUaW1lID0gZ2V0Q29tbWl0VGltZSgpO1xuICAgICAgICAgICAgdmFyIHBoYXNlID0gY3VycmVudCA9PT0gbnVsbCA/ICdtb3VudCcgOiAndXBkYXRlJztcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICduZXN0ZWQtdXBkYXRlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBwaGFzZSwgZmluaXNoZWRXb3JrLmFjdHVhbER1cmF0aW9uLCBmaW5pc2hlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiwgZmluaXNoZWRXb3JrLmFjdHVhbFN0YXJ0VGltZSwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvbkNvbW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIG9uQ29tbWl0KGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBwaGFzZSwgZWZmZWN0RHVyYXRpb24sIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgICB9IC8vIFNjaGVkdWxlIGEgcGFzc2l2ZSBlZmZlY3QgZm9yIHRoaXMgUHJvZmlsZXIgdG8gY2FsbCBvblBvc3RDb21taXQgaG9va3MuXG4gICAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IHNob3VsZCBiZSBzY2hlZHVsZWQgZXZlbiBpZiB0aGVyZSBpcyBubyBvblBvc3RDb21taXQgY2FsbGJhY2sgZm9yIHRoaXMgUHJvZmlsZXIsXG4gICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGVmZmVjdCBpcyBhbHNvIHdoZXJlIHRpbWVzIGJ1YmJsZSB0byBwYXJlbnQgUHJvZmlsZXJzLlxuXG5cbiAgICAgICAgICAgICAgZW5xdWV1ZVBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3QoZmluaXNoZWRXb3JrKTsgLy8gUHJvcGFnYXRlIGxheW91dCBlZmZlY3QgZHVyYXRpb25zIHRvIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3IuXG4gICAgICAgICAgICAgIC8vIERvIG5vdCByZXNldCB0aGVzZSB2YWx1ZXMgdW50aWwgdGhlIG5leHQgcmVuZGVyIHNvIERldlRvb2xzIGhhcyBhIGNoYW5jZSB0byByZWFkIHRoZW0gZmlyc3QuXG5cbiAgICAgICAgICAgICAgdmFyIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcblxuICAgICAgICAgICAgICBvdXRlcjogd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgICByb290LmVmZmVjdER1cmF0aW9uICs9IGVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcblxuICAgICAgICAgICAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uICs9IGVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICggIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICB7XG4gICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgUmVmKSB7XG4gICAgICAgIGNvbW1pdEF0dGFjaFJlZihmaW5pc2hlZFdvcmspO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKG5vZGUpIHtcbiAgLy8gVHVybiBvbiBsYXlvdXQgZWZmZWN0cyBpbiBhIHRyZWUgdGhhdCBwcmV2aW91c2x5IGRpc2FwcGVhcmVkLlxuICAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpY1xuICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIG5vZGUubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24obm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnREaWRNb3VudChub2RlLCBub2RlLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHNhZmVseUF0dGFjaFJlZihub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKGZpbmlzaGVkV29yaywgaXNIaWRkZW4pIHtcbiAgLy8gT25seSBoaWRlIG9yIHVuaGlkZSB0aGUgdG9wLW1vc3QgaG9zdCBub2Rlcy5cbiAgdmFyIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG5cbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBub2RlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZUluc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaGlkZUluc3RhbmNlKG5vZGUuc3RhdGVOb2RlLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTMgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMywgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChub2RlLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50IHx8IG5vZGUudGFnID09PSBMZWdhY3lIaWRkZW5Db21wb25lbnQpICYmIG5vZGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBub2RlICE9PSBmaW5pc2hlZFdvcmspIDsgZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7XG4gICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkge1xuICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgIHZhciBpbnN0YW5jZVRvVXNlO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfSAvLyBNb3ZlZCBvdXRzaWRlIHRvIGVuc3VyZSBEQ0Ugd29ya3Mgd2l0aCB0aGlzIGZsYWdcblxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcmV0VmFsO1xuXG4gICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFZhbCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICghcmVmLmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZWYgb2JqZWN0IHByb3ZpZGVkIGZvciAlcy4gJyArICdVc2UgZWl0aGVyIGEgcmVmLXNldHRlciBmdW5jdGlvbiBvciBSZWFjdC5jcmVhdGVSZWYoKS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlZi5jdXJyZW50ID0gaW5zdGFuY2VUb1VzZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0YWNoRmliZXJNdXRhdGlvbihmaWJlcikge1xuICAvLyBDdXQgb2ZmIHRoZSByZXR1cm4gcG9pbnRlciB0byBkaXNjb25uZWN0IGl0IGZyb20gdGhlIHRyZWUuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZXRlY3QgYW5kIHdhcm4gYWdhaW5zdCBzdGF0ZSB1cGRhdGVzIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXG4gIC8vIEl0IGFsc28gcHJldmVudHMgZXZlbnRzIGZyb20gYnViYmxpbmcgZnJvbSB3aXRoaW4gZGlzY29ubmVjdGVkIGNvbXBvbmVudHMuXG4gIC8vXG4gIC8vIElkZWFsbHksIHdlIHNob3VsZCBhbHNvIGNsZWFyIHRoZSBjaGlsZCBwb2ludGVyIG9mIHRoZSBwYXJlbnQgYWx0ZXJuYXRlIHRvIGxldCB0aGlzXG4gIC8vIGdldCBHQzplZCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBmb3Igc3VyZSB3aGljaCBwYXJlbnQgaXMgdGhlIGN1cnJlbnRcbiAgLy8gb25lIHNvIHdlJ2xsIHNldHRsZSBmb3IgR0M6aW5nIHRoZSBzdWJ0cmVlIG9mIHRoaXMgY2hpbGQuXG4gIC8vIFRoaXMgY2hpbGQgaXRzZWxmIHdpbGwgYmUgR0M6ZWQgd2hlbiB0aGUgcGFyZW50IHVwZGF0ZXMgdGhlIG5leHQgdGltZS5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGNsZWFyIGNoaWxkIG9yIHNpYmxpbmcgcG9pbnRlcnMgeWV0LlxuICAvLyBUaGV5J3JlIG5lZWRlZCBmb3IgcGFzc2l2ZSBlZmZlY3RzIGFuZCBmb3IgZmluZERPTU5vZGUuXG4gIC8vIFdlIGRlZmVyIHRob3NlIGZpZWxkcywgYW5kIGFsbCBvdGhlciBjbGVhbnVwLCB0byB0aGUgcGFzc2l2ZSBwaGFzZSAoc2VlIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKS5cbiAgLy9cbiAgLy8gRG9uJ3QgcmVzZXQgdGhlIGFsdGVybmF0ZSB5ZXQsIGVpdGhlci4gV2UgbmVlZCB0aGF0IHNvIHdlIGNhbiBkZXRhY2ggdGhlXG4gIC8vIGFsdGVybmF0ZSdzIGZpZWxkcyBpbiB0aGUgcGFzc2l2ZSBwaGFzZS4gQ2xlYXJpbmcgdGhlIHJldHVybiBwb2ludGVyIGlzXG4gIC8vIHN1ZmZpY2llbnQgZm9yIGZpbmRET01Ob2RlIHNlbWFudGljcy5cbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLnJldHVybiA9IG51bGw7XG4gIH1cblxuICBmaWJlci5yZXR1cm4gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBmaWJlci5hbHRlcm5hdGUgPSBudWxsO1xuICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGFsdGVybmF0ZSk7XG4gIH0gLy8gTm90ZTogRGVmZW5zaXZlbHkgdXNpbmcgbmVnYXRpb24gaW5zdGVhZCBvZiA8IGluIGNhc2VcbiAgLy8gYGRlbGV0ZWRUcmVlQ2xlYW5VcExldmVsYCBpcyB1bmRlZmluZWQuXG5cblxuICB7XG4gICAgLy8gQ2xlYXIgY3ljbGljYWwgRmliZXIgZmllbGRzLiBUaGlzIGxldmVsIGFsb25lIGlzIGRlc2lnbmVkIHRvIHJvdWdobHlcbiAgICAvLyBhcHByb3hpbWF0ZSB0aGUgcGxhbm5lZCBGaWJlciByZWZhY3Rvci4gSW4gdGhhdCB3b3JsZCwgYHNldFN0YXRlYCB3aWxsIGJlXG4gICAgLy8gYm91bmQgdG8gYSBzcGVjaWFsIFwiaW5zdGFuY2VcIiBvYmplY3QgaW5zdGVhZCBvZiBhIEZpYmVyLiBUaGUgSW5zdGFuY2VcbiAgICAvLyBvYmplY3Qgd2lsbCBub3QgaGF2ZSBhbnkgb2YgdGhlc2UgZmllbGRzLiBJdCB3aWxsIG9ubHkgYmUgY29ubmVjdGVkIHRvXG4gICAgLy8gdGhlIGZpYmVyIHRyZWUgdmlhIGEgc2luZ2xlIGxpbmsgYXQgdGhlIHJvb3QuIFNvIGlmIHRoaXMgbGV2ZWwgYWxvbmUgaXNcbiAgICAvLyBzdWZmaWNpZW50IHRvIGZpeCBtZW1vcnkgaXNzdWVzLCB0aGF0IGJvZGVzIHdlbGwgZm9yIG91ciBwbGFucy5cbiAgICBmaWJlci5jaGlsZCA9IG51bGw7XG4gICAgZmliZXIuZGVsZXRpb25zID0gbnVsbDtcbiAgICBmaWJlci5zaWJsaW5nID0gbnVsbDsgLy8gVGhlIGBzdGF0ZU5vZGVgIGlzIGN5Y2xpY2FsIGJlY2F1c2Ugb24gaG9zdCBub2RlcyBpdCBwb2ludHMgdG8gdGhlIGhvc3RcbiAgICAvLyB0cmVlLCB3aGljaCBoYXMgaXRzIG93biBwb2ludGVycyB0byBjaGlsZHJlbiwgcGFyZW50cywgYW5kIHNpYmxpbmdzLlxuICAgIC8vIFRoZSBvdGhlciBob3N0IG5vZGVzIGFsc28gcG9pbnQgYmFjayB0byBmaWJlcnMsIHNvIHdlIHNob3VsZCBkZXRhY2ggdGhhdFxuICAgIC8vIG9uZSwgdG9vLlxuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICBkZXRhY2hEZWxldGVkSW5zdGFuY2UoaG9zdEluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBJJ20gaW50ZW50aW9uYWxseSBub3QgY2xlYXJpbmcgdGhlIGByZXR1cm5gIGZpZWxkIGluIHRoaXMgbGV2ZWwuIFdlXG4gICAgLy8gYWxyZWFkeSBkaXNjb25uZWN0IHRoZSBgcmV0dXJuYCBwb2ludGVyIGF0IHRoZSByb290IG9mIHRoZSBkZWxldGVkXG4gICAgLy8gc3VidHJlZSAoaW4gYGRldGFjaEZpYmVyTXV0YXRpb25gKS4gQmVzaWRlcywgYHJldHVybmAgYnkgaXRzZWxmIGlzIG5vdFxuICAgIC8vIGN5Y2xpY2FsIOKAlCBpdCdzIG9ubHkgY3ljbGljYWwgd2hlbiBjb21iaW5lZCB3aXRoIGBjaGlsZGAsIGBzaWJsaW5nYCwgYW5kXG4gICAgLy8gYGFsdGVybmF0ZWAuIEJ1dCB3ZSdsbCBjbGVhciBpdCBpbiB0aGUgbmV4dCBsZXZlbCBhbnl3YXksIGp1c3QgaW4gY2FzZS5cblxuICAgIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBUaGVvcmV0aWNhbGx5LCBub3RoaW5nIGluIGhlcmUgc2hvdWxkIGJlIG5lY2Vzc2FyeSwgYmVjYXVzZSB3ZSBhbHJlYWR5XG4gICAgICAvLyBkaXNjb25uZWN0ZWQgdGhlIGZpYmVyIGZyb20gdGhlIHRyZWUuIFNvIGV2ZW4gaWYgc29tZXRoaW5nIGxlYWtzIHRoaXNcbiAgICAgIC8vIHBhcnRpY3VsYXIgZmliZXIsIGl0IHdvbid0IGxlYWsgYW55dGhpbmcgZWxzZVxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgYnJhbmNoIGlzIHRvIGJlIHN1cGVyIGFnZ3Jlc3NpdmUgc28gd2UgY2FuIG1lYXN1cmVcbiAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGRpZmZlcmVuY2UgaW4gbWVtb3J5IGltcGFjdC4gSWYgdGhlcmUgaXMsIHRoYXQgY291bGRcbiAgICAgIC8vIGluZGljYXRlIGEgUmVhY3QgbGVhayB3ZSBkb24ndCBrbm93IGFib3V0LlxuICAgICAgZmliZXIucmV0dXJuID0gbnVsbDtcbiAgICAgIGZpYmVyLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gbnVsbDtcbiAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7IC8vIFRPRE86IE1vdmUgdG8gYGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyYCBpbnN0ZWFkLlxuXG4gICAgICBmaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RQYXJlbnRGaWJlcihmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBpZiAoaXNIb3N0UGFyZW50KHBhcmVudCkpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIGlzSG9zdFBhcmVudChmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QgfHwgZmliZXIudGFnID09PSBIb3N0UG9ydGFsO1xufVxuXG5mdW5jdGlvbiBnZXRIb3N0U2libGluZyhmaWJlcikge1xuICAvLyBXZSdyZSBnb2luZyB0byBzZWFyY2ggZm9yd2FyZCBpbnRvIHRoZSB0cmVlIHVudGlsIHdlIGZpbmQgYSBzaWJsaW5nIGhvc3RcbiAgLy8gbm9kZS4gVW5mb3J0dW5hdGVseSwgaWYgbXVsdGlwbGUgaW5zZXJ0aW9ucyBhcmUgZG9uZSBpbiBhIHJvdyB3ZSBoYXZlIHRvXG4gIC8vIHNlYXJjaCBwYXN0IHRoZW0uIFRoaXMgbGVhZHMgdG8gZXhwb25lbnRpYWwgc2VhcmNoIGZvciB0aGUgbmV4dCBzaWJsaW5nLlxuICAvLyBUT0RPOiBGaW5kIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMuXG4gIHZhciBub2RlID0gZmliZXI7XG5cbiAgc2libGluZ3M6IHdoaWxlICh0cnVlKSB7XG4gICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcsIGxldCdzIHRyeSB0aGUgbmV4dCBzaWJsaW5nLlxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBpc0hvc3RQYXJlbnQobm9kZS5yZXR1cm4pKSB7XG4gICAgICAgIC8vIElmIHdlIHBvcCBvdXQgb2YgdGhlIHJvb3Qgb3IgaGl0IHRoZSBwYXJlbnQgdGhlIGZpYmVyIHdlIGFyZSB0aGVcbiAgICAgICAgLy8gbGFzdCBzaWJsaW5nLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuXG4gICAgd2hpbGUgKG5vZGUudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIG5vZGUudGFnICE9PSBIb3N0VGV4dCAmJiBub2RlLnRhZyAhPT0gRGVoeWRyYXRlZEZyYWdtZW50KSB7XG4gICAgICAvLyBJZiBpdCBpcyBub3QgaG9zdCBub2RlIGFuZCwgd2UgbWlnaHQgaGF2ZSBhIGhvc3Qgbm9kZSBpbnNpZGUgaXQuXG4gICAgICAvLyBUcnkgdG8gc2VhcmNoIGRvd24gdW50aWwgd2UgZmluZCBvbmUuXG4gICAgICBpZiAobm9kZS5mbGFncyAmIFBsYWNlbWVudCkge1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IC8vIElmIHdlIGRvbid0IGhhdmUgYSBjaGlsZCwgdHJ5IHRoZSBzaWJsaW5ncyBpbnN0ZWFkLlxuICAgICAgLy8gV2UgYWxzbyBza2lwIHBvcnRhbHMgYmVjYXVzZSB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGlzIGhvc3QgdHJlZS5cblxuXG4gICAgICBpZiAobm9kZS5jaGlsZCA9PT0gbnVsbCB8fCBub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICBjb250aW51ZSBzaWJsaW5ncztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICB9XG4gICAgfSAvLyBDaGVjayBpZiB0aGlzIGhvc3Qgbm9kZSBpcyBzdGFibGUgb3IgYWJvdXQgdG8gYmUgcGxhY2VkLlxuXG5cbiAgICBpZiAoIShub2RlLmZsYWdzICYgUGxhY2VtZW50KSkge1xuICAgICAgLy8gRm91bmQgaXQhXG4gICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspIHtcblxuXG4gIHZhciBwYXJlbnRGaWJlciA9IGdldEhvc3RQYXJlbnRGaWJlcihmaW5pc2hlZFdvcmspOyAvLyBOb3RlOiB0aGVzZSB0d28gdmFyaWFibGVzICptdXN0KiBhbHdheXMgYmUgdXBkYXRlZCB0b2dldGhlci5cblxuICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAocGFyZW50RmliZXIuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zXG4gICAgICAgICAgcmVzZXRUZXh0Q29udGVudChwYXJlbnQpOyAvLyBDbGVhciBDb250ZW50UmVzZXQgZnJvbSB0aGUgZWZmZWN0IHRhZ1xuXG4gICAgICAgICAgcGFyZW50RmliZXIuZmxhZ3MgJj0gfkNvbnRlbnRSZXNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBiZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspOyAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cblxuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoZmluaXNoZWRXb3JrLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgdmFyIF9iZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoZmluaXNoZWRXb3JrLCBfYmVmb3JlLCBfcGFyZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lLW5vLWZhbGx0aHJvdWdoXG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvc3QgcGFyZW50IGZpYmVyLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIHZhciBpc0hvc3QgPSB0YWcgPT09IEhvc3RDb21wb25lbnQgfHwgdGFnID09PSBIb3N0VGV4dDtcblxuICBpZiAoaXNIb3N0KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgaW5zZXJ0SW5Db250YWluZXJCZWZvcmUocGFyZW50LCBzdGF0ZU5vZGUsIGJlZm9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZENoaWxkVG9Db250YWluZXIocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihjaGlsZCwgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgdmFyIHNpYmxpbmcgPSBjaGlsZC5zaWJsaW5nO1xuXG4gICAgICB3aGlsZSAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QpIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBzdGF0ZU5vZGUsIGJlZm9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZENoaWxkKHBhcmVudCwgc3RhdGVOb2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2Uge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShjaGlsZCwgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgdmFyIHNpYmxpbmcgPSBjaGlsZC5zaWJsaW5nO1xuXG4gICAgICB3aGlsZSAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBUaGVzZSBhcmUgdHJhY2tlZCBvbiB0aGUgc3RhY2sgYXMgd2UgcmVjdXJzaXZlbHkgdHJhdmVyc2UgYVxuLy8gZGVsZXRlZCBzdWJ0cmVlLlxuLy8gVE9ETzogVXBkYXRlIHRoZXNlIGR1cmluZyB0aGUgd2hvbGUgbXV0YXRpb24gcGhhc2UsIG5vdCBqdXN0IGR1cmluZ1xuLy8gYSBkZWxldGlvbi5cblxuXG52YXIgaG9zdFBhcmVudCA9IG51bGw7XG52YXIgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBkZWxldGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgLy8gUmVjdXJzaXZlbHkgZGVsZXRlIGFsbCBob3N0IG5vZGVzIGZyb20gdGhlIHBhcmVudCwgZGV0YWNoIHJlZnMsIGNsZWFuXG4gICAgLy8gdXAgbW91bnRlZCBsYXlvdXQgZWZmZWN0cywgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQuXG4gICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgdG9wbW9zdCBob3N0IGNoaWxkIGluIGVhY2ggYnJhbmNoLiBCdXQgdGhlbiB3ZVxuICAgIC8vIHN0aWxsIG5lZWQgdG8ga2VlcCB0cmF2ZXJzaW5nIHRvIHVubW91bnQgZWZmZWN0cywgcmVmcywgYW5kIGNXVS4gVE9ETzogV2VcbiAgICAvLyBjb3VsZCBzcGxpdCB0aGlzIGludG8gdHdvIHNlcGFyYXRlIHRyYXZlcnNhbHMgZnVuY3Rpb25zLCB3aGVyZSB0aGUgc2Vjb25kXG4gICAgLy8gb25lIGRvZXNuJ3QgaW5jbHVkZSBhbnkgcmVtb3ZlQ2hpbGQgbG9naWMuIFRoaXMgaXMgbWF5YmUgdGhlIHNhbWVcbiAgICAvLyBmdW5jdGlvbiBhcyBcImRpc2FwcGVhckxheW91dEVmZmVjdHNcIiAob3Igd2hhdGV2ZXIgdGhhdCB0dXJucyBpbnRvIGFmdGVyXG4gICAgLy8gdGhlIGxheW91dCBwaGFzZSBpcyByZWZhY3RvcmVkIHRvIHVzZSByZWN1cnNpb24pLlxuICAgIC8vIEJlZm9yZSBzdGFydGluZywgZmluZCB0aGUgbmVhcmVzdCBob3N0IHBhcmVudCBvbiB0aGUgc3RhY2sgc28gd2Uga25vd1xuICAgIC8vIHdoaWNoIGluc3RhbmNlL2NvbnRhaW5lciB0byByZW1vdmUgdGhlIGNoaWxkcmVuIGZyb20uXG4gICAgLy8gVE9ETzogSW5zdGVhZCBvZiBzZWFyY2hpbmcgdXAgdGhlIGZpYmVyIHJldHVybiBwYXRoIG9uIGV2ZXJ5IGRlbGV0aW9uLCB3ZVxuICAgIC8vIGNhbiB0cmFjayB0aGUgbmVhcmVzdCBob3N0IGNvbXBvbmVudCBvbiB0aGUgSlMgc3RhY2sgYXMgd2UgdHJhdmVyc2UgdGhlXG4gICAgLy8gdHJlZSBkdXJpbmcgdGhlIGNvbW1pdCBwaGFzZS4gVGhpcyB3b3VsZCBtYWtlIGluc2VydGlvbnMgZmFzdGVyLCB0b28uXG4gICAgdmFyIHBhcmVudCA9IHJldHVybkZpYmVyO1xuXG4gICAgZmluZFBhcmVudDogd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnQudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChob3N0UGFyZW50ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcik7XG4gICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gIH1cblxuICBkZXRhY2hGaWJlck11dGF0aW9uKGRlbGV0ZWRGaWJlcik7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBwYXJlbnQpIHtcbiAgLy8gVE9ETzogVXNlIGEgc3RhdGljIGZsYWcgdG8gc2tpcCB0cmVlcyB0aGF0IGRvbid0IGhhdmUgdW5tb3VudCBlZmZlY3RzXG4gIHZhciBjaGlsZCA9IHBhcmVudC5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgY2hpbGQpO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKSB7XG4gIG9uQ29tbWl0VW5tb3VudChkZWxldGVkRmliZXIpOyAvLyBUaGUgY2FzZXMgaW4gdGhpcyBvdXRlciBzd2l0Y2ggbW9kaWZ5IHRoZSBzdGFjayBiZWZvcmUgdGhleSB0cmF2ZXJzZVxuICAvLyBpbnRvIHRoZWlyIHN1YnRyZWUuIFRoZXJlIGFyZSBzaW1wbGVyIGNhc2VzIGluIHRoZSBpbm5lciBzd2l0Y2hcbiAgLy8gdGhhdCBkb24ndCBtb2RpZnkgdGhlIHN0YWNrLlxuXG4gIHN3aXRjaCAoZGVsZXRlZEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgIH0gLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggdG8gbmV4dCBicmFuY2hcblxuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgbmVhcmVzdCBob3N0IGNoaWxkLiBTZXQgdGhlIGhvc3QgcGFyZW50XG4gICAgICAgIC8vIHRvIGBudWxsYCBvbiB0aGUgc3RhY2sgdG8gaW5kaWNhdGUgdGhhdCBuZXN0ZWQgY2hpbGRyZW4gZG9uJ3RcbiAgICAgICAgLy8gbmVlZCB0byBiZSByZW1vdmVkLlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICB2YXIgcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBob3N0UGFyZW50ID0gcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcblxuICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBOb3cgdGhhdCBhbGwgdGhlIGNoaWxkIGVmZmVjdHMgaGF2ZSB1bm1vdW50ZWQsIHdlIGNhbiByZW1vdmUgdGhlXG4gICAgICAgICAgICAvLyBub2RlIGZyb20gdGhlIHRyZWUuXG4gICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlbW92ZUNoaWxkKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAge1xuICAgICAgICAvLyBEZWxldGUgdGhlIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudC5cblxuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdoZW4gd2UgZ28gaW50byBhIHBvcnRhbCwgaXQgYmVjb21lcyB0aGUgcGFyZW50IHRvIHJlbW92ZSBmcm9tLlxuICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgICBob3N0UGFyZW50ID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IF9wcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGRlbGV0ZWRGaWJlci51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgICAgICAgICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIF9lZmZlY3QgPSBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kgPSBfZWZmZWN0LmRlc3Ryb3ksXG4gICAgICAgICAgICAgICAgICAgIHRhZyA9IF9lZmZlY3QudGFnO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhZyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIGRlbGV0ZWRGaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihkZWxldGVkRmliZXIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICAgICAgICAgICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlYWQgZmxhZ1xuICAgICAgICAgZGVsZXRlZEZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgb2Zmc2NyZWVuIGNvbXBvbmVudCBpcyBoaWRkZW4sIHdlIGFscmVhZHkgdW5tb3VudGVkIGl0LiBCZWZvcmVcbiAgICAgICAgICAvLyBkZWxldGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIHRoYXQgaXQncyBhbHJlYWR5IHVubW91bnRlZCBzbyB0aGF0IHdlXG4gICAgICAgICAgLy8gZG9uJ3QgYXR0ZW1wdCB0byB1bm1vdW50IHRoZSBlZmZlY3RzIGFnYWluLlxuICAgICAgICAgIC8vIFRPRE86IElmIHRoZSB0cmVlIGlzIGhpZGRlbiwgaW4gbW9zdCBjYXNlcyB3ZSBzaG91bGQgYmUgYWJsZSB0byBza2lwXG4gICAgICAgICAgLy8gb3ZlciB0aGUgbmVzdGVkIGNoaWxkcmVuIGVudGlyZWx5LiBBbiBleGNlcHRpb24gaXMgd2UgaGF2ZW4ndCB5ZXQgZm91bmRcbiAgICAgICAgICAvLyB0aGUgdG9wbW9zdCBob3N0IG5vZGUgdG8gZGVsZXRlLCB3aGljaCB3ZSBhbHJlYWR5IHRyYWNrIG9uIHRoZSBzdGFjay5cbiAgICAgICAgICAvLyBCdXQgdGhlIG90aGVyIGNhc2UgaXMgcG9ydGFscywgd2hpY2ggbmVlZCB0byBiZSBkZXRhY2hlZCBubyBtYXR0ZXIgaG93XG4gICAgICAgICAgLy8gZGVlcGx5IHRoZXkgYXJlIG5lc3RlZC4gV2Ugc2hvdWxkIHVzZSBhIHN1YnRyZWUgZmxhZyB0byB0cmFjayB3aGV0aGVyIGFcbiAgICAgICAgICAvLyBzdWJ0cmVlIGluY2x1ZGVzIGEgbmVzdGVkIHBvcnRhbC5cbiAgICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fCBkZWxldGVkRmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VDYWxsYmFjayhmaW5pc2hlZFdvcmspIHtcbiAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIHBhc3NpdmUgcGhhc2VcbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKSB7XG5cbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5ld1N0YXRlID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBwcmV2U3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgICBpZiAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yaykge1xuICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGp1c3QgdGltZWQgb3V0LCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHNldCBvZiB3YWtlYWJsZXMuXG4gIC8vIEZvciBlYWNoIHdha2VhYmxlLCBhdHRhY2ggYSBsaXN0ZW5lciBzbyB0aGF0IHdoZW4gaXQgcmVzb2x2ZXMsIFJlYWN0XG4gIC8vIGF0dGVtcHRzIHRvIHJlLXJlbmRlciB0aGUgYm91bmRhcnkgaW4gdGhlIHByaW1hcnkgKHByZS10aW1lb3V0KSBzdGF0ZS5cbiAgdmFyIHdha2VhYmxlcyA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICBpZiAod2FrZWFibGVzICE9PSBudWxsKSB7XG4gICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB2YXIgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICBpZiAocmV0cnlDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBuZXcgUG9zc2libHlXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgd2FrZWFibGVzLmZvckVhY2goZnVuY3Rpb24gKHdha2VhYmxlKSB7XG4gICAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSBib3VuZGFyeSBmaWJlciB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgICB2YXIgcmV0cnkgPSByZXNvbHZlUmV0cnlXYWtlYWJsZS5iaW5kKG51bGwsIGZpbmlzaGVkV29yaywgd2FrZWFibGUpO1xuXG4gICAgICBpZiAoIXJldHJ5Q2FjaGUuaGFzKHdha2VhYmxlKSkge1xuICAgICAgICByZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAgICAgaWYgKGluUHJvZ3Jlc3NMYW5lcyAhPT0gbnVsbCAmJiBpblByb2dyZXNzUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgYXNzb2NpYXRlIHRoZSBvcmlnaW5hbCB1cGRhdGVycyB3aXRoIGl0LlxuICAgICAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKGluUHJvZ3Jlc3NSb290LCBpblByb2dyZXNzTGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0V4cGVjdGVkIGZpbmlzaGVkIHJvb3QgYW5kIGxhbmVzIHRvIGJlIHNldC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3YWtlYWJsZS50aGVuKHJldHJ5LCByZXRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0gLy8gVGhpcyBmdW5jdGlvbiBkZXRlY3RzIHdoZW4gYSBTdXNwZW5zZSBib3VuZGFyeSBnb2VzIGZyb20gdmlzaWJsZSB0byBoaWRkZW4uXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykge1xuICBpblByb2dyZXNzTGFuZXMgPSBjb21taXR0ZWRMYW5lcztcbiAgaW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcbiAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QpO1xuICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIHBhcmVudEZpYmVyLCBsYW5lcykge1xuICAvLyBEZWxldGlvbnMgZWZmZWN0cyBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlciB0eXBlLiBUaGV5IG5lZWQgdG8gaGFwcGVuXG4gIC8vIGJlZm9yZSB0aGUgY2hpbGRyZW4gZWZmZWN0cyBoYWUgZmlyZWQuXG4gIHZhciBkZWxldGlvbnMgPSBwYXJlbnRGaWJlci5kZWxldGlvbnM7XG5cbiAgaWYgKGRlbGV0aW9ucyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0RGVsZXRpb25FZmZlY3RzKHJvb3QsIHBhcmVudEZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGNoaWxkVG9EZWxldGUsIHBhcmVudEZpYmVyLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZEZWJ1Z0ZpYmVyID0gZ2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIE11dGF0aW9uTWFzaykge1xuICAgIHZhciBjaGlsZCA9IHBhcmVudEZpYmVyLmNoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY2hpbGQpO1xuICAgICAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihjaGlsZCwgcm9vdCk7XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgc2V0Q3VycmVudEZpYmVyKHByZXZEZWJ1Z0ZpYmVyKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKSB7XG4gIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzOyAvLyBUaGUgZWZmZWN0IGZsYWcgc2hvdWxkIGJlIGNoZWNrZWQgKmFmdGVyKiB3ZSByZWZpbmUgdGhlIHR5cGUgb2YgZmliZXIsXG4gIC8vIGJlY2F1c2UgdGhlIGZpYmVyIHRhZyBpcyBtb3JlIHNwZWNpZmljLiBBbiBleGNlcHRpb24gaXMgYW55IGZsYWcgcmVsYXRlZFxuICAvLyB0byByZWNvbmNpbGF0aW9uLCBiZWNhdXNlIHRob3NlIGNhbiBiZSBzZXQgb24gYWxsIGZpYmVyIHR5cGVzLlxuXG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KEluc2VydGlvbiB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfSAvLyBMYXlvdXQgZWZmZWN0cyBhcmUgZGVzdHJveWVkIGR1cmluZyB0aGUgbXV0YXRpb24gcGhhc2Ugc28gdGhhdCBhbGxcbiAgICAgICAgICAvLyBkZXN0cm95IGZ1bmN0aW9ucyBmb3IgYWxsIGZpYmVycyBhcmUgY2FsbGVkIGJlZm9yZSBhbnkgY3JlYXRlIGZ1bmN0aW9ucy5cbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHNpYmxpbmcgY29tcG9uZW50IGVmZmVjdHMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIsXG4gICAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgICAgLy8gYnkgYSBjcmVhdGUgZnVuY3Rpb24gaW4gYW5vdGhlciBjb21wb25lbnQgZHVyaW5nIHRoZSBzYW1lIGNvbW1pdC5cblxuXG4gICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFJlZikge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPOiBDb250ZW50UmVzZXQgZ2V0cyBjbGVhcmVkIGJ5IHRoZSBjaGlsZHJlbiBkdXJpbmcgdGhlIGNvbW1pdFxuICAgICAgICAgIC8vIHBoYXNlLiBUaGlzIGlzIGEgcmVmYWN0b3IgaGF6YXJkIGJlY2F1c2UgaXQgbWVhbnMgd2UgbXVzdCByZWFkXG4gICAgICAgICAgLy8gZmxhZ3MgdGhlIGZsYWdzIGFmdGVyIGBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHNgIGhhcyBhbHJlYWR5IHJ1bjtcbiAgICAgICAgICAvLyB0aGUgb3JkZXIgbWF0dGVycy4gV2Ugc2hvdWxkIHJlZmFjdG9yIHNvIHRoYXQgQ29udGVudFJlc2V0IGRvZXMgbm90XG4gICAgICAgICAgLy8gcmVseSBvbiBtdXRhdGluZyB0aGUgZmxhZyBkdXJpbmcgY29tbWl0LiBMaWtlIGJ5IHNldHRpbmcgYSBmbGFnXG4gICAgICAgICAgLy8gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UgaW5zdGVhZC5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgQ29udGVudFJlc2V0KSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXNldFRleHRDb250ZW50KGluc3RhbmNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTQgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoX2luc3RhbmNlNCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIENvbW1pdCB0aGUgd29yayBwcmVwYXJlZCBlYXJsaWVyLlxuICAgICAgICAgICAgICB2YXIgbmV3UHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wczsgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAgICAgLy8gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdQcm9wcztcbiAgICAgICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTsgLy8gVE9ETzogVHlwZSB0aGUgdXBkYXRlUXVldWUgdG8gYmUgc3BlY2lmaWMgdG8gaG9zdCBjb21wb25lbnRzLlxuXG4gICAgICAgICAgICAgIHZhciB1cGRhdGVQYXlsb2FkID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbW1pdFVwZGF0ZShfaW5zdGFuY2U0LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgdmFyIG5ld1RleHQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wczsgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgIHZhciBvbGRUZXh0ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1RleHQ7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdFRleHRVcGRhdGUodGV4dEluc3RhbmNlLCBvbGRUZXh0LCBuZXdUZXh0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIHByZXZSb290U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKHByZXZSb290U3RhdGUuaXNEZWh5ZHJhdGVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB2YXIgb2Zmc2NyZWVuRmliZXIgPSBmaW5pc2hlZFdvcmsuY2hpbGQ7XG5cbiAgICAgICAgaWYgKG9mZnNjcmVlbkZpYmVyLmZsYWdzICYgVmlzaWJpbGl0eSkge1xuICAgICAgICAgIHZhciBvZmZzY3JlZW5JbnN0YW5jZSA9IG9mZnNjcmVlbkZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgbmV3U3RhdGUgPSBvZmZzY3JlZW5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IG5ld1N0YXRlICE9PSBudWxsOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhblxuICAgICAgICAgIC8vIHJlYWQgaXQgZHVyaW5nIGFuIGV2ZW50XG5cbiAgICAgICAgICBvZmZzY3JlZW5JbnN0YW5jZS5pc0hpZGRlbiA9IGlzSGlkZGVuO1xuXG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICB2YXIgd2FzSGlkZGVuID0gb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlICE9PSBudWxsICYmIG9mZnNjcmVlbkZpYmVyLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoIXdhc0hpZGRlbikge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICAgICAgbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGZpbmlzaGVkV29yay5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBCZWZvcmUgY29tbWl0dGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIG9uIHRoZSBzdGFjayB3aGV0aGVyIHRoaXNcbiAgICAgICAgICAvLyBvZmZzY3JlZW4gc3VidHJlZSB3YXMgYWxyZWFkeSBoaWRkZW4sIHNvIHRoYXQgd2UgZG9uJ3QgdW5tb3VudCB0aGVcbiAgICAgICAgICAvLyBlZmZlY3RzIGFnYWluLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IF93YXNIaWRkZW47XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIF9vZmZzY3JlZW5JbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIF9uZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgdmFyIF9pc0hpZGRlbiA9IF9uZXdTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIHZhciBvZmZzY3JlZW5Cb3VuZGFyeSA9IGZpbmlzaGVkV29yazsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgc3RhdGUgb24gdGhlIE9mZnNjcmVlbiBpbnN0YW5jZSBzbyB3ZSBjYW5cbiAgICAgICAgICAvLyByZWFkIGl0IGR1cmluZyBhbiBldmVudFxuXG4gICAgICAgICAgX29mZnNjcmVlbkluc3RhbmNlLmlzSGlkZGVuID0gX2lzSGlkZGVuO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKF9pc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoIV93YXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoKG9mZnNjcmVlbkJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdCA9IG9mZnNjcmVlbkJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgdmFyIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQm91bmRhcnkuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzY3JlZW5DaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4ob2Zmc2NyZWVuQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5DaGlsZCA9IG9mZnNjcmVlbkNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBuZWVkcyB0byBydW4gd2hlbmV2ZXIgdGhlcmUncyBhbiBpbnNlcnRpb24gb3IgdXBkYXRlXG4gICAgICAgICAgICAvLyBpbnNpZGUgYSBoaWRkZW4gT2Zmc2NyZWVuIHRyZWUuXG4gICAgICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihvZmZzY3JlZW5Cb3VuZGFyeSwgX2lzSGlkZGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIFBsYWNlbWVudCBlZmZlY3RzIChpbnNlcnRpb25zLCByZW9yZGVycykgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgZmliZXJcbiAgLy8gdHlwZS4gVGhleSBuZWVkcyB0byBoYXBwZW4gYWZ0ZXIgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGF2ZSBmaXJlZCwgYnV0XG4gIC8vIGJlZm9yZSB0aGUgZWZmZWN0cyBvbiB0aGlzIGZpYmVyIGhhdmUgZmlyZWQuXG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcblxuICBpZiAoZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICB0cnkge1xuICAgICAgY29tbWl0UGxhY2VtZW50KGZpbmlzaGVkV29yayk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgIH0gLy8gQ2xlYXIgdGhlIFwicGxhY2VtZW50XCIgZnJvbSBlZmZlY3QgdGFnIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgaXNcbiAgICAvLyBpbnNlcnRlZCwgYmVmb3JlIGFueSBsaWZlLWN5Y2xlcyBsaWtlIGNvbXBvbmVudERpZE1vdW50IGdldHMgY2FsbGVkLlxuICAgIC8vIFRPRE86IGZpbmRET01Ob2RlIGRvZXNuJ3QgcmVseSBvbiB0aGlzIGFueSBtb3JlIGJ1dCBpc01vdW50ZWQgZG9lc1xuICAgIC8vIGFuZCBpc01vdW50ZWQgaXMgZGVwcmVjYXRlZCBhbnl3YXkgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8ga2lsbCB0aGlzLlxuXG5cbiAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gflBsYWNlbWVudDtcbiAgfVxuXG4gIGlmIChmbGFncyAmIEh5ZHJhdGluZykge1xuICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+SHlkcmF0aW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICBpblByb2dyZXNzTGFuZXMgPSBjb21taXR0ZWRMYW5lcztcbiAgaW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICBuZXh0RWZmZWN0ID0gZmluaXNoZWRXb3JrO1xuICBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xuICBpblByb2dyZXNzUm9vdCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIC8vIFN1c3BlbnNlIGxheW91dCBlZmZlY3RzIHNlbWFudGljcyBkb24ndCBjaGFuZ2UgZm9yIGxlZ2FjeSByb290cy5cbiAgdmFyIGlzTW9kZXJuUm9vdCA9IChzdWJ0cmVlUm9vdC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoIGZpYmVyLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50ICYmIGlzTW9kZXJuUm9vdCkge1xuICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBPZmZzY3JlZW4gc3RhY2sncyBzdGF0ZS5cbiAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICB2YXIgbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gaXNIaWRkZW4gfHwgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuXG4gICAgICBpZiAobmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuKSB7XG4gICAgICAgIC8vIFRoZSBPZmZzY3JlZW4gdHJlZSBpcyBoaWRkZW4uIFNraXAgb3ZlciBpdHMgbGF5b3V0IGVmZmVjdHMuXG4gICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQWxzbyBjaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0TWFza1xuICAgICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgICAgdmFyIHdhc0hpZGRlbiA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICB2YXIgbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHdhc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjsgLy8gVHJhdmVyc2UgdGhlIE9mZnNjcmVlbiBzdWJ0cmVlIHdpdGggdGhlIGN1cnJlbnQgT2Zmc2NyZWVuIGFzIHRoZSByb290LlxuXG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG5ld09mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG5cbiAgICAgICAgaWYgKG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gJiYgIXByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBvZiBhIHJlYXBwZWFyaW5nIGJvdW5kYXJ5LiBUdXJuIGl0cyBsYXlvdXQgZWZmZWN0c1xuICAgICAgICAgIC8vIGJhY2sgb24uXG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihmaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hpbGQgPSBmaXJzdENoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKGNoaWxkLCAvLyBOZXcgcm9vdDsgYnViYmxlIGJhY2sgdXAgdG8gaGVyZSBhbmQgc3RvcC5cbiAgICAgICAgICByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9IC8vIFJlc3RvcmUgT2Zmc2NyZWVuIHN0YXRlIGFuZCByZXN1bWUgaW4gb3VyLXByb2dyZXNzIHRyYXZlcnNhbC5cblxuXG4gICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncyAmJiBmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykge1xuICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKHJvb3QsIGN1cnJlbnQsIGZpYmVyLCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkOyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIChSZWZTdGF0aWMgfCBMYXlvdXRTdGF0aWMpXG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICggZmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBSZWZTdGF0aWNcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGZpYmVyLCBmaWJlci5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFcbiAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAvLyBOZXN0ZWQgT2Zmc2NyZWVuIHRyZWUgaXMgYWxyZWFkeSBoaWRkZW4uIERvbid0IGRpc2FwcGVhclxuICAgICAgICAgICAgLy8gaXRzIGVmZmVjdHMuXG4gICAgICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuXG4gICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoZmliZXIudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQpIHtcbiAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAvLyBOZXN0ZWQgT2Zmc2NyZWVuIHRyZWUgaXMgc3RpbGwgaGlkZGVuLiBEb24ndCByZS1hcHBlYXIgaXRzIGVmZmVjdHMuXG4gICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0U3RhdGljXG5cblxuICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIG5vZGUgbWF5IGhhdmUgYmVlbiByZXVzZWQgZnJvbSBhIHByZXZpb3VzIHJlbmRlciwgc28gd2UgY2FuJ3RcbiAgICAgIC8vIGFzc3VtZSBpdHMgcmV0dXJuIHBvaW50ZXIgaXMgY29ycmVjdC5cbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICB0cnkge1xuICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzT25GaWJlcihmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmcm9tIGEgcHJldmlvdXMgcmVuZGVyLCBzbyB3ZSBjYW4ndFxuICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LlxuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgbmV4dEVmZmVjdCA9IGZpbmlzaGVkV29yaztcbiAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzICYmIGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihyb290LCBmaWJlciwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaXJzdENoaWxkKSB7XG4gIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2JlZ2luKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKG5leHRFZmZlY3QuZmxhZ3MgJiBDaGlsZERlbGV0aW9uKSAhPT0gTm9GbGFncykge1xuICAgICAgdmFyIGRlbGV0aW9ucyA9IGZpYmVyLmRlbGV0aW9ucztcblxuICAgICAgaWYgKGRlbGV0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBmaWJlclRvRGVsZXRlID0gZGVsZXRpb25zW2ldO1xuICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlclRvRGVsZXRlO1xuICAgICAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZmliZXJUb0RlbGV0ZSwgZmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIEEgZmliZXIgd2FzIGRlbGV0ZWQgZnJvbSB0aGlzIHBhcmVudCBmaWJlciwgYnV0IGl0J3Mgc3RpbGwgcGFydCBvZlxuICAgICAgICAgIC8vIHRoZSBwcmV2aW91cyAoYWx0ZXJuYXRlKSBwYXJlbnQgZmliZXIncyBsaXN0IG9mIGNoaWxkcmVuLiBCZWNhdXNlXG4gICAgICAgICAgLy8gY2hpbGRyZW4gYXJlIGEgbGlua2VkIGxpc3QsIGFuIGVhcmxpZXIgc2libGluZyB0aGF0J3Mgc3RpbGwgYWxpdmVcbiAgICAgICAgICAvLyB3aWxsIGJlIGNvbm5lY3RlZCB0byB0aGUgZGVsZXRlZCBmaWJlciB2aWEgaXRzIGBhbHRlcm5hdGVgOlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gICBsaXZlIGZpYmVyXG4gICAgICAgICAgLy8gICAtLWFsdGVybmF0ZS0tPiBwcmV2aW91cyBsaXZlIGZpYmVyXG4gICAgICAgICAgLy8gICAtLXNpYmxpbmctLT4gZGVsZXRlZCBmaWJlclxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgY2FuJ3QgZGlzY29ubmVjdCBgYWx0ZXJuYXRlYCBvbiBub2RlcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZWxldGVkXG4gICAgICAgICAgLy8geWV0LCBidXQgd2UgY2FuIGRpc2Nvbm5lY3QgdGhlIGBzaWJsaW5nYCBhbmQgYGNoaWxkYCBwb2ludGVycy5cbiAgICAgICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICAgIGlmIChwcmV2aW91c0ZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZGV0YWNoZWRDaGlsZCA9IHByZXZpb3VzRmliZXIuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChkZXRhY2hlZENoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzRmliZXIuY2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgZGV0YWNoZWRTaWJsaW5nID0gZGV0YWNoZWRDaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgIGRldGFjaGVkQ2hpbGQuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZCA9IGRldGFjaGVkU2libGluZztcbiAgICAgICAgICAgICAgfSB3aGlsZSAoZGV0YWNoZWRDaGlsZCAhPT0gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19jb21wbGV0ZSgpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpYmVyKTtcbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKGRlbGV0ZWRTdWJ0cmVlUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIERlbGV0aW9uIGVmZmVjdHMgZmlyZSBpbiBwYXJlbnQgLT4gY2hpbGQgb3JkZXJcbiAgICAvLyBUT0RPOiBDaGVjayBpZiBmaWJlciBoYXMgYSBQYXNzaXZlU3RhdGljIGZsYWdcblxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXIoZmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7IC8vIFRPRE86IE9ubHkgdHJhdmVyc2Ugc3VidHJlZSBpZiBpdCBoYXMgYSBQYXNzaXZlU3RhdGljIGZsYWcuIChCdXQsIGlmIHdlXG4gICAgLy8gZG8gdGhpcywgc3RpbGwgbmVlZCB0byBoYW5kbGUgYGRlbGV0ZWRUcmVlQ2xlYW5VcExldmVsYCBjb3JyZWN0bHkuKVxuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9jb21wbGV0ZShkZWxldGVkU3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuICAgIHZhciByZXR1cm5GaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSBlbnRpcmUgZGVsZXRlZCB0cmVlIGFuZCBjbGVhbiB1cCBmaWJlciBmaWVsZHMuXG4gICAgICAvLyBUaGlzIGlzIG1vcmUgYWdncmVzc2l2ZSB0aGFuIGlkZWFsLCBhbmQgdGhlIGxvbmcgdGVybSBnb2FsIGlzIHRvIG9ubHlcbiAgICAgIC8vIGhhdmUgdG8gZGV0YWNoIHRoZSBkZWxldGVkIHRyZWUgYXQgdGhlIHJvb3QuXG4gICAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcik7XG5cbiAgICAgIGlmIChmaWJlciA9PT0gZGVsZXRlZFN1YnRyZWVSb290KSB7XG4gICAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gcmV0dXJuRmliZXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXIoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICBzd2l0Y2ggKGN1cnJlbnQudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSwgY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufSAvLyBUT0RPOiBSZXVzZSByZWFwcGVhckxheW91dEVmZmVjdHMgdHJhdmVyc2FsIGhlcmU/XG5cblxuZnVuY3Rpb24gaW52b2tlTGF5b3V0RWZmZWN0TW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVBhc3NpdmVFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBDT01QT05FTlRfVFlQRSA9IDA7XG52YXIgSEFTX1BTRVVET19DTEFTU19UWVBFID0gMTtcbnZhciBST0xFX1RZUEUgPSAyO1xudmFyIFRFU1RfTkFNRV9UWVBFID0gMztcbnZhciBURVhUX1RZUEUgPSA0O1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBDT01QT05FTlRfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IuY29tcG9uZW50Jyk7XG4gIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IuaGFzX3BzZXVkb19jbGFzcycpO1xuICBST0xFX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnJvbGUnKTtcbiAgVEVTVF9OQU1FX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRlc3RfaWQnKTtcbiAgVEVYVF9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci50ZXh0Jyk7XG59XG52YXIgY29tbWl0SG9va3MgPSBbXTtcbmZ1bmN0aW9uIG9uQ29tbWl0Um9vdCQxKCkge1xuICB7XG4gICAgY29tbWl0SG9va3MuZm9yRWFjaChmdW5jdGlvbiAoY29tbWl0SG9vaykge1xuICAgICAgcmV0dXJuIGNvbW1pdEhvb2soKTtcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZTtcbmZ1bmN0aW9uIGlzTGVnYWN5QWN0RW52aXJvbm1lbnQoZmliZXIpIHtcbiAge1xuICAgIC8vIExlZ2FjeSBtb2RlLiBXZSBwcmVzZXJ2ZSB0aGUgYmVoYXZpb3Igb2YgUmVhY3QgMTcncyBhY3QuIEl0IGFzc3VtZXMgYW5cbiAgICAvLyBhY3QgZW52aXJvbm1lbnQgd2hlbmV2ZXIgYGplc3RgIGlzIGRlZmluZWQsIGJ1dCB5b3UgY2FuIHN0aWxsIHR1cm4gb2ZmXG4gICAgLy8gc3B1cmlvdXMgd2FybmluZ3MgYnkgc2V0dGluZyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZXhwbGljaXRseVxuICAgIC8vIHRvIGZhbHNlLlxuICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3Ig4oCTIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWxcbiAgICB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UICE9PSAndW5kZWZpbmVkJyA/IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCA6IHVuZGVmaW5lZDsgLy8gJEZsb3dFeHBlY3RlZEVycm9yIC0gRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgamVzdFxuXG4gICAgdmFyIGplc3RJc0RlZmluZWQgPSB0eXBlb2YgamVzdCAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgcmV0dXJuICBqZXN0SXNEZWZpbmVkICYmIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAhPT0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkge1xuICB7XG4gICAgdmFyIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCA9IC8vICRGbG93RXhwZWN0ZWRFcnJvciDigJMgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGdsb2JhbFxuICAgIHR5cGVvZiBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgIT09ICd1bmRlZmluZWQnID8gSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIHJlbGV2YW50IGRvY3VtZW50YXRpb24gcGFnZS5cbiAgICAgIGVycm9yKCdUaGUgY3VycmVudCB0ZXN0aW5nIGVudmlyb25tZW50IGlzIG5vdCBjb25maWd1cmVkIHRvIHN1cHBvcnQgJyArICdhY3QoLi4uKScpO1xuICAgIH1cblxuICAgIHJldHVybiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWw7XG4gIH1cbn1cblxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBSZWFjdEN1cnJlbnRPd25lciQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZTtcbnZhciBOb0NvbnRleHQgPVxuLyogICAgICAgICAgICAgKi9cbjA7XG52YXIgQmF0Y2hlZENvbnRleHQgPVxuLyogICAgICAgICAgICAgICAqL1xuMTtcbnZhciBSZW5kZXJDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICovXG4yO1xudmFyIENvbW1pdENvbnRleHQgPVxuLyogICAgICAgICAgICAgICAgKi9cbjQ7XG52YXIgUm9vdEluUHJvZ3Jlc3MgPSAwO1xudmFyIFJvb3RGYXRhbEVycm9yZWQgPSAxO1xudmFyIFJvb3RFcnJvcmVkID0gMjtcbnZhciBSb290U3VzcGVuZGVkID0gMztcbnZhciBSb290U3VzcGVuZGVkV2l0aERlbGF5ID0gNDtcbnZhciBSb290Q29tcGxldGVkID0gNTtcbnZhciBSb290RGlkTm90Q29tcGxldGUgPSA2OyAvLyBEZXNjcmliZXMgd2hlcmUgd2UgYXJlIGluIHRoZSBSZWFjdCBleGVjdXRpb24gc3RhY2tcblxudmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBOb0NvbnRleHQ7IC8vIFRoZSByb290IHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7IC8vIFRoZSBmaWJlciB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7IC8vIFRoZSBsYW5lcyB3ZSdyZSByZW5kZXJpbmdcblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gU3RhY2sgdGhhdCBhbGxvd3MgY29tcG9uZW50cyB0byBjaGFuZ2UgdGhlIHJlbmRlciBsYW5lcyBmb3IgaXRzIHN1YnRyZWVcbi8vIFRoaXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCB3b3JraW5nIG9uIGF0IHRoZSByb290LiBUaGUgb25seVxuLy8gY2FzZSB3aGVyZSBpdCdzIGRpZmZlcmVudCBmcm9tIGB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc2AgaXMgd2hlbiB3ZVxuLy8gZW50ZXIgYSBzdWJ0cmVlIHRoYXQgaXMgaGlkZGVuIGFuZCBuZWVkcyB0byBiZSB1bmhpZGRlbjogU3VzcGVuc2UgYW5kXG4vLyBPZmZzY3JlZW4gY29tcG9uZW50LlxuLy9cbi8vIE1vc3QgdGhpbmdzIGluIHRoZSB3b3JrIGxvb3Agc2hvdWxkIGRlYWwgd2l0aCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcy5cbi8vIE1vc3QgdGhpbmdzIGluIGJlZ2luL2NvbXBsZXRlIHBoYXNlcyBzaG91bGQgZGVhbCB3aXRoIHN1YnRyZWVSZW5kZXJMYW5lcy5cblxudmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG52YXIgc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5vTGFuZXMpOyAvLyBXaGV0aGVyIHRvIHJvb3QgY29tcGxldGVkLCBlcnJvcmVkLCBzdXNwZW5kZWQsIGV0Yy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzczsgLy8gQSBmYXRhbCBlcnJvciwgaWYgb25lIGlzIHRocm93blxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7IC8vIFwiSW5jbHVkZWRcIiBsYW5lcyByZWZlciB0byBsYW5lcyB0aGF0IHdlcmUgd29ya2VkIG9uIGR1cmluZyB0aGlzIHJlbmRlci4gSXQnc1xuLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gYHJlbmRlckxhbmVzYCBiZWNhdXNlIGByZW5kZXJMYW5lc2AgY2FuIGNoYW5nZSBhcyB5b3Vcbi8vIGVudGVyIGFuZCBleGl0IGFuIE9mZnNjcmVlbiB0cmVlLiBUaGlzIHZhbHVlIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgcmVuZGVyXG4vLyBsYW5lcyBmb3IgdGhlIGVudGlyZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmsgbGVmdCBvdmVyIGJ5IGNvbXBvbmVudHMgdGhhdCB3ZXJlIHZpc2l0ZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBPbmx5XG4vLyBpbmNsdWRlcyB1bnByb2Nlc3NlZCB1cGRhdGVzLCBub3Qgd29yayBpbiBiYWlsZWQgb3V0IGNoaWxkcmVuLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgKGluIGFuIGludGVybGVhdmVkIGV2ZW50KSBkdXJpbmcgdGhpcyByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7IC8vIExhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlICgqbm90KiBhbiBpbnRlcmxlYXZlZCBldmVudCkuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7IC8vIEVycm9ycyB0aGF0IGFyZSB0aHJvd24gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDsgLy8gVGhlc2UgYXJlIGVycm9ycyB0aGF0IHdlIHJlY292ZXJlZCBmcm9tIHdpdGhvdXQgc3VyZmFjaW5nIHRoZW0gdG8gdGhlIFVJLlxuLy8gV2Ugd2lsbCBsb2cgdGhlbSBvbmNlIHRoZSB0cmVlIGNvbW1pdHMuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGw7IC8vIFRoZSBtb3N0IHJlY2VudCB0aW1lIHdlIGNvbW1pdHRlZCBhIGZhbGxiYWNrLiBUaGlzIGxldHMgdXMgZW5zdXJlIGEgdHJhaW5cbi8vIG1vZGVsIHdoZXJlIHdlIGRvbid0IGNvbW1pdCBuZXcgbG9hZGluZyBzdGF0ZXMgaW4gdG9vIHF1aWNrIHN1Y2Nlc3Npb24uXG5cbnZhciBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gMDtcbnZhciBGQUxMQkFDS19USFJPVFRMRV9NUyA9IDUwMDsgLy8gVGhlIGFic29sdXRlIHRpbWUgZm9yIHdoZW4gd2Ugc2hvdWxkIHN0YXJ0IGdpdmluZyB1cCBvbiByZW5kZXJpbmdcbi8vIG1vcmUgYW5kIHByZWZlciBDUFUgc3VzcGVuc2UgaGV1cmlzdGljcyBpbnN0ZWFkLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IEluZmluaXR5OyAvLyBIb3cgbG9uZyBhIHJlbmRlciBpcyBzdXBwb3NlZCB0byB0YWtlIGJlZm9yZSB3ZSBzdGFydCBmb2xsb3dpbmcgQ1BVXG4vLyBzdXNwZW5zZSBoZXVyaXN0aWNzIGFuZCBvcHQgb3V0IG9mIHJlbmRlcmluZyBtb3JlIGNvbnRlbnQuXG5cbnZhciBSRU5ERVJfVElNRU9VVF9NUyA9IDUwMDtcbnZhciB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzZXRSZW5kZXJUaW1lcigpIHtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IG5vdygpICsgUkVOREVSX1RJTUVPVVRfTVM7XG59XG5cbmZ1bmN0aW9uIGdldFJlbmRlclRhcmdldFRpbWUoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lO1xufVxudmFyIGhhc1VuY2F1Z2h0RXJyb3IgPSBmYWxzZTtcbnZhciBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBudWxsO1xudmFyIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbDsgLy8gT25seSB1c2VkIHdoZW4gZW5hYmxlUHJvZmlsZXJOZXN0ZWRVcGRhdGVTY2hlZHVsZWRIb29rIGlzIHRydWU7XG52YXIgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7XG52YXIgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBOb0xhbmVzO1xudmFyIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107XG52YXIgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7IC8vIFVzZSB0aGVzZSB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3Agb2YgbmVzdGVkIHVwZGF0ZXNcblxudmFyIE5FU1RFRF9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG52YXIgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbDtcbnZhciBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbnZhciByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDsgLy8gSWYgdHdvIHVwZGF0ZXMgYXJlIHNjaGVkdWxlZCB3aXRoaW4gdGhlIHNhbWUgZXZlbnQsIHdlIHNob3VsZCB0cmVhdCB0aGVpclxuLy8gZXZlbnQgdGltZXMgYXMgc2ltdWx0YW5lb3VzLCBldmVuIGlmIHRoZSBhY3R1YWwgY2xvY2sgdGltZSBoYXMgYWR2YW5jZWRcbi8vIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2FsbC5cblxudmFyIGN1cnJlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbnZhciBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IE5vTGFuZXM7XG52YXIgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3Q7XG59XG5mdW5jdGlvbiByZXF1ZXN0RXZlbnRUaW1lKCkge1xuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgLy8gV2UncmUgaW5zaWRlIFJlYWN0LCBzbyBpdCdzIGZpbmUgdG8gcmVhZCB0aGUgYWN0dWFsIHRpbWUuXG4gICAgcmV0dXJuIG5vdygpO1xuICB9IC8vIFdlJ3JlIG5vdCBpbnNpZGUgUmVhY3QsIHNvIHdlIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgYnJvd3NlciBldmVudC5cblxuXG4gIGlmIChjdXJyZW50RXZlbnRUaW1lICE9PSBOb1RpbWVzdGFtcCkge1xuICAgIC8vIFVzZSB0aGUgc2FtZSBzdGFydCB0aW1lIGZvciBhbGwgdXBkYXRlcyB1bnRpbCB3ZSBlbnRlciBSZWFjdCBhZ2Fpbi5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbiAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgc2luY2UgUmVhY3QgeWllbGRlZC4gQ29tcHV0ZSBhIG5ldyBzdGFydCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IG5vdygpO1xuICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7XG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIFN5bmNMYW5lO1xuICB9IGVsc2UgaWYgKCAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQgJiYgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gVGhlc2UgYXJlIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC4gVGhlXG4gICAgLy8gb2xkIGJlaGF2aW9yIGlzIHRvIGdpdmUgdGhpcyB0aGUgc2FtZSBcInRocmVhZFwiIChsYW5lcykgYXNcbiAgICAvLyB3aGF0ZXZlciBpcyBjdXJyZW50bHkgcmVuZGVyaW5nLiBTbyBpZiB5b3UgY2FsbCBgc2V0U3RhdGVgIG9uIGEgY29tcG9uZW50XG4gICAgLy8gdGhhdCBoYXBwZW5zIGxhdGVyIGluIHRoZSBzYW1lIHJlbmRlciwgaXQgd2lsbCBmbHVzaC4gSWRlYWxseSwgd2Ugd2FudCB0b1xuICAgIC8vIHJlbW92ZSB0aGUgc3BlY2lhbCBjYXNlIGFuZCB0cmVhdCB0aGVtIGFzIGlmIHRoZXkgY2FtZSBmcm9tIGFuXG4gICAgLy8gaW50ZXJsZWF2ZWQgZXZlbnQuIFJlZ2FyZGxlc3MsIHRoaXMgcGF0dGVybiBpcyBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuXG4gICAgLy8gVGhpcyBiZWhhdmlvciBpcyBvbmx5IGEgZmFsbGJhY2suIFRoZSBmbGFnIG9ubHkgZXhpc3RzIHVudGlsIHdlIGNhbiByb2xsXG4gICAgLy8gb3V0IHRoZSBzZXRTdGF0ZSB3YXJuaW5nLCBzaW5jZSBleGlzdGluZyBjb2RlIG1pZ2h0IGFjY2lkZW50YWxseSByZWx5IG9uXG4gICAgLy8gdGhlIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAgcmV0dXJuIHBpY2tBcmJpdHJhcnlMYW5lKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBpc1RyYW5zaXRpb24gPSByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSAhPT0gTm9UcmFuc2l0aW9uO1xuXG4gIGlmIChpc1RyYW5zaXRpb24pIHtcbiAgICBpZiAoIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgICAgIGlmICghdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmFkZChmaWJlcik7XG4gICAgfSAvLyBUaGUgYWxnb3JpdGhtIGZvciBhc3NpZ25pbmcgYW4gdXBkYXRlIHRvIGEgbGFuZSBzaG91bGQgYmUgc3RhYmxlIGZvciBhbGxcbiAgICAvLyB1cGRhdGVzIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGhpbiB0aGUgc2FtZSBldmVudC4gVG8gZG8gdGhpcywgdGhlXG4gICAgLy8gaW5wdXRzIHRvIHRoZSBhbGdvcml0aG0gbXVzdCBiZSB0aGUgc2FtZS5cbiAgICAvL1xuICAgIC8vIFRoZSB0cmljayB3ZSB1c2UgaXMgdG8gY2FjaGUgdGhlIGZpcnN0IG9mIGVhY2ggb2YgdGhlc2UgaW5wdXRzIHdpdGhpbiBhblxuICAgIC8vIGV2ZW50LiBUaGVuIHJlc2V0IHRoZSBjYWNoZWQgdmFsdWVzIG9uY2Ugd2UgY2FuIGJlIHN1cmUgdGhlIGV2ZW50IGlzXG4gICAgLy8gb3Zlci4gT3VyIGhldXJpc3RpYyBmb3IgdGhhdCBpcyB3aGVuZXZlciB3ZSBlbnRlciBhIGNvbmN1cnJlbnQgd29yayBsb29wLlxuXG5cbiAgICBpZiAoY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPT09IE5vTGFuZSkge1xuICAgICAgLy8gQWxsIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUgc2FtZSBldmVudCBhcmUgYXNzaWduZWQgdGhlIHNhbWUgbGFuZS5cbiAgICAgIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmU7XG4gIH0gLy8gVXBkYXRlcyBvcmlnaW5hdGluZyBpbnNpZGUgY2VydGFpbiBSZWFjdCBtZXRob2RzLCBsaWtlIGZsdXNoU3luYywgaGF2ZVxuICAvLyB0aGVpciBwcmlvcml0eSBzZXQgYnkgdHJhY2tpbmcgaXQgd2l0aCBhIGNvbnRleHQgdmFyaWFibGUuXG4gIC8vXG4gIC8vIFRoZSBvcGFxdWUgdHlwZSByZXR1cm5lZCBieSB0aGUgaG9zdCBjb25maWcgaXMgaW50ZXJuYWxseSBhIGxhbmUsIHNvIHdlIGNhblxuICAvLyB1c2UgdGhhdCBkaXJlY3RseS5cbiAgLy8gVE9ETzogTW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZXZlbnQgcHJpb3JpdHkgbW9kdWxlLlxuXG5cbiAgdmFyIHVwZGF0ZUxhbmUgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICBpZiAodXBkYXRlTGFuZSAhPT0gTm9MYW5lKSB7XG4gICAgcmV0dXJuIHVwZGF0ZUxhbmU7XG4gIH0gLy8gVGhpcyB1cGRhdGUgb3JpZ2luYXRlZCBvdXRzaWRlIFJlYWN0LiBBc2sgdGhlIGhvc3QgZW52aXJvbm1lbnQgZm9yIGFuXG4gIC8vIGFwcHJvcHJpYXRlIHByaW9yaXR5LCBiYXNlZCBvbiB0aGUgdHlwZSBvZiBldmVudC5cbiAgLy9cbiAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuXG4gIC8vIHVzZSB0aGF0IGRpcmVjdGx5LlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuXG5cblxuICB2YXIgZXZlbnRMYW5lID0gZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkoKTtcbiAgcmV0dXJuIGV2ZW50TGFuZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFJldHJ5TGFuZShmaWJlcikge1xuICAvLyBUaGlzIGlzIGEgZm9yayBvZiBgcmVxdWVzdFVwZGF0ZUxhbmVgIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgU3VzcGVuc2VcbiAgLy8gXCJyZXRyaWVzXCIg4oCUIGEgc3BlY2lhbCB1cGRhdGUgdGhhdCBhdHRlbXB0cyB0byBmbGlwIGEgU3VzcGVuc2UgYm91bmRhcnlcbiAgLy8gZnJvbSBpdHMgcGxhY2Vob2xkZXIgc3RhdGUgdG8gaXRzIHByaW1hcnkvcmVzb2x2ZWQgc3RhdGUuXG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIFN5bmNMYW5lO1xuICB9XG5cbiAgcmV0dXJuIGNsYWltTmV4dFJldHJ5TGFuZSgpO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSkge1xuICBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKTtcblxuICB7XG4gICAgaWYgKGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCkge1xuICAgICAgZXJyb3IoJ3VzZUluc2VydGlvbkVmZmVjdCBtdXN0IG5vdCBzY2hlZHVsZSB1cGRhdGVzLicpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICB9XG4gIH0gLy8gTWFyayB0aGF0IHRoZSByb290IGhhcyBhIHBlbmRpbmcgdXBkYXRlLlxuXG5cbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vTGFuZXMgJiYgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgLy8gVGhpcyB1cGRhdGUgd2FzIGRpc3BhdGNoZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIFRoaXMgaXMgYSBtaXN0YWtlXG4gICAgLy8gaWYgdGhlIHVwZGF0ZSBvcmlnaW5hdGVzIGZyb20gdXNlciBzcGFjZSAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIGxvY2FsXG4gICAgLy8gaG9vayB1cGRhdGVzLCB3aGljaCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBhbmQgZG9uJ3QgcmVhY2ggdGhpc1xuICAgIC8vIGZ1bmN0aW9uKSwgYnV0IHRoZXJlIGFyZSBzb21lIGludGVybmFsIFJlYWN0IGZlYXR1cmVzIHRoYXQgdXNlIHRoaXMgYXNcbiAgICAvLyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIGxpa2Ugc2VsZWN0aXZlIGh5ZHJhdGlvbi5cbiAgICB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcik7IC8vIFRyYWNrIGxhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlXG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIG5vcm1hbCB1cGRhdGUsIHNjaGVkdWxlZCBmcm9tIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS4gRm9yXG4gICAgLy8gZXhhbXBsZSwgZHVyaW5nIGFuIGlucHV0IGV2ZW50LlxuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdhcm5JZlVwZGF0ZXNOb3RXcmFwcGVkV2l0aEFjdERFVihmaWJlcik7XG5cbiAgICBpZiAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgICAvLyBSZWNlaXZlZCBhbiB1cGRhdGUgdG8gYSB0cmVlIHRoYXQncyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlcmluZy4gTWFya1xuICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlXG4gICAgICAvLyBgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoYCBmbGFnIGlzIG9mZiBhbmQgdGhpcyBpcyBhIHJlbmRlclxuICAgICAgLy8gcGhhc2UgdXBkYXRlLiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHRyZWF0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGFzIGlmXG4gICAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuXG4gICAgICBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMsIGxhbmUpO1xuICAgICAgfVxuXG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgICAgICAvLyBUaGUgcm9vdCBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHdoaWNoIG1lYW5zIHRoaXMgcmVuZGVyXG4gICAgICAgIC8vIGRlZmluaXRlbHkgd29uJ3QgZmluaXNoLiBTaW5jZSB3ZSBoYXZlIGEgbmV3IHVwZGF0ZSwgbGV0J3MgbWFyayBpdCBhc1xuICAgICAgICAvLyBzdXNwZW5kZWQgbm93LCByaWdodCBiZWZvcmUgbWFya2luZyB0aGUgaW5jb21pbmcgdXBkYXRlLiBUaGlzIGhhcyB0aGVcbiAgICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCByZW5kZXIgYW5kIHN3aXRjaGluZyB0byB0aGUgdXBkYXRlLlxuICAgICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IG92ZXJyaWRlIHBpbmdzIHRoYXQgaGFwcGVuIHdoaWxlIHdlJ3ZlXG4gICAgICAgIC8vIGFscmVhZHkgc3RhcnRlZCByZW5kZXJpbmcuXG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuXG4gICAgaWYgKGxhbmUgPT09IFN5bmNMYW5lICYmIGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCAmJiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgLy8gRmx1c2ggdGhlIHN5bmNocm9ub3VzIHdvcmsgbm93LCB1bmxlc3Mgd2UncmUgYWxyZWFkeSB3b3JraW5nIG9yIGluc2lkZVxuICAgICAgLy8gYSBiYXRjaC4gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGluc2lkZSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgaW5zdGVhZCBvZlxuICAgICAgLy8gc2NoZWR1bGVDYWxsYmFja0ZvckZpYmVyIHRvIHByZXNlcnZlIHRoZSBhYmlsaXR5IHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgIC8vIHdpdGhvdXQgaW1tZWRpYXRlbHkgZmx1c2hpbmcgaXQuIFdlIG9ubHkgZG8gdGhpcyBmb3IgdXNlci1pbml0aWF0ZWRcbiAgICAgIC8vIHVwZGF0ZXMsIHRvIHByZXNlcnZlIGhpc3RvcmljYWwgYmVoYXZpb3Igb2YgbGVnYWN5IG1vZGUuXG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUluaXRpYWxIeWRyYXRpb25PblJvb3Qocm9vdCwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGZvcmsgb2Ygc2NoZWR1bGVVcGRhdGVPbkZpYmVyIHRoYXQgaXMgb25seSB1c2VkIHRvXG4gIC8vIHNjaGVkdWxlIHRoZSBpbml0aWFsIGh5ZHJhdGlvbiBvZiBhIHJvb3QgdGhhdCBoYXMganVzdCBiZWVuIGNyZWF0ZWQuIE1vc3RcbiAgLy8gb2YgdGhlIHN0dWZmIGluIHNjaGVkdWxlVXBkYXRlT25GaWJlciBjYW4gYmUgc2tpcHBlZC5cbiAgLy9cbiAgLy8gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIHNlcGFyYXRlIHBhdGgsIHRob3VnaCwgaXMgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gIC8vIGluaXRpYWwgY2hpbGRyZW4gZnJvbSBzdWJzZXF1ZW50IHVwZGF0ZXMuIEluIGZ1bGx5IGNsaWVudC1yZW5kZXJlZCByb290c1xuICAvLyAoY3JlYXRlUm9vdCBpbnN0ZWFkIG9mIGh5ZHJhdGVSb290KSwgYWxsIHRvcC1sZXZlbCByZW5kZXJzIGFyZSBtb2RlbGVkIGFzXG4gIC8vIHVwZGF0ZXMsIGJ1dCBoeWRyYXRpb24gcm9vdHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdFxuICAvLyBtYXRjaCB3aGF0IHdhcyByZW5kZXJlZCBvbiB0aGUgc2VydmVyLlxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgY3VycmVudC5sYW5lcyA9IGxhbmU7XG4gIG1hcmtSb290VXBkYXRlZChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn1cbmZ1bmN0aW9uIGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gT25seSBjYWxsZWQgYnkgY2xhc3MgY29tcG9uZW50cyxcbiAgLy8gd2hpY2ggc3BlY2lhbCAoZGVwcmVjYXRlZCkgYmVoYXZpb3IgZm9yIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZSBwcm9wcy5cbiAgcmV0dXJuICgvLyBUT0RPOiBSZW1vdmUgb3V0ZGF0ZWQgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoIGV4cGVyaW1lbnQuIFdlXG4gICAgLy8gZGVjaWRlZCBub3QgdG8gZW5hYmxlIGl0LlxuICAgICAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHRcbiAgKTtcbn0gLy8gVXNlIHRoaXMgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSB0YXNrIGZvciBhIHJvb3QuIFRoZXJlJ3Mgb25seSBvbmUgdGFzayBwZXJcbi8vIHJvb3Q7IGlmIGEgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQsIHdlJ2xsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcHJpb3JpdHlcbi8vIG9mIHRoZSBleGlzdGluZyB0YXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV4dCBsZXZlbCB0aGF0IHRoZVxuLy8gcm9vdCBoYXMgd29yayBvbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZXZlcnkgdXBkYXRlLCBhbmQgcmlnaHQgYmVmb3JlXG4vLyBleGl0aW5nIGEgdGFzay5cblxuZnVuY3Rpb24gZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIHZhciBleGlzdGluZ0NhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlOyAvLyBDaGVjayBpZiBhbnkgbGFuZXMgYXJlIGJlaW5nIHN0YXJ2ZWQgYnkgb3RoZXIgd29yay4gSWYgc28sIG1hcmsgdGhlbSBhc1xuICAvLyBleHBpcmVkIHNvIHdlIGtub3cgdG8gd29yayBvbiB0aG9zZSBuZXh0LlxuXG4gIG1hcmtTdGFydmVkTGFuZXNBc0V4cGlyZWQocm9vdCwgY3VycmVudFRpbWUpOyAvLyBEZXRlcm1pbmUgdGhlIG5leHQgbGFuZXMgdG8gd29yayBvbiwgYW5kIHRoZWlyIHByaW9yaXR5LlxuXG4gIHZhciBuZXh0TGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ID8gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgOiBOb0xhbmVzKTtcblxuICBpZiAobmV4dExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBUaGVyZSdzIG5vdGhpbmcgdG8gd29yayBvbi5cbiAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbENhbGxiYWNrJDEoZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICAgIH1cblxuICAgIHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdlIHVzZSB0aGUgaGlnaGVzdCBwcmlvcml0eSBsYW5lIHRvIHJlcHJlc2VudCB0aGUgcHJpb3JpdHkgb2YgdGhlIGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrUHJpb3JpdHkgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKG5leHRMYW5lcyk7IC8vIENoZWNrIGlmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgdGFzay4gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgaXQuXG5cbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSA9IHJvb3QuY2FsbGJhY2tQcmlvcml0eTtcblxuICBpZiAoZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID09PSBuZXdDYWxsYmFja1ByaW9yaXR5ICYmIC8vIFNwZWNpYWwgY2FzZSByZWxhdGVkIHRvIGBhY3RgLiBJZiB0aGUgY3VycmVudGx5IHNjaGVkdWxlZCB0YXNrIGlzIGFcbiAgLy8gU2NoZWR1bGVyIHRhc2ssIHJhdGhlciB0aGFuIGFuIGBhY3RgIHRhc2ssIGNhbmNlbCBpdCBhbmQgcmUtc2NoZWR1bGVkXG4gIC8vIG9uIHRoZSBgYWN0YCBxdWV1ZS5cbiAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsICYmIGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSkge1xuICAgIHtcbiAgICAgIC8vIElmIHdlJ3JlIGdvaW5nIHRvIHJlLXVzZSBhbiBleGlzdGluZyB0YXNrLCBpdCBuZWVkcyB0byBleGlzdC5cbiAgICAgIC8vIEFzc3VtZSB0aGF0IGRpc2NyZXRlIHVwZGF0ZSBtaWNyb3Rhc2tzIGFyZSBub24tY2FuY2VsbGFibGUgYW5kIG51bGwuXG4gICAgICAvLyBUT0RPOiBUZW1wb3JhcnkgdW50aWwgd2UgY29uZmlybSB0aGlzIHdhcm5pbmcgaXMgbm90IGZpcmVkLlxuICAgICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlID09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ICE9PSBTeW5jTGFuZSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgc2NoZWR1bGVkIGNhbGxiYWNrIHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfVxuICAgIH0gLy8gVGhlIHByaW9yaXR5IGhhc24ndCBjaGFuZ2VkLiBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIHRhc2suIEV4aXQuXG5cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FuY2VsIHRoZSBleGlzdGluZyBjYWxsYmFjay4gV2UnbGwgc2NoZWR1bGUgYSBuZXcgb25lIGJlbG93LlxuICAgIGNhbmNlbENhbGxiYWNrJDEoZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICB9IC8vIFNjaGVkdWxlIGEgbmV3IGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrTm9kZTtcblxuICBpZiAobmV3Q2FsbGJhY2tQcmlvcml0eSA9PT0gU3luY0xhbmUpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFN5bmMgUmVhY3QgY2FsbGJhY2tzIGFyZSBzY2hlZHVsZWQgb24gYSBzcGVjaWFsXG4gICAgLy8gaW50ZXJuYWwgcXVldWVcbiAgICBpZiAocm9vdC50YWcgPT09IExlZ2FjeVJvb3QpIHtcbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5ICE9PSBudWxsKSB7XG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZUxlZ2FjeVN5bmNDYWxsYmFjayhwZXJmb3JtU3luY1dvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVkdWxlU3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBGbHVzaCB0aGUgcXVldWUgaW4gYSBtaWNyb3Rhc2suXG4gICAgICBpZiAoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJbnNpZGUgYGFjdGAsIHVzZSBvdXIgaW50ZXJuYWwgYGFjdGAgcXVldWUgc28gdGhhdCB0aGVzZSBnZXQgZmx1c2hlZFxuICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNjb3BlIGV2ZW4gd2hlbiB1c2luZyB0aGUgc3luYyB2ZXJzaW9uXG4gICAgICAgIC8vIG9mIGBhY3RgLlxuICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQucHVzaChmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEluIFNhZmFyaSwgYXBwZW5kaW5nIGFuIGlmcmFtZSBmb3JjZXMgbWljcm90YXNrcyB0byBydW4uXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMjQ1OVxuICAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcnVubmluZyBjYWxsYmFja3MgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJcbiAgICAgICAgICAvLyBvciBjb21taXQgc28gd2UgbmVlZCB0byBjaGVjayBhZ2FpbnN0IHRoYXQuXG4gICAgICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgd291bGQgc3RpbGwgcHJlbWF0dXJlbHkgZmx1c2ggdGhlIGNhbGxiYWNrc1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIG91dHNpZGUgcmVuZGVyIG9yIGNvbW1pdCBwaGFzZSAoZS5nLiBpbiBhbiBldmVudCkuXG4gICAgICAgICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNjaGVkdWxlclByaW9yaXR5TGV2ZWw7XG5cbiAgICBzd2l0Y2ggKGxhbmVzVG9FdmVudFByaW9yaXR5KG5leHRMYW5lcykpIHtcbiAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSWRsZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrJDEoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCwgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICB9XG5cbiAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gbmV3Q2FsbGJhY2tQcmlvcml0eTtcbiAgcm9vdC5jYWxsYmFja05vZGUgPSBuZXdDYWxsYmFja05vZGU7XG59IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBldmVyeSBjb25jdXJyZW50IHRhc2ssIGkuZS4gYW55dGhpbmcgdGhhdFxuLy8gZ29lcyB0aHJvdWdoIFNjaGVkdWxlci5cblxuXG5mdW5jdGlvbiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3Qocm9vdCwgZGlkVGltZW91dCkge1xuICB7XG4gICAgcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH0gLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnRcbiAgLy8gZXZlbnQgdGltZS4gVGhlIG5leHQgdXBkYXRlIHdpbGwgY29tcHV0ZSBhIG5ldyBldmVudCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLFxuICAvLyBpbiBjYXNlIHRoZXkgc2NoZWR1bGUgYWRkaXRpb25hbCB3b3JrLlxuXG5cbiAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7XG4gIHZhciBkaWRGbHVzaFBhc3NpdmVFZmZlY3RzID0gZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuXG4gIGlmIChkaWRGbHVzaFBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoZSBwYXNzaXZlIGVmZmVjdCBwaGFzZSBtYXkgaGF2ZSBjYW5jZWxlZCB0aGUgY3VycmVudCB0YXNrLlxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC5cbiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgIT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0YXNrIHdhcyBjYW5jZWxlZC4gRXhpdC4gV2UgZG9uJ3QgbmVlZCB0byBjYWxsXG4gICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0XG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IHRhc2ssIG9yIHRoYXQgdGhlcmUncyBubyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGxhbmVzIHRvIHdvcmsgb24sIHVzaW5nIHRoZSBmaWVsZHMgc3RvcmVkXG4gIC8vIG9uIHRoZSByb290LlxuXG5cbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzIDogTm9MYW5lcyk7XG5cbiAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gRGVmZW5zaXZlIGNvZGluZy4gVGhpcyBpcyBuZXZlciBleHBlY3RlZCB0byBoYXBwZW4uXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gV2UgZGlzYWJsZSB0aW1lLXNsaWNpbmcgaW4gc29tZSBjYXNlczogaWYgdGhlIHdvcmsgaGFzIGJlZW4gQ1BVLWJvdW5kXG4gIC8vIGZvciB0b28gbG9uZyAoXCJleHBpcmVkXCIgd29yaywgdG8gcHJldmVudCBzdGFydmF0aW9uKSwgb3Igd2UncmUgaW5cbiAgLy8gc3luYy11cGRhdGVzLWJ5LWRlZmF1bHQgbW9kZS5cbiAgLy8gVE9ETzogV2Ugb25seSBjaGVjayBgZGlkVGltZW91dGAgZGVmZW5zaXZlbHksIHRvIGFjY291bnQgZm9yIGEgU2NoZWR1bGVyXG4gIC8vIGJ1ZyB3ZSdyZSBzdGlsbCBpbnZlc3RpZ2F0aW5nLiBPbmNlIHRoZSBidWcgaW4gU2NoZWR1bGVyIGlzIGZpeGVkLFxuICAvLyB3ZSBjYW4gcmVtb3ZlIHRoaXMsIHNpbmNlIHdlIHRyYWNrIGV4cGlyYXRpb24gb3Vyc2VsdmVzLlxuXG5cbiAgdmFyIHNob3VsZFRpbWVTbGljZSA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykgJiYgIWluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpICYmICggIWRpZFRpbWVvdXQpO1xuICB2YXIgZXhpdFN0YXR1cyA9IHNob3VsZFRpbWVTbGljZSA/IHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSA6IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbFxuICAgICAgLy8gcmVuZGVyIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsXG4gICAgICAvLyBpbmNsdWRlcyBhbGwgcGVuZGluZyB1cGRhdGVzIGFyZSBpbmNsdWRlZC4gSWYgaXQgc3RpbGwgZmFpbHMgYWZ0ZXJcbiAgICAgIC8vIHRoZSBzZWNvbmQgYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgaWYgKGVycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdERpZE5vdENvbXBsZXRlKSB7XG4gICAgICAvLyBUaGUgcmVuZGVyIHVud291bmQgd2l0aG91dCBjb21wbGV0aW5nIHRoZSB0cmVlLiBUaGlzIGhhcHBlbnMgaW4gc3BlY2lhbFxuICAgICAgLy8gY2FzZXMgd2hlcmUgbmVlZCB0byBleGl0IHRoZSBjdXJyZW50IHJlbmRlciB3aXRob3V0IHByb2R1Y2luZyBhXG4gICAgICAvLyBjb25zaXN0ZW50IHRyZWUgb3IgY29tbWl0dGluZy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBkdXJpbmcgYSBjb25jdXJyZW50IHJlbmRlciwgbm90IGEgZGlzY3JldGUgb3JcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZS4gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIGZvciB0aGlzIHdoZW4gd2VcbiAgICAgIC8vIHVud291bmQgdGhlIHN0YWNrLlxuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgY29tcGxldGVkLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByZW5kZXIgbWF5IGhhdmUgeWllbGRlZCB0byBhIGNvbmN1cnJlbnQgZXZlbnQsIGFuZCBpZiBzbyxcbiAgICAgIC8vIGNvbmZpcm0gdGhhdCBhbnkgbmV3bHkgcmVuZGVyZWQgc3RvcmVzIGFyZSBjb25zaXN0ZW50LlxuICAgICAgLy8gVE9ETzogSXQncyBwb3NzaWJsZSB0aGF0IGV2ZW4gYSBjb25jdXJyZW50IHJlbmRlciBtYXkgbmV2ZXIgaGF2ZSB5aWVsZGVkXG4gICAgICAvLyB0byB0aGUgbWFpbiB0aHJlYWQsIGlmIGl0IHdhcyBmYXN0IGVub3VnaCwgb3IgaWYgaXQgZXhwaXJlZC4gV2UgY291bGRcbiAgICAgIC8vIHNraXAgdGhlIGNvbnNpc3RlbmN5IGNoZWNrIGluIHRoYXQgY2FzZSwgdG9vLlxuICAgICAgdmFyIHJlbmRlcldhc0NvbmN1cnJlbnQgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpO1xuICAgICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChyZW5kZXJXYXNDb25jdXJyZW50ICYmICFpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSkge1xuICAgICAgICAvLyBBIHN0b3JlIHdhcyBtdXRhdGVkIGluIGFuIGludGVybGVhdmVkIGV2ZW50LiBSZW5kZXIgYWdhaW4sXG4gICAgICAgIC8vIHN5bmNocm9ub3VzbHksIHRvIGJsb2NrIGZ1cnRoZXIgbXV0YXRpb25zLlxuICAgICAgICBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpOyAvLyBXZSBuZWVkIHRvIGNoZWNrIGFnYWluIGlmIHNvbWV0aGluZyB0aHJld1xuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICAgICAgICBpZiAoX2Vycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgbGFuZXMgPSBfZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIF9lcnJvclJldHJ5TGFuZXMpOyAvLyBXZSBhc3N1bWUgdGhlIHRyZWUgaXMgbm93IGNvbnNpc3RlbnQgYmVjYXVzZSB3ZSBkaWRuJ3QgeWllbGQgdG8gYW55XG4gICAgICAgICAgICAvLyBjb25jdXJyZW50IGV2ZW50cy5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICAgICAgICB0aHJvdyBfZmF0YWxFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gVGhlIG5leHQgc3RlcCBpcyBlaXRoZXIgdG8gY29tbWl0IGl0LFxuICAgICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC5cblxuXG4gICAgICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgICAgIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICAgICAgZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocm9vdC5jYWxsYmFja05vZGUgPT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgLy8gVGhlIHRhc2sgbm9kZSBzY2hlZHVsZWQgZm9yIHRoaXMgcm9vdCBpcyB0aGUgc2FtZSBvbmUgdGhhdCdzXG4gICAgLy8gY3VycmVudGx5IGV4ZWN1dGVkLiBOZWVkIHRvIHJldHVybiBhIGNvbnRpbnVhdGlvbi5cbiAgICByZXR1cm4gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKSB7XG4gIC8vIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24sIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsXG4gIC8vIGJhY2sgdG8gY2xpZW50IHNpZGUgcmVuZGVyLlxuICAvLyBCZWZvcmUgcmVuZGVyaW5nIGFnYWluLCBzYXZlIHRoZSBlcnJvcnMgZnJvbSB0aGUgcHJldmlvdXMgYXR0ZW1wdC5cbiAgdmFyIGVycm9yc0Zyb21GaXJzdEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzO1xuXG4gIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgLy8gVGhlIHNoZWxsIGZhaWxlZCB0byBoeWRyYXRlLiBTZXQgYSBmbGFnIHRvIGZvcmNlIGEgY2xpZW50IHJlbmRlcmluZ1xuICAgIC8vIGR1cmluZyB0aGUgbmV4dCBhdHRlbXB0LiBUbyBkbyB0aGlzLCB3ZSBjYWxsIHByZXBhcmVGcmVzaFN0YWNrIG5vd1xuICAgIC8vIHRvIGNyZWF0ZSB0aGUgcm9vdCB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBUaGlzIGlzIGEgYml0IHdlaXJkIGluIHRlcm1zXG4gICAgLy8gb2YgZmFjdG9yaW5nLCBiZWNhdXNlIGl0IHJlbGllcyBvbiByZW5kZXJSb290U3luYyBub3QgY2FsbGluZ1xuICAgIC8vIHByZXBhcmVGcmVzaFN0YWNrIGFnYWluIGluIHRoZSBjYWxsIGJlbG93LCB3aGljaCBoYXBwZW5zIGJlY2F1c2UgdGhlXG4gICAgLy8gcm9vdCBhbmQgbGFuZXMgaGF2ZW4ndCBjaGFuZ2VkLlxuICAgIC8vXG4gICAgLy8gVE9ETzogSSB0aGluayB3aGF0IHdlIHNob3VsZCBkbyBpcyBzZXQgRm9yY2VDbGllbnRSZW5kZXIgaW5zaWRlXG4gICAgLy8gdGhyb3dFeGNlcHRpb24sIGxpa2Ugd2UgZG8gZm9yIG5lc3RlZCBTdXNwZW5zZSBib3VuZGFyaWVzLiBUaGUgcmVhc29uXG4gICAgLy8gaXQncyBoZXJlIGluc3RlYWQgaXMgc28gd2UgY2FuIHN3aXRjaCB0byB0aGUgc3luY2hyb25vdXMgd29yayBsb29wLCB0b28uXG4gICAgLy8gU29tZXRoaW5nIHRvIGNvbnNpZGVyIGZvciBhIGZ1dHVyZSByZWZhY3Rvci5cbiAgICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICByb290V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICB7XG4gICAgICBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEVycm9yZWQpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgZmluaXNoZWQgcmVuZGVyaW5nIG9uIHJldHJ5XG4gICAgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBmYWlsZWQgZmlyc3QgYXR0ZW1wdCBoYXZlIGJlZW4gcmVjb3ZlcmVkLiBBZGRcbiAgICAvLyB0aGVtIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHJlY292ZXJhYmxlIGVycm9ycy4gV2UnbGwgbG9nIHRoZW0gaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlLlxuICAgIHZhciBlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdDsgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBzZWNvbmQgYXR0ZW1wdCBzaG91bGQgYmUgcXVldWVkIGFmdGVyIHRoZSBlcnJvcnNcbiAgICAvLyBmcm9tIHRoZSBmaXJzdCBhdHRlbXB0LCB0byBwcmVzZXJ2ZSB0aGUgY2F1c2FsIHNlcXVlbmNlLlxuXG4gICAgaWYgKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ICE9PSBudWxsKSB7XG4gICAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpdFN0YXR1cztcbn1cblxuZnVuY3Rpb24gcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnMpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnM7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMucHVzaC5hcHBseSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgZXJyb3JzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7XG4gIHN3aXRjaCAoZXhpdFN0YXR1cykge1xuICAgIGNhc2UgUm9vdEluUHJvZ3Jlc3M6XG4gICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICAvLyBGbG93IGtub3dzIGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zIGlmIEkgYWRkIGEgYnJlYWtcbiAgICAvLyBzdGF0ZW1lbnQsIGJ1dCBlc2xpbnQgZG9lc24ndCBrbm93IGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zXG4gICAgLy8gaWYgSSBkby4gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFJvb3RFcnJvcmVkOlxuICAgICAge1xuICAgICAgICAvLyBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGF0dGVtcHRlZCB0byByZXRyeSB0aGlzIHRyZWUuIElmIHdlIHJlYWNoZWRcbiAgICAgICAgLy8gdGhpcyBwb2ludCwgaXQgZXJyb3JlZCBhZ2Fpbi4gQ29tbWl0IGl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOyAvLyBXZSBoYXZlIGFuIGFjY2VwdGFibGUgbG9hZGluZyBzdGF0ZS4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHdlXG4gICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC5cblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZVxuICAgICAgICAhc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIHJlbmRlciBvbmx5IGluY2x1ZGVkIHJldHJpZXMsIG5vIHVwZGF0ZXMuIFRocm90dGxlIGNvbW1pdHRpbmdcbiAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS5cbiAgICAgICAgICB2YXIgbXNVbnRpbFRpbWVvdXQgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgRkFMTEJBQ0tfVEhST1RUTEVfTVMgLSBub3coKTsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cbiAgICAgICAgICBpZiAobXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICAgICAgICAgICAgaWYgKG5leHRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuXG4gICAgICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhzdXNwZW5kZWRMYW5lcywgbGFuZXMpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdFxuICAgICAgICAgICAgICAvLyBzdXNwZW5kZWQgbGV2ZWwuIFBpbmcgdGhlIGxhc3Qgc3VzcGVuZGVkIGxldmVsIHRvIHRyeVxuICAgICAgICAgICAgICAvLyByZW5kZXJpbmcgaXQgYWdhaW4uXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC5cbiAgICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgICAgbWFya1Jvb3RQaW5nZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gVGhlIHJlbmRlciBpcyBzdXNwZW5kZWQsIGl0IGhhc24ndCB0aW1lZCBvdXQsIGFuZCB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB3b3JrIHRvIGRvLiBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cblxuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKSwgbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFRoZSB3b3JrIGV4cGlyZWQuIENvbW1pdCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZFdpdGhEZWxheTpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSB0cmFuc2l0aW9uLCBzbyB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IGNvbW1pdHRpbmcgYVxuICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIGFuZCB3aXRob3V0IHNjaGVkdWxpbmcgYSB0aW1lb3V0LiBEZWxheSBpbmRlZmluaXRlbHlcbiAgICAgICAgICAvLyB1bnRpbCB3ZSByZWNlaXZlIG1vcmUgZGF0YS5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHRyYW5zaXRpb24sIGJ1dCB3ZSBkaWQgdHJpZ2dlciBhbiBhdm9pZGVkIHN0YXRlLlxuICAgICAgICAgIC8vIFNjaGVkdWxlIGEgcGxhY2Vob2xkZXIgdG8gZGlzcGxheSBhZnRlciBhIHNob3J0IGRlbGF5LCB1c2luZyB0aGUgSnVzdFxuICAgICAgICAgIC8vIE5vdGljZWFibGUgRGlmZmVyZW5jZS5cbiAgICAgICAgICAvLyBUT0RPOiBJcyB0aGUgSk5EIG9wdGltaXphdGlvbiB3b3J0aCB0aGUgYWRkZWQgY29tcGxleGl0eT8gSWYgdGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB3ZSB0cmFjayB0aGUgZXZlbnQgdGltZSwgdGhlbiBwcm9iYWJseSBub3QuXG4gICAgICAgICAgLy8gQ29uc2lkZXIgcmVtb3ZpbmcuXG4gICAgICAgICAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICB2YXIgZXZlbnRUaW1lTXMgPSBtb3N0UmVjZW50RXZlbnRUaW1lO1xuICAgICAgICAgIHZhciB0aW1lRWxhcHNlZE1zID0gbm93KCkgLSBldmVudFRpbWVNcztcblxuICAgICAgICAgIHZhciBfbXNVbnRpbFRpbWVvdXQgPSBqbmQodGltZUVsYXBzZWRNcykgLSB0aW1lRWxhcHNlZE1zOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuXG4gICAgICAgICAgaWYgKF9tc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgICAgICAgIC8vIHRvIGFycml2ZS5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBfbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RDb21wbGV0ZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRoZSB3b3JrIGNvbXBsZXRlZC4gUmVhZHkgdG8gY29tbWl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcm9vdCBleGl0IHN0YXR1cy4nKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIFNlYXJjaCB0aGUgcmVuZGVyZWQgdHJlZSBmb3IgZXh0ZXJuYWwgc3RvcmUgcmVhZHMsIGFuZCBjaGVjayB3aGV0aGVyIHRoZVxuICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkIGluIGEgY29uY3VycmVudCBldmVudC4gSW50ZW50aW9uYWxseSB1c2luZyBhbiBpdGVyYXRpdmVcbiAgLy8gbG9vcCBpbnN0ZWFkIG9mIHJlY3Vyc2lvbiBzbyB3ZSBjYW4gZXhpdCBlYXJseS5cbiAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobm9kZS5mbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kpIHtcbiAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5vZGUudXBkYXRlUXVldWU7XG5cbiAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gdXBkYXRlUXVldWUuc3RvcmVzO1xuXG4gICAgICAgIGlmIChjaGVja3MgIT09IG51bGwpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoZWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoZWNrID0gY2hlY2tzW2ldO1xuICAgICAgICAgICAgdmFyIGdldFNuYXBzaG90ID0gY2hlY2suZ2V0U25hcHNob3Q7XG4gICAgICAgICAgICB2YXIgcmVuZGVyZWRWYWx1ZSA9IGNoZWNrLnZhbHVlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIW9iamVjdElzKGdldFNuYXBzaG90KCksIHJlbmRlcmVkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm91bmQgYW4gaW5jb25zaXN0ZW50IHN0b3JlLlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYGdldFNuYXBzaG90YCB0aHJvd3MsIHJldHVybiBgZmFsc2VgLiBUaGlzIHdpbGwgc2NoZWR1bGVcbiAgICAgICAgICAgICAgLy8gYSByZS1yZW5kZXIsIGFuZCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biBkdXJpbmcgcmVuZGVyLlxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChub2RlLnN1YnRyZWVGbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9IC8vIEZsb3cgZG9lc24ndCBrbm93IHRoaXMgaXMgdW5yZWFjaGFibGUsIGJ1dCBlc2xpbnQgZG9lc1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGVcblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIC8vIFdoZW4gc3VzcGVuZGluZywgd2Ugc2hvdWxkIGFsd2F5cyBleGNsdWRlIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgb3IgKG1vcmVcbiAgLy8gcmFyZWx5LCBzaW5jZSB3ZSB0cnkgdG8gYXZvaWQgaXQpIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gIC8vIFRPRE86IExvbCBtYXliZSB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byBmYWN0b3IgdGhpcyBiZXNpZGVzIHRoaXNcbiAgLy8gb2Jub3hpb3VzbHkgbmFtZWQgZnVuY3Rpb24gOilcbiAgc3VzcGVuZGVkTGFuZXMgPSByZW1vdmVMYW5lcyhzdXNwZW5kZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMpO1xuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyk7XG4gIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgZ29cbi8vIHRocm91Z2ggU2NoZWR1bGVyXG5cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QpIHtcbiAge1xuICAgIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH1cblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShsYW5lcywgU3luY0xhbmUpKSB7XG4gICAgLy8gVGhlcmUncyBubyByZW1haW5pbmcgc3luYyB3b3JrIGxlZnQuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChyb290LnRhZyAhPT0gTGVnYWN5Um9vdCAmJiBleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbCByZW5kZXJcbiAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kXG4gICAgLy8gYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gQmVjYXVzZSB0aGlzIGlzIGEgc3luYyByZW5kZXIsIHdlXG4gIC8vIHdpbGwgY29tbWl0IGl0IGV2ZW4gaWYgc29tZXRoaW5nIHN1c3BlbmRlZC5cblxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlO1xuICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpOyAvLyBCZWZvcmUgZXhpdGluZywgbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYWxsYmFjayBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0XG4gIC8vIHBlbmRpbmcgbGV2ZWwuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUm9vdChyb290LCBsYW5lcykge1xuICBpZiAobGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBtZXJnZUxhbmVzKGxhbmVzLCBTeW5jTGFuZSkpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcblxuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIElmIHRoZXJlIHdlcmUgbGVnYWN5IHN5bmMgdXBkYXRlcywgZmx1c2ggdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSBvdXRlclxuICAgIC8vIG1vc3QgYmF0Y2hlZFVwZGF0ZXMtbGlrZSBtZXRob2QuXG5cbiAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlzY3JldGVVcGRhdGVzKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKGEsIGIsIGMsIGQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICB9XG4gIH1cbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuZnVuY3Rpb24gZmx1c2hTeW5jKGZuKSB7XG4gIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBmbHVzaCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAvLyBuZXh0IGV2ZW50LCBub3QgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgb25lLlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwgJiYgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMudGFnID09PSBMZWdhY3lSb290ICYmIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICBpZiAoZm4pIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgLy8gdGhlIHN0YWNrLlxuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpc0FscmVhZHlSZW5kZXJpbmcoKSB7XG4gIC8vIFVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIHByaW50IGEgd2FybmluZyBpZiBjZXJ0YWluIEFQSXMgYXJlIGNhbGxlZCBmcm9tXG4gIC8vIHRoZSB3cm9uZyBjb250ZXh0LlxuICByZXR1cm4gIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dDtcbn1cbmZ1bmN0aW9uIHB1c2hSZW5kZXJMYW5lcyhmaWJlciwgbGFuZXMpIHtcbiAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpO1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHN1YnRyZWVSZW5kZXJMYW5lcywgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiBwb3BSZW5kZXJMYW5lcyhmaWJlcikge1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IuY3VycmVudDtcbiAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcykge1xuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciB0aW1lb3V0SGFuZGxlID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuXG4gIGlmICh0aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXQpIHtcbiAgICAvLyBUaGUgcm9vdCBwcmV2aW91cyBzdXNwZW5kZWQgYW5kIHNjaGVkdWxlZCBhIHRpbWVvdXQgdG8gY29tbWl0IGEgZmFsbGJhY2tcbiAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC5cbiAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7IC8vICRGbG93Rml4TWUgQ29tcGxhaW5zIG5vVGltZW91dCBpcyBub3QgYSBUaW1lb3V0SUQsIGRlc3BpdGUgdGhlIGNoZWNrIGFib3ZlXG5cbiAgICBjYW5jZWxUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaW50ZXJydXB0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gY3JlYXRlV29ya0luUHJvZ3Jlc3Mocm9vdC5jdXJyZW50LCBudWxsKTtcbiAgd29ya0luUHJvZ3Jlc3MgPSByb290V29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IGxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDtcbiAgZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpO1xuXG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzKCk7XG4gIH1cblxuICByZXR1cm4gcm9vdFdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSkge1xuICBkbyB7XG4gICAgdmFyIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzZXQgbW9kdWxlLWxldmVsIHN0YXRlIHRoYXQgd2FzIHNldCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTtcbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7IC8vIFRPRE86IEkgZm91bmQgYW5kIGFkZGVkIHRoaXMgbWlzc2luZyBsaW5lIHdoaWxlIGludmVzdGlnYXRpbmcgYVxuICAgICAgLy8gc2VwYXJhdGUgaXNzdWUuIFdyaXRlIGEgcmVncmVzc2lvbiB0ZXN0IHVzaW5nIHN0cmluZyByZWZzLlxuXG4gICAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgICBpZiAoZXJyb3JlZFdvcmsgPT09IG51bGwgfHwgZXJyb3JlZFdvcmsucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIHRvIGJlIHdvcmtpbmcgb24gYSBub24tcm9vdCBmaWJlci4gVGhpcyBpcyBhIGZhdGFsIGVycm9yXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlcmUncyBubyBhbmNlc3RvciB0aGF0IGNhbiBoYW5kbGUgaXQ7IHRoZSByb290IGlzXG4gICAgICAgIC8vIHN1cHBvc2VkIHRvIGNhcHR1cmUgYWxsIGVycm9ycyB0aGF0IHdlcmVuJ3QgY2F1Z2h0IGJ5IGFuIGVycm9yXG4gICAgICAgIC8vIGJvdW5kYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEZhdGFsRXJyb3JlZDtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IHRocm93blZhbHVlOyAvLyBTZXQgYHdvcmtJblByb2dyZXNzYCB0byBudWxsLiBUaGlzIHJlcHJlc2VudHMgYWR2YW5jaW5nIHRvIHRoZSBuZXh0XG4gICAgICAgIC8vIHNpYmxpbmcsIG9yIHRoZSBwYXJlbnQgaWYgdGhlcmUgYXJlIG5vIHNpYmxpbmdzLiBCdXQgc2luY2UgdGhlIHJvb3RcbiAgICAgICAgLy8gaGFzIG5vIHNpYmxpbmdzIG5vciBhIHBhcmVudCwgd2Ugc2V0IGl0IHRvIG51bGwuIFVzdWFsbHkgdGhpcyBpc1xuICAgICAgICAvLyBoYW5kbGVkIGJ5IGBjb21wbGV0ZVVuaXRPZldvcmtgIG9yIGB1bndpbmRXb3JrYCwgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgIC8vIGludGVudGlvbmFsbHkgbm90IGNhbGxpbmcgdGhvc2UsIHdlIG5lZWQgc2V0IGl0IGhlcmUuXG4gICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGNhbGxpbmcgYHVud2luZFdvcmtgIHRvIHBvcCB0aGUgY29udGV4dHMuXG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVycm9yZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHRpbWUgc3BlbnQgcmVuZGVyaW5nIGJlZm9yZSBhbiBlcnJvciB3YXMgdGhyb3duLiBUaGlzXG4gICAgICAgIC8vIGF2b2lkcyBpbmFjY3VyYXRlIFByb2ZpbGVyIGR1cmF0aW9ucyBpbiB0aGUgY2FzZSBvZiBhXG4gICAgICAgIC8vIHN1c3BlbmRlZCByZW5kZXIuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZXJyb3JlZFdvcmssIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG5cbiAgICAgICAgaWYgKHRocm93blZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB0aHJvd25WYWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRocm93blZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgd2FrZWFibGUgPSB0aHJvd25WYWx1ZTtcbiAgICAgICAgICBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGVycm9yZWRXb3JrLCB3YWtlYWJsZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcmtDb21wb25lbnRFcnJvcmVkKGVycm9yZWRXb3JrLCB0aHJvd25WYWx1ZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93RXhjZXB0aW9uKHJvb3QsIGVycm9yZWRXb3JrLnJldHVybiwgZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICBjb21wbGV0ZVVuaXRPZldvcmsoZXJyb3JlZFdvcmspO1xuICAgIH0gY2F0Y2ggKHlldEFub3RoZXJUaHJvd25WYWx1ZSkge1xuICAgICAgLy8gU29tZXRoaW5nIGluIHRoZSByZXR1cm4gcGF0aCBhbHNvIHRocmV3LlxuICAgICAgdGhyb3duVmFsdWUgPSB5ZXRBbm90aGVyVGhyb3duVmFsdWU7XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gZXJyb3JlZFdvcmsgJiYgZXJyb3JlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBoYXMgYWxyZWFkeSBlcnJvcmVkLCB0aGVuIHdlIGhhZCB0cm91YmxlIHByb2Nlc3NpbmdcbiAgICAgICAgLy8gdGhlIGVycm9yLiBCdWJibGUgaXQgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gICAgICAgIGVycm9yZWRXb3JrID0gZXJyb3JlZFdvcmsucmV0dXJuO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IGVycm9yZWRXb3JrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfSAvLyBSZXR1cm4gdG8gdGhlIG5vcm1hbCB3b3JrIGxvb3AuXG5cblxuICAgIHJldHVybjtcbiAgfSB3aGlsZSAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHB1c2hEaXNwYXRjaGVyKCkge1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudDtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKHByZXZEaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgLy8gVGhlIFJlYWN0IGlzb21vcnBoaWMgcGFja2FnZSBkb2VzIG5vdCBpbmNsdWRlIGEgZGVmYXVsdCBkaXNwYXRjaGVyLlxuICAgIC8vIEluc3RlYWQgdGhlIGZpcnN0IHJlbmRlcmVyIHdpbGwgbGF6aWx5IGF0dGFjaCBvbmUsIGluIG9yZGVyIHRvIGdpdmVcbiAgICAvLyBuaWNlciBlcnJvciBtZXNzYWdlcy5cbiAgICByZXR1cm4gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcmV2RGlzcGF0Y2hlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpIHtcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IG5vdygpO1xufVxuZnVuY3Rpb24gbWFya1NraXBwZWRVcGRhdGVMYW5lcyhsYW5lKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IG1lcmdlTGFuZXMobGFuZSwgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmQoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkV2l0aERlbGF5O1xuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWRcbiAgLy8gdGhpcyByZW5kZXIuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcykpKSB7XG4gICAgLy8gTWFyayB0aGUgY3VycmVudCByZW5kZXIgYXMgc3VzcGVuZGVkIHNvIHRoYXQgd2Ugc3dpdGNoIHRvIHdvcmtpbmcgb25cbiAgICAvLyB0aGUgdXBkYXRlcyB0aGF0IHdlcmUgc2tpcHBlZC4gVXN1YWxseSB3ZSBvbmx5IHN1c3BlbmQgYXQgdGhlIGVuZCBvZlxuICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgLy8gVE9ETzogV2Ugc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBtYXJrIHRoZSByb290IGFzIHN1c3BlbmRlZCBpbW1lZGlhdGVseVxuICAgIC8vIChpbnNpZGUgdGhpcyBmdW5jdGlvbiksIHNpbmNlIGJ5IHN1c3BlbmRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgcmVuZGVyXG4gICAgLy8gcGhhc2UgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBtaXN0YWtlIHdoZXJlIHdlIHN1c3BlbmQgbGFuZXMgdGhhdCB3ZXJlXG4gICAgLy8gcGluZ2VkIG9yIHVwZGF0ZWQgd2hpbGUgd2Ugd2VyZSByZW5kZXJpbmcuXG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMSh3b3JrSW5Qcm9ncmVzc1Jvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyRGlkRXJyb3IoZXJyb3IpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgIT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEVycm9yZWQ7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn0gLy8gQ2FsbGVkIGR1cmluZyByZW5kZXIgdG8gZGV0ZXJtaW5lIGlmIGFueXRoaW5nIGhhcyBzdXNwZW5kZWQuXG4vLyBSZXR1cm5zIGZhbHNlIGlmIHdlJ3JlIG5vdCBzdXJlLlxuXG5mdW5jdGlvbiByZW5kZXJIYXNOb3RTdXNwZW5kZWRZZXQoKSB7XG4gIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIG9yIGNvbXBsZXRlZCwgd2UgY2FuJ3QgcmVhbGx5IGJlIHN1cmUsXG4gIC8vIHNvIHRob3NlIGFyZSBmYWxzZS5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcFN5bmMoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgc3luYyByZW5kZXIsIHNvIHdlIHNob3VsZCBoYXZlIGZpbmlzaGVkIHRoZSB3aG9sZSB0cmVlLlxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCBhbiBpbmNvbXBsZXRlIHJvb3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhICcgKyAnYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xufSAvLyBUaGUgd29yayBsb29wIGlzIGFuIGV4dHJlbWVseSBob3QgcGF0aC4gVGVsbCBDbG9zdXJlIG5vdCB0byBpbmxpbmUgaXQuXG5cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcFN5bmMoKSB7XG4gIC8vIEFscmVhZHkgdGltZWQgb3V0LCBzbyBwZXJmb3JtIHdvcmsgd2l0aG91dCBjaGVja2luZyBpZiB3ZSBuZWVkIHRvIHlpZWxkLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBwdXNoRGlzcGF0Y2hlcigpOyAvLyBJZiB0aGUgcm9vdCBvciBsYW5lcyBoYXZlIGNoYW5nZWQsIHRocm93IG91dCB0aGUgZXhpc3Rpbmcgc3RhY2tcbiAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykge1xuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkge1xuICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC5cbiAgICAgICAgLy8gSWYgd2UgYmFpbG91dCBvbiB0aGlzIHdvcmssIHdlJ2xsIG1vdmUgdGhlbSBiYWNrIChsaWtlIGFib3ZlKS5cbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gbW92ZSB0aGVtIG5vdyBpbiBjYXNlIHRoZSB3b3JrIHNwYXducyBtb3JlIHdvcmsgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aCBkaWZmZXJlbnQgdXBkYXRlcnMuXG4gICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuXG5cblxuICAgICAgICBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKCk7XG4gICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wQ29uY3VycmVudCgpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgLy8gU3RpbGwgd29yayByZW1haW5pbmcuXG4gICAge1xuICAgICAgbWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUm9vdEluUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29tcGxldGVkIHRoZSB0cmVlLlxuICAgIHtcbiAgICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gICAgfSAvLyBTZXQgdGhpcyB0byBudWxsIHRvIGluZGljYXRlIHRoZXJlJ3Mgbm8gaW4tcHJvZ3Jlc3MgcmVuZGVyLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gUmV0dXJuIHRoZSBmaW5hbCBleGl0IHN0YXR1cy5cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICB9XG59XG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BDb25jdXJyZW50KCkge1xuICAvLyBQZXJmb3JtIHdvcmsgdW50aWwgU2NoZWR1bGVyIGFza3MgdXMgdG8geWllbGRcbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50ID0gdW5pdE9mV29yay5hbHRlcm5hdGU7XG4gIHNldEN1cnJlbnRGaWJlcih1bml0T2ZXb3JrKTtcbiAgdmFyIG5leHQ7XG5cbiAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gIH1cblxuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaXQgb2Ygd29yaywgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0XG4gIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci5cbiAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuXG4gIGRvIHtcbiAgICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy5cblxuICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY29tcGxldGVkV29yayk7XG4gICAgICB2YXIgbmV4dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLlxuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wbGV0aW5nIHRoaXMgZmliZXIgc3Bhd25lZCBuZXcgd29yay4gV29yayBvbiB0aGF0IG5leHQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBzb21ldGhpbmcgdGhyZXcuIFBvcCB2YWx1ZXMgb2ZmXG4gICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBlbnRlcmluZyB0aGUgY29tcGxldGUgcGhhc2UuIElmIHRoaXMgaXMgYSBib3VuZGFyeSxcbiAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLlxuICAgICAgdmFyIF9uZXh0ID0gdW53aW5kV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrKTsgLy8gQmVjYXVzZSB0aGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUsIGRvbid0IHJlc2V0IGl0cyBsYW5lcy5cblxuXG4gICAgICBpZiAoX25leHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgY29tcGxldGluZyB0aGlzIHdvcmsgc3Bhd25lZCBuZXcgd29yaywgZG8gdGhhdCBuZXh0LiBXZSdsbCBjb21lXG4gICAgICAgIC8vIGJhY2sgaGVyZSBhZ2Fpbi5cbiAgICAgICAgLy8gU2luY2Ugd2UncmUgcmVzdGFydGluZywgcmVtb3ZlIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgaG9zdCBlZmZlY3RcbiAgICAgICAgLy8gZnJvbSB0aGUgZWZmZWN0IHRhZy5cbiAgICAgICAgX25leHQuZmxhZ3MgJj0gSG9zdEVmZmVjdE1hc2s7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gX25leHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSByZW5kZXIgZHVyYXRpb24gZm9yIHRoZSBmaWJlciB0aGF0IGVycm9yZWQuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpOyAvLyBJbmNsdWRlIHRoZSB0aW1lIHNwZW50IHdvcmtpbmcgb24gZmFpbGVkIGNoaWxkcmVuIGJlZm9yZSBjb250aW51aW5nLlxuXG4gICAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgcGFyZW50IGZpYmVyIGFzIGluY29tcGxldGUgYW5kIGNsZWFyIGl0cyBzdWJ0cmVlIGZsYWdzLlxuICAgICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuICAgICAgICByZXR1cm5GaWJlci5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UndmUgdW53b3VuZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3REaWROb3RDb21wbGV0ZTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHNpYmxpbmdGaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnRcblxuXG4gICAgY29tcGxldGVkV29yayA9IHJldHVybkZpYmVyOyAvLyBVcGRhdGUgdGhlIG5leHQgdGhpbmcgd2UncmUgd29ya2luZyBvbiBpbiBjYXNlIHNvbWV0aGluZyB0aHJvd3MuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMpIHtcbiAgLy8gVE9ETzogVGhpcyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlLiBXZSBhbHJlYWR5IHdyYXAgdGhlIG11dGF0aW9uIGFuZFxuICAvLyBsYXlvdXQgcGhhc2VzLiBTaG91bGQgYmUgYWJsZSB0byByZW1vdmUuXG4gIHZhciBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGNvbW1pdFJvb3RJbXBsKHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucywgcHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCByZW5kZXJQcmlvcml0eUxldmVsKSB7XG4gIGRvIHtcbiAgICAvLyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBjYWxsIGBmbHVzaFN5bmNVcGRhdGVRdWV1ZWAgYXQgdGhlIGVuZCwgd2hpY2hcbiAgICAvLyBtZWFucyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBzb21ldGltZXMgcmVzdWx0IGluIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlXG4gICAgLy8gbm8gbW9yZSBwZW5kaW5nIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgYmV0dGVyIGlmIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCBkaWQgbm90IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gd2hpbGUgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKTtcblxuICBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmZpbmlzaGVkV29yaztcbiAgdmFyIGxhbmVzID0gcm9vdC5maW5pc2hlZExhbmVzO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBpZiAoZmluaXNoZWRXb3JrID09PSBudWxsKSB7XG5cbiAgICB7XG4gICAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgICAgICBlcnJvcigncm9vdC5maW5pc2hlZExhbmVzIHNob3VsZCBub3QgYmUgZW1wdHkgZHVyaW5nIGEgY29tbWl0LiBUaGlzIGlzIGEgJyArICdidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBudWxsO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IHJvb3QuY3VycmVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9IC8vIGNvbW1pdFJvb3QgbmV2ZXIgcmV0dXJucyBhIGNvbnRpbnVhdGlvbjsgaXQgYWx3YXlzIGZpbmlzaGVzIHN5bmNocm9ub3VzbHkuXG4gIC8vIFNvIHdlIGNhbiBjbGVhciB0aGVzZSBub3cgdG8gYWxsb3cgYSBuZXcgY2FsbGJhY2sgdG8gYmUgc2NoZWR1bGVkLlxuXG5cbiAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7IC8vIFVwZGF0ZSB0aGUgZmlyc3QgYW5kIGxhc3QgcGVuZGluZyB0aW1lcyBvbiB0aGlzIHJvb3QuIFRoZSBuZXcgZmlyc3RcbiAgLy8gcGVuZGluZyB0aW1lIGlzIHdoYXRldmVyIGlzIGxlZnQgb24gdGhlIHJvb3QgZmliZXIuXG5cbiAgdmFyIHJlbWFpbmluZ0xhbmVzID0gbWVyZ2VMYW5lcyhmaW5pc2hlZFdvcmsubGFuZXMsIGZpbmlzaGVkV29yay5jaGlsZExhbmVzKTtcbiAgbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcyk7XG5cbiAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFdlIGNhbiByZXNldCB0aGVzZSBub3cgdGhhdCB0aGV5IGFyZSBmaW5pc2hlZC5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzLCBzY2hlZHVsZSBhIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlbS5cbiAgLy8gRG8gdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSwgc28gaXQgaXMgcXVldWVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXRcbiAgLy8gbWlnaHQgZ2V0IHNjaGVkdWxlZCBpbiB0aGUgY29tbWl0IHBoYXNlLiAoU2VlICMxNjcxNC4pXG4gIC8vIFRPRE86IERlbGV0ZSBhbGwgb3RoZXIgcGxhY2VzIHRoYXQgc2NoZWR1bGUgdGhlIHBhc3NpdmUgZWZmZWN0IGNhbGxiYWNrXG4gIC8vIFRoZXkncmUgcmVkdW5kYW50LlxuXG5cbiAgaWYgKChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzIHx8IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICAvLyB0byBzdG9yZSBpdCBpbiBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zIHVudGlsIHRoZXkgZ2V0IHByb2Nlc3NlZFxuICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIHRoaXMgdGhyb3VnaCBhcyBhbiBhcmd1bWVudCB0byBjb21taXRSb290XG4gICAgICAvLyBiZWNhdXNlIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgbWlnaHQgaGF2ZSBjaGFuZ2VkIGJldHdlZW5cbiAgICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIgYW5kIGNvbW1pdCBpZiB3ZSB0aHJvdHRsZSB0aGUgY29tbWl0XG4gICAgICAvLyB3aXRoIHNldFRpbWVvdXRcblxuICAgICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zO1xuICAgICAgc2NoZWR1bGVDYWxsYmFjayQxKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTsgLy8gVGhpcyByZW5kZXIgdHJpZ2dlcmVkIHBhc3NpdmUgZWZmZWN0czogcmVsZWFzZSB0aGUgcm9vdCBjYWNoZSBwb29sXG4gICAgICAgIC8vICphZnRlciogcGFzc2l2ZSBlZmZlY3RzIGZpcmUgdG8gYXZvaWQgZnJlZWluZyBhIGNhY2hlIHBvb2wgdGhhdCBtYXlcbiAgICAgICAgLy8gYmUgcmVmZXJlbmNlZCBieSBhIG5vZGUgaW4gdGhlIHRyZWUgKEhvc3RSb290LCBDYWNoZSBib3VuZGFyeSBldGMpXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBlZmZlY3RzIGluIHRoZSB3aG9sZSB0cmVlLlxuICAvLyBUT0RPOiBUaGlzIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBlZmZlY3QgbGlzdCBpbXBsZW1lbnRhdGlvbiwgd2hlcmUgd2UgaGFkXG4gIC8vIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGBmaXJzdEVmZmVjdGAgdG8gc2F0aXNmeSBGbG93LiBJIHRoaW5rIHRoZVxuICAvLyBvbmx5IG90aGVyIHJlYXNvbiB0aGlzIG9wdGltaXphdGlvbiBleGlzdHMgaXMgYmVjYXVzZSBpdCBhZmZlY3RzIHByb2ZpbGluZy5cbiAgLy8gUmVjb25zaWRlciB3aGV0aGVyIHRoaXMgaXMgbmVjZXNzYXJ5LlxuXG5cbiAgdmFyIHN1YnRyZWVIYXNFZmZlY3RzID0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAoQmVmb3JlTXV0YXRpb25NYXNrIHwgTXV0YXRpb25NYXNrIHwgTGF5b3V0TWFzayB8IFBhc3NpdmVNYXNrKSkgIT09IE5vRmxhZ3M7XG4gIHZhciByb290SGFzRWZmZWN0ID0gKGZpbmlzaGVkV29yay5mbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcblxuICBpZiAoc3VidHJlZUhhc0VmZmVjdHMgfHwgcm9vdEhhc0VmZmVjdCkge1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7IC8vIFJlc2V0IHRoaXMgdG8gbnVsbCBiZWZvcmUgY2FsbGluZyBsaWZlY3ljbGVzXG5cbiAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsOyAvLyBUaGUgY29tbWl0IHBoYXNlIGlzIGJyb2tlbiBpbnRvIHNldmVyYWwgc3ViLXBoYXNlcy4gV2UgZG8gYSBzZXBhcmF0ZSBwYXNzXG4gICAgLy8gb2YgdGhlIGVmZmVjdCBsaXN0IGZvciBlYWNoIHBoYXNlOiBhbGwgbXV0YXRpb24gZWZmZWN0cyBjb21lIGJlZm9yZSBhbGxcbiAgICAvLyBsYXlvdXQgZWZmZWN0cywgYW5kIHNvIG9uLlxuICAgIC8vIFRoZSBmaXJzdCBwaGFzZSBhIFwiYmVmb3JlIG11dGF0aW9uXCIgcGhhc2UuIFdlIHVzZSB0aGlzIHBoYXNlIHRvIHJlYWQgdGhlXG4gICAgLy8gc3RhdGUgb2YgdGhlIGhvc3QgdHJlZSByaWdodCBiZWZvcmUgd2UgbXV0YXRlIGl0LiBUaGlzIGlzIHdoZXJlXG4gICAgLy8gZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgaXMgY2FsbGVkLlxuXG4gICAgdmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuXG4gICAge1xuICAgICAgLy8gTWFyayB0aGUgY3VycmVudCBjb21taXQgdGltZSB0byBiZSBzaGFyZWQgYnkgYWxsIFByb2ZpbGVycyBpbiB0aGlzXG4gICAgICAvLyBiYXRjaC4gVGhpcyBlbmFibGVzIHRoZW0gdG8gYmUgZ3JvdXBlZCBsYXRlci5cbiAgICAgIHJlY29yZENvbW1pdFRpbWUoKTtcbiAgICB9XG5cblxuICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcblxuICAgIHJlc2V0QWZ0ZXJDb21taXQocm9vdC5jb250YWluZXJJbmZvKTsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgdHJlZSBpcyBub3cgdGhlIGN1cnJlbnQgdHJlZS4gVGhpcyBtdXN0IGNvbWUgYWZ0ZXJcbiAgICAvLyB0aGUgbXV0YXRpb24gcGhhc2UsIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRyZWUgaXMgc3RpbGwgY3VycmVudCBkdXJpbmdcbiAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCwgYnV0IGJlZm9yZSB0aGUgbGF5b3V0IHBoYXNlLCBzbyB0aGF0IHRoZSBmaW5pc2hlZFxuICAgIC8vIHdvcmsgaXMgY3VycmVudCBkdXJpbmcgY29tcG9uZW50RGlkTW91bnQvVXBkYXRlLlxuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbGF5b3V0IHBoYXNlLCB3aGVyZSB3ZSBjYWxsIGVmZmVjdHMgdGhhdCByZWFkXG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cblxuICAgIGNvbW1pdExheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gICAgLy8gb3Bwb3J0dW5pdHkgdG8gcGFpbnQuXG5cblxuICAgIHJlcXVlc3RQYWludCgpO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gUmVzZXQgdGhlIHByaW9yaXR5IHRvIHRoZSBwcmV2aW91cyBub24tc3luYyB2YWx1ZS5cblxuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBObyBlZmZlY3RzLlxuICAgIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yazsgLy8gTWVhc3VyZSB0aGVzZSBhbnl3YXkgc28gdGhlIGZsYW1lZ3JhcGggZXhwbGljaXRseSBzaG93cyB0aGF0IHRoZXJlIHdlcmVcbiAgICAvLyBubyBlZmZlY3RzLlxuICAgIC8vIFRPRE86IE1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIHJlcG9ydCB0aGlzLlxuXG4gICAge1xuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290RGlkSGF2ZVBhc3NpdmVFZmZlY3RzID0gcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHM7XG5cbiAgaWYgKHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gVGhpcyBjb21taXQgaGFzIHBhc3NpdmUgZWZmZWN0cy4gU3Rhc2ggYSByZWZlcmVuY2UgdG8gdGhlbS4gQnV0IGRvbid0XG4gICAgLy8gc2NoZWR1bGUgYSBjYWxsYmFjayB1bnRpbCBhZnRlciBmbHVzaGluZyBsYXlvdXQgd29yay5cbiAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gcm9vdDtcbiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IGxhbmVzO1xuICB9IGVsc2Uge1xuXG4gICAge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7IC8vIENoZWNrIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290XG4gIC8vIFRPRE86IFRoaXMgaXMgcGFydCBvZiB0aGUgYGNvbXBvbmVudERpZENhdGNoYCBpbXBsZW1lbnRhdGlvbi4gSXRzIHB1cnBvc2VcbiAgLy8gaXMgdG8gZGV0ZWN0IHdoZXRoZXIgc29tZXRoaW5nIG1pZ2h0IGhhdmUgY2FsbGVkIHNldFN0YXRlIGluc2lkZVxuICAvLyBgY29tcG9uZW50RGlkQ2F0Y2hgLiBUaGUgbWVjaGFuaXNtIGlzIGtub3duIHRvIGJlIGZsYXdlZCBiZWNhdXNlIGBzZXRTdGF0ZWBcbiAgLy8gaW5zaWRlIGBjb21wb25lbnREaWRDYXRjaGAgaXMgaXRzZWxmIGZsYXdlZCDigJQgdGhhdCdzIHdoeSB3ZSByZWNvbW1lbmRcbiAgLy8gYGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcmAgaW5zdGVhZC4gSG93ZXZlciwgaXQgY291bGQgYmUgaW1wcm92ZWQgYnlcbiAgLy8gY2hlY2tpbmcgaWYgcmVtYWluaW5nTGFuZXMgaW5jbHVkZXMgU3luYyB3b3JrLCBpbnN0ZWFkIG9mIHdoZXRoZXIgdGhlcmUnc1xuICAvLyBhbnkgd29yayByZW1haW5pbmcgYXQgYWxsICh3aGljaCB3b3VsZCBhbHNvIGluY2x1ZGUgc3R1ZmYgbGlrZSBTdXNwZW5zZVxuICAvLyByZXRyaWVzIG9yIHRyYW5zaXRpb25zKS4gSXQncyBiZWVuIGxpa2UgdGhpcyBmb3IgYSB3aGlsZSwgdGhvdWdoLCBzbyBmaXhpbmdcbiAgLy8gaXQgcHJvYmFibHkgaXNuJ3QgdGhhdCB1cmdlbnQuXG5cbiAgaWYgKHJlbWFpbmluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gSWYgdGhlcmUncyBubyByZW1haW5pbmcgd29yaywgd2UgY2FuIGNsZWFyIHRoZSBzZXQgb2YgYWxyZWFkeSBmYWlsZWRcbiAgICAvLyBlcnJvciBib3VuZGFyaWVzLlxuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoIXJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkNvbW1pdFJvb3QoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSwgcmVuZGVyUHJpb3JpdHlMZXZlbCk7XG5cbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgcm9vdC5tZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG9uQ29tbWl0Um9vdCQxKCk7XG4gIH0gLy8gQWx3YXlzIGNhbGwgdGhpcyBiZWZvcmUgZXhpdGluZyBgY29tbWl0Um9vdGAsIHRvIGVuc3VyZSB0aGF0IGFueVxuICAvLyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290IGlzIHNjaGVkdWxlZC5cblxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKHJlY292ZXJhYmxlRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUgd2VyZSBlcnJvcnMgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgcmVjb3ZlcmVkIGZyb20gdGhlbSB3aXRob3V0XG4gICAgLy8gbmVlZGluZyB0byBzdXJmYWNlIGl0IHRvIHRoZSBVSS4gV2UgbG9nIHRoZW0gaGVyZS5cbiAgICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gcm9vdC5vblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY292ZXJhYmxlRXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IHJlY292ZXJhYmxlRXJyb3JzW2ldO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gcmVjb3ZlcmFibGVFcnJvci5zdGFjaztcbiAgICAgIHZhciBkaWdlc3QgPSByZWNvdmVyYWJsZUVycm9yLmRpZ2VzdDtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyYWJsZUVycm9yLnZhbHVlLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBjb21wb25lbnRTdGFjayxcbiAgICAgICAgZGlnZXN0OiBkaWdlc3RcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xuICAgIHZhciBlcnJvciQxID0gZmlyc3RVbmNhdWdodEVycm9yO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3IkMTtcbiAgfSAvLyBJZiB0aGUgcGFzc2l2ZSBlZmZlY3RzIGFyZSB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgcmVuZGVyLCBmbHVzaCB0aGVtXG4gIC8vIHN5bmNocm9ub3VzbHkgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCB0YXNrIHNvIHRoYXQgdGhlIHJlc3VsdCBpc1xuICAvLyBpbW1lZGlhdGVseSBvYnNlcnZhYmxlLiBPdGhlcndpc2UsIHdlIGFzc3VtZSB0aGF0IHRoZXkgYXJlIG5vdFxuICAvLyBvcmRlci1kZXBlbmRlbnQgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIG9ic2VydmVkIGJ5IGV4dGVybmFsIHN5c3RlbXMsIHNvIHdlXG4gIC8vIGNhbiB3YWl0IHVudGlsIGFmdGVyIHBhaW50LlxuICAvLyBUT0RPOiBXZSBjYW4gb3B0aW1pemUgdGhpcyBieSBub3Qgc2NoZWR1bGluZyB0aGUgY2FsbGJhY2sgZWFybGllci4gU2luY2Ugd2VcbiAgLy8gY3VycmVudGx5IHNjaGVkdWxlIHRoZSBjYWxsYmFjayBpbiBtdWx0aXBsZSBwbGFjZXMsIHdpbGwgd2FpdCB1bnRpbCB0aG9zZVxuICAvLyBhcmUgY29uc29saWRhdGVkLlxuXG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMsIFN5bmNMYW5lKSAmJiByb290LnRhZyAhPT0gTGVnYWN5Um9vdCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGEgcGFzc2l2ZSBlZmZlY3QgbWlnaHQgaGF2ZSB1cGRhdGVkIGl0XG5cblxuICByZW1haW5pbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHJlbWFpbmluZ0xhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICB7XG4gICAgICBtYXJrTmVzdGVkVXBkYXRlU2NoZWR1bGVkKCk7XG4gICAgfSAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByb290IHN5bmNocm9ub3VzbHkgcmUtcmVuZGVycyB3aXRob3V0XG4gICAgLy8gZmluaXNoaW5nLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnksIGl0IGluZGljYXRlcyBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcC5cblxuXG4gICAgaWYgKHJvb3QgPT09IHJvb3RXaXRoTmVzdGVkVXBkYXRlcykge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gcm9vdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICB9IC8vIElmIGxheW91dCB3b3JrIHdhcyBzY2hlZHVsZWQsIGZsdXNoIGl0IG5vdy5cblxuXG4gIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKSB7XG4gIC8vIFJldHVybnMgd2hldGhlciBwYXNzaXZlIGVmZmVjdHMgd2VyZSBmbHVzaGVkLlxuICAvLyBUT0RPOiBDb21iaW5lIHRoaXMgY2hlY2sgd2l0aCB0aGUgb25lIGluIGZsdXNoUGFzc2l2ZUVGZmVjdHNJbXBsLiBXZSBzaG91bGRcbiAgLy8gcHJvYmFibHkganVzdCBjb21iaW5lIHRoZSB0d28gZnVuY3Rpb25zLiBJIGJlbGlldmUgdGhleSB3ZXJlIG9ubHkgc2VwYXJhdGVcbiAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlIGJlY2F1c2Ugd2UgdXNlZCB0byB3cmFwIGl0IHdpdGhcbiAgLy8gYFNjaGVkdWxlci5ydW5XaXRoUHJpb3JpdHlgLCB3aGljaCBhY2NlcHRzIGEgZnVuY3Rpb24uIEJ1dCBub3cgd2UgdHJhY2sgdGhlXG4gIC8vIHByaW9yaXR5IHdpdGhpbiBSZWFjdCBpdHNlbGYsIHNvIHdlIGNhbiBtdXRhdGUgdGhlIHZhcmlhYmxlIGRpcmVjdGx5LlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpIHtcbiAgICB2YXIgcmVuZGVyUHJpb3JpdHkgPSBsYW5lc1RvRXZlbnRQcmlvcml0eShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyk7XG4gICAgdmFyIHByaW9yaXR5ID0gbG93ZXJFdmVudFByaW9yaXR5KERlZmF1bHRFdmVudFByaW9yaXR5LCByZW5kZXJQcmlvcml0eSk7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgICB0cnkge1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgICByZXR1cm4gZmx1c2hQYXNzaXZlRWZmZWN0c0ltcGwoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247IC8vIE9uY2UgcGFzc2l2ZSBlZmZlY3RzIGhhdmUgcnVuIGZvciB0aGUgdHJlZSAtIGdpdmluZyBjb21wb25lbnRzIGFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaWJlcikge1xuICB7XG4gICAgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMucHVzaChmaWJlcik7XG5cbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpIHtcbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIENhY2hlIGFuZCBjbGVhciB0aGUgdHJhbnNpdGlvbnMgZmxhZ1xuXG5cbiAgdmFyIHRyYW5zaXRpb25zID0gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucztcbiAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7XG4gIHZhciByb290ID0gcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHM7XG4gIHZhciBsYW5lcyA9IHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzO1xuICByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7IC8vIFRPRE86IFRoaXMgaXMgc29tZXRpbWVzIG91dCBvZiBzeW5jIHdpdGggcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMuXG4gIC8vIEZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIEl0J3Mgbm90IGNhdXNpbmcgYW55IGtub3duIGlzc3VlcyAocHJvYmFibHlcbiAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdXNlZCBmb3IgcHJvZmlsaW5nKSwgYnV0IGl0J3MgYSByZWZhY3RvciBoYXphcmQuXG5cbiAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuJyk7XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0cyhyb290LmN1cnJlbnQpO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIHJvb3QuY3VycmVudCwgbGFuZXMsIHRyYW5zaXRpb25zKTsgLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzXG5cbiAge1xuICAgIHZhciBwcm9maWxlckVmZmVjdHMgPSBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cztcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9maWxlckVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfZmliZXIgPSBwcm9maWxlckVmZmVjdHNbaV07XG4gICAgICBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKHJvb3QsIF9maWJlcik7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKTtcbiAgfVxuXG4gIHtcbiAgICBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYocm9vdC5jdXJyZW50LCB0cnVlKTtcbiAgfVxuXG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIC8vIElmIGFkZGl0aW9uYWwgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgc2NoZWR1bGVkLCBpbmNyZW1lbnQgYSBjb3VudGVyLiBJZiB0aGlzXG4gICAgLy8gZXhjZWVkcyB0aGUgbGltaXQsIHdlJ2xsIGZpcmUgYSB3YXJuaW5nLlxuICAgIGlmIChkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcykge1xuICAgICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgIH1cblxuICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfSAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuXG4gIG9uUG9zdENvbW1pdFJvb3Qocm9vdCk7XG5cbiAge1xuICAgIHZhciBzdGF0ZU5vZGUgPSByb290LmN1cnJlbnQuc3RhdGVOb2RlO1xuICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkge1xuICByZXR1cm4gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgIT09IG51bGwgJiYgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuaGFzKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQoaW5zdGFuY2UpIHtcbiAgaWYgKGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID09PSBudWxsKSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFtpbnN0YW5jZV0pO1xuICB9IGVsc2Uge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmFkZChpbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvVGhyb3dVbmNhdWdodEVycm9yKGVycm9yKSB7XG4gIGlmICghaGFzVW5jYXVnaHRFcnJvcikge1xuICAgIGhhc1VuY2F1Z2h0RXJyb3IgPSB0cnVlO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59XG5cbnZhciBvblVuY2F1Z2h0RXJyb3IgPSBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3I7XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHJvb3RGaWJlciwgc291cmNlRmliZXIsIGVycm9yKSB7XG4gIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciwgc291cmNlRmliZXIpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHJvb3RGaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7XG4gIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvciQxKSB7XG4gIHtcbiAgICByZXBvcnRVbmNhdWdodEVycm9ySW5ERVYoZXJyb3IkMSk7XG4gICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgfVxuXG4gIGlmIChzb3VyY2VGaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgLy8gRXJyb3Igd2FzIHRocm93biBhdCB0aGUgcm9vdC4gVGhlcmUgaXMgbm8gcGFyZW50LCBzbyB0aGUgcm9vdFxuICAgIC8vIGl0c2VsZiBzaG91bGQgY2FwdHVyZSBpdC5cbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChzb3VyY2VGaWJlciwgc291cmNlRmliZXIsIGVycm9yJDEpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaWJlciA9IG51bGw7XG5cbiAge1xuICAgIGZpYmVyID0gbmVhcmVzdE1vdW50ZWRBbmNlc3RvcjtcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChmaWJlciwgc291cmNlRmliZXIsIGVycm9yJDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdmFyIGN0b3IgPSBmaWJlci50eXBlO1xuICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkpIHtcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHNvdXJjZUZpYmVyKTtcbiAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICAgICAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIFRPRE86IFVudGlsIHdlIHJlLWxhbmQgc2tpcFVubW91bnRlZEJvdW5kYXJpZXMgKHNlZSAjMjAxNDcpLCB0aGlzIHdhcm5pbmdcbiAgICAvLyB3aWxsIGZpcmUgZm9yIGVycm9ycyB0aGF0IGFyZSB0aHJvd24gYnkgZGVzdHJveSBmdW5jdGlvbnMgaW5zaWRlIGRlbGV0ZWRcbiAgICAvLyB0cmVlcy4gV2hhdCBpdCBzaG91bGQgaW5zdGVhZCBkbyBpcyBwcm9wYWdhdGUgdGhlIGVycm9yIHRvIHRoZSBwYXJlbnQgb2ZcbiAgICAvLyB0aGUgZGVsZXRlZCB0cmVlLiBJbiB0aGUgbWVhbnRpbWUsIGRvIG5vdCBhZGQgdGhpcyB3YXJuaW5nIHRvIHRoZVxuICAgIC8vIGFsbG93bGlzdDsgdGhpcyBpcyBvbmx5IGZvciBvdXIgaW50ZXJuYWwgdXNlLlxuICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogQXR0ZW1wdGVkIHRvIGNhcHR1cmUgYSBjb21taXQgcGhhc2UgZXJyb3IgJyArICdpbnNpZGUgYSBkZXRhY2hlZCB0cmVlLiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC4gTGlrZWx5ICcgKyAnY2F1c2VzIGluY2x1ZGUgZGVsZXRpbmcgdGhlIHNhbWUgZmliZXIgbW9yZSB0aGFuIG9uY2UsIGNvbW1pdHRpbmcgYW4gJyArICdhbHJlYWR5LWZpbmlzaGVkIHRyZWUsIG9yIGFuIGluY29uc2lzdGVudCByZXR1cm4gcG9pbnRlci5cXG5cXG4nICsgJ0Vycm9yIG1lc3NhZ2U6XFxuXFxuJXMnLCBlcnJvciQxKTtcbiAgfVxufVxuZnVuY3Rpb24gcGluZ1N1c3BlbmRlZFJvb3Qocm9vdCwgd2FrZWFibGUsIHBpbmdlZExhbmVzKSB7XG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcblxuICBpZiAocGluZ0NhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHdha2VhYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcGluZ0NhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcyk7XG4gIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHtcbiAgICAvLyBSZWNlaXZlZCBhIHBpbmcgYXQgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgYXQgd2hpY2ggd2UncmUgY3VycmVudGx5XG4gICAgLy8gcmVuZGVyaW5nLiBXZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdGhpcyByZW5kZXIuIFRoaXMgc2hvdWxkIG1pcnJvclxuICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgcmVuZGVyaW5nIHN5bmMgZWl0aGVyIGR1ZSB0byBTeW5jLCBCYXRjaGVkIG9yIGV4cGlyZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIHJlc3RhcnQuXG4gICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmRcbiAgICAvLyBzbyB3ZSBjYW4gYWx3YXlzIHJlc3RhcnQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCAmJiBpbmNsdWRlc09ubHlSZXRyaWVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSAmJiBub3coKSAtIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPCBGQUxMQkFDS19USFJPVFRMRV9NUykge1xuICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LlxuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW5cbiAgICAgIC8vIG9wcG9ydHVuaXR5IGxhdGVyLiBTbyB3ZSBtYXJrIHRoaXMgcmVuZGVyIGFzIGhhdmluZyBhIHBpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMsIHBpbmdlZExhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn1cblxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpXG4gIC8vIHByZXZpb3VzbHkgd2FzIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0XG4gIC8vIHN1c3BlbmRlZCBpdCBoYXMgcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzXG4gIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGxhbmVzLlxuICBpZiAocmV0cnlMYW5lID09PSBOb0xhbmUpIHtcbiAgICAvLyBUT0RPOiBBc3NpZ24gdGhpcyB0byBgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmVgPyB0byBhdm9pZFxuICAgIC8vIHVubmVjZXNzYXJ5IGVudGFuZ2xlbWVudD9cbiAgICByZXRyeUxhbmUgPSByZXF1ZXN0UmV0cnlMYW5lKGJvdW5kYXJ5RmliZXIpO1xuICB9IC8vIFRPRE86IFNwZWNpYWwgY2FzZSBpZGxlIHByaW9yaXR5P1xuXG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCByZXRyeUxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV0cnlEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShib3VuZGFyeUZpYmVyKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gYm91bmRhcnlGaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgcmV0cnlMYW5lID0gTm9MYW5lO1xuXG4gIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgcmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmU7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVSZXRyeVdha2VhYmxlKGJvdW5kYXJ5RmliZXIsIHdha2VhYmxlKSB7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7IC8vIERlZmF1bHRcblxuICB2YXIgcmV0cnlDYWNoZTtcblxuICBzd2l0Y2ggKGJvdW5kYXJ5RmliZXIudGFnKSB7XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gYm91bmRhcnlGaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGluZ2VkIHVua25vd24gc3VzcGVuc2UgYm91bmRhcnkgdHlwZS4gJyArICdUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpO1xuICB9XG5cbiAgaWYgKHJldHJ5Q2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICByZXRyeUNhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn0gLy8gQ29tcHV0ZXMgdGhlIG5leHQgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UgKEpORCkgYm91bmRhcnkuXG4vLyBUaGUgdGhlb3J5IGlzIHRoYXQgYSBwZXJzb24gY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuXG4vLyBUaGVyZWZvcmUsIGlmIHdlIHdhaXQgYSBiaXQgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5IHRoYXQgd29uJ3QgdHJhbnNsYXRlIHRvIGEgbm90aWNlYWJsZVxuLy8gZGlmZmVyZW5jZSBpbiB0aGUgZXhwZXJpZW5jZS4gSG93ZXZlciwgd2FpdGluZyBmb3IgbG9uZ2VyIG1pZ2h0IG1lYW4gdGhhdCB3ZSBjYW4gYXZvaWRcbi8vIHNob3dpbmcgYW4gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFRoZSBsb25nZXIgd2UgaGF2ZSBhbHJlYWR5IHdhaXRlZCwgdGhlIGhhcmRlciBpdFxuLy8gaXMgdG8gdGVsbCBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLiBUaGVyZWZvcmUsIHRoZSBsb25nZXIgd2UndmUgYWxyZWFkeSB3YWl0ZWQsXG4vLyB0aGUgbG9uZ2VyIHdlIGNhbiB3YWl0IGFkZGl0aW9uYWxseS4gQXQgc29tZSBwb2ludCB3ZSBoYXZlIHRvIGdpdmUgdXAgdGhvdWdoLlxuLy8gV2UgcGljayBhIHRyYWluIG1vZGVsIHdoZXJlIHRoZSBuZXh0IGJvdW5kYXJ5IGNvbW1pdHMgYXQgYSBjb25zaXN0ZW50IHNjaGVkdWxlLlxuLy8gVGhlc2UgcGFydGljdWxhciBudW1iZXJzIGFyZSB2YWd1ZSBlc3RpbWF0ZXMuIFdlIGV4cGVjdCB0byBhZGp1c3QgdGhlbSBiYXNlZCBvbiByZXNlYXJjaC5cblxuZnVuY3Rpb24gam5kKHRpbWVFbGFwc2VkKSB7XG4gIHJldHVybiB0aW1lRWxhcHNlZCA8IDEyMCA/IDEyMCA6IHRpbWVFbGFwc2VkIDwgNDgwID8gNDgwIDogdGltZUVsYXBzZWQgPCAxMDgwID8gMTA4MCA6IHRpbWVFbGFwc2VkIDwgMTkyMCA/IDE5MjAgOiB0aW1lRWxhcHNlZCA8IDMwMDAgPyAzMDAwIDogdGltZUVsYXBzZWQgPCA0MzIwID8gNDMyMCA6IGNlaWwodGltZUVsYXBzZWQgLyAxOTYwKSAqIDE5NjA7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpIHtcbiAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVCkge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuICAgIHRocm93IG5ldyBFcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyAncmVwZWF0ZWRseSBjYWxscyBzZXRTdGF0ZSBpbnNpZGUgY29tcG9uZW50V2lsbFVwZGF0ZSBvciAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gUmVhY3QgbGltaXRzIHRoZSBudW1iZXIgb2YgbmVzdGVkIHVwZGF0ZXMgdG8gJyArICdwcmV2ZW50IGluZmluaXRlIGxvb3BzLicpO1xuICB9XG5cbiAge1xuICAgIGlmIChuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPiBORVNURURfUEFTU0lWRV9VUERBVEVfTElNSVQpIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDtcblxuICAgICAgZXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgXCJjYWxscyBzZXRTdGF0ZSBpbnNpZGUgdXNlRWZmZWN0LCBidXQgdXNlRWZmZWN0IGVpdGhlciBkb2Vzbid0IFwiICsgJ2hhdmUgYSBkZXBlbmRlbmN5IGFycmF5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBjaGFuZ2VzIG9uICcgKyAnZXZlcnkgcmVuZGVyLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKSB7XG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nKCk7XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncygpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYoZmliZXIsIGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gIHtcbiAgICAvLyBUT0RPIChTdHJpY3RFZmZlY3RzKSBTaG91bGQgd2Ugc2V0IGEgbWFya2VyIG9uIHRoZSByb290IGlmIGl0IGNvbnRhaW5zIHN0cmljdCBlZmZlY3RzXG4gICAgLy8gc28gd2UgZG9uJ3QgdHJhdmVyc2UgdW5uZWNlc3NhcmlseT8gc2ltaWxhciB0byBzdWJ0cmVlRmxhZ3MgYnV0IGp1c3QgYXQgdGhlIHJvb3QgbGV2ZWwuXG4gICAgLy8gTWF5YmUgbm90IGEgYmlnIGRlYWwgc2luY2UgdGhpcyBpcyBERVYgb25seSBiZWhhdmlvci5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdFVubW91bnRJbkRFVik7XG5cbiAgICBpZiAoaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRQYXNzaXZlRGV2LCBpbnZva2VQYXNzaXZlRWZmZWN0VW5tb3VudEluREVWKTtcbiAgICB9XG5cbiAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50TGF5b3V0RGV2LCBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RNb3VudEluREVWKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUVmZmVjdHNJbkRldihmaXJzdENoaWxkLCBmaWJlckZsYWdzLCBpbnZva2VFZmZlY3RGbikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgdmFyIGN1cnJlbnQgPSBmaXJzdENoaWxkO1xuICAgIHZhciBzdWJ0cmVlUm9vdCA9IG51bGw7XG5cbiAgICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByaW1hcnlTdWJ0cmVlRmxhZyA9IGN1cnJlbnQuc3VidHJlZUZsYWdzICYgZmliZXJGbGFncztcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IHN1YnRyZWVSb290ICYmIGN1cnJlbnQuY2hpbGQgIT09IG51bGwgJiYgcHJpbWFyeVN1YnRyZWVGbGFnICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKChjdXJyZW50LmZsYWdzICYgZmliZXJGbGFncykgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICBpbnZva2VFZmZlY3RGbihjdXJyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50LnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5zaWJsaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnQgPSBzdWJ0cmVlUm9vdCA9IGN1cnJlbnQucmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIFdlIGxldCB0aGUgb3RoZXIgd2FybmluZyBhYm91dCByZW5kZXIgcGhhc2UgdXBkYXRlcyBkZWFsIHdpdGggdGhpcyBvbmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0YWcgPSBmaWJlci50YWc7XG5cbiAgICBpZiAodGFnICE9PSBJbmRldGVybWluYXRlQ29tcG9uZW50ICYmIHRhZyAhPT0gSG9zdFJvb3QgJiYgdGFnICE9PSBDbGFzc0NvbXBvbmVudCAmJiB0YWcgIT09IEZ1bmN0aW9uQ29tcG9uZW50ICYmIHRhZyAhPT0gRm9yd2FyZFJlZiAmJiB0YWcgIT09IE1lbW9Db21wb25lbnQgJiYgdGFnICE9PSBTaW1wbGVNZW1vQ29tcG9uZW50KSB7XG4gICAgICAvLyBPbmx5IHdhcm4gZm9yIHVzZXItZGVmaW5lZCBjb21wb25lbnRzLCBub3QgaW50ZXJuYWwgb25lcyBsaWtlIFN1c3BlbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2Ugc2hvdyB0aGUgd2hvbGUgc3RhY2sgYnV0IGRlZHVwZSBvbiB0aGUgdG9wIGNvbXBvbmVudCdzIG5hbWUgYmVjYXVzZVxuICAgIC8vIHRoZSBwcm9ibGVtYXRpYyBjb2RlIGFsbW9zdCBhbHdheXMgbGllcyBpbnNpZGUgdGhhdCBjb21wb25lbnQuXG5cblxuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1JlYWN0Q29tcG9uZW50JztcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG5ldyBTZXQoW2NvbXBvbmVudE5hbWVdKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgZXJyb3IoXCJDYW4ndCBwZXJmb3JtIGEgUmVhY3Qgc3RhdGUgdXBkYXRlIG9uIGEgY29tcG9uZW50IHRoYXQgaGFzbid0IG1vdW50ZWQgeWV0LiBcIiArICdUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCAnICsgJ2FzeW5jaHJvbm91c2x5IGxhdGVyIGNhbGxzIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY29tcG9uZW50LiBNb3ZlIHRoaXMgd29yayB0byAnICsgJ3VzZUVmZmVjdCBpbnN0ZWFkLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbnZhciBiZWdpbldvcmskMTtcblxue1xuICB2YXIgZHVtbXlGaWJlciA9IG51bGw7XG5cbiAgYmVnaW5Xb3JrJDEgPSBmdW5jdGlvbiAoY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpIHtcbiAgICAvLyBJZiBhIGNvbXBvbmVudCB0aHJvd3MgYW4gZXJyb3IsIHdlIHJlcGxheSBpdCBhZ2FpbiBpbiBhIHN5bmNocm9ub3VzbHlcbiAgICAvLyBkaXNwYXRjaGVkIGV2ZW50LCBzbyB0aGF0IHRoZSBkZWJ1Z2dlciB3aWxsIHRyZWF0IGl0IGFzIGFuIHVuY2F1Z2h0XG4gICAgLy8gZXJyb3IgU2VlIFJlYWN0RXJyb3JVdGlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjb3B5IHRoZSB3b3JrLWluLXByb2dyZXNzIG9udG8gYSBkdW1teVxuICAgIC8vIGZpYmVyLiBJZiBiZWdpbldvcmsgdGhyb3dzLCB3ZSdsbCB1c2UgdGhpcyB0byByZXNldCB0aGUgc3RhdGUuXG4gICAgdmFyIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5ID0gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYoZHVtbXlGaWJlciwgdW5pdE9mV29yayk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGJlZ2luV29yayhjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG4gICAgfSBjYXRjaCAob3JpZ2luYWxFcnJvcikge1xuICAgICAgaWYgKGRpZFN1c3BlbmRPckVycm9yV2hpbGVIeWRyYXRpbmdERVYoKSB8fCBvcmlnaW5hbEVycm9yICE9PSBudWxsICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvci50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIERvbid0IHJlcGxheSBwcm9taXNlcy5cbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IGVycm9ycyBpZiB3ZSBhcmUgaHlkcmF0aW5nIGFuZCBoYXZlIGFscmVhZHkgc3VzcGVuZGVkIG9yIGhhbmRsZWQgYW4gZXJyb3JcbiAgICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICAgIH0gLy8gS2VlcCB0aGlzIGNvZGUgaW4gc3luYyB3aXRoIGhhbmRsZUVycm9yOyBhbnkgY2hhbmdlcyBoZXJlIG11c3QgaGF2ZVxuICAgICAgLy8gY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRoZXJlLlxuXG5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTsgLy8gRG9uJ3QgcmVzZXQgY3VycmVudCBkZWJ1ZyBmaWJlciwgc2luY2Ugd2UncmUgYWJvdXQgdG8gd29yayBvbiB0aGVcbiAgICAgIC8vIHNhbWUgZmliZXIgYWdhaW4uXG4gICAgICAvLyBVbndpbmQgdGhlIGZhaWxlZCBzdGFjayBmcmFtZVxuXG4gICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgdW5pdE9mV29yayk7IC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGZpYmVyLlxuXG4gICAgICBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih1bml0T2ZXb3JrLCBvcmlnaW5hbFdvcmtJblByb2dyZXNzQ29weSk7XG5cbiAgICAgIGlmICggdW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHByb2ZpbGVyIHRpbWVyLlxuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgICB9IC8vIFJ1biBiZWdpbldvcmsgYWdhaW4uXG5cblxuICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGJlZ2luV29yaywgbnVsbCwgY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpO1xuXG4gICAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgICB2YXIgcmVwbGF5RXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYXlFcnJvciA9PT0gJ29iamVjdCcgJiYgcmVwbGF5RXJyb3IgIT09IG51bGwgJiYgcmVwbGF5RXJyb3IuX3N1cHByZXNzTG9nZ2luZyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgb3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiAhb3JpZ2luYWxFcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgICAgLy8gSWYgc3VwcHJlc3NlZCwgbGV0IHRoZSBmbGFnIGNhcnJ5IG92ZXIgdG8gdGhlIG9yaWdpbmFsIGVycm9yIHdoaWNoIGlzIHRoZSBvbmUgd2UnbGwgcmV0aHJvdy5cbiAgICAgICAgICBvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIGFsd2F5cyB0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3IgaW4gY2FzZSB0aGUgc2Vjb25kIHJlbmRlciBwYXNzIGlzIG5vdCBpZGVtcG90ZW50LlxuICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGEgbWVtb2l6ZWQgZnVuY3Rpb24gb3IgQ29tbW9uSlMgbW9kdWxlIGRvZXNuJ3QgdGhyb3cgYWZ0ZXIgZmlyc3QgaW52b2NhdGlvbi5cblxuXG4gICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50O1xuXG57XG4gIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ1Vua25vd24nOyAvLyBEZWR1cGUgYnkgdGhlIHJlbmRlcmluZyBjb21wb25lbnQgYmVjYXVzZSBpdCdzIHRoZSBvbmUgdGhhdCBuZWVkcyB0byBiZSBmaXhlZC5cblxuICAgICAgICAgICAgdmFyIGRlZHVwZUtleSA9IHJlbmRlcmluZ0NvbXBvbmVudE5hbWU7XG5cbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmhhcyhkZWR1cGVLZXkpKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5hZGQoZGVkdXBlS2V5KTtcbiAgICAgICAgICAgICAgdmFyIHNldFN0YXRlQ29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBhIGNvbXBvbmVudCAoYCVzYCkgd2hpbGUgcmVuZGVyaW5nIGEgJyArICdkaWZmZXJlbnQgY29tcG9uZW50IChgJXNgKS4gVG8gbG9jYXRlIHRoZSBiYWQgc2V0U3RhdGUoKSBjYWxsIGluc2lkZSBgJXNgLCAnICsgJ2ZvbGxvdyB0aGUgc3RhY2sgdHJhY2UgYXMgZGVzY3JpYmVkIGluIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zZXRzdGF0ZS1pbi1yZW5kZXInLCBzZXRTdGF0ZUNvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGR1cmluZyBhbiBleGlzdGluZyBzdGF0ZSB0cmFuc2l0aW9uIChzdWNoIGFzICcgKyAnd2l0aGluIGByZW5kZXJgKS4gUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSAnICsgJ2Z1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4nKTtcblxuICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcykge1xuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcbiAgICAgIG1lbW9pemVkVXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc2NoZWR1bGluZ0ZpYmVyKSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBzY2hlZHVsaW5nRmliZXIsIGxhbmVzKTtcbiAgICAgIH0pOyAvLyBUaGlzIGZ1bmN0aW9uIGludGVudGlvbmFsbHkgZG9lcyBub3QgY2xlYXIgbWVtb2l6ZWQgdXBkYXRlcnMuXG4gICAgICAvLyBUaG9zZSBtYXkgc3RpbGwgYmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgY29tbWl0XG4gICAgICAvLyBhbmQgYSBmdXR1cmUgb25lIChlLmcuIFN1c3BlbnNlKS5cbiAgICB9XG4gIH1cbn1cbnZhciBmYWtlQWN0Q2FsbGJhY2tOb2RlID0ge307XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2skMShwcmlvcml0eUxldmVsLCBjYWxsYmFjaykge1xuICB7XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhbiBgYWN0YCBzY29wZSwgYnlwYXNzIFNjaGVkdWxlciBhbmQgcHVzaCB0b1xuICAgIC8vIHRoZSBgYWN0YCBxdWV1ZSBpbnN0ZWFkLlxuICAgIHZhciBhY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudDtcblxuICAgIGlmIChhY3RRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgYWN0UXVldWUucHVzaChjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZmFrZUFjdENhbGxiYWNrTm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5jZWxDYWxsYmFjayQxKGNhbGxiYWNrTm9kZSkge1xuICBpZiAoIGNhbGxiYWNrTm9kZSA9PT0gZmFrZUFjdENhbGxiYWNrTm9kZSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBJbiBwcm9kdWN0aW9uLCBhbHdheXMgY2FsbCBTY2hlZHVsZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBzdHJpcHBlZCBvdXQuXG5cblxuICByZXR1cm4gY2FuY2VsQ2FsbGJhY2soY2FsbGJhY2tOb2RlKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkge1xuICAvLyBOZXZlciBmb3JjZSBmbHVzaCBpbiBwcm9kdWN0aW9uLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBnZXQgc3RyaXBwZWQgb3V0LlxuICByZXR1cm4gIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBpZiAoIWlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlZ2FjeSBtb2RlIGhhcyBhZGRpdGlvbmFsIGNhc2VzIHdoZXJlIHdlIHN1cHByZXNzIGEgd2FybmluZy5cbiAgICAgIGlmICghaXNMZWdhY3lBY3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgIC8vIE5vdCBpbiBhbiBhY3QgZW52aXJvbm1lbnQuIE5vIG5lZWQgdG8gd2Fybi5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAgIC8vIExlZ2FjeSBtb2RlIGRvZXNuJ3Qgd2FybiBpZiB0aGUgdXBkYXRlIGlzIGJhdGNoZWQsIGkuZS5cbiAgICAgICAgLy8gYmF0Y2hlZFVwZGF0ZXMgb3IgZmx1c2hTeW5jLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWJlci50YWcgIT09IEZ1bmN0aW9uQ29tcG9uZW50ICYmIGZpYmVyLnRhZyAhPT0gRm9yd2FyZFJlZiAmJiBmaWJlci50YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcHJlLWhvb2tzIGNvZGUsIGxlZ2FjeSBtb2RlIG9ubHlcbiAgICAgICAgLy8gd2FybnMgZm9yIHVwZGF0ZXMgdGhhdCBvcmlnaW5hdGUgZnJvbSBhIGhvb2suXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCkge1xuICB7XG4gICAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignQSBzdXNwZW5kZWQgcmVzb3VyY2UgZmluaXNoZWQgbG9hZGluZyBpbnNpZGUgYSB0ZXN0LCBidXQgdGhlIGV2ZW50ICcgKyAnd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgcmVzb2x2ZXMgc3VzcGVuZGVkIGRhdGEgc2hvdWxkIGJlIHdyYXBwZWQgJyArICdpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmluaXNoIGxvYWRpbmcgc3VzcGVuZGVkIGRhdGEgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGlzUnVubmluZykge1xuICB7XG4gICAgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gaXNSdW5uaW5nO1xuICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXMgKi9cbnZhciByZXNvbHZlRmFtaWx5ID0gbnVsbDsgLy8gJEZsb3dGaXhNZSBGbG93IGdldHMgY29uZnVzZWQgYnkgYSBXZWFrU2V0IGZlYXR1cmUgY2hlY2sgYmVsb3cuXG5cbnZhciBmYWlsZWRCb3VuZGFyaWVzID0gbnVsbDtcbnZhciBzZXRSZWZyZXNoSGFuZGxlciA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gIHtcbiAgICByZXNvbHZlRmFtaWx5ID0gaGFuZGxlcjtcbiAgfVxufTtcbmZ1bmN0aW9uIHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIC8vIE5vIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzLlxuICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseSh0eXBlKTtcblxuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgcmVhbCBmb3J3YXJkUmVmLiBEb24ndCB3YW50IHRvIGNyYXNoIGVhcmx5LlxuICAgICAgaWYgKHR5cGUgIT09IG51bGwgJiYgdHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGb3J3YXJkUmVmIGlzIHNwZWNpYWwgYmVjYXVzZSBpdHMgcmVzb2x2ZWQgLnR5cGUgaXMgYW4gb2JqZWN0LFxuICAgICAgICAvLyBidXQgaXQncyBwb3NzaWJsZSB0aGF0IHdlIG9ubHkgaGF2ZSBpdHMgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGluIHRoZSBtYXAuXG4gICAgICAgIC8vIElmIHRoYXQgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCwgd2UnbGwgYnVpbGQgYSBuZXcgZm9yd2FyZFJlZiB0eXBlLlxuICAgICAgICB2YXIgY3VycmVudFJlbmRlciA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlLnJlbmRlcik7XG5cbiAgICAgICAgaWYgKHR5cGUucmVuZGVyICE9PSBjdXJyZW50UmVuZGVyKSB7XG4gICAgICAgICAgdmFyIHN5bnRoZXRpY1R5cGUgPSB7XG4gICAgICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICAgICAgICAgIHJlbmRlcjogY3VycmVudFJlbmRlclxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAodHlwZS5kaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzeW50aGV0aWNUeXBlLmRpc3BsYXlOYW1lID0gdHlwZS5kaXNwbGF5TmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3ludGhldGljVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhmaWJlciwgZWxlbWVudCkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHByZXZUeXBlID0gZmliZXIuZWxlbWVudFR5cGU7XG4gICAgdmFyIG5leHRUeXBlID0gZWxlbWVudC50eXBlOyAvLyBJZiB3ZSBnb3QgaGVyZSwgd2Uga25vdyB0eXBlcyBhcmVuJ3QgPT09IGVxdWFsLlxuXG4gICAgdmFyIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gZmFsc2U7XG4gICAgdmFyICQkdHlwZW9mTmV4dFR5cGUgPSB0eXBlb2YgbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIG5leHRUeXBlICE9PSBudWxsID8gbmV4dFR5cGUuJCR0eXBlb2YgOiBudWxsO1xuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5leHRUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgaW5uZXIgdHlwZSB5ZXQuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGUgbGF6eSBpbm5lciB0eXBlIGlzIHN0YWJsZSxcbiAgICAgICAgICAgIC8vIGFuZCBzbyBpdCBpcyBzdWZmaWNpZW50IHRvIGF2b2lkIHJlY29uY2lsaW5nIGl0IGF3YXkuXG4gICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gdW53cmFwIG9yIGFjdHVhbGx5IHVzZSB0aGUgbmV3IGxhenkgdHlwZS5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgICAgICAgLy8gVE9ETzogaWYgaXQgd2FzIGJ1dCBjYW4gbm8gbG9uZ2VyIGJlIHNpbXBsZSxcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBzZXQgdGhpcy5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIENoZWNrIGlmIGJvdGggdHlwZXMgaGF2ZSBhIGZhbWlseSBhbmQgaXQncyB0aGUgc2FtZSBvbmUuXG5cblxuICAgIGlmIChuZWVkc0NvbXBhcmVGYW1pbGllcykge1xuICAgICAgLy8gTm90ZTogbWVtbygpIGFuZCBmb3J3YXJkUmVmKCkgd2UnbGwgY29tcGFyZSBvdXRlciByYXRoZXIgdGhhbiBpbm5lciB0eXBlLlxuICAgICAgLy8gVGhpcyBtZWFucyBib3RoIG9mIHRoZW0gbmVlZCB0byBiZSByZWdpc3RlcmVkIHRvIHByZXNlcnZlIHN0YXRlLlxuICAgICAgLy8gSWYgd2UgdW53cmFwcGVkIGFuZCBjb21wYXJlZCB0aGUgaW5uZXIgdHlwZXMgZm9yIHdyYXBwZXJzIGluc3RlYWQsXG4gICAgICAvLyB0aGVuIHdlIHdvdWxkIHJpc2sgZmFsc2VseSBzYXlpbmcgdHdvIHNlcGFyYXRlIG1lbW8oRm9vKVxuICAgICAgLy8gY2FsbHMgYXJlIGVxdWl2YWxlbnQgYmVjYXVzZSB0aGV5IHdyYXAgdGhlIHNhbWUgRm9vIGZ1bmN0aW9uLlxuICAgICAgdmFyIHByZXZGYW1pbHkgPSByZXNvbHZlRmFtaWx5KHByZXZUeXBlKTtcblxuICAgICAgaWYgKHByZXZGYW1pbHkgIT09IHVuZGVmaW5lZCAmJiBwcmV2RmFtaWx5ID09PSByZXNvbHZlRmFtaWx5KG5leHRUeXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIFdlYWtTZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyA9PT0gbnVsbCkge1xuICAgICAgZmFpbGVkQm91bmRhcmllcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgZmFpbGVkQm91bmRhcmllcy5hZGQoZmliZXIpO1xuICB9XG59XG52YXIgc2NoZWR1bGVSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIHVwZGF0ZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHN0YWxlRmFtaWxpZXMgPSB1cGRhdGUuc3RhbGVGYW1pbGllcyxcbiAgICAgICAgdXBkYXRlZEZhbWlsaWVzID0gdXBkYXRlLnVwZGF0ZWRGYW1pbGllcztcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkocm9vdC5jdXJyZW50LCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjaGVkdWxlUm9vdCA9IGZ1bmN0aW9uIChyb290LCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocm9vdC5jb250ZXh0ICE9PSBlbXB0eUNvbnRleHRPYmplY3QpIHtcbiAgICAgIC8vIFN1cGVyIGVkZ2UgY2FzZTogcm9vdCBoYXMgYSBsZWdhY3kgX3JlbmRlclN1YnRyZWUgY29udGV4dFxuICAgICAgLy8gYnV0IHdlIGRvbid0IGtub3cgdGhlIHBhcmVudENvbXBvbmVudCBzbyB3ZSBjYW4ndCBwYXNzIGl0LlxuICAgICAgLy8gSnVzdCBpZ25vcmUuIFdlJ2xsIGRlbGV0ZSB0aGlzIHdpdGggX3JlbmRlclN1YnRyZWUgY29kZSBwYXRoIGxhdGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGZpYmVyLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGUsXG4gICAgICAgIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzb2x2ZUZhbWlseSB0byBiZSBzZXQgZHVyaW5nIGhvdCByZWxvYWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5lZWRzUmVuZGVyID0gZmFsc2U7XG4gICAgdmFyIG5lZWRzUmVtb3VudCA9IGZhbHNlO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVR5cGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KGNhbmRpZGF0ZVR5cGUpO1xuXG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHN0YWxlRmFtaWxpZXMuaGFzKGZhbWlseSkpIHtcbiAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIGlmICh0YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZWVkc1JlbmRlciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMgIT09IG51bGwpIHtcbiAgICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzLmhhcyhmaWJlcikgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGZhaWxlZEJvdW5kYXJpZXMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVlZHNSZW1vdW50KSB7XG4gICAgICBmaWJlci5fZGVidWdOZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQgfHwgbmVlZHNSZW5kZXIpIHtcbiAgICAgIHZhciBfcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAoX3Jvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKF9yb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgIW5lZWRzUmVtb3VudCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShjaGlsZCwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShzaWJsaW5nLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIGZhbWlsaWVzKSB7XG4gIHtcbiAgICB2YXIgaG9zdEluc3RhbmNlcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgdHlwZXMgPSBuZXcgU2V0KGZhbWlsaWVzLm1hcChmdW5jdGlvbiAoZmFtaWx5KSB7XG4gICAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gICAgfSkpO1xuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICByZXR1cm4gaG9zdEluc3RhbmNlcztcbiAgfVxufTtcblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KGZpYmVyLCB0eXBlcywgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGRpZE1hdGNoID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVzLmhhcyhjYW5kaWRhdGVUeXBlKSkge1xuICAgICAgICBkaWRNYXRjaCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZE1hdGNoKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guIFRoaXMgb25seSBkcmlsbHMgZG93biB0byB0aGUgY2xvc2VzdCBob3N0IGNvbXBvbmVudHMuXG4gICAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gc2VhcmNoIGRlZXBlciBiZWNhdXNlIGZvciB0aGUgcHVycG9zZSBvZiBnaXZpbmdcbiAgICAgIC8vIHZpc3VhbCBmZWVkYmFjaywgXCJmbGFzaGluZ1wiIG91dGVybW9zdCBwYXJlbnQgcmVjdGFuZ2xlcyBpcyBzdWZmaWNpZW50LlxuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsIG1heWJlIHRoZXJlIHdpbGwgYmUgb25lIGZ1cnRoZXIgZG93biBpbiB0aGUgY2hpbGQgdHJlZS5cbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoY2hpbGQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZpbmRDaGlsZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG5cbiAgICBpZiAoZm91bmRIb3N0SW5zdGFuY2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgaG9zdCBjaGlsZHJlbiwgZmFsbGJhY2sgdG8gY2xvc2VzdCBob3N0IHBhcmVudC5cblxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIHJlYWNoIHJvb3QgZmlyc3QuJyk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuICAgIHZhciBmb3VuZEhvc3RJbnN0YW5jZXMgPSBmYWxzZTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgLy8gV2UgZ290IGEgbWF0Y2guXG4gICAgICAgIGZvdW5kSG9zdEluc3RhbmNlcyA9IHRydWU7XG4gICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTsgLy8gVGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUsIHNvIGtlZXAgc2VhcmNoaW5nLlxuICAgICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmliZXIpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpYmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBoYXNCYWRNYXBQb2x5ZmlsbDtcblxue1xuICBoYXNCYWRNYXBQb2x5ZmlsbCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5vbkV4dGVuc2libGVPYmplY3QgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAqL1xuXG4gICAgbmV3IE1hcChbW25vbkV4dGVuc2libGVPYmplY3QsIG51bGxdXSk7XG4gICAgbmV3IFNldChbbm9uRXh0ZW5zaWJsZU9iamVjdF0pO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbmV3ICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGFib3V0IGJhZCBwb2x5ZmlsbHNcbiAgICBoYXNCYWRNYXBQb2x5ZmlsbCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gSW5zdGFuY2VcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmVsZW1lbnRUeXBlID0gbnVsbDtcbiAgdGhpcy50eXBlID0gbnVsbDtcbiAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlclxuXG4gIHRoaXMucmV0dXJuID0gbnVsbDtcbiAgdGhpcy5jaGlsZCA9IG51bGw7XG4gIHRoaXMuc2libGluZyA9IG51bGw7XG4gIHRoaXMuaW5kZXggPSAwO1xuICB0aGlzLnJlZiA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlOyAvLyBFZmZlY3RzXG5cbiAgdGhpcy5mbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMuc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5kZWxldGlvbnMgPSBudWxsO1xuICB0aGlzLmxhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgdG8gYXZvaWQgYSB2OCBwZXJmb3JtYW5jZSBjbGlmZi5cbiAgICAvL1xuICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aFxuICAgIC8vIGRvdWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSBGaWJlcnMgdG8gZW5kIHVwIGhhdmluZyBzZXBhcmF0ZSBzaGFwZXMuXG4gICAgLy8gVGhpcyBiZWhhdmlvci9idWcgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uKCkuXG4gICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IG1ha2VzIFJlYWN0IHVudXNhYmx5IHNsb3cgZm9yIHNvbWUgYXBwbGljYXRpb25zLlxuICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBiZWxvdyB3aXRoIGRvdWJsZXMuXG4gICAgLy9cbiAgICAvLyBMZWFybiBtb3JlIGFib3V0IHRoaXMgaGVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MzY1XG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOFxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47IC8vIEl0J3Mgb2theSB0byByZXBsYWNlIHRoZSBpbml0aWFsIGRvdWJsZXMgd2l0aCBzbWlzIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIFRoaXMgd29uJ3QgdHJpZ2dlciB0aGUgcGVyZm9ybWFuY2UgY2xpZmYgbWVudGlvbmVkIGFib3ZlLFxuICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuXG5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IHVzZWQgYnV0IGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxzOlxuICAgIHRoaXMuX2RlYnVnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2RlYnVnSG9va1R5cGVzID0gbnVsbDtcblxuICAgIGlmICghaGFzQmFkTWFwUG9seWZpbGwgJiYgdHlwZW9mIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHRoaXMpO1xuICAgIH1cbiAgfVxufSAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGEgUE9KTyBjb25zdHJ1Y3Rvciwgc3RpbGxcbi8vIHBsZWFzZSBlbnN1cmUgd2UgZG8gdGhlIGZvbGxvd2luZzpcbi8vIDEpIE5vYm9keSBzaG91bGQgYWRkIGFueSBpbnN0YW5jZSBtZXRob2RzIG9uIHRoaXMuIEluc3RhbmNlIG1ldGhvZHMgY2FuIGJlXG4vLyAgICBtb3JlIGRpZmZpY3VsdCB0byBwcmVkaWN0IHdoZW4gdGhleSBnZXQgb3B0aW1pemVkIGFuZCB0aGV5IGFyZSBhbG1vc3Rcbi8vICAgIG5ldmVyIGlubGluZWQgcHJvcGVybHkgaW4gc3RhdGljIGNvbXBpbGVycy5cbi8vIDIpIE5vYm9keSBzaG91bGQgcmVseSBvbiBgaW5zdGFuY2VvZiBGaWJlcmAgZm9yIHR5cGUgdGVzdGluZy4gV2Ugc2hvdWxkXG4vLyAgICBhbHdheXMga25vdyB3aGVuIGl0IGlzIGEgZmliZXIuXG4vLyAzKSBXZSBtaWdodCB3YW50IHRvIGV4cGVyaW1lbnQgd2l0aCB1c2luZyBudW1lcmljIGtleXMgc2luY2UgdGhleSBhcmUgZWFzaWVyXG4vLyAgICB0byBvcHRpbWl6ZSBpbiBhIG5vbi1KSVQgZW52aXJvbm1lbnQuXG4vLyA0KSBXZSBjYW4gZWFzaWx5IGdvIGZyb20gYSBjb25zdHJ1Y3RvciB0byBhIGNyZWF0ZUZpYmVyIG9iamVjdCBsaXRlcmFsIGlmIHRoYXRcbi8vICAgIGlzIGZhc3Rlci5cbi8vIDUpIEl0IHNob3VsZCBiZSBlYXN5IHRvIHBvcnQgdGhpcyB0byBhIEMgc3RydWN0IGFuZCBrZWVwIGEgQyBpbXBsZW1lbnRhdGlvblxuLy8gICAgY29tcGF0aWJsZS5cblxuXG52YXIgY3JlYXRlRmliZXIgPSBmdW5jdGlvbiAodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyAkRmxvd0ZpeE1lOiB0aGUgc2hhcGVzIGFyZSBleGFjdCBoZXJlIGJ1dCBGbG93IGRvZXNuJ3QgbGlrZSBjb25zdHJ1Y3RvcnNcbiAgcmV0dXJuIG5ldyBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmICFzaG91bGRDb25zdHJ1Y3QkMSh0eXBlKSAmJiB0eXBlLmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KSB7XG4gIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkgPyBDbGFzc0NvbXBvbmVudCA6IEZ1bmN0aW9uQ29tcG9uZW50O1xuICB9IGVsc2UgaWYgKENvbXBvbmVudCAhPT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IENvbXBvbmVudC4kJHR5cGVvZjtcblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgcmV0dXJuIEZvcndhcmRSZWY7XG4gICAgfVxuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIHJldHVybiBNZW1vQ29tcG9uZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBJbmRldGVybWluYXRlQ29tcG9uZW50O1xufSAvLyBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGFsdGVybmF0ZSBmaWJlciB0byBkbyB3b3JrIG9uLlxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBwZW5kaW5nUHJvcHMpIHtcbiAgdmFyIHdvcmtJblByb2dyZXNzID0gY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzID09PSBudWxsKSB7XG4gICAgLy8gV2UgdXNlIGEgZG91YmxlIGJ1ZmZlcmluZyBwb29saW5nIHRlY2huaXF1ZSBiZWNhdXNlIHdlIGtub3cgdGhhdCB3ZSdsbFxuICAgIC8vIG9ubHkgZXZlciBuZWVkIGF0IG1vc3QgdHdvIHZlcnNpb25zIG9mIGEgdHJlZS4gV2UgcG9vbCB0aGUgXCJvdGhlclwiIHVudXNlZFxuICAgIC8vIG5vZGUgdGhhdCB3ZSdyZSBmcmVlIHRvIHJldXNlLiBUaGlzIGlzIGxhemlseSBjcmVhdGVkIHRvIGF2b2lkIGFsbG9jYXRpbmdcbiAgICAvLyBleHRyYSBvYmplY3RzIGZvciB0aGluZ3MgdGhhdCBhcmUgbmV2ZXIgdXBkYXRlZC4gSXQgYWxzbyBhbGxvdyB1cyB0b1xuICAgIC8vIHJlY2xhaW0gdGhlIGV4dHJhIG1lbW9yeSBpZiBuZWVkZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVGaWJlcihjdXJyZW50LnRhZywgcGVuZGluZ1Byb3BzLCBjdXJyZW50LmtleSwgY3VycmVudC5tb2RlKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9IGN1cnJlbnQuZWxlbWVudFR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZTtcblxuICAgIHtcbiAgICAgIC8vIERFVi1vbmx5IGZpZWxkc1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlID0gY3VycmVudC5fZGVidWdTb3VyY2U7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gd29ya0luUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGFsdGVybmF0ZS5cbiAgICAvLyBSZXNldCB0aGUgZWZmZWN0IHRhZy5cblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gTm9GbGFnczsgLy8gVGhlIGVmZmVjdHMgYXJlIG5vIGxvbmdlciB2YWxpZC5cblxuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgcmVzZXQsIHJhdGhlciB0aGFuIGNvcHksIGFjdHVhbER1cmF0aW9uICYgYWN0dWFsU3RhcnRUaW1lLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1lIGZyb20gZW5kbGVzc2x5IGFjY3VtdWxhdGluZyBpbiBuZXcgY29tbWl0cy5cbiAgICAgIC8vIFRoaXMgaGFzIHRoZSBkb3duc2lkZSBvZiByZXNldHRpbmcgdmFsdWVzIGZvciBkaWZmZXJlbnQgcHJpb3JpdHkgcmVuZGVycyxcbiAgICAgIC8vIEJ1dCB3b3JrcyBmb3IgeWllbGRpbmcgKHRoZSBjb21tb24gY2FzZSkgYW5kIHNob3VsZCBzdXBwb3J0IHJlc3VtaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgfVxuICB9IC8vIFJlc2V0IGFsbCBlZmZlY3RzIGV4Y2VwdCBzdGF0aWMgb25lcy5cbiAgLy8gU3RhdGljIGVmZmVjdHMgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzID0gY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2s7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gIH07IC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG5cbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGN1cnJlbnQuX2RlYnVnTmVlZHNSZW1vdW50O1xuXG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn0gLy8gVXNlZCB0byByZXVzZSBhIEZpYmVyIGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZFxuICAvLyBoYXZlIHNldCB0aGUgdmFsdWVzIHRvIGJlZm9yZSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIElkZWFsbHkgdGhpcyB3b3VsZG4ndFxuICAvLyBiZSBuZWNlc3NhcnkgYnV0IHVuZm9ydHVuYXRlbHkgbWFueSBjb2RlIHBhdGhzIHJlYWRzIGZyb20gdGhlIHdvcmtJblByb2dyZXNzXG4gIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuXG4gIC8vIFdlIGFzc3VtZSBwZW5kaW5nUHJvcHMsIGluZGV4LCBrZXksIHJlZiwgcmV0dXJuIGFyZSBzdGlsbCB1bnRvdWNoZWQgdG9cbiAgLy8gYXZvaWQgZG9pbmcgYW5vdGhlciByZWNvbmNpbGlhdGlvbi5cbiAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBidXQga2VlcCBhbnkgUGxhY2VtZW50IHRhZ3MsIHNpbmNlIHRoYXQncyBzb21ldGhpbmdcbiAgLy8gdGhhdCBjaGlsZCBmaWJlciBpcyBzZXR0aW5nLCBub3QgdGhlIHJlY29uY2lsaWF0aW9uLlxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSBTdGF0aWNNYXNrIHwgUGxhY2VtZW50OyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUmVzZXQgdG8gY3JlYXRlRmliZXIncyBpbml0aWFsIHZhbHVlcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVzZXQgdG8gdGhlIGNsb25lZCB2YWx1ZXMgdGhhdCBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZCd2ZS5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gY3VycmVudC5jaGlsZExhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBDbG9uZSB0aGUgZGVwZW5kZW5jaWVzIG9iamVjdC4gVGhpcyBpcyBtdXRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLCBzb1xuICAgIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICAgIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudERlcGVuZGVuY2llcyA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgICB9O1xuXG4gICAge1xuICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlXG4gICAgICAvLyBhY3R1YWwgdGltZSBhY3Jvc3MgbXVsdGlwbGUgcmVuZGVyIHBhc3Nlcy5cbiAgICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhvc3RSb290RmliZXIodGFnLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUpIHtcbiAgdmFyIG1vZGU7XG5cbiAgaWYgKHRhZyA9PT0gQ29uY3VycmVudFJvb3QpIHtcbiAgICBtb2RlID0gQ29uY3VycmVudE1vZGU7XG5cbiAgICBpZiAoaXNTdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgIHtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RFZmZlY3RzTW9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbW9kZSA9IE5vTW9kZTtcbiAgfVxuXG4gIGlmICggaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAvLyBBbHdheXMgY29sbGVjdCBwcm9maWxlIHRpbWluZ3Mgd2hlbiBEZXZUb29scyBhcmUgcHJlc2VudC5cbiAgICAvLyBUaGlzIGVuYWJsZXMgRGV2VG9vbHMgdG8gc3RhcnQgY2FwdHVyaW5nIHRpbWluZyBhdCBhbnkgcG9pbnTigJNcbiAgICAvLyBXaXRob3V0IHNvbWUgbm9kZXMgaW4gdGhlIHRyZWUgaGF2aW5nIGVtcHR5IGJhc2UgdGltZXMuXG4gICAgbW9kZSB8PSBQcm9maWxlTW9kZTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVGaWJlcihIb3N0Um9vdCwgbnVsbCwgbnVsbCwgbW9kZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwgLy8gUmVhY3QkRWxlbWVudFR5cGVcbmtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIGZpYmVyVGFnID0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDsgLy8gVGhlIHJlc29sdmVkIHR5cGUgaXMgc2V0IGlmIHdlIGtub3cgd2hhdCB0aGUgZmluYWwgdHlwZSB3aWxsIGJlLiBJLmUuIGl0J3Mgbm90IGxhenkuXG5cbiAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHNob3VsZENvbnN0cnVjdCQxKHR5cGUpKSB7XG4gICAgICBmaWJlclRhZyA9IENsYXNzQ29tcG9uZW50O1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBmaWJlclRhZyA9IEhvc3RDb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgZ2V0VGFnOiBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KHBlbmRpbmdQcm9wcy5jaGlsZHJlbiwgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSBNb2RlO1xuICAgICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgICAgaWYgKCAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgLy8gU3RyaWN0IGVmZmVjdHMgc2hvdWxkIG5ldmVyIHJ1biBvbiBsZWdhY3kgcm9vdHNcbiAgICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2VMaXN0KHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfT0ZGU0NSRUVOX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1NDT1BFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0NBQ0hFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRQcm92aWRlcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnN1bWVyXG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0Q29uc3VtZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEZvcndhcmRSZWY7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IE1lbW9Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTGF6eUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKSA6IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChvd25lck5hbWUpIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gJyArICdjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpICcgKyAoXCJidXQgZ290OiBcIiArICh0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUpICsgXCIuXCIgKyBpbmZvKSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBvd25lciA9IG51bGw7XG5cbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wcztcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEZyYWdtZW50LCBlbGVtZW50cywga2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgb2YgdHlwZSBgc3RyaW5nYCBhcyBhIHByb3AuIFJlY2VpdmVkIHRoZSB0eXBlIGAlc2AgaW5zdGVhZC4nLCB0eXBlb2YgcGVuZGluZ1Byb3BzLmlkKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihQcm9maWxlciwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUgfCBQcm9maWxlTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgICAgZWZmZWN0RHVyYXRpb246IDAsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlTGlzdENvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihPZmZzY3JlZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgdmFyIHByaW1hcnlDaGlsZEluc3RhbmNlID0ge1xuICAgIGlzSGlkZGVuOiBmYWxzZVxuICB9O1xuICBmaWJlci5zdGF0ZU5vZGUgPSBwcmltYXJ5Q2hpbGRJbnN0YW5jZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tVGV4dChjb250ZW50LCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0VGV4dCwgY29udGVudCwgbnVsbCwgbW9kZSk7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0Q29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9ICdERUxFVEVEJztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KGRlaHlkcmF0ZWROb2RlKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKERlaHlkcmF0ZWRGcmFnbWVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgZmliZXIuc3RhdGVOb2RlID0gZGVoeWRyYXRlZE5vZGU7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBwb3J0YWwuY2hpbGRyZW4gIT09IG51bGwgPyBwb3J0YWwuY2hpbGRyZW4gOiBbXTtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFBvcnRhbCwgcGVuZGluZ1Byb3BzLCBwb3J0YWwua2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgIGNvbnRhaW5lckluZm86IHBvcnRhbC5jb250YWluZXJJbmZvLFxuICAgIHBlbmRpbmdDaGlsZHJlbjogbnVsbCxcbiAgICAvLyBVc2VkIGJ5IHBlcnNpc3RlbnQgdXBkYXRlc1xuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIGZpYmVyO1xufSAvLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLlxuXG5mdW5jdGlvbiBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAodGFyZ2V0ID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBGaWJlcidzIGluaXRpYWwgcHJvcGVydGllcyB3aWxsIGFsd2F5cyBiZSBvdmVyd3JpdHRlbi5cbiAgICAvLyBXZSBvbmx5IHVzZSBhIEZpYmVyIHRvIGVuc3VyZSB0aGUgc2FtZSBoaWRkZW4gY2xhc3Mgc28gREVWIGlzbid0IHNsb3cuXG4gICAgdGFyZ2V0ID0gY3JlYXRlRmliZXIoSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgd3JpdHRlbiBhcyBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMuXG4gIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW5cbiAgLy8gdGhlIGhvdHRlc3QgcGF0aCwgYW5kIE9iamVjdC5hc3NpZ24oKSB3YXMgdG9vIHNsb3c6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDJcbiAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi5cblxuXG4gIHRhcmdldC50YWcgPSBzb3VyY2UudGFnO1xuICB0YXJnZXQua2V5ID0gc291cmNlLmtleTtcbiAgdGFyZ2V0LmVsZW1lbnRUeXBlID0gc291cmNlLmVsZW1lbnRUeXBlO1xuICB0YXJnZXQudHlwZSA9IHNvdXJjZS50eXBlO1xuICB0YXJnZXQuc3RhdGVOb2RlID0gc291cmNlLnN0YXRlTm9kZTtcbiAgdGFyZ2V0LnJldHVybiA9IHNvdXJjZS5yZXR1cm47XG4gIHRhcmdldC5jaGlsZCA9IHNvdXJjZS5jaGlsZDtcbiAgdGFyZ2V0LnNpYmxpbmcgPSBzb3VyY2Uuc2libGluZztcbiAgdGFyZ2V0LmluZGV4ID0gc291cmNlLmluZGV4O1xuICB0YXJnZXQucmVmID0gc291cmNlLnJlZjtcbiAgdGFyZ2V0LnBlbmRpbmdQcm9wcyA9IHNvdXJjZS5wZW5kaW5nUHJvcHM7XG4gIHRhcmdldC5tZW1vaXplZFByb3BzID0gc291cmNlLm1lbW9pemVkUHJvcHM7XG4gIHRhcmdldC51cGRhdGVRdWV1ZSA9IHNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgdGFyZ2V0Lm1lbW9pemVkU3RhdGUgPSBzb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgdGFyZ2V0LmRlcGVuZGVuY2llcyA9IHNvdXJjZS5kZXBlbmRlbmNpZXM7XG4gIHRhcmdldC5tb2RlID0gc291cmNlLm1vZGU7XG4gIHRhcmdldC5mbGFncyA9IHNvdXJjZS5mbGFncztcbiAgdGFyZ2V0LnN1YnRyZWVGbGFncyA9IHNvdXJjZS5zdWJ0cmVlRmxhZ3M7XG4gIHRhcmdldC5kZWxldGlvbnMgPSBzb3VyY2UuZGVsZXRpb25zO1xuICB0YXJnZXQubGFuZXMgPSBzb3VyY2UubGFuZXM7XG4gIHRhcmdldC5jaGlsZExhbmVzID0gc291cmNlLmNoaWxkTGFuZXM7XG4gIHRhcmdldC5hbHRlcm5hdGUgPSBzb3VyY2UuYWx0ZXJuYXRlO1xuXG4gIHtcbiAgICB0YXJnZXQuYWN0dWFsRHVyYXRpb24gPSBzb3VyY2UuYWN0dWFsRHVyYXRpb247XG4gICAgdGFyZ2V0LmFjdHVhbFN0YXJ0VGltZSA9IHNvdXJjZS5hY3R1YWxTdGFydFRpbWU7XG4gICAgdGFyZ2V0LnNlbGZCYXNlRHVyYXRpb24gPSBzb3VyY2Uuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB0YXJnZXQudHJlZUJhc2VEdXJhdGlvbiA9IHNvdXJjZS50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAgdGFyZ2V0Ll9kZWJ1Z1NvdXJjZSA9IHNvdXJjZS5fZGVidWdTb3VyY2U7XG4gIHRhcmdldC5fZGVidWdPd25lciA9IHNvdXJjZS5fZGVidWdPd25lcjtcbiAgdGFyZ2V0Ll9kZWJ1Z05lZWRzUmVtb3VudCA9IHNvdXJjZS5fZGVidWdOZWVkc1JlbW91bnQ7XG4gIHRhcmdldC5fZGVidWdIb29rVHlwZXMgPSBzb3VyY2UuX2RlYnVnSG9va1R5cGVzO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBGaWJlclJvb3ROb2RlKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKSB7XG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmNvbnRhaW5lckluZm8gPSBjb250YWluZXJJbmZvO1xuICB0aGlzLnBlbmRpbmdDaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIHRoaXMucGluZ0NhY2hlID0gbnVsbDtcbiAgdGhpcy5maW5pc2hlZFdvcmsgPSBudWxsO1xuICB0aGlzLnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgdGhpcy5ldmVudFRpbWVzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5leHBpcmF0aW9uVGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vVGltZXN0YW1wKTtcbiAgdGhpcy5wZW5kaW5nTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZXhwaXJlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5tdXRhYmxlUmVhZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZW50YW5nbGVtZW50cyA9IGNyZWF0ZUxhbmVNYXAoTm9MYW5lcyk7XG4gIHRoaXMuaWRlbnRpZmllclByZWZpeCA9IGlkZW50aWZpZXJQcmVmaXg7XG4gIHRoaXMub25SZWNvdmVyYWJsZUVycm9yID0gb25SZWNvdmVyYWJsZUVycm9yO1xuXG4gIHtcbiAgICB0aGlzLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIHRoaXMuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHRoaXMucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLm1lbW9pemVkVXBkYXRlcnMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSB0aGlzLnBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBUb3RhbExhbmVzOyBfaSsrKSB7XG4gICAgICBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwLnB1c2gobmV3IFNldCgpKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgQ29uY3VycmVudFJvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSBoeWRyYXRlID8gJ2h5ZHJhdGVSb290KCknIDogJ2NyZWF0ZVJvb3QoKSc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIExlZ2FjeVJvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSBoeWRyYXRlID8gJ2h5ZHJhdGUoKScgOiAncmVuZGVyKCknO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgLy8gVE9ETzogV2UgaGF2ZSBzZXZlcmFsIG9mIHRoZXNlIGFyZ3VtZW50cyB0aGF0IGFyZSBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGVcbi8vIGhvc3QgY29uZmlnLCBidXQgYmVjYXVzZSB0aGV5IGFyZSBwYXNzZWQgaW4gYXQgcnVudGltZSwgd2UgaGF2ZSB0byB0aHJlYWRcbi8vIHRoZW0gdGhyb3VnaCB0aGUgcm9vdCBjb25zdHJ1Y3Rvci4gUGVyaGFwcyB3ZSBzaG91bGQgcHV0IHRoZW0gYWxsIGludG8gYVxuLy8gc2luZ2xlIHR5cGUsIGxpa2UgYSBEeW5hbWljSG9zdENvbmZpZyB0aGF0IGlzIGRlZmluZWQgYnkgdGhlIHJlbmRlcmVyLlxuaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciByb290ID0gbmV3IEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICAvLyBzdGF0ZU5vZGUgaXMgYW55LlxuXG5cbiAgdmFyIHVuaW5pdGlhbGl6ZWRGaWJlciA9IGNyZWF0ZUhvc3RSb290RmliZXIodGFnLCBpc1N0cmljdE1vZGUpO1xuICByb290LmN1cnJlbnQgPSB1bmluaXRpYWxpemVkRmliZXI7XG4gIHVuaW5pdGlhbGl6ZWRGaWJlci5zdGF0ZU5vZGUgPSByb290O1xuXG4gIHtcbiAgICB2YXIgX2luaXRpYWxTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IGluaXRpYWxDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogaHlkcmF0ZSxcbiAgICAgIGNhY2hlOiBudWxsLFxuICAgICAgLy8gbm90IGVuYWJsZWQgeWV0XG4gICAgICB0cmFuc2l0aW9uczogbnVsbCxcbiAgICAgIHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6IG51bGxcbiAgICB9O1xuICAgIHVuaW5pdGlhbGl6ZWRGaWJlci5tZW1vaXplZFN0YXRlID0gX2luaXRpYWxTdGF0ZTtcbiAgfVxuXG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh1bmluaXRpYWxpemVkRmliZXIpO1xuICByZXR1cm4gcm9vdDtcbn1cblxudmFyIFJlYWN0VmVyc2lvbiA9ICcxOC4zLjEnO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lckluZm8sIC8vIFRPRE86IGZpZ3VyZSBvdXQgdGhlIEFQSSBmb3IgY3Jvc3MtcmVuZGVyZXIgaW1wbGVtZW50YXRpb24uXG5pbXBsZW1lbnRhdGlvbikge1xuICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXG4gIHtcbiAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGtleSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBQb3J0YWxcbiAgICAkJHR5cGVvZjogUkVBQ1RfUE9SVEFMX1RZUEUsXG4gICAga2V5OiBrZXkgPT0gbnVsbCA/IG51bGwgOiAnJyArIGtleSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgY29udGFpbmVySW5mbzogY29udGFpbmVySW5mbyxcbiAgICBpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb25cbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXM7XG52YXIgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGU7XG5cbntcbiAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZSA9IHt9O1xufVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpIHtcbiAgaWYgKCFwYXJlbnRDb21wb25lbnQpIHtcbiAgICByZXR1cm4gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGZpYmVyID0gZ2V0KHBhcmVudENvbXBvbmVudCk7XG4gIHZhciBwYXJlbnRDb250ZXh0ID0gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgdmFyIENvbXBvbmVudCA9IGZpYmVyLnR5cGU7XG5cbiAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NDaGlsZENvbnRleHQoZmliZXIsIENvbXBvbmVudCwgcGFyZW50Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmVudENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnQsIG1ldGhvZE5hbWUpIHtcbiAge1xuICAgIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuXG4gICAgaWYgKGZpYmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY29tcG9uZW50KS5qb2luKCcsJyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50IGFwcGVhcnMgdG8gbm90IGJlIGEgUmVhY3RDb21wb25lbnQuIEtleXM6IFwiICsga2V5cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChob3N0RmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoaG9zdEZpYmVyKTtcblxuICAgICAgICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIGlzIGluc2lkZSBTdHJpY3RNb2RlLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIHJlbmRlcnMgU3RyaWN0TW9kZSBjaGlsZHJlbi4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIC8vIElkZWFsbHkgdGhpcyBzaG91bGQgcmVzZXQgdG8gcHJldmlvdXMgYnV0IHRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBpblxuICAgICAgICAgIC8vIHJlbmRlciBhbmQgdGhlcmUncyBhbm90aGVyIHdhcm5pbmcgZm9yIHRoYXQgYW55d2F5LlxuICAgICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgICBzZXRDdXJyZW50RmliZXIocHJldmlvdXNGaWJlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IGZhbHNlO1xuICB2YXIgaW5pdGlhbENoaWxkcmVuID0gbnVsbDtcbiAgcmV0dXJuIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCAvLyBUT0RPOiBSZW1vdmUgYGNhbGxiYWNrYCB3aGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZS5cbmNhbGxiYWNrLCBjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIGh5ZHJhdGUgPSB0cnVlO1xuICB2YXIgcm9vdCA9IGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7IC8vIFRPRE86IE1vdmUgdGhpcyB0byBGaWJlclJvb3QgY29uc3RydWN0b3JcblxuICByb290LmNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShudWxsKTsgLy8gU2NoZWR1bGUgdGhlIGluaXRpYWwgcmVuZGVyLiBJbiBhIGh5ZHJhdGlvbiByb290LCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tXG4gIC8vIGEgcmVndWxhciB1cGRhdGUgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdCBtYXRjaCB3YXMgd2FzIHJlbmRlcmVkXG4gIC8vIG9uIHRoZSBzZXJ2ZXIuXG4gIC8vIE5PVEU6IFRoaXMgdXBkYXRlIGludGVudGlvbmFsbHkgZG9lc24ndCBoYXZlIGEgcGF5bG9hZC4gV2UncmUgb25seSB1c2luZ1xuICAvLyB0aGUgdXBkYXRlIHRvIHNjaGVkdWxlIHdvcmsgb24gdGhlIHJvb3QgZmliZXIgKGFuZCwgZm9yIGxlZ2FjeSByb290cywgdG9cbiAgLy8gZW5xdWV1ZSB0aGUgY2FsbGJhY2sgaWYgb25lIGlzIHByb3ZpZGVkKS5cblxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50KTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsID8gY2FsbGJhY2sgOiBudWxsO1xuICBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQsIHVwZGF0ZSwgbGFuZSk7XG4gIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICByZXR1cm4gcm9vdDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spIHtcbiAge1xuICAgIG9uU2NoZWR1bGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk7XG4gIH1cblxuICB2YXIgY3VycmVudCQxID0gY29udGFpbmVyLmN1cnJlbnQ7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCQxKTtcblxuICB7XG4gICAgbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKTtcbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KTtcblxuICBpZiAoY29udGFpbmVyLmNvbnRleHQgPT09IG51bGwpIHtcbiAgICBjb250YWluZXIuY29udGV4dCA9IGNvbnRleHQ7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnBlbmRpbmdDb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaXNSZW5kZXJpbmcgJiYgY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcykge1xuICAgICAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZTsgJyArICd0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBmcm9tIHJlbmRlciBpcyBub3QgYWxsb3dlZC4gJyArICdJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gY29tcG9uZW50RGlkVXBkYXRlLlxcblxcbicgKyAnQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSB8fCAnVW5rbm93bicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogZWxlbWVudFxuICB9O1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG5cbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoY3VycmVudCQxLCB1cGRhdGUsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShjb250YWluZXIpIHtcbiAgdmFyIGNvbnRhaW5lckZpYmVyID0gY29udGFpbmVyLmN1cnJlbnQ7XG5cbiAgaWYgKCFjb250YWluZXJGaWJlci5jaGlsZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChjb250YWluZXJGaWJlci5jaGlsZC50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgLy8gRmx1c2ggdGhlIGZpcnN0IHNjaGVkdWxlZCBcInVwZGF0ZVwiLlxuICAgICAgICAgIHZhciBsYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KTtcbiAgICAgICAgICBmbHVzaFJvb3Qocm9vdCwgbGFuZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTsgLy8gSWYgd2UncmUgc3RpbGwgYmxvY2tlZCBhZnRlciB0aGlzLCB3ZSBuZWVkIHRvIGluY3JlYXNlXG4gICAgICAgIC8vIHRoZSBwcmlvcml0eSBvZiBhbnkgcHJvbWlzZXMgcmVzb2x2aW5nIHdpdGhpbiB0aGlzXG4gICAgICAgIC8vIGJvdW5kYXJ5IHNvIHRoYXQgdGhleSBuZXh0IGF0dGVtcHQgYWxzbyBoYXMgaGlnaGVyIHByaS5cblxuICAgICAgICB2YXIgcmV0cnlMYW5lID0gU3luY0xhbmU7XG4gICAgICAgIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGhpZ2hlclByaW9yaXR5TGFuZShzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSwgcmV0cnlMYW5lKTtcbiAgfVxufSAvLyBJbmNyZWFzZXMgdGhlIHByaW9yaXR5IG9mIHRoZW5hYmxlcyB3aGVuIHRoZXkgcmVzb2x2ZSB3aXRoaW4gdGhpcyBib3VuZGFyeS5cblxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUpIHtcbiAgICBtYXJrUmV0cnlMYW5lSW1wbChhbHRlcm5hdGUsIHJldHJ5TGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uJDEoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAvLyBXZSBpZ25vcmUgSG9zdFJvb3RzIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBpbmNyZWFzZVxuICAgIC8vIHRoZWlyIHByaW9yaXR5IGFuZCB0aGV5IHNob3VsZCBub3Qgc3VzcGVuZCBvbiBJL08sXG4gICAgLy8gc2luY2UgeW91IGhhdmUgdG8gd3JhcCBhbnl0aGluZyB0aGF0IG1pZ2h0IHN1c3BlbmQgaW5cbiAgICAvLyBTdXNwZW5zZS5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbGFuZSA9IFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9XG5cbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAvLyBXZSBpZ25vcmUgSG9zdFJvb3RzIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBpbmNyZWFzZVxuICAgIC8vIHRoZWlyIHByaW9yaXR5IG90aGVyIHRoYW4gc3luY2hyb25vdXNseSBmbHVzaCBpdC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIH1cblxuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhmaWJlcikge1xuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzKGZpYmVyKTtcblxuICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbn1cblxudmFyIHNob3VsZEVycm9ySW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZEVycm9yKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRFcnJvckltcGwoZmliZXIpO1xufVxuXG52YXIgc2hvdWxkU3VzcGVuZEltcGwgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkU3VzcGVuZChmaWJlcikge1xuICByZXR1cm4gc2hvdWxkU3VzcGVuZEltcGwoZmliZXIpO1xufVxudmFyIG92ZXJyaWRlSG9va1N0YXRlID0gbnVsbDtcbnZhciBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wcyA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBzY2hlZHVsZVVwZGF0ZSA9IG51bGw7XG52YXIgc2V0RXJyb3JIYW5kbGVyID0gbnVsbDtcbnZhciBzZXRTdXNwZW5zZUhhbmRsZXIgPSBudWxsO1xuXG57XG4gIHZhciBjb3B5V2l0aERlbGV0ZUltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCkge1xuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gcGF0aC5sZW5ndGgpIHtcbiAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7XG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKGtleSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtrZXldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuXG4gICAgdXBkYXRlZFtrZXldID0gY29weVdpdGhEZWxldGVJbXBsKG9ialtrZXldLCBwYXRoLCBpbmRleCArIDEpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aERlbGV0ZSA9IGZ1bmN0aW9uIChvYmosIHBhdGgpIHtcbiAgICByZXR1cm4gY29weVdpdGhEZWxldGVJbXBsKG9iaiwgcGF0aCwgMCk7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoUmVuYW1lSW1wbCA9IGZ1bmN0aW9uIChvYmosIG9sZFBhdGgsIG5ld1BhdGgsIGluZGV4KSB7XG4gICAgdmFyIG9sZEtleSA9IG9sZFBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7XG5cbiAgICBpZiAoaW5kZXggKyAxID09PSBvbGRQYXRoLmxlbmd0aCkge1xuICAgICAgdmFyIG5ld0tleSA9IG5ld1BhdGhbaW5kZXhdOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICAgIHVwZGF0ZWRbbmV3S2V5XSA9IHVwZGF0ZWRbb2xkS2V5XTtcblxuICAgICAgaWYgKGlzQXJyYXkodXBkYXRlZCkpIHtcbiAgICAgICAgdXBkYXRlZC5zcGxpY2Uob2xkS2V5LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW29sZEtleV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICAgIHVwZGF0ZWRbb2xkS2V5XSA9IGNvcHlXaXRoUmVuYW1lSW1wbCggLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgb2JqW29sZEtleV0sIG9sZFBhdGgsIG5ld1BhdGgsIGluZGV4ICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoUmVuYW1lID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIGlmIChvbGRQYXRoLmxlbmd0aCAhPT0gbmV3UGF0aC5sZW5ndGgpIHtcbiAgICAgIHdhcm4oJ2NvcHlXaXRoUmVuYW1lKCkgZXhwZWN0cyBwYXRocyBvZiB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1BhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGlmIChvbGRQYXRoW2ldICE9PSBuZXdQYXRoW2ldKSB7XG4gICAgICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIHRvIGJlIHRoZSBzYW1lIGV4Y2VwdCBmb3IgdGhlIGRlZXBlc3Qga2V5Jyk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29weVdpdGhSZW5hbWVJbXBsKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgMCk7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoU2V0SW1wbCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIGluZGV4LCB2YWx1ZSkge1xuICAgIGlmIChpbmRleCA+PSBwYXRoLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aFNldEltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSwgdmFsdWUpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoU2V0SW1wbChvYmosIHBhdGgsIDAsIHZhbHVlKTtcbiAgfTtcblxuICB2YXIgZmluZEhvb2sgPSBmdW5jdGlvbiAoZmliZXIsIGlkKSB7XG4gICAgLy8gRm9yIG5vdywgdGhlIFwiaWRcIiBvZiBzdGF0ZWZ1bCBob29rcyBpcyBqdXN0IHRoZSBzdGF0ZWZ1bCBob29rIGluZGV4LlxuICAgIC8vIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHdpdGggZS5nLiBuZXN0ZWQgaG9va3MuXG4gICAgdmFyIGN1cnJlbnRIb29rID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBpZCA+IDApIHtcbiAgICAgIGN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgICAgIGlkLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRIb29rO1xuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIGVkaXRhYmxlIHZhbHVlcyBmb3IgdXNlU3RhdGUgYW5kIHVzZVJlZHVjZXIuXG5cblxuICBvdmVycmlkZUhvb2tTdGF0ZSA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgsIHZhbHVlKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoU2V0KGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCwgdmFsdWUpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aERlbGV0ZShob29rLm1lbW9pemVkU3RhdGUsIHBhdGgpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aFJlbmFtZShob29rLm1lbW9pemVkU3RhdGUsIG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgcHJvcHMgZm9yIGZ1bmN0aW9uIGNvbXBvbmVudHMsIGZvcndhcmRSZWYsIG1lbW8sIGhvc3QgY29tcG9uZW50cywgZXRjLlxuXG5cbiAgb3ZlcnJpZGVQcm9wcyA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCwgdmFsdWUpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFNldChmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoLCB2YWx1ZSk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoRGVsZXRlKGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFJlbmFtZShmaWJlci5tZW1vaXplZFByb3BzLCBvbGRQYXRoLCBuZXdQYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIHNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIHNldEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRFcnJvckltcGwpIHtcbiAgICBzaG91bGRFcnJvckltcGwgPSBuZXdTaG91bGRFcnJvckltcGw7XG4gIH07XG5cbiAgc2V0U3VzcGVuc2VIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1Nob3VsZFN1c3BlbmRJbXBsKSB7XG4gICAgc2hvdWxkU3VzcGVuZEltcGwgPSBuZXdTaG91bGRTdXNwZW5kSW1wbDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcblxuICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbn1cblxuZnVuY3Rpb24gZW1wdHlGaW5kRmliZXJCeUhvc3RJbnN0YW5jZShpbnN0YW5jZSkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyRm9yRGV2VG9vbHMoKSB7XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG5mdW5jdGlvbiBpbmplY3RJbnRvRGV2VG9vbHMoZGV2VG9vbHNDb25maWcpIHtcbiAgdmFyIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlID0gZGV2VG9vbHNDb25maWcuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U7XG4gIHZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbiAgcmV0dXJuIGluamVjdEludGVybmFscyh7XG4gICAgYnVuZGxlVHlwZTogZGV2VG9vbHNDb25maWcuYnVuZGxlVHlwZSxcbiAgICB2ZXJzaW9uOiBkZXZUb29sc0NvbmZpZy52ZXJzaW9uLFxuICAgIHJlbmRlcmVyUGFja2FnZU5hbWU6IGRldlRvb2xzQ29uZmlnLnJlbmRlcmVyUGFja2FnZU5hbWUsXG4gICAgcmVuZGVyZXJDb25maWc6IGRldlRvb2xzQ29uZmlnLnJlbmRlcmVyQ29uZmlnLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlOiBvdmVycmlkZUhvb2tTdGF0ZSxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6IG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6IG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCxcbiAgICBvdmVycmlkZVByb3BzOiBvdmVycmlkZVByb3BzLFxuICAgIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOiBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCxcbiAgICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aDogb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGgsXG4gICAgc2V0RXJyb3JIYW5kbGVyOiBzZXRFcnJvckhhbmRsZXIsXG4gICAgc2V0U3VzcGVuc2VIYW5kbGVyOiBzZXRTdXNwZW5zZUhhbmRsZXIsXG4gICAgc2NoZWR1bGVVcGRhdGU6IHNjaGVkdWxlVXBkYXRlLFxuICAgIGN1cnJlbnREaXNwYXRjaGVyUmVmOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOiBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcixcbiAgICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZmluZEZpYmVyQnlIb3N0SW5zdGFuY2UgfHwgZW1wdHlGaW5kRmliZXJCeUhvc3RJbnN0YW5jZSxcbiAgICAvLyBSZWFjdCBSZWZyZXNoXG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOiAgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJlZnJlc2g6ICBzY2hlZHVsZVJlZnJlc2ggLFxuICAgIHNjaGVkdWxlUm9vdDogIHNjaGVkdWxlUm9vdCAsXG4gICAgc2V0UmVmcmVzaEhhbmRsZXI6ICBzZXRSZWZyZXNoSGFuZGxlciAsXG4gICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBhcHBlbmQgb3duZXIgc3RhY2tzIHRvIGVycm9yIG1lc3NhZ2VzIGluIERFViBtb2RlLlxuICAgIGdldEN1cnJlbnRGaWJlcjogIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzICxcbiAgICAvLyBFbmFibGVzIERldlRvb2xzIHRvIGRldGVjdCByZWNvbmNpbGVyIHZlcnNpb24gcmF0aGVyIHRoYW4gcmVuZGVyZXIgdmVyc2lvblxuICAgIC8vIHdoaWNoIG1heSBub3QgbWF0Y2ggZm9yIHRoaXJkIHBhcnR5IHJlbmRlcmVycy5cbiAgICByZWNvbmNpbGVyVmVyc2lvbjogUmVhY3RWZXJzaW9uXG4gIH0pO1xufVxuXG4vKiBnbG9iYWwgcmVwb3J0RXJyb3IgKi9cblxudmFyIGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3IgPSB0eXBlb2YgcmVwb3J0RXJyb3IgPT09ICdmdW5jdGlvbicgPyAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHJlcG9ydEVycm9yIHdpbGwgZGlzcGF0Y2ggYW4gZXJyb3IgZXZlbnQsXG4vLyBlbXVsYXRpbmcgYW4gdW5jYXVnaHQgSmF2YVNjcmlwdCBlcnJvci5cbnJlcG9ydEVycm9yIDogZnVuY3Rpb24gKGVycm9yKSB7XG4gIC8vIEluIG9sZGVyIGJyb3dzZXJzIGFuZCB0ZXN0IGVudmlyb25tZW50cywgZmFsbGJhY2sgdG8gY29uc29sZS5lcnJvci5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICBjb25zb2xlWydlcnJvciddKGVycm9yKTtcbn07XG5cbmZ1bmN0aW9uIFJlYWN0RE9NUm9vdChpbnRlcm5hbFJvb3QpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gaW50ZXJuYWxSb290O1xufVxuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnJlbmRlciA9IFJlYWN0RE9NUm9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIGFuIHVubW91bnRlZCByb290LicpO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcigncmVuZGVyKC4uLik6IGRvZXMgbm90IHN1cHBvcnQgdGhlIHNlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gJyArICdUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgcmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIGEgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9IGVsc2UgaWYgKGlzVmFsaWRDb250YWluZXIoYXJndW1lbnRzWzFdKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBjb250YWluZXIgdG8gdGhlIHNlY29uZCBhcmd1bWVudCBvZiByb290LnJlbmRlciguLi4pLiAnICsgXCJZb3UgZG9uJ3QgbmVlZCB0byBwYXNzIGl0IGFnYWluIHNpbmNlIHlvdSBhbHJlYWR5IHBhc3NlZCBpdCB0byBjcmVhdGUgdGhlIHJvb3QuXCIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgc2Vjb25kIGFyZ3VtZW50IHRvIHJvb3QucmVuZGVyKC4uLikgYnV0IGl0IG9ubHkgYWNjZXB0cyAnICsgJ29uZSBhcmd1bWVudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMocm9vdC5jdXJyZW50KTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSkge1xuICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogSXQgbG9va3MgbGlrZSB0aGUgUmVhY3QtcmVuZGVyZWQgY29udGVudCBvZiB0aGUgJyArICdyb290IGNvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArIFwicm9vdC51bm1vdW50KCkgdG8gZW1wdHkgYSByb290J3MgY29udGFpbmVyLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgbnVsbCwgbnVsbCk7XG59O1xuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnVubW91bnQgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3VubW91bnQoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCBhIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdGhpcy5faW50ZXJuYWxSb290ID0gbnVsbDtcbiAgICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuXG4gICAge1xuICAgICAgaWYgKGlzQWxyZWFkeVJlbmRlcmluZygpKSB7XG4gICAgICAgIGVycm9yKCdBdHRlbXB0ZWQgdG8gc3luY2hyb25vdXNseSB1bm1vdW50IGEgcm9vdCB3aGlsZSBSZWFjdCB3YXMgYWxyZWFkeSAnICsgJ3JlbmRlcmluZy4gUmVhY3QgY2Fubm90IGZpbmlzaCB1bm1vdW50aW5nIHRoZSByb290IHVudGlsIHRoZSAnICsgJ2N1cnJlbnQgcmVuZGVyIGhhcyBjb21wbGV0ZWQsIHdoaWNoIG1heSBsZWFkIHRvIGEgcmFjZSBjb25kaXRpb24uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihudWxsLCByb290LCBudWxsLCBudWxsKTtcbiAgICB9KTtcbiAgICB1bm1hcmtDb250YWluZXJBc1Jvb3QoY29udGFpbmVyKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVJvb3QoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKTtcbiAgdmFyIGlzU3RyaWN0TW9kZSA9IGZhbHNlO1xuICB2YXIgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSA9IGZhbHNlO1xuICB2YXIgaWRlbnRpZmllclByZWZpeCA9ICcnO1xuICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgdmFyIHRyYW5zaXRpb25DYWxsYmFja3MgPSBudWxsO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIGlmIChvcHRpb25zLmh5ZHJhdGUpIHtcbiAgICAgICAgd2FybignaHlkcmF0ZSB0aHJvdWdoIGNyZWF0ZVJvb3QgaXMgZGVwcmVjYXRlZC4gVXNlIFJlYWN0RE9NQ2xpZW50Lmh5ZHJhdGVSb290KGNvbnRhaW5lciwgPEFwcCAvPikgaW5zdGVhZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgICAgICBlcnJvcignWW91IHBhc3NlZCBhIEpTWCBlbGVtZW50IHRvIGNyZWF0ZVJvb3QuIFlvdSBwcm9iYWJseSBtZWFudCB0byAnICsgJ2NhbGwgcm9vdC5yZW5kZXIgaW5zdGVhZC4gJyArICdFeGFtcGxlIHVzYWdlOlxcblxcbicgKyAnICBsZXQgcm9vdCA9IGNyZWF0ZVJvb3QoZG9tQ29udGFpbmVyKTtcXG4nICsgJyAgcm9vdC5yZW5kZXIoPEFwcCAvPik7Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy51bnN0YWJsZV9zdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBpc1N0cmljdE1vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlkZW50aWZpZXJQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWRlbnRpZmllclByZWZpeCA9IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbkNhbGxiYWNrcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucy50cmFuc2l0aW9uQ2FsbGJhY2tzO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgQ29uY3VycmVudFJvb3QsIG51bGwsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gIHZhciByb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgcmV0dXJuIG5ldyBSZWFjdERPTVJvb3Qocm9vdCk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NSHlkcmF0aW9uUm9vdChpbnRlcm5hbFJvb3QpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gaW50ZXJuYWxSb290O1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUh5ZHJhdGlvbih0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHF1ZXVlRXhwbGljaXRIeWRyYXRpb25UYXJnZXQodGFyZ2V0KTtcbiAgfVxufVxuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnVuc3RhYmxlX3NjaGVkdWxlSHlkcmF0aW9uID0gc2NoZWR1bGVIeWRyYXRpb247XG5mdW5jdGlvbiBoeWRyYXRlUm9vdChjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaHlkcmF0ZVJvb3QoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKTtcblxuICB7XG4gICAgaWYgKGluaXRpYWxDaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvcignTXVzdCBwcm92aWRlIGluaXRpYWwgY2hpbGRyZW4gYXMgc2Vjb25kIGFyZ3VtZW50IHRvIGh5ZHJhdGVSb290LiAnICsgJ0V4YW1wbGUgdXNhZ2U6IGh5ZHJhdGVSb290KGRvbUNvbnRhaW5lciwgPEFwcCAvPiknKTtcbiAgICB9XG4gIH0gLy8gRm9yIG5vdyB3ZSByZXVzZSB0aGUgd2hvbGUgYmFnIG9mIG9wdGlvbnMgc2luY2UgdGhleSBjb250YWluXG4gIC8vIHRoZSBoeWRyYXRpb24gY2FsbGJhY2tzLlxuXG5cbiAgdmFyIGh5ZHJhdGlvbkNhbGxiYWNrcyA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMgOiBudWxsOyAvLyBUT0RPOiBEZWxldGUgdGhpcyBvcHRpb25cblxuICB2YXIgbXV0YWJsZVNvdXJjZXMgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRlZFNvdXJjZXMgfHwgbnVsbDtcbiAgdmFyIGlzU3RyaWN0TW9kZSA9IGZhbHNlO1xuICB2YXIgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSA9IGZhbHNlO1xuICB2YXIgaWRlbnRpZmllclByZWZpeCA9ICcnO1xuICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAob3B0aW9ucy51bnN0YWJsZV9zdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBpc1N0cmljdE1vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlkZW50aWZpZXJQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWRlbnRpZmllclByZWZpeCA9IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBudWxsLCBjb250YWluZXIsIENvbmN1cnJlbnRSb290LCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7IC8vIFRoaXMgY2FuJ3QgYmUgYSBjb21tZW50IG5vZGUgc2luY2UgaHlkcmF0aW9uIGRvZXNuJ3Qgd29yayBvbiBjb21tZW50IG5vZGVzIGFueXdheS5cblxuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhjb250YWluZXIpO1xuXG4gIGlmIChtdXRhYmxlU291cmNlcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXV0YWJsZVNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtdXRhYmxlU291cmNlID0gbXV0YWJsZVNvdXJjZXNbaV07XG4gICAgICByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFjdERPTUh5ZHJhdGlvblJvb3Qocm9vdCk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpIHtcbiAgcmV0dXJuICEhKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgIWRpc2FibGVDb21tZW50c0FzRE9NQ29udGFpbmVycyAgKSk7XG59IC8vIFRPRE86IFJlbW92ZSB0aGlzIGZ1bmN0aW9uIHdoaWNoIGFsc28gaW5jbHVkZXMgY29tbWVudCBub2Rlcy5cbi8vIFdlIG9ubHkgdXNlIGl0IGluIHBsYWNlcyB0aGF0IGFyZSBjdXJyZW50bHkgbW9yZSByZWxheGVkLlxuXG5mdW5jdGlvbiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KG5vZGUpIHtcbiAgcmV0dXJuICEhKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIG5vZGUubm9kZVZhbHVlID09PSAnIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlICcpKTtcbn1cblxuZnVuY3Rpb24gd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpIHtcbiAge1xuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBjb250YWluZXIudGFnTmFtZSAmJiBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHtcbiAgICAgIGVycm9yKCdjcmVhdGVSb290KCk6IENyZWF0aW5nIHJvb3RzIGRpcmVjdGx5IHdpdGggZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHVzaW5nIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSkge1xuICAgICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00ucmVuZGVyKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgJyArICdoYXMgYWxyZWFkeSBiZWVuIHBhc3NlZCB0byBjcmVhdGVSb290KCkgYmVmb3JlLiBJbnN0ZWFkLCBjYWxsICcgKyAncm9vdC5yZW5kZXIoKSBvbiB0aGUgZXhpc3Rpbmcgcm9vdCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvIHVwZGF0ZSBpdC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzO1xuXG57XG4gIHRvcExldmVsVXBkYXRlV2FybmluZ3MgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyICYmIGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhpcyAnICsgJ2NvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArICdSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlIHRvIGVtcHR5IGEgY29udGFpbmVyLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QgPSAhIWNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShyb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpKTtcblxuICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCAmJiAhaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCkge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRvIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3BPblJlY292ZXJhYmxlRXJyb3IoKSB7Ly8gVGhpcyBpc24ndCByZWFjaGFibGUgYmVjYXVzZSBvblJlY292ZXJhYmxlRXJyb3IgaXNuJ3QgY2FsbGVkIGluIHRoZVxuICAvLyBsZWdhY3kgQVBJLlxufVxuXG5mdW5jdGlvbiBsZWdhY3lDcmVhdGVSb290RnJvbURPTUNvbnRhaW5lcihjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgaXNIeWRyYXRpb25Db250YWluZXIpIHtcbiAgaWYgKGlzSHlkcmF0aW9uQ29udGFpbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBjYWxsYmFjaywgY29udGFpbmVyLCBMZWdhY3lSb290LCBudWxsLCAvLyBoeWRyYXRpb25DYWxsYmFja3NcbiAgICBmYWxzZSwgLy8gaXNTdHJpY3RNb2RlXG4gICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsXG4gICAgJycsIC8vIGlkZW50aWZpZXJQcmVmaXhcbiAgICBub29wT25SZWNvdmVyYWJsZUVycm9yKTtcbiAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IHJvb3Q7XG4gICAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gICAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgZmx1c2hTeW5jKCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmlyc3QgY2xlYXIgYW55IGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgdmFyIHJvb3RTaWJsaW5nO1xuXG4gICAgd2hpbGUgKHJvb3RTaWJsaW5nID0gY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHJvb3RTaWJsaW5nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX29yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShfcm9vdCk7XG5cbiAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfcm9vdCA9IGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXIsIExlZ2FjeVJvb3QsIG51bGwsIC8vIGh5ZHJhdGlvbkNhbGxiYWNrc1xuICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGVcbiAgICBmYWxzZSwgLy8gY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSxcbiAgICAnJywgLy8gaWRlbnRpZmllclByZWZpeFxuICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpO1xuXG4gICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSBfcm9vdDtcbiAgICBtYXJrQ29udGFpbmVyQXNSb290KF9yb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG5cbiAgICB2YXIgX3Jvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcblxuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKF9yb290Q29udGFpbmVyRWxlbWVudCk7IC8vIEluaXRpYWwgbW91bnQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkLlxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIF9yb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3Jvb3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGNoaWxkcmVuLCBjb250YWluZXIsIGZvcmNlSHlkcmF0ZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIHRvcExldmVsVXBkYXRlV2FybmluZ3MoY29udGFpbmVyKTtcbiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLCAncmVuZGVyJyk7XG4gIH1cblxuICB2YXIgbWF5YmVSb290ID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gIHZhciByb290O1xuXG4gIGlmICghbWF5YmVSb290KSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIHJvb3QgPSBsZWdhY3lDcmVhdGVSb290RnJvbURPTUNvbnRhaW5lcihjb250YWluZXIsIGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrLCBmb3JjZUh5ZHJhdGUpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QgPSBtYXliZVJvb3Q7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9IC8vIFVwZGF0ZVxuXG5cbiAgICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbn1cblxudmFyIGRpZFdhcm5BYm91dEZpbmRET01Ob2RlID0gZmFsc2U7XG5mdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpIHtcbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RmluZERPTU5vZGUpIHtcbiAgICAgIGRpZFdhcm5BYm91dEZpbmRET01Ob2RlID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ2ZpbmRET01Ob2RlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciAnICsgJ3JlbGVhc2UuIEluc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCAnICsgJ3RvIHJlZmVyZW5jZS4gTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnKTtcbiAgICB9XG5cbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lciQzLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIuc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyO1xuXG4gICAgICBpZiAoIXdhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgZmluZERPTU5vZGUgaW5zaWRlIGl0cyByZW5kZXIoKS4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShvd25lci50eXBlKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50Lm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29tcG9uZW50T3JFbGVtZW50O1xuICB9XG5cbiAge1xuICAgIHJldHVybiBmaW5kSG9zdEluc3RhbmNlV2l0aFdhcm5pbmcoY29tcG9uZW50T3JFbGVtZW50LCAnZmluZERPTU5vZGUnKTtcbiAgfVxufVxuZnVuY3Rpb24gaHlkcmF0ZShlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00uaHlkcmF0ZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIFJlYWN0IDE4LiBVc2UgaHlkcmF0ZVJvb3QgJyArICdpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvIHRoZSBuZXcgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyAnICsgXCJpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgMTcuIExlYXJuIFwiICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00uaHlkcmF0ZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KT8nKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogdGhyb3cgb3Igd2FybiBpZiB3ZSBjb3VsZG4ndCBoeWRyYXRlP1xuXG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgdHJ1ZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gcmVuZGVyKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS5yZW5kZXIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBSZWFjdCAxOC4gVXNlIGNyZWF0ZVJvb3QgJyArICdpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvIHRoZSBuZXcgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyAnICsgXCJpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgMTcuIExlYXJuIFwiICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnJlbmRlcihlbGVtZW50KT8nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCAnICsgJ2luIFJlYWN0IDE4LiBDb25zaWRlciB1c2luZyBhIHBvcnRhbCBpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvICcgKyBcInRoZSBjcmVhdGVSb290IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgaWYgaXQncyBydW5uaW5nIFJlYWN0IFwiICsgJzE3LiBMZWFybiBtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXJOb2RlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIGlmIChwYXJlbnRDb21wb25lbnQgPT0gbnVsbCB8fCAhaGFzKHBhcmVudENvbXBvbmVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcmVudENvbXBvbmVudCBtdXN0IGJlIGEgdmFsaWQgUmVhY3QgQ29tcG9uZW50Jyk7XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBmYWxzZSwgY2FsbGJhY2spO1xufVxudmFyIGRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUgPSBmYWxzZTtcbmZ1bmN0aW9uIHVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUpIHtcbiAgICAgIGRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUgPSB0cnVlO1xuXG4gICAgICBlcnJvcigndW5tb3VudENvbXBvbmVudEF0Tm9kZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlICcgKyAnbmV4dCBtYWpvciByZWxlYXNlLiBTd2l0Y2ggdG8gdGhlIGNyZWF0ZVJvb3QgQVBJLiBMZWFybiAnICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bm1vdW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIERpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QudW5tb3VudCgpPycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgIHtcbiAgICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgIHZhciByZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QgPSByb290RWwgJiYgIWdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTtcblxuICAgICAgaWYgKHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH0gLy8gVW5tb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEpO1xuc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkpO1xuXG57XG4gIGlmICh0eXBlb2YgTWFwICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgTWFwIGhhcyBubyBwcm90b3R5cGVcbiAgTWFwLnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBNYXAucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFNldCBoYXMgbm8gcHJvdG90eXBlXG4gIFNldC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5jbGVhciAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgZXJyb3IoJ1JlYWN0IGRlcGVuZHMgb24gTWFwIGFuZCBTZXQgYnVpbHQtaW4gdHlwZXMuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxscycpO1xuICB9XG59XG5cbnNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihyZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMpO1xuc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlcyQxLCBkaXNjcmV0ZVVwZGF0ZXMsIGZsdXNoU3luYyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbCQxKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfSAvLyBUT0RPOiBwYXNzIFJlYWN0RE9NIHBvcnRhbCBpbXBsZW1lbnRhdGlvbiBhcyB0aGlyZCBhcmd1bWVudFxuICAvLyAkRmxvd0ZpeE1lIFRoZSBGbG93IHR5cGUgaXMgb3BhcXVlIGJ1dCB0aGVyZSdzIG5vIHdheSB0byBhY3R1YWxseSBjcmVhdGUgaXQuXG5cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIsIG51bGwsIGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spO1xufVxuXG52YXIgSW50ZXJuYWxzID0ge1xuICB1c2luZ0NsaWVudEVudHJ5UG9pbnQ6IGZhbHNlLFxuICAvLyBLZWVwIGluIHN5bmMgd2l0aCBSZWFjdFRlc3RVdGlscy5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGJhdGNoZWRVcGRhdGVzJDFdXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290JDEoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHtcbiAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIWZhbHNlKSB7XG4gICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgY3JlYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaHlkcmF0ZVJvb3QkMShjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGh5ZHJhdGVSb290IGZyb20gXCJyZWFjdC1kb21cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpO1xufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmZ1bmN0aW9uIGZsdXNoU3luYyQxKGZuKSB7XG4gIHtcbiAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgIGVycm9yKCdmbHVzaFN5bmMgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIGxpZmVjeWNsZSBtZXRob2QuIFJlYWN0IGNhbm5vdCAnICsgJ2ZsdXNoIHdoZW4gUmVhY3QgaXMgYWxyZWFkeSByZW5kZXJpbmcuIENvbnNpZGVyIG1vdmluZyB0aGlzIGNhbGwgdG8gJyArICdhIHNjaGVkdWxlciB0YXNrIG9yIG1pY3JvIHRhc2suJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsdXNoU3luYyhmbik7XG59XG52YXIgZm91bmREZXZUb29scyA9IGluamVjdEludG9EZXZUb29scyh7XG4gIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgYnVuZGxlVHlwZTogIDEgLFxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG4gIHJlbmRlcmVyUGFja2FnZU5hbWU6ICdyZWFjdC1kb20nXG59KTtcblxue1xuICBpZiAoIWZvdW5kRGV2VG9vbHMgJiYgY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7XG4gICAgLy8gSWYgd2UncmUgaW4gQ2hyb21lIG9yIEZpcmVmb3gsIHByb3ZpZGUgYSBkb3dubG9hZCBsaW5rIGlmIG5vdCBpbnN0YWxsZWQuXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgdmFyIHByb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sOyAvLyBEb24ndCB3YXJuIGluIGV4b3RpYyBjYXNlcyBsaWtlIGNocm9tZS1leHRlbnNpb246Ly8uXG5cbiAgICAgIGlmICgvXihodHRwcz98ZmlsZSk6JC8udGVzdChwcm90b2NvbCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICAgICAgICBjb25zb2xlLmluZm8oJyVjRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyArIChwcm90b2NvbCA9PT0gJ2ZpbGU6JyA/ICdcXG5Zb3UgbWlnaHQgbmVlZCB0byB1c2UgYSBsb2NhbCBIVFRQIHNlcnZlciAoaW5zdGVhZCBvZiBmaWxlOi8vKTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMtZmFxJyA6ICcnKSwgJ2ZvbnQtd2VpZ2h0OmJvbGQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IEludGVybmFscztcbmV4cG9ydHMuY3JlYXRlUG9ydGFsID0gY3JlYXRlUG9ydGFsJDE7XG5leHBvcnRzLmNyZWF0ZVJvb3QgPSBjcmVhdGVSb290JDE7XG5leHBvcnRzLmZpbmRET01Ob2RlID0gZmluZERPTU5vZGU7XG5leHBvcnRzLmZsdXNoU3luYyA9IGZsdXNoU3luYyQxO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBoeWRyYXRlUm9vdCQxO1xuZXhwb3J0cy5yZW5kZXIgPSByZW5kZXI7XG5leHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGUgPSB1bm1vdW50Q29tcG9uZW50QXROb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyA9IGJhdGNoZWRVcGRhdGVzJDE7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG0gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGV4cG9ydHMuY3JlYXRlUm9vdCA9IG0uY3JlYXRlUm9vdDtcbiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IG0uaHlkcmF0ZVJvb3Q7XG59IGVsc2Uge1xuICB2YXIgaSA9IG0uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG4gIGV4cG9ydHMuY3JlYXRlUm9vdCA9IGZ1bmN0aW9uKGMsIG8pIHtcbiAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtLmNyZWF0ZVJvb3QoYywgbyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gZmFsc2U7XG4gICAgfVxuICB9O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gZnVuY3Rpb24oYywgaCwgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uaHlkcmF0ZVJvb3QoYywgaCwgbyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gZmFsc2U7XG4gICAgfVxuICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBjaGVja0RDRSgpIHtcbiAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuICBpZiAoXG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIFRoaXMgYnJhbmNoIGlzIHVucmVhY2hhYmxlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZFxuICAgIC8vIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgY29uZGl0aW9uIGlzIHRydWUgb25seSBpbiBkZXZlbG9wbWVudC5cbiAgICAvLyBUaGVyZWZvcmUgaWYgdGhlIGJyYW5jaCBpcyBzdGlsbCBoZXJlLCBkZWFkIGNvZGUgZWxpbWluYXRpb24gd2Fzbid0XG4gICAgLy8gcHJvcGVybHkgYXBwbGllZC5cbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIG1lc3NhZ2UuIFJlYWN0IERldlRvb2xzIHJlbGllcyBvbiBpdC4gQWxzbyBtYWtlIHN1cmVcbiAgICAvLyB0aGlzIG1lc3NhZ2UgZG9lc24ndCBvY2N1ciBlbHNld2hlcmUgaW4gdGhpcyBmdW5jdGlvbiwgb3IgaXQgd2lsbCBjYXVzZVxuICAgIC8vIGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdeX14nKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb2RlIGFib3ZlIGhhcyBiZWVuIGRlYWQgY29kZSBlbGltaW5hdGVkIChEQ0UnZCkuXG4gICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGNoZWNrRENFKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gRGV2VG9vbHMgc2hvdWxkbid0IGNyYXNoIFJlYWN0LCBubyBtYXR0ZXIgd2hhdC5cbiAgICAvLyBXZSBzaG91bGQgc3RpbGwgcmVwb3J0IGluIGNhc2Ugd2UgYnJlYWsgdGhpcyBjb2RlLlxuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAvLyBEQ0UgY2hlY2sgc2hvdWxkIGhhcHBlbiBiZWZvcmUgUmVhY3RET00gYnVuZGxlIGV4ZWN1dGVzIHNvIHRoYXRcbiAgLy8gRGV2VG9vbHMgY2FuIHJlcG9ydCBiYWQgbWluaWZpY2F0aW9uIGR1cmluZyBpbmplY3Rpb24uXG4gIGNoZWNrRENFKCk7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyA9IGZhbHNlO1xudmFyIGVuYWJsZVByb2ZpbGluZyA9IGZhbHNlO1xudmFyIGZyYW1lWWllbGRNcyA9IDU7XG5cbmZ1bmN0aW9uIHB1c2goaGVhcCwgbm9kZSkge1xuICB2YXIgaW5kZXggPSBoZWFwLmxlbmd0aDtcbiAgaGVhcC5wdXNoKG5vZGUpO1xuICBzaWZ0VXAoaGVhcCwgbm9kZSwgaW5kZXgpO1xufVxuZnVuY3Rpb24gcGVlayhoZWFwKSB7XG4gIHJldHVybiBoZWFwLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBoZWFwWzBdO1xufVxuZnVuY3Rpb24gcG9wKGhlYXApIHtcbiAgaWYgKGhlYXAubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZmlyc3QgPSBoZWFwWzBdO1xuICB2YXIgbGFzdCA9IGhlYXAucG9wKCk7XG5cbiAgaWYgKGxhc3QgIT09IGZpcnN0KSB7XG4gICAgaGVhcFswXSA9IGxhc3Q7XG4gICAgc2lmdERvd24oaGVhcCwgbGFzdCwgMCk7XG4gIH1cblxuICByZXR1cm4gZmlyc3Q7XG59XG5cbmZ1bmN0aW9uIHNpZnRVcChoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG5cbiAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgIHZhciBwYXJlbnRJbmRleCA9IGluZGV4IC0gMSA+Pj4gMTtcbiAgICB2YXIgcGFyZW50ID0gaGVhcFtwYXJlbnRJbmRleF07XG5cbiAgICBpZiAoY29tcGFyZShwYXJlbnQsIG5vZGUpID4gMCkge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBsYXJnZXIuIFN3YXAgcG9zaXRpb25zLlxuICAgICAgaGVhcFtwYXJlbnRJbmRleF0gPSBub2RlO1xuICAgICAgaGVhcFtpbmRleF0gPSBwYXJlbnQ7XG4gICAgICBpbmRleCA9IHBhcmVudEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcGFyZW50IGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNpZnREb3duKGhlYXAsIG5vZGUsIGkpIHtcbiAgdmFyIGluZGV4ID0gaTtcbiAgdmFyIGxlbmd0aCA9IGhlYXAubGVuZ3RoO1xuICB2YXIgaGFsZkxlbmd0aCA9IGxlbmd0aCA+Pj4gMTtcblxuICB3aGlsZSAoaW5kZXggPCBoYWxmTGVuZ3RoKSB7XG4gICAgdmFyIGxlZnRJbmRleCA9IChpbmRleCArIDEpICogMiAtIDE7XG4gICAgdmFyIGxlZnQgPSBoZWFwW2xlZnRJbmRleF07XG4gICAgdmFyIHJpZ2h0SW5kZXggPSBsZWZ0SW5kZXggKyAxO1xuICAgIHZhciByaWdodCA9IGhlYXBbcmlnaHRJbmRleF07IC8vIElmIHRoZSBsZWZ0IG9yIHJpZ2h0IG5vZGUgaXMgc21hbGxlciwgc3dhcCB3aXRoIHRoZSBzbWFsbGVyIG9mIHRob3NlLlxuXG4gICAgaWYgKGNvbXBhcmUobGVmdCwgbm9kZSkgPCAwKSB7XG4gICAgICBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBsZWZ0KSA8IDApIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gbGVmdDtcbiAgICAgICAgaGVhcFtsZWZ0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSBsZWZ0SW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIGNvbXBhcmUocmlnaHQsIG5vZGUpIDwgMCkge1xuICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGNoaWxkIGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAvLyBDb21wYXJlIHNvcnQgaW5kZXggZmlyc3QsIHRoZW4gdGFzayBpZC5cbiAgdmFyIGRpZmYgPSBhLnNvcnRJbmRleCAtIGIuc29ydEluZGV4O1xuICByZXR1cm4gZGlmZiAhPT0gMCA/IGRpZmYgOiBhLmlkIC0gYi5pZDtcbn1cblxuLy8gVE9ETzogVXNlIHN5bWJvbHM/XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSAxO1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gMjtcbnZhciBOb3JtYWxQcmlvcml0eSA9IDM7XG52YXIgTG93UHJpb3JpdHkgPSA0O1xudmFyIElkbGVQcmlvcml0eSA9IDU7XG5cbmZ1bmN0aW9uIG1hcmtUYXNrRXJyb3JlZCh0YXNrLCBtcykge1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxudmFyIGhhc1BlcmZvcm1hbmNlTm93ID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nO1xuXG5pZiAoaGFzUGVyZm9ybWFuY2VOb3cpIHtcbiAgdmFyIGxvY2FsUGVyZm9ybWFuY2UgPSBwZXJmb3JtYW5jZTtcblxuICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9jYWxQZXJmb3JtYW5jZS5ub3coKTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBsb2NhbERhdGUgPSBEYXRlO1xuICB2YXIgaW5pdGlhbFRpbWUgPSBsb2NhbERhdGUubm93KCk7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsRGF0ZS5ub3coKSAtIGluaXRpYWxUaW1lO1xuICB9O1xufSAvLyBNYXggMzEgYml0IGludGVnZXIuIFRoZSBtYXggaW50ZWdlciBzaXplIGluIFY4IGZvciAzMi1iaXQgc3lzdGVtcy5cbi8vIE1hdGgucG93KDIsIDMwKSAtIDFcbi8vIDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXG5cblxudmFyIG1heFNpZ25lZDMxQml0SW50ID0gMTA3Mzc0MTgyMzsgLy8gVGltZXMgb3V0IGltbWVkaWF0ZWx5XG5cbnZhciBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVCA9IC0xOyAvLyBFdmVudHVhbGx5IHRpbWVzIG91dFxuXG52YXIgVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUID0gMjUwO1xudmFyIE5PUk1BTF9QUklPUklUWV9USU1FT1VUID0gNTAwMDtcbnZhciBMT1dfUFJJT1JJVFlfVElNRU9VVCA9IDEwMDAwOyAvLyBOZXZlciB0aW1lcyBvdXRcblxudmFyIElETEVfUFJJT1JJVFlfVElNRU9VVCA9IG1heFNpZ25lZDMxQml0SW50OyAvLyBUYXNrcyBhcmUgc3RvcmVkIG9uIGEgbWluIGhlYXBcblxudmFyIHRhc2tRdWV1ZSA9IFtdO1xudmFyIHRpbWVyUXVldWUgPSBbXTsgLy8gSW5jcmVtZW50aW5nIGlkIGNvdW50ZXIuIFVzZWQgdG8gbWFpbnRhaW4gaW5zZXJ0aW9uIG9yZGVyLlxuXG52YXIgdGFza0lkQ291bnRlciA9IDE7IC8vIFBhdXNpbmcgdGhlIHNjaGVkdWxlciBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbnZhciBjdXJyZW50VGFzayA9IG51bGw7XG52YXIgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTsgLy8gVGhpcyBpcyBzZXQgd2hpbGUgcGVyZm9ybWluZyB3b3JrLCB0byBwcmV2ZW50IHJlLWVudHJhbmNlLlxuXG52YXIgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xudmFyIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG52YXIgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlOyAvLyBDYXB0dXJlIGxvY2FsIHJlZmVyZW5jZXMgdG8gbmF0aXZlIEFQSXMsIGluIGNhc2UgYSBwb2x5ZmlsbCBvdmVycmlkZXMgdGhlbS5cblxudmFyIGxvY2FsU2V0VGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxDbGVhclRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogbnVsbDtcbnZhciBsb2NhbFNldEltbWVkaWF0ZSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnID8gc2V0SW1tZWRpYXRlIDogbnVsbDsgLy8gSUUgYW5kIE5vZGUuanMgKyBqc2RvbVxuXG52YXIgaXNJbnB1dFBlbmRpbmcgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZyAhPT0gdW5kZWZpbmVkICYmIG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nICE9PSB1bmRlZmluZWQgPyBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKSA6IG51bGw7XG5cbmZ1bmN0aW9uIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpIHtcbiAgLy8gQ2hlY2sgZm9yIHRhc2tzIHRoYXQgYXJlIG5vIGxvbmdlciBkZWxheWVkIGFuZCBhZGQgdGhlbSB0byB0aGUgcXVldWUuXG4gIHZhciB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgd2hpbGUgKHRpbWVyICE9PSBudWxsKSB7XG4gICAgaWYgKHRpbWVyLmNhbGxiYWNrID09PSBudWxsKSB7XG4gICAgICAvLyBUaW1lciB3YXMgY2FuY2VsbGVkLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgIH0gZWxzZSBpZiAodGltZXIuc3RhcnRUaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaW1lciBmaXJlZC4gVHJhbnNmZXIgdG8gdGhlIHRhc2sgcXVldWUuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgICB0aW1lci5zb3J0SW5kZXggPSB0aW1lci5leHBpcmF0aW9uVGltZTtcbiAgICAgIHB1c2godGFza1F1ZXVlLCB0aW1lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbWFpbmluZyB0aW1lcnMgYXJlIHBlbmRpbmcuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoY3VycmVudFRpbWUpIHtcbiAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcblxuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkKSB7XG4gICAgaWYgKHBlZWsodGFza1F1ZXVlKSAhPT0gbnVsbCkge1xuICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hXb3JrKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG5cblxuICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgLy8gV2Ugc2NoZWR1bGVkIGEgdGltZW91dCBidXQgaXQncyBubyBsb25nZXIgbmVlZGVkLiBDYW5jZWwgaXQuXG4gICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7XG4gIH1cblxuICBpc1BlcmZvcm1pbmdXb3JrID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgaWYgKGVuYWJsZVByb2ZpbGluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gICAgICAgICAgbWFya1Rhc2tFcnJvcmVkKGN1cnJlbnRUYXNrLCBjdXJyZW50VGltZSk7XG4gICAgICAgICAgY3VycmVudFRhc2suaXNRdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjYXRjaCBpbiBwcm9kIGNvZGUgcGF0aC5cbiAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRUYXNrID0gbnVsbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gaW5pdGlhbFRpbWU7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcblxuICB3aGlsZSAoY3VycmVudFRhc2sgIT09IG51bGwgJiYgIShlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgKSkge1xuICAgIGlmIChjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA+IGN1cnJlbnRUaW1lICYmICghaGFzVGltZVJlbWFpbmluZyB8fCBzaG91bGRZaWVsZFRvSG9zdCgpKSkge1xuICAgICAgLy8gVGhpcyBjdXJyZW50VGFzayBoYXNuJ3QgZXhwaXJlZCwgYW5kIHdlJ3ZlIHJlYWNoZWQgdGhlIGRlYWRsaW5lLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGNhbGxiYWNrID0gY3VycmVudFRhc2suY2FsbGJhY2s7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IG51bGw7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRUYXNrLnByaW9yaXR5TGV2ZWw7XG4gICAgICB2YXIgZGlkVXNlckNhbGxiYWNrVGltZW91dCA9IGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lO1xuXG4gICAgICB2YXIgY29udGludWF0aW9uQ2FsbGJhY2sgPSBjYWxsYmFjayhkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0KTtcbiAgICAgIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb250aW51YXRpb25DYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IGNvbnRpbnVhdGlvbkNhbGxiYWNrO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoY3VycmVudFRhc2sgPT09IHBlZWsodGFza1F1ZXVlKSkge1xuICAgICAgICAgIHBvcCh0YXNrUXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICB9XG5cbiAgICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcbiAgfSAvLyBSZXR1cm4gd2hldGhlciB0aGVyZSdzIGFkZGl0aW9uYWwgd29ya1xuXG5cbiAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5TGV2ZWwsIGV2ZW50SGFuZGxlcikge1xuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICB9XG5cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfbmV4dChldmVudEhhbmRsZXIpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWw7XG5cbiAgc3dpdGNoIChjdXJyZW50UHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgLy8gU2hpZnQgZG93biB0byBub3JtYWwgcHJpb3JpdHlcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEFueXRoaW5nIGxvd2VyIHRoYW4gbm9ybWFsIHByaW9yaXR5IHNob3VsZCByZW1haW4gYXQgdGhlIGN1cnJlbnQgbGV2ZWwuXG4gICAgICBwcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXBDYWxsYmFjayhjYWxsYmFjaykge1xuICB2YXIgcGFyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoaXMgaXMgYSBmb3JrIG9mIHJ1bldpdGhQcmlvcml0eSwgaW5saW5lZCBmb3IgcGVyZm9ybWFuY2UuXG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcGFyZW50UHJpb3JpdHlMZXZlbDtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gIHZhciBzdGFydFRpbWU7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsKSB7XG4gICAgdmFyIGRlbGF5ID0gb3B0aW9ucy5kZWxheTtcblxuICAgIGlmICh0eXBlb2YgZGVsYXkgPT09ICdudW1iZXInICYmIGRlbGF5ID4gMCkge1xuICAgICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWUgKyBkZWxheTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICB9XG5cbiAgdmFyIHRpbWVvdXQ7XG5cbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IElETEVfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBMT1dfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBkZWZhdWx0OlxuICAgICAgdGltZW91dCA9IE5PUk1BTF9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyB0aW1lb3V0O1xuICB2YXIgbmV3VGFzayA9IHtcbiAgICBpZDogdGFza0lkQ291bnRlcisrLFxuICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICBwcmlvcml0eUxldmVsOiBwcmlvcml0eUxldmVsLFxuICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lLFxuICAgIGV4cGlyYXRpb25UaW1lOiBleHBpcmF0aW9uVGltZSxcbiAgICBzb3J0SW5kZXg6IC0xXG4gIH07XG5cbiAgaWYgKHN0YXJ0VGltZSA+IGN1cnJlbnRUaW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGRlbGF5ZWQgdGFzay5cbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IHN0YXJ0VGltZTtcbiAgICBwdXNoKHRpbWVyUXVldWUsIG5ld1Rhc2spO1xuXG4gICAgaWYgKHBlZWsodGFza1F1ZXVlKSA9PT0gbnVsbCAmJiBuZXdUYXNrID09PSBwZWVrKHRpbWVyUXVldWUpKSB7XG4gICAgICAvLyBBbGwgdGFza3MgYXJlIGRlbGF5ZWQsIGFuZCB0aGlzIGlzIHRoZSB0YXNrIHdpdGggdGhlIGVhcmxpZXN0IGRlbGF5LlxuICAgICAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFuIGV4aXN0aW5nIHRpbWVvdXQuXG4gICAgICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIH0gLy8gU2NoZWR1bGUgYSB0aW1lb3V0LlxuXG5cbiAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBzdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5ld1Rhc2suc29ydEluZGV4ID0gZXhwaXJhdGlvblRpbWU7XG4gICAgcHVzaCh0YXNrUXVldWUsIG5ld1Rhc2spO1xuICAgIC8vIHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSB3ZSB5aWVsZC5cblxuXG4gICAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykge1xuICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdUYXNrO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbigpIHtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY29udGludWVFeGVjdXRpb24oKSB7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykge1xuICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUoKSB7XG4gIHJldHVybiBwZWVrKHRhc2tRdWV1ZSk7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrKHRhc2spIHtcbiAgLy8gcmVtb3ZlIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgeW91IGNhbid0IHJlbW92ZSBhcmJpdHJhcnkgbm9kZXMgZnJvbSBhblxuICAvLyBhcnJheSBiYXNlZCBoZWFwLCBvbmx5IHRoZSBmaXJzdCBvbmUuKVxuXG5cbiAgdGFzay5jYWxsYmFjayA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsKCkge1xuICByZXR1cm4gY3VycmVudFByaW9yaXR5TGV2ZWw7XG59XG5cbnZhciBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xudmFyIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG52YXIgdGFza1RpbWVvdXRJRCA9IC0xOyAvLyBTY2hlZHVsZXIgcGVyaW9kaWNhbGx5IHlpZWxkcyBpbiBjYXNlIHRoZXJlIGlzIG90aGVyIHdvcmsgb24gdGhlIG1haW5cbi8vIHRocmVhZCwgbGlrZSB1c2VyIGV2ZW50cy4gQnkgZGVmYXVsdCwgaXQgeWllbGRzIG11bHRpcGxlIHRpbWVzIHBlciBmcmFtZS5cbi8vIEl0IGRvZXMgbm90IGF0dGVtcHQgdG8gYWxpZ24gd2l0aCBmcmFtZSBib3VuZGFyaWVzLCBzaW5jZSBtb3N0IHRhc2tzIGRvbid0XG4vLyBuZWVkIHRvIGJlIGZyYW1lIGFsaWduZWQ7IGZvciB0aG9zZSB0aGF0IGRvLCB1c2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuXG52YXIgZnJhbWVJbnRlcnZhbCA9IGZyYW1lWWllbGRNcztcbnZhciBzdGFydFRpbWUgPSAtMTtcblxuZnVuY3Rpb24gc2hvdWxkWWllbGRUb0hvc3QoKSB7XG4gIHZhciB0aW1lRWxhcHNlZCA9IGV4cG9ydHMudW5zdGFibGVfbm93KCkgLSBzdGFydFRpbWU7XG5cbiAgaWYgKHRpbWVFbGFwc2VkIDwgZnJhbWVJbnRlcnZhbCkge1xuICAgIC8vIFRoZSBtYWluIHRocmVhZCBoYXMgb25seSBiZWVuIGJsb2NrZWQgZm9yIGEgcmVhbGx5IHNob3J0IGFtb3VudCBvZiB0aW1lO1xuICAgIC8vIHNtYWxsZXIgdGhhbiBhIHNpbmdsZSBmcmFtZS4gRG9uJ3QgeWllbGQgeWV0LlxuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIGJlZW4gYmxvY2tlZCBmb3IgYSBub24tbmVnbGlnaWJsZSBhbW91bnQgb2YgdGltZS4gV2VcblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UGFpbnQoKSB7XG5cbn1cblxuZnVuY3Rpb24gZm9yY2VGcmFtZVJhdGUoZnBzKSB7XG4gIGlmIChmcHMgPCAwIHx8IGZwcyA+IDEyNSkge1xuICAgIC8vIFVzaW5nIGNvbnNvbGVbJ2Vycm9yJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuICAgIGNvbnNvbGVbJ2Vycm9yJ10oJ2ZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCAnICsgJ2ZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZwcyA+IDApIHtcbiAgICBmcmFtZUludGVydmFsID0gTWF0aC5mbG9vcigxMDAwIC8gZnBzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXNldCB0aGUgZnJhbWVyYXRlXG4gICAgZnJhbWVJbnRlcnZhbCA9IGZyYW1lWWllbGRNcztcbiAgfVxufVxuXG52YXIgcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICBpZiAoc2NoZWR1bGVkSG9zdENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgc3RhcnQgdGltZSBzbyB3ZSBjYW4gbWVhc3VyZSBob3cgbG9uZyB0aGUgbWFpbiB0aHJlYWRcbiAgICAvLyBoYXMgYmVlbiBibG9ja2VkLlxuXG4gICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgdmFyIGhhc1RpbWVSZW1haW5pbmcgPSB0cnVlOyAvLyBJZiBhIHNjaGVkdWxlciB0YXNrIHRocm93cywgZXhpdCB0aGUgY3VycmVudCBicm93c2VyIHRhc2sgc28gdGhlXG4gICAgLy8gZXJyb3IgY2FuIGJlIG9ic2VydmVkLlxuICAgIC8vXG4gICAgLy8gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgYSB0cnktY2F0Y2gsIHNpbmNlIHRoYXQgbWFrZXMgc29tZSBkZWJ1Z2dpbmdcbiAgICAvLyB0ZWNobmlxdWVzIGhhcmRlci4gSW5zdGVhZCwgaWYgYHNjaGVkdWxlZEhvc3RDYWxsYmFja2AgZXJyb3JzLCB0aGVuXG4gICAgLy8gYGhhc01vcmVXb3JrYCB3aWxsIHJlbWFpbiB0cnVlLCBhbmQgd2UnbGwgY29udGludWUgdGhlIHdvcmsgbG9vcC5cblxuICAgIHZhciBoYXNNb3JlV29yayA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgaGFzTW9yZVdvcmsgPSBzY2hlZHVsZWRIb3N0Q2FsbGJhY2soaGFzVGltZVJlbWFpbmluZywgY3VycmVudFRpbWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoaGFzTW9yZVdvcmspIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHdvcmssIHNjaGVkdWxlIHRoZSBuZXh0IG1lc3NhZ2UgZXZlbnQgYXQgdGhlIGVuZFxuICAgICAgICAvLyBvZiB0aGUgcHJlY2VkaW5nIG9uZS5cbiAgICAgICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gIH0gLy8gWWllbGRpbmcgdG8gdGhlIGJyb3dzZXIgd2lsbCBnaXZlIGl0IGEgY2hhbmNlIHRvIHBhaW50LCBzbyB3ZSBjYW5cbn07XG5cbnZhciBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZTtcblxuaWYgKHR5cGVvZiBsb2NhbFNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBOb2RlLmpzIGFuZCBvbGQgSUUuXG4gIC8vIFRoZXJlJ3MgYSBmZXcgcmVhc29ucyBmb3Igd2h5IHdlIHByZWZlciBzZXRJbW1lZGlhdGUuXG4gIC8vXG4gIC8vIFVubGlrZSBNZXNzYWdlQ2hhbm5lbCwgaXQgZG9lc24ndCBwcmV2ZW50IGEgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgLy8gKEV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBET00gZm9yayBvZiB0aGUgU2NoZWR1bGVyLCB5b3UgY291bGQgZ2V0IGhlcmVcbiAgLy8gd2l0aCBhIG1peCBvZiBOb2RlLmpzIDE1Kywgd2hpY2ggaGFzIGEgTWVzc2FnZUNoYW5uZWwsIGFuZCBqc2RvbS4pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjA3NTZcbiAgLy9cbiAgLy8gQnV0IGFsc28sIGl0IHJ1bnMgZWFybGllciB3aGljaCBpcyB0aGUgc2VtYW50aWMgd2Ugd2FudC5cbiAgLy8gSWYgb3RoZXIgYnJvd3NlcnMgZXZlciBpbXBsZW1lbnQgaXQsIGl0J3MgYmV0dGVyIHRvIHVzZSBpdC5cbiAgLy8gQWx0aG91Z2ggYm90aCBvZiB0aGVzZSB3b3VsZCBiZSBpbmZlcmlvciB0byBuYXRpdmUgc2NoZWR1bGluZy5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbG9jYWxTZXRJbW1lZGlhdGUocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKTtcbiAgfTtcbn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBET00gYW5kIFdvcmtlciBlbnZpcm9ubWVudHMuXG4gIC8vIFdlIHByZWZlciBNZXNzYWdlQ2hhbm5lbCBiZWNhdXNlIG9mIHRoZSA0bXMgc2V0VGltZW91dCBjbGFtcGluZy5cbiAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgdmFyIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZTtcblxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBwb3J0LnBvc3RNZXNzYWdlKG51bGwpO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gV2Ugc2hvdWxkIG9ubHkgZmFsbGJhY2sgaGVyZSBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0VGltZW91dChwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUsIDApO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SG9zdENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gIGlmICghaXNNZXNzYWdlTG9vcFJ1bm5pbmcpIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IHRydWU7XG4gICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXF1ZXN0SG9zdFRpbWVvdXQoY2FsbGJhY2ssIG1zKSB7XG4gIHRhc2tUaW1lb3V0SUQgPSBsb2NhbFNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKGV4cG9ydHMudW5zdGFibGVfbm93KCkpO1xuICB9LCBtcyk7XG59XG5cbmZ1bmN0aW9uIGNhbmNlbEhvc3RUaW1lb3V0KCkge1xuICBsb2NhbENsZWFyVGltZW91dCh0YXNrVGltZW91dElEKTtcbiAgdGFza1RpbWVvdXRJRCA9IC0xO1xufVxuXG52YXIgdW5zdGFibGVfcmVxdWVzdFBhaW50ID0gcmVxdWVzdFBhaW50O1xudmFyIHVuc3RhYmxlX1Byb2ZpbGluZyA9ICBudWxsO1xuXG5leHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHkgPSBMb3dQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfUHJvZmlsaW5nID0gdW5zdGFibGVfUHJvZmlsaW5nO1xuZXhwb3J0cy51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayA9IHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZSA9IGZvcmNlRnJhbWVSYXRlO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCA9IHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSA9IHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0ID0gdW5zdGFibGVfbmV4dDtcbmV4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb24gPSB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50ID0gdW5zdGFibGVfcmVxdWVzdFBhaW50O1xuZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkgPSB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sgPSB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZCA9IHNob3VsZFlpZWxkVG9Ib3N0O1xuZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2sgPSB1bnN0YWJsZV93cmFwQ2FsbGJhY2s7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRyYWdnYWJsZUNvcmVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX0RyYWdnYWJsZUNvcmUuZGVmYXVsdDtcbiAgfVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9wcm9wVHlwZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcbnZhciBfcmVhY3REb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xudmFyIF9jbHN4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xzeFwiKSk7XG52YXIgX2RvbUZucyA9IHJlcXVpcmUoXCIuL3V0aWxzL2RvbUZuc1wiKTtcbnZhciBfcG9zaXRpb25GbnMgPSByZXF1aXJlKFwiLi91dGlscy9wb3NpdGlvbkZuc1wiKTtcbnZhciBfc2hpbXMgPSByZXF1aXJlKFwiLi91dGlscy9zaGltc1wiKTtcbnZhciBfRHJhZ2dhYmxlQ29yZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRHJhZ2dhYmxlQ29yZVwiKSk7XG52YXIgX2xvZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXRpbHMvbG9nXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgeyBpZiAodHlwZW9mIGlucHV0ICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7IHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgeyB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTsgaWYgKHR5cGVvZiByZXMgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfSAvKjo6IGltcG9ydCB0eXBlIHtDb250cm9sUG9zaXRpb24sIFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uLCBEcmFnZ2FibGVDb3JlUHJvcHMsIERyYWdnYWJsZUNvcmVEZWZhdWx0UHJvcHN9IGZyb20gJy4vRHJhZ2dhYmxlQ29yZSc7Ki9cbi8qOjogaW1wb3J0IHR5cGUge0JvdW5kcywgRHJhZ2dhYmxlRXZlbnRIYW5kbGVyfSBmcm9tICcuL3V0aWxzL3R5cGVzJzsqL1xuLyo6OiBpbXBvcnQgdHlwZSB7RWxlbWVudCBhcyBSZWFjdEVsZW1lbnR9IGZyb20gJ3JlYWN0JzsqL1xuLyo6OiB0eXBlIERyYWdnYWJsZVN0YXRlID0ge1xuICBkcmFnZ2luZzogYm9vbGVhbixcbiAgZHJhZ2dlZDogYm9vbGVhbixcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsXG4gIHNsYWNrWDogbnVtYmVyLCBzbGFja1k6IG51bWJlcixcbiAgaXNFbGVtZW50U1ZHOiBib29sZWFuLFxuICBwcmV2UHJvcHNQb3NpdGlvbjogP0NvbnRyb2xQb3NpdGlvbixcbn07Ki9cbi8qOjogZXhwb3J0IHR5cGUgRHJhZ2dhYmxlRGVmYXVsdFByb3BzID0ge1xuICAuLi5EcmFnZ2FibGVDb3JlRGVmYXVsdFByb3BzLFxuICBheGlzOiAnYm90aCcgfCAneCcgfCAneScgfCAnbm9uZScsXG4gIGJvdW5kczogQm91bmRzIHwgc3RyaW5nIHwgZmFsc2UsXG4gIGRlZmF1bHRDbGFzc05hbWU6IHN0cmluZyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nOiBzdHJpbmcsXG4gIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2VkOiBzdHJpbmcsXG4gIGRlZmF1bHRQb3NpdGlvbjogQ29udHJvbFBvc2l0aW9uLFxuICBzY2FsZTogbnVtYmVyLFxufTsqL1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVQcm9wcyA9IHtcbiAgLi4uRHJhZ2dhYmxlQ29yZVByb3BzLFxuICAuLi5EcmFnZ2FibGVEZWZhdWx0UHJvcHMsXG4gIHBvc2l0aW9uT2Zmc2V0OiBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbixcbiAgcG9zaXRpb246IENvbnRyb2xQb3NpdGlvbixcbn07Ki9cbi8vXG4vLyBEZWZpbmUgPERyYWdnYWJsZT5cbi8vXG5jbGFzcyBEcmFnZ2FibGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgLyo6OiA8RHJhZ2dhYmxlUHJvcHMsIERyYWdnYWJsZVN0YXRlPiove1xuICAvLyBSZWFjdCAxNi4zK1xuICAvLyBBcml0eSAocHJvcHMsIHN0YXRlKVxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKF9yZWYgLyo6OiAqLywgX3JlZjIgLyo6OiAqLykgLyo6ID9QYXJ0aWFsPERyYWdnYWJsZVN0YXRlPiove1xuICAgIGxldCB7XG4gICAgICBwb3NpdGlvblxuICAgIH0gLyo6IERyYWdnYWJsZVByb3BzKi8gPSBfcmVmIC8qOiBEcmFnZ2FibGVQcm9wcyovO1xuICAgIGxldCB7XG4gICAgICBwcmV2UHJvcHNQb3NpdGlvblxuICAgIH0gLyo6IERyYWdnYWJsZVN0YXRlKi8gPSBfcmVmMiAvKjogRHJhZ2dhYmxlU3RhdGUqLztcbiAgICAvLyBTZXQgeC95IGlmIGEgbmV3IHBvc2l0aW9uIGlzIHByb3ZpZGVkIGluIHByb3BzIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHByZXZpb3VzLlxuICAgIGlmIChwb3NpdGlvbiAmJiAoIXByZXZQcm9wc1Bvc2l0aW9uIHx8IHBvc2l0aW9uLnggIT09IHByZXZQcm9wc1Bvc2l0aW9uLnggfHwgcG9zaXRpb24ueSAhPT0gcHJldlByb3BzUG9zaXRpb24ueSkpIHtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGU6IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAlaicsIHtcbiAgICAgICAgcG9zaXRpb24sXG4gICAgICAgIHByZXZQcm9wc1Bvc2l0aW9uXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHBvc2l0aW9uLngsXG4gICAgICAgIHk6IHBvc2l0aW9uLnksXG4gICAgICAgIHByZXZQcm9wc1Bvc2l0aW9uOiB7XG4gICAgICAgICAgLi4ucG9zaXRpb25cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3RydWN0b3IocHJvcHMgLyo6IERyYWdnYWJsZVByb3BzKi8pIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25EcmFnU3RhcnRcIiwgKGUsIGNvcmVEYXRhKSA9PiB7XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlOiBvbkRyYWdTdGFydDogJWonLCBjb3JlRGF0YSk7XG5cbiAgICAgIC8vIFNob3J0LWNpcmN1aXQgaWYgdXNlcidzIGNhbGxiYWNrIGtpbGxlZCBpdC5cbiAgICAgIGNvbnN0IHNob3VsZFN0YXJ0ID0gdGhpcy5wcm9wcy5vblN0YXJ0KGUsICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlRHJhZ2dhYmxlRGF0YSkodGhpcywgY29yZURhdGEpKTtcbiAgICAgIC8vIEtpbGxzIHN0YXJ0IGV2ZW50IG9uIGNvcmUgYXMgd2VsbCwgc28gbW92ZSBoYW5kbGVycyBhcmUgbmV2ZXIgYm91bmQuXG4gICAgICBpZiAoc2hvdWxkU3RhcnQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmc6IHRydWUsXG4gICAgICAgIGRyYWdnZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uRHJhZ1wiLCAoZSwgY29yZURhdGEpID0+IHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5kcmFnZ2luZykgcmV0dXJuIGZhbHNlO1xuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZTogb25EcmFnOiAlaicsIGNvcmVEYXRhKTtcbiAgICAgIGNvbnN0IHVpRGF0YSA9ICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlRHJhZ2dhYmxlRGF0YSkodGhpcywgY29yZURhdGEpO1xuICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgIHg6IHVpRGF0YS54LFxuICAgICAgICB5OiB1aURhdGEueSxcbiAgICAgICAgc2xhY2tYOiAwLFxuICAgICAgICBzbGFja1k6IDBcbiAgICAgIH07XG5cbiAgICAgIC8vIEtlZXAgd2l0aGluIGJvdW5kcy5cbiAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcykge1xuICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHggYW5kIHkuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSA9IG5ld1N0YXRlO1xuXG4gICAgICAgIC8vIEFkZCBzbGFjayB0byB0aGUgdmFsdWVzIHVzZWQgdG8gY2FsY3VsYXRlIGJvdW5kIHBvc2l0aW9uLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgaWZcbiAgICAgICAgLy8gd2Ugc3RhcnQgcmVtb3Zpbmcgc2xhY2ssIHRoZSBlbGVtZW50IHdvbid0IHJlYWN0IHRvIGl0IHJpZ2h0IGF3YXkgdW50aWwgaXQncyBiZWVuXG4gICAgICAgIC8vIGNvbXBsZXRlbHkgcmVtb3ZlZC5cbiAgICAgICAgbmV3U3RhdGUueCArPSB0aGlzLnN0YXRlLnNsYWNrWDtcbiAgICAgICAgbmV3U3RhdGUueSArPSB0aGlzLnN0YXRlLnNsYWNrWTtcblxuICAgICAgICAvLyBHZXQgYm91bmQgcG9zaXRpb24uIFRoaXMgd2lsbCBjZWlsL2Zsb29yIHRoZSB4IGFuZCB5IHdpdGhpbiB0aGUgYm91bmRhcmllcy5cbiAgICAgICAgY29uc3QgW25ld1N0YXRlWCwgbmV3U3RhdGVZXSA9ICgwLCBfcG9zaXRpb25GbnMuZ2V0Qm91bmRQb3NpdGlvbikodGhpcywgbmV3U3RhdGUueCwgbmV3U3RhdGUueSk7XG4gICAgICAgIG5ld1N0YXRlLnggPSBuZXdTdGF0ZVg7XG4gICAgICAgIG5ld1N0YXRlLnkgPSBuZXdTdGF0ZVk7XG5cbiAgICAgICAgLy8gUmVjYWxjdWxhdGUgc2xhY2sgYnkgbm90aW5nIGhvdyBtdWNoIHdhcyBzaGF2ZWQgYnkgdGhlIGJvdW5kUG9zaXRpb24gaGFuZGxlci5cbiAgICAgICAgbmV3U3RhdGUuc2xhY2tYID0gdGhpcy5zdGF0ZS5zbGFja1ggKyAoeCAtIG5ld1N0YXRlLngpO1xuICAgICAgICBuZXdTdGF0ZS5zbGFja1kgPSB0aGlzLnN0YXRlLnNsYWNrWSArICh5IC0gbmV3U3RhdGUueSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBldmVudCB3ZSBmaXJlIHRvIHJlZmxlY3Qgd2hhdCByZWFsbHkgaGFwcGVuZWQgYWZ0ZXIgYm91bmRzIHRvb2sgZWZmZWN0LlxuICAgICAgICB1aURhdGEueCA9IG5ld1N0YXRlLng7XG4gICAgICAgIHVpRGF0YS55ID0gbmV3U3RhdGUueTtcbiAgICAgICAgdWlEYXRhLmRlbHRhWCA9IG5ld1N0YXRlLnggLSB0aGlzLnN0YXRlLng7XG4gICAgICAgIHVpRGF0YS5kZWx0YVkgPSBuZXdTdGF0ZS55IC0gdGhpcy5zdGF0ZS55O1xuICAgICAgfVxuXG4gICAgICAvLyBTaG9ydC1jaXJjdWl0IGlmIHVzZXIncyBjYWxsYmFjayBraWxsZWQgaXQuXG4gICAgICBjb25zdCBzaG91bGRVcGRhdGUgPSB0aGlzLnByb3BzLm9uRHJhZyhlLCB1aURhdGEpO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uRHJhZ1N0b3BcIiwgKGUsIGNvcmVEYXRhKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc3RhdGUuZHJhZ2dpbmcpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gU2hvcnQtY2lyY3VpdCBpZiB1c2VyJ3MgY2FsbGJhY2sga2lsbGVkIGl0LlxuICAgICAgY29uc3Qgc2hvdWxkQ29udGludWUgPSB0aGlzLnByb3BzLm9uU3RvcChlLCAoMCwgX3Bvc2l0aW9uRm5zLmNyZWF0ZURyYWdnYWJsZURhdGEpKHRoaXMsIGNvcmVEYXRhKSk7XG4gICAgICBpZiAoc2hvdWxkQ29udGludWUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlOiBvbkRyYWdTdG9wOiAlaicsIGNvcmVEYXRhKTtcbiAgICAgIGNvbnN0IG5ld1N0YXRlIC8qOiBQYXJ0aWFsPERyYWdnYWJsZVN0YXRlPiovID0ge1xuICAgICAgICBkcmFnZ2luZzogZmFsc2UsXG4gICAgICAgIHNsYWNrWDogMCxcbiAgICAgICAgc2xhY2tZOiAwXG4gICAgICB9O1xuXG4gICAgICAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCBjb21wb25lbnQsIHRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24gd2lsbCBiZSB0b1xuICAgICAgLy8gcmV2ZXJ0IGJhY2sgdG8gdGhlIG9sZCBwb3NpdGlvbi4gV2UgZXhwZWN0IGEgaGFuZGxlciBvbiBgb25EcmFnU3RvcGAsIGF0IHRoZSBsZWFzdC5cbiAgICAgIGNvbnN0IGNvbnRyb2xsZWQgPSBCb29sZWFuKHRoaXMucHJvcHMucG9zaXRpb24pO1xuICAgICAgaWYgKGNvbnRyb2xsZWQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHgsXG4gICAgICAgICAgeVxuICAgICAgICB9ID0gdGhpcy5wcm9wcy5wb3NpdGlvbjtcbiAgICAgICAgbmV3U3RhdGUueCA9IHg7XG4gICAgICAgIG5ld1N0YXRlLnkgPSB5O1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBjdXJyZW50bHkgZHJhZ2dpbmcuXG4gICAgICBkcmFnZ2luZzogZmFsc2UsXG4gICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGJlZW4gZHJhZ2dlZCBiZWZvcmUuXG4gICAgICBkcmFnZ2VkOiBmYWxzZSxcbiAgICAgIC8vIEN1cnJlbnQgdHJhbnNmb3JtIHggYW5kIHkuXG4gICAgICB4OiBwcm9wcy5wb3NpdGlvbiA/IHByb3BzLnBvc2l0aW9uLnggOiBwcm9wcy5kZWZhdWx0UG9zaXRpb24ueCxcbiAgICAgIHk6IHByb3BzLnBvc2l0aW9uID8gcHJvcHMucG9zaXRpb24ueSA6IHByb3BzLmRlZmF1bHRQb3NpdGlvbi55LFxuICAgICAgcHJldlByb3BzUG9zaXRpb246IHtcbiAgICAgICAgLi4ucHJvcHMucG9zaXRpb25cbiAgICAgIH0sXG4gICAgICAvLyBVc2VkIGZvciBjb21wZW5zYXRpbmcgZm9yIG91dC1vZi1ib3VuZHMgZHJhZ3NcbiAgICAgIHNsYWNrWDogMCxcbiAgICAgIHNsYWNrWTogMCxcbiAgICAgIC8vIENhbiBvbmx5IGRldGVybWluZSBpZiBTVkcgYWZ0ZXIgbW91bnRpbmdcbiAgICAgIGlzRWxlbWVudFNWRzogZmFsc2VcbiAgICB9O1xuICAgIGlmIChwcm9wcy5wb3NpdGlvbiAmJiAhKHByb3BzLm9uRHJhZyB8fCBwcm9wcy5vblN0b3ApKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdBIGBwb3NpdGlvbmAgd2FzIGFwcGxpZWQgdG8gdGhpcyA8RHJhZ2dhYmxlPiwgd2l0aG91dCBkcmFnIGhhbmRsZXJzLiBUaGlzIHdpbGwgbWFrZSB0aGlzICcgKyAnY29tcG9uZW50IGVmZmVjdGl2ZWx5IHVuZHJhZ2dhYmxlLiBQbGVhc2UgYXR0YWNoIGBvbkRyYWdgIG9yIGBvblN0b3BgIGhhbmRsZXJzIHNvIHlvdSBjYW4gYWRqdXN0IHRoZSAnICsgJ2Bwb3NpdGlvbmAgb2YgdGhpcyBlbGVtZW50LicpO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGVsZW1lbnQgcGFzc2VkIGlzIGFuIGluc3RhbmNlb2YgU1ZHRWxlbWVudFxuICAgIGlmICh0eXBlb2Ygd2luZG93LlNWR0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZmluZERPTU5vZGUoKSBpbnN0YW5jZW9mIHdpbmRvdy5TVkdFbGVtZW50KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNFbGVtZW50U1ZHOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkcmFnZ2luZzogZmFsc2VcbiAgICB9KTsgLy8gcHJldmVudHMgaW52YXJpYW50IGlmIHVubW91bnRlZCB3aGlsZSBkcmFnZ2luZ1xuICB9XG5cbiAgLy8gUmVhY3QgU3RyaWN0IE1vZGUgY29tcGF0aWJpbGl0eTogaWYgYG5vZGVSZWZgIGlzIHBhc3NlZCwgd2Ugd2lsbCB1c2UgaXQgaW5zdGVhZCBvZiB0cnlpbmcgdG8gZmluZFxuICAvLyB0aGUgdW5kZXJseWluZyBET00gbm9kZSBvdXJzZWx2ZXMuIFNlZSB0aGUgUkVBRE1FIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICBmaW5kRE9NTm9kZSgpIC8qOiA/SFRNTEVsZW1lbnQqL3tcbiAgICB2YXIgX3RoaXMkcHJvcHMkbm9kZVJlZiRjLCBfdGhpcyRwcm9wcztcbiAgICByZXR1cm4gKF90aGlzJHByb3BzJG5vZGVSZWYkYyA9IChfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMpID09PSBudWxsIHx8IF90aGlzJHByb3BzID09PSB2b2lkIDAgfHwgKF90aGlzJHByb3BzID0gX3RoaXMkcHJvcHMubm9kZVJlZikgPT09IG51bGwgfHwgX3RoaXMkcHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHByb3BzLmN1cnJlbnQpICE9PSBudWxsICYmIF90aGlzJHByb3BzJG5vZGVSZWYkYyAhPT0gdm9pZCAwID8gX3RoaXMkcHJvcHMkbm9kZVJlZiRjIDogX3JlYWN0RG9tLmRlZmF1bHQuZmluZERPTU5vZGUodGhpcyk7XG4gIH1cbiAgcmVuZGVyKCkgLyo6IFJlYWN0RWxlbWVudDxhbnk+Ki97XG4gICAgY29uc3Qge1xuICAgICAgYXhpcyxcbiAgICAgIGJvdW5kcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgZGVmYXVsdFBvc2l0aW9uLFxuICAgICAgZGVmYXVsdENsYXNzTmFtZSxcbiAgICAgIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2luZyxcbiAgICAgIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2VkLFxuICAgICAgcG9zaXRpb24sXG4gICAgICBwb3NpdGlvbk9mZnNldCxcbiAgICAgIHNjYWxlLFxuICAgICAgLi4uZHJhZ2dhYmxlQ29yZVByb3BzXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHN0eWxlID0ge307XG4gICAgbGV0IHN2Z1RyYW5zZm9ybSA9IG51bGw7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGNvbnRyb2xsZWQsIHdlIGRvbid0IHdhbnQgdG8gbW92ZSBpdCAtIHVubGVzcyBpdCdzIGRyYWdnaW5nLlxuICAgIGNvbnN0IGNvbnRyb2xsZWQgPSBCb29sZWFuKHBvc2l0aW9uKTtcbiAgICBjb25zdCBkcmFnZ2FibGUgPSAhY29udHJvbGxlZCB8fCB0aGlzLnN0YXRlLmRyYWdnaW5nO1xuICAgIGNvbnN0IHZhbGlkUG9zaXRpb24gPSBwb3NpdGlvbiB8fCBkZWZhdWx0UG9zaXRpb247XG4gICAgY29uc3QgdHJhbnNmb3JtT3B0cyA9IHtcbiAgICAgIC8vIFNldCBsZWZ0IGlmIGhvcml6b250YWwgZHJhZyBpcyBlbmFibGVkXG4gICAgICB4OiAoMCwgX3Bvc2l0aW9uRm5zLmNhbkRyYWdYKSh0aGlzKSAmJiBkcmFnZ2FibGUgPyB0aGlzLnN0YXRlLnggOiB2YWxpZFBvc2l0aW9uLngsXG4gICAgICAvLyBTZXQgdG9wIGlmIHZlcnRpY2FsIGRyYWcgaXMgZW5hYmxlZFxuICAgICAgeTogKDAsIF9wb3NpdGlvbkZucy5jYW5EcmFnWSkodGhpcykgJiYgZHJhZ2dhYmxlID8gdGhpcy5zdGF0ZS55IDogdmFsaWRQb3NpdGlvbi55XG4gICAgfTtcblxuICAgIC8vIElmIHRoaXMgZWxlbWVudCB3YXMgU1ZHLCB3ZSB1c2UgdGhlIGB0cmFuc2Zvcm1gIGF0dHJpYnV0ZS5cbiAgICBpZiAodGhpcy5zdGF0ZS5pc0VsZW1lbnRTVkcpIHtcbiAgICAgIHN2Z1RyYW5zZm9ybSA9ICgwLCBfZG9tRm5zLmNyZWF0ZVNWR1RyYW5zZm9ybSkodHJhbnNmb3JtT3B0cywgcG9zaXRpb25PZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgYSBDU1MgdHJhbnNmb3JtIHRvIG1vdmUgdGhlIGVsZW1lbnQgYXJvdW5kLiBUaGlzIGFsbG93cyB1cyB0byBtb3ZlIHRoZSBlbGVtZW50IGFyb3VuZFxuICAgICAgLy8gd2l0aG91dCB3b3JyeWluZyBhYm91dCB3aGV0aGVyIG9yIG5vdCBpdCBpcyByZWxhdGl2ZWx5IG9yIGFic29sdXRlbHkgcG9zaXRpb25lZC5cbiAgICAgIC8vIElmIHRoZSBpdGVtIHlvdSBhcmUgZHJhZ2dpbmcgYWxyZWFkeSBoYXMgYSB0cmFuc2Zvcm0gc2V0LCB3cmFwIGl0IGluIGEgPHNwYW4+IHNvIDxEcmFnZ2FibGU+XG4gICAgICAvLyBoYXMgYSBjbGVhbiBzbGF0ZS5cbiAgICAgIHN0eWxlID0gKDAsIF9kb21GbnMuY3JlYXRlQ1NTVHJhbnNmb3JtKSh0cmFuc2Zvcm1PcHRzLCBwb3NpdGlvbk9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gTWFyayB3aXRoIGNsYXNzIHdoaWxlIGRyYWdnaW5nXG4gICAgY29uc3QgY2xhc3NOYW1lID0gKDAsIF9jbHN4LmRlZmF1bHQpKGNoaWxkcmVuLnByb3BzLmNsYXNzTmFtZSB8fCAnJywgZGVmYXVsdENsYXNzTmFtZSwge1xuICAgICAgW2RlZmF1bHRDbGFzc05hbWVEcmFnZ2luZ106IHRoaXMuc3RhdGUuZHJhZ2dpbmcsXG4gICAgICBbZGVmYXVsdENsYXNzTmFtZURyYWdnZWRdOiB0aGlzLnN0YXRlLmRyYWdnZWRcbiAgICB9KTtcblxuICAgIC8vIFJldXNlIHRoZSBjaGlsZCBwcm92aWRlZFxuICAgIC8vIFRoaXMgbWFrZXMgaXQgZmxleGlibGUgdG8gdXNlIHdoYXRldmVyIGVsZW1lbnQgaXMgd2FudGVkIChkaXYsIHVsLCBldGMpXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9EcmFnZ2FibGVDb3JlLmRlZmF1bHQsIF9leHRlbmRzKHt9LCBkcmFnZ2FibGVDb3JlUHJvcHMsIHtcbiAgICAgIG9uU3RhcnQ6IHRoaXMub25EcmFnU3RhcnQsXG4gICAgICBvbkRyYWc6IHRoaXMub25EcmFnLFxuICAgICAgb25TdG9wOiB0aGlzLm9uRHJhZ1N0b3BcbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKSwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBzdHlsZToge1xuICAgICAgICAuLi5jaGlsZHJlbi5wcm9wcy5zdHlsZSxcbiAgICAgICAgLi4uc3R5bGVcbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm06IHN2Z1RyYW5zZm9ybVxuICAgIH0pKTtcbiAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRHJhZ2dhYmxlO1xuX2RlZmluZVByb3BlcnR5KERyYWdnYWJsZSwgXCJkaXNwbGF5TmFtZVwiLCAnRHJhZ2dhYmxlJyk7XG5fZGVmaW5lUHJvcGVydHkoRHJhZ2dhYmxlLCBcInByb3BUeXBlc1wiLCB7XG4gIC8vIEFjY2VwdHMgYWxsIHByb3BzIDxEcmFnZ2FibGVDb3JlPiBhY2NlcHRzLlxuICAuLi5fRHJhZ2dhYmxlQ29yZS5kZWZhdWx0LnByb3BUeXBlcyxcbiAgLyoqXG4gICAqIGBheGlzYCBkZXRlcm1pbmVzIHdoaWNoIGF4aXMgdGhlIGRyYWdnYWJsZSBjYW4gbW92ZS5cbiAgICpcbiAgICogIE5vdGUgdGhhdCBhbGwgY2FsbGJhY2tzIHdpbGwgc3RpbGwgcmV0dXJuIGRhdGEgYXMgbm9ybWFsLiBUaGlzIG9ubHlcbiAgICogIGNvbnRyb2xzIGZsdXNoaW5nIHRvIHRoZSBET00uXG4gICAqXG4gICAqICdib3RoJyBhbGxvd3MgbW92ZW1lbnQgaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5LlxuICAgKiAneCcgbGltaXRzIG1vdmVtZW50IHRvIGhvcml6b250YWwgYXhpcy5cbiAgICogJ3knIGxpbWl0cyBtb3ZlbWVudCB0byB2ZXJ0aWNhbCBheGlzLlxuICAgKiAnbm9uZScgbGltaXRzIGFsbCBtb3ZlbWVudC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gJ2JvdGgnLlxuICAgKi9cbiAgYXhpczogX3Byb3BUeXBlcy5kZWZhdWx0Lm9uZU9mKFsnYm90aCcsICd4JywgJ3knLCAnbm9uZSddKSxcbiAgLyoqXG4gICAqIGBib3VuZHNgIGRldGVybWluZXMgdGhlIHJhbmdlIG9mIG1vdmVtZW50IGF2YWlsYWJsZSB0byB0aGUgZWxlbWVudC5cbiAgICogQXZhaWxhYmxlIHZhbHVlcyBhcmU6XG4gICAqXG4gICAqICdwYXJlbnQnIHJlc3RyaWN0cyBtb3ZlbWVudCB3aXRoaW4gdGhlIERyYWdnYWJsZSdzIHBhcmVudCBub2RlLlxuICAgKlxuICAgKiBBbHRlcm5hdGl2ZWx5LCBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcywgYWxsIG9mIHdoaWNoIGFyZSBvcHRpb25hbDpcbiAgICpcbiAgICoge2xlZnQ6IExFRlRfQk9VTkQsIHJpZ2h0OiBSSUdIVF9CT1VORCwgYm90dG9tOiBCT1RUT01fQk9VTkQsIHRvcDogVE9QX0JPVU5EfVxuICAgKlxuICAgKiBBbGwgdmFsdWVzIGFyZSBpbiBweC5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganN4XG4gICAqICAgbGV0IEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAqICAgICAgICAgcmV0dXJuIChcbiAgICogICAgICAgICAgICA8RHJhZ2dhYmxlIGJvdW5kcz17e3JpZ2h0OiAzMDAsIGJvdHRvbTogMzAwfX0+XG4gICAqICAgICAgICAgICAgICA8ZGl2PkNvbnRlbnQ8L2Rpdj5cbiAgICogICAgICAgICAgIDwvRHJhZ2dhYmxlPlxuICAgKiAgICAgICAgICk7XG4gICAqICAgICAgIH1cbiAgICogICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBib3VuZHM6IF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZlR5cGUoW19wcm9wVHlwZXMuZGVmYXVsdC5zaGFwZSh7XG4gICAgbGVmdDogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgICByaWdodDogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgICB0b3A6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG4gICAgYm90dG9tOiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyXG4gIH0pLCBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLCBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2YoW2ZhbHNlXSldKSxcbiAgZGVmYXVsdENsYXNzTmFtZTogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dlZDogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZyxcbiAgLyoqXG4gICAqIGBkZWZhdWx0UG9zaXRpb25gIHNwZWNpZmllcyB0aGUgeCBhbmQgeSB0aGF0IHRoZSBkcmFnZ2VkIGl0ZW0gc2hvdWxkIHN0YXJ0IGF0XG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiAgICAgIGxldCBBcHAgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgKiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICogICAgICAgICAgICAgICAgICA8RHJhZ2dhYmxlIGRlZmF1bHRQb3NpdGlvbj17e3g6IDI1LCB5OiAyNX19PlxuICAgKiAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pkkgc3RhcnQgd2l0aCB0cmFuc2Zvcm1YOiAyNXB4IGFuZCB0cmFuc2Zvcm1ZOiAyNXB4OzwvZGl2PlxuICAgKiAgICAgICAgICAgICAgICAgIDwvRHJhZ2dhYmxlPlxuICAgKiAgICAgICAgICAgICAgKTtcbiAgICogICAgICAgICAgfVxuICAgKiAgICAgIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGRlZmF1bHRQb3NpdGlvbjogX3Byb3BUeXBlcy5kZWZhdWx0LnNoYXBlKHtcbiAgICB4OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICAgIHk6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXJcbiAgfSksXG4gIHBvc2l0aW9uT2Zmc2V0OiBfcHJvcFR5cGVzLmRlZmF1bHQuc2hhcGUoe1xuICAgIHg6IF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZlR5cGUoW19wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsIF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmddKSxcbiAgICB5OiBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2ZUeXBlKFtfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLCBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nXSlcbiAgfSksXG4gIC8qKlxuICAgKiBgcG9zaXRpb25gLCBpZiBwcmVzZW50LCBkZWZpbmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiAgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBmb3JtIGVsZW1lbnRzIGluIFJlYWN0IHdvcmsgLSBpZiBubyBgcG9zaXRpb25gIGlzIHN1cHBsaWVkLCB0aGUgY29tcG9uZW50XG4gICAqICBpcyB1bmNvbnRyb2xsZWQuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiAgICAgIGxldCBBcHAgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgKiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICogICAgICAgICAgICAgICAgICA8RHJhZ2dhYmxlIHBvc2l0aW9uPXt7eDogMjUsIHk6IDI1fX0+XG4gICAqICAgICAgICAgICAgICAgICAgICAgIDxkaXY+SSBzdGFydCB3aXRoIHRyYW5zZm9ybVg6IDI1cHggYW5kIHRyYW5zZm9ybVk6IDI1cHg7PC9kaXY+XG4gICAqICAgICAgICAgICAgICAgICAgPC9EcmFnZ2FibGU+XG4gICAqICAgICAgICAgICAgICApO1xuICAgKiAgICAgICAgICB9XG4gICAqICAgICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcG9zaXRpb246IF9wcm9wVHlwZXMuZGVmYXVsdC5zaGFwZSh7XG4gICAgeDogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgICB5OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyXG4gIH0pLFxuICAvKipcbiAgICogVGhlc2UgcHJvcGVydGllcyBzaG91bGQgYmUgZGVmaW5lZCBvbiB0aGUgY2hpbGQsIG5vdCBoZXJlLlxuICAgKi9cbiAgY2xhc3NOYW1lOiBfc2hpbXMuZG9udFNldE1lLFxuICBzdHlsZTogX3NoaW1zLmRvbnRTZXRNZSxcbiAgdHJhbnNmb3JtOiBfc2hpbXMuZG9udFNldE1lXG59KTtcbl9kZWZpbmVQcm9wZXJ0eShEcmFnZ2FibGUsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgLi4uX0RyYWdnYWJsZUNvcmUuZGVmYXVsdC5kZWZhdWx0UHJvcHMsXG4gIGF4aXM6ICdib3RoJyxcbiAgYm91bmRzOiBmYWxzZSxcbiAgZGVmYXVsdENsYXNzTmFtZTogJ3JlYWN0LWRyYWdnYWJsZScsXG4gIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2luZzogJ3JlYWN0LWRyYWdnYWJsZS1kcmFnZ2luZycsXG4gIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2VkOiAncmVhY3QtZHJhZ2dhYmxlLWRyYWdnZWQnLFxuICBkZWZhdWx0UG9zaXRpb246IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfSxcbiAgc2NhbGU6IDFcbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfcHJvcFR5cGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSk7XG52YXIgX3JlYWN0RG9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3QtZG9tXCIpKTtcbnZhciBfZG9tRm5zID0gcmVxdWlyZShcIi4vdXRpbHMvZG9tRm5zXCIpO1xudmFyIF9wb3NpdGlvbkZucyA9IHJlcXVpcmUoXCIuL3V0aWxzL3Bvc2l0aW9uRm5zXCIpO1xudmFyIF9zaGltcyA9IHJlcXVpcmUoXCIuL3V0aWxzL3NoaW1zXCIpO1xudmFyIF9sb2cgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V0aWxzL2xvZ1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpOyByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChub2RlSW50ZXJvcCkgeyByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7IH0pKG5vZGVJbnRlcm9wKTsgfVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG4vKjo6IGltcG9ydCB0eXBlIHtFdmVudEhhbmRsZXIsIE1vdXNlVG91Y2hFdmVudH0gZnJvbSAnLi91dGlscy90eXBlcyc7Ki9cbi8qOjogaW1wb3J0IHR5cGUge0VsZW1lbnQgYXMgUmVhY3RFbGVtZW50fSBmcm9tICdyZWFjdCc7Ki9cbi8vIFNpbXBsZSBhYnN0cmFjdGlvbiBmb3IgZHJhZ2dpbmcgZXZlbnRzIG5hbWVzLlxuY29uc3QgZXZlbnRzRm9yID0ge1xuICB0b3VjaDoge1xuICAgIHN0YXJ0OiAndG91Y2hzdGFydCcsXG4gICAgbW92ZTogJ3RvdWNobW92ZScsXG4gICAgc3RvcDogJ3RvdWNoZW5kJ1xuICB9LFxuICBtb3VzZToge1xuICAgIHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgICBtb3ZlOiAnbW91c2Vtb3ZlJyxcbiAgICBzdG9wOiAnbW91c2V1cCdcbiAgfVxufTtcblxuLy8gRGVmYXVsdCB0byBtb3VzZSBldmVudHMuXG5sZXQgZHJhZ0V2ZW50Rm9yID0gZXZlbnRzRm9yLm1vdXNlO1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVEYXRhID0ge1xuICBub2RlOiBIVE1MRWxlbWVudCxcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsXG4gIGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcixcbiAgbGFzdFg6IG51bWJlciwgbGFzdFk6IG51bWJlcixcbn07Ki9cbi8qOjogZXhwb3J0IHR5cGUgRHJhZ2dhYmxlRXZlbnRIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQsIGRhdGE6IERyYWdnYWJsZURhdGEpID0+IHZvaWQgfCBmYWxzZTsqL1xuLyo6OiBleHBvcnQgdHlwZSBDb250cm9sUG9zaXRpb24gPSB7eDogbnVtYmVyLCB5OiBudW1iZXJ9OyovXG4vKjo6IGV4cG9ydCB0eXBlIFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uID0ge3g6IG51bWJlcnxzdHJpbmcsIHk6IG51bWJlcnxzdHJpbmd9OyovXG4vKjo6IGV4cG9ydCB0eXBlIERyYWdnYWJsZUNvcmVEZWZhdWx0UHJvcHMgPSB7XG4gIGFsbG93QW55Q2xpY2s6IGJvb2xlYW4sXG4gIGRpc2FibGVkOiBib29sZWFuLFxuICBlbmFibGVVc2VyU2VsZWN0SGFjazogYm9vbGVhbixcbiAgb25TdGFydDogRHJhZ2dhYmxlRXZlbnRIYW5kbGVyLFxuICBvbkRyYWc6IERyYWdnYWJsZUV2ZW50SGFuZGxlcixcbiAgb25TdG9wOiBEcmFnZ2FibGVFdmVudEhhbmRsZXIsXG4gIG9uTW91c2VEb3duOiAoZTogTW91c2VFdmVudCkgPT4gdm9pZCxcbiAgc2NhbGU6IG51bWJlcixcbn07Ki9cbi8qOjogZXhwb3J0IHR5cGUgRHJhZ2dhYmxlQ29yZVByb3BzID0ge1xuICAuLi5EcmFnZ2FibGVDb3JlRGVmYXVsdFByb3BzLFxuICBjYW5jZWw6IHN0cmluZyxcbiAgY2hpbGRyZW46IFJlYWN0RWxlbWVudDxhbnk+LFxuICBvZmZzZXRQYXJlbnQ6IEhUTUxFbGVtZW50LFxuICBncmlkOiBbbnVtYmVyLCBudW1iZXJdLFxuICBoYW5kbGU6IHN0cmluZyxcbiAgbm9kZVJlZj86ID9SZWFjdC5FbGVtZW50UmVmPGFueT4sXG59OyovXG4vL1xuLy8gRGVmaW5lIDxEcmFnZ2FibGVDb3JlPi5cbi8vXG4vLyA8RHJhZ2dhYmxlQ29yZT4gaXMgZm9yIGFkdmFuY2VkIHVzYWdlIG9mIDxEcmFnZ2FibGU+LiBJdCBtYWludGFpbnMgbWluaW1hbCBpbnRlcm5hbCBzdGF0ZSBzbyBpdCBjYW5cbi8vIHdvcmsgd2VsbCB3aXRoIGxpYnJhcmllcyB0aGF0IHJlcXVpcmUgbW9yZSBjb250cm9sIG92ZXIgdGhlIGVsZW1lbnQuXG4vL1xuXG5jbGFzcyBEcmFnZ2FibGVDb3JlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IC8qOjogPERyYWdnYWJsZUNvcmVQcm9wcz4qL3tcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJkcmFnZ2luZ1wiLCBmYWxzZSk7XG4gICAgLy8gVXNlZCB3aGlsZSBkcmFnZ2luZyB0byBkZXRlcm1pbmUgZGVsdGFzLlxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImxhc3RYXCIsIE5hTik7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibGFzdFlcIiwgTmFOKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0b3VjaElkZW50aWZpZXJcIiwgbnVsbCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibW91bnRlZFwiLCBmYWxzZSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGFuZGxlRHJhZ1N0YXJ0XCIsIGUgPT4ge1xuICAgICAgLy8gTWFrZSBpdCBwb3NzaWJsZSB0byBhdHRhY2ggZXZlbnQgaGFuZGxlcnMgb24gdG9wIG9mIHRoaXMgb25lLlxuICAgICAgdGhpcy5wcm9wcy5vbk1vdXNlRG93bihlKTtcblxuICAgICAgLy8gT25seSBhY2NlcHQgbGVmdC1jbGlja3MuXG4gICAgICBpZiAoIXRoaXMucHJvcHMuYWxsb3dBbnlDbGljayAmJiB0eXBlb2YgZS5idXR0b24gPT09ICdudW1iZXInICYmIGUuYnV0dG9uICE9PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEdldCBub2Rlcy4gQmUgc3VyZSB0byBncmFiIHJlbGF0aXZlIGRvY3VtZW50IChjb3VsZCBiZSBpZnJhbWVkKVxuICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLmZpbmRET01Ob2RlKCk7XG4gICAgICBpZiAoIXRoaXNOb2RlIHx8ICF0aGlzTm9kZS5vd25lckRvY3VtZW50IHx8ICF0aGlzTm9kZS5vd25lckRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCc8RHJhZ2dhYmxlQ29yZT4gbm90IG1vdW50ZWQgb24gRHJhZ1N0YXJ0IScpO1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBvd25lckRvY3VtZW50XG4gICAgICB9ID0gdGhpc05vZGU7XG5cbiAgICAgIC8vIFNob3J0IGNpcmN1aXQgaWYgaGFuZGxlIG9yIGNhbmNlbCBwcm9wIHdhcyBwcm92aWRlZCBhbmQgc2VsZWN0b3IgZG9lc24ndCBtYXRjaC5cbiAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkIHx8ICEoZS50YXJnZXQgaW5zdGFuY2VvZiBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lk5vZGUpIHx8IHRoaXMucHJvcHMuaGFuZGxlICYmICEoMCwgX2RvbUZucy5tYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG8pKGUudGFyZ2V0LCB0aGlzLnByb3BzLmhhbmRsZSwgdGhpc05vZGUpIHx8IHRoaXMucHJvcHMuY2FuY2VsICYmICgwLCBfZG9tRm5zLm1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbykoZS50YXJnZXQsIHRoaXMucHJvcHMuY2FuY2VsLCB0aGlzTm9kZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmV2ZW50IHNjcm9sbGluZyBvbiBtb2JpbGUgZGV2aWNlcywgbGlrZSBpcGFkL2lwaG9uZS5cbiAgICAgIC8vIEltcG9ydGFudCB0aGF0IHRoaXMgaXMgYWZ0ZXIgaGFuZGxlL2NhbmNlbC5cbiAgICAgIGlmIChlLnR5cGUgPT09ICd0b3VjaHN0YXJ0JykgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAvLyBTZXQgdG91Y2ggaWRlbnRpZmllciBpbiBjb21wb25lbnQgc3RhdGUgaWYgdGhpcyBpcyBhIHRvdWNoIGV2ZW50LiBUaGlzIGFsbG93cyB1cyB0b1xuICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBpbmRpdmlkdWFsIHRvdWNoZXMgb24gbXVsdGl0b3VjaCBzY3JlZW5zIGJ5IGlkZW50aWZ5aW5nIHdoaWNoXG4gICAgICAvLyB0b3VjaHBvaW50IHdhcyBzZXQgdG8gdGhpcyBlbGVtZW50LlxuICAgICAgY29uc3QgdG91Y2hJZGVudGlmaWVyID0gKDAsIF9kb21GbnMuZ2V0VG91Y2hJZGVudGlmaWVyKShlKTtcbiAgICAgIHRoaXMudG91Y2hJZGVudGlmaWVyID0gdG91Y2hJZGVudGlmaWVyO1xuXG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgZHJhZyBwb2ludCBmcm9tIHRoZSBldmVudC4gVGhpcyBpcyB1c2VkIGFzIHRoZSBvZmZzZXQuXG4gICAgICBjb25zdCBwb3NpdGlvbiA9ICgwLCBfcG9zaXRpb25GbnMuZ2V0Q29udHJvbFBvc2l0aW9uKShlLCB0b3VjaElkZW50aWZpZXIsIHRoaXMpO1xuICAgICAgaWYgKHBvc2l0aW9uID09IG51bGwpIHJldHVybjsgLy8gbm90IHBvc3NpYmxlIGJ1dCBzYXRpc2ZpZXMgZmxvd1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gcG9zaXRpb247XG5cbiAgICAgIC8vIENyZWF0ZSBhbiBldmVudCBvYmplY3Qgd2l0aCBhbGwgdGhlIGRhdGEgcGFyZW50cyBuZWVkIHRvIG1ha2UgYSBkZWNpc2lvbiBoZXJlLlxuICAgICAgY29uc3QgY29yZUV2ZW50ID0gKDAsIF9wb3NpdGlvbkZucy5jcmVhdGVDb3JlRGF0YSkodGhpcywgeCwgeSk7XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlQ29yZTogaGFuZGxlRHJhZ1N0YXJ0OiAlaicsIGNvcmVFdmVudCk7XG5cbiAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlci4gSWYgaXQgcmV0dXJucyBleHBsaWNpdCBmYWxzZSwgY2FuY2VsLlxuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ2NhbGxpbmcnLCB0aGlzLnByb3BzLm9uU3RhcnQpO1xuICAgICAgY29uc3Qgc2hvdWxkVXBkYXRlID0gdGhpcy5wcm9wcy5vblN0YXJ0KGUsIGNvcmVFdmVudCk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSBmYWxzZSB8fCB0aGlzLm1vdW50ZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIC8vIEFkZCBhIHN0eWxlIHRvIHRoZSBib2R5IHRvIGRpc2FibGUgdXNlci1zZWxlY3QuIFRoaXMgcHJldmVudHMgdGV4dCBmcm9tXG4gICAgICAvLyBiZWluZyBzZWxlY3RlZCBhbGwgb3ZlciB0aGUgcGFnZS5cbiAgICAgIGlmICh0aGlzLnByb3BzLmVuYWJsZVVzZXJTZWxlY3RIYWNrKSAoMCwgX2RvbUZucy5hZGRVc2VyU2VsZWN0U3R5bGVzKShvd25lckRvY3VtZW50KTtcblxuICAgICAgLy8gSW5pdGlhdGUgZHJhZ2dpbmcuIFNldCB0aGUgY3VycmVudCB4IGFuZCB5IGFzIG9mZnNldHNcbiAgICAgIC8vIHNvIHdlIGtub3cgaG93IG11Y2ggd2UndmUgbW92ZWQgZHVyaW5nIHRoZSBkcmFnLiBUaGlzIGFsbG93cyB1c1xuICAgICAgLy8gdG8gZHJhZyBlbGVtZW50cyBhcm91bmQgZXZlbiBpZiB0aGV5IGhhdmUgYmVlbiBtb3ZlZCwgd2l0aG91dCBpc3N1ZS5cbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5sYXN0WCA9IHg7XG4gICAgICB0aGlzLmxhc3RZID0geTtcblxuICAgICAgLy8gQWRkIGV2ZW50cyB0byB0aGUgZG9jdW1lbnQgZGlyZWN0bHkgc28gd2UgY2F0Y2ggd2hlbiB0aGUgdXNlcidzIG1vdXNlL3RvdWNoIG1vdmVzIG91dHNpZGUgb2ZcbiAgICAgIC8vIHRoaXMgZWxlbWVudC4gV2UgdXNlIGRpZmZlcmVudCBldmVudHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHdlIGhhdmUgZGV0ZWN0ZWQgdGhhdCB0aGlzXG4gICAgICAvLyBpcyBhIHRvdWNoLWNhcGFibGUgZGV2aWNlLlxuICAgICAgKDAsIF9kb21GbnMuYWRkRXZlbnQpKG93bmVyRG9jdW1lbnQsIGRyYWdFdmVudEZvci5tb3ZlLCB0aGlzLmhhbmRsZURyYWcpO1xuICAgICAgKDAsIF9kb21GbnMuYWRkRXZlbnQpKG93bmVyRG9jdW1lbnQsIGRyYWdFdmVudEZvci5zdG9wLCB0aGlzLmhhbmRsZURyYWdTdG9wKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJoYW5kbGVEcmFnXCIsIGUgPT4ge1xuICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGRyYWcgcG9pbnQgZnJvbSB0aGUgZXZlbnQuIFRoaXMgaXMgdXNlZCBhcyB0aGUgb2Zmc2V0LlxuICAgICAgY29uc3QgcG9zaXRpb24gPSAoMCwgX3Bvc2l0aW9uRm5zLmdldENvbnRyb2xQb3NpdGlvbikoZSwgdGhpcy50b3VjaElkZW50aWZpZXIsIHRoaXMpO1xuICAgICAgaWYgKHBvc2l0aW9uID09IG51bGwpIHJldHVybjtcbiAgICAgIGxldCB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBwb3NpdGlvbjtcblxuICAgICAgLy8gU25hcCB0byBncmlkIGlmIHByb3AgaGFzIGJlZW4gcHJvdmlkZWRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucHJvcHMuZ3JpZCkpIHtcbiAgICAgICAgbGV0IGRlbHRhWCA9IHggLSB0aGlzLmxhc3RYLFxuICAgICAgICAgIGRlbHRhWSA9IHkgLSB0aGlzLmxhc3RZO1xuICAgICAgICBbZGVsdGFYLCBkZWx0YVldID0gKDAsIF9wb3NpdGlvbkZucy5zbmFwVG9HcmlkKSh0aGlzLnByb3BzLmdyaWQsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgaWYgKCFkZWx0YVggJiYgIWRlbHRhWSkgcmV0dXJuOyAvLyBza2lwIHVzZWxlc3MgZHJhZ1xuICAgICAgICB4ID0gdGhpcy5sYXN0WCArIGRlbHRhWCwgeSA9IHRoaXMubGFzdFkgKyBkZWx0YVk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb3JlRXZlbnQgPSAoMCwgX3Bvc2l0aW9uRm5zLmNyZWF0ZUNvcmVEYXRhKSh0aGlzLCB4LCB5KTtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGVDb3JlOiBoYW5kbGVEcmFnOiAlaicsIGNvcmVFdmVudCk7XG5cbiAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlci4gSWYgaXQgcmV0dXJucyBleHBsaWNpdCBmYWxzZSwgdHJpZ2dlciBlbmQuXG4gICAgICBjb25zdCBzaG91bGRVcGRhdGUgPSB0aGlzLnByb3BzLm9uRHJhZyhlLCBjb3JlRXZlbnQpO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gZmFsc2UgfHwgdGhpcy5tb3VudGVkID09PSBmYWxzZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vICRGbG93SWdub3JlXG4gICAgICAgICAgdGhpcy5oYW5kbGVEcmFnU3RvcChuZXcgTW91c2VFdmVudCgnbW91c2V1cCcpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gT2xkIGJyb3dzZXJzXG4gICAgICAgICAgY29uc3QgZXZlbnQgPSAoKGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpIC8qOiBhbnkqLykgLyo6IE1vdXNlVG91Y2hFdmVudCovKTtcbiAgICAgICAgICAvLyBJIHNlZSB3aHkgdGhpcyBpbnNhbml0eSB3YXMgZGVwcmVjYXRlZFxuICAgICAgICAgIC8vICRGbG93SWdub3JlXG4gICAgICAgICAgZXZlbnQuaW5pdE1vdXNlRXZlbnQoJ21vdXNldXAnLCB0cnVlLCB0cnVlLCB3aW5kb3csIDAsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZURyYWdTdG9wKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RYID0geDtcbiAgICAgIHRoaXMubGFzdFkgPSB5O1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImhhbmRsZURyYWdTdG9wXCIsIGUgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgICBjb25zdCBwb3NpdGlvbiA9ICgwLCBfcG9zaXRpb25GbnMuZ2V0Q29udHJvbFBvc2l0aW9uKShlLCB0aGlzLnRvdWNoSWRlbnRpZmllciwgdGhpcyk7XG4gICAgICBpZiAocG9zaXRpb24gPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgbGV0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHBvc2l0aW9uO1xuXG4gICAgICAvLyBTbmFwIHRvIGdyaWQgaWYgcHJvcCBoYXMgYmVlbiBwcm92aWRlZFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wcm9wcy5ncmlkKSkge1xuICAgICAgICBsZXQgZGVsdGFYID0geCAtIHRoaXMubGFzdFggfHwgMDtcbiAgICAgICAgbGV0IGRlbHRhWSA9IHkgLSB0aGlzLmxhc3RZIHx8IDA7XG4gICAgICAgIFtkZWx0YVgsIGRlbHRhWV0gPSAoMCwgX3Bvc2l0aW9uRm5zLnNuYXBUb0dyaWQpKHRoaXMucHJvcHMuZ3JpZCwgZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICB4ID0gdGhpcy5sYXN0WCArIGRlbHRhWCwgeSA9IHRoaXMubGFzdFkgKyBkZWx0YVk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb3JlRXZlbnQgPSAoMCwgX3Bvc2l0aW9uRm5zLmNyZWF0ZUNvcmVEYXRhKSh0aGlzLCB4LCB5KTtcblxuICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyXG4gICAgICBjb25zdCBzaG91bGRDb250aW51ZSA9IHRoaXMucHJvcHMub25TdG9wKGUsIGNvcmVFdmVudCk7XG4gICAgICBpZiAoc2hvdWxkQ29udGludWUgPT09IGZhbHNlIHx8IHRoaXMubW91bnRlZCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHRoaXNOb2RlID0gdGhpcy5maW5kRE9NTm9kZSgpO1xuICAgICAgaWYgKHRoaXNOb2RlKSB7XG4gICAgICAgIC8vIFJlbW92ZSB1c2VyLXNlbGVjdCBoYWNrXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmVuYWJsZVVzZXJTZWxlY3RIYWNrKSAoMCwgX2RvbUZucy5yZW1vdmVVc2VyU2VsZWN0U3R5bGVzKSh0aGlzTm9kZS5vd25lckRvY3VtZW50KTtcbiAgICAgIH1cbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGVDb3JlOiBoYW5kbGVEcmFnU3RvcDogJWonLCBjb3JlRXZlbnQpO1xuXG4gICAgICAvLyBSZXNldCB0aGUgZWwuXG4gICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RYID0gTmFOO1xuICAgICAgdGhpcy5sYXN0WSA9IE5hTjtcbiAgICAgIGlmICh0aGlzTm9kZSkge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZUNvcmU6IFJlbW92aW5nIGhhbmRsZXJzJyk7XG4gICAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KSh0aGlzTm9kZS5vd25lckRvY3VtZW50LCBkcmFnRXZlbnRGb3IubW92ZSwgdGhpcy5oYW5kbGVEcmFnKTtcbiAgICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKHRoaXNOb2RlLm93bmVyRG9jdW1lbnQsIGRyYWdFdmVudEZvci5zdG9wLCB0aGlzLmhhbmRsZURyYWdTdG9wKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvbk1vdXNlRG93blwiLCBlID0+IHtcbiAgICAgIGRyYWdFdmVudEZvciA9IGV2ZW50c0Zvci5tb3VzZTsgLy8gb24gdG91Y2hzY3JlZW4gbGFwdG9wcyB3ZSBjb3VsZCBzd2l0Y2ggYmFjayB0byBtb3VzZVxuXG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVEcmFnU3RhcnQoZSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25Nb3VzZVVwXCIsIGUgPT4ge1xuICAgICAgZHJhZ0V2ZW50Rm9yID0gZXZlbnRzRm9yLm1vdXNlO1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRHJhZ1N0b3AoZSk7XG4gICAgfSk7XG4gICAgLy8gU2FtZSBhcyBvbk1vdXNlRG93biAoc3RhcnQgZHJhZyksIGJ1dCBub3cgY29uc2lkZXIgdGhpcyBhIHRvdWNoIGRldmljZS5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvblRvdWNoU3RhcnRcIiwgZSA9PiB7XG4gICAgICAvLyBXZSdyZSBvbiBhIHRvdWNoIGRldmljZSBub3csIHNvIGNoYW5nZSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgIGRyYWdFdmVudEZvciA9IGV2ZW50c0Zvci50b3VjaDtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZURyYWdTdGFydChlKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvblRvdWNoRW5kXCIsIGUgPT4ge1xuICAgICAgLy8gV2UncmUgb24gYSB0b3VjaCBkZXZpY2Ugbm93LCBzbyBjaGFuZ2UgdGhlIGV2ZW50IGhhbmRsZXJzXG4gICAgICBkcmFnRXZlbnRGb3IgPSBldmVudHNGb3IudG91Y2g7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVEcmFnU3RvcChlKTtcbiAgICB9KTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgIC8vIFRvdWNoIGhhbmRsZXJzIG11c3QgYmUgYWRkZWQgd2l0aCB7cGFzc2l2ZTogZmFsc2V9IHRvIGJlIGNhbmNlbGFibGUuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wMS9zY3JvbGxpbmctaW50ZXJ2ZW50aW9uXG4gICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLmZpbmRET01Ob2RlKCk7XG4gICAgaWYgKHRoaXNOb2RlKSB7XG4gICAgICAoMCwgX2RvbUZucy5hZGRFdmVudCkodGhpc05vZGUsIGV2ZW50c0Zvci50b3VjaC5zdGFydCwgdGhpcy5vblRvdWNoU3RhcnQsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICAvLyBSZW1vdmUgYW55IGxlZnRvdmVyIGV2ZW50IGhhbmRsZXJzLiBSZW1vdmUgYm90aCB0b3VjaCBhbmQgbW91c2UgaGFuZGxlcnMgaW4gY2FzZVxuICAgIC8vIHNvbWUgYnJvd3NlciBxdWlyayBjYXVzZWQgYSB0b3VjaCBldmVudCB0byBmaXJlIGR1cmluZyBhIG1vdXNlIG1vdmUsIG9yIHZpY2UgdmVyc2EuXG4gICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLmZpbmRET01Ob2RlKCk7XG4gICAgaWYgKHRoaXNOb2RlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG93bmVyRG9jdW1lbnRcbiAgICAgIH0gPSB0aGlzTm9kZTtcbiAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KShvd25lckRvY3VtZW50LCBldmVudHNGb3IubW91c2UubW92ZSwgdGhpcy5oYW5kbGVEcmFnKTtcbiAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KShvd25lckRvY3VtZW50LCBldmVudHNGb3IudG91Y2gubW92ZSwgdGhpcy5oYW5kbGVEcmFnKTtcbiAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KShvd25lckRvY3VtZW50LCBldmVudHNGb3IubW91c2Uuc3RvcCwgdGhpcy5oYW5kbGVEcmFnU3RvcCk7XG4gICAgICAoMCwgX2RvbUZucy5yZW1vdmVFdmVudCkob3duZXJEb2N1bWVudCwgZXZlbnRzRm9yLnRvdWNoLnN0b3AsIHRoaXMuaGFuZGxlRHJhZ1N0b3ApO1xuICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKHRoaXNOb2RlLCBldmVudHNGb3IudG91Y2guc3RhcnQsIHRoaXMub25Ub3VjaFN0YXJ0LCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLnByb3BzLmVuYWJsZVVzZXJTZWxlY3RIYWNrKSAoMCwgX2RvbUZucy5yZW1vdmVVc2VyU2VsZWN0U3R5bGVzKShvd25lckRvY3VtZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWFjdCBTdHJpY3QgTW9kZSBjb21wYXRpYmlsaXR5OiBpZiBgbm9kZVJlZmAgaXMgcGFzc2VkLCB3ZSB3aWxsIHVzZSBpdCBpbnN0ZWFkIG9mIHRyeWluZyB0byBmaW5kXG4gIC8vIHRoZSB1bmRlcmx5aW5nIERPTSBub2RlIG91cnNlbHZlcy4gU2VlIHRoZSBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gIGZpbmRET01Ob2RlKCkgLyo6ID9IVE1MRWxlbWVudCove1xuICAgIHZhciBfdGhpcyRwcm9wcywgX3RoaXMkcHJvcHMyO1xuICAgIHJldHVybiAoX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzKSAhPT0gbnVsbCAmJiBfdGhpcyRwcm9wcyAhPT0gdm9pZCAwICYmIF90aGlzJHByb3BzLm5vZGVSZWYgPyAoX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcykgPT09IG51bGwgfHwgX3RoaXMkcHJvcHMyID09PSB2b2lkIDAgfHwgKF90aGlzJHByb3BzMiA9IF90aGlzJHByb3BzMi5ub2RlUmVmKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wczIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHByb3BzMi5jdXJyZW50IDogX3JlYWN0RG9tLmRlZmF1bHQuZmluZERPTU5vZGUodGhpcyk7XG4gIH1cbiAgcmVuZGVyKCkgLyo6IFJlYWN0LkVsZW1lbnQ8YW55Piove1xuICAgIC8vIFJldXNlIHRoZSBjaGlsZCBwcm92aWRlZFxuICAgIC8vIFRoaXMgbWFrZXMgaXQgZmxleGlibGUgdG8gdXNlIHdoYXRldmVyIGVsZW1lbnQgaXMgd2FudGVkIChkaXYsIHVsLCBldGMpXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoUmVhY3QuQ2hpbGRyZW4ub25seSh0aGlzLnByb3BzLmNoaWxkcmVuKSwge1xuICAgICAgLy8gTm90ZTogbW91c2VNb3ZlIGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgc28gaXQgd2lsbCBzdGlsbCBmdW5jdGlvblxuICAgICAgLy8gd2hlbiB0aGUgdXNlciBkcmFncyBxdWlja2x5IGFuZCBsZWF2ZXMgdGhlIGJvdW5kcyBvZiB0aGUgZWxlbWVudC5cbiAgICAgIG9uTW91c2VEb3duOiB0aGlzLm9uTW91c2VEb3duLFxuICAgICAgb25Nb3VzZVVwOiB0aGlzLm9uTW91c2VVcCxcbiAgICAgIC8vIG9uVG91Y2hTdGFydCBpcyBhZGRlZCBvbiBgY29tcG9uZW50RGlkTW91bnRgIHNvIHRoZXkgY2FuIGJlIGFkZGVkIHdpdGhcbiAgICAgIC8vIHtwYXNzaXZlOiBmYWxzZX0sIHdoaWNoIGFsbG93cyBpdCB0byBjYW5jZWwuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wMS9zY3JvbGxpbmctaW50ZXJ2ZW50aW9uXG4gICAgICBvblRvdWNoRW5kOiB0aGlzLm9uVG91Y2hFbmRcbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRHJhZ2dhYmxlQ29yZTtcbl9kZWZpbmVQcm9wZXJ0eShEcmFnZ2FibGVDb3JlLCBcImRpc3BsYXlOYW1lXCIsICdEcmFnZ2FibGVDb3JlJyk7XG5fZGVmaW5lUHJvcGVydHkoRHJhZ2dhYmxlQ29yZSwgXCJwcm9wVHlwZXNcIiwge1xuICAvKipcbiAgICogYGFsbG93QW55Q2xpY2tgIGFsbG93cyBkcmFnZ2luZyB1c2luZyBhbnkgbW91c2UgYnV0dG9uLlxuICAgKiBCeSBkZWZhdWx0LCB3ZSBvbmx5IGFjY2VwdCB0aGUgbGVmdCBidXR0b24uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBhbGxvd0FueUNsaWNrOiBfcHJvcFR5cGVzLmRlZmF1bHQuYm9vbCxcbiAgY2hpbGRyZW46IF9wcm9wVHlwZXMuZGVmYXVsdC5ub2RlLmlzUmVxdWlyZWQsXG4gIC8qKlxuICAgKiBgZGlzYWJsZWRgLCBpZiB0cnVlLCBzdG9wcyB0aGUgPERyYWdnYWJsZT4gZnJvbSBkcmFnZ2luZy4gQWxsIGhhbmRsZXJzLFxuICAgKiB3aXRoIHRoZSBleGNlcHRpb24gb2YgYG9uTW91c2VEb3duYCwgd2lsbCBub3QgZmlyZS5cbiAgICovXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzLmRlZmF1bHQuYm9vbCxcbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHdlIGFkZCAndXNlci1zZWxlY3Q6bm9uZScgYXR0cmlidXRlcyB0byB0aGUgZG9jdW1lbnQgYm9keVxuICAgKiB0byBwcmV2ZW50IHVnbHkgdGV4dCBzZWxlY3Rpb24gZHVyaW5nIGRyYWcuIElmIHRoaXMgaXMgY2F1c2luZyBwcm9ibGVtc1xuICAgKiBmb3IgeW91ciBhcHAsIHNldCB0aGlzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBlbmFibGVVc2VyU2VsZWN0SGFjazogX3Byb3BUeXBlcy5kZWZhdWx0LmJvb2wsXG4gIC8qKlxuICAgKiBgb2Zmc2V0UGFyZW50YCwgaWYgc2V0LCB1c2VzIHRoZSBwYXNzZWQgRE9NIG5vZGUgdG8gY29tcHV0ZSBkcmFnIG9mZnNldHNcbiAgICogaW5zdGVhZCBvZiB1c2luZyB0aGUgcGFyZW50IG5vZGUuXG4gICAqL1xuICBvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uIChwcm9wcyAvKjogRHJhZ2dhYmxlQ29yZVByb3BzKi8sIHByb3BOYW1lIC8qOiAkS2V5czxEcmFnZ2FibGVDb3JlUHJvcHM+Ki8pIHtcbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdICYmIHByb3BzW3Byb3BOYW1lXS5ub2RlVHlwZSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEcmFnZ2FibGVcXCdzIG9mZnNldFBhcmVudCBtdXN0IGJlIGEgRE9NIE5vZGUuJyk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogYGdyaWRgIHNwZWNpZmllcyB0aGUgeCBhbmQgeSB0aGF0IGRyYWdnaW5nIHNob3VsZCBzbmFwIHRvLlxuICAgKi9cbiAgZ3JpZDogX3Byb3BUeXBlcy5kZWZhdWx0LmFycmF5T2YoX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlciksXG4gIC8qKlxuICAgKiBgaGFuZGxlYCBzcGVjaWZpZXMgYSBzZWxlY3RvciB0byBiZSB1c2VkIGFzIHRoZSBoYW5kbGUgdGhhdCBpbml0aWF0ZXMgZHJhZy5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganN4XG4gICAqICAgbGV0IEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAqICAgICAgICAgcmV0dXJuIChcbiAgICogICAgICAgICAgICA8RHJhZ2dhYmxlIGhhbmRsZT1cIi5oYW5kbGVcIj5cbiAgICogICAgICAgICAgICAgIDxkaXY+XG4gICAqICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoYW5kbGVcIj5DbGljayBtZSB0byBkcmFnPC9kaXY+XG4gICAqICAgICAgICAgICAgICAgICAgPGRpdj5UaGlzIGlzIHNvbWUgb3RoZXIgY29udGVudDwvZGl2PlxuICAgKiAgICAgICAgICAgICAgPC9kaXY+XG4gICAqICAgICAgICAgICA8L0RyYWdnYWJsZT5cbiAgICogICAgICAgICApO1xuICAgKiAgICAgICB9XG4gICAqICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgaGFuZGxlOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICAvKipcbiAgICogYGNhbmNlbGAgc3BlY2lmaWVzIGEgc2VsZWN0b3IgdG8gYmUgdXNlZCB0byBwcmV2ZW50IGRyYWcgaW5pdGlhbGl6YXRpb24uXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiAgIGxldCBBcHAgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgKiAgICAgICAgICAgcmV0dXJuKFxuICAgKiAgICAgICAgICAgICAgIDxEcmFnZ2FibGUgY2FuY2VsPVwiLmNhbmNlbFwiPlxuICAgKiAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgKiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2FuY2VsXCI+WW91IGNhbid0IGRyYWcgZnJvbSBoZXJlPC9kaXY+XG4gICAqICAgICAgICAgICAgICAgICAgICAgPGRpdj5EcmFnZ2luZyBoZXJlIHdvcmtzIGZpbmU8L2Rpdj5cbiAgICogICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAqICAgICAgICAgICAgICAgPC9EcmFnZ2FibGU+XG4gICAqICAgICAgICAgICApO1xuICAgKiAgICAgICB9XG4gICAqICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgY2FuY2VsOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICAvKiBJZiBydW5uaW5nIGluIFJlYWN0IFN0cmljdCBtb2RlLCBSZWFjdERPTS5maW5kRE9NTm9kZSgpIGlzIGRlcHJlY2F0ZWQuXG4gICAqIFVuZm9ydHVuYXRlbHksIGluIG9yZGVyIGZvciA8RHJhZ2dhYmxlPiB0byB3b3JrIHByb3Blcmx5LCB3ZSBuZWVkIHJhdyBhY2Nlc3NcbiAgICogdG8gdGhlIHVuZGVybHlpbmcgRE9NIG5vZGUuIElmIHlvdSB3YW50IHRvIGF2b2lkIHRoZSB3YXJuaW5nLCBwYXNzIGEgYG5vZGVSZWZgXG4gICAqIGFzIGluIHRoaXMgZXhhbXBsZTpcbiAgICpcbiAgICogZnVuY3Rpb24gTXlDb21wb25lbnQoKSB7XG4gICAqICAgY29uc3Qgbm9kZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICogICByZXR1cm4gKFxuICAgKiAgICAgPERyYWdnYWJsZSBub2RlUmVmPXtub2RlUmVmfT5cbiAgICogICAgICAgPGRpdiByZWY9e25vZGVSZWZ9PkV4YW1wbGUgVGFyZ2V0PC9kaXY+XG4gICAqICAgICA8L0RyYWdnYWJsZT5cbiAgICogICApO1xuICAgKiB9XG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFyYml0cmFyaWx5IG5lc3RlZCBjb21wb25lbnRzLCBzbyBsb25nIGFzIHRoZSByZWYgZW5kcyB1cFxuICAgKiBwb2ludGluZyB0byB0aGUgYWN0dWFsIGNoaWxkIERPTSBub2RlIGFuZCBub3QgYSBjdXN0b20gY29tcG9uZW50LlxuICAgKi9cbiAgbm9kZVJlZjogX3Byb3BUeXBlcy5kZWZhdWx0Lm9iamVjdCxcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGRyYWdnaW5nIHN0YXJ0cy5cbiAgICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBib29sZWFuIGZhbHNlLCBkcmFnZ2luZyB3aWxsIGJlIGNhbmNlbGVkLlxuICAgKi9cbiAgb25TdGFydDogX3Byb3BUeXBlcy5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hpbGUgZHJhZ2dpbmcuXG4gICAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYm9vbGVhbiBmYWxzZSwgZHJhZ2dpbmcgd2lsbCBiZSBjYW5jZWxlZC5cbiAgICovXG4gIG9uRHJhZzogX3Byb3BUeXBlcy5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBkcmFnZ2luZyBzdG9wcy5cbiAgICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBib29sZWFuIGZhbHNlLCB0aGUgZHJhZyB3aWxsIHJlbWFpbiBhY3RpdmUuXG4gICAqL1xuICBvblN0b3A6IF9wcm9wVHlwZXMuZGVmYXVsdC5mdW5jLFxuICAvKipcbiAgICogQSB3b3JrYXJvdW5kIG9wdGlvbiB3aGljaCBjYW4gYmUgcGFzc2VkIGlmIG9uTW91c2VEb3duIG5lZWRzIHRvIGJlIGFjY2Vzc2VkLFxuICAgKiBzaW5jZSBpdCdsbCBhbHdheXMgYmUgYmxvY2tlZCAoYXMgdGhlcmUgaXMgaW50ZXJuYWwgdXNlIG9mIG9uTW91c2VEb3duKVxuICAgKi9cbiAgb25Nb3VzZURvd246IF9wcm9wVHlwZXMuZGVmYXVsdC5mdW5jLFxuICAvKipcbiAgICogYHNjYWxlYCwgaWYgc2V0LCBhcHBsaWVzIHNjYWxpbmcgd2hpbGUgZHJhZ2dpbmcgYW4gZWxlbWVudFxuICAgKi9cbiAgc2NhbGU6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG4gIC8qKlxuICAgKiBUaGVzZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZWZpbmVkIG9uIHRoZSBjaGlsZCwgbm90IGhlcmUuXG4gICAqL1xuICBjbGFzc05hbWU6IF9zaGltcy5kb250U2V0TWUsXG4gIHN0eWxlOiBfc2hpbXMuZG9udFNldE1lLFxuICB0cmFuc2Zvcm06IF9zaGltcy5kb250U2V0TWVcbn0pO1xuX2RlZmluZVByb3BlcnR5KERyYWdnYWJsZUNvcmUsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgYWxsb3dBbnlDbGljazogZmFsc2UsXG4gIC8vIGJ5IGRlZmF1bHQgb25seSBhY2NlcHQgbGVmdCBjbGlja1xuICBkaXNhYmxlZDogZmFsc2UsXG4gIGVuYWJsZVVzZXJTZWxlY3RIYWNrOiB0cnVlLFxuICBvblN0YXJ0OiBmdW5jdGlvbiAoKSB7fSxcbiAgb25EcmFnOiBmdW5jdGlvbiAoKSB7fSxcbiAgb25TdG9wOiBmdW5jdGlvbiAoKSB7fSxcbiAgb25Nb3VzZURvd246IGZ1bmN0aW9uICgpIHt9LFxuICBzY2FsZTogMVxufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmNvbnN0IHtcbiAgZGVmYXVsdDogRHJhZ2dhYmxlLFxuICBEcmFnZ2FibGVDb3JlXG59ID0gcmVxdWlyZSgnLi9EcmFnZ2FibGUnKTtcblxuLy8gUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBsaWIgZXhwb3J0ZWQgPERyYWdnYWJsZT4gYXMgdGhlIHJvb3QgZXhwb3J0LiBBcyB0byBuby0vLyB0aGVtLCBvciBUeXBlU2NyaXB0LCB3ZSBleHBvcnQgKmJvdGgqIGFzIHRoZSByb290IGFuZCBhcyAnZGVmYXVsdCcuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL216YWJyaXNraWUvcmVhY3QtZHJhZ2dhYmxlL3B1bGwvMjU0XG4vLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL216YWJyaXNraWUvcmVhY3QtZHJhZ2dhYmxlL2lzc3Vlcy8yNjZcbm1vZHVsZS5leHBvcnRzID0gRHJhZ2dhYmxlO1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IERyYWdnYWJsZTtcbm1vZHVsZS5leHBvcnRzLkRyYWdnYWJsZUNvcmUgPSBEcmFnZ2FibGVDb3JlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5hZGRDbGFzc05hbWUgPSBhZGRDbGFzc05hbWU7XG5leHBvcnRzLmFkZEV2ZW50ID0gYWRkRXZlbnQ7XG5leHBvcnRzLmFkZFVzZXJTZWxlY3RTdHlsZXMgPSBhZGRVc2VyU2VsZWN0U3R5bGVzO1xuZXhwb3J0cy5jcmVhdGVDU1NUcmFuc2Zvcm0gPSBjcmVhdGVDU1NUcmFuc2Zvcm07XG5leHBvcnRzLmNyZWF0ZVNWR1RyYW5zZm9ybSA9IGNyZWF0ZVNWR1RyYW5zZm9ybTtcbmV4cG9ydHMuZ2V0VG91Y2ggPSBnZXRUb3VjaDtcbmV4cG9ydHMuZ2V0VG91Y2hJZGVudGlmaWVyID0gZ2V0VG91Y2hJZGVudGlmaWVyO1xuZXhwb3J0cy5nZXRUcmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uO1xuZXhwb3J0cy5pbm5lckhlaWdodCA9IGlubmVySGVpZ2h0O1xuZXhwb3J0cy5pbm5lcldpZHRoID0gaW5uZXJXaWR0aDtcbmV4cG9ydHMubWF0Y2hlc1NlbGVjdG9yID0gbWF0Y2hlc1NlbGVjdG9yO1xuZXhwb3J0cy5tYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG8gPSBtYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG87XG5leHBvcnRzLm9mZnNldFhZRnJvbVBhcmVudCA9IG9mZnNldFhZRnJvbVBhcmVudDtcbmV4cG9ydHMub3V0ZXJIZWlnaHQgPSBvdXRlckhlaWdodDtcbmV4cG9ydHMub3V0ZXJXaWR0aCA9IG91dGVyV2lkdGg7XG5leHBvcnRzLnJlbW92ZUNsYXNzTmFtZSA9IHJlbW92ZUNsYXNzTmFtZTtcbmV4cG9ydHMucmVtb3ZlRXZlbnQgPSByZW1vdmVFdmVudDtcbmV4cG9ydHMucmVtb3ZlVXNlclNlbGVjdFN0eWxlcyA9IHJlbW92ZVVzZXJTZWxlY3RTdHlsZXM7XG52YXIgX3NoaW1zID0gcmVxdWlyZShcIi4vc2hpbXNcIik7XG52YXIgX2dldFByZWZpeCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2dldFByZWZpeFwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cbi8qOjogaW1wb3J0IHR5cGUge0NvbnRyb2xQb3NpdGlvbiwgUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24sIE1vdXNlVG91Y2hFdmVudH0gZnJvbSAnLi90eXBlcyc7Ki9cbmxldCBtYXRjaGVzU2VsZWN0b3JGdW5jID0gJyc7XG5mdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IoZWwgLyo6IE5vZGUqLywgc2VsZWN0b3IgLyo6IHN0cmluZyovKSAvKjogYm9vbGVhbiove1xuICBpZiAoIW1hdGNoZXNTZWxlY3RvckZ1bmMpIHtcbiAgICBtYXRjaGVzU2VsZWN0b3JGdW5jID0gKDAsIF9zaGltcy5maW5kSW5BcnJheSkoWydtYXRjaGVzJywgJ3dlYmtpdE1hdGNoZXNTZWxlY3RvcicsICdtb3pNYXRjaGVzU2VsZWN0b3InLCAnbXNNYXRjaGVzU2VsZWN0b3InLCAnb01hdGNoZXNTZWxlY3RvciddLCBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAvLyAkRmxvd0lnbm9yZTogRG9lc24ndCB0aGluayBlbGVtZW50cyBhcmUgaW5kZXhhYmxlXG4gICAgICByZXR1cm4gKDAsIF9zaGltcy5pc0Z1bmN0aW9uKShlbFttZXRob2RdKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIE1pZ2h0IG5vdCBiZSBmb3VuZCBlbnRpcmVseSAobm90IGFuIEVsZW1lbnQ/KSAtIGluIHRoYXQgY2FzZSwgYmFpbFxuICAvLyAkRmxvd0lnbm9yZTogRG9lc24ndCB0aGluayBlbGVtZW50cyBhcmUgaW5kZXhhYmxlXG4gIGlmICghKDAsIF9zaGltcy5pc0Z1bmN0aW9uKShlbFttYXRjaGVzU2VsZWN0b3JGdW5jXSkpIHJldHVybiBmYWxzZTtcblxuICAvLyAkRmxvd0lnbm9yZTogRG9lc24ndCB0aGluayBlbGVtZW50cyBhcmUgaW5kZXhhYmxlXG4gIHJldHVybiBlbFttYXRjaGVzU2VsZWN0b3JGdW5jXShzZWxlY3Rvcik7XG59XG5cbi8vIFdvcmtzIHVwIHRoZSB0cmVlIHRvIHRoZSBkcmFnZ2FibGUgaXRzZWxmIGF0dGVtcHRpbmcgdG8gbWF0Y2ggc2VsZWN0b3IuXG5mdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG8oZWwgLyo6IE5vZGUqLywgc2VsZWN0b3IgLyo6IHN0cmluZyovLCBiYXNlTm9kZSAvKjogTm9kZSovKSAvKjogYm9vbGVhbiove1xuICBsZXQgbm9kZSA9IGVsO1xuICBkbyB7XG4gICAgaWYgKG1hdGNoZXNTZWxlY3Rvcihub2RlLCBzZWxlY3RvcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChub2RlID09PSBiYXNlTm9kZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vICRGbG93SWdub3JlW2luY29tcGF0aWJsZS10eXBlXVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH0gd2hpbGUgKG5vZGUpO1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBhZGRFdmVudChlbCAvKjogP05vZGUqLywgZXZlbnQgLyo6IHN0cmluZyovLCBoYW5kbGVyIC8qOiBGdW5jdGlvbiovLCBpbnB1dE9wdGlvbnMgLyo6IE9iamVjdCovKSAvKjogdm9pZCove1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAuLi5pbnB1dE9wdGlvbnNcbiAgfTtcbiAgLy8gJEZsb3dJZ25vcmVbbWV0aG9kLXVuYmluZGluZ11cbiAgaWYgKGVsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmIChlbC5hdHRhY2hFdmVudCkge1xuICAgIGVsLmF0dGFjaEV2ZW50KCdvbicgKyBldmVudCwgaGFuZGxlcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gJEZsb3dJZ25vcmU6IERvZXNuJ3QgdGhpbmsgZWxlbWVudHMgYXJlIGluZGV4YWJsZVxuICAgIGVsWydvbicgKyBldmVudF0gPSBoYW5kbGVyO1xuICB9XG59XG5mdW5jdGlvbiByZW1vdmVFdmVudChlbCAvKjogP05vZGUqLywgZXZlbnQgLyo6IHN0cmluZyovLCBoYW5kbGVyIC8qOiBGdW5jdGlvbiovLCBpbnB1dE9wdGlvbnMgLyo6IE9iamVjdCovKSAvKjogdm9pZCove1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAuLi5pbnB1dE9wdGlvbnNcbiAgfTtcbiAgLy8gJEZsb3dJZ25vcmVbbWV0aG9kLXVuYmluZGluZ11cbiAgaWYgKGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmIChlbC5kZXRhY2hFdmVudCkge1xuICAgIGVsLmRldGFjaEV2ZW50KCdvbicgKyBldmVudCwgaGFuZGxlcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gJEZsb3dJZ25vcmU6IERvZXNuJ3QgdGhpbmsgZWxlbWVudHMgYXJlIGluZGV4YWJsZVxuICAgIGVsWydvbicgKyBldmVudF0gPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBvdXRlckhlaWdodChub2RlIC8qOiBIVE1MRWxlbWVudCovKSAvKjogbnVtYmVyKi97XG4gIC8vIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IGV4Y2x1ZGluZyBtYXJnaW4gZm9yIG91ciBjYWxjdWxhdGlvbnMsIHNpbmNlIHdlIGFyZSB1c2luZ1xuICAvLyBvZmZzZXRUb3Agd2hpY2ggaXMgaW5jbHVkaW5nIG1hcmdpbi4gU2VlIGdldEJvdW5kUG9zaXRpb25cbiAgbGV0IGhlaWdodCA9IG5vZGUuY2xpZW50SGVpZ2h0O1xuICBjb25zdCBjb21wdXRlZFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIGhlaWdodCArPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCk7XG4gIGhlaWdodCArPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCk7XG4gIHJldHVybiBoZWlnaHQ7XG59XG5mdW5jdGlvbiBvdXRlcldpZHRoKG5vZGUgLyo6IEhUTUxFbGVtZW50Ki8pIC8qOiBudW1iZXIqL3tcbiAgLy8gVGhpcyBpcyBkZWxpYmVyYXRlbHkgZXhjbHVkaW5nIG1hcmdpbiBmb3Igb3VyIGNhbGN1bGF0aW9ucywgc2luY2Ugd2UgYXJlIHVzaW5nXG4gIC8vIG9mZnNldExlZnQgd2hpY2ggaXMgaW5jbHVkaW5nIG1hcmdpbi4gU2VlIGdldEJvdW5kUG9zaXRpb25cbiAgbGV0IHdpZHRoID0gbm9kZS5jbGllbnRXaWR0aDtcbiAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICB3aWR0aCArPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpO1xuICB3aWR0aCArPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5ib3JkZXJSaWdodFdpZHRoKTtcbiAgcmV0dXJuIHdpZHRoO1xufVxuZnVuY3Rpb24gaW5uZXJIZWlnaHQobm9kZSAvKjogSFRNTEVsZW1lbnQqLykgLyo6IG51bWJlciove1xuICBsZXQgaGVpZ2h0ID0gbm9kZS5jbGllbnRIZWlnaHQ7XG4gIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgaGVpZ2h0IC09ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3ApO1xuICBoZWlnaHQgLT0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUucGFkZGluZ0JvdHRvbSk7XG4gIHJldHVybiBoZWlnaHQ7XG59XG5mdW5jdGlvbiBpbm5lcldpZHRoKG5vZGUgLyo6IEhUTUxFbGVtZW50Ki8pIC8qOiBudW1iZXIqL3tcbiAgbGV0IHdpZHRoID0gbm9kZS5jbGllbnRXaWR0aDtcbiAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICB3aWR0aCAtPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5wYWRkaW5nTGVmdCk7XG4gIHdpZHRoIC09ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLnBhZGRpbmdSaWdodCk7XG4gIHJldHVybiB3aWR0aDtcbn1cbi8qOjogaW50ZXJmYWNlIEV2ZW50V2l0aE9mZnNldCB7XG4gIGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyXG59Ki9cbi8vIEdldCBmcm9tIG9mZnNldFBhcmVudFxuZnVuY3Rpb24gb2Zmc2V0WFlGcm9tUGFyZW50KGV2dCAvKjogRXZlbnRXaXRoT2Zmc2V0Ki8sIG9mZnNldFBhcmVudCAvKjogSFRNTEVsZW1lbnQqLywgc2NhbGUgLyo6IG51bWJlciovKSAvKjogQ29udHJvbFBvc2l0aW9uKi97XG4gIGNvbnN0IGlzQm9keSA9IG9mZnNldFBhcmVudCA9PT0gb2Zmc2V0UGFyZW50Lm93bmVyRG9jdW1lbnQuYm9keTtcbiAgY29uc3Qgb2Zmc2V0UGFyZW50UmVjdCA9IGlzQm9keSA/IHtcbiAgICBsZWZ0OiAwLFxuICAgIHRvcDogMFxuICB9IDogb2Zmc2V0UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB4ID0gKGV2dC5jbGllbnRYICsgb2Zmc2V0UGFyZW50LnNjcm9sbExlZnQgLSBvZmZzZXRQYXJlbnRSZWN0LmxlZnQpIC8gc2NhbGU7XG4gIGNvbnN0IHkgPSAoZXZ0LmNsaWVudFkgKyBvZmZzZXRQYXJlbnQuc2Nyb2xsVG9wIC0gb2Zmc2V0UGFyZW50UmVjdC50b3ApIC8gc2NhbGU7XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDU1NUcmFuc2Zvcm0oY29udHJvbFBvcyAvKjogQ29udHJvbFBvc2l0aW9uKi8sIHBvc2l0aW9uT2Zmc2V0IC8qOiBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbiovKSAvKjogT2JqZWN0Ki97XG4gIGNvbnN0IHRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb24oY29udHJvbFBvcywgcG9zaXRpb25PZmZzZXQsICdweCcpO1xuICByZXR1cm4ge1xuICAgIFsoMCwgX2dldFByZWZpeC5icm93c2VyUHJlZml4VG9LZXkpKCd0cmFuc2Zvcm0nLCBfZ2V0UHJlZml4LmRlZmF1bHQpXTogdHJhbnNsYXRpb25cbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNWR1RyYW5zZm9ybShjb250cm9sUG9zIC8qOiBDb250cm9sUG9zaXRpb24qLywgcG9zaXRpb25PZmZzZXQgLyo6IFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uKi8pIC8qOiBzdHJpbmcqL3tcbiAgY29uc3QgdHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbihjb250cm9sUG9zLCBwb3NpdGlvbk9mZnNldCwgJycpO1xuICByZXR1cm4gdHJhbnNsYXRpb247XG59XG5mdW5jdGlvbiBnZXRUcmFuc2xhdGlvbihfcmVmIC8qOjogKi8sIHBvc2l0aW9uT2Zmc2V0IC8qOiBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbiovLCB1bml0U3VmZml4IC8qOiBzdHJpbmcqLykgLyo6IHN0cmluZyove1xuICBsZXQge1xuICAgIHgsXG4gICAgeVxuICB9IC8qOiBDb250cm9sUG9zaXRpb24qLyA9IF9yZWYgLyo6IENvbnRyb2xQb3NpdGlvbiovO1xuICBsZXQgdHJhbnNsYXRpb24gPSBcInRyYW5zbGF0ZShcIi5jb25jYXQoeCkuY29uY2F0KHVuaXRTdWZmaXgsIFwiLFwiKS5jb25jYXQoeSkuY29uY2F0KHVuaXRTdWZmaXgsIFwiKVwiKTtcbiAgaWYgKHBvc2l0aW9uT2Zmc2V0KSB7XG4gICAgY29uc3QgZGVmYXVsdFggPSBcIlwiLmNvbmNhdCh0eXBlb2YgcG9zaXRpb25PZmZzZXQueCA9PT0gJ3N0cmluZycgPyBwb3NpdGlvbk9mZnNldC54IDogcG9zaXRpb25PZmZzZXQueCArIHVuaXRTdWZmaXgpO1xuICAgIGNvbnN0IGRlZmF1bHRZID0gXCJcIi5jb25jYXQodHlwZW9mIHBvc2l0aW9uT2Zmc2V0LnkgPT09ICdzdHJpbmcnID8gcG9zaXRpb25PZmZzZXQueSA6IHBvc2l0aW9uT2Zmc2V0LnkgKyB1bml0U3VmZml4KTtcbiAgICB0cmFuc2xhdGlvbiA9IFwidHJhbnNsYXRlKFwiLmNvbmNhdChkZWZhdWx0WCwgXCIsIFwiKS5jb25jYXQoZGVmYXVsdFksIFwiKVwiKSArIHRyYW5zbGF0aW9uO1xuICB9XG4gIHJldHVybiB0cmFuc2xhdGlvbjtcbn1cbmZ1bmN0aW9uIGdldFRvdWNoKGUgLyo6IE1vdXNlVG91Y2hFdmVudCovLCBpZGVudGlmaWVyIC8qOiBudW1iZXIqLykgLyo6ID97Y2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXJ9Ki97XG4gIHJldHVybiBlLnRhcmdldFRvdWNoZXMgJiYgKDAsIF9zaGltcy5maW5kSW5BcnJheSkoZS50YXJnZXRUb3VjaGVzLCB0ID0+IGlkZW50aWZpZXIgPT09IHQuaWRlbnRpZmllcikgfHwgZS5jaGFuZ2VkVG91Y2hlcyAmJiAoMCwgX3NoaW1zLmZpbmRJbkFycmF5KShlLmNoYW5nZWRUb3VjaGVzLCB0ID0+IGlkZW50aWZpZXIgPT09IHQuaWRlbnRpZmllcik7XG59XG5mdW5jdGlvbiBnZXRUb3VjaElkZW50aWZpZXIoZSAvKjogTW91c2VUb3VjaEV2ZW50Ki8pIC8qOiA/bnVtYmVyKi97XG4gIGlmIChlLnRhcmdldFRvdWNoZXMgJiYgZS50YXJnZXRUb3VjaGVzWzBdKSByZXR1cm4gZS50YXJnZXRUb3VjaGVzWzBdLmlkZW50aWZpZXI7XG4gIGlmIChlLmNoYW5nZWRUb3VjaGVzICYmIGUuY2hhbmdlZFRvdWNoZXNbMF0pIHJldHVybiBlLmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXI7XG59XG5cbi8vIFVzZXItc2VsZWN0IEhhY2tzOlxuLy9cbi8vIFVzZWZ1bCBmb3IgcHJldmVudGluZyBibHVlIGhpZ2hsaWdodHMgYWxsIG92ZXIgZXZlcnl0aGluZyB3aGVuIGRyYWdnaW5nLlxuXG4vLyBOb3RlIHdlJ3JlIHBhc3NpbmcgYGRvY3VtZW50YCBiL2Mgd2UgY291bGQgYmUgaWZyYW1lZFxuZnVuY3Rpb24gYWRkVXNlclNlbGVjdFN0eWxlcyhkb2MgLyo6ID9Eb2N1bWVudCovKSB7XG4gIGlmICghZG9jKSByZXR1cm47XG4gIGxldCBzdHlsZUVsID0gZG9jLmdldEVsZW1lbnRCeUlkKCdyZWFjdC1kcmFnZ2FibGUtc3R5bGUtZWwnKTtcbiAgaWYgKCFzdHlsZUVsKSB7XG4gICAgc3R5bGVFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWwudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgc3R5bGVFbC5pZCA9ICdyZWFjdC1kcmFnZ2FibGUtc3R5bGUtZWwnO1xuICAgIHN0eWxlRWwuaW5uZXJIVE1MID0gJy5yZWFjdC1kcmFnZ2FibGUtdHJhbnNwYXJlbnQtc2VsZWN0aW9uICo6Oi1tb3otc2VsZWN0aW9uIHthbGw6IGluaGVyaXQ7fVxcbic7XG4gICAgc3R5bGVFbC5pbm5lckhUTUwgKz0gJy5yZWFjdC1kcmFnZ2FibGUtdHJhbnNwYXJlbnQtc2VsZWN0aW9uICo6OnNlbGVjdGlvbiB7YWxsOiBpbmhlcml0O31cXG4nO1xuICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHN0eWxlRWwpO1xuICB9XG4gIGlmIChkb2MuYm9keSkgYWRkQ2xhc3NOYW1lKGRvYy5ib2R5LCAncmVhY3QtZHJhZ2dhYmxlLXRyYW5zcGFyZW50LXNlbGVjdGlvbicpO1xufVxuZnVuY3Rpb24gcmVtb3ZlVXNlclNlbGVjdFN0eWxlcyhkb2MgLyo6ID9Eb2N1bWVudCovKSB7XG4gIGlmICghZG9jKSByZXR1cm47XG4gIHRyeSB7XG4gICAgaWYgKGRvYy5ib2R5KSByZW1vdmVDbGFzc05hbWUoZG9jLmJvZHksICdyZWFjdC1kcmFnZ2FibGUtdHJhbnNwYXJlbnQtc2VsZWN0aW9uJyk7XG4gICAgLy8gJEZsb3dJZ25vcmU6IElFXG4gICAgaWYgKGRvYy5zZWxlY3Rpb24pIHtcbiAgICAgIC8vICRGbG93SWdub3JlOiBJRVxuICAgICAgZG9jLnNlbGVjdGlvbi5lbXB0eSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1vdmUgc2VsZWN0aW9uIGNhdXNlZCBieSBzY3JvbGwsIHVubGVzcyBpdCdzIGEgZm9jdXNlZCBpbnB1dFxuICAgICAgLy8gKHdlIHVzZSBkb2MuZGVmYXVsdFZpZXcgaW4gY2FzZSB3ZSdyZSBpbiBhbiBpZnJhbWUpXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSAoZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdykuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50eXBlICE9PSAnQ2FyZXQnKSB7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBwcm9iYWJseSBJRVxuICB9XG59XG5mdW5jdGlvbiBhZGRDbGFzc05hbWUoZWwgLyo6IEhUTUxFbGVtZW50Ki8sIGNsYXNzTmFtZSAvKjogc3RyaW5nKi8pIHtcbiAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWVsLmNsYXNzTmFtZS5tYXRjaChuZXcgUmVnRXhwKFwiKD86XnxcXFxccylcIi5jb25jYXQoY2xhc3NOYW1lLCBcIig/IVxcXFxTKVwiKSkpKSB7XG4gICAgICBlbC5jbGFzc05hbWUgKz0gXCIgXCIuY29uY2F0KGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZW1vdmVDbGFzc05hbWUoZWwgLyo6IEhUTUxFbGVtZW50Ki8sIGNsYXNzTmFtZSAvKjogc3RyaW5nKi8pIHtcbiAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKFwiKD86XnxcXFxccylcIi5jb25jYXQoY2xhc3NOYW1lLCBcIig/IVxcXFxTKVwiKSwgJ2cnKSwgJycpO1xuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmJyb3dzZXJQcmVmaXhUb0tleSA9IGJyb3dzZXJQcmVmaXhUb0tleTtcbmV4cG9ydHMuYnJvd3NlclByZWZpeFRvU3R5bGUgPSBicm93c2VyUHJlZml4VG9TdHlsZTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmV4cG9ydHMuZ2V0UHJlZml4ID0gZ2V0UHJlZml4O1xuY29uc3QgcHJlZml4ZXMgPSBbJ01veicsICdXZWJraXQnLCAnTycsICdtcyddO1xuZnVuY3Rpb24gZ2V0UHJlZml4KCkgLyo6IHN0cmluZyove1xuICB2YXIgX3dpbmRvdyRkb2N1bWVudDtcbiAgbGV0IHByb3AgLyo6IHN0cmluZyovID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAndHJhbnNmb3JtJztcbiAgLy8gRW5zdXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgdGhlcmUgaXMgYWN0dWFsbHkgYSBnbG9iYWxcbiAgLy8gYHdpbmRvd2Agb2JqXG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuICcnO1xuXG4gIC8vIElmIHdlJ3JlIGluIGEgcHNldWRvLWJyb3dzZXIgc2VydmVyLXNpZGUgZW52aXJvbm1lbnQsIHRoaXMgYWNjZXNzXG4gIC8vIHBhdGggbWF5IG5vdCBleGlzdCwgc28gYmFpbCBvdXQgaWYgaXQgZG9lc24ndC5cbiAgY29uc3Qgc3R5bGUgPSAoX3dpbmRvdyRkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCkgPT09IG51bGwgfHwgX3dpbmRvdyRkb2N1bWVudCA9PT0gdm9pZCAwIHx8IChfd2luZG93JGRvY3VtZW50ID0gX3dpbmRvdyRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpID09PSBudWxsIHx8IF93aW5kb3ckZG9jdW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckZG9jdW1lbnQuc3R5bGU7XG4gIGlmICghc3R5bGUpIHJldHVybiAnJztcbiAgaWYgKHByb3AgaW4gc3R5bGUpIHJldHVybiAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChicm93c2VyUHJlZml4VG9LZXkocHJvcCwgcHJlZml4ZXNbaV0pIGluIHN0eWxlKSByZXR1cm4gcHJlZml4ZXNbaV07XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuZnVuY3Rpb24gYnJvd3NlclByZWZpeFRvS2V5KHByb3AgLyo6IHN0cmluZyovLCBwcmVmaXggLyo6IHN0cmluZyovKSAvKjogc3RyaW5nKi97XG4gIHJldHVybiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdChrZWJhYlRvVGl0bGVDYXNlKHByb3ApKSA6IHByb3A7XG59XG5mdW5jdGlvbiBicm93c2VyUHJlZml4VG9TdHlsZShwcm9wIC8qOiBzdHJpbmcqLywgcHJlZml4IC8qOiBzdHJpbmcqLykgLyo6IHN0cmluZyove1xuICByZXR1cm4gcHJlZml4ID8gXCItXCIuY29uY2F0KHByZWZpeC50b0xvd2VyQ2FzZSgpLCBcIi1cIikuY29uY2F0KHByb3ApIDogcHJvcDtcbn1cbmZ1bmN0aW9uIGtlYmFiVG9UaXRsZUNhc2Uoc3RyIC8qOiBzdHJpbmcqLykgLyo6IHN0cmluZyove1xuICBsZXQgb3V0ID0gJyc7XG4gIGxldCBzaG91bGRDYXBpdGFsaXplID0gdHJ1ZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc2hvdWxkQ2FwaXRhbGl6ZSkge1xuICAgICAgb3V0ICs9IHN0cltpXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgc2hvdWxkQ2FwaXRhbGl6ZSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnLScpIHtcbiAgICAgIHNob3VsZENhcGl0YWxpemUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gc3RyW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyBEZWZhdWx0IGV4cG9ydCBpcyB0aGUgcHJlZml4IGl0c2VsZiwgbGlrZSAnTW96JywgJ1dlYmtpdCcsIGV0Y1xuLy8gTm90ZSB0aGF0IHlvdSBtYXkgaGF2ZSB0byByZS10ZXN0IGZvciBjZXJ0YWluIHRoaW5nczsgZm9yIGluc3RhbmNlLCBDaHJvbWUgNTBcbi8vIGNhbiBoYW5kbGUgdW5wcmVmaXhlZCBgdHJhbnNmb3JtYCwgYnV0IG5vdCB1bnByZWZpeGVkIGB1c2VyLXNlbGVjdGBcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IChnZXRQcmVmaXgoKSAvKjogc3RyaW5nKi8pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gbG9nO1xuLyplc2xpbnQgbm8tY29uc29sZTowKi9cbmZ1bmN0aW9uIGxvZygpIHtcbiAgaWYgKHVuZGVmaW5lZCkgY29uc29sZS5sb2coLi4uYXJndW1lbnRzKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2FuRHJhZ1ggPSBjYW5EcmFnWDtcbmV4cG9ydHMuY2FuRHJhZ1kgPSBjYW5EcmFnWTtcbmV4cG9ydHMuY3JlYXRlQ29yZURhdGEgPSBjcmVhdGVDb3JlRGF0YTtcbmV4cG9ydHMuY3JlYXRlRHJhZ2dhYmxlRGF0YSA9IGNyZWF0ZURyYWdnYWJsZURhdGE7XG5leHBvcnRzLmdldEJvdW5kUG9zaXRpb24gPSBnZXRCb3VuZFBvc2l0aW9uO1xuZXhwb3J0cy5nZXRDb250cm9sUG9zaXRpb24gPSBnZXRDb250cm9sUG9zaXRpb247XG5leHBvcnRzLnNuYXBUb0dyaWQgPSBzbmFwVG9HcmlkO1xudmFyIF9zaGltcyA9IHJlcXVpcmUoXCIuL3NoaW1zXCIpO1xudmFyIF9kb21GbnMgPSByZXF1aXJlKFwiLi9kb21GbnNcIik7XG4vKjo6IGltcG9ydCB0eXBlIERyYWdnYWJsZSBmcm9tICcuLi9EcmFnZ2FibGUnOyovXG4vKjo6IGltcG9ydCB0eXBlIHtCb3VuZHMsIENvbnRyb2xQb3NpdGlvbiwgRHJhZ2dhYmxlRGF0YSwgTW91c2VUb3VjaEV2ZW50fSBmcm9tICcuL3R5cGVzJzsqL1xuLyo6OiBpbXBvcnQgdHlwZSBEcmFnZ2FibGVDb3JlIGZyb20gJy4uL0RyYWdnYWJsZUNvcmUnOyovXG5mdW5jdGlvbiBnZXRCb3VuZFBvc2l0aW9uKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlKi8sIHggLyo6IG51bWJlciovLCB5IC8qOiBudW1iZXIqLykgLyo6IFtudW1iZXIsIG51bWJlcl0qL3tcbiAgLy8gSWYgbm8gYm91bmRzLCBzaG9ydC1jaXJjdWl0IGFuZCBtb3ZlIG9uXG4gIGlmICghZHJhZ2dhYmxlLnByb3BzLmJvdW5kcykgcmV0dXJuIFt4LCB5XTtcblxuICAvLyBDbG9uZSBuZXcgYm91bmRzXG4gIGxldCB7XG4gICAgYm91bmRzXG4gIH0gPSBkcmFnZ2FibGUucHJvcHM7XG4gIGJvdW5kcyA9IHR5cGVvZiBib3VuZHMgPT09ICdzdHJpbmcnID8gYm91bmRzIDogY2xvbmVCb3VuZHMoYm91bmRzKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmRET01Ob2RlKGRyYWdnYWJsZSk7XG4gIGlmICh0eXBlb2YgYm91bmRzID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHtcbiAgICAgIG93bmVyRG9jdW1lbnRcbiAgICB9ID0gbm9kZTtcbiAgICBjb25zdCBvd25lcldpbmRvdyA9IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgbGV0IGJvdW5kTm9kZTtcbiAgICBpZiAoYm91bmRzID09PSAncGFyZW50Jykge1xuICAgICAgYm91bmROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3VuZE5vZGUgPSBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYm91bmRzKTtcbiAgICB9XG4gICAgaWYgKCEoYm91bmROb2RlIGluc3RhbmNlb2Ygb3duZXJXaW5kb3cuSFRNTEVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdW5kcyBzZWxlY3RvciBcIicgKyBib3VuZHMgKyAnXCIgY291bGQgbm90IGZpbmQgYW4gZWxlbWVudC4nKTtcbiAgICB9XG4gICAgY29uc3QgYm91bmROb2RlRWwgLyo6IEhUTUxFbGVtZW50Ki8gPSBib3VuZE5vZGU7IC8vIGZvciBGbG93LCBjYW4ndCBzZWVtIHRvIHJlZmluZSBjb3JyZWN0bHlcbiAgICBjb25zdCBub2RlU3R5bGUgPSBvd25lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgIGNvbnN0IGJvdW5kTm9kZVN0eWxlID0gb3duZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShib3VuZE5vZGVFbCk7XG4gICAgLy8gQ29tcHV0ZSBib3VuZHMuIFRoaXMgaXMgYSBwYWluIHdpdGggcGFkZGluZyBhbmQgb2Zmc2V0cyBidXQgdGhpcyBnZXRzIGl0IGV4YWN0bHkgcmlnaHQuXG4gICAgYm91bmRzID0ge1xuICAgICAgbGVmdDogLW5vZGUub2Zmc2V0TGVmdCArICgwLCBfc2hpbXMuaW50KShib3VuZE5vZGVTdHlsZS5wYWRkaW5nTGVmdCkgKyAoMCwgX3NoaW1zLmludCkobm9kZVN0eWxlLm1hcmdpbkxlZnQpLFxuICAgICAgdG9wOiAtbm9kZS5vZmZzZXRUb3AgKyAoMCwgX3NoaW1zLmludCkoYm91bmROb2RlU3R5bGUucGFkZGluZ1RvcCkgKyAoMCwgX3NoaW1zLmludCkobm9kZVN0eWxlLm1hcmdpblRvcCksXG4gICAgICByaWdodDogKDAsIF9kb21GbnMuaW5uZXJXaWR0aCkoYm91bmROb2RlRWwpIC0gKDAsIF9kb21GbnMub3V0ZXJXaWR0aCkobm9kZSkgLSBub2RlLm9mZnNldExlZnQgKyAoMCwgX3NoaW1zLmludCkoYm91bmROb2RlU3R5bGUucGFkZGluZ1JpZ2h0KSAtICgwLCBfc2hpbXMuaW50KShub2RlU3R5bGUubWFyZ2luUmlnaHQpLFxuICAgICAgYm90dG9tOiAoMCwgX2RvbUZucy5pbm5lckhlaWdodCkoYm91bmROb2RlRWwpIC0gKDAsIF9kb21GbnMub3V0ZXJIZWlnaHQpKG5vZGUpIC0gbm9kZS5vZmZzZXRUb3AgKyAoMCwgX3NoaW1zLmludCkoYm91bmROb2RlU3R5bGUucGFkZGluZ0JvdHRvbSkgLSAoMCwgX3NoaW1zLmludCkobm9kZVN0eWxlLm1hcmdpbkJvdHRvbSlcbiAgICB9O1xuICB9XG5cbiAgLy8gS2VlcCB4IGFuZCB5IGJlbG93IHJpZ2h0IGFuZCBib3R0b20gbGltaXRzLi4uXG4gIGlmICgoMCwgX3NoaW1zLmlzTnVtKShib3VuZHMucmlnaHQpKSB4ID0gTWF0aC5taW4oeCwgYm91bmRzLnJpZ2h0KTtcbiAgaWYgKCgwLCBfc2hpbXMuaXNOdW0pKGJvdW5kcy5ib3R0b20pKSB5ID0gTWF0aC5taW4oeSwgYm91bmRzLmJvdHRvbSk7XG5cbiAgLy8gQnV0IGFib3ZlIGxlZnQgYW5kIHRvcCBsaW1pdHMuXG4gIGlmICgoMCwgX3NoaW1zLmlzTnVtKShib3VuZHMubGVmdCkpIHggPSBNYXRoLm1heCh4LCBib3VuZHMubGVmdCk7XG4gIGlmICgoMCwgX3NoaW1zLmlzTnVtKShib3VuZHMudG9wKSkgeSA9IE1hdGgubWF4KHksIGJvdW5kcy50b3ApO1xuICByZXR1cm4gW3gsIHldO1xufVxuZnVuY3Rpb24gc25hcFRvR3JpZChncmlkIC8qOiBbbnVtYmVyLCBudW1iZXJdKi8sIHBlbmRpbmdYIC8qOiBudW1iZXIqLywgcGVuZGluZ1kgLyo6IG51bWJlciovKSAvKjogW251bWJlciwgbnVtYmVyXSove1xuICBjb25zdCB4ID0gTWF0aC5yb3VuZChwZW5kaW5nWCAvIGdyaWRbMF0pICogZ3JpZFswXTtcbiAgY29uc3QgeSA9IE1hdGgucm91bmQocGVuZGluZ1kgLyBncmlkWzFdKSAqIGdyaWRbMV07XG4gIHJldHVybiBbeCwgeV07XG59XG5mdW5jdGlvbiBjYW5EcmFnWChkcmFnZ2FibGUgLyo6IERyYWdnYWJsZSovKSAvKjogYm9vbGVhbiove1xuICByZXR1cm4gZHJhZ2dhYmxlLnByb3BzLmF4aXMgPT09ICdib3RoJyB8fCBkcmFnZ2FibGUucHJvcHMuYXhpcyA9PT0gJ3gnO1xufVxuZnVuY3Rpb24gY2FuRHJhZ1koZHJhZ2dhYmxlIC8qOiBEcmFnZ2FibGUqLykgLyo6IGJvb2xlYW4qL3tcbiAgcmV0dXJuIGRyYWdnYWJsZS5wcm9wcy5heGlzID09PSAnYm90aCcgfHwgZHJhZ2dhYmxlLnByb3BzLmF4aXMgPT09ICd5Jztcbn1cblxuLy8gR2V0IHt4LCB5fSBwb3NpdGlvbnMgZnJvbSBldmVudC5cbmZ1bmN0aW9uIGdldENvbnRyb2xQb3NpdGlvbihlIC8qOiBNb3VzZVRvdWNoRXZlbnQqLywgdG91Y2hJZGVudGlmaWVyIC8qOiA/bnVtYmVyKi8sIGRyYWdnYWJsZUNvcmUgLyo6IERyYWdnYWJsZUNvcmUqLykgLyo6ID9Db250cm9sUG9zaXRpb24qL3tcbiAgY29uc3QgdG91Y2hPYmogPSB0eXBlb2YgdG91Y2hJZGVudGlmaWVyID09PSAnbnVtYmVyJyA/ICgwLCBfZG9tRm5zLmdldFRvdWNoKShlLCB0b3VjaElkZW50aWZpZXIpIDogbnVsbDtcbiAgaWYgKHR5cGVvZiB0b3VjaElkZW50aWZpZXIgPT09ICdudW1iZXInICYmICF0b3VjaE9iaikgcmV0dXJuIG51bGw7IC8vIG5vdCB0aGUgcmlnaHQgdG91Y2hcbiAgY29uc3Qgbm9kZSA9IGZpbmRET01Ob2RlKGRyYWdnYWJsZUNvcmUpO1xuICAvLyBVc2VyIGNhbiBwcm92aWRlIGFuIG9mZnNldFBhcmVudCBpZiBkZXNpcmVkLlxuICBjb25zdCBvZmZzZXRQYXJlbnQgPSBkcmFnZ2FibGVDb3JlLnByb3BzLm9mZnNldFBhcmVudCB8fCBub2RlLm9mZnNldFBhcmVudCB8fCBub2RlLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgcmV0dXJuICgwLCBfZG9tRm5zLm9mZnNldFhZRnJvbVBhcmVudCkodG91Y2hPYmogfHwgZSwgb2Zmc2V0UGFyZW50LCBkcmFnZ2FibGVDb3JlLnByb3BzLnNjYWxlKTtcbn1cblxuLy8gQ3JlYXRlIGFuIGRhdGEgb2JqZWN0IGV4cG9zZWQgYnkgPERyYWdnYWJsZUNvcmU+J3MgZXZlbnRzXG5mdW5jdGlvbiBjcmVhdGVDb3JlRGF0YShkcmFnZ2FibGUgLyo6IERyYWdnYWJsZUNvcmUqLywgeCAvKjogbnVtYmVyKi8sIHkgLyo6IG51bWJlciovKSAvKjogRHJhZ2dhYmxlRGF0YSove1xuICBjb25zdCBpc1N0YXJ0ID0gISgwLCBfc2hpbXMuaXNOdW0pKGRyYWdnYWJsZS5sYXN0WCk7XG4gIGNvbnN0IG5vZGUgPSBmaW5kRE9NTm9kZShkcmFnZ2FibGUpO1xuICBpZiAoaXNTdGFydCkge1xuICAgIC8vIElmIHRoaXMgaXMgb3VyIGZpcnN0IG1vdmUsIHVzZSB0aGUgeCBhbmQgeSBhcyBsYXN0IGNvb3Jkcy5cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZSxcbiAgICAgIGRlbHRhWDogMCxcbiAgICAgIGRlbHRhWTogMCxcbiAgICAgIGxhc3RYOiB4LFxuICAgICAgbGFzdFk6IHksXG4gICAgICB4LFxuICAgICAgeVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlIGNhbGN1bGF0ZSBwcm9wZXIgdmFsdWVzLlxuICAgIHJldHVybiB7XG4gICAgICBub2RlLFxuICAgICAgZGVsdGFYOiB4IC0gZHJhZ2dhYmxlLmxhc3RYLFxuICAgICAgZGVsdGFZOiB5IC0gZHJhZ2dhYmxlLmxhc3RZLFxuICAgICAgbGFzdFg6IGRyYWdnYWJsZS5sYXN0WCxcbiAgICAgIGxhc3RZOiBkcmFnZ2FibGUubGFzdFksXG4gICAgICB4LFxuICAgICAgeVxuICAgIH07XG4gIH1cbn1cblxuLy8gQ3JlYXRlIGFuIGRhdGEgZXhwb3NlZCBieSA8RHJhZ2dhYmxlPidzIGV2ZW50c1xuZnVuY3Rpb24gY3JlYXRlRHJhZ2dhYmxlRGF0YShkcmFnZ2FibGUgLyo6IERyYWdnYWJsZSovLCBjb3JlRGF0YSAvKjogRHJhZ2dhYmxlRGF0YSovKSAvKjogRHJhZ2dhYmxlRGF0YSove1xuICBjb25zdCBzY2FsZSA9IGRyYWdnYWJsZS5wcm9wcy5zY2FsZTtcbiAgcmV0dXJuIHtcbiAgICBub2RlOiBjb3JlRGF0YS5ub2RlLFxuICAgIHg6IGRyYWdnYWJsZS5zdGF0ZS54ICsgY29yZURhdGEuZGVsdGFYIC8gc2NhbGUsXG4gICAgeTogZHJhZ2dhYmxlLnN0YXRlLnkgKyBjb3JlRGF0YS5kZWx0YVkgLyBzY2FsZSxcbiAgICBkZWx0YVg6IGNvcmVEYXRhLmRlbHRhWCAvIHNjYWxlLFxuICAgIGRlbHRhWTogY29yZURhdGEuZGVsdGFZIC8gc2NhbGUsXG4gICAgbGFzdFg6IGRyYWdnYWJsZS5zdGF0ZS54LFxuICAgIGxhc3RZOiBkcmFnZ2FibGUuc3RhdGUueVxuICB9O1xufVxuXG4vLyBBIGxvdCBmYXN0ZXIgdGhhbiBzdHJpbmdpZnkvcGFyc2VcbmZ1bmN0aW9uIGNsb25lQm91bmRzKGJvdW5kcyAvKjogQm91bmRzKi8pIC8qOiBCb3VuZHMqL3tcbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiBib3VuZHMubGVmdCxcbiAgICB0b3A6IGJvdW5kcy50b3AsXG4gICAgcmlnaHQ6IGJvdW5kcy5yaWdodCxcbiAgICBib3R0b206IGJvdW5kcy5ib3R0b21cbiAgfTtcbn1cbmZ1bmN0aW9uIGZpbmRET01Ob2RlKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlIHwgRHJhZ2dhYmxlQ29yZSovKSAvKjogSFRNTEVsZW1lbnQqL3tcbiAgY29uc3Qgbm9kZSA9IGRyYWdnYWJsZS5maW5kRE9NTm9kZSgpO1xuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJzxEcmFnZ2FibGVDb3JlPjogVW5tb3VudGVkIGR1cmluZyBldmVudCEnKTtcbiAgfVxuICAvLyAkRmxvd0lnbm9yZSB3ZSBjYW4ndCBhc3NlcnQgb24gSFRNTEVsZW1lbnQgZHVlIHRvIHRlc3RzLi4uIEZJWE1FXG4gIHJldHVybiBub2RlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kb250U2V0TWUgPSBkb250U2V0TWU7XG5leHBvcnRzLmZpbmRJbkFycmF5ID0gZmluZEluQXJyYXk7XG5leHBvcnRzLmludCA9IGludDtcbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5leHBvcnRzLmlzTnVtID0gaXNOdW07XG4vLyBAY3JlZGl0cyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9yb2dvemhuaWtvZmYvYTQzY2ZlZDI3YzQxZTRlNjhjZGNcbmZ1bmN0aW9uIGZpbmRJbkFycmF5KGFycmF5IC8qOiBBcnJheTxhbnk+IHwgVG91Y2hMaXN0Ki8sIGNhbGxiYWNrIC8qOiBGdW5jdGlvbiovKSAvKjogYW55Ki97XG4gIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChjYWxsYmFjay5hcHBseShjYWxsYmFjaywgW2FycmF5W2ldLCBpLCBhcnJheV0pKSByZXR1cm4gYXJyYXlbaV07XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuYyAvKjogYW55Ki8pIC8qOiBib29sZWFuICVjaGVja3MqL3tcbiAgLy8gJEZsb3dJZ25vcmVbbWV0aG9kLXVuYmluZGluZ11cbiAgcmV0dXJuIHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cbmZ1bmN0aW9uIGlzTnVtKG51bSAvKjogYW55Ki8pIC8qOiBib29sZWFuICVjaGVja3MqL3tcbiAgcmV0dXJuIHR5cGVvZiBudW0gPT09ICdudW1iZXInICYmICFpc05hTihudW0pO1xufVxuZnVuY3Rpb24gaW50KGEgLyo6IHN0cmluZyovKSAvKjogbnVtYmVyKi97XG4gIHJldHVybiBwYXJzZUludChhLCAxMCk7XG59XG5mdW5jdGlvbiBkb250U2V0TWUocHJvcHMgLyo6IE9iamVjdCovLCBwcm9wTmFtZSAvKjogc3RyaW5nKi8sIGNvbXBvbmVudE5hbWUgLyo6IHN0cmluZyovKSAvKjogP0Vycm9yKi97XG4gIGlmIChwcm9wc1twcm9wTmFtZV0pIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFwiSW52YWxpZCBwcm9wIFwiLmNvbmNhdChwcm9wTmFtZSwgXCIgcGFzc2VkIHRvIFwiKS5jb25jYXQoY29tcG9uZW50TmFtZSwgXCIgLSBkbyBub3Qgc2V0IHRoaXMsIHNldCBpdCBvbiB0aGUgY2hpbGQuXCIpKTtcbiAgfVxufSIsImZ1bmN0aW9uIHIoZSl7dmFyIHQsZixuPVwiXCI7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGV8fFwibnVtYmVyXCI9PXR5cGVvZiBlKW4rPWU7ZWxzZSBpZihcIm9iamVjdFwiPT10eXBlb2YgZSlpZihBcnJheS5pc0FycmF5KGUpKWZvcih0PTA7dDxlLmxlbmd0aDt0KyspZVt0XSYmKGY9cihlW3RdKSkmJihuJiYobis9XCIgXCIpLG4rPWYpO2Vsc2UgZm9yKHQgaW4gZSllW3RdJiYobiYmKG4rPVwiIFwiKSxuKz10KTtyZXR1cm4gbn1leHBvcnQgZnVuY3Rpb24gY2xzeCgpe2Zvcih2YXIgZSx0LGY9MCxuPVwiXCI7Zjxhcmd1bWVudHMubGVuZ3RoOykoZT1hcmd1bWVudHNbZisrXSkmJih0PXIoZSkpJiYobiYmKG4rPVwiIFwiKSxuKz10KTtyZXR1cm4gbn1leHBvcnQgZGVmYXVsdCBjbHN4OyIsIi8qIGdsb2JhbCBNYXA6cmVhZG9ubHksIFNldDpyZWFkb25seSwgQXJyYXlCdWZmZXI6cmVhZG9ubHkgKi9cblxudmFyIGhhc0VsZW1lbnRUeXBlID0gdHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnO1xudmFyIGhhc01hcCA9IHR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbic7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBoYXNBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiAhIUFycmF5QnVmZmVyLmlzVmlldztcblxuLy8gTm90ZTogV2UgKipkb24ndCoqIG5lZWQgYGVudkhhc0JpZ0ludDY0QXJyYXlgIGluIGZkZSBlczYvaW5kZXguanNcblxuZnVuY3Rpb24gZXF1YWwoYSwgYikge1xuICAvLyBTVEFSVDogZmFzdC1kZWVwLWVxdWFsIGVzNi9pbmRleC5qcyAzLjEuM1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGEgJiYgYiAmJiB0eXBlb2YgYSA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PSAnb2JqZWN0Jykge1xuICAgIGlmIChhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgbGVuZ3RoLCBpLCBrZXlzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKCFlcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU1RBUlQ6IE1vZGlmaWNhdGlvbnM6XG4gICAgLy8gMS4gRXh0cmEgYGhhczxUeXBlPiAmJmAgaGVscGVycyBpbiBpbml0aWFsIGNvbmRpdGlvbiBhbGxvdyBlczYgY29kZVxuICAgIC8vICAgIHRvIGNvLWV4aXN0IHdpdGggZXM1LlxuICAgIC8vIDIuIFJlcGxhY2UgYGZvciBvZmAgd2l0aCBlczUgY29tcGxpYW50IGl0ZXJhdGlvbiB1c2luZyBgZm9yYC5cbiAgICAvLyAgICBCYXNpY2FsbHksIHRha2U6XG4gICAgLy9cbiAgICAvLyAgICBgYGBqc1xuICAgIC8vICAgIGZvciAoaSBvZiBhLmVudHJpZXMoKSlcbiAgICAvLyAgICAgIGlmICghYi5oYXMoaVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICBgYGBcbiAgICAvL1xuICAgIC8vICAgIC4uLiBhbmQgY29udmVydCB0bzpcbiAgICAvL1xuICAgIC8vICAgIGBgYGpzXG4gICAgLy8gICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAvLyAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgIC8vICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgIGBgYFxuICAgIC8vXG4gICAgLy8gICAgKipOb3RlKio6IGBpYCBhY2Nlc3Mgc3dpdGNoZXMgdG8gYGkudmFsdWVgLlxuICAgIHZhciBpdDtcbiAgICBpZiAoaGFzTWFwICYmIChhIGluc3RhbmNlb2YgTWFwKSAmJiAoYiBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWVxdWFsKGkudmFsdWVbMV0sIGIuZ2V0KGkudmFsdWVbMF0pKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NldCAmJiAoYSBpbnN0YW5jZW9mIFNldCkgJiYgKGIgaW5zdGFuY2VvZiBTZXQpKSB7XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRU5EOiBNb2RpZmljYXRpb25zXG5cbiAgICBpZiAoaGFzQXJyYXlCdWZmZXIgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGEpICYmIEFycmF5QnVmZmVyLmlzVmlldyhiKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgLy8gU1RBUlQ6IE1vZGlmaWNhdGlvbnM6XG4gICAgLy8gQXBwbHkgZ3VhcmRzIGZvciBgT2JqZWN0LmNyZWF0ZShudWxsKWAgaGFuZGxpbmcuIFNlZTpcbiAgICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3JtaWRhYmxlTGFicy9yZWFjdC1mYXN0LWNvbXBhcmUvaXNzdWVzLzY0XG4gICAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vZXBvYmVyZXpraW4vZmFzdC1kZWVwLWVxdWFsL2lzc3Vlcy80OVxuICAgIGlmIChhLnZhbHVlT2YgIT09IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZiAmJiB0eXBlb2YgYS52YWx1ZU9mID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBiLnZhbHVlT2YgPT09ICdmdW5jdGlvbicpIHJldHVybiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7XG4gICAgaWYgKGEudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgJiYgdHlwZW9mIGEudG9TdHJpbmcgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGIudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHJldHVybiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKTtcbiAgICAvLyBFTkQ6IE1vZGlmaWNhdGlvbnNcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gRU5EOiBmYXN0LWRlZXAtZXF1YWxcblxuICAgIC8vIFNUQVJUOiByZWFjdC1mYXN0LWNvbXBhcmVcbiAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIERPTSBlbGVtZW50c1xuICAgIGlmIChoYXNFbGVtZW50VHlwZSAmJiBhIGluc3RhbmNlb2YgRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gY3VzdG9tIGhhbmRsaW5nIGZvciBSZWFjdC9QcmVhY3RcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIGlmICgoa2V5c1tpXSA9PT0gJ19vd25lcicgfHwga2V5c1tpXSA9PT0gJ19fdicgfHwga2V5c1tpXSA9PT0gJ19fbycpICYmIGEuJCR0eXBlb2YpIHtcbiAgICAgICAgLy8gUmVhY3Qtc3BlY2lmaWM6IGF2b2lkIHRyYXZlcnNpbmcgUmVhY3QgZWxlbWVudHMnIF9vd25lclxuICAgICAgICAvLyBQcmVhY3Qtc3BlY2lmaWM6IGF2b2lkIHRyYXZlcnNpbmcgUHJlYWN0IGVsZW1lbnRzJyBfX3YgYW5kIF9fb1xuICAgICAgICAvLyAgICBfX3YgPSAkX29yaWdpbmFsIC8gJF92bm9kZVxuICAgICAgICAvLyAgICBfX28gPSAkX293bmVyXG4gICAgICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgY29udGFpbiBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCBhcmUgbm90IG5lZWRlZCB3aGVuXG4gICAgICAgIC8vIGNvbXBhcmluZyB0aGUgYWN0dWFsIGVsZW1lbnRzIChhbmQgbm90IHRoZWlyIG93bmVycylcbiAgICAgICAgLy8gLiQkdHlwZW9mIGFuZCAuX3N0b3JlIG9uIGp1c3QgcmVhc29uYWJsZSBtYXJrZXJzIG9mIGVsZW1lbnRzXG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGFsbCBvdGhlciBwcm9wZXJ0aWVzIHNob3VsZCBiZSB0cmF2ZXJzZWQgYXMgdXN1YWxcbiAgICAgIGlmICghZXF1YWwoYVtrZXlzW2ldXSwgYltrZXlzW2ldXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRU5EOiByZWFjdC1mYXN0LWNvbXBhcmVcblxuICAgIC8vIFNUQVJUOiBmYXN0LWRlZXAtZXF1YWxcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG59XG4vLyBlbmQgZmFzdC1kZWVwLWVxdWFsXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVxdWFsKGEsIGIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoKGVycm9yLm1lc3NhZ2UgfHwgJycpLm1hdGNoKC9zdGFja3xyZWN1cnNpb24vaSkpKSB7XG4gICAgICAvLyB3YXJuIG9uIGNpcmN1bGFyIHJlZmVyZW5jZXMsIGRvbid0IGNyYXNoXG4gICAgICAvLyBicm93c2VycyBnaXZlIHRoaXMgZGlmZmVyZW50IGVycm9ycyBuYW1lIGFuZCBtZXNzYWdlczpcbiAgICAgIC8vIGNocm9tZS9zYWZhcmk6IFwiUmFuZ2VFcnJvclwiLCBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCJcbiAgICAgIC8vIGZpcmVmb3g6IFwiSW50ZXJuYWxFcnJvclwiLCB0b28gbXVjaCByZWN1cnNpb25cIlxuICAgICAgLy8gZWRnZTogXCJFcnJvclwiLCBcIk91dCBvZiBzdGFjayBzcGFjZVwiXG4gICAgICBjb25zb2xlLndhcm4oJ3JlYWN0LWZhc3QtY29tcGFyZSBjYW5ub3QgaGFuZGxlIGNpcmN1bGFyIHJlZnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gc29tZSBvdGhlciBlcnJvci4gd2Ugc2hvdWxkIGRlZmluaXRlbHkga25vdyBhYm91dCB0aGVzZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJ2ZvY3VzLWxvY2svY29uc3RhbnRzJztcbmltcG9ydCB7IGlubGluZVByb3AgfSBmcm9tICcuL3V0aWwnO1xudmFyIEF1dG9Gb2N1c0luc2lkZSA9IGZ1bmN0aW9uIEF1dG9Gb2N1c0luc2lkZShfcmVmKSB7XG4gIHZhciBfcmVmJGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZCA9IF9yZWYkZGlzYWJsZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRkaXNhYmxlZCxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgX3JlZiRjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWUgPSBfcmVmJGNsYXNzTmFtZSA9PT0gdm9pZCAwID8gdW5kZWZpbmVkIDogX3JlZiRjbGFzc05hbWU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgaW5saW5lUHJvcChjb25zdGFudHMuRk9DVVNfQVVUTywgIWRpc2FibGVkKSwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0pLCBjaGlsZHJlbik7XG59O1xuQXV0b0ZvY3VzSW5zaWRlLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBBdXRvRm9jdXNJbnNpZGU7IiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGb2N1c0xvY2tVSSBmcm9tICcuL0xvY2snO1xuaW1wb3J0IEZvY3VzVHJhcCBmcm9tICcuL1RyYXAnO1xudmFyIEZvY3VzTG9ja0NvbWJpbmF0aW9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRm9jdXNMb2NrVUlDb21iaW5hdGlvbihwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0xvY2tVSSwgX2V4dGVuZHMoe1xuICAgIHNpZGVDYXI6IEZvY3VzVHJhcCxcbiAgICByZWY6IHJlZlxuICB9LCBwcm9wcykpO1xufSk7XG52YXIgX3JlZiA9IEZvY3VzTG9ja1VJLnByb3BUeXBlcyB8fCB7fSxcbiAgc2lkZUNhciA9IF9yZWYuc2lkZUNhcixcbiAgcHJvcFR5cGVzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgW1wic2lkZUNhclwiXSk7XG5Gb2N1c0xvY2tDb21iaW5hdGlvbi5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBwcm9wVHlwZXMgOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEZvY3VzTG9ja0NvbWJpbmF0aW9uOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5leHBvcnQgdmFyIGhpZGRlbkd1YXJkID0ge1xuICB3aWR0aDogJzFweCcsXG4gIGhlaWdodDogJzBweCcsXG4gIHBhZGRpbmc6IDAsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgcG9zaXRpb246ICdmaXhlZCcsXG4gIHRvcDogJzFweCcsXG4gIGxlZnQ6ICcxcHgnXG59O1xudmFyIEluRm9jdXNHdWFyZCA9IGZ1bmN0aW9uIEluRm9jdXNHdWFyZChfcmVmKSB7XG4gIHZhciBfcmVmJGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBjaGlsZHJlbiA9IF9yZWYkY2hpbGRyZW4gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJGNoaWxkcmVuO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiZ3VhcmQtZmlyc3RcIixcbiAgICBcImRhdGEtZm9jdXMtZ3VhcmRcIjogdHJ1ZSxcbiAgICBcImRhdGEtZm9jdXMtYXV0by1ndWFyZFwiOiB0cnVlLFxuICAgIHN0eWxlOiBoaWRkZW5HdWFyZFxuICB9KSwgY2hpbGRyZW4sIGNoaWxkcmVuICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiZ3VhcmQtbGFzdFwiLFxuICAgIFwiZGF0YS1mb2N1cy1ndWFyZFwiOiB0cnVlLFxuICAgIFwiZGF0YS1mb2N1cy1hdXRvLWd1YXJkXCI6IHRydWUsXG4gICAgc3R5bGU6IGhpZGRlbkd1YXJkXG4gIH0pKTtcbn07XG5JbkZvY3VzR3VhcmQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGVcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEluRm9jdXNHdWFyZDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnZm9jdXMtbG9jay9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW5saW5lUHJvcCB9IGZyb20gJy4vdXRpbCc7XG52YXIgRnJlZUZvY3VzSW5zaWRlID0gZnVuY3Rpb24gRnJlZUZvY3VzSW5zaWRlKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBpbmxpbmVQcm9wKGNvbnN0YW50cy5GT0NVU19BTExPVywgdHJ1ZSksIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9KSwgY2hpbGRyZW4pO1xufTtcbkZyZWVGb2N1c0luc2lkZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEZyZWVGb2N1c0luc2lkZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IG5vZGUsIGJvb2wsIHN0cmluZywgYW55LCBhcnJheU9mLCBvbmVPZlR5cGUsIG9iamVjdCwgZnVuYyB9IGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJ2ZvY3VzLWxvY2svY29uc3RhbnRzJztcbmltcG9ydCB7IHVzZU1lcmdlUmVmcyB9IGZyb20gJ3VzZS1jYWxsYmFjay1yZWYnO1xuaW1wb3J0IHsgaGlkZGVuR3VhcmQgfSBmcm9tICcuL0ZvY3VzR3VhcmQnO1xuaW1wb3J0IHsgbWVkaXVtRm9jdXMsIG1lZGl1bUJsdXIsIG1lZGl1bVNpZGVjYXIgfSBmcm9tICcuL21lZGl1bSc7XG5pbXBvcnQgeyBmb2N1c1Njb3BlIH0gZnJvbSAnLi9zY29wZSc7XG52YXIgZW1wdHlBcnJheSA9IFtdO1xudmFyIEZvY3VzTG9jayA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZvY3VzTG9ja1VJKHByb3BzLCBwYXJlbnRSZWYpIHtcbiAgdmFyIF9leHRlbmRzMjtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgcmVhbE9ic2VydmVkID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgIHNldE9ic2VydmVkID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuICB2YXIgb2JzZXJ2ZWQgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGlzQWN0aXZlID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdmFyIG9yaWdpbmFsRm9jdXNlZEVsZW1lbnQgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUyID0gUmVhY3QudXNlU3RhdGUoe30pLFxuICAgIHVwZGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIF9wcm9wcyRkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIGRpc2FibGVkID0gX3Byb3BzJGRpc2FibGVkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlZCxcbiAgICBfcHJvcHMkbm9Gb2N1c0d1YXJkcyA9IHByb3BzLm5vRm9jdXNHdWFyZHMsXG4gICAgbm9Gb2N1c0d1YXJkcyA9IF9wcm9wcyRub0ZvY3VzR3VhcmRzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRub0ZvY3VzR3VhcmRzLFxuICAgIF9wcm9wcyRwZXJzaXN0ZW50Rm9jdSA9IHByb3BzLnBlcnNpc3RlbnRGb2N1cyxcbiAgICBwZXJzaXN0ZW50Rm9jdXMgPSBfcHJvcHMkcGVyc2lzdGVudEZvY3UgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHBlcnNpc3RlbnRGb2N1LFxuICAgIF9wcm9wcyRjcm9zc0ZyYW1lID0gcHJvcHMuY3Jvc3NGcmFtZSxcbiAgICBjcm9zc0ZyYW1lID0gX3Byb3BzJGNyb3NzRnJhbWUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkY3Jvc3NGcmFtZSxcbiAgICBfcHJvcHMkYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgIGF1dG9Gb2N1cyA9IF9wcm9wcyRhdXRvRm9jdXMgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkYXV0b0ZvY3VzLFxuICAgIGFsbG93VGV4dFNlbGVjdGlvbiA9IHByb3BzLmFsbG93VGV4dFNlbGVjdGlvbixcbiAgICBncm91cCA9IHByb3BzLmdyb3VwLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICB3aGl0ZUxpc3QgPSBwcm9wcy53aGl0ZUxpc3QsXG4gICAgaGFzUG9zaXRpdmVJbmRpY2VzID0gcHJvcHMuaGFzUG9zaXRpdmVJbmRpY2VzLFxuICAgIF9wcm9wcyRzaGFyZHMgPSBwcm9wcy5zaGFyZHMsXG4gICAgc2hhcmRzID0gX3Byb3BzJHNoYXJkcyA9PT0gdm9pZCAwID8gZW1wdHlBcnJheSA6IF9wcm9wcyRzaGFyZHMsXG4gICAgX3Byb3BzJGFzID0gcHJvcHMuYXMsXG4gICAgQ29udGFpbmVyID0gX3Byb3BzJGFzID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRhcyxcbiAgICBfcHJvcHMkbG9ja1Byb3BzID0gcHJvcHMubG9ja1Byb3BzLFxuICAgIGNvbnRhaW5lclByb3BzID0gX3Byb3BzJGxvY2tQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkbG9ja1Byb3BzLFxuICAgIFNpZGVDYXIgPSBwcm9wcy5zaWRlQ2FyLFxuICAgIF9wcm9wcyRyZXR1cm5Gb2N1cyA9IHByb3BzLnJldHVybkZvY3VzLFxuICAgIHNob3VsZFJldHVybkZvY3VzID0gX3Byb3BzJHJldHVybkZvY3VzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRyZXR1cm5Gb2N1cyxcbiAgICBmb2N1c09wdGlvbnMgPSBwcm9wcy5mb2N1c09wdGlvbnMsXG4gICAgb25BY3RpdmF0aW9uQ2FsbGJhY2sgPSBwcm9wcy5vbkFjdGl2YXRpb24sXG4gICAgb25EZWFjdGl2YXRpb25DYWxsYmFjayA9IHByb3BzLm9uRGVhY3RpdmF0aW9uO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICBpZCA9IF9SZWFjdCR1c2VTdGF0ZTNbMF07XG4gIHZhciBvbkFjdGl2YXRpb24gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBjYXB0dXJlRm9jdXNSZXN0b3JlID0gX3JlZi5jYXB0dXJlRm9jdXNSZXN0b3JlO1xuICAgIGlmICghb3JpZ2luYWxGb2N1c2VkRWxlbWVudC5jdXJyZW50KSB7XG4gICAgICB2YXIgX2RvY3VtZW50O1xuICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSAoX2RvY3VtZW50ID0gZG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIG9yaWdpbmFsRm9jdXNlZEVsZW1lbnQuY3VycmVudCA9IGFjdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoYWN0aXZlRWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICBvcmlnaW5hbEZvY3VzZWRFbGVtZW50LmN1cnJlbnQgPSBjYXB0dXJlRm9jdXNSZXN0b3JlKGFjdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2JzZXJ2ZWQuY3VycmVudCAmJiBvbkFjdGl2YXRpb25DYWxsYmFjaykge1xuICAgICAgb25BY3RpdmF0aW9uQ2FsbGJhY2sob2JzZXJ2ZWQuY3VycmVudCk7XG4gICAgfVxuICAgIGlzQWN0aXZlLmN1cnJlbnQgPSB0cnVlO1xuICAgIHVwZGF0ZSgpO1xuICB9LCBbb25BY3RpdmF0aW9uQ2FsbGJhY2tdKTtcbiAgdmFyIG9uRGVhY3RpdmF0aW9uID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGlzQWN0aXZlLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBpZiAob25EZWFjdGl2YXRpb25DYWxsYmFjaykge1xuICAgICAgb25EZWFjdGl2YXRpb25DYWxsYmFjayhvYnNlcnZlZC5jdXJyZW50KTtcbiAgICB9XG4gICAgdXBkYXRlKCk7XG4gIH0sIFtvbkRlYWN0aXZhdGlvbkNhbGxiYWNrXSk7XG4gIHZhciByZXR1cm5Gb2N1cyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChhbGxvd0RlZmVyKSB7XG4gICAgdmFyIGZvY3VzUmVzdG9yZSA9IG9yaWdpbmFsRm9jdXNlZEVsZW1lbnQuY3VycmVudDtcbiAgICBpZiAoZm9jdXNSZXN0b3JlKSB7XG4gICAgICB2YXIgcmV0dXJuRm9jdXNUbyA9ICh0eXBlb2YgZm9jdXNSZXN0b3JlID09PSAnZnVuY3Rpb24nID8gZm9jdXNSZXN0b3JlKCkgOiBmb2N1c1Jlc3RvcmUpIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICB2YXIgaG93VG9SZXR1cm5Gb2N1cyA9IHR5cGVvZiBzaG91bGRSZXR1cm5Gb2N1cyA9PT0gJ2Z1bmN0aW9uJyA/IHNob3VsZFJldHVybkZvY3VzKHJldHVybkZvY3VzVG8pIDogc2hvdWxkUmV0dXJuRm9jdXM7XG4gICAgICBpZiAoaG93VG9SZXR1cm5Gb2N1cykge1xuICAgICAgICB2YXIgcmV0dXJuRm9jdXNPcHRpb25zID0gdHlwZW9mIGhvd1RvUmV0dXJuRm9jdXMgPT09ICdvYmplY3QnID8gaG93VG9SZXR1cm5Gb2N1cyA6IHVuZGVmaW5lZDtcbiAgICAgICAgb3JpZ2luYWxGb2N1c2VkRWxlbWVudC5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKGFsbG93RGVmZXIpIHtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5Gb2N1c1RvLmZvY3VzKHJldHVybkZvY3VzT3B0aW9ucyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuRm9jdXNUby5mb2N1cyhyZXR1cm5Gb2N1c09wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCBbc2hvdWxkUmV0dXJuRm9jdXNdKTtcbiAgdmFyIG9uRm9jdXMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoaXNBY3RpdmUuY3VycmVudCkge1xuICAgICAgbWVkaXVtRm9jdXMudXNlTWVkaXVtKGV2ZW50KTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgdmFyIG9uQmx1ciA9IG1lZGl1bUJsdXIudXNlTWVkaXVtO1xuICB2YXIgc2V0T2JzZXJ2ZU5vZGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3T2JzZXJ2ZWQpIHtcbiAgICBpZiAob2JzZXJ2ZWQuY3VycmVudCAhPT0gbmV3T2JzZXJ2ZWQpIHtcbiAgICAgIG9ic2VydmVkLmN1cnJlbnQgPSBuZXdPYnNlcnZlZDtcbiAgICAgIHNldE9ic2VydmVkKG5ld09ic2VydmVkKTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIGFsbG93VGV4dFNlbGVjdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignUmVhY3QtRm9jdXMtTG9jazogYWxsb3dUZXh0U2VsZWN0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIGVuYWJsZWQgYnkgZGVmYXVsdCcpO1xuICAgIH1cbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFvYnNlcnZlZC5jdXJyZW50ICYmIHR5cGVvZiBDb250YWluZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZvY3VzTG9jazogY291bGQgbm90IG9idGFpbiByZWYgdG8gaW50ZXJuYWwgbm9kZScpO1xuICAgICAgfVxuICAgIH0sIFtdKTtcbiAgfVxuICB2YXIgbG9ja1Byb3BzID0gX2V4dGVuZHMoKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbY29uc3RhbnRzLkZPQ1VTX0RJU0FCTEVEXSA9IGRpc2FibGVkICYmICdkaXNhYmxlZCcsIF9leHRlbmRzMltjb25zdGFudHMuRk9DVVNfR1JPVVBdID0gZ3JvdXAsIF9leHRlbmRzMiksIGNvbnRhaW5lclByb3BzKTtcbiAgdmFyIGhhc0xlYWRpbmdHdWFyZHMgPSBub0ZvY3VzR3VhcmRzICE9PSB0cnVlO1xuICB2YXIgaGFzVGFpbGluZ0d1YXJkcyA9IGhhc0xlYWRpbmdHdWFyZHMgJiYgbm9Gb2N1c0d1YXJkcyAhPT0gJ3RhaWwnO1xuICB2YXIgbWVyZ2VkUmVmID0gdXNlTWVyZ2VSZWZzKFtwYXJlbnRSZWYsIHNldE9ic2VydmVOb2RlXSk7XG4gIHZhciBmb2N1c1Njb3BlVmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb2JzZXJ2ZWQ6IG9ic2VydmVkLFxuICAgICAgc2hhcmRzOiBzaGFyZHMsXG4gICAgICBlbmFibGVkOiAhZGlzYWJsZWQsXG4gICAgICBhY3RpdmU6IGlzQWN0aXZlLmN1cnJlbnRcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIGlzQWN0aXZlLmN1cnJlbnQsIHNoYXJkcywgcmVhbE9ic2VydmVkXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgaGFzTGVhZGluZ0d1YXJkcyAmJiBbXG4gIC8qI19fUFVSRV9fKi9cbiAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcImd1YXJkLWZpcnN0XCIsXG4gICAgXCJkYXRhLWZvY3VzLWd1YXJkXCI6IHRydWUsXG4gICAgdGFiSW5kZXg6IGRpc2FibGVkID8gLTEgOiAwLFxuICAgIHN0eWxlOiBoaWRkZW5HdWFyZFxuICB9KSwgaGFzUG9zaXRpdmVJbmRpY2VzID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJndWFyZC1uZWFyZXN0XCIsXG4gICAgXCJkYXRhLWZvY3VzLWd1YXJkXCI6IHRydWUsXG4gICAgdGFiSW5kZXg6IGRpc2FibGVkID8gLTEgOiAxLFxuICAgIHN0eWxlOiBoaWRkZW5HdWFyZFxuICB9KSA6IG51bGxdLCAhZGlzYWJsZWQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZUNhciwge1xuICAgIGlkOiBpZCxcbiAgICBzaWRlQ2FyOiBtZWRpdW1TaWRlY2FyLFxuICAgIG9ic2VydmVkOiByZWFsT2JzZXJ2ZWQsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHBlcnNpc3RlbnRGb2N1czogcGVyc2lzdGVudEZvY3VzLFxuICAgIGNyb3NzRnJhbWU6IGNyb3NzRnJhbWUsXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgd2hpdGVMaXN0OiB3aGl0ZUxpc3QsXG4gICAgc2hhcmRzOiBzaGFyZHMsXG4gICAgb25BY3RpdmF0aW9uOiBvbkFjdGl2YXRpb24sXG4gICAgb25EZWFjdGl2YXRpb246IG9uRGVhY3RpdmF0aW9uLFxuICAgIHJldHVybkZvY3VzOiByZXR1cm5Gb2N1cyxcbiAgICBmb2N1c09wdGlvbnM6IGZvY3VzT3B0aW9uc1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGFpbmVyLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiBtZXJnZWRSZWZcbiAgfSwgbG9ja1Byb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgb25CbHVyOiBvbkJsdXIsXG4gICAgb25Gb2N1czogb25Gb2N1c1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoZm9jdXNTY29wZS5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBmb2N1c1Njb3BlVmFsdWVcbiAgfSwgY2hpbGRyZW4pKSwgaGFzVGFpbGluZ0d1YXJkcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgXCJkYXRhLWZvY3VzLWd1YXJkXCI6IHRydWUsXG4gICAgdGFiSW5kZXg6IGRpc2FibGVkID8gLTEgOiAwLFxuICAgIHN0eWxlOiBoaWRkZW5HdWFyZFxuICB9KSk7XG59KTtcbkZvY3VzTG9jay5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIGNoaWxkcmVuOiBub2RlLFxuICBkaXNhYmxlZDogYm9vbCxcbiAgcmV0dXJuRm9jdXM6IG9uZU9mVHlwZShbYm9vbCwgb2JqZWN0LCBmdW5jXSksXG4gIGZvY3VzT3B0aW9uczogb2JqZWN0LFxuICBub0ZvY3VzR3VhcmRzOiBib29sLFxuICBoYXNQb3NpdGl2ZUluZGljZXM6IGJvb2wsXG4gIGFsbG93VGV4dFNlbGVjdGlvbjogYm9vbCxcbiAgYXV0b0ZvY3VzOiBib29sLFxuICBwZXJzaXN0ZW50Rm9jdXM6IGJvb2wsXG4gIGNyb3NzRnJhbWU6IGJvb2wsXG4gIGdyb3VwOiBzdHJpbmcsXG4gIGNsYXNzTmFtZTogc3RyaW5nLFxuICB3aGl0ZUxpc3Q6IGZ1bmMsXG4gIHNoYXJkczogYXJyYXlPZihhbnkpLFxuICBhczogb25lT2ZUeXBlKFtzdHJpbmcsIGZ1bmMsIG9iamVjdF0pLFxuICBsb2NrUHJvcHM6IG9iamVjdCxcbiAgb25BY3RpdmF0aW9uOiBmdW5jLFxuICBvbkRlYWN0aXZhdGlvbjogZnVuYyxcbiAgc2lkZUNhcjogYW55LmlzUmVxdWlyZWRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEZvY3VzTG9jazsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnZm9jdXMtbG9jay9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW5saW5lUHJvcCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBtZWRpdW1FZmZlY3QgfSBmcm9tICcuL21lZGl1bSc7XG5leHBvcnQgdmFyIHVzZUZvY3VzSW5zaWRlID0gZnVuY3Rpb24gdXNlRm9jdXNJbnNpZGUob2JzZXJ2ZWRSZWYpIHtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZW5hYmxlZCA9IHRydWU7XG4gICAgbWVkaXVtRWZmZWN0LnVzZU1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICB2YXIgb2JzZXJ2ZWQgPSBvYnNlcnZlZFJlZiAmJiBvYnNlcnZlZFJlZi5jdXJyZW50O1xuICAgICAgaWYgKGVuYWJsZWQgJiYgb2JzZXJ2ZWQpIHtcbiAgICAgICAgaWYgKCFjYXIuZm9jdXNJbnNpZGUob2JzZXJ2ZWQpKSB7XG4gICAgICAgICAgY2FyLm1vdmVGb2N1c0luc2lkZShvYnNlcnZlZCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZW5hYmxlZCA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtvYnNlcnZlZFJlZl0pO1xufTtcbmZ1bmN0aW9uIE1vdmVGb2N1c0luc2lkZShfcmVmKSB7XG4gIHZhciBfcmVmJGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICBpc0Rpc2FibGVkID0gX3JlZiRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGRpc2FibGVkLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdXNlRm9jdXNJbnNpZGUoaXNEaXNhYmxlZCA/IHVuZGVmaW5lZCA6IHJlZik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgaW5saW5lUHJvcChjb25zdGFudHMuRk9DVVNfQVVUTywgIWlzRGlzYWJsZWQpLCB7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSksIGNoaWxkcmVuKTtcbn1cbk1vdmVGb2N1c0luc2lkZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgTW92ZUZvY3VzSW5zaWRlOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgd2l0aFNpZGVFZmZlY3QgZnJvbSAncmVhY3QtY2xpZW50c2lkZS1lZmZlY3QnO1xuaW1wb3J0IHsgbW92ZUZvY3VzSW5zaWRlLCBmb2N1c0luc2lkZSwgZm9jdXNJc0hpZGRlbiwgZXhwYW5kRm9jdXNhYmxlTm9kZXMsIGZvY3VzTmV4dEVsZW1lbnQsIGZvY3VzUHJldkVsZW1lbnQsIGZvY3VzRmlyc3RFbGVtZW50LCBmb2N1c0xhc3RFbGVtZW50LCBjYXB0dXJlRm9jdXNSZXN0b3JlIH0gZnJvbSAnZm9jdXMtbG9jayc7XG5pbXBvcnQgeyBkZWZlckFjdGlvbiwgZXh0cmFjdFJlZiB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBtZWRpdW1Gb2N1cywgbWVkaXVtQmx1ciwgbWVkaXVtRWZmZWN0IH0gZnJvbSAnLi9tZWRpdW0nO1xudmFyIGZvY3VzT25Cb2R5ID0gZnVuY3Rpb24gZm9jdXNPbkJvZHkoKSB7XG4gIHJldHVybiBkb2N1bWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBkb2N1bWVudC5ib2R5O1xufTtcbnZhciBpc0ZyZWVGb2N1cyA9IGZ1bmN0aW9uIGlzRnJlZUZvY3VzKCkge1xuICByZXR1cm4gZm9jdXNPbkJvZHkoKSB8fCBmb2N1c0lzSGlkZGVuKCk7XG59O1xudmFyIGxhc3RBY3RpdmVUcmFwID0gbnVsbDtcbnZhciBsYXN0QWN0aXZlRm9jdXMgPSBudWxsO1xudmFyIGxhc3RQb3J0YWxlZEVsZW1lbnQgPSBudWxsO1xudmFyIGZvY3VzV2FzT3V0c2lkZVdpbmRvdyA9IGZhbHNlO1xudmFyIGRlZmF1bHRXaGl0ZWxpc3QgPSBmdW5jdGlvbiBkZWZhdWx0V2hpdGVsaXN0KCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgZm9jdXNXaGl0ZWxpc3RlZCA9IGZ1bmN0aW9uIGZvY3VzV2hpdGVsaXN0ZWQoYWN0aXZlRWxlbWVudCkge1xuICByZXR1cm4gKGxhc3RBY3RpdmVUcmFwLndoaXRlTGlzdCB8fCBkZWZhdWx0V2hpdGVsaXN0KShhY3RpdmVFbGVtZW50KTtcbn07XG52YXIgcmVjb3JkUG9ydGFsID0gZnVuY3Rpb24gcmVjb3JkUG9ydGFsKG9ic2VydmVyTm9kZSwgcG9ydGFsZWRFbGVtZW50KSB7XG4gIGxhc3RQb3J0YWxlZEVsZW1lbnQgPSB7XG4gICAgb2JzZXJ2ZXJOb2RlOiBvYnNlcnZlck5vZGUsXG4gICAgcG9ydGFsZWRFbGVtZW50OiBwb3J0YWxlZEVsZW1lbnRcbiAgfTtcbn07XG52YXIgZm9jdXNJc1BvcnRhbGVkUGFpciA9IGZ1bmN0aW9uIGZvY3VzSXNQb3J0YWxlZFBhaXIoZWxlbWVudCkge1xuICByZXR1cm4gbGFzdFBvcnRhbGVkRWxlbWVudCAmJiBsYXN0UG9ydGFsZWRFbGVtZW50LnBvcnRhbGVkRWxlbWVudCA9PT0gZWxlbWVudDtcbn07XG5mdW5jdGlvbiBhdXRvR3VhcmQoc3RhcnRJbmRleCwgZW5kLCBzdGVwLCBhbGxOb2Rlcykge1xuICB2YXIgbGFzdEd1YXJkID0gbnVsbDtcbiAgdmFyIGkgPSBzdGFydEluZGV4O1xuICBkbyB7XG4gICAgdmFyIGl0ZW0gPSBhbGxOb2Rlc1tpXTtcbiAgICBpZiAoaXRlbS5ndWFyZCkge1xuICAgICAgaWYgKGl0ZW0ubm9kZS5kYXRhc2V0LmZvY3VzQXV0b0d1YXJkKSB7XG4gICAgICAgIGxhc3RHdWFyZCA9IGl0ZW07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpdGVtLmxvY2tJdGVtKSB7XG4gICAgICBpZiAoaSAhPT0gc3RhcnRJbmRleCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0R3VhcmQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH0gd2hpbGUgKChpICs9IHN0ZXApICE9PSBlbmQpO1xuICBpZiAobGFzdEd1YXJkKSB7XG4gICAgbGFzdEd1YXJkLm5vZGUudGFiSW5kZXggPSAwO1xuICB9XG59XG52YXIgZm9jdXNXYXNPdXRzaWRlID0gZnVuY3Rpb24gZm9jdXNXYXNPdXRzaWRlKGNyb3NzRnJhbWVPcHRpb24pIHtcbiAgaWYgKGNyb3NzRnJhbWVPcHRpb24pIHtcbiAgICByZXR1cm4gQm9vbGVhbihmb2N1c1dhc091dHNpZGVXaW5kb3cpO1xuICB9XG4gIHJldHVybiBmb2N1c1dhc091dHNpZGVXaW5kb3cgPT09ICdtZWFud2hpbGUnO1xufTtcbnZhciBjaGVja0luSG9zdCA9IGZ1bmN0aW9uIGNoZWNrSW5Ib3N0KGNoZWNrLCBlbCwgYm91bmRhcnkpIHtcbiAgcmV0dXJuIGVsICYmIChlbC5ob3N0ID09PSBjaGVjayAmJiAoIWVsLmFjdGl2ZUVsZW1lbnQgfHwgYm91bmRhcnkuY29udGFpbnMoZWwuYWN0aXZlRWxlbWVudCkpIHx8IGVsLnBhcmVudE5vZGUgJiYgY2hlY2tJbkhvc3QoY2hlY2ssIGVsLnBhcmVudE5vZGUsIGJvdW5kYXJ5KSk7XG59O1xudmFyIHdpdGhpbkhvc3QgPSBmdW5jdGlvbiB3aXRoaW5Ib3N0KGFjdGl2ZUVsZW1lbnQsIHdvcmtpbmdBcmVhKSB7XG4gIHJldHVybiB3b3JraW5nQXJlYS5zb21lKGZ1bmN0aW9uIChhcmVhKSB7XG4gICAgcmV0dXJuIGNoZWNrSW5Ib3N0KGFjdGl2ZUVsZW1lbnQsIGFyZWEsIGFyZWEpO1xuICB9KTtcbn07XG52YXIgYWN0aXZhdGVUcmFwID0gZnVuY3Rpb24gYWN0aXZhdGVUcmFwKCkge1xuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmIChsYXN0QWN0aXZlVHJhcCkge1xuICAgIHZhciBfbGFzdEFjdGl2ZVRyYXAgPSBsYXN0QWN0aXZlVHJhcCxcbiAgICAgIG9ic2VydmVkID0gX2xhc3RBY3RpdmVUcmFwLm9ic2VydmVkLFxuICAgICAgcGVyc2lzdGVudEZvY3VzID0gX2xhc3RBY3RpdmVUcmFwLnBlcnNpc3RlbnRGb2N1cyxcbiAgICAgIGF1dG9Gb2N1cyA9IF9sYXN0QWN0aXZlVHJhcC5hdXRvRm9jdXMsXG4gICAgICBzaGFyZHMgPSBfbGFzdEFjdGl2ZVRyYXAuc2hhcmRzLFxuICAgICAgY3Jvc3NGcmFtZSA9IF9sYXN0QWN0aXZlVHJhcC5jcm9zc0ZyYW1lLFxuICAgICAgZm9jdXNPcHRpb25zID0gX2xhc3RBY3RpdmVUcmFwLmZvY3VzT3B0aW9ucztcbiAgICB2YXIgd29ya2luZ05vZGUgPSBvYnNlcnZlZCB8fCBsYXN0UG9ydGFsZWRFbGVtZW50ICYmIGxhc3RQb3J0YWxlZEVsZW1lbnQucG9ydGFsZWRFbGVtZW50O1xuICAgIHZhciBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBpZiAod29ya2luZ05vZGUpIHtcbiAgICAgIHZhciB3b3JraW5nQXJlYSA9IFt3b3JraW5nTm9kZV0uY29uY2F0KHNoYXJkcy5tYXAoZXh0cmFjdFJlZikuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCBmb2N1c1doaXRlbGlzdGVkKGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIGlmIChwZXJzaXN0ZW50Rm9jdXMgfHwgZm9jdXNXYXNPdXRzaWRlKGNyb3NzRnJhbWUpIHx8ICFpc0ZyZWVGb2N1cygpIHx8ICFsYXN0QWN0aXZlRm9jdXMgJiYgYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgaWYgKHdvcmtpbmdOb2RlICYmICEoZm9jdXNJbnNpZGUod29ya2luZ0FyZWEpIHx8IGFjdGl2ZUVsZW1lbnQgJiYgd2l0aGluSG9zdChhY3RpdmVFbGVtZW50LCB3b3JraW5nQXJlYSkgfHwgZm9jdXNJc1BvcnRhbGVkUGFpcihhY3RpdmVFbGVtZW50LCB3b3JraW5nTm9kZSkpKSB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQgJiYgIWxhc3RBY3RpdmVGb2N1cyAmJiBhY3RpdmVFbGVtZW50ICYmICFhdXRvRm9jdXMpIHtcbiAgICAgICAgICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQuYmx1cikge1xuICAgICAgICAgICAgICAgIGFjdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IG1vdmVGb2N1c0luc2lkZSh3b3JraW5nQXJlYSwgbGFzdEFjdGl2ZUZvY3VzLCB7XG4gICAgICAgICAgICAgICAgZm9jdXNPcHRpb25zOiBmb2N1c09wdGlvbnNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGxhc3RQb3J0YWxlZEVsZW1lbnQgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9jdXNXYXNPdXRzaWRlV2luZG93ID0gZmFsc2U7XG4gICAgICAgICAgbGFzdEFjdGl2ZUZvY3VzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRvY3VtZW50ICYmIGFjdGl2ZUVsZW1lbnQgIT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtZm9jdXMtYXV0by1ndWFyZF0nKSkge1xuICAgICAgICB2YXIgbmV3QWN0aXZlRWxlbWVudCA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHZhciBhbGxOb2RlcyA9IGV4cGFuZEZvY3VzYWJsZU5vZGVzKHdvcmtpbmdBcmVhKTtcbiAgICAgICAgdmFyIGZvY3VzZWRJbmRleCA9IGFsbE5vZGVzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBub2RlID0gX3JlZi5ub2RlO1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9KS5pbmRleE9mKG5ld0FjdGl2ZUVsZW1lbnQpO1xuICAgICAgICBpZiAoZm9jdXNlZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICBhbGxOb2Rlcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgICB2YXIgZ3VhcmQgPSBfcmVmMi5ndWFyZCxcbiAgICAgICAgICAgICAgbm9kZSA9IF9yZWYyLm5vZGU7XG4gICAgICAgICAgICByZXR1cm4gZ3VhcmQgJiYgbm9kZS5kYXRhc2V0LmZvY3VzQXV0b0d1YXJkO1xuICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IF9yZWYzLm5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYkluZGV4Jyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXV0b0d1YXJkKGZvY3VzZWRJbmRleCwgYWxsTm9kZXMubGVuZ3RoLCArMSwgYWxsTm9kZXMpO1xuICAgICAgICAgIGF1dG9HdWFyZChmb2N1c2VkSW5kZXgsIC0xLCAtMSwgYWxsTm9kZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIG9uVHJhcCA9IGZ1bmN0aW9uIG9uVHJhcChldmVudCkge1xuICBpZiAoYWN0aXZhdGVUcmFwKCkgJiYgZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59O1xudmFyIG9uQmx1ciA9IGZ1bmN0aW9uIG9uQmx1cigpIHtcbiAgcmV0dXJuIGRlZmVyQWN0aW9uKGFjdGl2YXRlVHJhcCk7XG59O1xudmFyIG9uRm9jdXMgPSBmdW5jdGlvbiBvbkZvY3VzKGV2ZW50KSB7XG4gIHZhciBzb3VyY2UgPSBldmVudC50YXJnZXQ7XG4gIHZhciBjdXJyZW50Tm9kZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGlmICghY3VycmVudE5vZGUuY29udGFpbnMoc291cmNlKSkge1xuICAgIHJlY29yZFBvcnRhbChjdXJyZW50Tm9kZSwgc291cmNlKTtcbiAgfVxufTtcbnZhciBGb2N1c1dhdGNoZXIgPSBmdW5jdGlvbiBGb2N1c1dhdGNoZXIoKSB7XG4gIHJldHVybiBudWxsO1xufTtcbnZhciBGb2N1c1RyYXAgPSBmdW5jdGlvbiBGb2N1c1RyYXAoX3JlZjQpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZjQuY2hpbGRyZW47XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgb25CbHVyOiBvbkJsdXIsXG4gICAgb25Gb2N1czogb25Gb2N1c1xuICB9LCBjaGlsZHJlbik7XG59O1xuRm9jdXNUcmFwLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWRcbn0gOiB7fTtcbnZhciBvbldpbmRvd0JsdXIgPSBmdW5jdGlvbiBvbldpbmRvd0JsdXIoKSB7XG4gIGZvY3VzV2FzT3V0c2lkZVdpbmRvdyA9ICdqdXN0JztcbiAgZGVmZXJBY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgIGZvY3VzV2FzT3V0c2lkZVdpbmRvdyA9ICdtZWFud2hpbGUnO1xuICB9KTtcbn07XG52YXIgYXR0YWNoSGFuZGxlciA9IGZ1bmN0aW9uIGF0dGFjaEhhbmRsZXIoKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvblRyYXApO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uQmx1cik7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgb25XaW5kb3dCbHVyKTtcbn07XG52YXIgZGV0YWNoSGFuZGxlciA9IGZ1bmN0aW9uIGRldGFjaEhhbmRsZXIoKSB7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvblRyYXApO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uQmx1cik7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgb25XaW5kb3dCbHVyKTtcbn07XG5mdW5jdGlvbiByZWR1Y2VQcm9wc1RvU3RhdGUocHJvcHNMaXN0KSB7XG4gIHJldHVybiBwcm9wc0xpc3QuZmlsdGVyKGZ1bmN0aW9uIChfcmVmNSkge1xuICAgIHZhciBkaXNhYmxlZCA9IF9yZWY1LmRpc2FibGVkO1xuICAgIHJldHVybiAhZGlzYWJsZWQ7XG4gIH0pO1xufVxudmFyIGZvY3VzTG9ja0FQSSA9IHtcbiAgbW92ZUZvY3VzSW5zaWRlOiBtb3ZlRm9jdXNJbnNpZGUsXG4gIGZvY3VzSW5zaWRlOiBmb2N1c0luc2lkZSxcbiAgZm9jdXNOZXh0RWxlbWVudDogZm9jdXNOZXh0RWxlbWVudCxcbiAgZm9jdXNQcmV2RWxlbWVudDogZm9jdXNQcmV2RWxlbWVudCxcbiAgZm9jdXNGaXJzdEVsZW1lbnQ6IGZvY3VzRmlyc3RFbGVtZW50LFxuICBmb2N1c0xhc3RFbGVtZW50OiBmb2N1c0xhc3RFbGVtZW50LFxuICBjYXB0dXJlRm9jdXNSZXN0b3JlOiBjYXB0dXJlRm9jdXNSZXN0b3JlXG59O1xuZnVuY3Rpb24gaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCh0cmFwcykge1xuICB2YXIgdHJhcCA9IHRyYXBzLnNsaWNlKC0xKVswXTtcbiAgaWYgKHRyYXAgJiYgIWxhc3RBY3RpdmVUcmFwKSB7XG4gICAgYXR0YWNoSGFuZGxlcigpO1xuICB9XG4gIHZhciBsYXN0VHJhcCA9IGxhc3RBY3RpdmVUcmFwO1xuICB2YXIgc2FtZVRyYXAgPSBsYXN0VHJhcCAmJiB0cmFwICYmIHRyYXAuaWQgPT09IGxhc3RUcmFwLmlkO1xuICBsYXN0QWN0aXZlVHJhcCA9IHRyYXA7XG4gIGlmIChsYXN0VHJhcCAmJiAhc2FtZVRyYXApIHtcbiAgICBsYXN0VHJhcC5vbkRlYWN0aXZhdGlvbigpO1xuICAgIGlmICghdHJhcHMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmNikge1xuICAgICAgdmFyIGlkID0gX3JlZjYuaWQ7XG4gICAgICByZXR1cm4gaWQgPT09IGxhc3RUcmFwLmlkO1xuICAgIH0pLmxlbmd0aCkge1xuICAgICAgbGFzdFRyYXAucmV0dXJuRm9jdXMoIXRyYXApO1xuICAgIH1cbiAgfVxuICBpZiAodHJhcCkge1xuICAgIGxhc3RBY3RpdmVGb2N1cyA9IG51bGw7XG4gICAgaWYgKCFzYW1lVHJhcCB8fCBsYXN0VHJhcC5vYnNlcnZlZCAhPT0gdHJhcC5vYnNlcnZlZCkge1xuICAgICAgdHJhcC5vbkFjdGl2YXRpb24oZm9jdXNMb2NrQVBJKTtcbiAgICB9XG4gICAgYWN0aXZhdGVUcmFwKHRydWUpO1xuICAgIGRlZmVyQWN0aW9uKGFjdGl2YXRlVHJhcCk7XG4gIH0gZWxzZSB7XG4gICAgZGV0YWNoSGFuZGxlcigpO1xuICAgIGxhc3RBY3RpdmVGb2N1cyA9IG51bGw7XG4gIH1cbn1cbm1lZGl1bUZvY3VzLmFzc2lnblN5bmNNZWRpdW0ob25Gb2N1cyk7XG5tZWRpdW1CbHVyLmFzc2lnbk1lZGl1bShvbkJsdXIpO1xubWVkaXVtRWZmZWN0LmFzc2lnbk1lZGl1bShmdW5jdGlvbiAoY2IpIHtcbiAgcmV0dXJuIGNiKGZvY3VzTG9ja0FQSSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTaWRlRWZmZWN0KHJlZHVjZVByb3BzVG9TdGF0ZSwgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCkoRm9jdXNXYXRjaGVyKTsiLCJpbXBvcnQgRm9jdXNMb2NrVUkgZnJvbSAnLi9Mb2NrJztcbmltcG9ydCBBdXRvRm9jdXNJbnNpZGUgZnJvbSAnLi9BdXRvRm9jdXNJbnNpZGUnO1xuaW1wb3J0IE1vdmVGb2N1c0luc2lkZSwgeyB1c2VGb2N1c0luc2lkZSB9IGZyb20gJy4vTW92ZUZvY3VzSW5zaWRlJztcbmltcG9ydCBGcmVlRm9jdXNJbnNpZGUgZnJvbSAnLi9GcmVlRm9jdXNJbnNpZGUnO1xuaW1wb3J0IEluRm9jdXNHdWFyZCBmcm9tICcuL0ZvY3VzR3VhcmQnO1xuaW1wb3J0IHsgdXNlRm9jdXNDb250cm9sbGVyLCB1c2VGb2N1c1Njb3BlIH0gZnJvbSAnLi91c2UtZm9jdXMtc2NvcGUnO1xuaW1wb3J0IHsgdXNlRm9jdXNTdGF0ZSB9IGZyb20gJy4vdXNlLWZvY3VzLXN0YXRlJztcbmV4cG9ydCB7IEF1dG9Gb2N1c0luc2lkZSwgTW92ZUZvY3VzSW5zaWRlLCBGcmVlRm9jdXNJbnNpZGUsIEluRm9jdXNHdWFyZCwgRm9jdXNMb2NrVUksIHVzZUZvY3VzSW5zaWRlLCB1c2VGb2N1c0NvbnRyb2xsZXIsIHVzZUZvY3VzU2NvcGUsIHVzZUZvY3VzU3RhdGUgfTtcbmV4cG9ydCBkZWZhdWx0IEZvY3VzTG9ja1VJOyIsImltcG9ydCBGb2N1c0xvY2sgZnJvbSAnLi9Db21iaW5hdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL1VJJztcbmV4cG9ydCBkZWZhdWx0IEZvY3VzTG9jazsiLCJpbXBvcnQgeyBjcmVhdGVNZWRpdW0sIGNyZWF0ZVNpZGVjYXJNZWRpdW0gfSBmcm9tICd1c2Utc2lkZWNhcic7XG5leHBvcnQgdmFyIG1lZGl1bUZvY3VzID0gY3JlYXRlTWVkaXVtKHt9LCBmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgdGFyZ2V0ID0gX3JlZi50YXJnZXQsXG4gICAgY3VycmVudFRhcmdldCA9IF9yZWYuY3VycmVudFRhcmdldDtcbiAgcmV0dXJuIHtcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0XG4gIH07XG59KTtcbmV4cG9ydCB2YXIgbWVkaXVtQmx1ciA9IGNyZWF0ZU1lZGl1bSgpO1xuZXhwb3J0IHZhciBtZWRpdW1FZmZlY3QgPSBjcmVhdGVNZWRpdW0oKTtcbmV4cG9ydCB2YXIgbWVkaXVtU2lkZWNhciA9IGNyZWF0ZVNpZGVjYXJNZWRpdW0oe1xuICBhc3luYzogdHJ1ZSxcbiAgc3NyOiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG59KTsiLCJleHBvcnQgdmFyIGNyZWF0ZU5hbm9FdmVudHMgPSBmdW5jdGlvbiBjcmVhdGVOYW5vRXZlbnRzKCkge1xuICByZXR1cm4ge1xuICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMCwgY2FsbGJhY2tzID0gdGhpcy5ldmVudHNbZXZlbnRdIHx8IFtdLCBsZW5ndGggPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KGNhbGxiYWNrcywgYXJncyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBldmVudHM6IHt9LFxuICAgIG9uOiBmdW5jdGlvbiBvbihldmVudCwgY2IpIHtcbiAgICAgIHZhciBfdGhpcyRldmVudHMsXG4gICAgICAgIF90aGlzID0gdGhpcztcbiAgICAgICgoX3RoaXMkZXZlbnRzID0gdGhpcy5ldmVudHMpW2V2ZW50XSB8fCAoX3RoaXMkZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChjYik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMkZXZlbnRzJGV2ZW50O1xuICAgICAgICBfdGhpcy5ldmVudHNbZXZlbnRdID0gKF90aGlzJGV2ZW50cyRldmVudCA9IF90aGlzLmV2ZW50c1tldmVudF0pID09IG51bGwgPyB2b2lkIDAgOiBfdGhpcyRldmVudHMkZXZlbnQuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgcmV0dXJuIGNiICE9PSBpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTsiLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBmb2N1c1Njb3BlID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZvY3VzU2NvcGUgfSBmcm9tICcuL3Njb3BlJztcbmltcG9ydCB7IG1lZGl1bUVmZmVjdCB9IGZyb20gJy4vbWVkaXVtJztcbmltcG9ydCB7IGV4dHJhY3RSZWYgfSBmcm9tICcuL3V0aWwnO1xudmFyIGNvbGxhcHNlUmVmcyA9IGZ1bmN0aW9uIGNvbGxhcHNlUmVmcyhzaGFyZHMpIHtcbiAgcmV0dXJuIHNoYXJkcy5tYXAoZXh0cmFjdFJlZikuZmlsdGVyKEJvb2xlYW4pO1xufTtcbnZhciB3aXRoTWVkaXVtID0gZnVuY3Rpb24gd2l0aE1lZGl1bShmbikge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICByZXR1cm4gbWVkaXVtRWZmZWN0LnVzZU1lZGl1bShmdW5jdGlvbiAoKSB7XG4gICAgICByZXNvbHZlKGZuLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKSk7XG4gICAgfSk7XG4gIH0pO1xufTtcbmV4cG9ydCB2YXIgdXNlRm9jdXNDb250cm9sbGVyID0gZnVuY3Rpb24gdXNlRm9jdXNDb250cm9sbGVyKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc2hhcmRzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHNoYXJkc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICBpZiAoIXNoYXJkcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUZvY3VzQ29udHJvbGxlciByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdGFyZ2V0IGVsZW1lbnQnKTtcbiAgfVxuICB2YXIgcmVmID0gdXNlUmVmKHNoYXJkcyk7XG4gIHJlZi5jdXJyZW50ID0gc2hhcmRzO1xuICByZXR1cm4gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF1dG9Gb2N1czogZnVuY3Rpb24gYXV0b0ZvY3VzKGZvY3VzT3B0aW9ucykge1xuICAgICAgICBpZiAoZm9jdXNPcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgICAgICBmb2N1c09wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2l0aE1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhci5tb3ZlRm9jdXNJbnNpZGUoY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KSwgbnVsbCwgZm9jdXNPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZm9jdXNOZXh0OiBmdW5jdGlvbiBmb2N1c05leHQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gd2l0aE1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICAgICAgY2FyLm1vdmVGb2N1c0luc2lkZShjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpLCBudWxsKTtcbiAgICAgICAgICBjYXIuZm9jdXNOZXh0RWxlbWVudChkb2N1bWVudC5hY3RpdmVFbGVtZW50LCBfZXh0ZW5kcyh7XG4gICAgICAgICAgICBzY29wZTogY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KVxuICAgICAgICAgIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZm9jdXNQcmV2OiBmdW5jdGlvbiBmb2N1c1ByZXYob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gd2l0aE1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICAgICAgY2FyLm1vdmVGb2N1c0luc2lkZShjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpLCBudWxsKTtcbiAgICAgICAgICBjYXIuZm9jdXNQcmV2RWxlbWVudChkb2N1bWVudC5hY3RpdmVFbGVtZW50LCBfZXh0ZW5kcyh7XG4gICAgICAgICAgICBzY29wZTogY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KVxuICAgICAgICAgIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZm9jdXNGaXJzdDogZnVuY3Rpb24gZm9jdXNGaXJzdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB3aXRoTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgICAgICBjYXIuZm9jdXNGaXJzdEVsZW1lbnQoY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KSwgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZvY3VzTGFzdDogZnVuY3Rpb24gZm9jdXNMYXN0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhNZWRpdW0oZnVuY3Rpb24gKGNhcikge1xuICAgICAgICAgIGNhci5mb2N1c0xhc3RFbGVtZW50KGNvbGxhcHNlUmVmcyhyZWYuY3VycmVudCksIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG59O1xuZXhwb3J0IHZhciB1c2VGb2N1c1Njb3BlID0gZnVuY3Rpb24gdXNlRm9jdXNTY29wZSgpIHtcbiAgdmFyIHNjb3BlID0gdXNlQ29udGV4dChmb2N1c1Njb3BlKTtcbiAgaWYgKCFzY29wZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRm9jdXNMb2NrIGlzIHJlcXVpcmVkIHRvIG9wZXJhdGUgd2l0aCBGb2N1c1Njb3BlJyk7XG4gIH1cbiAgcmV0dXJuIHVzZUZvY3VzQ29udHJvbGxlci5hcHBseSh2b2lkIDAsIFtzY29wZS5vYnNlcnZlZF0uY29uY2F0KHNjb3BlLnNoYXJkcykpO1xufTsiLCJpbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlTmFub0V2ZW50cyB9IGZyb20gJy4vbmFuby1ldmVudHMnO1xudmFyIG1haW5idXMgPSBjcmVhdGVOYW5vRXZlbnRzKCk7XG52YXIgc3Vic2NyaWJlQ291bnRlciA9IDA7XG52YXIgb25Gb2N1c0luID0gZnVuY3Rpb24gb25Gb2N1c0luKGV2ZW50KSB7XG4gIHJldHVybiBtYWluYnVzLmVtaXQoJ2Fzc2lnbicsIGV2ZW50LnRhcmdldCk7XG59O1xudmFyIG9uRm9jdXNPdXQgPSBmdW5jdGlvbiBvbkZvY3VzT3V0KGV2ZW50KSB7XG4gIHJldHVybiBtYWluYnVzLmVtaXQoJ3Jlc2V0JywgZXZlbnQudGFyZ2V0KTtcbn07XG52YXIgdXNlRG9jdW1lbnRGb2N1c1N1YnNjcmliZSA9IGZ1bmN0aW9uIHVzZURvY3VtZW50Rm9jdXNTdWJzY3JpYmUoKSB7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzdWJzY3JpYmVDb3VudGVyKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgb25Gb2N1c0luKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25Gb2N1c091dCk7XG4gICAgfVxuICAgIHN1YnNjcmliZUNvdW50ZXIgKz0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc3Vic2NyaWJlQ291bnRlciAtPSAxO1xuICAgICAgaWYgKCFzdWJzY3JpYmVDb3VudGVyKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvbkZvY3VzSW4pO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXNPdXQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcbn07XG52YXIgZ2V0Rm9jdXNTdGF0ZSA9IGZ1bmN0aW9uIGdldEZvY3VzU3RhdGUodGFyZ2V0LCBjdXJyZW50KSB7XG4gIGlmICh0YXJnZXQgPT09IGN1cnJlbnQpIHtcbiAgICByZXR1cm4gJ3NlbGYnO1xuICB9XG4gIGlmIChjdXJyZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICByZXR1cm4gJ3dpdGhpbic7XG4gIH1cbiAgcmV0dXJuICd3aXRoaW4tYm91bmRhcnknO1xufTtcbmV4cG9ydCB2YXIgdXNlRm9jdXNTdGF0ZSA9IGZ1bmN0aW9uIHVzZUZvY3VzU3RhdGUoY2FsbGJhY2tzKSB7XG4gIGlmIChjYWxsYmFja3MgPT09IHZvaWQgMCkge1xuICAgIGNhbGxiYWNrcyA9IHt9O1xuICB9XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgYWN0aXZlID0gX3VzZVN0YXRlWzBdLFxuICAgIHNldEFjdGl2ZSA9IF91c2VTdGF0ZVsxXTtcbiAgdmFyIF91c2VTdGF0ZTIgPSB1c2VTdGF0ZSgnJyksXG4gICAgc3RhdGUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldFN0YXRlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIHJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGZvY3VzU3RhdGUgPSB1c2VSZWYoe30pO1xuICB2YXIgc3RhdGVUcmFja2VyID0gdXNlUmVmKGZhbHNlKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBpc0FscmVhZHlGb2N1c2VkID0gcmVmLmN1cnJlbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgcmVmLmN1cnJlbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gICAgICBzZXRBY3RpdmUoaXNBbHJlYWR5Rm9jdXNlZCk7XG4gICAgICBzZXRTdGF0ZShnZXRGb2N1c1N0YXRlKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIHJlZi5jdXJyZW50KSk7XG4gICAgICBpZiAoaXNBbHJlYWR5Rm9jdXNlZCAmJiBjYWxsYmFja3Mub25Gb2N1cykge1xuICAgICAgICBjYWxsYmFja3Mub25Gb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW10pO1xuICB2YXIgb25Gb2N1cyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChlKSB7XG4gICAgZm9jdXNTdGF0ZS5jdXJyZW50ID0ge1xuICAgICAgZm9jdXNlZDogdHJ1ZSxcbiAgICAgIHN0YXRlOiBnZXRGb2N1c1N0YXRlKGUudGFyZ2V0LCBlLmN1cnJlbnRUYXJnZXQpXG4gICAgfTtcbiAgfSwgW10pO1xuICB1c2VEb2N1bWVudEZvY3VzU3Vic2NyaWJlKCk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZvdXQgPSBtYWluYnVzLm9uKCdyZXNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvY3VzU3RhdGUuY3VycmVudCA9IHt9O1xuICAgIH0pO1xuICAgIHZhciBmaW4gPSBtYWluYnVzLm9uKCdhc3NpZ24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBmb2N1c1N0YXRlLmN1cnJlbnQuZm9jdXNlZCB8fCBmYWxzZTtcbiAgICAgIHNldEFjdGl2ZShuZXdTdGF0ZSk7XG4gICAgICBzZXRTdGF0ZShmb2N1c1N0YXRlLmN1cnJlbnQuc3RhdGUgfHwgJycpO1xuICAgICAgaWYgKG5ld1N0YXRlICE9PSBzdGF0ZVRyYWNrZXIuY3VycmVudCkge1xuICAgICAgICBzdGF0ZVRyYWNrZXIuY3VycmVudCA9IG5ld1N0YXRlO1xuICAgICAgICBpZiAobmV3U3RhdGUpIHtcbiAgICAgICAgICBjYWxsYmFja3Mub25Gb2N1cyAmJiBjYWxsYmFja3Mub25Gb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrcy5vbkJsdXIgJiYgY2FsbGJhY2tzLm9uQmx1cigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvdXQoKTtcbiAgICAgIGZpbigpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIHtcbiAgICBhY3RpdmU6IGFjdGl2ZSxcbiAgICBzdGF0ZTogc3RhdGUsXG4gICAgb25Gb2N1czogb25Gb2N1cyxcbiAgICByZWY6IHJlZlxuICB9O1xufTsiLCJleHBvcnQgZnVuY3Rpb24gZGVmZXJBY3Rpb24oYWN0aW9uKSB7XG4gIHNldFRpbWVvdXQoYWN0aW9uLCAxKTtcbn1cbmV4cG9ydCB2YXIgaW5saW5lUHJvcCA9IGZ1bmN0aW9uIGlubGluZVByb3AobmFtZSwgdmFsdWUpIHtcbiAgdmFyIG9iaiA9IHt9O1xuICBvYmpbbmFtZV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn07XG5leHBvcnQgdmFyIGV4dHJhY3RSZWYgPSBmdW5jdGlvbiBleHRyYWN0UmVmKHJlZikge1xuICByZXR1cm4gcmVmICYmICdjdXJyZW50JyBpbiByZWYgPyByZWYuY3VycmVudCA6IHJlZjtcbn07IiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB3aXRoU2lkZUVmZmVjdCBmcm9tICdyZWFjdC1zaWRlLWVmZmVjdCc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdyZWFjdC1mYXN0LWNvbXBhcmUnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBvYmplY3RBc3NpZ24gZnJvbSAnb2JqZWN0LWFzc2lnbic7XG5cbnZhciBBVFRSSUJVVEVfTkFNRVMgPSB7XG4gICAgQk9EWTogXCJib2R5QXR0cmlidXRlc1wiLFxuICAgIEhUTUw6IFwiaHRtbEF0dHJpYnV0ZXNcIixcbiAgICBUSVRMRTogXCJ0aXRsZUF0dHJpYnV0ZXNcIlxufTtcblxudmFyIFRBR19OQU1FUyA9IHtcbiAgICBCQVNFOiBcImJhc2VcIixcbiAgICBCT0RZOiBcImJvZHlcIixcbiAgICBIRUFEOiBcImhlYWRcIixcbiAgICBIVE1MOiBcImh0bWxcIixcbiAgICBMSU5LOiBcImxpbmtcIixcbiAgICBNRVRBOiBcIm1ldGFcIixcbiAgICBOT1NDUklQVDogXCJub3NjcmlwdFwiLFxuICAgIFNDUklQVDogXCJzY3JpcHRcIixcbiAgICBTVFlMRTogXCJzdHlsZVwiLFxuICAgIFRJVExFOiBcInRpdGxlXCJcbn07XG5cbnZhciBWQUxJRF9UQUdfTkFNRVMgPSBPYmplY3Qua2V5cyhUQUdfTkFNRVMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBUQUdfTkFNRVNbbmFtZV07XG59KTtcblxudmFyIFRBR19QUk9QRVJUSUVTID0ge1xuICAgIENIQVJTRVQ6IFwiY2hhcnNldFwiLFxuICAgIENTU19URVhUOiBcImNzc1RleHRcIixcbiAgICBIUkVGOiBcImhyZWZcIixcbiAgICBIVFRQRVFVSVY6IFwiaHR0cC1lcXVpdlwiLFxuICAgIElOTkVSX0hUTUw6IFwiaW5uZXJIVE1MXCIsXG4gICAgSVRFTV9QUk9QOiBcIml0ZW1wcm9wXCIsXG4gICAgTkFNRTogXCJuYW1lXCIsXG4gICAgUFJPUEVSVFk6IFwicHJvcGVydHlcIixcbiAgICBSRUw6IFwicmVsXCIsXG4gICAgU1JDOiBcInNyY1wiLFxuICAgIFRBUkdFVDogXCJ0YXJnZXRcIlxufTtcblxudmFyIFJFQUNUX1RBR19NQVAgPSB7XG4gICAgYWNjZXNza2V5OiBcImFjY2Vzc0tleVwiLFxuICAgIGNoYXJzZXQ6IFwiY2hhclNldFwiLFxuICAgIGNsYXNzOiBcImNsYXNzTmFtZVwiLFxuICAgIGNvbnRlbnRlZGl0YWJsZTogXCJjb250ZW50RWRpdGFibGVcIixcbiAgICBjb250ZXh0bWVudTogXCJjb250ZXh0TWVudVwiLFxuICAgIFwiaHR0cC1lcXVpdlwiOiBcImh0dHBFcXVpdlwiLFxuICAgIGl0ZW1wcm9wOiBcIml0ZW1Qcm9wXCIsXG4gICAgdGFiaW5kZXg6IFwidGFiSW5kZXhcIlxufTtcblxudmFyIEhFTE1FVF9QUk9QUyA9IHtcbiAgICBERUZBVUxUX1RJVExFOiBcImRlZmF1bHRUaXRsZVwiLFxuICAgIERFRkVSOiBcImRlZmVyXCIsXG4gICAgRU5DT0RFX1NQRUNJQUxfQ0hBUkFDVEVSUzogXCJlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyc1wiLFxuICAgIE9OX0NIQU5HRV9DTElFTlRfU1RBVEU6IFwib25DaGFuZ2VDbGllbnRTdGF0ZVwiLFxuICAgIFRJVExFX1RFTVBMQVRFOiBcInRpdGxlVGVtcGxhdGVcIlxufTtcblxudmFyIEhUTUxfVEFHX01BUCA9IE9iamVjdC5rZXlzKFJFQUNUX1RBR19NQVApLnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgICBvYmpbUkVBQ1RfVEFHX01BUFtrZXldXSA9IGtleTtcbiAgICByZXR1cm4gb2JqO1xufSwge30pO1xuXG52YXIgU0VMRl9DTE9TSU5HX1RBR1MgPSBbVEFHX05BTUVTLk5PU0NSSVBULCBUQUdfTkFNRVMuU0NSSVBULCBUQUdfTkFNRVMuU1RZTEVdO1xuXG52YXIgSEVMTUVUX0FUVFJJQlVURSA9IFwiZGF0YS1yZWFjdC1oZWxtZXRcIjtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59O1xuXG52YXIgY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xuXG52YXIgb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzKSB7XG4gIHZhciB0YXJnZXQgPSB7fTtcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7XG4gICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gZnVuY3Rpb24gKHNlbGYsIGNhbGwpIHtcbiAgaWYgKCFzZWxmKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7XG59O1xuXG52YXIgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMgPSBmdW5jdGlvbiBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVycyhzdHIpIHtcbiAgICB2YXIgZW5jb2RlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuXG4gICAgaWYgKGVuY29kZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhzdHIpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvPi9nLCBcIiZndDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiYjeDI3O1wiKTtcbn07XG5cbnZhciBnZXRUaXRsZUZyb21Qcm9wc0xpc3QgPSBmdW5jdGlvbiBnZXRUaXRsZUZyb21Qcm9wc0xpc3QocHJvcHNMaXN0KSB7XG4gICAgdmFyIGlubmVybW9zdFRpdGxlID0gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBUQUdfTkFNRVMuVElUTEUpO1xuICAgIHZhciBpbm5lcm1vc3RUZW1wbGF0ZSA9IGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgSEVMTUVUX1BST1BTLlRJVExFX1RFTVBMQVRFKTtcblxuICAgIGlmIChpbm5lcm1vc3RUZW1wbGF0ZSAmJiBpbm5lcm1vc3RUaXRsZSkge1xuICAgICAgICAvLyB1c2UgZnVuY3Rpb24gYXJnIHRvIGF2b2lkIG5lZWQgdG8gZXNjYXBlICQgY2hhcmFjdGVyc1xuICAgICAgICByZXR1cm4gaW5uZXJtb3N0VGVtcGxhdGUucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5uZXJtb3N0VGl0bGUpID8gaW5uZXJtb3N0VGl0bGUuam9pbihcIlwiKSA6IGlubmVybW9zdFRpdGxlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgaW5uZXJtb3N0RGVmYXVsdFRpdGxlID0gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuREVGQVVMVF9USVRMRSk7XG5cbiAgICByZXR1cm4gaW5uZXJtb3N0VGl0bGUgfHwgaW5uZXJtb3N0RGVmYXVsdFRpdGxlIHx8IHVuZGVmaW5lZDtcbn07XG5cbnZhciBnZXRPbkNoYW5nZUNsaWVudFN0YXRlID0gZnVuY3Rpb24gZ2V0T25DaGFuZ2VDbGllbnRTdGF0ZShwcm9wc0xpc3QpIHtcbiAgICByZXR1cm4gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuT05fQ0hBTkdFX0NMSUVOVF9TVEFURSkgfHwgZnVuY3Rpb24gKCkge307XG59O1xuXG52YXIgZ2V0QXR0cmlidXRlc0Zyb21Qcm9wc0xpc3QgPSBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdCh0YWdUeXBlLCBwcm9wc0xpc3QpIHtcbiAgICByZXR1cm4gcHJvcHNMaXN0LmZpbHRlcihmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwcm9wc1t0YWdUeXBlXSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBwcm9wc1t0YWdUeXBlXTtcbiAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHRhZ0F0dHJzLCBjdXJyZW50KSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgdGFnQXR0cnMsIGN1cnJlbnQpO1xuICAgIH0sIHt9KTtcbn07XG5cbnZhciBnZXRCYXNlVGFnRnJvbVByb3BzTGlzdCA9IGZ1bmN0aW9uIGdldEJhc2VUYWdGcm9tUHJvcHNMaXN0KHByaW1hcnlBdHRyaWJ1dGVzLCBwcm9wc0xpc3QpIHtcbiAgICByZXR1cm4gcHJvcHNMaXN0LmZpbHRlcihmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwcm9wc1tUQUdfTkFNRVMuQkFTRV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICByZXR1cm4gcHJvcHNbVEFHX05BTUVTLkJBU0VdO1xuICAgIH0pLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGlubmVybW9zdEJhc2VUYWcsIHRhZykge1xuICAgICAgICBpZiAoIWlubmVybW9zdEJhc2VUYWcubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRhZyk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVLZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPSBhdHRyaWJ1dGVLZXkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5QXR0cmlidXRlcy5pbmRleE9mKGxvd2VyQ2FzZUF0dHJpYnV0ZUtleSkgIT09IC0xICYmIHRhZ1tsb3dlckNhc2VBdHRyaWJ1dGVLZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcm1vc3RCYXNlVGFnLmNvbmNhdCh0YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbm5lcm1vc3RCYXNlVGFnO1xuICAgIH0sIFtdKTtcbn07XG5cbnZhciBnZXRUYWdzRnJvbVByb3BzTGlzdCA9IGZ1bmN0aW9uIGdldFRhZ3NGcm9tUHJvcHNMaXN0KHRhZ05hbWUsIHByaW1hcnlBdHRyaWJ1dGVzLCBwcm9wc0xpc3QpIHtcbiAgICAvLyBDYWxjdWxhdGUgbGlzdCBvZiB0YWdzLCBnaXZpbmcgcHJpb3JpdHkgaW5uZXJtb3N0IGNvbXBvbmVudCAoZW5kIG9mIHRoZSBwcm9wc2xpc3QpXG4gICAgdmFyIGFwcHJvdmVkU2VlblRhZ3MgPSB7fTtcblxuICAgIHJldHVybiBwcm9wc0xpc3QuZmlsdGVyKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wc1t0YWdOYW1lXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcHNbdGFnTmFtZV0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHdhcm4oXCJIZWxtZXQ6IFwiICsgdGFnTmFtZSArIFwiIHNob3VsZCBiZSBvZiB0eXBlIFxcXCJBcnJheVxcXCIuIEluc3RlYWQgZm91bmQgdHlwZSBcXFwiXCIgKyBfdHlwZW9mKHByb3BzW3RhZ05hbWVdKSArIFwiXFxcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICByZXR1cm4gcHJvcHNbdGFnTmFtZV07XG4gICAgfSkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoYXBwcm92ZWRUYWdzLCBpbnN0YW5jZVRhZ3MpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlU2VlblRhZ3MgPSB7fTtcblxuICAgICAgICBpbnN0YW5jZVRhZ3MuZmlsdGVyKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICAgIHZhciBwcmltYXJ5QXR0cmlidXRlS2V5ID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0YWcpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZUtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGxvd2VyQ2FzZUF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZUtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBydWxlIHdpdGggbGluayB0YWdzLCBzaW5jZSByZWwgYW5kIGhyZWYgYXJlIGJvdGggcHJpbWFyeSB0YWdzLCByZWwgdGFrZXMgcHJpb3JpdHlcbiAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihsb3dlckNhc2VBdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiAhKHByaW1hcnlBdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLlJFTCAmJiB0YWdbcHJpbWFyeUF0dHJpYnV0ZUtleV0udG9Mb3dlckNhc2UoKSA9PT0gXCJjYW5vbmljYWxcIikgJiYgIShsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLlJFTCAmJiB0YWdbbG93ZXJDYXNlQXR0cmlidXRlS2V5XS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUF0dHJpYnV0ZUtleSA9IGxvd2VyQ2FzZUF0dHJpYnV0ZUtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBpbm5lckhUTUwgd2hpY2ggZG9lc24ndCB3b3JrIGxvd2VyY2FzZWRcbiAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihhdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiAoYXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MIHx8IGF0dHJpYnV0ZUtleSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQgfHwgYXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5JVEVNX1BST1ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlBdHRyaWJ1dGVLZXkgPSBhdHRyaWJ1dGVLZXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXByaW1hcnlBdHRyaWJ1dGVLZXkgfHwgIXRhZ1twcmltYXJ5QXR0cmlidXRlS2V5XSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGFnW3ByaW1hcnlBdHRyaWJ1dGVLZXldLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmICghYXBwcm92ZWRTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSkge1xuICAgICAgICAgICAgICAgIGFwcHJvdmVkU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpbnN0YW5jZVNlZW5UYWdzW3ByaW1hcnlBdHRyaWJ1dGVLZXldKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWFwcHJvdmVkU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV1bdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XVt2YWx1ZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHByb3ZlZFRhZ3MucHVzaCh0YWcpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVcGRhdGUgc2VlbiB0YWdzIHdpdGggdGFncyBmcm9tIHRoaXMgaW5zdGFuY2VcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhpbnN0YW5jZVNlZW5UYWdzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYXR0cmlidXRlS2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgIHZhciB0YWdVbmlvbiA9IG9iamVjdEFzc2lnbih7fSwgYXBwcm92ZWRTZWVuVGFnc1thdHRyaWJ1dGVLZXldLCBpbnN0YW5jZVNlZW5UYWdzW2F0dHJpYnV0ZUtleV0pO1xuXG4gICAgICAgICAgICBhcHByb3ZlZFNlZW5UYWdzW2F0dHJpYnV0ZUtleV0gPSB0YWdVbmlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcHByb3ZlZFRhZ3M7XG4gICAgfSwgW10pLnJldmVyc2UoKTtcbn07XG5cbnZhciBnZXRJbm5lcm1vc3RQcm9wZXJ0eSA9IGZ1bmN0aW9uIGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgcHJvcGVydHkpIHtcbiAgICBmb3IgKHZhciBpID0gcHJvcHNMaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHByb3BzTGlzdFtpXTtcblxuICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHNbcHJvcGVydHldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgcmVkdWNlUHJvcHNUb1N0YXRlID0gZnVuY3Rpb24gcmVkdWNlUHJvcHNUb1N0YXRlKHByb3BzTGlzdCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGJhc2VUYWc6IGdldEJhc2VUYWdGcm9tUHJvcHNMaXN0KFtUQUdfUFJPUEVSVElFUy5IUkVGLCBUQUdfUFJPUEVSVElFUy5UQVJHRVRdLCBwcm9wc0xpc3QpLFxuICAgICAgICBib2R5QXR0cmlidXRlczogZ2V0QXR0cmlidXRlc0Zyb21Qcm9wc0xpc3QoQVRUUklCVVRFX05BTUVTLkJPRFksIHByb3BzTGlzdCksXG4gICAgICAgIGRlZmVyOiBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIEhFTE1FVF9QUk9QUy5ERUZFUiksXG4gICAgICAgIGVuY29kZTogZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuRU5DT0RFX1NQRUNJQUxfQ0hBUkFDVEVSUyksXG4gICAgICAgIGh0bWxBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdChBVFRSSUJVVEVfTkFNRVMuSFRNTCwgcHJvcHNMaXN0KSxcbiAgICAgICAgbGlua1RhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5MSU5LLCBbVEFHX1BST1BFUlRJRVMuUkVMLCBUQUdfUFJPUEVSVElFUy5IUkVGXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgbWV0YVRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5NRVRBLCBbVEFHX1BST1BFUlRJRVMuTkFNRSwgVEFHX1BST1BFUlRJRVMuQ0hBUlNFVCwgVEFHX1BST1BFUlRJRVMuSFRUUEVRVUlWLCBUQUdfUFJPUEVSVElFUy5QUk9QRVJUWSwgVEFHX1BST1BFUlRJRVMuSVRFTV9QUk9QXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgbm9zY3JpcHRUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuTk9TQ1JJUFQsIFtUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgb25DaGFuZ2VDbGllbnRTdGF0ZTogZ2V0T25DaGFuZ2VDbGllbnRTdGF0ZShwcm9wc0xpc3QpLFxuICAgICAgICBzY3JpcHRUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuU0NSSVBULCBbVEFHX1BST1BFUlRJRVMuU1JDLCBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgc3R5bGVUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuU1RZTEUsIFtUQUdfUFJPUEVSVElFUy5DU1NfVEVYVF0sIHByb3BzTGlzdCksXG4gICAgICAgIHRpdGxlOiBnZXRUaXRsZUZyb21Qcm9wc0xpc3QocHJvcHNMaXN0KSxcbiAgICAgICAgdGl0bGVBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdChBVFRSSUJVVEVfTkFNRVMuVElUTEUsIHByb3BzTGlzdClcbiAgICB9O1xufTtcblxudmFyIHJhZlBvbHlmaWxsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjbG9jayA9IERhdGUubm93KCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUaW1lIC0gY2xvY2sgPiAxNikge1xuICAgICAgICAgICAgY2xvY2sgPSBjdXJyZW50VGltZTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRUaW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJhZlBvbHlmaWxsKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgfTtcbn0oKTtcblxudmFyIGNhZlBvbHlmaWxsID0gZnVuY3Rpb24gY2FmUG9seWZpbGwoaWQpIHtcbiAgICByZXR1cm4gY2xlYXJUaW1lb3V0KGlkKTtcbn07XG5cbnZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgcmFmUG9seWZpbGwgOiBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHJhZlBvbHlmaWxsO1xuXG52YXIgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgY2FmUG9seWZpbGwgOiBnbG9iYWwuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgY2FmUG9seWZpbGw7XG5cbnZhciB3YXJuID0gZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgICByZXR1cm4gY29uc29sZSAmJiB0eXBlb2YgY29uc29sZS53YXJuID09PSBcImZ1bmN0aW9uXCIgJiYgY29uc29sZS53YXJuKG1zZyk7XG59O1xuXG52YXIgX2hlbG1ldENhbGxiYWNrID0gbnVsbDtcblxudmFyIGhhbmRsZUNsaWVudFN0YXRlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2xpZW50U3RhdGVDaGFuZ2UobmV3U3RhdGUpIHtcbiAgICBpZiAoX2hlbG1ldENhbGxiYWNrKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKF9oZWxtZXRDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgaWYgKG5ld1N0YXRlLmRlZmVyKSB7XG4gICAgICAgIF9oZWxtZXRDYWxsYmFjayA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb21taXRUYWdDaGFuZ2VzKG5ld1N0YXRlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX2hlbG1ldENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb21taXRUYWdDaGFuZ2VzKG5ld1N0YXRlKTtcbiAgICAgICAgX2hlbG1ldENhbGxiYWNrID0gbnVsbDtcbiAgICB9XG59O1xuXG52YXIgY29tbWl0VGFnQ2hhbmdlcyA9IGZ1bmN0aW9uIGNvbW1pdFRhZ0NoYW5nZXMobmV3U3RhdGUsIGNiKSB7XG4gICAgdmFyIGJhc2VUYWcgPSBuZXdTdGF0ZS5iYXNlVGFnLFxuICAgICAgICBib2R5QXR0cmlidXRlcyA9IG5ld1N0YXRlLmJvZHlBdHRyaWJ1dGVzLFxuICAgICAgICBodG1sQXR0cmlidXRlcyA9IG5ld1N0YXRlLmh0bWxBdHRyaWJ1dGVzLFxuICAgICAgICBsaW5rVGFncyA9IG5ld1N0YXRlLmxpbmtUYWdzLFxuICAgICAgICBtZXRhVGFncyA9IG5ld1N0YXRlLm1ldGFUYWdzLFxuICAgICAgICBub3NjcmlwdFRhZ3MgPSBuZXdTdGF0ZS5ub3NjcmlwdFRhZ3MsXG4gICAgICAgIG9uQ2hhbmdlQ2xpZW50U3RhdGUgPSBuZXdTdGF0ZS5vbkNoYW5nZUNsaWVudFN0YXRlLFxuICAgICAgICBzY3JpcHRUYWdzID0gbmV3U3RhdGUuc2NyaXB0VGFncyxcbiAgICAgICAgc3R5bGVUYWdzID0gbmV3U3RhdGUuc3R5bGVUYWdzLFxuICAgICAgICB0aXRsZSA9IG5ld1N0YXRlLnRpdGxlLFxuICAgICAgICB0aXRsZUF0dHJpYnV0ZXMgPSBuZXdTdGF0ZS50aXRsZUF0dHJpYnV0ZXM7XG5cbiAgICB1cGRhdGVBdHRyaWJ1dGVzKFRBR19OQU1FUy5CT0RZLCBib2R5QXR0cmlidXRlcyk7XG4gICAgdXBkYXRlQXR0cmlidXRlcyhUQUdfTkFNRVMuSFRNTCwgaHRtbEF0dHJpYnV0ZXMpO1xuXG4gICAgdXBkYXRlVGl0bGUodGl0bGUsIHRpdGxlQXR0cmlidXRlcyk7XG5cbiAgICB2YXIgdGFnVXBkYXRlcyA9IHtcbiAgICAgICAgYmFzZVRhZzogdXBkYXRlVGFncyhUQUdfTkFNRVMuQkFTRSwgYmFzZVRhZyksXG4gICAgICAgIGxpbmtUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5MSU5LLCBsaW5rVGFncyksXG4gICAgICAgIG1ldGFUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5NRVRBLCBtZXRhVGFncyksXG4gICAgICAgIG5vc2NyaXB0VGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuTk9TQ1JJUFQsIG5vc2NyaXB0VGFncyksXG4gICAgICAgIHNjcmlwdFRhZ3M6IHVwZGF0ZVRhZ3MoVEFHX05BTUVTLlNDUklQVCwgc2NyaXB0VGFncyksXG4gICAgICAgIHN0eWxlVGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuU1RZTEUsIHN0eWxlVGFncylcbiAgICB9O1xuXG4gICAgdmFyIGFkZGVkVGFncyA9IHt9O1xuICAgIHZhciByZW1vdmVkVGFncyA9IHt9O1xuXG4gICAgT2JqZWN0LmtleXModGFnVXBkYXRlcykuZm9yRWFjaChmdW5jdGlvbiAodGFnVHlwZSkge1xuICAgICAgICB2YXIgX3RhZ1VwZGF0ZXMkdGFnVHlwZSA9IHRhZ1VwZGF0ZXNbdGFnVHlwZV0sXG4gICAgICAgICAgICBuZXdUYWdzID0gX3RhZ1VwZGF0ZXMkdGFnVHlwZS5uZXdUYWdzLFxuICAgICAgICAgICAgb2xkVGFncyA9IF90YWdVcGRhdGVzJHRhZ1R5cGUub2xkVGFncztcblxuXG4gICAgICAgIGlmIChuZXdUYWdzLmxlbmd0aCkge1xuICAgICAgICAgICAgYWRkZWRUYWdzW3RhZ1R5cGVdID0gbmV3VGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAob2xkVGFncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlbW92ZWRUYWdzW3RhZ1R5cGVdID0gdGFnVXBkYXRlc1t0YWdUeXBlXS5vbGRUYWdzO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBjYiAmJiBjYigpO1xuXG4gICAgb25DaGFuZ2VDbGllbnRTdGF0ZShuZXdTdGF0ZSwgYWRkZWRUYWdzLCByZW1vdmVkVGFncyk7XG59O1xuXG52YXIgZmxhdHRlbkFycmF5ID0gZnVuY3Rpb24gZmxhdHRlbkFycmF5KHBvc3NpYmxlQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwb3NzaWJsZUFycmF5KSA/IHBvc3NpYmxlQXJyYXkuam9pbihcIlwiKSA6IHBvc3NpYmxlQXJyYXk7XG59O1xuXG52YXIgdXBkYXRlVGl0bGUgPSBmdW5jdGlvbiB1cGRhdGVUaXRsZSh0aXRsZSwgYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgdGl0bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnQudGl0bGUgIT09IHRpdGxlKSB7XG4gICAgICAgIGRvY3VtZW50LnRpdGxlID0gZmxhdHRlbkFycmF5KHRpdGxlKTtcbiAgICB9XG5cbiAgICB1cGRhdGVBdHRyaWJ1dGVzKFRBR19OQU1FUy5USVRMRSwgYXR0cmlidXRlcyk7XG59O1xuXG52YXIgdXBkYXRlQXR0cmlidXRlcyA9IGZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXModGFnTmFtZSwgYXR0cmlidXRlcykge1xuICAgIHZhciBlbGVtZW50VGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSlbMF07XG5cbiAgICBpZiAoIWVsZW1lbnRUYWcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBoZWxtZXRBdHRyaWJ1dGVTdHJpbmcgPSBlbGVtZW50VGFnLmdldEF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFKTtcbiAgICB2YXIgaGVsbWV0QXR0cmlidXRlcyA9IGhlbG1ldEF0dHJpYnV0ZVN0cmluZyA/IGhlbG1ldEF0dHJpYnV0ZVN0cmluZy5zcGxpdChcIixcIikgOiBbXTtcbiAgICB2YXIgYXR0cmlidXRlc1RvUmVtb3ZlID0gW10uY29uY2F0KGhlbG1ldEF0dHJpYnV0ZXMpO1xuICAgIHZhciBhdHRyaWJ1dGVLZXlzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUtleXNbaV07XG4gICAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlXSB8fCBcIlwiO1xuXG4gICAgICAgIGlmIChlbGVtZW50VGFnLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgZWxlbWVudFRhZy5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGVsbWV0QXR0cmlidXRlcy5pbmRleE9mKGF0dHJpYnV0ZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBoZWxtZXRBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRleFRvU2F2ZSA9IGF0dHJpYnV0ZXNUb1JlbW92ZS5pbmRleE9mKGF0dHJpYnV0ZSk7XG4gICAgICAgIGlmIChpbmRleFRvU2F2ZSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNUb1JlbW92ZS5zcGxpY2UoaW5kZXhUb1NhdmUsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kgPSBhdHRyaWJ1dGVzVG9SZW1vdmUubGVuZ3RoIC0gMTsgX2kgPj0gMDsgX2ktLSkge1xuICAgICAgICBlbGVtZW50VGFnLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVzVG9SZW1vdmVbX2ldKTtcbiAgICB9XG5cbiAgICBpZiAoaGVsbWV0QXR0cmlidXRlcy5sZW5ndGggPT09IGF0dHJpYnV0ZXNUb1JlbW92ZS5sZW5ndGgpIHtcbiAgICAgICAgZWxlbWVudFRhZy5yZW1vdmVBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50VGFnLmdldEF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFKSAhPT0gYXR0cmlidXRlS2V5cy5qb2luKFwiLFwiKSkge1xuICAgICAgICBlbGVtZW50VGFnLnNldEF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFLCBhdHRyaWJ1dGVLZXlzLmpvaW4oXCIsXCIpKTtcbiAgICB9XG59O1xuXG52YXIgdXBkYXRlVGFncyA9IGZ1bmN0aW9uIHVwZGF0ZVRhZ3ModHlwZSwgdGFncykge1xuICAgIHZhciBoZWFkRWxlbWVudCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihUQUdfTkFNRVMuSEVBRCk7XG4gICAgdmFyIHRhZ05vZGVzID0gaGVhZEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCh0eXBlICsgXCJbXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCJdXCIpO1xuICAgIHZhciBvbGRUYWdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGFnTm9kZXMpO1xuICAgIHZhciBuZXdUYWdzID0gW107XG4gICAgdmFyIGluZGV4VG9EZWxldGUgPSB2b2lkIDA7XG5cbiAgICBpZiAodGFncyAmJiB0YWdzLmxlbmd0aCkge1xuICAgICAgICB0YWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBhdHRyaWJ1dGUgaW4gdGFnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZy5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MID0gdGFnLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLkNTU19URVhUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3RWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSB0YWcuY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0YWcuY3NzVGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdHlwZW9mIHRhZ1thdHRyaWJ1dGVdID09PSBcInVuZGVmaW5lZFwiID8gXCJcIiA6IHRhZ1thdHRyaWJ1dGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUsIFwidHJ1ZVwiKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGEgZHVwbGljYXRlIHRhZyBmcm9tIGRvbVRhZ3N0b1JlbW92ZSwgc28gaXQgaXNuJ3QgY2xlYXJlZC5cbiAgICAgICAgICAgIGlmIChvbGRUYWdzLnNvbWUoZnVuY3Rpb24gKGV4aXN0aW5nVGFnLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIGluZGV4VG9EZWxldGUgPSBpbmRleDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudC5pc0VxdWFsTm9kZShleGlzdGluZ1RhZyk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIG9sZFRhZ3Muc3BsaWNlKGluZGV4VG9EZWxldGUsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdUYWdzLnB1c2gobmV3RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9sZFRhZ3MuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHJldHVybiB0YWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YWcpO1xuICAgIH0pO1xuICAgIG5ld1RhZ3MuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHJldHVybiBoZWFkRWxlbWVudC5hcHBlbmRDaGlsZCh0YWcpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgb2xkVGFnczogb2xkVGFncyxcbiAgICAgICAgbmV3VGFnczogbmV3VGFnc1xuICAgIH07XG59O1xuXG52YXIgZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nID0gZnVuY3Rpb24gZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nKGF0dHJpYnV0ZXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlcykucmVkdWNlKGZ1bmN0aW9uIChzdHIsIGtleSkge1xuICAgICAgICB2YXIgYXR0ciA9IHR5cGVvZiBhdHRyaWJ1dGVzW2tleV0gIT09IFwidW5kZWZpbmVkXCIgPyBrZXkgKyBcIj1cXFwiXCIgKyBhdHRyaWJ1dGVzW2tleV0gKyBcIlxcXCJcIiA6IFwiXCIgKyBrZXk7XG4gICAgICAgIHJldHVybiBzdHIgPyBzdHIgKyBcIiBcIiArIGF0dHIgOiBhdHRyO1xuICAgIH0sIFwiXCIpO1xufTtcblxudmFyIGdlbmVyYXRlVGl0bGVBc1N0cmluZyA9IGZ1bmN0aW9uIGdlbmVyYXRlVGl0bGVBc1N0cmluZyh0eXBlLCB0aXRsZSwgYXR0cmlidXRlcywgZW5jb2RlKSB7XG4gICAgdmFyIGF0dHJpYnV0ZVN0cmluZyA9IGdlbmVyYXRlRWxlbWVudEF0dHJpYnV0ZXNBc1N0cmluZyhhdHRyaWJ1dGVzKTtcbiAgICB2YXIgZmxhdHRlbmVkVGl0bGUgPSBmbGF0dGVuQXJyYXkodGl0bGUpO1xuICAgIHJldHVybiBhdHRyaWJ1dGVTdHJpbmcgPyBcIjxcIiArIHR5cGUgKyBcIiBcIiArIEhFTE1FVF9BVFRSSUJVVEUgKyBcIj1cXFwidHJ1ZVxcXCIgXCIgKyBhdHRyaWJ1dGVTdHJpbmcgKyBcIj5cIiArIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzKGZsYXR0ZW5lZFRpdGxlLCBlbmNvZGUpICsgXCI8L1wiICsgdHlwZSArIFwiPlwiIDogXCI8XCIgKyB0eXBlICsgXCIgXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCI9XFxcInRydWVcXFwiPlwiICsgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMoZmxhdHRlbmVkVGl0bGUsIGVuY29kZSkgKyBcIjwvXCIgKyB0eXBlICsgXCI+XCI7XG59O1xuXG52YXIgZ2VuZXJhdGVUYWdzQXNTdHJpbmcgPSBmdW5jdGlvbiBnZW5lcmF0ZVRhZ3NBc1N0cmluZyh0eXBlLCB0YWdzLCBlbmNvZGUpIHtcbiAgICByZXR1cm4gdGFncy5yZWR1Y2UoZnVuY3Rpb24gKHN0ciwgdGFnKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVIdG1sID0gT2JqZWN0LmtleXModGFnKS5maWx0ZXIoZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgcmV0dXJuICEoYXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MIHx8IGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQpO1xuICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHN0cmluZywgYXR0cmlidXRlKSB7XG4gICAgICAgICAgICB2YXIgYXR0ciA9IHR5cGVvZiB0YWdbYXR0cmlidXRlXSA9PT0gXCJ1bmRlZmluZWRcIiA/IGF0dHJpYnV0ZSA6IGF0dHJpYnV0ZSArIFwiPVxcXCJcIiArIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzKHRhZ1thdHRyaWJ1dGVdLCBlbmNvZGUpICsgXCJcXFwiXCI7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nID8gc3RyaW5nICsgXCIgXCIgKyBhdHRyIDogYXR0cjtcbiAgICAgICAgfSwgXCJcIik7XG5cbiAgICAgICAgdmFyIHRhZ0NvbnRlbnQgPSB0YWcuaW5uZXJIVE1MIHx8IHRhZy5jc3NUZXh0IHx8IFwiXCI7XG5cbiAgICAgICAgdmFyIGlzU2VsZkNsb3NpbmcgPSBTRUxGX0NMT1NJTkdfVEFHUy5pbmRleE9mKHR5cGUpID09PSAtMTtcblxuICAgICAgICByZXR1cm4gc3RyICsgXCI8XCIgKyB0eXBlICsgXCIgXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCI9XFxcInRydWVcXFwiIFwiICsgYXR0cmlidXRlSHRtbCArIChpc1NlbGZDbG9zaW5nID8gXCIvPlwiIDogXCI+XCIgKyB0YWdDb250ZW50ICsgXCI8L1wiICsgdHlwZSArIFwiPlwiKTtcbiAgICB9LCBcIlwiKTtcbn07XG5cbnZhciBjb252ZXJ0RWxlbWVudEF0dHJpYnV0ZXN0b1JlYWN0UHJvcHMgPSBmdW5jdGlvbiBjb252ZXJ0RWxlbWVudEF0dHJpYnV0ZXN0b1JlYWN0UHJvcHMoYXR0cmlidXRlcykge1xuICAgIHZhciBpbml0UHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgICAgICAgb2JqW1JFQUNUX1RBR19NQVBba2V5XSB8fCBrZXldID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sIGluaXRQcm9wcyk7XG59O1xuXG52YXIgY29udmVydFJlYWN0UHJvcHN0b0h0bWxBdHRyaWJ1dGVzID0gZnVuY3Rpb24gY29udmVydFJlYWN0UHJvcHN0b0h0bWxBdHRyaWJ1dGVzKHByb3BzKSB7XG4gICAgdmFyIGluaXRBdHRyaWJ1dGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcykucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgICAgICBvYmpbSFRNTF9UQUdfTUFQW2tleV0gfHwga2V5XSA9IHByb3BzW2tleV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwgaW5pdEF0dHJpYnV0ZXMpO1xufTtcblxudmFyIGdlbmVyYXRlVGl0bGVBc1JlYWN0Q29tcG9uZW50ID0gZnVuY3Rpb24gZ2VuZXJhdGVUaXRsZUFzUmVhY3RDb21wb25lbnQodHlwZSwgdGl0bGUsIGF0dHJpYnV0ZXMpIHtcbiAgICB2YXIgX2luaXRQcm9wcztcblxuICAgIC8vIGFzc2lnbmluZyBpbnRvIGFuIGFycmF5IHRvIGRlZmluZSB0b1N0cmluZyBmdW5jdGlvbiBvbiBpdFxuICAgIHZhciBpbml0UHJvcHMgPSAoX2luaXRQcm9wcyA9IHtcbiAgICAgICAga2V5OiB0aXRsZVxuICAgIH0sIF9pbml0UHJvcHNbSEVMTUVUX0FUVFJJQlVURV0gPSB0cnVlLCBfaW5pdFByb3BzKTtcbiAgICB2YXIgcHJvcHMgPSBjb252ZXJ0RWxlbWVudEF0dHJpYnV0ZXN0b1JlYWN0UHJvcHMoYXR0cmlidXRlcywgaW5pdFByb3BzKTtcblxuICAgIHJldHVybiBbUmVhY3QuY3JlYXRlRWxlbWVudChUQUdfTkFNRVMuVElUTEUsIHByb3BzLCB0aXRsZSldO1xufTtcblxudmFyIGdlbmVyYXRlVGFnc0FzUmVhY3RDb21wb25lbnQgPSBmdW5jdGlvbiBnZW5lcmF0ZVRhZ3NBc1JlYWN0Q29tcG9uZW50KHR5cGUsIHRhZ3MpIHtcbiAgICByZXR1cm4gdGFncy5tYXAoZnVuY3Rpb24gKHRhZywgaSkge1xuICAgICAgICB2YXIgX21hcHBlZFRhZztcblxuICAgICAgICB2YXIgbWFwcGVkVGFnID0gKF9tYXBwZWRUYWcgPSB7XG4gICAgICAgICAgICBrZXk6IGlcbiAgICAgICAgfSwgX21hcHBlZFRhZ1tIRUxNRVRfQVRUUklCVVRFXSA9IHRydWUsIF9tYXBwZWRUYWcpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHRhZykuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICB2YXIgbWFwcGVkQXR0cmlidXRlID0gUkVBQ1RfVEFHX01BUFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTtcblxuICAgICAgICAgICAgaWYgKG1hcHBlZEF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuSU5ORVJfSFRNTCB8fCBtYXBwZWRBdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLkNTU19URVhUKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB0YWcuaW5uZXJIVE1MIHx8IHRhZy5jc3NUZXh0O1xuICAgICAgICAgICAgICAgIG1hcHBlZFRhZy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9IHsgX19odG1sOiBjb250ZW50IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hcHBlZFRhZ1ttYXBwZWRBdHRyaWJ1dGVdID0gdGFnW2F0dHJpYnV0ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHR5cGUsIG1hcHBlZFRhZyk7XG4gICAgfSk7XG59O1xuXG52YXIgZ2V0TWV0aG9kc0ZvclRhZyA9IGZ1bmN0aW9uIGdldE1ldGhvZHNGb3JUYWcodHlwZSwgdGFncywgZW5jb2RlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgVEFHX05BTUVTLlRJVExFOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b0NvbXBvbmVudDogZnVuY3Rpb24gdG9Db21wb25lbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVRpdGxlQXNSZWFjdENvbXBvbmVudCh0eXBlLCB0YWdzLnRpdGxlLCB0YWdzLnRpdGxlQXR0cmlidXRlcywgZW5jb2RlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGl0bGVBc1N0cmluZyh0eXBlLCB0YWdzLnRpdGxlLCB0YWdzLnRpdGxlQXR0cmlidXRlcywgZW5jb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEFUVFJJQlVURV9OQU1FUy5CT0RZOlxuICAgICAgICBjYXNlIEFUVFJJQlVURV9OQU1FUy5IVE1MOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b0NvbXBvbmVudDogZnVuY3Rpb24gdG9Db21wb25lbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RWxlbWVudEF0dHJpYnV0ZXN0b1JlYWN0UHJvcHModGFncyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUVsZW1lbnRBdHRyaWJ1dGVzQXNTdHJpbmcodGFncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9Db21wb25lbnQ6IGZ1bmN0aW9uIHRvQ29tcG9uZW50KCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVUYWdzQXNSZWFjdENvbXBvbmVudCh0eXBlLCB0YWdzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGFnc0FzU3RyaW5nKHR5cGUsIHRhZ3MsIGVuY29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICB9XG59O1xuXG52YXIgbWFwU3RhdGVPblNlcnZlciA9IGZ1bmN0aW9uIG1hcFN0YXRlT25TZXJ2ZXIoX3JlZikge1xuICAgIHZhciBiYXNlVGFnID0gX3JlZi5iYXNlVGFnLFxuICAgICAgICBib2R5QXR0cmlidXRlcyA9IF9yZWYuYm9keUF0dHJpYnV0ZXMsXG4gICAgICAgIGVuY29kZSA9IF9yZWYuZW5jb2RlLFxuICAgICAgICBodG1sQXR0cmlidXRlcyA9IF9yZWYuaHRtbEF0dHJpYnV0ZXMsXG4gICAgICAgIGxpbmtUYWdzID0gX3JlZi5saW5rVGFncyxcbiAgICAgICAgbWV0YVRhZ3MgPSBfcmVmLm1ldGFUYWdzLFxuICAgICAgICBub3NjcmlwdFRhZ3MgPSBfcmVmLm5vc2NyaXB0VGFncyxcbiAgICAgICAgc2NyaXB0VGFncyA9IF9yZWYuc2NyaXB0VGFncyxcbiAgICAgICAgc3R5bGVUYWdzID0gX3JlZi5zdHlsZVRhZ3MsXG4gICAgICAgIF9yZWYkdGl0bGUgPSBfcmVmLnRpdGxlLFxuICAgICAgICB0aXRsZSA9IF9yZWYkdGl0bGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfcmVmJHRpdGxlLFxuICAgICAgICB0aXRsZUF0dHJpYnV0ZXMgPSBfcmVmLnRpdGxlQXR0cmlidXRlcztcbiAgICByZXR1cm4ge1xuICAgICAgICBiYXNlOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5CQVNFLCBiYXNlVGFnLCBlbmNvZGUpLFxuICAgICAgICBib2R5QXR0cmlidXRlczogZ2V0TWV0aG9kc0ZvclRhZyhBVFRSSUJVVEVfTkFNRVMuQk9EWSwgYm9keUF0dHJpYnV0ZXMsIGVuY29kZSksXG4gICAgICAgIGh0bWxBdHRyaWJ1dGVzOiBnZXRNZXRob2RzRm9yVGFnKEFUVFJJQlVURV9OQU1FUy5IVE1MLCBodG1sQXR0cmlidXRlcywgZW5jb2RlKSxcbiAgICAgICAgbGluazogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuTElOSywgbGlua1RhZ3MsIGVuY29kZSksXG4gICAgICAgIG1ldGE6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLk1FVEEsIG1ldGFUYWdzLCBlbmNvZGUpLFxuICAgICAgICBub3NjcmlwdDogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuTk9TQ1JJUFQsIG5vc2NyaXB0VGFncywgZW5jb2RlKSxcbiAgICAgICAgc2NyaXB0OiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5TQ1JJUFQsIHNjcmlwdFRhZ3MsIGVuY29kZSksXG4gICAgICAgIHN0eWxlOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5TVFlMRSwgc3R5bGVUYWdzLCBlbmNvZGUpLFxuICAgICAgICB0aXRsZTogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuVElUTEUsIHsgdGl0bGU6IHRpdGxlLCB0aXRsZUF0dHJpYnV0ZXM6IHRpdGxlQXR0cmlidXRlcyB9LCBlbmNvZGUpXG4gICAgfTtcbn07XG5cbnZhciBIZWxtZXQgPSBmdW5jdGlvbiBIZWxtZXQoQ29tcG9uZW50KSB7XG4gICAgdmFyIF9jbGFzcywgX3RlbXA7XG5cbiAgICByZXR1cm4gX3RlbXAgPSBfY2xhc3MgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgICAgICBpbmhlcml0cyhIZWxtZXRXcmFwcGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICAgICAgICBmdW5jdGlvbiBIZWxtZXRXcmFwcGVyKCkge1xuICAgICAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSGVsbWV0V3JhcHBlcik7XG4gICAgICAgICAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgICAgICB9XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuICFpc0VxdWFsKHRoaXMucHJvcHMsIG5leHRQcm9wcyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwTmVzdGVkQ2hpbGRyZW5Ub1Byb3BzID0gZnVuY3Rpb24gbWFwTmVzdGVkQ2hpbGRyZW5Ub1Byb3BzKGNoaWxkLCBuZXN0ZWRDaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKCFuZXN0ZWRDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5TQ1JJUFQ6XG4gICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuTk9TQ1JJUFQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IG5lc3RlZENoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5TVFlMRTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQ6IG5lc3RlZENoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIjxcIiArIGNoaWxkLnR5cGUgKyBcIiAvPiBlbGVtZW50cyBhcmUgc2VsZi1jbG9zaW5nIGFuZCBjYW4gbm90IGNvbnRhaW4gY2hpbGRyZW4uIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLmZsYXR0ZW5BcnJheVR5cGVDaGlsZHJlbiA9IGZ1bmN0aW9uIGZsYXR0ZW5BcnJheVR5cGVDaGlsZHJlbihfcmVmKSB7XG4gICAgICAgICAgICB2YXIgX2JhYmVsSGVscGVycyRleHRlbmRzO1xuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBfcmVmLmNoaWxkLFxuICAgICAgICAgICAgICAgIGFycmF5VHlwZUNoaWxkcmVuID0gX3JlZi5hcnJheVR5cGVDaGlsZHJlbixcbiAgICAgICAgICAgICAgICBuZXdDaGlsZFByb3BzID0gX3JlZi5uZXdDaGlsZFByb3BzLFxuICAgICAgICAgICAgICAgIG5lc3RlZENoaWxkcmVuID0gX3JlZi5uZXN0ZWRDaGlsZHJlbjtcblxuICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBhcnJheVR5cGVDaGlsZHJlbiwgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kcyA9IHt9LCBfYmFiZWxIZWxwZXJzJGV4dGVuZHNbY2hpbGQudHlwZV0gPSBbXS5jb25jYXQoYXJyYXlUeXBlQ2hpbGRyZW5bY2hpbGQudHlwZV0gfHwgW10sIFtfZXh0ZW5kcyh7fSwgbmV3Q2hpbGRQcm9wcywgdGhpcy5tYXBOZXN0ZWRDaGlsZHJlblRvUHJvcHMoY2hpbGQsIG5lc3RlZENoaWxkcmVuKSldKSwgX2JhYmVsSGVscGVycyRleHRlbmRzKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwT2JqZWN0VHlwZUNoaWxkcmVuID0gZnVuY3Rpb24gbWFwT2JqZWN0VHlwZUNoaWxkcmVuKF9yZWYyKSB7XG4gICAgICAgICAgICB2YXIgX2JhYmVsSGVscGVycyRleHRlbmRzMiwgX2JhYmVsSGVscGVycyRleHRlbmRzMztcblxuICAgICAgICAgICAgdmFyIGNoaWxkID0gX3JlZjIuY2hpbGQsXG4gICAgICAgICAgICAgICAgbmV3UHJvcHMgPSBfcmVmMi5uZXdQcm9wcyxcbiAgICAgICAgICAgICAgICBuZXdDaGlsZFByb3BzID0gX3JlZjIubmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9yZWYyLm5lc3RlZENoaWxkcmVuO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5USVRMRTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kczIgPSB7fSwgX2JhYmVsSGVscGVycyRleHRlbmRzMltjaGlsZC50eXBlXSA9IG5lc3RlZENoaWxkcmVuLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMyLnRpdGxlQXR0cmlidXRlcyA9IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKSwgX2JhYmVsSGVscGVycyRleHRlbmRzMikpO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuQk9EWTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUF0dHJpYnV0ZXM6IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLkhUTUw6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgbmV3UHJvcHMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzOiBfZXh0ZW5kcyh7fSwgbmV3Q2hpbGRQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgbmV3UHJvcHMsIChfYmFiZWxIZWxwZXJzJGV4dGVuZHMzID0ge30sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczNbY2hpbGQudHlwZV0gPSBfZXh0ZW5kcyh7fSwgbmV3Q2hpbGRQcm9wcyksIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczMpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5tYXBBcnJheVR5cGVDaGlsZHJlblRvUHJvcHMgPSBmdW5jdGlvbiBtYXBBcnJheVR5cGVDaGlsZHJlblRvUHJvcHMoYXJyYXlUeXBlQ2hpbGRyZW4sIG5ld1Byb3BzKSB7XG4gICAgICAgICAgICB2YXIgbmV3RmxhdHRlbmVkUHJvcHMgPSBfZXh0ZW5kcyh7fSwgbmV3UHJvcHMpO1xuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcnJheVR5cGVDaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAoYXJyYXlDaGlsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2JhYmVsSGVscGVycyRleHRlbmRzNDtcblxuICAgICAgICAgICAgICAgIG5ld0ZsYXR0ZW5lZFByb3BzID0gX2V4dGVuZHMoe30sIG5ld0ZsYXR0ZW5lZFByb3BzLCAoX2JhYmVsSGVscGVycyRleHRlbmRzNCA9IHt9LCBfYmFiZWxIZWxwZXJzJGV4dGVuZHM0W2FycmF5Q2hpbGROYW1lXSA9IGFycmF5VHlwZUNoaWxkcmVuW2FycmF5Q2hpbGROYW1lXSwgX2JhYmVsSGVscGVycyRleHRlbmRzNCkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXdGbGF0dGVuZWRQcm9wcztcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS53YXJuT25JbnZhbGlkQ2hpbGRyZW4gPSBmdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2hpbGRyZW4oY2hpbGQsIG5lc3RlZENoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFWQUxJRF9UQUdfTkFNRVMuc29tZShmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQudHlwZSA9PT0gbmFtZTtcbiAgICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkLnR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhcm4oXCJZb3UgbWF5IGJlIGF0dGVtcHRpbmcgdG8gbmVzdCA8SGVsbWV0PiBjb21wb25lbnRzIHdpdGhpbiBlYWNoIG90aGVyLCB3aGljaCBpcyBub3QgYWxsb3dlZC4gUmVmZXIgdG8gb3VyIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2FybihcIk9ubHkgZWxlbWVudHMgdHlwZXMgXCIgKyBWQUxJRF9UQUdfTkFNRVMuam9pbihcIiwgXCIpICsgXCIgYXJlIGFsbG93ZWQuIEhlbG1ldCBkb2VzIG5vdCBzdXBwb3J0IHJlbmRlcmluZyA8XCIgKyBjaGlsZC50eXBlICsgXCI+IGVsZW1lbnRzLiBSZWZlciB0byBvdXIgQVBJIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobmVzdGVkQ2hpbGRyZW4gJiYgdHlwZW9mIG5lc3RlZENoaWxkcmVuICE9PSBcInN0cmluZ1wiICYmICghQXJyYXkuaXNBcnJheShuZXN0ZWRDaGlsZHJlbikgfHwgbmVzdGVkQ2hpbGRyZW4uc29tZShmdW5jdGlvbiAobmVzdGVkQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBuZXN0ZWRDaGlsZCAhPT0gXCJzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICB9KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGVsbWV0IGV4cGVjdHMgYSBzdHJpbmcgYXMgYSBjaGlsZCBvZiA8XCIgKyBjaGlsZC50eXBlICsgXCI+LiBEaWQgeW91IGZvcmdldCB0byB3cmFwIHlvdXIgY2hpbGRyZW4gaW4gYnJhY2VzPyAoIDxcIiArIGNoaWxkLnR5cGUgKyBcIj57YGB9PC9cIiArIGNoaWxkLnR5cGUgKyBcIj4gKSBSZWZlciB0byBvdXIgQVBJIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLm1hcENoaWxkcmVuVG9Qcm9wcyA9IGZ1bmN0aW9uIG1hcENoaWxkcmVuVG9Qcm9wcyhjaGlsZHJlbiwgbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgICAgICB2YXIgYXJyYXlUeXBlQ2hpbGRyZW4gPSB7fTtcblxuICAgICAgICAgICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZCB8fCAhY2hpbGQucHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBfY2hpbGQkcHJvcHMgPSBjaGlsZC5wcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ2hpbGRyZW4gPSBfY2hpbGQkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkUHJvcHMgPSBvYmplY3RXaXRob3V0UHJvcGVydGllcyhfY2hpbGQkcHJvcHMsIFtcImNoaWxkcmVuXCJdKTtcblxuICAgICAgICAgICAgICAgIHZhciBuZXdDaGlsZFByb3BzID0gY29udmVydFJlYWN0UHJvcHN0b0h0bWxBdHRyaWJ1dGVzKGNoaWxkUHJvcHMpO1xuXG4gICAgICAgICAgICAgICAgX3RoaXMyLndhcm5PbkludmFsaWRDaGlsZHJlbihjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLkxJTks6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLk1FVEE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLk5PU0NSSVBUOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5TQ1JJUFQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLlNUWUxFOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlQ2hpbGRyZW4gPSBfdGhpczIuZmxhdHRlbkFycmF5VHlwZUNoaWxkcmVuKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDogY2hpbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlQ2hpbGRyZW46IGFycmF5VHlwZUNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkUHJvcHM6IG5ld0NoaWxkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ2hpbGRyZW46IG5lc3RlZENoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wcyA9IF90aGlzMi5tYXBPYmplY3RUeXBlQ2hpbGRyZW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkOiBjaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wczogbmV3UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRQcm9wczogbmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbjogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG5ld1Byb3BzID0gdGhpcy5tYXBBcnJheVR5cGVDaGlsZHJlblRvUHJvcHMoYXJyYXlUeXBlQ2hpbGRyZW4sIG5ld1Byb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9wcztcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICBwcm9wcyA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgW1wiY2hpbGRyZW5cIl0pO1xuXG4gICAgICAgICAgICB2YXIgbmV3UHJvcHMgPSBfZXh0ZW5kcyh7fSwgcHJvcHMpO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBuZXdQcm9wcyA9IHRoaXMubWFwQ2hpbGRyZW5Ub1Byb3BzKGNoaWxkcmVuLCBuZXdQcm9wcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgbmV3UHJvcHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNyZWF0ZUNsYXNzKEhlbG1ldFdyYXBwZXIsIG51bGwsIFt7XG4gICAgICAgICAgICBrZXk6IFwiY2FuVXNlRE9NXCIsXG5cblxuICAgICAgICAgICAgLy8gQ29tcG9uZW50LnBlZWsgY29tZXMgZnJvbSByZWFjdC1zaWRlLWVmZmVjdDpcbiAgICAgICAgICAgIC8vIEZvciB0ZXN0aW5nLCB5b3UgbWF5IHVzZSBhIHN0YXRpYyBwZWVrKCkgbWV0aG9kIGF2YWlsYWJsZSBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50LlxuICAgICAgICAgICAgLy8gSXQgbGV0cyB5b3UgZ2V0IHRoZSBjdXJyZW50IHN0YXRlIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBtb3VudGVkIGluc3RhbmNlIHN0YWNrLlxuICAgICAgICAgICAgLy8gRG9u4oCZdCB1c2UgaXQgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4gdGVzdGluZy5cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYmFzZToge1widGFyZ2V0XCI6IFwiX2JsYW5rXCIsIFwiaHJlZlwiOiBcImh0dHA6Ly9teXNpdGUuY29tL1wifVxuICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGJvZHlBdHRyaWJ1dGVzOiB7XCJjbGFzc05hbWVcIjogXCJyb290XCJ9XG4gICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGVmYXVsdFRpdGxlOiBcIkRlZmF1bHQgVGl0bGVcIlxuICAgICAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBkZWZlcjogdHJ1ZVxuICAgICAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogdHJ1ZVxuICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGh0bWxBdHRyaWJ1dGVzOiB7XCJsYW5nXCI6IFwiZW5cIiwgXCJhbXBcIjogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbGluazogW3tcInJlbFwiOiBcImNhbm9uaWNhbFwiLCBcImhyZWZcIjogXCJodHRwOi8vbXlzaXRlLmNvbS9leGFtcGxlXCJ9XVxuICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbWV0YTogW3tcIm5hbWVcIjogXCJkZXNjcmlwdGlvblwiLCBcImNvbnRlbnRcIjogXCJUZXN0IGRlc2NyaXB0aW9uXCJ9XVxuICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbm9zY3JpcHQ6IFt7XCJpbm5lckhUTUxcIjogXCI8aW1nIHNyYz0naHR0cDovL215c2l0ZS5jb20vanMvdGVzdC5qcydcIn1dXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNoYW5nZUNsaWVudFN0YXRlOiBcIihuZXdTdGF0ZSkgPT4gY29uc29sZS5sb2cobmV3U3RhdGUpXCJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHNjcmlwdDogW3tcInR5cGVcIjogXCJ0ZXh0L2phdmFzY3JpcHRcIiwgXCJzcmNcIjogXCJodHRwOi8vbXlzaXRlLmNvbS9qcy90ZXN0LmpzXCJ9XVxuICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGU6IFt7XCJ0eXBlXCI6IFwidGV4dC9jc3NcIiwgXCJjc3NUZXh0XCI6IFwiZGl2IHsgZGlzcGxheTogYmxvY2s7IGNvbG9yOiBibHVlOyB9XCJ9XVxuICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRpdGxlOiBcIlRpdGxlXCJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0aXRsZUF0dHJpYnV0ZXM6IHtcIml0ZW1wcm9wXCI6IFwibmFtZVwifVxuICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRpdGxlVGVtcGxhdGU6IFwiTXlTaXRlLmNvbSAtICVzXCJcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEoY2FuVXNlRE9NKSB7XG4gICAgICAgICAgICAgICAgQ29tcG9uZW50LmNhblVzZURPTSA9IGNhblVzZURPTTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfV0pO1xuICAgICAgICByZXR1cm4gSGVsbWV0V3JhcHBlcjtcbiAgICB9KFJlYWN0LkNvbXBvbmVudCksIF9jbGFzcy5wcm9wVHlwZXMgPSB7XG4gICAgICAgIGJhc2U6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIGJvZHlBdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm5vZGUpLCBQcm9wVHlwZXMubm9kZV0pLFxuICAgICAgICBkZWZhdWx0VGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgIGRlZmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnM6IFByb3BUeXBlcy5ib29sLFxuICAgICAgICBodG1sQXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgbGluazogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgICAgIG1ldGE6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgICBub3NjcmlwdDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgICAgIG9uQ2hhbmdlQ2xpZW50U3RhdGU6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBzY3JpcHQ6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgICBzdHlsZTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgICAgIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICB0aXRsZUF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIHRpdGxlVGVtcGxhdGU6IFByb3BUeXBlcy5zdHJpbmdcbiAgICB9LCBfY2xhc3MuZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBkZWZlcjogdHJ1ZSxcbiAgICAgICAgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnM6IHRydWVcbiAgICB9LCBfY2xhc3MucGVlayA9IENvbXBvbmVudC5wZWVrLCBfY2xhc3MucmV3aW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWFwcGVkU3RhdGUgPSBDb21wb25lbnQucmV3aW5kKCk7XG4gICAgICAgIGlmICghbWFwcGVkU3RhdGUpIHtcbiAgICAgICAgICAgIC8vIHByb3ZpZGUgZmFsbGJhY2sgaWYgbWFwcGVkU3RhdGUgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgICBtYXBwZWRTdGF0ZSA9IG1hcFN0YXRlT25TZXJ2ZXIoe1xuICAgICAgICAgICAgICAgIGJhc2VUYWc6IFtdLFxuICAgICAgICAgICAgICAgIGJvZHlBdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgICAgICBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlczoge30sXG4gICAgICAgICAgICAgICAgbGlua1RhZ3M6IFtdLFxuICAgICAgICAgICAgICAgIG1ldGFUYWdzOiBbXSxcbiAgICAgICAgICAgICAgICBub3NjcmlwdFRhZ3M6IFtdLFxuICAgICAgICAgICAgICAgIHNjcmlwdFRhZ3M6IFtdLFxuICAgICAgICAgICAgICAgIHN0eWxlVGFnczogW10sXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgdGl0bGVBdHRyaWJ1dGVzOiB7fVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFwcGVkU3RhdGU7XG4gICAgfSwgX3RlbXA7XG59O1xuXG52YXIgTnVsbENvbXBvbmVudCA9IGZ1bmN0aW9uIE51bGxDb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgSGVsbWV0U2lkZUVmZmVjdHMgPSB3aXRoU2lkZUVmZmVjdChyZWR1Y2VQcm9wc1RvU3RhdGUsIGhhbmRsZUNsaWVudFN0YXRlQ2hhbmdlLCBtYXBTdGF0ZU9uU2VydmVyKShOdWxsQ29tcG9uZW50KTtcblxudmFyIEhlbG1ldEV4cG9ydCA9IEhlbG1ldChIZWxtZXRTaWRlRWZmZWN0cyk7XG5IZWxtZXRFeHBvcnQucmVuZGVyU3RhdGljID0gSGVsbWV0RXhwb3J0LnJld2luZDtcblxuZXhwb3J0IGRlZmF1bHQgSGVsbWV0RXhwb3J0O1xuZXhwb3J0IHsgSGVsbWV0RXhwb3J0IGFzIEhlbG1ldCB9O1xuIiwiaW1wb3J0IHtjcmVhdGVFbGVtZW50LENvbXBvbmVudH1mcm9tJ3JlYWN0JztpbXBvcnQge2ZpbmRET01Ob2RlfWZyb20ncmVhY3QtZG9tJztmdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG5cbiAgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufS8qKlxuICogQ2hlY2sgd2hldGhlciBzb21lIERPTSBub2RlIGlzIG91ciBDb21wb25lbnQncyBub2RlLlxuICovXG5mdW5jdGlvbiBpc05vZGVGb3VuZChjdXJyZW50LCBjb21wb25lbnROb2RlLCBpZ25vcmVDbGFzcykge1xuICBpZiAoY3VycmVudCA9PT0gY29tcG9uZW50Tm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIFNWRyA8dXNlLz4gZWxlbWVudHMgZG8gbm90IHRlY2huaWNhbGx5IHJlc2lkZSBpbiB0aGUgcmVuZGVyZWQgRE9NLCBzb1xuICAvLyB0aGV5IGRvIG5vdCBoYXZlIGNsYXNzTGlzdCBkaXJlY3RseSwgYnV0IHRoZXkgb2ZmZXIgYSBsaW5rIHRvIHRoZWlyXG4gIC8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudCwgd2hpY2ggY2FuIGhhdmUgY2xhc3NMaXN0LiBUaGlzIGV4dHJhIGNoZWNrIGlzIGZvclxuICAvLyB0aGF0IGNhc2UuXG4gIC8vIFNlZTogaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvc3RydWN0Lmh0bWwjSW50ZXJmYWNlU1ZHVXNlRWxlbWVudFxuICAvLyBEaXNjdXNzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vUG9tYXgvcmVhY3Qtb25jbGlja291dHNpZGUvcHVsbC8xN1xuXG5cbiAgaWYgKGN1cnJlbnQuY29ycmVzcG9uZGluZ0VsZW1lbnQpIHtcbiAgICByZXR1cm4gY3VycmVudC5jb3JyZXNwb25kaW5nRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoaWdub3JlQ2xhc3MpO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGlnbm9yZUNsYXNzKTtcbn1cbi8qKlxuICogVHJ5IHRvIGZpbmQgb3VyIG5vZGUgaW4gYSBoaWVyYXJjaHkgb2Ygbm9kZXMsIHJldHVybmluZyB0aGUgZG9jdW1lbnRcbiAqIG5vZGUgYXMgaGlnaGVzdCBub2RlIGlmIG91ciBub2RlIGlzIG5vdCBmb3VuZCBpbiB0aGUgcGF0aCB1cC5cbiAqL1xuXG5mdW5jdGlvbiBmaW5kSGlnaGVzdChjdXJyZW50LCBjb21wb25lbnROb2RlLCBpZ25vcmVDbGFzcykge1xuICBpZiAoY3VycmVudCA9PT0gY29tcG9uZW50Tm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIHNvdXJjZT1sb2NhbCB0aGVuIHRoaXMgZXZlbnQgY2FtZSBmcm9tICdzb21ld2hlcmUnXG4gIC8vIGluc2lkZSBhbmQgc2hvdWxkIGJlIGlnbm9yZWQuIFdlIGNvdWxkIGhhbmRsZSB0aGlzIHdpdGhcbiAgLy8gYSBsYXllcmVkIGFwcHJvYWNoLCB0b28sIGJ1dCB0aGF0IHJlcXVpcmVzIGdvaW5nIGJhY2sgdG9cbiAgLy8gdGhpbmtpbmcgaW4gdGVybXMgb2YgRG9tIG5vZGUgbmVzdGluZywgcnVubmluZyBjb3VudGVyXG4gIC8vIHRvIFJlYWN0J3MgJ3lvdSBzaG91bGRuJ3QgY2FyZSBhYm91dCB0aGUgRE9NJyBwaGlsb3NvcGh5LlxuICAvLyBBbHNvIGNvdmVyIHNoYWRvd1Jvb3Qgbm9kZSBieSBjaGVja2luZyBjdXJyZW50Lmhvc3RcblxuXG4gIHdoaWxlIChjdXJyZW50LnBhcmVudE5vZGUgfHwgY3VycmVudC5ob3N0KSB7XG4gICAgLy8gT25seSBjaGVjayBub3JtYWwgbm9kZSB3aXRob3V0IHNoYWRvd1Jvb3RcbiAgICBpZiAoY3VycmVudC5wYXJlbnROb2RlICYmIGlzTm9kZUZvdW5kKGN1cnJlbnQsIGNvbXBvbmVudE5vZGUsIGlnbm9yZUNsYXNzKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZSB8fCBjdXJyZW50Lmhvc3Q7XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGJyb3dzZXIgc2Nyb2xsYmFyIHdhcyBjbGlja2VkXG4gKi9cblxuZnVuY3Rpb24gY2xpY2tlZFNjcm9sbGJhcihldnQpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCA8PSBldnQuY2xpZW50WCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IDw9IGV2dC5jbGllbnRZO1xufS8vIGlkZWFsbHkgd2lsbCBnZXQgcmVwbGFjZWQgd2l0aCBleHRlcm5hbCBkZXBcbi8vIHdoZW4gcmFmcmV4L2RldGVjdC1wYXNzaXZlLWV2ZW50cyM0IGFuZCByYWZyZXgvZGV0ZWN0LXBhc3NpdmUtZXZlbnRzIzUgZ2V0IG1lcmdlZCBpblxudmFyIHRlc3RQYXNzaXZlRXZlbnRTdXBwb3J0ID0gZnVuY3Rpb24gdGVzdFBhc3NpdmVFdmVudFN1cHBvcnQoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGFzc2l2ZSA9IGZhbHNlO1xuICB2YXIgb3B0aW9ucyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBwYXNzaXZlID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZUV2ZW50U3VwcG9ydCcsIG5vb3AsIG9wdGlvbnMpO1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmVFdmVudFN1cHBvcnQnLCBub29wLCBvcHRpb25zKTtcbiAgcmV0dXJuIHBhc3NpdmU7XG59O2Z1bmN0aW9uIGF1dG9JbmMoc2VlZCkge1xuICBpZiAoc2VlZCA9PT0gdm9pZCAwKSB7XG4gICAgc2VlZCA9IDA7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiArK3NlZWQ7XG4gIH07XG59XG5cbnZhciB1aWQgPSBhdXRvSW5jKCk7dmFyIHBhc3NpdmVFdmVudFN1cHBvcnQ7XG52YXIgaGFuZGxlcnNNYXAgPSB7fTtcbnZhciBlbmFibGVkSW5zdGFuY2VzID0ge307XG52YXIgdG91Y2hFdmVudHMgPSBbJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJ107XG52YXIgSUdOT1JFX0NMQVNTX05BTUUgPSAnaWdub3JlLXJlYWN0LW9uY2xpY2tvdXRzaWRlJztcbi8qKlxuICogT3B0aW9ucyBmb3IgYWRkRXZlbnRIYW5kbGVyIGFuZCByZW1vdmVFdmVudEhhbmRsZXJcbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudEhhbmRsZXJPcHRpb25zKGluc3RhbmNlLCBldmVudE5hbWUpIHtcbiAgdmFyIGhhbmRsZXJPcHRpb25zID0ge307XG4gIHZhciBpc1RvdWNoRXZlbnQgPSB0b3VjaEV2ZW50cy5pbmRleE9mKGV2ZW50TmFtZSkgIT09IC0xO1xuXG4gIGlmIChpc1RvdWNoRXZlbnQgJiYgcGFzc2l2ZUV2ZW50U3VwcG9ydCkge1xuICAgIGhhbmRsZXJPcHRpb25zLnBhc3NpdmUgPSAhaW5zdGFuY2UucHJvcHMucHJldmVudERlZmF1bHQ7XG4gIH1cblxuICByZXR1cm4gaGFuZGxlck9wdGlvbnM7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHRoZSBIT0MgZnVuY3Rpb24gdGhhdCB5b3UnbGwgdXNlXG4gKiBpbiBvcmRlciB0byBpbXBhcnQgb25PdXRzaWRlQ2xpY2sgbGlzdGVuaW5nIHRvIGFuXG4gKiBhcmJpdHJhcnkgY29tcG9uZW50LiBJdCBnZXRzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZVxuICogYm9vdHN0cmFwcGluZyBjb2RlIHRvIHlpZWxkIGFuIGluc3RhbmNlIG9mIHRoZVxuICogb25DbGlja091dHNpZGVIT0MgZnVuY3Rpb24gZGVmaW5lZCBpbnNpZGUgc2V0dXBIT0MoKS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9uQ2xpY2tPdXRzaWRlSE9DKFdyYXBwZWRDb21wb25lbnQsIGNvbmZpZykge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICB2YXIgY29tcG9uZW50TmFtZSA9IFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICByZXR1cm4gX3RlbXAgPSBfY2xhc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHNMb29zZShvbkNsaWNrT3V0c2lkZSwgX0NvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBvbkNsaWNrT3V0c2lkZShwcm9wcykge1xuICAgICAgdmFyIF90aGlzO1xuXG4gICAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcblxuICAgICAgX3RoaXMuX19vdXRzaWRlQ2xpY2tIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICh0eXBlb2YgX3RoaXMuX19jbGlja091dHNpZGVIYW5kbGVyUHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIF90aGlzLl9fY2xpY2tPdXRzaWRlSGFuZGxlclByb3AoZXZlbnQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluc3RhbmNlID0gX3RoaXMuZ2V0SW5zdGFuY2UoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLnByb3BzLmhhbmRsZUNsaWNrT3V0c2lkZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGluc3RhbmNlLnByb3BzLmhhbmRsZUNsaWNrT3V0c2lkZShldmVudCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5oYW5kbGVDbGlja091dHNpZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpbnN0YW5jZS5oYW5kbGVDbGlja091dHNpZGUoZXZlbnQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyYXBwZWRDb21wb25lbnQ6IFwiICsgY29tcG9uZW50TmFtZSArIFwiIGxhY2tzIGEgaGFuZGxlQ2xpY2tPdXRzaWRlKGV2ZW50KSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBvdXRzaWRlIGNsaWNrIGV2ZW50cy5cIik7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5fX2dldENvbXBvbmVudE5vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IF90aGlzLmdldEluc3RhbmNlKCk7XG5cbiAgICAgICAgaWYgKGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnLnNldENsaWNrT3V0c2lkZVJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBjb25maWcuc2V0Q2xpY2tPdXRzaWRlUmVmKCkoaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zZXRDbGlja091dHNpZGVSZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc2V0Q2xpY2tPdXRzaWRlUmVmKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmluZERPTU5vZGUoaW5zdGFuY2UpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuZW5hYmxlT25DbGlja091dHNpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IGVuYWJsZWRJbnN0YW5jZXNbX3RoaXMuX3VpZF0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHBhc3NpdmVFdmVudFN1cHBvcnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcGFzc2l2ZUV2ZW50U3VwcG9ydCA9IHRlc3RQYXNzaXZlRXZlbnRTdXBwb3J0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBlbmFibGVkSW5zdGFuY2VzW190aGlzLl91aWRdID0gdHJ1ZTtcbiAgICAgICAgdmFyIGV2ZW50cyA9IF90aGlzLnByb3BzLmV2ZW50VHlwZXM7XG5cbiAgICAgICAgaWYgKCFldmVudHMuZm9yRWFjaCkge1xuICAgICAgICAgIGV2ZW50cyA9IFtldmVudHNdO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlcnNNYXBbX3RoaXMuX3VpZF0gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoX3RoaXMuY29tcG9uZW50Tm9kZSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICAgIGlmIChfdGhpcy5pbml0VGltZVN0YW1wID4gZXZlbnQudGltZVN0YW1wKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAoX3RoaXMucHJvcHMucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF90aGlzLnByb3BzLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF90aGlzLnByb3BzLmV4Y2x1ZGVTY3JvbGxiYXIgJiYgY2xpY2tlZFNjcm9sbGJhcihldmVudCkpIHJldHVybjtcbiAgICAgICAgICB2YXIgY3VycmVudCA9IGV2ZW50LmNvbXBvc2VkICYmIGV2ZW50LmNvbXBvc2VkUGF0aCAmJiBldmVudC5jb21wb3NlZFBhdGgoKS5zaGlmdCgpIHx8IGV2ZW50LnRhcmdldDtcblxuICAgICAgICAgIGlmIChmaW5kSGlnaGVzdChjdXJyZW50LCBfdGhpcy5jb21wb25lbnROb2RlLCBfdGhpcy5wcm9wcy5vdXRzaWRlQ2xpY2tJZ25vcmVDbGFzcykgIT09IGRvY3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMuX19vdXRzaWRlQ2xpY2tIYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgfTtcblxuICAgICAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXJzTWFwW190aGlzLl91aWRdLCBnZXRFdmVudEhhbmRsZXJPcHRpb25zKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBldmVudE5hbWUpKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5kaXNhYmxlT25DbGlja091dHNpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlbGV0ZSBlbmFibGVkSW5zdGFuY2VzW190aGlzLl91aWRdO1xuICAgICAgICB2YXIgZm4gPSBoYW5kbGVyc01hcFtfdGhpcy5fdWlkXTtcblxuICAgICAgICBpZiAoZm4gJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHZhciBldmVudHMgPSBfdGhpcy5wcm9wcy5ldmVudFR5cGVzO1xuXG4gICAgICAgICAgaWYgKCFldmVudHMuZm9yRWFjaCkge1xuICAgICAgICAgICAgZXZlbnRzID0gW2V2ZW50c107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmbiwgZ2V0RXZlbnRIYW5kbGVyT3B0aW9ucyhfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgZXZlbnROYW1lKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZGVsZXRlIGhhbmRsZXJzTWFwW190aGlzLl91aWRdO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5nZXRSZWYgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5pbnN0YW5jZVJlZiA9IHJlZjtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl91aWQgPSB1aWQoKTtcbiAgICAgIF90aGlzLmluaXRUaW1lU3RhbXAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWNjZXNzIHRoZSBXcmFwcGVkQ29tcG9uZW50J3MgaW5zdGFuY2UuXG4gICAgICovXG5cblxuICAgIHZhciBfcHJvdG8gPSBvbkNsaWNrT3V0c2lkZS5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8uZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbiBnZXRJbnN0YW5jZSgpIHtcbiAgICAgIGlmIChXcmFwcGVkQ29tcG9uZW50LnByb3RvdHlwZSAmJiAhV3JhcHBlZENvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiA9IHRoaXMuaW5zdGFuY2VSZWY7XG4gICAgICByZXR1cm4gcmVmLmdldEluc3RhbmNlID8gcmVmLmdldEluc3RhbmNlKCkgOiByZWY7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBjbGljayBsaXN0ZW5lcnMgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQsXG4gICAgICogbGlua2VkIHRvIHRoaXMgY29tcG9uZW50J3Mgc3RhdGUuXG4gICAgICovXG4gICAgX3Byb3RvLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAvLyBJZiB3ZSBhcmUgaW4gYW4gZW52aXJvbm1lbnQgd2l0aG91dCBhIERPTSBzdWNoXG4gICAgICAvLyBhcyBzaGFsbG93IHJlbmRlcmluZyBvciBzbmFwc2hvdHMgdGhlbiB3ZSBleGl0XG4gICAgICAvLyBlYXJseSB0byBwcmV2ZW50IGFueSB1bmhhbmRsZWQgZXJyb3JzIGJlaW5nIHRocm93bi5cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICFkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5nZXRJbnN0YW5jZSgpO1xuXG4gICAgICBpZiAoY29uZmlnICYmIHR5cGVvZiBjb25maWcuaGFuZGxlQ2xpY2tPdXRzaWRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuX19jbGlja091dHNpZGVIYW5kbGVyUHJvcCA9IGNvbmZpZy5oYW5kbGVDbGlja091dHNpZGUoaW5zdGFuY2UpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fX2NsaWNrT3V0c2lkZUhhbmRsZXJQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JhcHBlZENvbXBvbmVudDogXCIgKyBjb21wb25lbnROYW1lICsgXCIgbGFja3MgYSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBvdXRzaWRlIGNsaWNrIGV2ZW50cyBzcGVjaWZpZWQgYnkgdGhlIGhhbmRsZUNsaWNrT3V0c2lkZSBjb25maWcgb3B0aW9uLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbXBvbmVudE5vZGUgPSB0aGlzLl9fZ2V0Q29tcG9uZW50Tm9kZSgpOyAvLyByZXR1cm4gZWFybHkgc28gd2UgZG9udCBpbml0aWF0ZSBvbkNsaWNrT3V0c2lkZVxuXG4gICAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlT25DbGlja091dHNpZGUpIHJldHVybjtcbiAgICAgIHRoaXMuZW5hYmxlT25DbGlja091dHNpZGUoKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50Tm9kZSA9IHRoaXMuX19nZXRDb21wb25lbnROb2RlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgZG9jdW1lbnQncyBldmVudCBsaXN0ZW5lcnMgZm9yIHRoaXMgY29tcG9uZW50XG4gICAgICovXG4gICAgO1xuXG4gICAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmRpc2FibGVPbkNsaWNrT3V0c2lkZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYW4gYmUgY2FsbGVkIHRvIGV4cGxpY2l0bHkgZW5hYmxlIGV2ZW50IGxpc3RlbmluZ1xuICAgICAqIGZvciBjbGlja3MgYW5kIHRvdWNoZXMgb3V0c2lkZSBvZiB0aGlzIGVsZW1lbnQuXG4gICAgICovXG4gICAgO1xuXG4gICAgLyoqXG4gICAgICogUGFzcy10aHJvdWdoIHJlbmRlclxuICAgICAqL1xuICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgICAgX3RoaXMkcHJvcHMuZXhjbHVkZVNjcm9sbGJhcjtcbiAgICAgICAgICB2YXIgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wcywgW1wiZXhjbHVkZVNjcm9sbGJhclwiXSk7XG5cbiAgICAgIGlmIChXcmFwcGVkQ29tcG9uZW50LnByb3RvdHlwZSAmJiBXcmFwcGVkQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7XG4gICAgICAgIHByb3BzLnJlZiA9IHRoaXMuZ2V0UmVmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcHMud3JhcHBlZFJlZiA9IHRoaXMuZ2V0UmVmO1xuICAgICAgfVxuXG4gICAgICBwcm9wcy5kaXNhYmxlT25DbGlja091dHNpZGUgPSB0aGlzLmRpc2FibGVPbkNsaWNrT3V0c2lkZTtcbiAgICAgIHByb3BzLmVuYWJsZU9uQ2xpY2tPdXRzaWRlID0gdGhpcy5lbmFibGVPbkNsaWNrT3V0c2lkZTtcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHByb3BzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG9uQ2xpY2tPdXRzaWRlO1xuICB9KENvbXBvbmVudCksIF9jbGFzcy5kaXNwbGF5TmFtZSA9IFwiT25DbGlja091dHNpZGUoXCIgKyBjb21wb25lbnROYW1lICsgXCIpXCIsIF9jbGFzcy5kZWZhdWx0UHJvcHMgPSB7XG4gICAgZXZlbnRUeXBlczogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLFxuICAgIGV4Y2x1ZGVTY3JvbGxiYXI6IGNvbmZpZyAmJiBjb25maWcuZXhjbHVkZVNjcm9sbGJhciB8fCBmYWxzZSxcbiAgICBvdXRzaWRlQ2xpY2tJZ25vcmVDbGFzczogSUdOT1JFX0NMQVNTX05BTUUsXG4gICAgcHJldmVudERlZmF1bHQ6IGZhbHNlLFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZmFsc2VcbiAgfSwgX2NsYXNzLmdldENsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBXcmFwcGVkQ29tcG9uZW50LmdldENsYXNzID8gV3JhcHBlZENvbXBvbmVudC5nZXRDbGFzcygpIDogV3JhcHBlZENvbXBvbmVudDtcbiAgfSwgX3RlbXA7XG59ZXhwb3J0IGRlZmF1bHQgb25DbGlja091dHNpZGVIT0M7ZXhwb3J0e0lHTk9SRV9DTEFTU19OQU1FfTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzdHlsZVNpbmdsZXRvbiB9IGZyb20gJ3JlYWN0LXN0eWxlLXNpbmdsZXRvbic7XG5pbXBvcnQgeyBmdWxsV2lkdGhDbGFzc05hbWUsIHplcm9SaWdodENsYXNzTmFtZSwgbm9TY3JvbGxiYXJzQ2xhc3NOYW1lLCByZW1vdmVkQmFyU2l6ZVZhcmlhYmxlIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0R2FwV2lkdGggfSBmcm9tICcuL3V0aWxzJztcbnZhciBTdHlsZSA9IHN0eWxlU2luZ2xldG9uKCk7XG4vLyBpbXBvcnRhbnQgdGlwIC0gb25jZSB3ZSBtZWFzdXJlIHNjcm9sbEJhciB3aWR0aCBhbmQgcmVtb3ZlIHRoZW1cbi8vIHdlIGNvdWxkIG5vdCByZXBlYXQgdGhpcyBvcGVyYXRpb25cbi8vIHRodXMgd2UgYXJlIHVzaW5nIHN0eWxlLXNpbmdsZXRvbiAtIG9ubHkgdGhlIGZpcnN0IFwieWV0IGNvcnJlY3RcIiBzdHlsZSB3aWxsIGJlIGFwcGxpZWQuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24gKF9hLCBhbGxvd1JlbGF0aXZlLCBnYXBNb2RlLCBpbXBvcnRhbnQpIHtcbiAgICB2YXIgbGVmdCA9IF9hLmxlZnQsIHRvcCA9IF9hLnRvcCwgcmlnaHQgPSBfYS5yaWdodCwgZ2FwID0gX2EuZ2FwO1xuICAgIGlmIChnYXBNb2RlID09PSB2b2lkIDApIHsgZ2FwTW9kZSA9ICdtYXJnaW4nOyB9XG4gICAgcmV0dXJuIFwiXFxuICAuXCIuY29uY2F0KG5vU2Nyb2xsYmFyc0NsYXNzTmFtZSwgXCIge1xcbiAgIG92ZXJmbG93OiBoaWRkZW4gXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgIHBhZGRpbmctcmlnaHQ6IFwiKS5jb25jYXQoZ2FwLCBcInB4IFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gIH1cXG4gIGJvZHkge1xcbiAgICBvdmVyZmxvdzogaGlkZGVuIFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjtcXG4gICAgXCIpLmNvbmNhdChbXG4gICAgICAgIGFsbG93UmVsYXRpdmUgJiYgXCJwb3NpdGlvbjogcmVsYXRpdmUgXCIuY29uY2F0KGltcG9ydGFudCwgXCI7XCIpLFxuICAgICAgICBnYXBNb2RlID09PSAnbWFyZ2luJyAmJlxuICAgICAgICAgICAgXCJcXG4gICAgcGFkZGluZy1sZWZ0OiBcIi5jb25jYXQobGVmdCwgXCJweDtcXG4gICAgcGFkZGluZy10b3A6IFwiKS5jb25jYXQodG9wLCBcInB4O1xcbiAgICBwYWRkaW5nLXJpZ2h0OiBcIikuY29uY2F0KHJpZ2h0LCBcInB4O1xcbiAgICBtYXJnaW4tbGVmdDowO1xcbiAgICBtYXJnaW4tdG9wOjA7XFxuICAgIG1hcmdpbi1yaWdodDogXCIpLmNvbmNhdChnYXAsIFwicHggXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgICBcIiksXG4gICAgICAgIGdhcE1vZGUgPT09ICdwYWRkaW5nJyAmJiBcInBhZGRpbmctcmlnaHQ6IFwiLmNvbmNhdChnYXAsIFwicHggXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1wiKSxcbiAgICBdXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmpvaW4oJycpLCBcIlxcbiAgfVxcbiAgXFxuICAuXCIpLmNvbmNhdCh6ZXJvUmlnaHRDbGFzc05hbWUsIFwiIHtcXG4gICAgcmlnaHQ6IFwiKS5jb25jYXQoZ2FwLCBcInB4IFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gIH1cXG4gIFxcbiAgLlwiKS5jb25jYXQoZnVsbFdpZHRoQ2xhc3NOYW1lLCBcIiB7XFxuICAgIG1hcmdpbi1yaWdodDogXCIpLmNvbmNhdChnYXAsIFwicHggXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgfVxcbiAgXFxuICAuXCIpLmNvbmNhdCh6ZXJvUmlnaHRDbGFzc05hbWUsIFwiIC5cIikuY29uY2F0KHplcm9SaWdodENsYXNzTmFtZSwgXCIge1xcbiAgICByaWdodDogMCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICB9XFxuICBcXG4gIC5cIikuY29uY2F0KGZ1bGxXaWR0aENsYXNzTmFtZSwgXCIgLlwiKS5jb25jYXQoZnVsbFdpZHRoQ2xhc3NOYW1lLCBcIiB7XFxuICAgIG1hcmdpbi1yaWdodDogMCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICB9XFxuICBcXG4gIGJvZHkge1xcbiAgICBcIikuY29uY2F0KHJlbW92ZWRCYXJTaXplVmFyaWFibGUsIFwiOiBcIikuY29uY2F0KGdhcCwgXCJweDtcXG4gIH1cXG5cIik7XG59O1xuLyoqXG4gKiBSZW1vdmVzIHBhZ2Ugc2Nyb2xsYmFyIGFuZCBibG9ja3MgcGFnZSBzY3JvbGwgd2hlbiBtb3VudGVkXG4gKi9cbmV4cG9ydCB2YXIgUmVtb3ZlU2Nyb2xsQmFyID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgdmFyIG5vUmVsYXRpdmUgPSBwcm9wcy5ub1JlbGF0aXZlLCBub0ltcG9ydGFudCA9IHByb3BzLm5vSW1wb3J0YW50LCBfYSA9IHByb3BzLmdhcE1vZGUsIGdhcE1vZGUgPSBfYSA9PT0gdm9pZCAwID8gJ21hcmdpbicgOiBfYTtcbiAgICAvKlxuICAgICBnYXAgd2lsbCBiZSBtZWFzdXJlZCBvbiBldmVyeSBjb21wb25lbnQgbW91bnRcbiAgICAgaG93ZXZlciBpdCB3aWxsIGJlIHVzZWQgb25seSBieSB0aGUgXCJmaXJzdFwiIGludm9jYXRpb25cbiAgICAgZHVlIHRvIHNpbmdsZXRvbiBuYXR1cmUgb2YgPFN0eWxlXG4gICAgICovXG4gICAgdmFyIGdhcCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0R2FwV2lkdGgoZ2FwTW9kZSk7IH0sIFtnYXBNb2RlXSk7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3R5bGUsIHsgc3R5bGVzOiBnZXRTdHlsZXMoZ2FwLCAhbm9SZWxhdGl2ZSwgZ2FwTW9kZSwgIW5vSW1wb3J0YW50ID8gJyFpbXBvcnRhbnQnIDogJycpIH0pO1xufTtcbiIsImV4cG9ydCB2YXIgemVyb1JpZ2h0Q2xhc3NOYW1lID0gJ3JpZ2h0LXNjcm9sbC1iYXItcG9zaXRpb24nO1xuZXhwb3J0IHZhciBmdWxsV2lkdGhDbGFzc05hbWUgPSAnd2lkdGgtYmVmb3JlLXNjcm9sbC1iYXInO1xuZXhwb3J0IHZhciBub1Njcm9sbGJhcnNDbGFzc05hbWUgPSAnd2l0aC1zY3JvbGwtYmFycy1oaWRkZW4nO1xuLyoqXG4gKiBOYW1lIG9mIGEgQ1NTIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIGFtb3VudCBvZiBcImhpZGRlblwiIHNjcm9sbGJhclxuICogISBtaWdodCBiZSB1bmRlZmluZWQgISB1c2Ugd2lsbCBmYWxsYmFjayFcbiAqL1xuZXhwb3J0IHZhciByZW1vdmVkQmFyU2l6ZVZhcmlhYmxlID0gJy0tcmVtb3ZlZC1ib2R5LXNjcm9sbC1iYXItc2l6ZSc7XG4iLCJpbXBvcnQgeyBSZW1vdmVTY3JvbGxCYXIgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQgeyB6ZXJvUmlnaHRDbGFzc05hbWUsIGZ1bGxXaWR0aENsYXNzTmFtZSwgbm9TY3JvbGxiYXJzQ2xhc3NOYW1lLCByZW1vdmVkQmFyU2l6ZVZhcmlhYmxlIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0R2FwV2lkdGggfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB7IFJlbW92ZVNjcm9sbEJhciwgemVyb1JpZ2h0Q2xhc3NOYW1lLCBmdWxsV2lkdGhDbGFzc05hbWUsIG5vU2Nyb2xsYmFyc0NsYXNzTmFtZSwgcmVtb3ZlZEJhclNpemVWYXJpYWJsZSwgZ2V0R2FwV2lkdGgsIH07XG4iLCJleHBvcnQgdmFyIHplcm9HYXAgPSB7XG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgZ2FwOiAwLFxufTtcbnZhciBwYXJzZSA9IGZ1bmN0aW9uICh4KSB7IHJldHVybiBwYXJzZUludCh4IHx8ICcnLCAxMCkgfHwgMDsgfTtcbnZhciBnZXRPZmZzZXQgPSBmdW5jdGlvbiAoZ2FwTW9kZSkge1xuICAgIHZhciBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpO1xuICAgIHZhciBsZWZ0ID0gY3NbZ2FwTW9kZSA9PT0gJ3BhZGRpbmcnID8gJ3BhZGRpbmdMZWZ0JyA6ICdtYXJnaW5MZWZ0J107XG4gICAgdmFyIHRvcCA9IGNzW2dhcE1vZGUgPT09ICdwYWRkaW5nJyA/ICdwYWRkaW5nVG9wJyA6ICdtYXJnaW5Ub3AnXTtcbiAgICB2YXIgcmlnaHQgPSBjc1tnYXBNb2RlID09PSAncGFkZGluZycgPyAncGFkZGluZ1JpZ2h0JyA6ICdtYXJnaW5SaWdodCddO1xuICAgIHJldHVybiBbcGFyc2UobGVmdCksIHBhcnNlKHRvcCksIHBhcnNlKHJpZ2h0KV07XG59O1xuZXhwb3J0IHZhciBnZXRHYXBXaWR0aCA9IGZ1bmN0aW9uIChnYXBNb2RlKSB7XG4gICAgaWYgKGdhcE1vZGUgPT09IHZvaWQgMCkgeyBnYXBNb2RlID0gJ21hcmdpbic7IH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHplcm9HYXA7XG4gICAgfVxuICAgIHZhciBvZmZzZXRzID0gZ2V0T2Zmc2V0KGdhcE1vZGUpO1xuICAgIHZhciBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHZhciB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IG9mZnNldHNbMF0sXG4gICAgICAgIHRvcDogb2Zmc2V0c1sxXSxcbiAgICAgICAgcmlnaHQ6IG9mZnNldHNbMl0sXG4gICAgICAgIGdhcDogTWF0aC5tYXgoMCwgd2luZG93V2lkdGggLSBkb2N1bWVudFdpZHRoICsgb2Zmc2V0c1syXSAtIG9mZnNldHNbMF0pLFxuICAgIH07XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlbW92ZVNjcm9sbCB9IGZyb20gJy4vVUknO1xuaW1wb3J0IFNpZGVDYXIgZnJvbSAnLi9zaWRlY2FyJztcbnZhciBSZWFjdFJlbW92ZVNjcm9sbCA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHsgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlbW92ZVNjcm9sbCwgX19hc3NpZ24oe30sIHByb3BzLCB7IHJlZjogcmVmLCBzaWRlQ2FyOiBTaWRlQ2FyIH0pKSk7IH0pO1xuUmVhY3RSZW1vdmVTY3JvbGwuY2xhc3NOYW1lcyA9IFJlbW92ZVNjcm9sbC5jbGFzc05hbWVzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3RSZW1vdmVTY3JvbGw7XG4iLCJpbXBvcnQgeyBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZW1vdmVTY3JvbGxCYXIgfSBmcm9tICdyZWFjdC1yZW1vdmUtc2Nyb2xsLWJhcic7XG5pbXBvcnQgeyBzdHlsZVNpbmdsZXRvbiB9IGZyb20gJ3JlYWN0LXN0eWxlLXNpbmdsZXRvbic7XG5pbXBvcnQgeyBub25QYXNzaXZlIH0gZnJvbSAnLi9hZ2dyZXNpdmVDYXB0dXJlJztcbmltcG9ydCB7IGhhbmRsZVNjcm9sbCwgbG9jYXRpb25Db3VsZEJlU2Nyb2xsZWQgfSBmcm9tICcuL2hhbmRsZVNjcm9sbCc7XG5leHBvcnQgdmFyIGdldFRvdWNoWFkgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2NoYW5nZWRUb3VjaGVzJyBpbiBldmVudCA/IFtldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZXSA6IFswLCAwXTtcbn07XG5leHBvcnQgdmFyIGdldERlbHRhWFkgPSBmdW5jdGlvbiAoZXZlbnQpIHsgcmV0dXJuIFtldmVudC5kZWx0YVgsIGV2ZW50LmRlbHRhWV07IH07XG52YXIgZXh0cmFjdFJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICByZXR1cm4gcmVmICYmICdjdXJyZW50JyBpbiByZWYgPyByZWYuY3VycmVudCA6IHJlZjtcbn07XG52YXIgZGVsdGFDb21wYXJlID0gZnVuY3Rpb24gKHgsIHkpIHsgcmV0dXJuIHhbMF0gPT09IHlbMF0gJiYgeFsxXSA9PT0geVsxXTsgfTtcbnZhciBnZW5lcmF0ZVN0eWxlID0gZnVuY3Rpb24gKGlkKSB7IHJldHVybiBcIlxcbiAgLmJsb2NrLWludGVyYWN0aXZpdHktXCIuY29uY2F0KGlkLCBcIiB7cG9pbnRlci1ldmVudHM6IG5vbmU7fVxcbiAgLmFsbG93LWludGVyYWN0aXZpdHktXCIpLmNvbmNhdChpZCwgXCIge3BvaW50ZXItZXZlbnRzOiBhbGw7fVxcblwiKTsgfTtcbnZhciBpZENvdW50ZXIgPSAwO1xudmFyIGxvY2tTdGFjayA9IFtdO1xuZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZVNjcm9sbFNpZGVDYXIocHJvcHMpIHtcbiAgICB2YXIgc2hvdWxkUHJldmVudFF1ZXVlID0gUmVhY3QudXNlUmVmKFtdKTtcbiAgICB2YXIgdG91Y2hTdGFydFJlZiA9IFJlYWN0LnVzZVJlZihbMCwgMF0pO1xuICAgIHZhciBhY3RpdmVBeGlzID0gUmVhY3QudXNlUmVmKCk7XG4gICAgdmFyIGlkID0gUmVhY3QudXNlU3RhdGUoaWRDb3VudGVyKyspWzBdO1xuICAgIHZhciBTdHlsZSA9IFJlYWN0LnVzZVN0YXRlKHN0eWxlU2luZ2xldG9uKVswXTtcbiAgICB2YXIgbGFzdFByb3BzID0gUmVhY3QudXNlUmVmKHByb3BzKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBsYXN0UHJvcHMuY3VycmVudCA9IHByb3BzO1xuICAgIH0sIFtwcm9wc10pO1xuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChwcm9wcy5pbmVydCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwiYmxvY2staW50ZXJhY3Rpdml0eS1cIi5jb25jYXQoaWQpKTtcbiAgICAgICAgICAgIHZhciBhbGxvd18xID0gX19zcHJlYWRBcnJheShbcHJvcHMubG9ja1JlZi5jdXJyZW50XSwgKHByb3BzLnNoYXJkcyB8fCBbXSkubWFwKGV4dHJhY3RSZWYpLCB0cnVlKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgICAgICBhbGxvd18xLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5jbGFzc0xpc3QuYWRkKFwiYWxsb3ctaW50ZXJhY3Rpdml0eS1cIi5jb25jYXQoaWQpKTsgfSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcImJsb2NrLWludGVyYWN0aXZpdHktXCIuY29uY2F0KGlkKSk7XG4gICAgICAgICAgICAgICAgYWxsb3dfMS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuY2xhc3NMaXN0LnJlbW92ZShcImFsbG93LWludGVyYWN0aXZpdHktXCIuY29uY2F0KGlkKSk7IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfSwgW3Byb3BzLmluZXJ0LCBwcm9wcy5sb2NrUmVmLmN1cnJlbnQsIHByb3BzLnNoYXJkc10pO1xuICAgIHZhciBzaG91bGRDYW5jZWxFdmVudCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCwgcGFyZW50KSB7XG4gICAgICAgIGlmICgndG91Y2hlcycgaW4gZXZlbnQgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiAhbGFzdFByb3BzLmN1cnJlbnQuYWxsb3dQaW5jaFpvb207XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRvdWNoID0gZ2V0VG91Y2hYWShldmVudCk7XG4gICAgICAgIHZhciB0b3VjaFN0YXJ0ID0gdG91Y2hTdGFydFJlZi5jdXJyZW50O1xuICAgICAgICB2YXIgZGVsdGFYID0gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOiB0b3VjaFN0YXJ0WzBdIC0gdG91Y2hbMF07XG4gICAgICAgIHZhciBkZWx0YVkgPSAnZGVsdGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6IHRvdWNoU3RhcnRbMV0gLSB0b3VjaFsxXTtcbiAgICAgICAgdmFyIGN1cnJlbnRBeGlzO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICB2YXIgbW92ZURpcmVjdGlvbiA9IE1hdGguYWJzKGRlbHRhWCkgPiBNYXRoLmFicyhkZWx0YVkpID8gJ2gnIDogJ3YnO1xuICAgICAgICAvLyBhbGxvdyBob3Jpem9udGFsIHRvdWNoIG1vdmUgb24gUmFuZ2UgaW5wdXRzLiBUaGV5IHdpbGwgbm90IGNhdXNlIGFueSBzY3JvbGxcbiAgICAgICAgaWYgKCd0b3VjaGVzJyBpbiBldmVudCAmJiBtb3ZlRGlyZWN0aW9uID09PSAnaCcgJiYgdGFyZ2V0LnR5cGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FuQmVTY3JvbGxlZEluTWFpbkRpcmVjdGlvbiA9IGxvY2F0aW9uQ291bGRCZVNjcm9sbGVkKG1vdmVEaXJlY3Rpb24sIHRhcmdldCk7XG4gICAgICAgIGlmICghY2FuQmVTY3JvbGxlZEluTWFpbkRpcmVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbkJlU2Nyb2xsZWRJbk1haW5EaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGN1cnJlbnRBeGlzID0gbW92ZURpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRBeGlzID0gbW92ZURpcmVjdGlvbiA9PT0gJ3YnID8gJ2gnIDogJ3YnO1xuICAgICAgICAgICAgY2FuQmVTY3JvbGxlZEluTWFpbkRpcmVjdGlvbiA9IGxvY2F0aW9uQ291bGRCZVNjcm9sbGVkKG1vdmVEaXJlY3Rpb24sIHRhcmdldCk7XG4gICAgICAgICAgICAvLyBvdGhlciBheGlzIG1pZ2h0IGJlIG5vdCBzY3JvbGxhYmxlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjYW5CZVNjcm9sbGVkSW5NYWluRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhY3RpdmVBeGlzLmN1cnJlbnQgJiYgJ2NoYW5nZWRUb3VjaGVzJyBpbiBldmVudCAmJiAoZGVsdGFYIHx8IGRlbHRhWSkpIHtcbiAgICAgICAgICAgIGFjdGl2ZUF4aXMuY3VycmVudCA9IGN1cnJlbnRBeGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudEF4aXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYW5jZWxpbmdBeGlzID0gYWN0aXZlQXhpcy5jdXJyZW50IHx8IGN1cnJlbnRBeGlzO1xuICAgICAgICByZXR1cm4gaGFuZGxlU2Nyb2xsKGNhbmNlbGluZ0F4aXMsIHBhcmVudCwgZXZlbnQsIGNhbmNlbGluZ0F4aXMgPT09ICdoJyA/IGRlbHRhWCA6IGRlbHRhWSwgdHJ1ZSk7XG4gICAgfSwgW10pO1xuICAgIHZhciBzaG91bGRQcmV2ZW50ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKF9ldmVudCkge1xuICAgICAgICB2YXIgZXZlbnQgPSBfZXZlbnQ7XG4gICAgICAgIGlmICghbG9ja1N0YWNrLmxlbmd0aCB8fCBsb2NrU3RhY2tbbG9ja1N0YWNrLmxlbmd0aCAtIDFdICE9PSBTdHlsZSkge1xuICAgICAgICAgICAgLy8gbm90IHRoZSBsYXN0IGFjdGl2ZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWx0YSA9ICdkZWx0YVknIGluIGV2ZW50ID8gZ2V0RGVsdGFYWShldmVudCkgOiBnZXRUb3VjaFhZKGV2ZW50KTtcbiAgICAgICAgdmFyIHNvdXJjZUV2ZW50ID0gc2hvdWxkUHJldmVudFF1ZXVlLmN1cnJlbnQuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLm5hbWUgPT09IGV2ZW50LnR5cGUgJiYgKGUudGFyZ2V0ID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQudGFyZ2V0ID09PSBlLnNoYWRvd1BhcmVudCkgJiYgZGVsdGFDb21wYXJlKGUuZGVsdGEsIGRlbHRhKTsgfSlbMF07XG4gICAgICAgIC8vIHNlbGYgZXZlbnQsIGFuZCBzaG91bGQgYmUgY2FuY2VsZWRcbiAgICAgICAgaWYgKHNvdXJjZUV2ZW50ICYmIHNvdXJjZUV2ZW50LnNob3VsZCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG91dHNpZGUgb3Igc2hhcmQgZXZlbnRcbiAgICAgICAgaWYgKCFzb3VyY2VFdmVudCkge1xuICAgICAgICAgICAgdmFyIHNoYXJkTm9kZXMgPSAobGFzdFByb3BzLmN1cnJlbnQuc2hhcmRzIHx8IFtdKVxuICAgICAgICAgICAgICAgIC5tYXAoZXh0cmFjdFJlZilcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5jb250YWlucyhldmVudC50YXJnZXQpOyB9KTtcbiAgICAgICAgICAgIHZhciBzaG91bGRTdG9wID0gc2hhcmROb2Rlcy5sZW5ndGggPiAwID8gc2hvdWxkQ2FuY2VsRXZlbnQoZXZlbnQsIHNoYXJkTm9kZXNbMF0pIDogIWxhc3RQcm9wcy5jdXJyZW50Lm5vSXNvbGF0aW9uO1xuICAgICAgICAgICAgaWYgKHNob3VsZFN0b3ApIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICB2YXIgc2hvdWxkQ2FuY2VsID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5hbWUsIGRlbHRhLCB0YXJnZXQsIHNob3VsZCkge1xuICAgICAgICB2YXIgZXZlbnQgPSB7IG5hbWU6IG5hbWUsIGRlbHRhOiBkZWx0YSwgdGFyZ2V0OiB0YXJnZXQsIHNob3VsZDogc2hvdWxkLCBzaGFkb3dQYXJlbnQ6IGdldE91dGVybW9zdFNoYWRvd1BhcmVudCh0YXJnZXQpIH07XG4gICAgICAgIHNob3VsZFByZXZlbnRRdWV1ZS5jdXJyZW50LnB1c2goZXZlbnQpO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNob3VsZFByZXZlbnRRdWV1ZS5jdXJyZW50ID0gc2hvdWxkUHJldmVudFF1ZXVlLmN1cnJlbnQuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlICE9PSBldmVudDsgfSk7XG4gICAgICAgIH0sIDEpO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgc2Nyb2xsVG91Y2hTdGFydCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB0b3VjaFN0YXJ0UmVmLmN1cnJlbnQgPSBnZXRUb3VjaFhZKGV2ZW50KTtcbiAgICAgICAgYWN0aXZlQXhpcy5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgc2Nyb2xsV2hlZWwgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc2hvdWxkQ2FuY2VsKGV2ZW50LnR5cGUsIGdldERlbHRhWFkoZXZlbnQpLCBldmVudC50YXJnZXQsIHNob3VsZENhbmNlbEV2ZW50KGV2ZW50LCBwcm9wcy5sb2NrUmVmLmN1cnJlbnQpKTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIHNjcm9sbFRvdWNoTW92ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBzaG91bGRDYW5jZWwoZXZlbnQudHlwZSwgZ2V0VG91Y2hYWShldmVudCksIGV2ZW50LnRhcmdldCwgc2hvdWxkQ2FuY2VsRXZlbnQoZXZlbnQsIHByb3BzLmxvY2tSZWYuY3VycmVudCkpO1xuICAgIH0sIFtdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBsb2NrU3RhY2sucHVzaChTdHlsZSk7XG4gICAgICAgIHByb3BzLnNldENhbGxiYWNrcyh7XG4gICAgICAgICAgICBvblNjcm9sbENhcHR1cmU6IHNjcm9sbFdoZWVsLFxuICAgICAgICAgICAgb25XaGVlbENhcHR1cmU6IHNjcm9sbFdoZWVsLFxuICAgICAgICAgICAgb25Ub3VjaE1vdmVDYXB0dXJlOiBzY3JvbGxUb3VjaE1vdmUsXG4gICAgICAgIH0pO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHNob3VsZFByZXZlbnQsIG5vblBhc3NpdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBzaG91bGRQcmV2ZW50LCBub25QYXNzaXZlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNjcm9sbFRvdWNoU3RhcnQsIG5vblBhc3NpdmUpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbG9ja1N0YWNrID0gbG9ja1N0YWNrLmZpbHRlcihmdW5jdGlvbiAoaW5zdCkgeyByZXR1cm4gaW5zdCAhPT0gU3R5bGU7IH0pO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBzaG91bGRQcmV2ZW50LCBub25QYXNzaXZlKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNob3VsZFByZXZlbnQsIG5vblBhc3NpdmUpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNjcm9sbFRvdWNoU3RhcnQsIG5vblBhc3NpdmUpO1xuICAgICAgICB9O1xuICAgIH0sIFtdKTtcbiAgICB2YXIgcmVtb3ZlU2Nyb2xsQmFyID0gcHJvcHMucmVtb3ZlU2Nyb2xsQmFyLCBpbmVydCA9IHByb3BzLmluZXJ0O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgaW5lcnQgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFN0eWxlLCB7IHN0eWxlczogZ2VuZXJhdGVTdHlsZShpZCkgfSkgOiBudWxsLFxuICAgICAgICByZW1vdmVTY3JvbGxCYXIgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFJlbW92ZVNjcm9sbEJhciwgeyBnYXBNb2RlOiBwcm9wcy5nYXBNb2RlIH0pIDogbnVsbCkpO1xufVxuZnVuY3Rpb24gZ2V0T3V0ZXJtb3N0U2hhZG93UGFyZW50KG5vZGUpIHtcbiAgICB2YXIgc2hhZG93UGFyZW50ID0gbnVsbDtcbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgIHNoYWRvd1BhcmVudCA9IG5vZGUuaG9zdDtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvd1BhcmVudDtcbn1cbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZ1bGxXaWR0aENsYXNzTmFtZSwgemVyb1JpZ2h0Q2xhc3NOYW1lIH0gZnJvbSAncmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXIvY29uc3RhbnRzJztcbmltcG9ydCB7IHVzZU1lcmdlUmVmcyB9IGZyb20gJ3VzZS1jYWxsYmFjay1yZWYnO1xuaW1wb3J0IHsgZWZmZWN0Q2FyIH0gZnJvbSAnLi9tZWRpdW0nO1xudmFyIG5vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuO1xufTtcbi8qKlxuICogUmVtb3ZlcyBzY3JvbGxiYXIgZnJvbSB0aGUgcGFnZSBhbmQgY29udGFpbiB0aGUgc2Nyb2xsIHdpdGhpbiB0aGUgTG9ja1xuICovXG52YXIgUmVtb3ZlU2Nyb2xsID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHBhcmVudFJlZikge1xuICAgIHZhciByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgdmFyIF9hID0gUmVhY3QudXNlU3RhdGUoe1xuICAgICAgICBvblNjcm9sbENhcHR1cmU6IG5vdGhpbmcsXG4gICAgICAgIG9uV2hlZWxDYXB0dXJlOiBub3RoaW5nLFxuICAgICAgICBvblRvdWNoTW92ZUNhcHR1cmU6IG5vdGhpbmcsXG4gICAgfSksIGNhbGxiYWNrcyA9IF9hWzBdLCBzZXRDYWxsYmFja3MgPSBfYVsxXTtcbiAgICB2YXIgZm9yd2FyZFByb3BzID0gcHJvcHMuZm9yd2FyZFByb3BzLCBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLCBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsIHJlbW92ZVNjcm9sbEJhciA9IHByb3BzLnJlbW92ZVNjcm9sbEJhciwgZW5hYmxlZCA9IHByb3BzLmVuYWJsZWQsIHNoYXJkcyA9IHByb3BzLnNoYXJkcywgc2lkZUNhciA9IHByb3BzLnNpZGVDYXIsIG5vSXNvbGF0aW9uID0gcHJvcHMubm9Jc29sYXRpb24sIGluZXJ0ID0gcHJvcHMuaW5lcnQsIGFsbG93UGluY2hab29tID0gcHJvcHMuYWxsb3dQaW5jaFpvb20sIF9iID0gcHJvcHMuYXMsIENvbnRhaW5lciA9IF9iID09PSB2b2lkIDAgPyAnZGl2JyA6IF9iLCBnYXBNb2RlID0gcHJvcHMuZ2FwTW9kZSwgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wiZm9yd2FyZFByb3BzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJyZW1vdmVTY3JvbGxCYXJcIiwgXCJlbmFibGVkXCIsIFwic2hhcmRzXCIsIFwic2lkZUNhclwiLCBcIm5vSXNvbGF0aW9uXCIsIFwiaW5lcnRcIiwgXCJhbGxvd1BpbmNoWm9vbVwiLCBcImFzXCIsIFwiZ2FwTW9kZVwiXSk7XG4gICAgdmFyIFNpZGVDYXIgPSBzaWRlQ2FyO1xuICAgIHZhciBjb250YWluZXJSZWYgPSB1c2VNZXJnZVJlZnMoW3JlZiwgcGFyZW50UmVmXSk7XG4gICAgdmFyIGNvbnRhaW5lclByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHJlc3QpLCBjYWxsYmFja3MpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgZW5hYmxlZCAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChTaWRlQ2FyLCB7IHNpZGVDYXI6IGVmZmVjdENhciwgcmVtb3ZlU2Nyb2xsQmFyOiByZW1vdmVTY3JvbGxCYXIsIHNoYXJkczogc2hhcmRzLCBub0lzb2xhdGlvbjogbm9Jc29sYXRpb24sIGluZXJ0OiBpbmVydCwgc2V0Q2FsbGJhY2tzOiBzZXRDYWxsYmFja3MsIGFsbG93UGluY2hab29tOiAhIWFsbG93UGluY2hab29tLCBsb2NrUmVmOiByZWYsIGdhcE1vZGU6IGdhcE1vZGUgfSkpLFxuICAgICAgICBmb3J3YXJkUHJvcHMgPyAoUmVhY3QuY2xvbmVFbGVtZW50KFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29udGFpbmVyUHJvcHMpLCB7IHJlZjogY29udGFpbmVyUmVmIH0pKSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChDb250YWluZXIsIF9fYXNzaWduKHt9LCBjb250YWluZXJQcm9wcywgeyBjbGFzc05hbWU6IGNsYXNzTmFtZSwgcmVmOiBjb250YWluZXJSZWYgfSksIGNoaWxkcmVuKSkpKTtcbn0pO1xuUmVtb3ZlU2Nyb2xsLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHJlbW92ZVNjcm9sbEJhcjogdHJ1ZSxcbiAgICBpbmVydDogZmFsc2UsXG59O1xuUmVtb3ZlU2Nyb2xsLmNsYXNzTmFtZXMgPSB7XG4gICAgZnVsbFdpZHRoOiBmdWxsV2lkdGhDbGFzc05hbWUsXG4gICAgemVyb1JpZ2h0OiB6ZXJvUmlnaHRDbGFzc05hbWUsXG59O1xuZXhwb3J0IHsgUmVtb3ZlU2Nyb2xsIH07XG4iLCJ2YXIgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcGFzc2l2ZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydCB2YXIgbm9uUGFzc2l2ZSA9IHBhc3NpdmVTdXBwb3J0ZWQgPyB7IHBhc3NpdmU6IGZhbHNlIH0gOiBmYWxzZTtcbiIsInZhciBhbHdheXNDb250YWluc1Njcm9sbCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gdGV4dGFyZWEgd2lsbCBhbHdheXMgX2NvbnRhaW5fIHNjcm9sbCBpbnNpZGUgc2VsZi4gSXQgb25seSBjYW4gYmUgaGlkZGVuXG4gICAgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJztcbn07XG52YXIgZWxlbWVudENhbkJlU2Nyb2xsZWQgPSBmdW5jdGlvbiAobm9kZSwgb3ZlcmZsb3cpIHtcbiAgICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgcmV0dXJuIChcbiAgICAvLyBub3Qtbm90LXNjcm9sbGFibGVcbiAgICBzdHlsZXNbb3ZlcmZsb3ddICE9PSAnaGlkZGVuJyAmJlxuICAgICAgICAvLyBjb250YWlucyBzY3JvbGwgaW5zaWRlIHNlbGZcbiAgICAgICAgIShzdHlsZXMub3ZlcmZsb3dZID09PSBzdHlsZXMub3ZlcmZsb3dYICYmICFhbHdheXNDb250YWluc1Njcm9sbChub2RlKSAmJiBzdHlsZXNbb3ZlcmZsb3ddID09PSAndmlzaWJsZScpKTtcbn07XG52YXIgZWxlbWVudENvdWxkQmVWU2Nyb2xsZWQgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZWxlbWVudENhbkJlU2Nyb2xsZWQobm9kZSwgJ292ZXJmbG93WScpOyB9O1xudmFyIGVsZW1lbnRDb3VsZEJlSFNjcm9sbGVkID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGVsZW1lbnRDYW5CZVNjcm9sbGVkKG5vZGUsICdvdmVyZmxvd1gnKTsgfTtcbmV4cG9ydCB2YXIgbG9jYXRpb25Db3VsZEJlU2Nyb2xsZWQgPSBmdW5jdGlvbiAoYXhpcywgbm9kZSkge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHZhciBjdXJyZW50ID0gbm9kZTtcbiAgICBkbyB7XG4gICAgICAgIC8vIFNraXAgb3ZlciBzaGFkb3cgcm9vdFxuICAgICAgICBpZiAodHlwZW9mIFNoYWRvd1Jvb3QgIT09ICd1bmRlZmluZWQnICYmIGN1cnJlbnQgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc1Njcm9sbGFibGUgPSBlbGVtZW50Q291bGRCZVNjcm9sbGVkKGF4aXMsIGN1cnJlbnQpO1xuICAgICAgICBpZiAoaXNTY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBnZXRTY3JvbGxWYXJpYWJsZXMoYXhpcywgY3VycmVudCksIHMgPSBfYVsxXSwgZCA9IF9hWzJdO1xuICAgICAgICAgICAgaWYgKHMgPiBkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcbiAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IG93bmVyRG9jdW1lbnQuYm9keSk7XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbnZhciBnZXRWU2Nyb2xsVmFyaWFibGVzID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHNjcm9sbFRvcCA9IF9hLnNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0ID0gX2Euc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgPSBfYS5jbGllbnRIZWlnaHQ7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc2Nyb2xsVG9wLFxuICAgICAgICBzY3JvbGxIZWlnaHQsXG4gICAgICAgIGNsaWVudEhlaWdodCxcbiAgICBdO1xufTtcbnZhciBnZXRIU2Nyb2xsVmFyaWFibGVzID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHNjcm9sbExlZnQgPSBfYS5zY3JvbGxMZWZ0LCBzY3JvbGxXaWR0aCA9IF9hLnNjcm9sbFdpZHRoLCBjbGllbnRXaWR0aCA9IF9hLmNsaWVudFdpZHRoO1xuICAgIHJldHVybiBbXG4gICAgICAgIHNjcm9sbExlZnQsXG4gICAgICAgIHNjcm9sbFdpZHRoLFxuICAgICAgICBjbGllbnRXaWR0aCxcbiAgICBdO1xufTtcbnZhciBlbGVtZW50Q291bGRCZVNjcm9sbGVkID0gZnVuY3Rpb24gKGF4aXMsIG5vZGUpIHtcbiAgICByZXR1cm4gYXhpcyA9PT0gJ3YnID8gZWxlbWVudENvdWxkQmVWU2Nyb2xsZWQobm9kZSkgOiBlbGVtZW50Q291bGRCZUhTY3JvbGxlZChub2RlKTtcbn07XG52YXIgZ2V0U2Nyb2xsVmFyaWFibGVzID0gZnVuY3Rpb24gKGF4aXMsIG5vZGUpIHtcbiAgICByZXR1cm4gYXhpcyA9PT0gJ3YnID8gZ2V0VlNjcm9sbFZhcmlhYmxlcyhub2RlKSA6IGdldEhTY3JvbGxWYXJpYWJsZXMobm9kZSk7XG59O1xudmFyIGdldERpcmVjdGlvbkZhY3RvciA9IGZ1bmN0aW9uIChheGlzLCBkaXJlY3Rpb24pIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZWxlbWVudCdzIGRpcmVjdGlvbiBpcyBydGwgKHJpZ2h0LXRvLWxlZnQpLCB0aGVuIHNjcm9sbExlZnQgaXMgMCB3aGVuIHRoZSBzY3JvbGxiYXIgaXMgYXQgaXRzIHJpZ2h0bW9zdCBwb3NpdGlvbixcbiAgICAgKiBhbmQgdGhlbiBpbmNyZWFzaW5nbHkgbmVnYXRpdmUgYXMgeW91IHNjcm9sbCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQuXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9zY3JvbGxMZWZ0XG4gICAgICovXG4gICAgcmV0dXJuIGF4aXMgPT09ICdoJyAmJiBkaXJlY3Rpb24gPT09ICdydGwnID8gLTEgOiAxO1xufTtcbmV4cG9ydCB2YXIgaGFuZGxlU2Nyb2xsID0gZnVuY3Rpb24gKGF4aXMsIGVuZFRhcmdldCwgZXZlbnQsIHNvdXJjZURlbHRhLCBub092ZXJzY3JvbGwpIHtcbiAgICB2YXIgZGlyZWN0aW9uRmFjdG9yID0gZ2V0RGlyZWN0aW9uRmFjdG9yKGF4aXMsIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVuZFRhcmdldCkuZGlyZWN0aW9uKTtcbiAgICB2YXIgZGVsdGEgPSBkaXJlY3Rpb25GYWN0b3IgKiBzb3VyY2VEZWx0YTtcbiAgICAvLyBmaW5kIHNjcm9sbGFibGUgdGFyZ2V0XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB2YXIgdGFyZ2V0SW5Mb2NrID0gZW5kVGFyZ2V0LmNvbnRhaW5zKHRhcmdldCk7XG4gICAgdmFyIHNob3VsZENhbmNlbFNjcm9sbCA9IGZhbHNlO1xuICAgIHZhciBpc0RlbHRhUG9zaXRpdmUgPSBkZWx0YSA+IDA7XG4gICAgdmFyIGF2YWlsYWJsZVNjcm9sbCA9IDA7XG4gICAgdmFyIGF2YWlsYWJsZVNjcm9sbFRvcCA9IDA7XG4gICAgZG8ge1xuICAgICAgICB2YXIgX2EgPSBnZXRTY3JvbGxWYXJpYWJsZXMoYXhpcywgdGFyZ2V0KSwgcG9zaXRpb24gPSBfYVswXSwgc2Nyb2xsXzEgPSBfYVsxXSwgY2FwYWNpdHkgPSBfYVsyXTtcbiAgICAgICAgdmFyIGVsZW1lbnRTY3JvbGwgPSBzY3JvbGxfMSAtIGNhcGFjaXR5IC0gZGlyZWN0aW9uRmFjdG9yICogcG9zaXRpb247XG4gICAgICAgIGlmIChwb3NpdGlvbiB8fCBlbGVtZW50U2Nyb2xsKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudENvdWxkQmVTY3JvbGxlZChheGlzLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlU2Nyb2xsICs9IGVsZW1lbnRTY3JvbGw7XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlU2Nyb2xsVG9wICs9IHBvc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgfSB3aGlsZSAoXG4gICAgLy8gcG9ydGFsZWQgY29udGVudFxuICAgICghdGFyZ2V0SW5Mb2NrICYmIHRhcmdldCAhPT0gZG9jdW1lbnQuYm9keSkgfHxcbiAgICAgICAgLy8gc2VsZiBjb250ZW50XG4gICAgICAgICh0YXJnZXRJbkxvY2sgJiYgKGVuZFRhcmdldC5jb250YWlucyh0YXJnZXQpIHx8IGVuZFRhcmdldCA9PT0gdGFyZ2V0KSkpO1xuICAgIC8vIGhhbmRsZSBlcHNpbG9uIGFyb3VuZCAwIChub24gc3RhbmRhcmQgem9vbSBsZXZlbHMpXG4gICAgaWYgKGlzRGVsdGFQb3NpdGl2ZSAmJlxuICAgICAgICAoKG5vT3ZlcnNjcm9sbCAmJiBNYXRoLmFicyhhdmFpbGFibGVTY3JvbGwpIDwgMSkgfHwgKCFub092ZXJzY3JvbGwgJiYgZGVsdGEgPiBhdmFpbGFibGVTY3JvbGwpKSkge1xuICAgICAgICBzaG91bGRDYW5jZWxTY3JvbGwgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNEZWx0YVBvc2l0aXZlICYmXG4gICAgICAgICgobm9PdmVyc2Nyb2xsICYmIE1hdGguYWJzKGF2YWlsYWJsZVNjcm9sbFRvcCkgPCAxKSB8fCAoIW5vT3ZlcnNjcm9sbCAmJiAtZGVsdGEgPiBhdmFpbGFibGVTY3JvbGxUb3ApKSkge1xuICAgICAgICBzaG91bGRDYW5jZWxTY3JvbGwgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gc2hvdWxkQ2FuY2VsU2Nyb2xsO1xufTtcbiIsImltcG9ydCB7IGNyZWF0ZVNpZGVjYXJNZWRpdW0gfSBmcm9tICd1c2Utc2lkZWNhcic7XG5leHBvcnQgdmFyIGVmZmVjdENhciA9IGNyZWF0ZVNpZGVjYXJNZWRpdW0oKTtcbiIsImltcG9ydCB7IGV4cG9ydFNpZGVjYXIgfSBmcm9tICd1c2Utc2lkZWNhcic7XG5pbXBvcnQgeyBSZW1vdmVTY3JvbGxTaWRlQ2FyIH0gZnJvbSAnLi9TaWRlRWZmZWN0JztcbmltcG9ydCB7IGVmZmVjdENhciB9IGZyb20gJy4vbWVkaXVtJztcbmV4cG9ydCBkZWZhdWx0IGV4cG9ydFNpZGVjYXIoZWZmZWN0Q2FyLCBSZW1vdmVTY3JvbGxTaWRlQ2FyKTtcbiIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRHJhZ2dhYmxlIGZyb20gJ3JlYWN0LWRyYWdnYWJsZSc7XG5pbXBvcnQgeyBSZXNpemFibGUgfSBmcm9tICdyZS1yZXNpemFibGUnO1xuXG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxyXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxyXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxyXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXHJcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXHJcblxyXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcclxuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG52YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XG5cbnZhciByZXNpemFibGVTdHlsZSA9IHtcbiAgICB3aWR0aDogXCJhdXRvXCIsXG4gICAgaGVpZ2h0OiBcImF1dG9cIixcbiAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDAsXG59O1xudmFyIGdldEVuYWJsZVJlc2l6aW5nQnlGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHsgcmV0dXJuICh7XG4gICAgYm90dG9tOiBmbGFnLFxuICAgIGJvdHRvbUxlZnQ6IGZsYWcsXG4gICAgYm90dG9tUmlnaHQ6IGZsYWcsXG4gICAgbGVmdDogZmxhZyxcbiAgICByaWdodDogZmxhZyxcbiAgICB0b3A6IGZsYWcsXG4gICAgdG9wTGVmdDogZmxhZyxcbiAgICB0b3BSaWdodDogZmxhZyxcbn0pOyB9O1xudmFyIFJuZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUm5kLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJuZChwcm9wcykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmVzaXppbmdQb3NpdGlvbiA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgICBfdGhpcy5vZmZzZXRGcm9tUGFyZW50ID0geyBsZWZ0OiAwLCB0b3A6IDAgfTtcbiAgICAgICAgX3RoaXMucmVzaXphYmxlRWxlbWVudCA9IHsgY3VycmVudDogbnVsbCB9O1xuICAgICAgICBfdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgcmVzaXppbmc6IGZhbHNlLFxuICAgICAgICAgICAgYm91bmRzOiB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1heFdpZHRoOiBwcm9wcy5tYXhXaWR0aCxcbiAgICAgICAgICAgIG1heEhlaWdodDogcHJvcHMubWF4SGVpZ2h0LFxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5vblJlc2l6ZVN0YXJ0ID0gX3RoaXMub25SZXNpemVTdGFydC5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25SZXNpemUgPSBfdGhpcy5vblJlc2l6ZS5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25SZXNpemVTdG9wID0gX3RoaXMub25SZXNpemVTdG9wLmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vbkRyYWdTdGFydCA9IF90aGlzLm9uRHJhZ1N0YXJ0LmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vbkRyYWcgPSBfdGhpcy5vbkRyYWcuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uRHJhZ1N0b3AgPSBfdGhpcy5vbkRyYWdTdG9wLmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5nZXRNYXhTaXplc0Zyb21Qcm9wcyA9IF90aGlzLmdldE1heFNpemVzRnJvbVByb3BzLmJpbmQoX3RoaXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJuZC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0RnJvbVBhcmVudCgpO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQsIGxlZnQgPSBfYS5sZWZ0LCB0b3AgPSBfYS50b3A7XG4gICAgICAgIHZhciBfYiA9IHRoaXMuZ2V0RHJhZ2dhYmxlUG9zaXRpb24oKSwgeCA9IF9iLngsIHkgPSBfYi55O1xuICAgICAgICB0aGlzLmRyYWdnYWJsZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB4OiB4IC0gbGVmdCxcbiAgICAgICAgICAgIHk6IHkgLSB0b3AsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBIQUNLOiBBcHBseSBwb3NpdGlvbiBhZGp1c3RtZW50XG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICB9O1xuICAgIC8vIEhBQ0s6IFRvIGdldCBgcmVhY3QtZHJhZ2dhYmxlYCBzdGF0ZSB4IGFuZCB5LlxuICAgIFJuZC5wcm90b3R5cGUuZ2V0RHJhZ2dhYmxlUG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZHJhZ2dhYmxlLnN0YXRlLCB4ID0gX2EueCwgeSA9IF9hLnk7XG4gICAgICAgIHJldHVybiB7IHg6IHgsIHk6IHkgfTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemFibGUgJiYgdGhpcy5yZXNpemFibGUucGFyZW50Tm9kZTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0UGFyZW50U2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXphYmxlLmdldFBhcmVudFNpemUoKTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0TWF4U2l6ZXNGcm9tUHJvcHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtYXhXaWR0aCA9IHR5cGVvZiB0aGlzLnByb3BzLm1heFdpZHRoID09PSBcInVuZGVmaW5lZFwiID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiB0aGlzLnByb3BzLm1heFdpZHRoO1xuICAgICAgICB2YXIgbWF4SGVpZ2h0ID0gdHlwZW9mIHRoaXMucHJvcHMubWF4SGVpZ2h0ID09PSBcInVuZGVmaW5lZFwiID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiB0aGlzLnByb3BzLm1heEhlaWdodDtcbiAgICAgICAgcmV0dXJuIHsgbWF4V2lkdGg6IG1heFdpZHRoLCBtYXhIZWlnaHQ6IG1heEhlaWdodCB9O1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRTZWxmRWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXphYmxlICYmIHRoaXMucmVzaXphYmxlLnJlc2l6YWJsZTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0T2Zmc2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGJvdW5kYXJ5KSB7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMucHJvcHMuc2NhbGU7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wcm9wcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ3aW5kb3dcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0IC8gc2NhbGU7XG4gICAgICAgICAgICBjYXNlIFwiYm9keVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCAvIHNjYWxlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRhcnkub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLmdldE9mZnNldFdpZHRoID0gZnVuY3Rpb24gKGJvdW5kYXJ5KSB7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMucHJvcHMuc2NhbGU7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wcm9wcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ3aW5kb3dcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggLyBzY2FsZTtcbiAgICAgICAgICAgIGNhc2UgXCJib2R5XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGggLyBzY2FsZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJvdW5kYXJ5Lm9mZnNldFdpZHRoO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLm9uRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25EcmFnU3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25EcmFnU3RhcnQoZSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0RHJhZ2dhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gcG9zO1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMuYm91bmRzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKTtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZTtcbiAgICAgICAgdmFyIGJvdW5kYXJ5O1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwicGFyZW50XCIpIHtcbiAgICAgICAgICAgIGJvdW5kYXJ5ID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSBcImJvZHlcIikge1xuICAgICAgICAgICAgdmFyIHBhcmVudFJlY3RfMSA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRMZWZ0XzEgPSBwYXJlbnRSZWN0XzEubGVmdDtcbiAgICAgICAgICAgIHZhciBwYXJlbnRUb3BfMSA9IHBhcmVudFJlY3RfMS50b3A7XG4gICAgICAgICAgICB2YXIgYm9keVJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdmFyIGxlZnRfMSA9IC0ocGFyZW50TGVmdF8xIC0gcGFyZW50Lm9mZnNldExlZnQgKiBzY2FsZSAtIGJvZHlSZWN0LmxlZnQpIC8gc2NhbGU7XG4gICAgICAgICAgICB2YXIgdG9wXzEgPSAtKHBhcmVudFRvcF8xIC0gcGFyZW50Lm9mZnNldFRvcCAqIHNjYWxlIC0gYm9keVJlY3QudG9wKSAvIHNjYWxlO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gKGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGggLSB0aGlzLnJlc2l6YWJsZS5zaXplLndpZHRoICogc2NhbGUpIC8gc2NhbGUgKyBsZWZ0XzE7XG4gICAgICAgICAgICB2YXIgYm90dG9tID0gKGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0IC0gdGhpcy5yZXNpemFibGUuc2l6ZS5oZWlnaHQgKiBzY2FsZSkgLyBzY2FsZSArIHRvcF8xO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoeyBib3VuZHM6IHsgdG9wOiB0b3BfMSwgcmlnaHQ6IHJpZ2h0LCBib3R0b206IGJvdHRvbSwgbGVmdDogbGVmdF8xIH0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZXNpemFibGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHBhcmVudFJlY3RfMiA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRMZWZ0XzIgPSBwYXJlbnRSZWN0XzIubGVmdDtcbiAgICAgICAgICAgIHZhciBwYXJlbnRUb3BfMiA9IHBhcmVudFJlY3RfMi50b3A7XG4gICAgICAgICAgICB2YXIgbGVmdF8yID0gLShwYXJlbnRMZWZ0XzIgLSBwYXJlbnQub2Zmc2V0TGVmdCAqIHNjYWxlKSAvIHNjYWxlO1xuICAgICAgICAgICAgdmFyIHRvcF8yID0gLShwYXJlbnRUb3BfMiAtIHBhcmVudC5vZmZzZXRUb3AgKiBzY2FsZSkgLyBzY2FsZTtcbiAgICAgICAgICAgIHZhciByaWdodCA9ICh3aW5kb3cuaW5uZXJXaWR0aCAtIHRoaXMucmVzaXphYmxlLnNpemUud2lkdGggKiBzY2FsZSkgLyBzY2FsZSArIGxlZnRfMjtcbiAgICAgICAgICAgIHZhciBib3R0b20gPSAod2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5yZXNpemFibGUuc2l6ZS5oZWlnaHQgKiBzY2FsZSkgLyBzY2FsZSArIHRvcF8yO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoeyBib3VuZHM6IHsgdG9wOiB0b3BfMiwgcmlnaHQ6IHJpZ2h0LCBib3R0b206IGJvdHRvbSwgbGVmdDogbGVmdF8yIH0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMucHJvcHMuYm91bmRzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBib3VuZGFyeSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5wcm9wcy5ib3VuZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGJvdW5kYXJ5ID0gdGhpcy5wcm9wcy5ib3VuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYm91bmRhcnkgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYm91bmRhcnlSZWN0ID0gYm91bmRhcnkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBib3VuZGFyeUxlZnQgPSBib3VuZGFyeVJlY3QubGVmdDtcbiAgICAgICAgdmFyIGJvdW5kYXJ5VG9wID0gYm91bmRhcnlSZWN0LnRvcDtcbiAgICAgICAgdmFyIHBhcmVudFJlY3QgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBwYXJlbnRMZWZ0ID0gcGFyZW50UmVjdC5sZWZ0O1xuICAgICAgICB2YXIgcGFyZW50VG9wID0gcGFyZW50UmVjdC50b3A7XG4gICAgICAgIHZhciBsZWZ0ID0gKGJvdW5kYXJ5TGVmdCAtIHBhcmVudExlZnQpIC8gc2NhbGU7XG4gICAgICAgIHZhciB0b3AgPSBib3VuZGFyeVRvcCAtIHBhcmVudFRvcDtcbiAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXRGcm9tUGFyZW50KCk7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQ7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgYm91bmRzOiB7XG4gICAgICAgICAgICAgICAgdG9wOiB0b3AgLSBvZmZzZXQudG9wLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBsZWZ0ICsgKGJvdW5kYXJ5Lm9mZnNldFdpZHRoIC0gdGhpcy5yZXNpemFibGUuc2l6ZS53aWR0aCkgLSBvZmZzZXQubGVmdCAvIHNjYWxlLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogdG9wICsgKGJvdW5kYXJ5Lm9mZnNldEhlaWdodCAtIHRoaXMucmVzaXphYmxlLnNpemUuaGVpZ2h0KSAtIG9mZnNldC50b3AsXG4gICAgICAgICAgICAgICAgbGVmdDogbGVmdCAtIG9mZnNldC5sZWZ0IC8gc2NhbGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUub25EcmFnID0gZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLm9uRHJhZylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5vZmZzZXRGcm9tUGFyZW50LCBsZWZ0ID0gX2EubGVmdCwgdG9wID0gX2EudG9wO1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMuZHJhZ0F4aXMgfHwgdGhpcy5wcm9wcy5kcmFnQXhpcyA9PT0gXCJib3RoXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLm9uRHJhZyhlLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGF0YSksIHsgeDogZGF0YS54ICsgbGVmdCwgeTogZGF0YS55ICsgdG9wIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmRyYWdBeGlzID09PSBcInhcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25EcmFnKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiBkYXRhLnggKyBsZWZ0LCB5OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueSArIHRvcCwgZGVsdGFZOiAwIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmRyYWdBeGlzID09PSBcInlcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25EcmFnKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueCArIGxlZnQsIHk6IGRhdGEueSArIHRvcCwgZGVsdGFYOiAwIH0pKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vbkRyYWdTdG9wID0gZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLm9uRHJhZ1N0b3ApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBfYSA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudCwgbGVmdCA9IF9hLmxlZnQsIHRvcCA9IF9hLnRvcDtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmRyYWdBeGlzIHx8IHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwiYm90aFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWdTdG9wKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiBkYXRhLnggKyBsZWZ0LCB5OiBkYXRhLnkgKyB0b3AgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwieFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWdTdG9wKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiBkYXRhLnggKyBsZWZ0LCB5OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueSArIHRvcCwgZGVsdGFZOiAwIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmRyYWdBeGlzID09PSBcInlcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25EcmFnU3RvcChlLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGF0YSksIHsgeDogdGhpcy5vcmlnaW5hbFBvc2l0aW9uLnggKyBsZWZ0LCB5OiBkYXRhLnkgKyB0b3AsIGRlbHRhWDogMCB9KSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUub25SZXNpemVTdGFydCA9IGZ1bmN0aW9uIChlLCBkaXIsIGVsZW1lbnRSZWYpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICByZXNpemluZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMucHJvcHMuc2NhbGU7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQ7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLmdldERyYWdnYWJsZVBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMucmVzaXppbmdQb3NpdGlvbiA9IHsgeDogcG9zLnggKyBvZmZzZXQubGVmdCwgeTogcG9zLnkgKyBvZmZzZXQudG9wIH07XG4gICAgICAgIHRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHBvcztcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzEgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICAgICAgdmFyIGJvdW5kYXJ5ID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSBcInBhcmVudFwiKSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcnkgPSBwYXJlbnRfMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSBcImJvZHlcIikge1xuICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSBcIndpbmRvd1wiKSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcnkgPSB3aW5kb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5ib3VuZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBib3VuZGFyeSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5wcm9wcy5ib3VuZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gdGhpcy5wcm9wcy5ib3VuZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc2VsZl8xID0gdGhpcy5nZXRTZWxmRWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKHNlbGZfMSBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgICAoYm91bmRhcnkgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBib3VuZGFyeSA9PT0gd2luZG93KSAmJlxuICAgICAgICAgICAgICAgIHBhcmVudF8xIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE1heFNpemVzRnJvbVByb3BzKCksIG1heFdpZHRoID0gX2EubWF4V2lkdGgsIG1heEhlaWdodCA9IF9hLm1heEhlaWdodDtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50U2l6ZSA9IHRoaXMuZ2V0UGFyZW50U2l6ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChtYXhXaWR0aCAmJiB0eXBlb2YgbWF4V2lkdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heFdpZHRoLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhdGlvID0gTnVtYmVyKG1heFdpZHRoLnJlcGxhY2UoXCIlXCIsIFwiXCIpKSAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoID0gcGFyZW50U2l6ZS53aWR0aCAqIHJhdGlvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heFdpZHRoLmVuZHNXaXRoKFwicHhcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoID0gTnVtYmVyKG1heFdpZHRoLnJlcGxhY2UoXCJweFwiLCBcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1heEhlaWdodCAmJiB0eXBlb2YgbWF4SGVpZ2h0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXhIZWlnaHQuZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmF0aW8gPSBOdW1iZXIobWF4SGVpZ2h0LnJlcGxhY2UoXCIlXCIsIFwiXCIpKSAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IHBhcmVudFNpemUuaGVpZ2h0ICogcmF0aW87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWF4SGVpZ2h0LmVuZHNXaXRoKFwicHhcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IE51bWJlcihtYXhIZWlnaHQucmVwbGFjZShcInB4XCIsIFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc2VsZlJlY3QgPSBzZWxmXzEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGZMZWZ0ID0gc2VsZlJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZlRvcCA9IHNlbGZSZWN0LnRvcDtcbiAgICAgICAgICAgICAgICB2YXIgYm91bmRhcnlSZWN0ID0gdGhpcy5wcm9wcy5ib3VuZHMgPT09IFwid2luZG93XCIgPyB7IGxlZnQ6IDAsIHRvcDogMCB9IDogYm91bmRhcnkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGJvdW5kYXJ5TGVmdCA9IGJvdW5kYXJ5UmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIHZhciBib3VuZGFyeVRvcCA9IGJvdW5kYXJ5UmVjdC50b3A7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFdpZHRoID0gdGhpcy5nZXRPZmZzZXRXaWR0aChib3VuZGFyeSk7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldEhlaWdodCA9IHRoaXMuZ2V0T2Zmc2V0SGVpZ2h0KGJvdW5kYXJ5KTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzTGVmdCA9IGRpci50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFwibGVmdFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzUmlnaHQgPSBkaXIudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChcInJpZ2h0XCIpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNUb3AgPSBkaXIuc3RhcnRzV2l0aChcInRvcFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzQm90dG9tID0gZGlyLnN0YXJ0c1dpdGgoXCJib3R0b21cIik7XG4gICAgICAgICAgICAgICAgaWYgKChoYXNMZWZ0IHx8IGhhc1RvcCkgJiYgdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IChzZWxmTGVmdCAtIGJvdW5kYXJ5TGVmdCkgLyBzY2FsZSArIHRoaXMucmVzaXphYmxlLnNpemUud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBtYXhXaWR0aDogbWF4ID4gTnVtYmVyKG1heFdpZHRoKSA/IG1heFdpZHRoIDogbWF4IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJTkZPOiBUbyBzZXQgYm91bmRzIGluIGBsb2NrIGFzcGVjdCByYXRpbyB3aXRoIGJvdW5kc2AgY2FzZS4gU2VlIGFsc28gdGhhdCBzdG9yeS5cbiAgICAgICAgICAgICAgICBpZiAoaGFzUmlnaHQgfHwgKHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvICYmICFoYXNMZWZ0ICYmICFoYXNUb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSBvZmZzZXRXaWR0aCArIChib3VuZGFyeUxlZnQgLSBzZWxmTGVmdCkgLyBzY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG1heFdpZHRoOiBtYXggPiBOdW1iZXIobWF4V2lkdGgpID8gbWF4V2lkdGggOiBtYXggfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgoaGFzVG9wIHx8IGhhc0xlZnQpICYmIHRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSAoc2VsZlRvcCAtIGJvdW5kYXJ5VG9wKSAvIHNjYWxlICsgdGhpcy5yZXNpemFibGUuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBtYXggPiBOdW1iZXIobWF4SGVpZ2h0KSA/IG1heEhlaWdodCA6IG1heCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElORk86IFRvIHNldCBib3VuZHMgaW4gYGxvY2sgYXNwZWN0IHJhdGlvIHdpdGggYm91bmRzYCBjYXNlLiBTZWUgYWxzbyB0aGF0IHN0b3J5LlxuICAgICAgICAgICAgICAgIGlmIChoYXNCb3R0b20gfHwgKHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvICYmICFoYXNUb3AgJiYgIWhhc0xlZnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSBvZmZzZXRIZWlnaHQgKyAoYm91bmRhcnlUb3AgLSBzZWxmVG9wKSAvIHNjYWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogbWF4ID4gTnVtYmVyKG1heEhlaWdodCkgPyBtYXhIZWlnaHQgOiBtYXgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIG1heFdpZHRoOiB0aGlzLnByb3BzLm1heFdpZHRoLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogdGhpcy5wcm9wcy5tYXhIZWlnaHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uUmVzaXplU3RhcnQoZSwgZGlyLCBlbGVtZW50UmVmKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vblJlc2l6ZSA9IGZ1bmN0aW9uIChlLCBkaXJlY3Rpb24sIGVsZW1lbnRSZWYsIGRlbHRhKSB7XG4gICAgICAgIC8vIElORk86IEFwcGx5IHggYW5kIHkgcG9zaXRpb24gYWRqdXN0bWVudHMgY2F1c2VkIGJ5IHJlc2l6aW5nIHRvIGRyYWdnYWJsZVxuICAgICAgICB2YXIgbmV3UG9zID0geyB4OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueCwgeTogdGhpcy5vcmlnaW5hbFBvc2l0aW9uLnkgfTtcbiAgICAgICAgdmFyIGxlZnQgPSAtZGVsdGEud2lkdGg7XG4gICAgICAgIHZhciB0b3AgPSAtZGVsdGEuaGVpZ2h0O1xuICAgICAgICB2YXIgZGlyZWN0aW9ucyA9IFtcInRvcFwiLCBcImxlZnRcIiwgXCJ0b3BMZWZ0XCIsIFwiYm90dG9tTGVmdFwiLCBcInRvcFJpZ2h0XCJdO1xuICAgICAgICBpZiAoZGlyZWN0aW9ucy5pbmNsdWRlcyhkaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBcImJvdHRvbUxlZnRcIikge1xuICAgICAgICAgICAgICAgIG5ld1Bvcy54ICs9IGxlZnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT09IFwidG9wUmlnaHRcIikge1xuICAgICAgICAgICAgICAgIG5ld1Bvcy55ICs9IHRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1Bvcy54ICs9IGxlZnQ7XG4gICAgICAgICAgICAgICAgbmV3UG9zLnkgKz0gdG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBkcmFnZ2FibGVTdGF0ZSA9IHRoaXMuZHJhZ2dhYmxlLnN0YXRlO1xuICAgICAgICBpZiAobmV3UG9zLnggIT09IGRyYWdnYWJsZVN0YXRlLnggfHwgbmV3UG9zLnkgIT09IGRyYWdnYWJsZVN0YXRlLnkpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dhYmxlLnNldFN0YXRlKG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXRGcm9tUGFyZW50KCk7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQ7XG4gICAgICAgIHZhciB4ID0gdGhpcy5nZXREcmFnZ2FibGVQb3NpdGlvbigpLnggKyBvZmZzZXQubGVmdDtcbiAgICAgICAgdmFyIHkgPSB0aGlzLmdldERyYWdnYWJsZVBvc2l0aW9uKCkueSArIG9mZnNldC50b3A7XG4gICAgICAgIHRoaXMucmVzaXppbmdQb3NpdGlvbiA9IHsgeDogeCwgeTogeSB9O1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMub25SZXNpemUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucHJvcHMub25SZXNpemUoZSwgZGlyZWN0aW9uLCBlbGVtZW50UmVmLCBkZWx0YSwge1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vblJlc2l6ZVN0b3AgPSBmdW5jdGlvbiAoZSwgZGlyZWN0aW9uLCBlbGVtZW50UmVmLCBkZWx0YSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0TWF4U2l6ZXNGcm9tUHJvcHMoKSwgbWF4V2lkdGggPSBfYS5tYXhXaWR0aCwgbWF4SGVpZ2h0ID0gX2EubWF4SGVpZ2h0O1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgbWF4V2lkdGg6IG1heFdpZHRoLCBtYXhIZWlnaHQ6IG1heEhlaWdodCB9KTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25SZXNpemVTdG9wKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uUmVzaXplU3RvcChlLCBkaXJlY3Rpb24sIGVsZW1lbnRSZWYsIGRlbHRhLCB0aGlzLnJlc2l6aW5nUG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLnVwZGF0ZVNpemUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlc2l6YWJsZS51cGRhdGVTaXplKHsgd2lkdGg6IHNpemUud2lkdGgsIGhlaWdodDogc2l6ZS5oZWlnaHQgfSk7XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlLnNldFN0YXRlKHBvc2l0aW9uKTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUudXBkYXRlT2Zmc2V0RnJvbVBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcy5nZXRTZWxmRWxlbWVudCgpO1xuICAgICAgICBpZiAoIXBhcmVudCB8fCBzZWxmID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50UmVjdCA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIHBhcmVudExlZnQgPSBwYXJlbnRSZWN0LmxlZnQ7XG4gICAgICAgIHZhciBwYXJlbnRUb3AgPSBwYXJlbnRSZWN0LnRvcDtcbiAgICAgICAgdmFyIHNlbGZSZWN0ID0gc2VsZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5nZXREcmFnZ2FibGVQb3NpdGlvbigpO1xuICAgICAgICB2YXIgc2Nyb2xsTGVmdCA9IHBhcmVudC5zY3JvbGxMZWZ0O1xuICAgICAgICB2YXIgc2Nyb2xsVG9wID0gcGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgdGhpcy5vZmZzZXRGcm9tUGFyZW50ID0ge1xuICAgICAgICAgICAgbGVmdDogc2VsZlJlY3QubGVmdCAtIHBhcmVudExlZnQgKyBzY3JvbGxMZWZ0IC0gcG9zaXRpb24ueCAqIHNjYWxlLFxuICAgICAgICAgICAgdG9wOiBzZWxmUmVjdC50b3AgLSBwYXJlbnRUb3AgKyBzY3JvbGxUb3AgLSBwb3NpdGlvbi55ICogc2NhbGUsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgZGlzYWJsZURyYWdnaW5nID0gX2EuZGlzYWJsZURyYWdnaW5nLCBzdHlsZSA9IF9hLnN0eWxlLCBkcmFnSGFuZGxlQ2xhc3NOYW1lID0gX2EuZHJhZ0hhbmRsZUNsYXNzTmFtZSwgcG9zaXRpb24gPSBfYS5wb3NpdGlvbiwgb25Nb3VzZURvd24gPSBfYS5vbk1vdXNlRG93biwgb25Nb3VzZVVwID0gX2Eub25Nb3VzZVVwLCBkcmFnQXhpcyA9IF9hLmRyYWdBeGlzLCBkcmFnR3JpZCA9IF9hLmRyYWdHcmlkLCBib3VuZHMgPSBfYS5ib3VuZHMsIGVuYWJsZVVzZXJTZWxlY3RIYWNrID0gX2EuZW5hYmxlVXNlclNlbGVjdEhhY2ssIGNhbmNlbCA9IF9hLmNhbmNlbCwgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgb25SZXNpemVTdGFydCA9IF9hLm9uUmVzaXplU3RhcnQsIG9uUmVzaXplID0gX2Eub25SZXNpemUsIG9uUmVzaXplU3RvcCA9IF9hLm9uUmVzaXplU3RvcCwgb25EcmFnU3RhcnQgPSBfYS5vbkRyYWdTdGFydCwgb25EcmFnID0gX2Eub25EcmFnLCBvbkRyYWdTdG9wID0gX2Eub25EcmFnU3RvcCwgcmVzaXplSGFuZGxlU3R5bGVzID0gX2EucmVzaXplSGFuZGxlU3R5bGVzLCByZXNpemVIYW5kbGVDbGFzc2VzID0gX2EucmVzaXplSGFuZGxlQ2xhc3NlcywgcmVzaXplSGFuZGxlQ29tcG9uZW50ID0gX2EucmVzaXplSGFuZGxlQ29tcG9uZW50LCBlbmFibGVSZXNpemluZyA9IF9hLmVuYWJsZVJlc2l6aW5nLCByZXNpemVHcmlkID0gX2EucmVzaXplR3JpZCwgcmVzaXplSGFuZGxlV3JhcHBlckNsYXNzID0gX2EucmVzaXplSGFuZGxlV3JhcHBlckNsYXNzLCByZXNpemVIYW5kbGVXcmFwcGVyU3R5bGUgPSBfYS5yZXNpemVIYW5kbGVXcmFwcGVyU3R5bGUsIHNjYWxlID0gX2Euc2NhbGUsIGFsbG93QW55Q2xpY2sgPSBfYS5hbGxvd0FueUNsaWNrLCByZXNpemFibGVQcm9wcyA9IF9fcmVzdChfYSwgW1wiZGlzYWJsZURyYWdnaW5nXCIsIFwic3R5bGVcIiwgXCJkcmFnSGFuZGxlQ2xhc3NOYW1lXCIsIFwicG9zaXRpb25cIiwgXCJvbk1vdXNlRG93blwiLCBcIm9uTW91c2VVcFwiLCBcImRyYWdBeGlzXCIsIFwiZHJhZ0dyaWRcIiwgXCJib3VuZHNcIiwgXCJlbmFibGVVc2VyU2VsZWN0SGFja1wiLCBcImNhbmNlbFwiLCBcImNoaWxkcmVuXCIsIFwib25SZXNpemVTdGFydFwiLCBcIm9uUmVzaXplXCIsIFwib25SZXNpemVTdG9wXCIsIFwib25EcmFnU3RhcnRcIiwgXCJvbkRyYWdcIiwgXCJvbkRyYWdTdG9wXCIsIFwicmVzaXplSGFuZGxlU3R5bGVzXCIsIFwicmVzaXplSGFuZGxlQ2xhc3Nlc1wiLCBcInJlc2l6ZUhhbmRsZUNvbXBvbmVudFwiLCBcImVuYWJsZVJlc2l6aW5nXCIsIFwicmVzaXplR3JpZFwiLCBcInJlc2l6ZUhhbmRsZVdyYXBwZXJDbGFzc1wiLCBcInJlc2l6ZUhhbmRsZVdyYXBwZXJTdHlsZVwiLCBcInNjYWxlXCIsIFwiYWxsb3dBbnlDbGlja1wiXSk7XG4gICAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSB0aGlzLnByb3BzLmRlZmF1bHQgPyBfX2Fzc2lnbih7fSwgdGhpcy5wcm9wcy5kZWZhdWx0KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUmVtb3ZlIHVua25vd24gcHJvcHMsIHNlZSBhbHNvIGh0dHBzOi8vcmVhY3Rqcy5vcmcvd2FybmluZ3MvdW5rbm93bi1wcm9wLmh0bWxcbiAgICAgICAgZGVsZXRlIHJlc2l6YWJsZVByb3BzLmRlZmF1bHQ7XG4gICAgICAgIHZhciBjdXJzb3JTdHlsZSA9IGRpc2FibGVEcmFnZ2luZyB8fCBkcmFnSGFuZGxlQ2xhc3NOYW1lID8geyBjdXJzb3I6IFwiYXV0b1wiIH0gOiB7IGN1cnNvcjogXCJtb3ZlXCIgfTtcbiAgICAgICAgdmFyIGlubmVyU3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzaXphYmxlU3R5bGUpLCBjdXJzb3JTdHlsZSksIHN0eWxlKTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5vZmZzZXRGcm9tUGFyZW50LCBsZWZ0ID0gX2IubGVmdCwgdG9wID0gX2IudG9wO1xuICAgICAgICB2YXIgZHJhZ2dhYmxlUG9zaXRpb247XG4gICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgZHJhZ2dhYmxlUG9zaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeDogcG9zaXRpb24ueCAtIGxlZnQsXG4gICAgICAgICAgICAgICAgeTogcG9zaXRpb24ueSAtIHRvcCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gSU5GTzogTWFrZSB1bmNvbnRvcm9sbGVkIGNvbXBvbmVudCB3aGVuIHJlc2l6aW5nIHRvIGNvbnRyb2wgcG9zaXRpb24gYnkgc2V0UG9zdGlvbi5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuc3RhdGUucmVzaXppbmcgPyB1bmRlZmluZWQgOiBkcmFnZ2FibGVQb3NpdGlvbjtcbiAgICAgICAgdmFyIGRyYWdBeGlzT3JVbmRlZmluZWQgPSB0aGlzLnN0YXRlLnJlc2l6aW5nID8gXCJib3RoXCIgOiBkcmFnQXhpcztcbiAgICAgICAgcmV0dXJuIChjcmVhdGVFbGVtZW50KERyYWdnYWJsZSwgeyByZWY6IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgX3RoaXMuZHJhZ2dhYmxlID0gYztcbiAgICAgICAgICAgIH0sIGhhbmRsZTogZHJhZ0hhbmRsZUNsYXNzTmFtZSA/IFwiLlwiLmNvbmNhdChkcmFnSGFuZGxlQ2xhc3NOYW1lKSA6IHVuZGVmaW5lZCwgZGVmYXVsdFBvc2l0aW9uOiBkZWZhdWx0VmFsdWUsIG9uTW91c2VEb3duOiBvbk1vdXNlRG93biwgXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBvbk1vdXNlVXA6IG9uTW91c2VVcCwgb25TdGFydDogdGhpcy5vbkRyYWdTdGFydCwgb25EcmFnOiB0aGlzLm9uRHJhZywgb25TdG9wOiB0aGlzLm9uRHJhZ1N0b3AsIGF4aXM6IGRyYWdBeGlzT3JVbmRlZmluZWQsIGRpc2FibGVkOiBkaXNhYmxlRHJhZ2dpbmcsIGdyaWQ6IGRyYWdHcmlkLCBib3VuZHM6IGJvdW5kcyA/IHRoaXMuc3RhdGUuYm91bmRzIDogdW5kZWZpbmVkLCBwb3NpdGlvbjogcG9zLCBlbmFibGVVc2VyU2VsZWN0SGFjazogZW5hYmxlVXNlclNlbGVjdEhhY2ssIGNhbmNlbDogY2FuY2VsLCBzY2FsZTogc2NhbGUsIGFsbG93QW55Q2xpY2s6IGFsbG93QW55Q2xpY2ssIG5vZGVSZWY6IHRoaXMucmVzaXphYmxlRWxlbWVudCB9LFxuICAgICAgICAgICAgY3JlYXRlRWxlbWVudChSZXNpemFibGUsIF9fYXNzaWduKHt9LCByZXNpemFibGVQcm9wcywgeyByZWY6IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVzaXphYmxlID0gYztcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVzaXphYmxlRWxlbWVudC5jdXJyZW50ID0gYy5yZXNpemFibGU7XG4gICAgICAgICAgICAgICAgfSwgZGVmYXVsdFNpemU6IGRlZmF1bHRWYWx1ZSwgc2l6ZTogdGhpcy5wcm9wcy5zaXplLCBlbmFibGU6IHR5cGVvZiBlbmFibGVSZXNpemluZyA9PT0gXCJib29sZWFuXCIgPyBnZXRFbmFibGVSZXNpemluZ0J5RmxhZyhlbmFibGVSZXNpemluZykgOiBlbmFibGVSZXNpemluZywgb25SZXNpemVTdGFydDogdGhpcy5vblJlc2l6ZVN0YXJ0LCBvblJlc2l6ZTogdGhpcy5vblJlc2l6ZSwgb25SZXNpemVTdG9wOiB0aGlzLm9uUmVzaXplU3RvcCwgc3R5bGU6IGlubmVyU3R5bGUsIG1pbldpZHRoOiB0aGlzLnByb3BzLm1pbldpZHRoLCBtaW5IZWlnaHQ6IHRoaXMucHJvcHMubWluSGVpZ2h0LCBtYXhXaWR0aDogdGhpcy5zdGF0ZS5yZXNpemluZyA/IHRoaXMuc3RhdGUubWF4V2lkdGggOiB0aGlzLnByb3BzLm1heFdpZHRoLCBtYXhIZWlnaHQ6IHRoaXMuc3RhdGUucmVzaXppbmcgPyB0aGlzLnN0YXRlLm1heEhlaWdodCA6IHRoaXMucHJvcHMubWF4SGVpZ2h0LCBncmlkOiByZXNpemVHcmlkLCBoYW5kbGVXcmFwcGVyQ2xhc3M6IHJlc2l6ZUhhbmRsZVdyYXBwZXJDbGFzcywgaGFuZGxlV3JhcHBlclN0eWxlOiByZXNpemVIYW5kbGVXcmFwcGVyU3R5bGUsIGxvY2tBc3BlY3RSYXRpbzogdGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW8sIGxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGg6IHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCwgbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQ6IHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQsIGhhbmRsZVN0eWxlczogcmVzaXplSGFuZGxlU3R5bGVzLCBoYW5kbGVDbGFzc2VzOiByZXNpemVIYW5kbGVDbGFzc2VzLCBoYW5kbGVDb21wb25lbnQ6IHJlc2l6ZUhhbmRsZUNvbXBvbmVudCwgc2NhbGU6IHRoaXMucHJvcHMuc2NhbGUgfSksIGNoaWxkcmVuKSkpO1xuICAgIH07XG4gICAgUm5kLmRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgbWF4V2lkdGg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICBtYXhIZWlnaHQ6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgb25SZXNpemVTdGFydDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvblJlc2l6ZTogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvblJlc2l6ZVN0b3A6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25EcmFnU3RhcnQ6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25EcmFnOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uRHJhZ1N0b3A6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICB9O1xuICAgIHJldHVybiBSbmQ7XG59KFB1cmVDb21wb25lbnQpKTtcblxuZXhwb3J0IHsgUm5kIH07XG4iLCJpbXBvcnQgeyBjbmIgfSBmcm9tICdjbmJ1aWxkZXInO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgem9vbUxldmVsIH0gZnJvbSAnem9vbS1sZXZlbCc7XG5pbXBvcnQgeyBEcmFnZ2FibGVDb3JlIH0gZnJvbSAncmVhY3QtZHJhZ2dhYmxlJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG52YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICB9LCBfdHlwZW9mKG9iaik7XG59XG5cbnZhciBkb2MgPSAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoZG9jdW1lbnQpKSA9PT0gJ29iamVjdCcgPyBkb2N1bWVudCA6IG51bGw7XG52YXIgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbnZhciBpc1VuZGVmID0gZnVuY3Rpb24gaXNVbmRlZih2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCc7XG59O1xudmFyIGlzRnVuID0gZnVuY3Rpb24gaXNGdW4odikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdmdW5jdGlvbic7XG59O1xudmFyIGlzTnVtID0gZnVuY3Rpb24gaXNOdW0odikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gV2lsbCByZXR1cm4gcmVuZGVyZXIgcmVzdWx0IGlmIHByZXNlbnRlZCwgZGl2IGVsZW1lbnQgb3RoZXJ3aXNlLlxyXG4gKiBJZiByZW5kZXJlciBpcyBwcmVzZW50ZWQgaXQnbGwgcmVjZWl2ZSBgZWxlbWVudFJlZmAgZnVuY3Rpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMgSFRNTEVsZW1lbnQncyByZWYuXHJcbiAqXHJcbiAqIEBwYXJhbSBwcm9wcyB7RWxlbWVudFByb3BzV2l0aEVsZW1lbnRSZWZBbmRSZW5kZXJlcn1cclxuICogQHBhcmFtIGVsZW1lbnRSZWYge0VsZW1lbnRSZWZ9XHJcbiAqL1xuXG52YXIgcmVuZGVyRGl2V2l0aFJlbmRlcmVyID0gZnVuY3Rpb24gcmVuZGVyRGl2V2l0aFJlbmRlcmVyKHByb3BzLCBlbGVtZW50UmVmKSB7XG4gIGlmIChpc0Z1bihwcm9wcy5yZW5kZXJlcikpIHtcbiAgICBwcm9wcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcbiAgICB2YXIgcmVuZGVyZXIgPSBwcm9wcy5yZW5kZXJlcjtcbiAgICBkZWxldGUgcHJvcHMucmVuZGVyZXI7XG4gICAgcmV0dXJuIHJlbmRlcmVyKHByb3BzKTtcbiAgfVxuXG4gIGRlbGV0ZSBwcm9wcy5lbGVtZW50UmVmO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IGVsZW1lbnRSZWZcbiAgfSkpO1xufTtcblxudmFyIGdldElubmVyU2l6ZSA9IGZ1bmN0aW9uIGdldElubmVyU2l6ZShlbCwgZGltZW5zaW9uLCBwYWRkaW5nMSwgcGFkZGluZzIpIHtcbiAgdmFyIHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoZWwpO1xuXG4gIGlmIChzdHlsZXMuYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgKE51bWJlci5wYXJzZUZsb2F0KHN0eWxlc1tkaW1lbnNpb25dKSB8fCAwKSAtIChOdW1iZXIucGFyc2VGbG9hdChzdHlsZXNbcGFkZGluZzFdKSB8fCAwKSAtIChOdW1iZXIucGFyc2VGbG9hdChzdHlsZXNbcGFkZGluZzJdKSB8fCAwKSk7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzW2RpbWVuc2lvbl0pIHx8IDA7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gZWxlbWVudCdzIGhlaWdodCB3aXRob3V0IHBhZGRpbmdcclxuICovXG5cblxudmFyIGdldElubmVySGVpZ2h0ID0gZnVuY3Rpb24gZ2V0SW5uZXJIZWlnaHQoZWwpIHtcbiAgcmV0dXJuIGdldElubmVyU2l6ZShlbCwgJ2hlaWdodCcsICdwYWRkaW5nVG9wJywgJ3BhZGRpbmdCb3R0b20nKTtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIFJldHVybiBlbGVtZW50J3Mgd2lkdGggd2l0aG91dCBwYWRkaW5nXHJcbiAqL1xuXG52YXIgZ2V0SW5uZXJXaWR0aCA9IGZ1bmN0aW9uIGdldElubmVyV2lkdGgoZWwpIHtcbiAgcmV0dXJuIGdldElubmVyU2l6ZShlbCwgJ3dpZHRoJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcpO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIHVuaXF1ZSBVVUlEIHY0XHJcbiAqL1xuXG52YXIgdXVpZCA9IGZ1bmN0aW9uIHV1aWQoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tc2hhZG93XG4gIHZhciB1dWlkID0gJyc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKSB7XG4gICAgc3dpdGNoIChpKSB7XG4gICAgICBjYXNlIDg6XG4gICAgICBjYXNlIDIwOlxuICAgICAgICB7XG4gICAgICAgICAgdXVpZCArPSBcIi1cIi5jb25jYXQoTWF0aC50cnVuYyhNYXRoLnJhbmRvbSgpICogMTYpLnRvU3RyaW5nKDE2KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAxMjpcbiAgICAgICAge1xuICAgICAgICAgIHV1aWQgKz0gJy00JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDE2OlxuICAgICAgICB7XG4gICAgICAgICAgdXVpZCArPSBcIi1cIi5jb25jYXQoKE1hdGgucmFuZG9tKCkgKiAxNiB8IDAgJiAzIHwgOCkudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgdXVpZCArPSBNYXRoLnRydW5jKE1hdGgucmFuZG9tKCkgKiAxNikudG9TdHJpbmcoMTYpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHV1aWQ7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDYWxjdWxhdGUgdGh1bWIgc2l6ZSBmb3IgZ2l2ZW4gdmlld3BvcnQgYW5kIHRyYWNrIHBhcmFtZXRlcnNcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGNvbnRlbnRTaXplIC0gU2Nyb2xsYWJsZSBjb250ZW50IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHZpZXdwb3J0U2l6ZSAtIFZpZXdwb3J0IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHRyYWNrU2l6ZSAtIFRyYWNrIHNpemUgdGh1bWIgY2FuIG1vdmVcclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbmltYWxTaXplIC0gTWluaW1hbCB0aHVtYidzIHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IG1heGltYWxTaXplIC0gTWF4aW1hbCB0aHVtYidzIHNpemVcclxuICovXG5cbnZhciBjYWxjVGh1bWJTaXplID0gZnVuY3Rpb24gY2FsY1RodW1iU2l6ZShjb250ZW50U2l6ZSwgdmlld3BvcnRTaXplLCB0cmFja1NpemUsIG1pbmltYWxTaXplLCBtYXhpbWFsU2l6ZSkge1xuICBpZiAodmlld3BvcnRTaXplID49IGNvbnRlbnRTaXplKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2YXIgdGh1bWJTaXplID0gdmlld3BvcnRTaXplIC8gY29udGVudFNpemUgKiB0cmFja1NpemU7XG5cbiAgaWYgKGlzTnVtKG1heGltYWxTaXplKSkge1xuICAgIHRodW1iU2l6ZSA9IE1hdGgubWluKG1heGltYWxTaXplLCB0aHVtYlNpemUpO1xuICB9XG5cbiAgaWYgKGlzTnVtKG1pbmltYWxTaXplKSkge1xuICAgIHRodW1iU2l6ZSA9IE1hdGgubWF4KG1pbmltYWxTaXplLCB0aHVtYlNpemUpO1xuICB9XG5cbiAgcmV0dXJuIHRodW1iU2l6ZTtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIENhbGN1bGF0ZSB0aHVtYiBvZmZzZXQgZm9yIGdpdmVuIHZpZXdwb3J0LCB0cmFjayBhbmQgdGh1bWIgcGFyYW1ldGVyc1xyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY29udGVudFNpemUgLSBTY3JvbGxhYmxlIGNvbnRlbnQgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmlld3BvcnRTaXplIC0gVmlld3BvcnQgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdHJhY2tTaXplIC0gVHJhY2sgc2l6ZSB0aHVtYiBjYW4gbW92ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdGh1bWJTaXplIC0gVGh1bWIgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gc2Nyb2xsIC0gU2Nyb2xsIHZhbHVlIHRvIHJlcHJlc2VudFxyXG4gKi9cblxudmFyIGNhbGNUaHVtYk9mZnNldCA9IGZ1bmN0aW9uIGNhbGNUaHVtYk9mZnNldChjb250ZW50U2l6ZSwgdmlld3BvcnRTaXplLCB0cmFja1NpemUsIHRodW1iU2l6ZSwgc2Nyb2xsKSB7XG4gIGlmICghc2Nyb2xsIHx8ICF0aHVtYlNpemUgfHwgdmlld3BvcnRTaXplID49IGNvbnRlbnRTaXplKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gKHRyYWNrU2l6ZSAtIHRodW1iU2l6ZSkgKiBzY3JvbGwgLyAoY29udGVudFNpemUgLSB2aWV3cG9ydFNpemUpO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2FsY3VsYXRlIHNjcm9sbCBmb3IgZ2l2ZW4gdmlld3BvcnQsIHRyYWNrIGFuZCB0aHVtYiBwYXJhbWV0ZXJzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb250ZW50U2l6ZSAtIFNjcm9sbGFibGUgY29udGVudCBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2aWV3cG9ydFNpemUgLSBWaWV3cG9ydCBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0cmFja1NpemUgLSBUcmFjayBzaXplIHRodW1iIGNhbiBtb3ZlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aHVtYlNpemUgLSBUaHVtYiBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aHVtYk9mZnNldCAtIFRodW1iJ3Mgb2Zmc2V0IHJlcHJlc2VudGluZyB0aGUgc2Nyb2xsXHJcbiAqL1xuXG52YXIgY2FsY1Njcm9sbEZvclRodW1iT2Zmc2V0ID0gZnVuY3Rpb24gY2FsY1Njcm9sbEZvclRodW1iT2Zmc2V0KGNvbnRlbnRTaXplLCB2aWV3cG9ydFNpemUsIHRyYWNrU2l6ZSwgdGh1bWJTaXplLCB0aHVtYk9mZnNldCkge1xuICBpZiAoIXRodW1iT2Zmc2V0IHx8ICF0aHVtYlNpemUgfHwgdmlld3BvcnRTaXplID49IGNvbnRlbnRTaXplKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gdGh1bWJPZmZzZXQgKiAoY29udGVudFNpemUgLSB2aWV3cG9ydFNpemUpIC8gKHRyYWNrU2l6ZSAtIHRodW1iU2l6ZSk7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHNjcm9sbGJhciB3aWR0aCBzcGVjaWZpYyBmb3IgY3VycmVudCBlbnZpcm9ubWVudC4gQ2FuIHJldHVybiB1bmRlZmluZWQgaWYgRE9NIGlzIG5vdCByZWFkeSB5ZXQuXHJcbiAqL1xuXG52YXIgZ2V0U2Nyb2xsYmFyV2lkdGggPSBmdW5jdGlvbiBnZXRTY3JvbGxiYXJXaWR0aChmb3JjZSkge1xuICBpZiAoZm9yY2UgPT09IHZvaWQgMCkge1xuICAgIGZvcmNlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRvYykge1xuICAgIGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZSA9IDA7XG4gICAgcmV0dXJuIGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZTtcbiAgfVxuXG4gIGlmICghZm9yY2UgJiYgIWlzVW5kZWYoZ2V0U2Nyb2xsYmFyV2lkdGguX2NhY2hlKSkge1xuICAgIHJldHVybiBnZXRTY3JvbGxiYXJXaWR0aC5fY2FjaGU7XG4gIH1cblxuICB2YXIgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAncG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwcHg7aGVpZ2h0OjEwMHB4O3RvcDotOTk5cHg7bGVmdDotOTk5cHg7b3ZlcmZsb3c6c2Nyb2xsOycpO1xuICBkb2MuYm9keS5hcHBlbmQoZWwpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gIGlmIChlbC5jbGllbnRXaWR0aCA9PT0gMCkge1xuICAgIC8vIERvIG5vdCBldmVuIGNhY2hlIHRoaXMgdmFsdWUgYmVjYXVzZSB0aGVyZSBpcyBubyBjYWxjdWxhdGlvbnMuIElzc3VlIGh0dHBzOi8vZ2l0aHViLmNvbS94b2JvdHlpL3JlYWN0LXNjcm9sbGJhcnMtY3VzdG9tL2lzc3Vlcy8xMjNcbiAgICBlbC5yZW1vdmUoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBnZXRTY3JvbGxiYXJXaWR0aC5fY2FjaGUgPSAxMDAgLSBlbC5jbGllbnRXaWR0aDtcbiAgZWwucmVtb3ZlKCk7XG4gIHJldHVybiBnZXRTY3JvbGxiYXJXaWR0aC5fY2FjaGU7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBEZXRlY3QgbmVlZCBvZiBob3Jpem9udGFsIHNjcm9sbCByZXZlcnNlIHdoaWxlIFJUTC5cclxuICovXG5cbnZhciBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsID0gZnVuY3Rpb24gc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbChmb3JjZSkge1xuICBpZiAoZm9yY2UgPT09IHZvaWQgMCkge1xuICAgIGZvcmNlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoIWZvcmNlICYmICFpc1VuZGVmKHNob3VsZFJldmVyc2VSdGxTY3JvbGwuX2NhY2hlKSkge1xuICAgIHJldHVybiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsLl9jYWNoZTtcbiAgfVxuXG4gIGlmICghZG9jKSB7XG4gICAgc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGUgPSBmYWxzZTtcbiAgICByZXR1cm4gc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGU7XG4gIH1cblxuICB2YXIgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBjaGlsZCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZWwuYXBwZW5kKGNoaWxkKTtcbiAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsICdwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDBweDtoZWlnaHQ6MTAwcHg7dG9wOi05OTlweDtsZWZ0Oi05OTlweDtvdmVyZmxvdzpzY3JvbGw7ZGlyZWN0aW9uOnJ0bCcpO1xuICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOjEwMDBweDtoZWlnaHQ6MTAwMHB4Jyk7XG4gIGRvYy5ib2R5LmFwcGVuZChlbCk7XG4gIGVsLnNjcm9sbExlZnQgPSAtNTA7XG4gIHNob3VsZFJldmVyc2VSdGxTY3JvbGwuX2NhY2hlID0gZWwuc2Nyb2xsTGVmdCA9PT0gLTUwO1xuICBlbC5yZW1vdmUoKTtcbiAgcmV0dXJuIHNob3VsZFJldmVyc2VSdGxTY3JvbGwuX2NhY2hlO1xufTtcblxudmFyIEVtaXR0ciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEVtaXR0cihtYXhIYW5kbGVycykge1xuICAgIGlmIChtYXhIYW5kbGVycyA9PT0gdm9pZCAwKSB7XG4gICAgICBtYXhIYW5kbGVycyA9IDEwO1xuICAgIH1cblxuICAgIHRoaXMuc2V0TWF4SGFuZGxlcnMobWF4SGFuZGxlcnMpO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIEVtaXR0ci5fY2FsbEV2ZW50SGFuZGxlcnMgPSBmdW5jdGlvbiAoZW1pdHRlciwgaGFuZGxlcnMsIGFyZ3MpIHtcbiAgICBpZiAoIWhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIFJlZmxlY3QuYXBwbHkoaGFuZGxlcnNbMF0sIGVtaXR0ZXIsIGFyZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhhbmRsZXJzID0gX19zcHJlYWRBcnJheShbXSwgaGFuZGxlcnMsIHRydWUpO1xuICAgIHZhciBpZHg7XG5cbiAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGhhbmRsZXJzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgIFJlZmxlY3QuYXBwbHkoaGFuZGxlcnNbaWR4XSwgZW1pdHRlciwgYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUuc2V0TWF4SGFuZGxlcnMgPSBmdW5jdGlvbiAoY291bnQpIHtcbiAgICBpZiAoIWlzTnVtKGNvdW50KSB8fCBjb3VudCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgbWF4SGFuZGxlcnMgdG8gYmUgYSBwb3NpdGl2ZSBudW1iZXIsIGdvdCAnXCIuY29uY2F0KGNvdW50LCBcIicgb2YgdHlwZSBcIikuY29uY2F0KF90eXBlb2YoY291bnQpKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4SGFuZGxlcnMgPSBjb3VudDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLmdldE1heEhhbmRsZXJzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhIYW5kbGVycztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICBpZiAoX3R5cGVvZih0aGlzLl9oYW5kbGVyc1tuYW1lXSkgIT09ICdvYmplY3QnIHx8ICFBcnJheS5pc0FycmF5KHRoaXMuX2hhbmRsZXJzW25hbWVdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIEVtaXR0ci5fY2FsbEV2ZW50SGFuZGxlcnModGhpcywgdGhpcy5faGFuZGxlcnNbbmFtZV0sIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgRW1pdHRyLl9hZGRIYW5kbGVyKHRoaXMsIG5hbWUsIGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5wcmVwZW5kT24gPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIEVtaXR0ci5fYWRkSGFuZGxlcih0aGlzLCBuYW1lLCBoYW5kbGVyLCB0cnVlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgaWYgKCFpc0Z1bihoYW5kbGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGV2ZW50IGhhbmRsZXIgdG8gYmUgYSBmdW5jdGlvbiwgZ290IFwiLmNvbmNhdChfdHlwZW9mKGhhbmRsZXIpKSk7XG4gICAgfVxuXG4gICAgRW1pdHRyLl9hZGRIYW5kbGVyKHRoaXMsIG5hbWUsIHRoaXMuX3dyYXBPbmNlSGFuZGxlcihuYW1lLCBoYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLnByZXBlbmRPbmNlID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAoIWlzRnVuKGhhbmRsZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgZXZlbnQgaGFuZGxlciB0byBiZSBhIGZ1bmN0aW9uLCBnb3QgXCIuY29uY2F0KF90eXBlb2YoaGFuZGxlcikpKTtcbiAgICB9XG5cbiAgICBFbWl0dHIuX2FkZEhhbmRsZXIodGhpcywgbmFtZSwgdGhpcy5fd3JhcE9uY2VIYW5kbGVyKG5hbWUsIGhhbmRsZXIpLCB0cnVlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBFbWl0dHIuX3JlbW92ZUhhbmRsZXIodGhpcywgbmFtZSwgaGFuZGxlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLnJlbW92ZUFsbEhhbmRsZXJzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2hhbmRsZXJzO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIgcmVtb3ZlSGFuZGxlcnMgPSBoYW5kbGVycy5yZW1vdmVIYW5kbGVyO1xuICAgIGRlbGV0ZSBoYW5kbGVycy5yZW1vdmVIYW5kbGVyO1xuICAgIHZhciBpZHg7XG4gICAgdmFyIGV2ZW50TmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pbixuby1yZXN0cmljdGVkLXN5bnRheFxuXG4gICAgZm9yIChldmVudE5hbWUgaW4gaGFuZGxlcnMpIHtcbiAgICAgIGZvciAoaWR4ID0gaGFuZGxlcnNbZXZlbnROYW1lXS5sZW5ndGggLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgRW1pdHRyLl9jYWxsRXZlbnRIYW5kbGVycyh0aGlzLCByZW1vdmVIYW5kbGVycywgW2V2ZW50TmFtZSwgaGFuZGxlcnNbZXZlbnROYW1lXVtpZHhdLmhhbmRsZXIgfHwgaGFuZGxlcnNbZXZlbnROYW1lXVtpZHhdXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5fd3JhcE9uY2VIYW5kbGVyID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICB2YXIgb25jZVN0YXRlID0ge1xuICAgICAgZmlyZWQ6IGZhbHNlLFxuICAgICAgaGFuZGxlcjogaGFuZGxlcixcbiAgICAgIHdyYXBwZWRIYW5kbGVyOiB1bmRlZmluZWQsXG4gICAgICBlbWl0dGVyOiB0aGlzLFxuICAgICAgZXZlbnQ6IG5hbWVcbiAgICB9O1xuXG4gICAgdmFyIHdyYXBwZWRIYW5kbGVyID0gRW1pdHRyLl9vbmNlV3JhcHBlci5iaW5kKG9uY2VTdGF0ZSk7XG5cbiAgICBvbmNlU3RhdGUud3JhcHBlZEhhbmRsZXIgPSB3cmFwcGVkSGFuZGxlcjtcbiAgICB3cmFwcGVkSGFuZGxlci5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB3cmFwcGVkSGFuZGxlci5ldmVudCA9IG5hbWU7XG4gICAgcmV0dXJuIHdyYXBwZWRIYW5kbGVyO1xuICB9O1xuXG4gIEVtaXR0ci5fYWRkSGFuZGxlciA9IGZ1bmN0aW9uIChlbWl0dGVyLCBuYW1lLCBoYW5kbGVyLCBwcmVwZW5kKSB7XG4gICAgaWYgKHByZXBlbmQgPT09IHZvaWQgMCkge1xuICAgICAgcHJlcGVuZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNGdW4oaGFuZGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBldmVudCBoYW5kbGVyIHRvIGJlIGEgZnVuY3Rpb24sIGdvdCBcIi5jb25jYXQoX3R5cGVvZihoYW5kbGVyKSkpO1xuICAgIH1cblxuICAgIGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdID0gZW1pdHRlci5faGFuZGxlcnNbbmFtZV0gfHwgW107XG4gICAgZW1pdHRlci5lbWl0KCdhZGRIYW5kbGVyJywgbmFtZSwgaGFuZGxlcik7XG5cbiAgICBpZiAocHJlcGVuZCkge1xuICAgICAgZW1pdHRlci5faGFuZGxlcnNbbmFtZV0udW5zaGlmdChoYW5kbGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5faGFuZGxlcnNbbmFtZV0ucHVzaChoYW5kbGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW1pdHRlcjtcbiAgfTtcblxuICBFbWl0dHIuX29uY2VXcmFwcGVyID0gZnVuY3Rpb24gX29uY2VXcmFwcGVyKCkge1xuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5maXJlZCkge1xuICAgICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgICB0aGlzLmVtaXR0ZXIub2ZmKHRoaXMuZXZlbnQsIHRoaXMud3JhcHBlZEhhbmRsZXIpO1xuICAgICAgUmVmbGVjdC5hcHBseSh0aGlzLmhhbmRsZXIsIHRoaXMuZW1pdHRlciwgYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIEVtaXR0ci5fcmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uIChlbWl0dGVyLCBuYW1lLCBoYW5kbGVyKSB7XG4gICAgaWYgKCFpc0Z1bihoYW5kbGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGV2ZW50IGhhbmRsZXIgdG8gYmUgYSBmdW5jdGlvbiwgZ290IFwiLmNvbmNhdChfdHlwZW9mKGhhbmRsZXIpKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWYoZW1pdHRlci5faGFuZGxlcnNbbmFtZV0pIHx8ICFlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBlbWl0dGVyO1xuICAgIH1cblxuICAgIHZhciBpZHggPSAtMTtcblxuICAgIGlmIChlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVswXSA9PT0gaGFuZGxlciB8fCBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVswXS5oYW5kbGVyID09PSBoYW5kbGVyKSB7XG4gICAgICAgIGlkeCA9IDA7XG4gICAgICAgIGhhbmRsZXIgPSBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVswXS5oYW5kbGVyIHx8IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGlkeCA9IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdLmxlbmd0aCAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICBpZiAoZW1pdHRlci5faGFuZGxlcnNbbmFtZV1baWR4XSA9PT0gaGFuZGxlciB8fCBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVtpZHhdLmhhbmRsZXIgPT09IGhhbmRsZXIpIHtcbiAgICAgICAgICBoYW5kbGVyID0gZW1pdHRlci5faGFuZGxlcnNbbmFtZV1baWR4XS5oYW5kbGVyIHx8IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdW2lkeF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGVtaXR0ZXI7XG4gICAgfVxuXG4gICAgaWYgKGlkeCA9PT0gMCkge1xuICAgICAgZW1pdHRlci5faGFuZGxlcnNbbmFtZV0uc2hpZnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5faGFuZGxlcnNbbmFtZV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgfVxuXG4gICAgZW1pdHRlci5lbWl0KCdyZW1vdmVIYW5kbGVyJywgbmFtZSwgaGFuZGxlcik7XG4gICAgcmV0dXJuIGVtaXR0ZXI7XG4gIH07XG5cbiAgcmV0dXJuIEVtaXR0cjtcbn0oKTtcblxudmFyIFJBRkxvb3AgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSQUZMb29wKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTGlzdCBvZiB0YXJnZXRzIHRvIHVwZGF0ZVxyXG4gICAgICovXG5cblxuICAgIHRoaXMudGFyZ2V0cyA9IFtdO1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIElEIG9mIHJlcXVlc3RlZCBhbmltYXRpb24gZnJhbWUuIFZhbHVhYmxlIG9ubHkgaWYgbG9vcCBpcyBhY3RpdmUgYW5kIGhhcyBpdGVtcyB0byBpdGVyYXRlLlxyXG4gICAgICovXG5cbiAgICB0aGlzLmFuaW1hdGlvbkZyYW1lSUQgPSAwO1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIExvb3AncyBzdGF0ZS5cclxuICAgICAqL1xuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTdGFydCB0aGUgbG9vcCBpZiBpdCB3YXNuJ3QgeWV0LlxyXG4gICAgICovXG5cbiAgICB0aGlzLnN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5faXNBY3RpdmUgJiYgX3RoaXMudGFyZ2V0cy5sZW5ndGgpIHtcbiAgICAgICAgX3RoaXMuX2lzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgaWYgKF90aGlzLmFuaW1hdGlvbkZyYW1lSUQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKF90aGlzLmFuaW1hdGlvbkZyYW1lSUQpO1xuICAgICAgICBfdGhpcy5hbmltYXRpb25GcmFtZUlEID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnJhZkNhbGxiYWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU3RvcCB0aGUgbG9vcCBpZiBpcyB3YXMgYWN0aXZlLlxyXG4gICAgICovXG5cblxuICAgIHRoaXMuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5faXNBY3RpdmUpIHtcbiAgICAgICAgX3RoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGlmIChfdGhpcy5hbmltYXRpb25GcmFtZUlEKSBjYW5jZWxBbmltYXRpb25GcmFtZShfdGhpcy5hbmltYXRpb25GcmFtZUlEKTtcbiAgICAgICAgX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZCB0YXJnZXQgdG8gdGhlIGl0ZXJhdGlvbiBsaXN0IGlmIGl0J3Mgbm90IHRoZXJlLlxyXG4gICAgICovXG5cblxuICAgIHRoaXMuYWRkVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgc2lsZW50KSB7XG4gICAgICBpZiAoc2lsZW50ID09PSB2b2lkIDApIHtcbiAgICAgICAgc2lsZW50ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghX3RoaXMudGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpKSB7XG4gICAgICAgIF90aGlzLnRhcmdldHMucHVzaCh0YXJnZXQpO1xuXG4gICAgICAgIGlmIChfdGhpcy50YXJnZXRzLmxlbmd0aCA9PT0gMSAmJiAhc2lsZW50KSBfdGhpcy5zdGFydCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmUgdGFyZ2V0IGZyb20gaXRlcmF0aW9uIGxpc3QgaWYgaXQgd2FzIHRoZXJlLlxyXG4gICAgICovXG5cblxuICAgIHRoaXMucmVtb3ZlVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgdmFyIGlkeCA9IF90aGlzLnRhcmdldHMuaW5kZXhPZih0YXJnZXQpO1xuXG4gICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICBfdGhpcy50YXJnZXRzLnNwbGljZShpZHgsIDEpO1xuXG4gICAgICAgIGlmIChfdGhpcy50YXJnZXRzLmxlbmd0aCA9PT0gMCkgX3RoaXMuc3RvcCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsYmFjayB0aGF0IGNhbGxlZCBlYWNoIGFuaW1hdGlvbiBmcmFtZS5cclxuICAgICAqL1xuXG5cbiAgICB0aGlzLnJhZkNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5faXNBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3RoaXMudGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIV90aGlzLnRhcmdldHNbaV0uX3VubW91bnRlZCkgX3RoaXMudGFyZ2V0c1tpXS51cGRhdGUoKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShfdGhpcy5yYWZDYWxsYmFjayk7XG4gICAgICByZXR1cm4gX3RoaXMuYW5pbWF0aW9uRnJhbWVJRDtcbiAgICB9O1xuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJBRkxvb3AucHJvdG90eXBlLCBcImlzQWN0aXZlXCIsIHtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBMb29wJ3Mgc3RhdGUuXHJcbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuIFJBRkxvb3A7XG59KCk7XG52YXIgTG9vcCA9IG5ldyBSQUZMb29wKCk7XG5cbnZhciBBWElTX0RJUkVDVElPTjtcblxuKGZ1bmN0aW9uIChBWElTX0RJUkVDVElPTikge1xuICBBWElTX0RJUkVDVElPTltcIlhcIl0gPSBcInhcIjtcbiAgQVhJU19ESVJFQ1RJT05bXCJZXCJdID0gXCJ5XCI7XG59KShBWElTX0RJUkVDVElPTiB8fCAoQVhJU19ESVJFQ1RJT04gPSB7fSkpO1xuXG52YXIgVFJBQ0tfQ0xJQ0tfQkVIQVZJT1I7XG5cbihmdW5jdGlvbiAoVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IpIHtcbiAgVFJBQ0tfQ0xJQ0tfQkVIQVZJT1JbXCJKVU1QXCJdID0gXCJqdW1wXCI7XG4gIFRSQUNLX0NMSUNLX0JFSEFWSU9SW1wiU1RFUFwiXSA9IFwic3RlcFwiO1xufSkoVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IgfHwgKFRSQUNLX0NMSUNLX0JFSEFWSU9SID0ge30pKTtcblxudmFyIFNjcm9sbGJhclRodW1iID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKFNjcm9sbGJhclRodW1iLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIFNjcm9sbGJhclRodW1iKCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgX3RoaXMuaW5pdGlhbE9mZnNldFggPSAwO1xuICAgIF90aGlzLmluaXRpYWxPZmZzZXRZID0gMDtcbiAgICBfdGhpcy5lbGVtZW50UmVmSGFjayA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICAgIF90aGlzLmxhc3REcmFnRGF0YSA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgZGVsdGFYOiAwLFxuICAgICAgZGVsdGFZOiAwLFxuICAgICAgbGFzdFg6IDAsXG4gICAgICBsYXN0WTogMFxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVPbkRyYWdTdGFydCA9IGZ1bmN0aW9uIChldiwgZGF0YSkge1xuICAgICAgaWYgKCFfdGhpcy5lbGVtZW50KSB7XG4gICAgICAgIF90aGlzLmhhbmRsZU9uRHJhZ1N0b3AoZXYsIGRhdGEpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICBfdGhpcy5wcmV2VXNlclNlbGVjdCA9IGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdDtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnO1xuICAgICAgICBfdGhpcy5wcmV2T25TZWxlY3RTdGFydCA9IGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQ7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgU2Nyb2xsYmFyVGh1bWIuc2VsZWN0U3RhcnRSZXBsYWNlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkRyYWdTdGFydCkge1xuICAgICAgICBfdGhpcy5wcm9wcy5vbkRyYWdTdGFydChfdGhpcy5sYXN0RHJhZ0RhdGEgPSB7XG4gICAgICAgICAgeDogZGF0YS54IC0gX3RoaXMuaW5pdGlhbE9mZnNldFgsXG4gICAgICAgICAgeTogZGF0YS55IC0gX3RoaXMuaW5pdGlhbE9mZnNldFksXG4gICAgICAgICAgbGFzdFg6IGRhdGEubGFzdFggLSBfdGhpcy5pbml0aWFsT2Zmc2V0WCxcbiAgICAgICAgICBsYXN0WTogZGF0YS5sYXN0WSAtIF90aGlzLmluaXRpYWxPZmZzZXRZLFxuICAgICAgICAgIGRlbHRhWDogZGF0YS5kZWx0YVgsXG4gICAgICAgICAgZGVsdGFZOiBkYXRhLmRlbHRhWVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcmFnZ2luZycpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVPbkRyYWcgPSBmdW5jdGlvbiAoZXYsIGRhdGEpIHtcbiAgICAgIGlmICghX3RoaXMuZWxlbWVudCkge1xuICAgICAgICBfdGhpcy5oYW5kbGVPbkRyYWdTdG9wKGV2LCBkYXRhKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkRyYWcpIHtcbiAgICAgICAgX3RoaXMucHJvcHMub25EcmFnKF90aGlzLmxhc3REcmFnRGF0YSA9IHtcbiAgICAgICAgICB4OiBkYXRhLnggLSBfdGhpcy5pbml0aWFsT2Zmc2V0WCxcbiAgICAgICAgICB5OiBkYXRhLnkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgICBsYXN0WDogZGF0YS5sYXN0WCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICAgIGxhc3RZOiBkYXRhLmxhc3RZIC0gX3RoaXMuaW5pdGlhbE9mZnNldFksXG4gICAgICAgICAgZGVsdGFYOiBkYXRhLmRlbHRhWCxcbiAgICAgICAgICBkZWx0YVk6IGRhdGEuZGVsdGFZXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVPbkRyYWdTdG9wID0gZnVuY3Rpb24gKGV2LCBkYXRhKSB7XG4gICAgICB2YXIgcmVzdWx0RGF0YSA9IGRhdGEgPyB7XG4gICAgICAgIHg6IGRhdGEueCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICB5OiBkYXRhLnkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgbGFzdFg6IGRhdGEubGFzdFggLSBfdGhpcy5pbml0aWFsT2Zmc2V0WCxcbiAgICAgICAgbGFzdFk6IGRhdGEubGFzdFkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgZGVsdGFYOiBkYXRhLmRlbHRhWCxcbiAgICAgICAgZGVsdGFZOiBkYXRhLmRlbHRhWVxuICAgICAgfSA6IF90aGlzLmxhc3REcmFnRGF0YTtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkRyYWdFbmQpIF90aGlzLnByb3BzLm9uRHJhZ0VuZChyZXN1bHREYXRhKTtcbiAgICAgIGlmIChfdGhpcy5lbGVtZW50KSBfdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdnaW5nJyk7XG5cbiAgICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gX3RoaXMucHJldlVzZXJTZWxlY3Q7XG5cbiAgICAgICAgaWYgKF90aGlzLnByZXZPblNlbGVjdFN0YXJ0KSB7XG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBfdGhpcy5wcmV2T25TZWxlY3RTdGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5wcmV2T25TZWxlY3RTdGFydCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRYID0gMDtcbiAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRZID0gMDtcbiAgICAgIF90aGlzLmxhc3REcmFnRGF0YSA9IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgZGVsdGFYOiAwLFxuICAgICAgICBkZWx0YVk6IDAsXG4gICAgICAgIGxhc3RYOiAwLFxuICAgICAgICBsYXN0WTogMFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlT25Nb3VzZURvd24gPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgIGlmICghX3RoaXMuZWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKCFpc1VuZGVmKGV2Lm9mZnNldFgpKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRYID0gZXYub2Zmc2V0WDtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgICAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WSA9IGV2Lm9mZnNldFk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVjdCA9IF90aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldFggPSAoZXYuY2xpZW50WCB8fCBldi50b3VjaGVzWzBdLmNsaWVudFgpIC0gcmVjdC5sZWZ0O1xuICAgICAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WSA9IChldi5jbGllbnRZIHx8IGV2LnRvdWNoZXNbMF0uY2xpZW50WSkgLSByZWN0LnRvcDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy5lbGVtZW50UmVmKSkgX3RoaXMucHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgX3RoaXMuZWxlbWVudCA9IHJlZjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuXG4gICAgICBfdGhpcy5lbGVtZW50UmVmSGFjay5jdXJyZW50ID0gcmVmO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBTY3JvbGxiYXJUaHVtYi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCI8U2Nyb2xsYmFyVGh1bWI+IEVsZW1lbnQgd2FzIG5vdCBjcmVhdGVkLiBQb3NzaWJseSB5b3UgaGF2ZW4ndCBwcm92aWRlZCBIVE1MRGl2RWxlbWVudCB0byByZW5kZXJlcidzIGBlbGVtZW50UmVmYCBmdW5jdGlvbi5cIik7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgU2Nyb2xsYmFyVGh1bWIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaGFuZGxlT25EcmFnU3RvcCgpO1xuICAgIHRoaXMuZWxlbWVudFJlZihudWxsKTtcbiAgfTtcblxuICBTY3JvbGxiYXJUaHVtYi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMucHJvcHM7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5lbGVtZW50UmVmO1xuICAgICAgICB2YXIgYXhpcyA9IF9hLmF4aXM7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vbkRyYWc7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vbkRyYWdFbmQ7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vbkRyYWdTdGFydDtcbiAgICAgICAgdmFyIHByb3BzID0gX19yZXN0KF9hLCBbXCJlbGVtZW50UmVmXCIsIFwiYXhpc1wiLCBcIm9uRHJhZ1wiLCBcIm9uRHJhZ0VuZFwiLCBcIm9uRHJhZ1N0YXJ0XCJdKTtcblxuICAgIHByb3BzLmNsYXNzTmFtZSA9IGNuYignU2Nyb2xsYmFyc0N1c3RvbS1UaHVtYicsIGF4aXMgPT09IEFYSVNfRElSRUNUSU9OLlggPyAnU2Nyb2xsYmFyc0N1c3RvbS1UaHVtYlgnIDogJ1Njcm9sbGJhcnNDdXN0b20tVGh1bWJZJywgcHJvcHMuY2xhc3NOYW1lKTtcblxuICAgIGlmIChwcm9wcy5yZW5kZXJlcikge1xuICAgICAgcHJvcHMuYXhpcyA9IGF4aXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRHJhZ2dhYmxlQ29yZSwge1xuICAgICAgYWxsb3dBbnlDbGljazogZmFsc2UsXG4gICAgICBlbmFibGVVc2VyU2VsZWN0SGFjazogZmFsc2UsXG4gICAgICBvbk1vdXNlRG93bjogdGhpcy5oYW5kbGVPbk1vdXNlRG93bixcbiAgICAgIG9uRHJhZzogdGhpcy5oYW5kbGVPbkRyYWcsXG4gICAgICBvblN0YXJ0OiB0aGlzLmhhbmRsZU9uRHJhZ1N0YXJ0LFxuICAgICAgb25TdG9wOiB0aGlzLmhhbmRsZU9uRHJhZ1N0b3AsXG4gICAgICBub2RlUmVmOiB0aGlzLmVsZW1lbnRSZWZIYWNrXG4gICAgfSwgcmVuZGVyRGl2V2l0aFJlbmRlcmVyKHByb3BzLCB0aGlzLmVsZW1lbnRSZWYpKTtcbiAgfTtcblxuICBTY3JvbGxiYXJUaHVtYi5zZWxlY3RTdGFydFJlcGxhY2VyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gU2Nyb2xsYmFyVGh1bWI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBTY3JvbGxiYXJUcmFjayA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTY3JvbGxiYXJUcmFjaywgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBTY3JvbGxiYXJUcmFjaygpIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcblxuICAgIF90aGlzLmVsZW1lbnQgPSBudWxsO1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy5lbGVtZW50UmVmKSkgX3RoaXMucHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgX3RoaXMuZWxlbWVudCA9IHJlZjtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgIGlmICghZXYgfHwgIV90aGlzLmVsZW1lbnQgfHwgZXYuYnV0dG9uICE9PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLm9uQ2xpY2spICYmIGV2LnRhcmdldCA9PT0gX3RoaXMuZWxlbWVudCkge1xuICAgICAgICBpZiAoIWlzVW5kZWYoZXYub2Zmc2V0WCkpIHtcbiAgICAgICAgICBfdGhpcy5wcm9wcy5vbkNsaWNrKGV2LCB7XG4gICAgICAgICAgICBheGlzOiBfdGhpcy5wcm9wcy5heGlzLFxuICAgICAgICAgICAgb2Zmc2V0OiBfdGhpcy5wcm9wcy5heGlzID09PSBBWElTX0RJUkVDVElPTi5YID8gZXYub2Zmc2V0WCA6IGV2Lm9mZnNldFlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdXBwb3J0IGZvciBvbGQgYnJvd3NlcnNcblxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgdmFyIHJlY3QgPSBfdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgICAgICAgIF90aGlzLnByb3BzLm9uQ2xpY2soZXYsIHtcbiAgICAgICAgICAgIGF4aXM6IF90aGlzLnByb3BzLmF4aXMsXG4gICAgICAgICAgICBvZmZzZXQ6IF90aGlzLnByb3BzLmF4aXMgPT09IEFYSVNfRElSRUNUSU9OLlggPyAoZXYuY2xpZW50WCB8fCBldi50b3VjaGVzWzBdLmNsaWVudFgpIC0gcmVjdC5sZWZ0IDogKGV2LmNsaWVudFkgfHwgZXYudG91Y2hlc1swXS5jbGllbnRZKSAtIHJlY3QudG9wXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFNjcm9sbGJhclRyYWNrLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgd2FzIG5vdCBjcmVhdGVkLiBQb3NzaWJseSB5b3UgaGF2ZW4ndCBwcm92aWRlZCBIVE1MRGl2RWxlbWVudCB0byByZW5kZXJlcidzIGBlbGVtZW50UmVmYCBmdW5jdGlvbi5cIik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgfTtcblxuICBTY3JvbGxiYXJUcmFjay5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGljayk7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5lbGVtZW50UmVmKG51bGwpO1xuICAgIH1cbiAgfTtcblxuICBTY3JvbGxiYXJUcmFjay5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMucHJvcHM7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5lbGVtZW50UmVmO1xuICAgICAgICB2YXIgYXhpcyA9IF9hLmF4aXM7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vbkNsaWNrO1xuICAgICAgICB2YXIgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcImVsZW1lbnRSZWZcIiwgXCJheGlzXCIsIFwib25DbGlja1wiXSk7XG5cbiAgICBwcm9wcy5jbGFzc05hbWUgPSBjbmIoJ1Njcm9sbGJhcnNDdXN0b20tVHJhY2snLCBheGlzID09PSBBWElTX0RJUkVDVElPTi5YID8gJ1Njcm9sbGJhcnNDdXN0b20tVHJhY2tYJyA6ICdTY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWScsIHByb3BzLmNsYXNzTmFtZSk7XG5cbiAgICBpZiAocHJvcHMucmVuZGVyZXIpIHtcbiAgICAgIHByb3BzLmF4aXMgPSBheGlzO1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJEaXZXaXRoUmVuZGVyZXIocHJvcHMsIHRoaXMuZWxlbWVudFJlZik7XG4gIH07XG5cbiAgcmV0dXJuIFNjcm9sbGJhclRyYWNrO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG52YXIgc3R5bGUgPSB7XG4gIGhvbGRlcjoge1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIHdpZHRoOiAnMTAwJScsXG4gICAgaGVpZ2h0OiAnMTAwJSdcbiAgfSxcbiAgd3JhcHBlcjoge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogMCxcbiAgICBsZWZ0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICByaWdodDogMFxuICB9LFxuICBjb250ZW50OiB7XG4gICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCdcbiAgfSxcbiAgdHJhY2s6IHtcbiAgICBjb21tb246IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgYm9yZGVyUmFkaXVzOiA0LFxuICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwwLDAsLjEpJyxcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgIH0sXG4gICAgeDoge1xuICAgICAgaGVpZ2h0OiAxMCxcbiAgICAgIHdpZHRoOiAnY2FsYygxMDAlIC0gMjBweCknLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbGVmdDogMTBcbiAgICB9LFxuICAgIHk6IHtcbiAgICAgIHdpZHRoOiAxMCxcbiAgICAgIGhlaWdodDogJ2NhbGMoMTAwJSAtIDIwcHgpJyxcbiAgICAgIHRvcDogMTBcbiAgICB9XG4gIH0sXG4gIHRodW1iOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIGJvcmRlclJhZGl1czogNCxcbiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLC40KSdcbiAgICB9LFxuICAgIHg6IHtcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgd2lkdGg6IDBcbiAgICB9LFxuICAgIHk6IHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9XG4gIH1cbn07XG5cbnZhciBwYWdlWm9vbUxldmVsID0gaXNCcm93c2VyID8gem9vbUxldmVsKCkgOiAxO1xuXG5pZiAoaXNCcm93c2VyKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgcGFnZVpvb21MZXZlbCA9IHpvb21MZXZlbCgpO1xuICB9LCB7XG4gICAgcGFzc2l2ZTogdHJ1ZVxuICB9KTtcbn1cblxudmFyIFNjcm9sbGJhckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgcGFyZW50U2Nyb2xsYmFyOiBudWxsXG59KTtcblxudmFyIFNjcm9sbGJhciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTY3JvbGxiYXIsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gU2Nyb2xsYmFyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpIHx8IHRoaXM7XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnQgc2Nyb2xsLXJlbGF0ZWQgdmFsdWVzLjxici8+XHJcbiAgICAgKiBJZiA8aT5mb3JjZTwvaT4gaWYgdHJ1dGh5IC0gd2lsbCByZWNhbGN1bGF0ZSB0aGVtIGluc3RlYWQgb2YgcmV0dXJuaW5nIGNhY2hlZCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiBTY3JvbGxTdGF0ZVxyXG4gICAgICovXG5cblxuICAgIF90aGlzLmdldFNjcm9sbFN0YXRlID0gZnVuY3Rpb24gKGZvcmNlKSB7XG4gICAgICBpZiAoZm9yY2UgPT09IHZvaWQgMCkge1xuICAgICAgICBmb3JjZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsVmFsdWVzICYmICFmb3JjZSkge1xuICAgICAgICByZXR1cm4gX19hc3NpZ24oe30sIF90aGlzLnNjcm9sbFZhbHVlcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzY3JvbGxTdGF0ZSA9IHtcbiAgICAgICAgY2xpZW50SGVpZ2h0OiAwLFxuICAgICAgICBjbGllbnRXaWR0aDogMCxcbiAgICAgICAgY29udGVudFNjcm9sbEhlaWdodDogMCxcbiAgICAgICAgY29udGVudFNjcm9sbFdpZHRoOiAwLFxuICAgICAgICBzY3JvbGxIZWlnaHQ6IDAsXG4gICAgICAgIHNjcm9sbFdpZHRoOiAwLFxuICAgICAgICBzY3JvbGxUb3A6IDAsXG4gICAgICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgICAgIHNjcm9sbFlCbG9ja2VkOiBmYWxzZSxcbiAgICAgICAgc2Nyb2xsWEJsb2NrZWQ6IGZhbHNlLFxuICAgICAgICBzY3JvbGxZUG9zc2libGU6IGZhbHNlLFxuICAgICAgICBzY3JvbGxYUG9zc2libGU6IGZhbHNlLFxuICAgICAgICB0cmFja1lWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgdHJhY2tYVmlzaWJsZTogZmFsc2UsXG4gICAgICAgIHpvb21MZXZlbDogcGFnZVpvb21MZXZlbCAqIDEsXG4gICAgICAgIGlzUlRMOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgICB2YXIgcHJvcHMgPSBfdGhpcy5wcm9wcztcbiAgICAgIHNjcm9sbFN0YXRlLmlzUlRMID0gX3RoaXMuc3RhdGUuaXNSVEw7XG4gICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZCA9IHByb3BzLm5vU2Nyb2xsIHx8IHByb3BzLm5vU2Nyb2xsWTtcbiAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFhCbG9ja2VkID0gcHJvcHMubm9TY3JvbGwgfHwgcHJvcHMubm9TY3JvbGxYO1xuXG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHNjcm9sbFN0YXRlLmNsaWVudEhlaWdodCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIHNjcm9sbFN0YXRlLmNsaWVudFdpZHRoID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxIZWlnaHQgPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxXaWR0aCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsVG9wID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsTGVmdCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxZUG9zc2libGUgPSAhc2Nyb2xsU3RhdGUuc2Nyb2xsWUJsb2NrZWQgJiYgc2Nyb2xsU3RhdGUuc2Nyb2xsSGVpZ2h0ID4gc2Nyb2xsU3RhdGUuY2xpZW50SGVpZ2h0O1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGUgPSAhc2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQgJiYgc2Nyb2xsU3RhdGUuc2Nyb2xsV2lkdGggPiBzY3JvbGxTdGF0ZS5jbGllbnRXaWR0aDtcbiAgICAgICAgc2Nyb2xsU3RhdGUudHJhY2tZVmlzaWJsZSA9IHNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZSB8fCBwcm9wcy5wZXJtYW5lbnRUcmFja3MgfHwgcHJvcHMucGVybWFuZW50VHJhY2tZO1xuICAgICAgICBzY3JvbGxTdGF0ZS50cmFja1hWaXNpYmxlID0gc2Nyb2xsU3RhdGUuc2Nyb2xsWFBvc3NpYmxlIHx8IHByb3BzLnBlcm1hbmVudFRyYWNrcyB8fCBwcm9wcy5wZXJtYW5lbnRUcmFja1g7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5jb250ZW50RWxlbWVudCkge1xuICAgICAgICBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsSGVpZ2h0ID0gX3RoaXMuY29udGVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsV2lkdGggPSBfdGhpcy5jb250ZW50RWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNjcm9sbFN0YXRlO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2Nyb2xsIHRvIHRvcCBib3JkZXJcclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5zY3JvbGxUb1RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNjcm9sbCB0byBsZWZ0IGJvcmRlclxyXG4gICAgICovXG5cblxuICAgIF90aGlzLnNjcm9sbFRvTGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTY3JvbGwgdG8gYm90dG9tIGJvcmRlclxyXG4gICAgICovXG5cblxuICAgIF90aGlzLnNjcm9sbFRvQm90dG9tID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIF90aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNjcm9sbCB0byByaWdodCBib3JkZXJcclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5zY3JvbGxUb1JpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxXaWR0aCAtIF90aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0IHRoZSBzY3JvbGxzIGF0IGdpdmVuIGNvb3JkaW5hdGVzLjxici8+XHJcbiAgICAgKiBJZiBjb29yZGluYXRlIGlzIHVuZGVmaW5lZCAtIGN1cnJlbnQgc2Nyb2xsIHZhbHVlIHdpbGwgcGVyc2lzdC5cclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5zY3JvbGxUbyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIGlmIChpc051bSh4KSkgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSB4O1xuICAgICAgICBpZiAoaXNOdW0oeSkpIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSB5O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDZW50ZXIgdGhlIHZpZXdwb3J0IGF0IGdpdmVuIGNvb3JkaW5hdGVzLjxici8+XHJcbiAgICAgKiBJZiBjb29yZGluYXRlIGlzIHVuZGVmaW5lZCAtIGN1cnJlbnQgc2Nyb2xsIHZhbHVlIHdpbGwgcGVyc2lzdC5cclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5jZW50ZXJBdCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIGlmIChpc051bSh4KSkgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSB4IC0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudFdpZHRoIC8gMjtcbiAgICAgICAgaWYgKGlzTnVtKHkpKSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0geSAtIF90aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRIZWlnaHQgLyAyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcblxuICAgIF90aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uIChmb3JjZSkge1xuICAgICAgaWYgKGZvcmNlID09PSB2b2lkIDApIHtcbiAgICAgICAgZm9yY2UgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBhdXRvZGV0ZWN0IGRpcmVjdGlvbiBpZiBub3QgZGVmaW5lZFxuXG5cbiAgICAgIGlmIChpc1VuZGVmKF90aGlzLnN0YXRlLmlzUlRMKSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNSVEw6IGdldENvbXB1dGVkU3R5bGUoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KS5kaXJlY3Rpb24gPT09ICdydGwnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBfdGhpcy5nZXRTY3JvbGxTdGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2Nyb2xsU3RhdGUgPSBfdGhpcy5nZXRTY3JvbGxTdGF0ZSh0cnVlKTtcblxuICAgICAgdmFyIHByZXZTY3JvbGxTdGF0ZSA9IF9fYXNzaWduKHt9LCBfdGhpcy5zY3JvbGxWYWx1ZXMpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBfdGhpcy5wcm9wcztcbiAgICAgIHZhciBiaXRtYXNrID0gMDtcblxuICAgICAgaWYgKCFmb3JjZSkge1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLmNsaWVudEhlaWdodCAhPT0gc2Nyb2xsU3RhdGUuY2xpZW50SGVpZ2h0KSBiaXRtYXNrIHw9IE1hdGgudHJ1bmMoMSk7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuY2xpZW50V2lkdGggIT09IHNjcm9sbFN0YXRlLmNsaWVudFdpZHRoKSBiaXRtYXNrIHw9IDEgPDwgMTtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxIZWlnaHQgIT09IHNjcm9sbFN0YXRlLnNjcm9sbEhlaWdodCkgYml0bWFzayB8PSAxIDw8IDI7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsV2lkdGggIT09IHNjcm9sbFN0YXRlLnNjcm9sbFdpZHRoKSBiaXRtYXNrIHw9IDEgPDwgMztcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxUb3AgIT09IHNjcm9sbFN0YXRlLnNjcm9sbFRvcCkgYml0bWFzayB8PSAxIDw8IDQ7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsTGVmdCkgYml0bWFzayB8PSAxIDw8IDU7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWUJsb2NrZWQgIT09IHNjcm9sbFN0YXRlLnNjcm9sbFlCbG9ja2VkKSBiaXRtYXNrIHw9IDEgPDwgNjtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxYQmxvY2tlZCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQpIGJpdG1hc2sgfD0gMSA8PCA3O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZSAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsWVBvc3NpYmxlKSBiaXRtYXNrIHw9IDEgPDwgODtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGUgIT09IHNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZSkgYml0bWFzayB8PSAxIDw8IDk7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUudHJhY2tZVmlzaWJsZSAhPT0gc2Nyb2xsU3RhdGUudHJhY2tZVmlzaWJsZSkgYml0bWFzayB8PSAxIDw8IDEwO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnRyYWNrWFZpc2libGUgIT09IHNjcm9sbFN0YXRlLnRyYWNrWFZpc2libGUpIGJpdG1hc2sgfD0gMSA8PCAxMTtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5pc1JUTCAhPT0gc2Nyb2xsU3RhdGUuaXNSVEwpIGJpdG1hc2sgfD0gMSA8PCAxMjtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsSGVpZ2h0ICE9PSBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsSGVpZ2h0KSBiaXRtYXNrIHw9IDEgPDwgMTM7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbFdpZHRoICE9PSBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsV2lkdGgpIGJpdG1hc2sgfD0gMSA8PCAxNDtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS56b29tTGV2ZWwgIT09IHNjcm9sbFN0YXRlLnpvb21MZXZlbCkgYml0bWFzayB8PSAxIDw8IDE1OyAvLyBpZiBub3QgZm9yY2VkIGFuZCBub3RoaW5nIGhhcyBjaGFuZ2VkIC0gc2tpcCB0aGlzIHVwZGF0ZVxuXG4gICAgICAgIGlmIChiaXRtYXNrID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZTY3JvbGxTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYml0bWFzayA9IDMyNzY3O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXByb3BzLm5hdGl2ZSAmJiBfdGhpcy5ob2xkZXJFbGVtZW50KSB7XG4gICAgICAgIGlmIChiaXRtYXNrICYgMSA8PCAxMyAmJiAocHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVZVG9Ib2xkZXIpKSB7XG4gICAgICAgICAgX3RoaXMuaG9sZGVyRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIlwiLmNvbmNhdChzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsSGVpZ2h0LCBcInB4XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJpdG1hc2sgJiAxIDw8IDE0ICYmIChwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVhUb0hvbGRlcikpIHtcbiAgICAgICAgICBfdGhpcy5ob2xkZXJFbGVtZW50LnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQoc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbFdpZHRoLCBcInB4XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyKSB7XG4gICAgICAgICAgaWYgKCFzY3JvbGxTdGF0ZS5jbGllbnRIZWlnaHQgJiYgc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbEhlaWdodCB8fCAhc2Nyb2xsU3RhdGUuY2xpZW50V2lkdGggJiYgc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIGlmIHNjcm9sbGJhcnMgdmlzaWJpbGl0eSBoYXMgY2hhbmdlZFxuXG5cbiAgICAgIGlmIChiaXRtYXNrICYgMSA8PCAxMCB8fCBiaXRtYXNrICYgMSA8PCAxMSkge1xuICAgICAgICBwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWUJsb2NrZWQgPSBzY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZDtcbiAgICAgICAgcHJldlNjcm9sbFN0YXRlLnNjcm9sbFhCbG9ja2VkID0gc2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQ7XG4gICAgICAgIHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxZUG9zc2libGUgPSBzY3JvbGxTdGF0ZS5zY3JvbGxZUG9zc2libGU7XG4gICAgICAgIHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGUgPSBzY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGU7XG5cbiAgICAgICAgaWYgKF90aGlzLnRyYWNrWUVsZW1lbnQgJiYgYml0bWFzayAmIDEgPDwgMTApIHtcbiAgICAgICAgICBfdGhpcy50cmFja1lFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBzY3JvbGxTdGF0ZS50cmFja1lWaXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMudHJhY2tYRWxlbWVudCAmJiBiaXRtYXNrICYgMSA8PCAxMSkge1xuICAgICAgICAgIF90aGlzLnRyYWNrWEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHNjcm9sbFN0YXRlLnRyYWNrWFZpc2libGUgPyAnJyA6ICdub25lJztcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnNjcm9sbFZhbHVlcyA9IHByZXZTY3JvbGxTdGF0ZTtcblxuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdHJhY2tZVmlzaWJsZTogX3RoaXMuc2Nyb2xsVmFsdWVzLnRyYWNrWVZpc2libGUgPSBzY3JvbGxTdGF0ZS50cmFja1lWaXNpYmxlLFxuICAgICAgICAgIHRyYWNrWFZpc2libGU6IF90aGlzLnNjcm9sbFZhbHVlcy50cmFja1hWaXNpYmxlID0gc2Nyb2xsU3RhdGUudHJhY2tYVmlzaWJsZVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIChwcm9wcy5uYXRpdmUgPyBfdGhpcy51cGRhdGVyTmF0aXZlIDogX3RoaXMudXBkYXRlckN1c3RvbSkoYml0bWFzaywgc2Nyb2xsU3RhdGUpO1xuICAgICAgX3RoaXMuc2Nyb2xsVmFsdWVzID0gc2Nyb2xsU3RhdGU7XG5cbiAgICAgIGlmICghcHJvcHMubmF0aXZlICYmIGJpdG1hc2sgJiAxIDw8IDE1KSB7XG4gICAgICAgIGdldFNjcm9sbGJhcldpZHRoKHRydWUpO1xuXG4gICAgICAgIF90aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmV2ZW50RW1pdHRlci5lbWl0KCd1cGRhdGUnLCBfX2Fzc2lnbih7fSwgc2Nyb2xsU3RhdGUpLCBwcmV2U2Nyb2xsU3RhdGUpO1xuXG4gICAgICBpZiAoYml0bWFzayAmIDEgPDwgNCB8fCBiaXRtYXNrICYgMSA8PCA1KSBfdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCgnc2Nyb2xsJywgX19hc3NpZ24oe30sIHNjcm9sbFN0YXRlKSwgcHJldlNjcm9sbFN0YXRlKTtcbiAgICAgIHJldHVybiBfdGhpcy5zY3JvbGxWYWx1ZXM7XG4gICAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcblxuXG4gICAgX3RoaXMudXBkYXRlck5hdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGp1c3QgZm9yIGZ1dHVyZVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIF90aGlzLnVwZGF0ZXJDdXN0b20gPSBmdW5jdGlvbiAoYml0bWFzaywgc2Nyb2xsVmFsdWVzKSB7XG4gICAgICB2YXIgcHJvcHMgPSBfdGhpcy5wcm9wcztcblxuICAgICAgaWYgKF90aGlzLnRyYWNrWUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKF90aGlzLnRodW1iWUVsZW1lbnQgJiYgKGJpdG1hc2sgJiBNYXRoLnRydW5jKDEpIHx8IGJpdG1hc2sgJiAxIDw8IDIgfHwgYml0bWFzayAmIDEgPDwgNCB8fCBiaXRtYXNrICYgMSA8PCA2IHx8IGJpdG1hc2sgJiAxIDw8IDgpKSB7XG4gICAgICAgICAgaWYgKHNjcm9sbFZhbHVlcy5zY3JvbGxZUG9zc2libGUpIHtcbiAgICAgICAgICAgIHZhciB0cmFja0lubmVyU2l6ZSA9IGdldElubmVySGVpZ2h0KF90aGlzLnRyYWNrWUVsZW1lbnQpO1xuICAgICAgICAgICAgdmFyIHRodW1iU2l6ZSA9IGNhbGNUaHVtYlNpemUoc2Nyb2xsVmFsdWVzLnNjcm9sbEhlaWdodCwgc2Nyb2xsVmFsdWVzLmNsaWVudEhlaWdodCwgdHJhY2tJbm5lclNpemUsIHByb3BzLm1pbmltYWxUaHVtYllTaXplIHx8IHByb3BzLm1pbmltYWxUaHVtYlNpemUsIHByb3BzLm1heGltYWxUaHVtYllTaXplIHx8IHByb3BzLm1heGltYWxUaHVtYlNpemUpO1xuICAgICAgICAgICAgdmFyIHRodW1iT2Zmc2V0ID0gY2FsY1RodW1iT2Zmc2V0KHNjcm9sbFZhbHVlcy5zY3JvbGxIZWlnaHQsIHNjcm9sbFZhbHVlcy5jbGllbnRIZWlnaHQsIHRyYWNrSW5uZXJTaXplLCB0aHVtYlNpemUsIHNjcm9sbFZhbHVlcy5zY3JvbGxUb3ApO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVkoXCIuY29uY2F0KHRodW1iT2Zmc2V0LCBcInB4KVwiKTtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQodGh1bWJTaXplLCBcInB4XCIpO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgICAgICBfdGhpcy50aHVtYllFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMudHJhY2tYRWxlbWVudCkge1xuICAgICAgICBpZiAoX3RoaXMudGh1bWJYRWxlbWVudCAmJiAoYml0bWFzayAmIDEgPDwgMSB8fCBiaXRtYXNrICYgMSA8PCAzIHx8IGJpdG1hc2sgJiAxIDw8IDUgfHwgYml0bWFzayAmIDEgPDwgNyB8fCBiaXRtYXNrICYgMSA8PCA5IHx8IGJpdG1hc2sgJiAxIDw8IDEyKSkge1xuICAgICAgICAgIGlmIChzY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlKSB7XG4gICAgICAgICAgICB2YXIgdHJhY2tJbm5lclNpemUgPSBnZXRJbm5lcldpZHRoKF90aGlzLnRyYWNrWEVsZW1lbnQpO1xuICAgICAgICAgICAgdmFyIHRodW1iU2l6ZSA9IGNhbGNUaHVtYlNpemUoc2Nyb2xsVmFsdWVzLnNjcm9sbFdpZHRoLCBzY3JvbGxWYWx1ZXMuY2xpZW50V2lkdGgsIHRyYWNrSW5uZXJTaXplLCBwcm9wcy5taW5pbWFsVGh1bWJYU2l6ZSB8fCBwcm9wcy5taW5pbWFsVGh1bWJTaXplLCBwcm9wcy5tYXhpbWFsVGh1bWJYU2l6ZSB8fCBwcm9wcy5tYXhpbWFsVGh1bWJTaXplKTtcbiAgICAgICAgICAgIHZhciB0aHVtYk9mZnNldCA9IGNhbGNUaHVtYk9mZnNldChzY3JvbGxWYWx1ZXMuc2Nyb2xsV2lkdGgsIHNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aCwgdHJhY2tJbm5lclNpemUsIHRodW1iU2l6ZSwgc2Nyb2xsVmFsdWVzLnNjcm9sbExlZnQpO1xuXG4gICAgICAgICAgICBpZiAoX3RoaXMuc3RhdGUuaXNSVEwgJiYgc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbCgpKSB7XG4gICAgICAgICAgICAgIHRodW1iT2Zmc2V0ICs9IHRyYWNrSW5uZXJTaXplIC0gdGh1bWJTaXplO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IFwidHJhbnNsYXRlWChcIi5jb25jYXQodGh1bWJPZmZzZXQsIFwicHgpXCIpO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJYRWxlbWVudC5zdHlsZS53aWR0aCA9IFwiXCIuY29uY2F0KHRodW1iU2l6ZSwgXCJweFwiKTtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJYRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwcHgnO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJYRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZkhvbGRlciA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLmhvbGRlckVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZXcmFwcGVyID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMud3JhcHBlckVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy53cmFwcGVyUHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMud3JhcHBlclByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZlNjcm9sbGVyID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMuc2Nyb2xsZXJQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy5zY3JvbGxlclByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZkNvbnRlbnQgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy5jb250ZW50RWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLmNvbnRlbnRQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy5jb250ZW50UHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmVHJhY2tYID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMudHJhY2tYRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLnRyYWNrWFByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRyYWNrWFByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZlRyYWNrWSA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLnRyYWNrWUVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy50cmFja1lQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy50cmFja1lQcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZUaHVtYlggPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy50aHVtYlhFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMudGh1bWJYUHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudGh1bWJYUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmVGh1bWJZID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMudGh1bWJZRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLnRodW1iWVByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRodW1iWVByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVHJhY2tYQ2xpY2sgPSBmdW5jdGlvbiAoZXYsIHZhbHVlcykge1xuICAgICAgaWYgKF90aGlzLnByb3BzLnRyYWNrWFByb3BzLm9uQ2xpY2spIHtcbiAgICAgICAgX3RoaXMucHJvcHMudHJhY2tYUHJvcHMub25DbGljayhldiwgdmFsdWVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgIV90aGlzLnRyYWNrWEVsZW1lbnQgfHwgIV90aGlzLnRodW1iWEVsZW1lbnQgfHwgIV90aGlzLnNjcm9sbFZhbHVlcyB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFhQb3NzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgdmFyIHRodW1iU2l6ZSA9IF90aGlzLnRodW1iWEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICB2YXIgdHJhY2tJbm5lclNpemUgPSBnZXRJbm5lcldpZHRoKF90aGlzLnRyYWNrWEVsZW1lbnQpO1xuICAgICAgdmFyIHRodW1iT2Zmc2V0ID0gKF90aGlzLnNjcm9sbFZhbHVlcy5pc1JUTCAmJiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsKCkgPyB2YWx1ZXMub2Zmc2V0ICsgdGh1bWJTaXplIC8gMiAtIHRyYWNrSW5uZXJTaXplIDogdmFsdWVzLm9mZnNldCAtIHRodW1iU2l6ZSAvIDIpIC0gKE51bWJlci5wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoX3RoaXMudHJhY2tYRWxlbWVudCkucGFkZGluZ0xlZnQpIHx8IDApO1xuICAgICAgdmFyIHRhcmdldCA9IGNhbGNTY3JvbGxGb3JUaHVtYk9mZnNldChfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsV2lkdGgsIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aCwgdHJhY2tJbm5lclNpemUsIHRodW1iU2l6ZSwgdGh1bWJPZmZzZXQpO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMudHJhY2tDbGlja0JlaGF2aW9yID09PSBUUkFDS19DTElDS19CRUhBVklPUi5TVEVQKSB7XG4gICAgICAgIHRhcmdldCA9IChfdGhpcy5zY3JvbGxWYWx1ZXMuaXNSVEwgPyBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsTGVmdCA+IHRhcmdldCA6IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxMZWZ0IDwgdGFyZ2V0KSA/IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxMZWZ0ICsgX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudFdpZHRoIDogX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbExlZnQgLSBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50V2lkdGg7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0gdGFyZ2V0O1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmFja1lDbGljayA9IGZ1bmN0aW9uIChldiwgdmFsdWVzKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMudHJhY2tZUHJvcHMub25DbGljaykgX3RoaXMucHJvcHMudHJhY2tZUHJvcHMub25DbGljayhldiwgdmFsdWVzKTtcblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgIV90aGlzLnRyYWNrWUVsZW1lbnQgfHwgIV90aGlzLnRodW1iWUVsZW1lbnQgfHwgIV90aGlzLnNjcm9sbFZhbHVlcyB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgdmFyIHRodW1iU2l6ZSA9IF90aGlzLnRodW1iWUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgdmFyIHRhcmdldCA9IGNhbGNTY3JvbGxGb3JUaHVtYk9mZnNldChfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsSGVpZ2h0LCBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0LCBnZXRJbm5lckhlaWdodChfdGhpcy50cmFja1lFbGVtZW50KSwgdGh1bWJTaXplLCB2YWx1ZXMub2Zmc2V0IC0gdGh1bWJTaXplIC8gMikgLSAoTnVtYmVyLnBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShfdGhpcy50cmFja1lFbGVtZW50KS5wYWRkaW5nVG9wKSB8fCAwKTtcblxuICAgICAgaWYgKF90aGlzLnByb3BzLnRyYWNrQ2xpY2tCZWhhdmlvciA9PT0gVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IuSlVNUCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gdGFyZ2V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxUb3AgPCB0YXJnZXQgPyBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsVG9wICsgX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudEhlaWdodCA6IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxUb3AgLSBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmFja1lNb3VzZVdoZWVsID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICB2YXIgcHJvcHMgPSBfdGhpcy5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLnRyYWNrWVByb3BzICYmIHByb3BzLnRyYWNrWVByb3BzLm9uV2hlZWwpIHtcbiAgICAgICAgcHJvcHMudHJhY2tZUHJvcHMub25XaGVlbChldik7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5kaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyB8fCBwcm9wcy5kaXNhYmxlVHJhY2tZTW91c2V3aGVlbFNjcm9sbGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFlCbG9ja2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2Nyb2xsVG9wICs9IGV2LmRlbHRhWTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVHJhY2tYTW91c2VXaGVlbCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgdmFyIHByb3BzID0gX3RoaXMucHJvcHM7XG5cbiAgICAgIGlmIChwcm9wcy50cmFja1hQcm9wcyAmJiBwcm9wcy50cmFja1hQcm9wcy5vbldoZWVsKSB7XG4gICAgICAgIHByb3BzLnRyYWNrWFByb3BzLm9uV2hlZWwoZXYpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmcgfHwgcHJvcHMuZGlzYWJsZVRyYWNrWE1vdXNld2hlZWxTY3JvbGxpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uKCk7XG5cbiAgICAgIGlmICghX3RoaXMuc2Nyb2xsZXJFbGVtZW50IHx8IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxYQmxvY2tlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNjcm9sbExlZnQgKz0gZXYuZGVsdGFYO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUaHVtYlhEcmFnID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgaWYgKCFfdGhpcy50cmFja1hFbGVtZW50IHx8ICFfdGhpcy50aHVtYlhFbGVtZW50IHx8ICFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgIV90aGlzLnNjcm9sbFZhbHVlcyB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFhQb3NzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgdmFyIHRyYWNrUmVjdCA9IF90aGlzLnRyYWNrWEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHZhciBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKF90aGlzLnRyYWNrWEVsZW1lbnQpO1xuICAgICAgdmFyIHBhZGRpbmdMZWZ0ID0gTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdMZWZ0KSB8fCAwO1xuICAgICAgdmFyIHBhZGRpbmdSaWdodCA9IE51bWJlci5wYXJzZUZsb2F0KHN0eWxlcy5wYWRkaW5nUmlnaHQpIHx8IDA7XG4gICAgICB2YXIgdHJhY2tJbm5lclNpemUgPSB0cmFja1JlY3Qud2lkdGggLSBwYWRkaW5nTGVmdCAtIHBhZGRpbmdSaWdodDtcbiAgICAgIHZhciB0aHVtYlNpemUgPSBfdGhpcy50aHVtYlhFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgdmFyIG9mZnNldCA9IF90aGlzLnNjcm9sbFZhbHVlcy5pc1JUTCAmJiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsKCkgPyBkYXRhLnggKyB0aHVtYlNpemUgLSB0cmFja0lubmVyU2l6ZSArIHBhZGRpbmdMZWZ0IDogZGF0YS5sYXN0WCAtIHBhZGRpbmdMZWZ0O1xuICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSBjYWxjU2Nyb2xsRm9yVGh1bWJPZmZzZXQoX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFdpZHRoLCBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50V2lkdGgsIHRyYWNrSW5uZXJTaXplLCB0aHVtYlNpemUsIG9mZnNldCk7XG5cbiAgICAgIGlmICgoX2EgPSBfdGhpcy5wcm9wcy50aHVtYlhQcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uRHJhZykge1xuICAgICAgICBfdGhpcy5wcm9wcy50aHVtYlhQcm9wcy5vbkRyYWcoZGF0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRodW1iWERyYWdFbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBfdGhpcy5oYW5kbGVUaHVtYlhEcmFnKGRhdGEpO1xuXG4gICAgICBpZiAoKF9hID0gX3RoaXMucHJvcHMudGh1bWJYUHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkRyYWdFbmQpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudGh1bWJYUHJvcHMub25EcmFnRW5kKGRhdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUaHVtYllEcmFnID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgIV90aGlzLnRyYWNrWUVsZW1lbnQgfHwgIV90aGlzLnRodW1iWUVsZW1lbnQgfHwgIV90aGlzLnNjcm9sbFZhbHVlcyB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgdmFyIHRyYWNrUmVjdCA9IF90aGlzLnRyYWNrWUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHZhciBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKF90aGlzLnRyYWNrWUVsZW1lbnQpO1xuICAgICAgdmFyIHBhZGRpbmdUb3AgPSBOdW1iZXIucGFyc2VGbG9hdChzdHlsZXMucGFkZGluZ1RvcCkgfHwgMDtcbiAgICAgIHZhciBwYWRkaW5nQm90dG9tID0gTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdCb3R0b20pIHx8IDA7XG4gICAgICB2YXIgdHJhY2tJbm5lclNpemUgPSB0cmFja1JlY3QuaGVpZ2h0IC0gcGFkZGluZ1RvcCAtIHBhZGRpbmdCb3R0b207XG4gICAgICB2YXIgdGh1bWJTaXplID0gX3RoaXMudGh1bWJZRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB2YXIgb2Zmc2V0ID0gZGF0YS55IC0gcGFkZGluZ1RvcDtcbiAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSBjYWxjU2Nyb2xsRm9yVGh1bWJPZmZzZXQoX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbEhlaWdodCwgX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudEhlaWdodCwgdHJhY2tJbm5lclNpemUsIHRodW1iU2l6ZSwgb2Zmc2V0KTtcblxuICAgICAgaWYgKChfYSA9IF90aGlzLnByb3BzLnRodW1iWVByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25EcmFnKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRodW1iWVByb3BzLm9uRHJhZyhkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVGh1bWJZRHJhZ0VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIF90aGlzLmhhbmRsZVRodW1iWURyYWcoZGF0YSk7XG5cbiAgICAgIGlmICgoX2EgPSBfdGhpcy5wcm9wcy50aHVtYllQcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uRHJhZ0VuZCkge1xuICAgICAgICBfdGhpcy5wcm9wcy50aHVtYllQcm9wcy5vbkRyYWdFbmQoZGF0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVNjcm9sbGVyU2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuICAgIH07XG5cbiAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uVE8pIHtcbiAgICAgICAgX3RoaXMuZXZlbnRFbWl0dGVyLmVtaXQoJ3Njcm9sbFN0YXJ0JywgX3RoaXMuZ2V0U2Nyb2xsU3RhdGUoKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KF90aGlzLl9zY3JvbGxEZXRlY3Rpb25UTyk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb25UTyA9IGlzQnJvd3NlciA/IHdpbmRvdy5zZXRUaW1lb3V0KF90aGlzLl9zY3JvbGxEZXRlY3Rpb25DYWxsYmFjaywgX3RoaXMucHJvcHMuc2Nyb2xsRGV0ZWN0aW9uVGhyZXNob2xkIHx8IDApIDogbnVsbDtcbiAgICB9O1xuXG4gICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvblRPID0gbnVsbDtcblxuICAgICAgX3RoaXMuZXZlbnRFbWl0dGVyLmVtaXQoJ3Njcm9sbFN0b3AnLCBfdGhpcy5nZXRTY3JvbGxTdGF0ZSgpKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICB0cmFja1hWaXNpYmxlOiBmYWxzZSxcbiAgICAgIHRyYWNrWVZpc2libGU6IGZhbHNlLFxuICAgICAgaXNSVEw6IHByb3BzLnJ0bFxuICAgIH07XG4gICAgX3RoaXMuc2Nyb2xsVmFsdWVzID0gX3RoaXMuZ2V0U2Nyb2xsU3RhdGUodHJ1ZSk7XG4gICAgX3RoaXMuZXZlbnRFbWl0dGVyID0gbmV3IEVtaXR0cigxNSk7XG4gICAgaWYgKHByb3BzLm9uVXBkYXRlKSBfdGhpcy5ldmVudEVtaXR0ZXIub24oJ3VwZGF0ZScsIHByb3BzLm9uVXBkYXRlKTtcbiAgICBpZiAocHJvcHMub25TY3JvbGwpIF90aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsJywgcHJvcHMub25TY3JvbGwpO1xuICAgIGlmIChwcm9wcy5vblNjcm9sbFN0YXJ0KSBfdGhpcy5ldmVudEVtaXR0ZXIub24oJ3Njcm9sbFN0YXJ0JywgcHJvcHMub25TY3JvbGxTdGFydCk7XG4gICAgaWYgKHByb3BzLm9uU2Nyb2xsU3RvcCkgX3RoaXMuZXZlbnRFbWl0dGVyLm9uKCdzY3JvbGxTdG9wJywgcHJvcHMub25TY3JvbGxTdG9wKTtcbiAgICBfdGhpcy5pZCA9IHV1aWQoKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJzY3JvbGxUb3BcIiwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9zb3J0LWNvbXBcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHRvcCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNjcm9sbGJhci5wcm90b3R5cGUsIFwic2Nyb2xsTGVmdFwiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobGVmdCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgICAgfVxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJzY3JvbGxIZWlnaHRcIiwge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJzY3JvbGxXaWR0aFwiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNjcm9sbGJhci5wcm90b3R5cGUsIFwiY2xpZW50SGVpZ2h0XCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNjcm9sbGJhci5wcm90b3R5cGUsIFwiY2xpZW50V2lkdGhcIiwge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9zb3J0LWNvbXBcblxuICBTY3JvbGxiYXIuY2FsY3VsYXRlU3R5bGVzID0gZnVuY3Rpb24gKHByb3BzLCBzdGF0ZSwgc2Nyb2xsVmFsdWVzLCBzY3JvbGxiYXJXaWR0aCkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcblxuICAgIHZhciB1c2VEZWZhdWx0U3R5bGVzID0gIXByb3BzLm5vRGVmYXVsdFN0eWxlcztcbiAgICByZXR1cm4ge1xuICAgICAgaG9sZGVyOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS5ob2xkZXIpLCB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICB9KSwgcHJvcHMuc3R5bGUpLFxuICAgICAgd3JhcHBlcjogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlLndyYXBwZXIpLCAhcHJvcHMuZGlzYWJsZVRyYWNrc1dpZHRoQ29tcGVuc2F0aW9uICYmICFwcm9wcy5kaXNhYmxlVHJhY2tZV2lkdGhDb21wZW5zYXRpb24gJiYgKF9hID0ge30sIF9hW3N0YXRlLmlzUlRMID8gJ2xlZnQnIDogJ3JpZ2h0J10gPSBzdGF0ZS50cmFja1lWaXNpYmxlID8gMTAgOiAwLCBfYSkpLCAhcHJvcHMuZGlzYWJsZVRyYWNrc1dpZHRoQ29tcGVuc2F0aW9uICYmICFwcm9wcy5kaXNhYmxlVHJhY2tYV2lkdGhDb21wZW5zYXRpb24gJiYge1xuICAgICAgICBib3R0b206IHN0YXRlLnRyYWNrWFZpc2libGUgPyAxMCA6IDBcbiAgICAgIH0pKSwgcHJvcHMud3JhcHBlclByb3BzLnN0eWxlKSwge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgICB9KSxcbiAgICAgIGNvbnRlbnQ6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLmNvbnRlbnQpLCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVlUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVhUb0hvbGRlciA/IHtcbiAgICAgICAgZGlzcGxheTogJ3RhYmxlLWNlbGwnXG4gICAgICB9IDoge1xuICAgICAgICBwYWRkaW5nOiAwLjA1IC8vIG5lZWRlZCB0byBkaXNhYmxlIG1hcmdpbiBjb2xsYXBzaW5nIHdpdGhvdXQgZmxleGJveGVzLCBvdGhlciBwb3NzaWJsZSBzb2x1dGlvbnMgaGVyZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3MTg2MzQvaG93LXRvLWRpc2FibGUtbWFyZ2luLWNvbGxhcHNpbmdcblxuICAgICAgfSksIHVzZURlZmF1bHRTdHlsZXMgJiYgIShwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVlUb0hvbGRlcikgJiYge1xuICAgICAgICBtaW5IZWlnaHQ6ICcxMDAlJ1xuICAgICAgfSksIHVzZURlZmF1bHRTdHlsZXMgJiYgIShwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVhUb0hvbGRlcikgJiYge1xuICAgICAgICBtaW5XaWR0aDogJzEwMCUnXG4gICAgICB9KSwgcHJvcHMuY29udGVudFByb3BzLnN0eWxlKSxcbiAgICAgIHNjcm9sbGVyOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbigoX2IgPSB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgIHBhZGRpbmdCb3R0b206ICFzY3JvbGxiYXJXaWR0aCAmJiBzY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlID8gcHJvcHMuZmFsbGJhY2tTY3JvbGxiYXJXaWR0aCA6IHVuZGVmaW5lZFxuICAgICAgfSwgX2Jbc3RhdGUuaXNSVEwgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCddID0gIXNjcm9sbGJhcldpZHRoICYmIHNjcm9sbFZhbHVlcy5zY3JvbGxZUG9zc2libGUgPyBwcm9wcy5mYWxsYmFja1Njcm9sbGJhcldpZHRoIDogdW5kZWZpbmVkLCBfYiksIHByb3BzLnNjcm9sbGVyUHJvcHMuc3R5bGUpLCAhaXNVbmRlZihwcm9wcy5ydGwpICYmIHtcbiAgICAgICAgZGlyZWN0aW9uOiBwcm9wcy5ydGwgPyAncnRsJyA6ICdsdHInXG4gICAgICB9KSwgcHJvcHMubW9tZW50dW0gJiYge1xuICAgICAgICBXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogJ3RvdWNoJ1xuICAgICAgfSksIChfYyA9IHtcbiAgICAgICAgb3ZlcmZsb3dZOiBzY3JvbGxWYWx1ZXMuc2Nyb2xsWVBvc3NpYmxlID8gJ3Njcm9sbCcgOiAnaGlkZGVuJyxcbiAgICAgICAgb3ZlcmZsb3dYOiBzY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlID8gJ3Njcm9sbCcgOiAnaGlkZGVuJyxcbiAgICAgICAgbWFyZ2luQm90dG9tOiBzY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlID8gLShzY3JvbGxiYXJXaWR0aCB8fCBwcm9wcy5mYWxsYmFja1Njcm9sbGJhcldpZHRoKSAtIE51bWJlcihzY3JvbGxWYWx1ZXMuem9vbUxldmVsICE9PSAxKSA6IHVuZGVmaW5lZFxuICAgICAgfSwgX2Nbc3RhdGUuaXNSVEwgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnXSA9IHNjcm9sbFZhbHVlcy5zY3JvbGxZUG9zc2libGUgPyAtKHNjcm9sbGJhcldpZHRoIHx8IHByb3BzLmZhbGxiYWNrU2Nyb2xsYmFyV2lkdGgpIC0gTnVtYmVyKHNjcm9sbFZhbHVlcy56b29tTGV2ZWwgIT09IDEpIDogdW5kZWZpbmVkLCBfYykpLFxuICAgICAgdHJhY2tYOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50cmFjay5jb21tb24pLCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRyYWNrLngpLCBwcm9wcy50cmFja1hQcm9wcy5zdHlsZSksICFzdGF0ZS50cmFja1hWaXNpYmxlICYmIHtcbiAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICB9KSxcbiAgICAgIHRyYWNrWTogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudHJhY2suY29tbW9uKSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50cmFjay55KSwgdXNlRGVmYXVsdFN0eWxlcyAmJiAoX2QgPSB7fSwgX2Rbc3RhdGUuaXNSVEwgPyAnbGVmdCcgOiAncmlnaHQnXSA9IDAsIF9kKSksIHByb3BzLnRyYWNrWVByb3BzLnN0eWxlKSwgIXN0YXRlLnRyYWNrWVZpc2libGUgJiYge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgIH0pLFxuICAgICAgdGh1bWJYOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50aHVtYi5jb21tb24pLCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRodW1iLngpLCBwcm9wcy50aHVtYlhQcm9wcy5zdHlsZSksXG4gICAgICB0aHVtYlk6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRodW1iLmNvbW1vbiksIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudGh1bWIueSksIHByb3BzLnRodW1iWVByb3BzLnN0eWxlKVxuICAgIH07XG4gIH07XG5cbiAgU2Nyb2xsYmFyLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2Nyb2xsZXIgZWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb250ZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbnRlbnQgZWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoIXByb3BzLm5hdGl2ZSAmJiAhcHJvcHMubW9iaWxlTmF0aXZlKSB7XG4gICAgICAvLyBUb0RvOiBtb3ZlIG5hdGl2ZSBzdGF0ZSB0byB0aGUgc3RhdGUgc28gaXQgY2FuIGJlIHN5bmNocm9uaXplZFxuICAgICAgaWYgKCF0aGlzLmhvbGRlckVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaG9sZGVyIGVsZW1lbnQgd2FzIG5vdCBjcmVhdGVkLiBQb3NzaWJseSB5b3UgaGF2ZW4ndCBwcm92aWRlZCBIVE1MRGl2RWxlbWVudCB0byByZW5kZXJlcidzIGBlbGVtZW50UmVmYCBmdW5jdGlvbi5cIik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy53cmFwcGVyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3cmFwcGVyIGVsZW1lbnQgd2FzIG5vdCBjcmVhdGVkLiBQb3NzaWJseSB5b3UgaGF2ZW4ndCBwcm92aWRlZCBIVE1MRGl2RWxlbWVudCB0byByZW5kZXJlcidzIGBlbGVtZW50UmVmYCBmdW5jdGlvbi5cIik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgTG9vcC5hZGRUYXJnZXQodGhpcyk7XG5cbiAgICBpZiAoIWlzVW5kZWYocHJvcHMuc2Nyb2xsVG9wKSkge1xuICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gcHJvcHMuc2Nyb2xsVG9wO1xuICAgIH1cblxuICAgIGlmICghaXNVbmRlZihwcm9wcy5zY3JvbGxMZWZ0KSkge1xuICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IHByb3BzLnNjcm9sbExlZnQ7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGUodHJ1ZSk7XG4gIH07XG5cbiAgU2Nyb2xsYmFyLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBMb29wLnJlbW92ZVRhcmdldCh0aGlzKTtcbiAgfTtcblxuICBTY3JvbGxiYXIucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGlmICghdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKHByb3BzLnJ0bCAhPT0gcHJldlByb3BzLnJ0bCAmJiBwcm9wcy5ydGwgIT09IHRoaXMuc3RhdGUuaXNSVEwpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc1JUTDogcHJvcHMucnRsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5pc1JUTCAhPT0gcHJldlN0YXRlLmlzUlRMKSB7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGlmICghaXNVbmRlZihwcm9wcy5zY3JvbGxUb3ApICYmIHByb3BzLnNjcm9sbFRvcCAhPT0gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wKSB7XG4gICAgICB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSBwcm9wcy5zY3JvbGxUb3A7XG4gICAgfVxuXG4gICAgaWYgKCFpc1VuZGVmKHByb3BzLnNjcm9sbExlZnQpICYmIHByb3BzLnNjcm9sbExlZnQgIT09IHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQpIHtcbiAgICAgIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSBwcm9wcy5zY3JvbGxMZWZ0O1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMub25VcGRhdGUgIT09IHByb3BzLm9uVXBkYXRlKSB7XG4gICAgICBpZiAocHJldlByb3BzLm9uVXBkYXRlKSB0aGlzLmV2ZW50RW1pdHRlci5vZmYoJ3VwZGF0ZScsIHByZXZQcm9wcy5vblVwZGF0ZSk7XG4gICAgICBpZiAocHJvcHMub25VcGRhdGUpIHRoaXMuZXZlbnRFbWl0dGVyLm9uKCd1cGRhdGUnLCBwcm9wcy5vblVwZGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5vblNjcm9sbCAhPT0gcHJvcHMub25TY3JvbGwpIHtcbiAgICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGwpIHRoaXMuZXZlbnRFbWl0dGVyLm9mZignc2Nyb2xsJywgcHJldlByb3BzLm9uU2Nyb2xsKTtcbiAgICAgIGlmIChwcm9wcy5vblNjcm9sbCkgdGhpcy5ldmVudEVtaXR0ZXIub24oJ3Njcm9sbCcsIHByb3BzLm9uU2Nyb2xsKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLm9uU2Nyb2xsU3RhcnQgIT09IHByb3BzLm9uU2Nyb2xsU3RhcnQpIHtcbiAgICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGxTdGFydCkgdGhpcy5ldmVudEVtaXR0ZXIub2ZmKCdzY3JvbGxTdGFydCcsIHByZXZQcm9wcy5vblNjcm9sbFN0YXJ0KTtcbiAgICAgIGlmIChwcm9wcy5vblNjcm9sbFN0YXJ0KSB0aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsU3RhcnQnLCBwcm9wcy5vblNjcm9sbFN0YXJ0KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLm9uU2Nyb2xsU3RvcCAhPT0gcHJvcHMub25TY3JvbGxTdG9wKSB7XG4gICAgICBpZiAocHJldlByb3BzLm9uU2Nyb2xsU3RvcCkgdGhpcy5ldmVudEVtaXR0ZXIub2ZmKCdzY3JvbGxTdG9wJywgcHJldlByb3BzLm9uU2Nyb2xsU3RvcCk7XG4gICAgICBpZiAocHJvcHMub25TY3JvbGxTdG9wKSB0aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsU3RvcCcsIHByb3BzLm9uU2Nyb2xsU3RvcCk7XG4gICAgfVxuICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvc29ydC1jb21wXG5cblxuICBTY3JvbGxiYXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EgPSB0aGlzLnByb3BzLFxuICAgICAgICBjcmVhdGVDb250ZXh0ID0gX2EuY3JlYXRlQ29udGV4dCxcbiAgICAgICAgcnRsID0gX2EucnRsLFxuICAgICAgICBuYXRpdmUgPSBfYS5uYXRpdmUsXG4gICAgICAgIG1vYmlsZU5hdGl2ZSA9IF9hLm1vYmlsZU5hdGl2ZSxcbiAgICAgICAgbW9tZW50dW0gPSBfYS5tb21lbnR1bTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm5vRGVmYXVsdFN0eWxlcztcbiAgICAgICAgdmFyIGRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nID0gX2EuZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmcsXG4gICAgICAgIGRpc2FibGVUcmFja1hNb3VzZXdoZWVsU2Nyb2xsaW5nID0gX2EuZGlzYWJsZVRyYWNrWE1vdXNld2hlZWxTY3JvbGxpbmcsXG4gICAgICAgIGRpc2FibGVUcmFja1lNb3VzZXdoZWVsU2Nyb2xsaW5nID0gX2EuZGlzYWJsZVRyYWNrWU1vdXNld2hlZWxTY3JvbGxpbmc7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5kaXNhYmxlVHJhY2tzV2lkdGhDb21wZW5zYXRpb247XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5kaXNhYmxlVHJhY2tYV2lkdGhDb21wZW5zYXRpb247XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5kaXNhYmxlVHJhY2tZV2lkdGhDb21wZW5zYXRpb247XG4gICAgICAgIHZhciBub1Njcm9sbFggPSBfYS5ub1Njcm9sbFgsXG4gICAgICAgIG5vU2Nyb2xsWSA9IF9hLm5vU2Nyb2xsWSxcbiAgICAgICAgbm9TY3JvbGwgPSBfYS5ub1Njcm9sbCxcbiAgICAgICAgcGVybWFuZW50VHJhY2tYID0gX2EucGVybWFuZW50VHJhY2tYLFxuICAgICAgICBwZXJtYW5lbnRUcmFja1kgPSBfYS5wZXJtYW5lbnRUcmFja1ksXG4gICAgICAgIHBlcm1hbmVudFRyYWNrcyA9IF9hLnBlcm1hbmVudFRyYWNrcyxcbiAgICAgICAgcmVtb3ZlVHJhY2tzV2hlbk5vdFVzZWQgPSBfYS5yZW1vdmVUcmFja3NXaGVuTm90VXNlZCxcbiAgICAgICAgcmVtb3ZlVHJhY2tZV2hlbk5vdFVzZWQgPSBfYS5yZW1vdmVUcmFja1lXaGVuTm90VXNlZCxcbiAgICAgICAgcmVtb3ZlVHJhY2tYV2hlbk5vdFVzZWQgPSBfYS5yZW1vdmVUcmFja1hXaGVuTm90VXNlZDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm1pbmltYWxUaHVtYlNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5tYXhpbWFsVGh1bWJTaXplO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EubWluaW1hbFRodW1iWFNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5tYXhpbWFsVGh1bWJYU2l6ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm1pbmltYWxUaHVtYllTaXplO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EubWF4aW1hbFRodW1iWVNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5mYWxsYmFja1Njcm9sbGJhcldpZHRoO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Euc2Nyb2xsVG9wO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Euc2Nyb2xsTGVmdDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnRyYWNrQ2xpY2tCZWhhdmlvcjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnNjcm9sbERldGVjdGlvblRocmVzaG9sZDtcbiAgICAgICAgdmFyIHByb3BzV3JhcHBlclByb3BzID0gX2Eud3JhcHBlclByb3BzLFxuICAgICAgICBwcm9wc1Njcm9sbGVyUHJvcHMgPSBfYS5zY3JvbGxlclByb3BzLFxuICAgICAgICBwcm9wc0NvbnRlbnRQcm9wcyA9IF9hLmNvbnRlbnRQcm9wcyxcbiAgICAgICAgcHJvcHNUcmFja1hQcm9wcyA9IF9hLnRyYWNrWFByb3BzLFxuICAgICAgICBwcm9wc1RyYWNrWVByb3BzID0gX2EudHJhY2tZUHJvcHMsXG4gICAgICAgIHByb3BzVGh1bWJYUHJvcHMgPSBfYS50aHVtYlhQcm9wcyxcbiAgICAgICAgcHJvcHNUaHVtYllQcm9wcyA9IF9hLnRodW1iWVByb3BzLFxuICAgICAgICBwcm9wc1Njcm9sbGJhcldpZHRoID0gX2Euc2Nyb2xsYmFyV2lkdGg7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5lbGVtZW50UmVmO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eub25VcGRhdGU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vblNjcm9sbDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uU2Nyb2xsU3RhcnQ7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vblNjcm9sbFN0b3A7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlcjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EudHJhbnNsYXRlQ29udGVudFNpemVYVG9Ib2xkZXI7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgICAgICBwcm9wc0hvbGRlclByb3BzID0gX19yZXN0KF9hLCBbXCJjcmVhdGVDb250ZXh0XCIsIFwicnRsXCIsIFwibmF0aXZlXCIsIFwibW9iaWxlTmF0aXZlXCIsIFwibW9tZW50dW1cIiwgXCJub0RlZmF1bHRTdHlsZXNcIiwgXCJkaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZ1wiLCBcImRpc2FibGVUcmFja1hNb3VzZXdoZWVsU2Nyb2xsaW5nXCIsIFwiZGlzYWJsZVRyYWNrWU1vdXNld2hlZWxTY3JvbGxpbmdcIiwgXCJkaXNhYmxlVHJhY2tzV2lkdGhDb21wZW5zYXRpb25cIiwgXCJkaXNhYmxlVHJhY2tYV2lkdGhDb21wZW5zYXRpb25cIiwgXCJkaXNhYmxlVHJhY2tZV2lkdGhDb21wZW5zYXRpb25cIiwgXCJub1Njcm9sbFhcIiwgXCJub1Njcm9sbFlcIiwgXCJub1Njcm9sbFwiLCBcInBlcm1hbmVudFRyYWNrWFwiLCBcInBlcm1hbmVudFRyYWNrWVwiLCBcInBlcm1hbmVudFRyYWNrc1wiLCBcInJlbW92ZVRyYWNrc1doZW5Ob3RVc2VkXCIsIFwicmVtb3ZlVHJhY2tZV2hlbk5vdFVzZWRcIiwgXCJyZW1vdmVUcmFja1hXaGVuTm90VXNlZFwiLCBcIm1pbmltYWxUaHVtYlNpemVcIiwgXCJtYXhpbWFsVGh1bWJTaXplXCIsIFwibWluaW1hbFRodW1iWFNpemVcIiwgXCJtYXhpbWFsVGh1bWJYU2l6ZVwiLCBcIm1pbmltYWxUaHVtYllTaXplXCIsIFwibWF4aW1hbFRodW1iWVNpemVcIiwgXCJmYWxsYmFja1Njcm9sbGJhcldpZHRoXCIsIFwic2Nyb2xsVG9wXCIsIFwic2Nyb2xsTGVmdFwiLCBcInRyYWNrQ2xpY2tCZWhhdmlvclwiLCBcInNjcm9sbERldGVjdGlvblRocmVzaG9sZFwiLCBcIndyYXBwZXJQcm9wc1wiLCBcInNjcm9sbGVyUHJvcHNcIiwgXCJjb250ZW50UHJvcHNcIiwgXCJ0cmFja1hQcm9wc1wiLCBcInRyYWNrWVByb3BzXCIsIFwidGh1bWJYUHJvcHNcIiwgXCJ0aHVtYllQcm9wc1wiLCBcInNjcm9sbGJhcldpZHRoXCIsIFwiZWxlbWVudFJlZlwiLCBcIm9uVXBkYXRlXCIsIFwib25TY3JvbGxcIiwgXCJvblNjcm9sbFN0YXJ0XCIsIFwib25TY3JvbGxTdG9wXCIsIFwidHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXJcIiwgXCJ0cmFuc2xhdGVDb250ZW50U2l6ZVlUb0hvbGRlclwiLCBcInRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyXCIsIFwiY2hpbGRyZW5cIl0pO1xuXG4gICAgdmFyIHNjcm9sbGJhcldpZHRoID0gIWlzVW5kZWYocHJvcHNTY3JvbGxiYXJXaWR0aCkgPyBwcm9wc1Njcm9sbGJhcldpZHRoIDogZ2V0U2Nyb2xsYmFyV2lkdGgoKSB8fCAwO1xuXG4gICAgaWYgKG5hdGl2ZSB8fCAhc2Nyb2xsYmFyV2lkdGggJiYgbW9iaWxlTmF0aXZlKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZIb2xkZXIobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZXcmFwcGVyKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVHJhY2tYKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVHJhY2tZKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVGh1bWJYKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVGh1bWJZKG51bGwpO1xuXG4gICAgICB2YXIgY29udGVudFByb3BzXzEgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNDb250ZW50UHJvcHMpLCB7XG4gICAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tQ29udGVudCcsXG4gICAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tLUNvbnRlbnQnLCBwcm9wc0NvbnRlbnRQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc2Nyb2xsZXJQcm9wc18xID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzSG9sZGVyUHJvcHMpLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tIG5hdGl2ZScsIHRoaXMuc3RhdGUudHJhY2tZVmlzaWJsZSAmJiAndHJhY2tZVmlzaWJsZScsIHRoaXMuc3RhdGUudHJhY2tYVmlzaWJsZSAmJiAndHJhY2tYVmlzaWJsZScsIHRoaXMuc3RhdGUuaXNSVEwgJiYgJ3J0bCcsIHByb3BzSG9sZGVyUHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgICAgc3R5bGU6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc0hvbGRlclByb3BzLnN0eWxlKSwgIWlzVW5kZWYocnRsKSAmJiB7XG4gICAgICAgICAgZGlyZWN0aW9uOiBydGwgPyAncnRsJyA6ICdsdHInXG4gICAgICAgIH0pLCBtb21lbnR1bSAmJiB7XG4gICAgICAgICAgV2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6ICd0b3VjaCdcbiAgICAgICAgfSksIHtcbiAgICAgICAgICBvdmVyZmxvd1g6IG5vU2Nyb2xsIHx8IG5vU2Nyb2xsWCA/ICdoaWRkZW4nIDogcGVybWFuZW50VHJhY2tzIHx8IHBlcm1hbmVudFRyYWNrWCA/ICdzY3JvbGwnIDogJ2F1dG8nLFxuICAgICAgICAgIG92ZXJmbG93WTogbm9TY3JvbGwgfHwgbm9TY3JvbGxZID8gJ2hpZGRlbicgOiBwZXJtYW5lbnRUcmFja3MgfHwgcGVybWFuZW50VHJhY2tZID8gJ3Njcm9sbCcgOiAnYXV0bydcbiAgICAgICAgfSksXG4gICAgICAgIG9uU2Nyb2xsOiB0aGlzLmhhbmRsZVNjcm9sbGVyU2Nyb2xsLFxuICAgICAgICBjaGlsZHJlbjogcmVuZGVyRGl2V2l0aFJlbmRlcmVyKGNvbnRlbnRQcm9wc18xLCB0aGlzLmVsZW1lbnRSZWZDb250ZW50KSxcbiAgICAgICAgcmVuZGVyZXI6IHByb3BzU2Nyb2xsZXJQcm9wcy5yZW5kZXJlcixcbiAgICAgICAgZWxlbWVudFJlZjogcHJvcHNTY3JvbGxlclByb3BzLmVsZW1lbnRSZWZcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVuZGVyRGl2V2l0aFJlbmRlcmVyKHNjcm9sbGVyUHJvcHNfMSwgdGhpcy5lbGVtZW50UmVmU2Nyb2xsZXIpO1xuICAgIH1cblxuICAgIHZhciBzdHlsZXMgPSBTY3JvbGxiYXIuY2FsY3VsYXRlU3R5bGVzKHRoaXMucHJvcHMsIHRoaXMuc3RhdGUsIHRoaXMuc2Nyb2xsVmFsdWVzLCBzY3JvbGxiYXJXaWR0aCk7XG4gICAgdmFyIGhvbGRlckNoaWxkcmVuID0gW107XG5cbiAgICB2YXIgY29udGVudFByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzQ29udGVudFByb3BzKSwge1xuICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1Db250ZW50JyxcbiAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tLUNvbnRlbnQnLCBwcm9wc0NvbnRlbnRQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlcy5jb250ZW50LFxuICAgICAgY2hpbGRyZW46IGNyZWF0ZUNvbnRleHQgPyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvanN4LW5vLWNvbnN0cnVjdGVkLWNvbnRleHQtdmFsdWVzXG4gICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGJhckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwYXJlbnRTY3JvbGxiYXI6IHRoaXNcbiAgICAgICAgfVxuICAgICAgfSwgY2hpbGRyZW4pIDogY2hpbGRyZW5cbiAgICB9KTtcblxuICAgIHZhciBzY3JvbGxlclByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzU2Nyb2xsZXJQcm9wcyksIHtcbiAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tU2Nyb2xsZXInLFxuICAgICAgY2xhc3NOYW1lOiBjbmIoJ1Njcm9sbGJhcnNDdXN0b20tU2Nyb2xsZXInLCBwcm9wc1Njcm9sbGVyUHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBzdHlsZXMuc2Nyb2xsZXIsXG4gICAgICBjaGlsZHJlbjogcmVuZGVyRGl2V2l0aFJlbmRlcmVyKGNvbnRlbnRQcm9wcywgdGhpcy5lbGVtZW50UmVmQ29udGVudCksXG4gICAgICBvblNjcm9sbDogdGhpcy5oYW5kbGVTY3JvbGxlclNjcm9sbFxuICAgIH0pO1xuXG4gICAgdmFyIHdyYXBwZXJQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc1dyYXBwZXJQcm9wcyksIHtcbiAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tV3JhcHBlcicsXG4gICAgICBjbGFzc05hbWU6IGNuYignU2Nyb2xsYmFyc0N1c3RvbS1XcmFwcGVyJywgcHJvcHNXcmFwcGVyUHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBzdHlsZXMud3JhcHBlcixcbiAgICAgIGNoaWxkcmVuOiByZW5kZXJEaXZXaXRoUmVuZGVyZXIoc2Nyb2xsZXJQcm9wcywgdGhpcy5lbGVtZW50UmVmU2Nyb2xsZXIpXG4gICAgfSk7XG5cbiAgICBob2xkZXJDaGlsZHJlbi5wdXNoKHJlbmRlckRpdldpdGhSZW5kZXJlcih3cmFwcGVyUHJvcHMsIHRoaXMuZWxlbWVudFJlZldyYXBwZXIpKTtcblxuICAgIGlmICh0aGlzLnN0YXRlLnRyYWNrWVZpc2libGUgfHwgIXJlbW92ZVRyYWNrc1doZW5Ob3RVc2VkICYmICFyZW1vdmVUcmFja1lXaGVuTm90VXNlZCkge1xuICAgICAgdmFyIHRodW1iWVByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzVGh1bWJZUHJvcHMpLCB7XG4gICAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tVGh1bWJZJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlcy50aHVtYlksXG4gICAgICAgIGVsZW1lbnRSZWY6IHRoaXMuZWxlbWVudFJlZlRodW1iWSxcbiAgICAgICAgb25EcmFnOiB0aGlzLmhhbmRsZVRodW1iWURyYWcsXG4gICAgICAgIG9uRHJhZ0VuZDogdGhpcy5oYW5kbGVUaHVtYllEcmFnRW5kLFxuICAgICAgICBheGlzOiBBWElTX0RJUkVDVElPTi5ZXG4gICAgICB9KTtcblxuICAgICAgdmFyIHRyYWNrWVByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzVHJhY2tZUHJvcHMpLCB7XG4gICAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tVHJhY2tZJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlcy50cmFja1ksXG4gICAgICAgIGVsZW1lbnRSZWY6IHRoaXMuZWxlbWVudFJlZlRyYWNrWSxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVUcmFja1lDbGlja1xuICAgICAgfSksIChkaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyB8fCBkaXNhYmxlVHJhY2tZTW91c2V3aGVlbFNjcm9sbGluZykgJiYge1xuICAgICAgICBvbldoZWVsOiB0aGlzLmhhbmRsZVRyYWNrWU1vdXNlV2hlZWxcbiAgICAgIH0pLCB7XG4gICAgICAgIGF4aXM6IEFYSVNfRElSRUNUSU9OLllcbiAgICAgIH0pO1xuXG4gICAgICB0cmFja1lQcm9wcy5jaGlsZHJlbiA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsYmFyVGh1bWIsIF9fYXNzaWduKHt9LCB0aHVtYllQcm9wcykpO1xuICAgICAgaG9sZGVyQ2hpbGRyZW4ucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGJhclRyYWNrLCBfX2Fzc2lnbih7fSwgdHJhY2tZUHJvcHMpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRyYWNrWShudWxsKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRodW1iWShudWxsKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS50cmFja1hWaXNpYmxlIHx8ICFyZW1vdmVUcmFja3NXaGVuTm90VXNlZCAmJiAhcmVtb3ZlVHJhY2tYV2hlbk5vdFVzZWQpIHtcbiAgICAgIHZhciB0aHVtYlhQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc1RodW1iWFByb3BzKSwge1xuICAgICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLVRodW1iWCcsXG4gICAgICAgIHN0eWxlOiBzdHlsZXMudGh1bWJYLFxuICAgICAgICBlbGVtZW50UmVmOiB0aGlzLmVsZW1lbnRSZWZUaHVtYlgsXG4gICAgICAgIG9uRHJhZzogdGhpcy5oYW5kbGVUaHVtYlhEcmFnLFxuICAgICAgICBvbkRyYWdFbmQ6IHRoaXMuaGFuZGxlVGh1bWJYRHJhZ0VuZCxcbiAgICAgICAgYXhpczogQVhJU19ESVJFQ1RJT04uWFxuICAgICAgfSk7XG5cbiAgICAgIHZhciB0cmFja1hQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc1RyYWNrWFByb3BzKSwge1xuICAgICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWCcsXG4gICAgICAgIHN0eWxlOiBzdHlsZXMudHJhY2tYLFxuICAgICAgICBlbGVtZW50UmVmOiB0aGlzLmVsZW1lbnRSZWZUcmFja1gsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlVHJhY2tYQ2xpY2tcbiAgICAgIH0pLCAoZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmcgfHwgZGlzYWJsZVRyYWNrWE1vdXNld2hlZWxTY3JvbGxpbmcpICYmIHtcbiAgICAgICAgb25XaGVlbDogdGhpcy5oYW5kbGVUcmFja1hNb3VzZVdoZWVsXG4gICAgICB9KSwge1xuICAgICAgICBheGlzOiBBWElTX0RJUkVDVElPTi5YXG4gICAgICB9KTtcblxuICAgICAgdHJhY2tYUHJvcHMuY2hpbGRyZW4gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGJhclRodW1iLCBfX2Fzc2lnbih7fSwgdGh1bWJYUHJvcHMpKTtcbiAgICAgIGhvbGRlckNoaWxkcmVuLnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxiYXJUcmFjaywgX19hc3NpZ24oe30sIHRyYWNrWFByb3BzKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUcmFja1gobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUaHVtYlgobnVsbCk7XG4gICAgfVxuXG4gICAgdmFyIGhvbGRlclByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzSG9sZGVyUHJvcHMpLCB7XG4gICAgICBjbGFzc05hbWU6IGNuYignU2Nyb2xsYmFyc0N1c3RvbScsIHRoaXMuc3RhdGUudHJhY2tZVmlzaWJsZSAmJiAndHJhY2tZVmlzaWJsZScsIHRoaXMuc3RhdGUudHJhY2tYVmlzaWJsZSAmJiAndHJhY2tYVmlzaWJsZScsIHRoaXMuc3RhdGUuaXNSVEwgJiYgJ3J0bCcsIHByb3BzSG9sZGVyUHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBzdHlsZXMuaG9sZGVyLFxuICAgICAgY2hpbGRyZW46IGhvbGRlckNoaWxkcmVuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVuZGVyRGl2V2l0aFJlbmRlcmVyKGhvbGRlclByb3BzLCB0aGlzLmVsZW1lbnRSZWZIb2xkZXIpO1xuICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvc3RhdGljLXByb3BlcnR5LXBsYWNlbWVudFxuXG5cbiAgU2Nyb2xsYmFyLmNvbnRleHRUeXBlID0gU2Nyb2xsYmFyQ29udGV4dDsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3N0YXRpYy1wcm9wZXJ0eS1wbGFjZW1lbnRcblxuICBTY3JvbGxiYXIuZGVmYXVsdFByb3BzID0ge1xuICAgIG1vbWVudHVtOiB0cnVlLFxuICAgIG1pbmltYWxUaHVtYlNpemU6IDMwLFxuICAgIGZhbGxiYWNrU2Nyb2xsYmFyV2lkdGg6IDIwLFxuICAgIHRyYWNrQ2xpY2tCZWhhdmlvcjogVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IuSlVNUCxcbiAgICBzY3JvbGxEZXRlY3Rpb25UaHJlc2hvbGQ6IDEwMCxcbiAgICB3cmFwcGVyUHJvcHM6IHt9LFxuICAgIHNjcm9sbGVyUHJvcHM6IHt9LFxuICAgIGNvbnRlbnRQcm9wczoge30sXG4gICAgdHJhY2tYUHJvcHM6IHt9LFxuICAgIHRyYWNrWVByb3BzOiB7fSxcbiAgICB0aHVtYlhQcm9wczoge30sXG4gICAgdGh1bWJZUHJvcHM6IHt9XG4gIH07XG4gIHJldHVybiBTY3JvbGxiYXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydCB7IFNjcm9sbGJhciwgU2Nyb2xsYmFyQ29udGV4dCwgU2Nyb2xsYmFyIGFzIGRlZmF1bHQgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0IChleCkgeyByZXR1cm4gKGV4ICYmICh0eXBlb2YgZXggPT09ICdvYmplY3QnKSAmJiAnZGVmYXVsdCcgaW4gZXgpID8gZXhbJ2RlZmF1bHQnXSA6IGV4OyB9XG5cbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgUmVhY3RfX2RlZmF1bHQgPSBfaW50ZXJvcERlZmF1bHQoUmVhY3QpO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbmZ1bmN0aW9uIHdpdGhTaWRlRWZmZWN0KHJlZHVjZVByb3BzVG9TdGF0ZSwgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCwgbWFwU3RhdGVPblNlcnZlcikge1xuICBpZiAodHlwZW9mIHJlZHVjZVByb3BzVG9TdGF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVkdWNlUHJvcHNUb1N0YXRlIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbWFwU3RhdGVPblNlcnZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1hcFN0YXRlT25TZXJ2ZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG1hcFN0YXRlT25TZXJ2ZXIgdG8gZWl0aGVyIGJlIHVuZGVmaW5lZCBvciBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIHJldHVybiBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICBpZiAodHlwZW9mIFdyYXBwZWRDb21wb25lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgV3JhcHBlZENvbXBvbmVudCB0byBiZSBhIFJlYWN0IGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbW91bnRlZEluc3RhbmNlcyA9IFtdO1xuICAgIHZhciBzdGF0ZTtcblxuICAgIGZ1bmN0aW9uIGVtaXRDaGFuZ2UoKSB7XG4gICAgICBzdGF0ZSA9IHJlZHVjZVByb3BzVG9TdGF0ZShtb3VudGVkSW5zdGFuY2VzLm1hcChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnByb3BzO1xuICAgICAgfSkpO1xuXG4gICAgICBpZiAoU2lkZUVmZmVjdC5jYW5Vc2VET00pIHtcbiAgICAgICAgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudChzdGF0ZSk7XG4gICAgICB9IGVsc2UgaWYgKG1hcFN0YXRlT25TZXJ2ZXIpIHtcbiAgICAgICAgc3RhdGUgPSBtYXBTdGF0ZU9uU2VydmVyKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgU2lkZUVmZmVjdCA9XG4gICAgLyojX19QVVJFX18qL1xuICAgIGZ1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzTG9vc2UoU2lkZUVmZmVjdCwgX1B1cmVDb21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBTaWRlRWZmZWN0KCkge1xuICAgICAgICByZXR1cm4gX1B1cmVDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgdG8gdXNlIGRpc3BsYXlOYW1lIG9mIHdyYXBwZWQgY29tcG9uZW50XG4gICAgICAvLyBFeHBvc2UgY2FuVXNlRE9NIHNvIHRlc3RzIGNhbiBtb25rZXlwYXRjaCBpdFxuICAgICAgU2lkZUVmZmVjdC5wZWVrID0gZnVuY3Rpb24gcGVlaygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfTtcblxuICAgICAgU2lkZUVmZmVjdC5yZXdpbmQgPSBmdW5jdGlvbiByZXdpbmQoKSB7XG4gICAgICAgIGlmIChTaWRlRWZmZWN0LmNhblVzZURPTSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBvbmx5IGNhbGwgcmV3aW5kKCkgb24gdGhlIHNlcnZlci4gQ2FsbCBwZWVrKCkgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWNvcmRlZFN0YXRlID0gc3RhdGU7XG4gICAgICAgIHN0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzID0gW107XG4gICAgICAgIHJldHVybiByZWNvcmRlZFN0YXRlO1xuICAgICAgfTtcblxuICAgICAgdmFyIF9wcm90byA9IFNpZGVFZmZlY3QucHJvdG90eXBlO1xuXG4gICAgICBfcHJvdG8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgICAgIG1vdW50ZWRJbnN0YW5jZXMucHVzaCh0aGlzKTtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IG1vdW50ZWRJbnN0YW5jZXMuaW5kZXhPZih0aGlzKTtcbiAgICAgICAgbW91bnRlZEluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCB0aGlzLnByb3BzKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBTaWRlRWZmZWN0O1xuICAgIH0oUmVhY3QuUHVyZUNvbXBvbmVudCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoU2lkZUVmZmVjdCwgXCJkaXNwbGF5TmFtZVwiLCBcIlNpZGVFZmZlY3QoXCIgKyBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSArIFwiKVwiKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShTaWRlRWZmZWN0LCBcImNhblVzZURPTVwiLCBjYW5Vc2VET00pO1xuXG4gICAgcmV0dXJuIFNpZGVFZmZlY3Q7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2l0aFNpZGVFZmZlY3Q7XG4iLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpLHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwic2lnbmF0dXJlX3BhZFwiKSxyZXF1aXJlKFwidHJpbS1jYW52YXNcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wicHJvcC10eXBlc1wiLFwicmVhY3RcIixcInNpZ25hdHVyZV9wYWRcIixcInRyaW0tY2FudmFzXCJdLHQpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuU2lnbmF0dXJlQ2FudmFzPXQocmVxdWlyZShcInByb3AtdHlwZXNcIikscmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJzaWduYXR1cmVfcGFkXCIpLHJlcXVpcmUoXCJ0cmltLWNhbnZhc1wiKSk6ZS5TaWduYXR1cmVDYW52YXM9dChlW1wicHJvcC10eXBlc1wiXSxlLnJlYWN0LGUuc2lnbmF0dXJlX3BhZCxlW1widHJpbS1jYW52YXNcIl0pfSh0aGlzLGZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgYT1uW3JdPXtleHBvcnRzOnt9LGlkOnIsbG9hZGVkOiExfTtyZXR1cm4gZVtyXS5jYWxsKGEuZXhwb3J0cyxhLGEuZXhwb3J0cyx0KSxhLmxvYWRlZD0hMCxhLmV4cG9ydHN9dmFyIG49e307cmV0dXJuIHQubT1lLHQuYz1uLHQucD1cIlwiLHQoMCl9KFtmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19ZnVuY3Rpb24gYShlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKXQuaW5kZXhPZihyKT49MHx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJihuW3JdPWVbcl0pO3JldHVybiBufWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIXR8fFwib2JqZWN0XCIhPXR5cGVvZiB0JiZcImZ1bmN0aW9uXCIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiB1KGUsdCl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sYz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGY9bigxKSxwPXIoZiksbD1uKDIpLGQ9cihsKSx2PW4oMyksaD1yKHYpLF89big0KSxnPXIoXyksbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIGUsbixyLHU7byh0aGlzLHQpO2Zvcih2YXIgcz1hcmd1bWVudHMubGVuZ3RoLGM9QXJyYXkocyksZj0wO2Y8cztmKyspY1tmXT1hcmd1bWVudHNbZl07cmV0dXJuIG49cj1pKHRoaXMsKGU9dC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbC5hcHBseShlLFt0aGlzXS5jb25jYXQoYykpKSxyLl9zaWdQYWQ9bnVsbCxyLl9leGNsdWRlT3VyUHJvcHM9ZnVuY3Rpb24oKXt2YXIgZT1yLnByb3BzLHQ9KGUuY2FudmFzUHJvcHMsZS5jbGVhck9uUmVzaXplLGEoZSxbXCJjYW52YXNQcm9wc1wiLFwiY2xlYXJPblJlc2l6ZVwiXSkpO3JldHVybiB0fSxyLmdldENhbnZhcz1mdW5jdGlvbigpe3JldHVybiByLl9jYW52YXN9LHIuZ2V0VHJpbW1lZENhbnZhcz1mdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7cmV0dXJuIGUud2lkdGg9ci5fY2FudmFzLndpZHRoLGUuaGVpZ2h0PXIuX2NhbnZhcy5oZWlnaHQsZS5nZXRDb250ZXh0KFwiMmRcIikuZHJhd0ltYWdlKHIuX2NhbnZhcywwLDApLCgwLGcuZGVmYXVsdCkoZSl9LHIuZ2V0U2lnbmF0dXJlUGFkPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX3NpZ1BhZH0sci5fY2hlY2tDbGVhck9uUmVzaXplPWZ1bmN0aW9uKCl7ci5wcm9wcy5jbGVhck9uUmVzaXplJiZyLl9yZXNpemVDYW52YXMoKX0sci5fcmVzaXplQ2FudmFzPWZ1bmN0aW9uKCl7dmFyIGU9ci5wcm9wcy5jYW52YXNQcm9wc3x8e30sdD1lLndpZHRoLG49ZS5oZWlnaHQ7aWYoIXR8fCFuKXt2YXIgYT1yLl9jYW52YXMsbz1NYXRoLm1heCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSwxKTt0fHwoYS53aWR0aD1hLm9mZnNldFdpZHRoKm8pLG58fChhLmhlaWdodD1hLm9mZnNldEhlaWdodCpvKSxhLmdldENvbnRleHQoXCIyZFwiKS5zY2FsZShvLG8pLHIuY2xlYXIoKX19LHIub249ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixyLl9jaGVja0NsZWFyT25SZXNpemUpLHIuX3NpZ1BhZC5vbigpfSxyLm9mZj1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHIuX2NoZWNrQ2xlYXJPblJlc2l6ZSksci5fc2lnUGFkLm9mZigpfSxyLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX3NpZ1BhZC5jbGVhcigpfSxyLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gci5fc2lnUGFkLmlzRW1wdHkoKX0sci5mcm9tRGF0YVVSTD1mdW5jdGlvbihlLHQpe3JldHVybiByLl9zaWdQYWQuZnJvbURhdGFVUkwoZSx0KX0sci50b0RhdGFVUkw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5fc2lnUGFkLnRvRGF0YVVSTChlLHQpfSxyLmZyb21EYXRhPWZ1bmN0aW9uKGUpe3JldHVybiByLl9zaWdQYWQuZnJvbURhdGEoZSl9LHIudG9EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX3NpZ1BhZC50b0RhdGEoKX0sdT1uLGkocix1KX1yZXR1cm4gdSh0LGUpLGModCxbe2tleTpcImNvbXBvbmVudERpZE1vdW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9zaWdQYWQ9bmV3IGguZGVmYXVsdCh0aGlzLl9jYW52YXMsdGhpcy5fZXhjbHVkZU91clByb3BzKCkpLHRoaXMuX3Jlc2l6ZUNhbnZhcygpLHRoaXMub24oKX19LHtrZXk6XCJjb21wb25lbnRXaWxsVW5tb3VudFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vZmYoKX19LHtrZXk6XCJjb21wb25lbnREaWRVcGRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe09iamVjdC5hc3NpZ24odGhpcy5fc2lnUGFkLHRoaXMuX2V4Y2x1ZGVPdXJQcm9wcygpKX19LHtrZXk6XCJyZW5kZXJcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnByb3BzLmNhbnZhc1Byb3BzO3JldHVybiBkLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiLHMoe3JlZjpmdW5jdGlvbih0KXtlLl9jYW52YXM9dH19LHQpKX19XSksdH0obC5Db21wb25lbnQpO20ucHJvcFR5cGVzPXt2ZWxvY2l0eUZpbHRlcldlaWdodDpwLmRlZmF1bHQubnVtYmVyLG1pbldpZHRoOnAuZGVmYXVsdC5udW1iZXIsbWF4V2lkdGg6cC5kZWZhdWx0Lm51bWJlcixtaW5EaXN0YW5jZTpwLmRlZmF1bHQubnVtYmVyLGRvdFNpemU6cC5kZWZhdWx0Lm9uZU9mVHlwZShbcC5kZWZhdWx0Lm51bWJlcixwLmRlZmF1bHQuZnVuY10pLHBlbkNvbG9yOnAuZGVmYXVsdC5zdHJpbmcsdGhyb3R0bGU6cC5kZWZhdWx0Lm51bWJlcixvbkVuZDpwLmRlZmF1bHQuZnVuYyxvbkJlZ2luOnAuZGVmYXVsdC5mdW5jLGNhbnZhc1Byb3BzOnAuZGVmYXVsdC5vYmplY3QsY2xlYXJPblJlc2l6ZTpwLmRlZmF1bHQuYm9vbH0sbS5kZWZhdWx0UHJvcHM9e2NsZWFyT25SZXNpemU6ITB9LHQuZGVmYXVsdD1tfSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSxmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1ufSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1yfV0pfSk7IiwiaW1wb3J0IHsgc3R5bGVIb29rU2luZ2xldG9uIH0gZnJvbSAnLi9ob29rJztcbi8qKlxuICogY3JlYXRlIGEgQ29tcG9uZW50IHRvIGFkZCBzdHlsZXMgb24gZGVtYW5kXG4gKiAtIHN0eWxlcyBhcmUgYWRkZWQgd2hlbiBmaXJzdCBpbnN0YW5jZSBpcyBtb3VudGVkXG4gKiAtIHN0eWxlcyBhcmUgcmVtb3ZlZCB3aGVuIHRoZSBsYXN0IGluc3RhbmNlIGlzIHVubW91bnRlZFxuICogLSBjaGFuZ2luZyBzdHlsZXMgaW4gcnVudGltZSBkb2VzIG5vdGhpbmcgdW5sZXNzIGR5bmFtaWMgaXMgc2V0LiBCdXQgd2l0aCBtdWx0aXBsZSBjb21wb25lbnRzIHRoYXQgY2FuIGxlYWQgdG8gdGhlIHVuZGVmaW5lZCBiZWhhdmlvclxuICovXG5leHBvcnQgdmFyIHN0eWxlU2luZ2xldG9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB1c2VTdHlsZSA9IHN0eWxlSG9va1NpbmdsZXRvbigpO1xuICAgIHZhciBTaGVldCA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgc3R5bGVzID0gX2Euc3R5bGVzLCBkeW5hbWljID0gX2EuZHluYW1pYztcbiAgICAgICAgdXNlU3R5bGUoc3R5bGVzLCBkeW5hbWljKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gU2hlZXQ7XG59O1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgc3R5bGVzaGVldFNpbmdsZXRvbiB9IGZyb20gJy4vc2luZ2xldG9uJztcbi8qKlxuICogY3JlYXRlcyBhIGhvb2sgdG8gY29udHJvbCBzdHlsZSBzaW5nbGV0b25cbiAqIEBzZWUge0BsaW5rIHN0eWxlU2luZ2xldG9ufSBmb3IgYSBzYWZlciBjb21wb25lbnQgdmVyc2lvblxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgdXNlU3R5bGUgPSBzdHlsZUhvb2tTaW5nbGV0b24oKTtcbiAqIC8vL1xuICogdXNlU3R5bGUoJ2JvZHkgeyBvdmVyZmxvdzogaGlkZGVufScpO1xuICovXG5leHBvcnQgdmFyIHN0eWxlSG9va1NpbmdsZXRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2hlZXQgPSBzdHlsZXNoZWV0U2luZ2xldG9uKCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsZXMsIGlzRHluYW1pYykge1xuICAgICAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2hlZXQuYWRkKHN0eWxlcyk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNoZWV0LnJlbW92ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSwgW3N0eWxlcyAmJiBpc0R5bmFtaWNdKTtcbiAgICB9O1xufTtcbiIsImV4cG9ydCB7IHN0eWxlU2luZ2xldG9uIH0gZnJvbSAnLi9jb21wb25lbnQnO1xuZXhwb3J0IHsgc3R5bGVzaGVldFNpbmdsZXRvbiB9IGZyb20gJy4vc2luZ2xldG9uJztcbmV4cG9ydCB7IHN0eWxlSG9va1NpbmdsZXRvbiB9IGZyb20gJy4vaG9vayc7XG4iLCJpbXBvcnQgeyBnZXROb25jZSB9IGZyb20gJ2dldC1ub25jZSc7XG5mdW5jdGlvbiBtYWtlU3R5bGVUYWcoKSB7XG4gICAgaWYgKCFkb2N1bWVudClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgdmFyIHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgdGFnLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgIHZhciBub25jZSA9IGdldE5vbmNlKCk7XG4gICAgaWYgKG5vbmNlKSB7XG4gICAgICAgIHRhZy5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGFnO1xufVxuZnVuY3Rpb24gaW5qZWN0U3R5bGVzKHRhZywgY3NzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0YWcuc3R5bGVTaGVldCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRhZy5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0YWcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5zZXJ0U3R5bGVUYWcodGFnKSB7XG4gICAgdmFyIGhlYWQgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XG4gICAgaGVhZC5hcHBlbmRDaGlsZCh0YWcpO1xufVxuZXhwb3J0IHZhciBzdHlsZXNoZWV0U2luZ2xldG9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgc3R5bGVzaGVldCA9IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkOiBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyID09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoKHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVUYWcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0U3R5bGVzKHN0eWxlc2hlZXQsIHN0eWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U3R5bGVUYWcoc3R5bGVzaGVldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvdW50ZXItLTtcbiAgICAgICAgICAgIGlmICghY291bnRlciAmJiBzdHlsZXNoZWV0KSB7XG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldC5wYXJlbnROb2RlICYmIHN0eWxlc2hlZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZXNoZWV0KTtcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYSkge1xuICByZXR1cm4gaXNBcnJheUltcGwoYSk7XG59XG5cbi8qXG4gKiBUaGUgYCcnICsgdmFsdWVgIHBhdHRlcm4gKHVzZWQgaW4gaW4gcGVyZi1zZW5zaXRpdmUgY29kZSkgdGhyb3dzIGZvciBTeW1ib2xcbiAqIGFuZCBUZW1wb3JhbC4qIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjIwNjQuXG4gKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB3aWxsIHRocm93IGFuIGVhc2llci10by11bmRlcnN0YW5kLFxuICogZWFzaWVyLXRvLWRlYnVnIGV4Y2VwdGlvbiB3aXRoIGEgY2xlYXIgZXJyb3JzIG1lc3NhZ2UgbWVzc2FnZSBleHBsYWluaW5nIHRoZVxuICogcHJvYmxlbS4gKEluc3RlYWQgb2YgYSBjb25mdXNpbmcgZXhjZXB0aW9uIHRocm93biBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uXG4gKiBvZiB0aGUgYHZhbHVlYCBvYmplY3QpLlxuICovXG4vLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAge1xuICAgIC8vIHRvU3RyaW5nVGFnIGlzIG5lZWRlZCBmb3IgbmFtZXNwYWNlZCB0eXBlcyBsaWtlIFRlbXBvcmFsLkluc3RhbnRcbiAgICB2YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZztcbiAgICB2YXIgdHlwZSA9IGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JztcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duO1xudmFyIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG5cbntcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnLCBzZWxmKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3dzIHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNlbGZcbiAgICB9KTsgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JmY3MvcHVsbC8xMDdcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cblxuZnVuY3Rpb24ganN4REVWKHR5cGUsIGNvbmZpZywgbWF5YmVLZXksIHNvdXJjZSwgc2VsZikge1xuICB7XG4gICAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICB2YXIga2V5ID0gbnVsbDtcbiAgICB2YXIgcmVmID0gbnVsbDsgLy8gQ3VycmVudGx5LCBrZXkgY2FuIGJlIHNwcmVhZCBpbiBhcyBhIHByb3AuIFRoaXMgY2F1c2VzIGEgcG90ZW50aWFsXG4gICAgLy8gaXNzdWUgaWYga2V5IGlzIGFsc28gZXhwbGljaXRseSBkZWNsYXJlZCAoaWUuIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+XG4gICAgLy8gb3IgPGRpdiBrZXk9XCJIaVwiIHsuLi5wcm9wc30gLz4gKS4gV2Ugd2FudCB0byBkZXByZWNhdGUga2V5IHNwcmVhZCxcbiAgICAvLyBidXQgYXMgYW4gaW50ZXJtZWRpYXJ5IHN0ZXAsIHdlIHdpbGwgdXNlIGpzeERFViBmb3IgZXZlcnl0aGluZyBleGNlcHRcbiAgICAvLyA8ZGl2IHsuLi5wcm9wc30ga2V5PVwiSGlcIiAvPiwgYmVjYXVzZSB3ZSBhcmVuJ3QgY3VycmVudGx5IGFibGUgdG8gdGVsbCBpZlxuICAgIC8vIGtleSBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIHRvIGJlIHVuZGVmaW5lZCBvciBub3QuXG5cbiAgICBpZiAobWF5YmVLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1heWJlS2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBtYXliZUtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnLCBzZWxmKTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtleSB8fCByZWYpIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAge1xuICAgIGlmIChSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQpIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAge1xuICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB7XG4gICAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICAgIGlmICghaW5mbykge1xuICAgICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG5cbiAgICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfVxufVxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICB7XG4gICAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gICAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAgIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICAgIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50KSB7XG4gICAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICAgIH1cblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KG5vZGUpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcblxuICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLlxuICAgICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gbm9kZS5lbnRyaWVzKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dEtleVNwcmVhZCA9IHt9O1xuZnVuY3Rpb24ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgaXNTdGF0aWNDaGlsZHJlbiwgc291cmNlLCBzZWxmKSB7XG4gIHtcbiAgICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAgIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpO1xuXG4gICAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHlwZVN0cmluZztcblxuICAgICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICAgIGluZm8gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IGV4cG9ydCBhIEpTWCBsaXRlcmFsIGluc3RlYWQgb2YgYSBjb21wb25lbnQ/JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICAgIH1cblxuICAgICAgZXJyb3IoJ1JlYWN0LmpzeDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG5cbiAgICB2YXIgZWxlbWVudCA9IGpzeERFVih0eXBlLCBwcm9wcywga2V5LCBzb3VyY2UsIHNlbGYpOyAvLyBUaGUgcmVzdWx0IGNhbiBiZSBudWxsaXNoIGlmIGEgbW9jayBvciBhIGN1c3RvbSBmdW5jdGlvbiBpcyB1c2VkLlxuICAgIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gICAgLy8gV2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gYmVoYXZpb3IgdG8gZGlmZmVyIGJldHdlZW4gZGV2IGFuZCBwcm9kLlxuICAgIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gICAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgICBpZiAodmFsaWRUeXBlKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcblxuICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGlzU3RhdGljQ2hpbGRyZW4pIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW5baV0sIHR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IoJ1JlYWN0LmpzeDogU3RhdGljIGNoaWxkcmVuIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXkuICcgKyAnWW91IGFyZSBsaWtlbHkgZXhwbGljaXRseSBjYWxsaW5nIFJlYWN0LmpzeHMgb3IgUmVhY3QuanN4REVWLiAnICsgJ1VzZSB0aGUgQmFiZWwgdHJhbnNmb3JtIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGNoaWxkcmVuLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BzLCAna2V5JykpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocHJvcHMpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuICAgICAgICAgIHJldHVybiBrICE9PSAna2V5JztcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBiZWZvcmVFeGFtcGxlID0ga2V5cy5sZW5ndGggPiAwID8gJ3trZXk6IHNvbWVLZXksICcgKyBrZXlzLmpvaW4oJzogLi4uLCAnKSArICc6IC4uLn0nIDogJ3trZXk6IHNvbWVLZXl9JztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEtleVNwcmVhZFtjb21wb25lbnROYW1lICsgYmVmb3JlRXhhbXBsZV0pIHtcbiAgICAgICAgICB2YXIgYWZ0ZXJFeGFtcGxlID0ga2V5cy5sZW5ndGggPiAwID8gJ3snICsga2V5cy5qb2luKCc6IC4uLiwgJykgKyAnOiAuLi59JyA6ICd7fSc7XG5cbiAgICAgICAgICBlcnJvcignQSBwcm9wcyBvYmplY3QgY29udGFpbmluZyBhIFwia2V5XCIgcHJvcCBpcyBiZWluZyBzcHJlYWQgaW50byBKU1g6XFxuJyArICcgIGxldCBwcm9wcyA9ICVzO1xcbicgKyAnICA8JXMgey4uLnByb3BzfSAvPlxcbicgKyAnUmVhY3Qga2V5cyBtdXN0IGJlIHBhc3NlZCBkaXJlY3RseSB0byBKU1ggd2l0aG91dCB1c2luZyBzcHJlYWQ6XFxuJyArICcgIGxldCBwcm9wcyA9ICVzO1xcbicgKyAnICA8JXMga2V5PXtzb21lS2V5fSB7Li4ucHJvcHN9IC8+JywgYmVmb3JlRXhhbXBsZSwgY29tcG9uZW50TmFtZSwgYWZ0ZXJFeGFtcGxlLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICAgIGRpZFdhcm5BYm91dEtleVNwcmVhZFtjb21wb25lbnROYW1lICsgYmVmb3JlRXhhbXBsZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbn0gLy8gVGhlc2UgdHdvIGZ1bmN0aW9ucyBleGlzdCB0byBzdGlsbCBnZXQgY2hpbGQgd2FybmluZ3MgaW4gZGV2XG4vLyBldmVuIHdpdGggdGhlIHByb2QgdHJhbnNmb3JtLiBUaGlzIG1lYW5zIHRoYXQganN4REVWIGlzIHB1cmVseVxuLy8gb3B0LWluIGJlaGF2aW9yIGZvciBiZXR0ZXIgbWVzc2FnZXMgYnV0IHRoYXQgd2Ugd29uJ3Qgc3RvcFxuLy8gZ2l2aW5nIHlvdSB3YXJuaW5ncyBpZiB5b3UgdXNlIHByb2R1Y3Rpb24gYXBpcy5cblxuZnVuY3Rpb24ganN4V2l0aFZhbGlkYXRpb25TdGF0aWModHlwZSwgcHJvcHMsIGtleSkge1xuICB7XG4gICAgcmV0dXJuIGpzeFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBrZXksIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvbkR5bmFtaWModHlwZSwgcHJvcHMsIGtleSkge1xuICB7XG4gICAgcmV0dXJuIGpzeFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBrZXksIGZhbHNlKTtcbiAgfVxufVxuXG52YXIganN4ID0gIGpzeFdpdGhWYWxpZGF0aW9uRHluYW1pYyA7IC8vIHdlIG1heSB3YW50IHRvIHNwZWNpYWwgY2FzZSBqc3hzIGludGVybmFsbHkgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygc3RhdGljIGNoaWxkcmVuLlxuLy8gZm9yIG5vdyB3ZSBjYW4gc2hpcCBpZGVudGljYWwgcHJvZCBmdW5jdGlvbnNcblxudmFyIGpzeHMgPSAganN4V2l0aFZhbGlkYXRpb25TdGF0aWMgO1xuXG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuanN4ID0ganN4O1xuZXhwb3J0cy5qc3hzID0ganN4cztcbiAgfSkoKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0VmVyc2lvbiA9ICcxOC4zLjEnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGRpc3BhdGNoZXIuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgYmF0Y2gncyBjb25maWd1cmF0aW9uIHN1Y2ggYXMgaG93IGxvbmcgYW4gdXBkYXRlXG4gKiBzaG91bGQgc3VzcGVuZCBmb3IgaWYgaXQgbmVlZHMgdG8uXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IHtcbiAgdHJhbnNpdGlvbjogbnVsbFxufTtcblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0ge1xuICBjdXJyZW50OiBudWxsLFxuICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLlxuICBpc0JhdGNoaW5nTGVnYWN5OiBmYWxzZSxcbiAgZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGU6IGZhbHNlXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG93bmVyLlxuICpcbiAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmVcbiAqIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZC5cbiAqL1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0ge307XG52YXIgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IG51bGw7XG5mdW5jdGlvbiBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spIHtcbiAge1xuICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgfVxufVxuXG57XG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lID0gZnVuY3Rpb24gKHN0YWNrKSB7XG4gICAge1xuICAgICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICAgIH1cbiAgfTsgLy8gU3RhY2sgaW1wbGVtZW50YXRpb24gaW5qZWN0ZWQgYnkgdGhlIGN1cnJlbnQgcmVuZGVyZXIuXG5cblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFjayA9ICcnOyAvLyBBZGQgYW4gZXh0cmEgdG9wIGZyYW1lIHdoaWxlIGFuIGVsZW1lbnQgaXMgYmVpbmcgdmFsaWRhdGVkXG5cbiAgICBpZiAoY3VycmVudEV4dHJhU3RhY2tGcmFtZSkge1xuICAgICAgc3RhY2sgKz0gY3VycmVudEV4dHJhU3RhY2tGcmFtZTtcbiAgICB9IC8vIERlbGVnYXRlIHRvIHRoZSBpbmplY3RlZCByZW5kZXJlci1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuXG5cbiAgICB2YXIgaW1wbCA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrO1xuXG4gICAgaWYgKGltcGwpIHtcbiAgICAgIHN0YWNrICs9IGltcGwoKSB8fCAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG52YXIgZW5hYmxlQ2FjaGVFbGVtZW50ID0gZmFsc2U7XG52YXIgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgPSBmYWxzZTsgLy8gTm8ga25vd24gYnVncywgYnV0IG5lZWRzIHBlcmZvcm1hbmNlIHRlc3RpbmdcblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7IC8vIFRyYWNrIHdoaWNoIEZpYmVyKHMpIHNjaGVkdWxlIHJlbmRlciB3b3JrLlxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyXG59O1xuXG57XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlO1xufVxuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICB2YXIgX2NvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnO1xuICAgIHZhciB3YXJuaW5nS2V5ID0gY29tcG9uZW50TmFtZSArIFwiLlwiICsgY2FsbGVyTmFtZTtcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlcnJvcihcIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuIFwiICsgJ1RoaXMgaXMgYSBuby1vcCwgYnV0IGl0IG1pZ2h0IGluZGljYXRlIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uICcgKyAnSW5zdGVhZCwgYXNzaWduIHRvIGB0aGlzLnN0YXRlYCBkaXJlY3RseSBvciBkZWZpbmUgYSBgc3RhdGUgPSB7fTtgICcgKyAnY2xhc3MgcHJvcGVydHkgd2l0aCB0aGUgZGVzaXJlZCBzdGF0ZSBpbiB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gdHJ1ZTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xuXG5cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbkNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnZnVuY3Rpb24nICYmIHBhcnRpYWxTdGF0ZSAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhICcgKyAnZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLicpO1xuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbmFzc2lnbihwdXJlQ29tcG9uZW50UHJvdG90eXBlLCBDb21wb25lbnQucHJvdG90eXBlKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biwgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgY29uZmlnLl9fc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gY29uZmlnLl9fc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjcmVhdGVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gIHZhciBwcm9wcyA9IHt9O1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG5cbiAgICAgIHtcbiAgICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIiArIGVsZW1lbnQgKyBcIi5cIik7XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuXG5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0ga2V5LnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcblxuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgZWxlbWVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IEEgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEtleShlbGVtZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJiBlbGVtZW50ICE9PSBudWxsICYmIGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICB7XG4gICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXNjYXBlKCcnICsgZWxlbWVudC5rZXkpO1xuICB9IC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG5cblxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgc3dpdGNoIChjaGlsZHJlbi4kJHR5cGVvZikge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgIHZhciBfY2hpbGQgPSBjaGlsZHJlbjtcbiAgICB2YXIgbWFwcGVkQ2hpbGQgPSBjYWxsYmFjayhfY2hpbGQpOyAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3M6XG5cbiAgICB2YXIgY2hpbGRLZXkgPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0RWxlbWVudEtleShfY2hpbGQsIDApIDogbmFtZVNvRmFyO1xuXG4gICAgaWYgKGlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgICB2YXIgZXNjYXBlZENoaWxkS2V5ID0gJyc7XG5cbiAgICAgIGlmIChjaGlsZEtleSAhPSBudWxsKSB7XG4gICAgICAgIGVzY2FwZWRDaGlsZEtleSA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShjaGlsZEtleSkgKyAnLyc7XG4gICAgICB9XG5cbiAgICAgIG1hcEludG9BcnJheShtYXBwZWRDaGlsZCwgYXJyYXksIGVzY2FwZWRDaGlsZEtleSwgJycsIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgYGlmYCBzdGF0ZW1lbnQgaGVyZSBwcmV2ZW50cyBhdXRvLWRpc2FibGluZyBvZiB0aGUgc2FmZVxuICAgICAgICAgIC8vIGNvZXJjaW9uIEVTTGludCBydWxlLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGRpc2FibGUgaXQgYmVsb3cuXG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgICAgaWYgKG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1hcHBlZENoaWxkLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAgICBlc2NhcGVkUHJlZml4ICsgKCAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgbWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkgPyAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIGV4aXN0aW5nIGVsZW1lbnQncyBrZXkgY2FuIGJlIGEgbnVtYmVyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoJycgKyBtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgICAgfVxuXG4gICAgICBhcnJheS5wdXNoKG1hcHBlZENoaWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cblxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGl0ZXJhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGl0ZXJhYmxlQ2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgICAgd2FybignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlQ2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaWkgPSAwO1xuXG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKSB7XG4gIC8vIFRPRE86IFNlY29uZCBhcmd1bWVudCB1c2VkIHRvIGJlIGFuIG9wdGlvbmFsIGBjYWxjdWxhdGVDaGFuZ2VkQml0c2BcbiAgLy8gZnVuY3Rpb24uIFdhcm4gdG8gcmVzZXJ2ZSBmb3IgZnV0dXJlIHVzZT9cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsLFxuICAgIC8vIEFkZCB0aGVzZSB0byB1c2Ugc2FtZSBoaWRkZW4gY2xhc3MgaW4gVk0gYXMgU2VydmVyQ29udGV4dFxuICAgIF9kZWZhdWx0VmFsdWU6IG51bGwsXG4gICAgX2dsb2JhbE5hbWU6IG51bGxcbiAgfTtcbiAgY29udGV4dC5Qcm92aWRlciA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfUFJPVklERVJfVFlQRSxcbiAgICBfY29udGV4dDogY29udGV4dFxuICB9O1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IGZhbHNlO1xuXG4gIHtcbiAgICAvLyBBIHNlcGFyYXRlIG9iamVjdCwgYnV0IHByb3hpZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBvYmplY3QgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5XG4gICAgLy8gd2FybiBmb3IgdGhlIGluY29ycmVjdCB1c2FnZSBvZiBDb250ZXh0IGFzIGEgQ29uc3VtZXIuXG4gICAgdmFyIENvbnN1bWVyID0ge1xuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0XG4gICAgfTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbm90IHNldHRpbmcgYSB2YWx1ZSwgd2hpY2ggaXMgaW50ZW50aW9uYWwgaGVyZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ29uc3VtZXIsIHtcbiAgICAgIFByb3ZpZGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Qcm92aWRlcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX1Byb3ZpZGVyKSB7XG4gICAgICAgICAgY29udGV4dC5Qcm92aWRlciA9IF9Qcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IF9jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlMjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlMjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZTIpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfdGhyZWFkQ291bnQ6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3RocmVhZENvdW50O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfdGhyZWFkQ291bnQpIHtcbiAgICAgICAgICBjb250ZXh0Ll90aHJlYWRDb3VudCA9IF90aHJlYWRDb3VudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIENvbnN1bWVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Db25zdW1lcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Db25zdW1lcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlOYW1lOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpc3BsYXlOYW1lO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIpIHtcbiAgICAgICAgICAgIHdhcm4oJ1NldHRpbmcgYGRpc3BsYXlOYW1lYCBvbiBDb250ZXh0LkNvbnN1bWVyIGhhcyBubyBlZmZlY3QuICcgKyBcIllvdSBzaG91bGQgc2V0IGl0IGRpcmVjdGx5IG9uIHRoZSBjb250ZXh0IHdpdGggQ29udGV4dC5kaXNwbGF5TmFtZSA9ICclcycuXCIsIGRpc3BsYXlOYW1lKTtcblxuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pOyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBtaXNzaW5nIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgZGVmaW5lUHJvcGVydHlcblxuICAgIGNvbnRleHQuQ29uc3VtZXIgPSBDb25zdW1lcjtcbiAgfVxuXG4gIHtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBudWxsO1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlcjIgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbnZhciBVbmluaXRpYWxpemVkID0gLTE7XG52YXIgUGVuZGluZyA9IDA7XG52YXIgUmVzb2x2ZWQgPSAxO1xudmFyIFJlamVjdGVkID0gMjtcblxuZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgIHZhciB0aGVuYWJsZSA9IGN0b3IoKTsgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAvLyBUaGlzIG1pZ2h0IHRocm93IGVpdGhlciBiZWNhdXNlIGl0J3MgbWlzc2luZyBvciB0aHJvd3MuIElmIHNvLCB3ZSB0cmVhdCBpdFxuICAgIC8vIGFzIHN0aWxsIHVuaW5pdGlhbGl6ZWQgYW5kIHRyeSBhZ2FpbiBuZXh0IHRpbWUuIFdoaWNoIGlzIHRoZSBzYW1lIGFzIHdoYXRcbiAgICAvLyBoYXBwZW5zIGlmIHRoZSBjdG9yIG9yIGFueSB3cmFwcGVycyBwcm9jZXNzaW5nIHRoZSBjdG9yIHRocm93cy4gVGhpcyBtaWdodFxuICAgIC8vIGVuZCB1cCBmaXhpbmcgaXQgaWYgdGhlIHJlc29sdXRpb24gd2FzIGEgY29uY3VycmVuY3kgYnVnLlxuXG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZXNvbHZlZC5fc3RhdHVzID0gUmVzb2x2ZWQ7XG4gICAgICAgIHJlc29sdmVkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3Q7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZWplY3RlZC5fc3RhdHVzID0gUmVqZWN0ZWQ7XG4gICAgICAgIHJlamVjdGVkLl9yZXN1bHQgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIC8vIEluIGNhc2UsIHdlJ3JlIHN0aWxsIHVuaW5pdGlhbGl6ZWQsIHRoZW4gd2UncmUgd2FpdGluZyBmb3IgdGhlIHRoZW5hYmxlXG4gICAgICAvLyB0byByZXNvbHZlLiBTZXQgaXQgYXMgcGVuZGluZyBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICB2YXIgcGVuZGluZyA9IHBheWxvYWQ7XG4gICAgICBwZW5kaW5nLl9zdGF0dXMgPSBQZW5kaW5nO1xuICAgICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUmVzb2x2ZWQpIHtcbiAgICB2YXIgbW9kdWxlT2JqZWN0ID0gcGF5bG9hZC5fcmVzdWx0O1xuXG4gICAge1xuICAgICAgaWYgKG1vZHVsZU9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXAnICsgJ29ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2NvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXAnICsgXCJvcnQoJy4vTXlDb21wb25lbnQnKSlcXG5cXG5cIiArICdEaWQgeW91IGFjY2lkZW50YWxseSBwdXQgY3VybHkgYnJhY2VzIGFyb3VuZCB0aGUgaW1wb3J0PycsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKCEoJ2RlZmF1bHQnIGluIG1vZHVsZU9iamVjdCkpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVPYmplY3QuZGVmYXVsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBwYXlsb2FkLl9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBwYXlsb2FkID0ge1xuICAgIC8vIFdlIHVzZSB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC5cbiAgICBfc3RhdHVzOiBVbmluaXRpYWxpemVkLFxuICAgIF9yZXN1bHQ6IGN0b3JcbiAgfTtcbiAgdmFyIGxhenlUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9MQVpZX1RZUEUsXG4gICAgX3BheWxvYWQ6IHBheWxvYWQsXG4gICAgX2luaXQ6IGxhenlJbml0aWFsaXplclxuICB9O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICB2YXIgcHJvcFR5cGVzOyAvLyAkRmxvd0ZpeE1lXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsYXp5VHlwZSwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9wcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3RGVmYXVsdFByb3BzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYGRlZmF1bHRQcm9wc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIGRlZmF1bHRQcm9wcyA9IG5ld0RlZmF1bHRQcm9wczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAnZGVmYXVsdFByb3BzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvcFR5cGVzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BUeXBlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJvcFR5cGVzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIHByb3BUeXBlcyA9IG5ld1Byb3BUeXBlczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAncHJvcFR5cGVzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbGF6eVR5cGU7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSZWYocmVuZGVyKSB7XG4gIHtcbiAgICBpZiAocmVuZGVyICE9IG51bGwgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCAnICsgJ2NvbXBvbmVudC4gSW5zdGVhZCBvZiBmb3J3YXJkUmVmKG1lbW8oLi4uKSksIHVzZSAnICsgJ21lbW8oZm9yd2FyZFJlZiguLi4pKS4nKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuJywgcmVuZGVyID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHJlbmRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZW5kZXIubGVuZ3RoICE9PSAwICYmIHJlbmRlci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBhY2NlcHQgZXhhY3RseSB0d28gcGFyYW1ldGVyczogcHJvcHMgYW5kIHJlZi4gJXMnLCByZW5kZXIubGVuZ3RoID09PSAxID8gJ0RpZCB5b3UgZm9yZ2V0IHRvIHVzZSB0aGUgcmVmIHBhcmFtZXRlcj8nIDogJ0FueSBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyICE9IG51bGwpIHtcbiAgICAgIGlmIChyZW5kZXIuZGVmYXVsdFByb3BzICE9IG51bGwgfHwgcmVuZGVyLnByb3BUeXBlcyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgZG8gbm90IHN1cHBvcnQgcHJvcFR5cGVzIG9yIGRlZmF1bHRQcm9wcy4gJyArICdEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIGEgUmVhY3QgY29tcG9uZW50PycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICByZW5kZXI6IHJlbmRlclxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXJlbmRlci5uYW1lICYmICFyZW5kZXIuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0Lm1lbW8oKHByb3BzKSA9PiB7Li4ufSk7XG4gICAgICAgIC8vIFRoaXMga2luZCBvZiBpbm5lciBmdW5jdGlvbiBpcyBub3QgdXNlZCBlbHNld2hlcmUgc28gdGhlIHNpZGUgZWZmZWN0IGlzIG9rYXkuXG5cbiAgICAgICAgaWYgKCF0eXBlLm5hbWUgJiYgIXR5cGUuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICB0eXBlLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7XG5cbiAge1xuICAgIGlmIChkaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvcicgKyAnIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4nICsgJzMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpO1xuICAgIH1cbiAgfSAvLyBXaWxsIHJlc3VsdCBpbiBhIG51bGwgYWNjZXNzIGVycm9yIGlmIGFjY2Vzc2VkIG91dHNpZGUgcmVuZGVyIHBoYXNlLiBXZVxuICAvLyBpbnRlbnRpb25hbGx5IGRvbid0IHRocm93IG91ciBvd24gZXJyb3IgYmVjYXVzZSB0aGlzIGlzIGluIGEgaG90IHBhdGguXG4gIC8vIEFsc28gaGVscHMgZW5zdXJlIHRoaXMgaXMgaW5saW5lZC5cblxuXG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuZnVuY3Rpb24gdXNlQ29udGV4dChDb250ZXh0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZWFsQ29udGV4dCA9IENvbnRleHQuX2NvbnRleHQ7IC8vIERvbid0IGRlZHVwbGljYXRlIGJlY2F1c2UgdGhpcyBsZWdpdGltYXRlbHkgY2F1c2VzIGJ1Z3NcbiAgICAgIC8vIGFuZCBub2JvZHkgc2hvdWxkIGJlIHVzaW5nIHRoaXMgaW4gZXhpc3RpbmcgY29kZS5cblxuICAgICAgaWYgKHJlYWxDb250ZXh0LkNvbnN1bWVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Db25zdW1lcikgaXMgbm90IHN1cHBvcnRlZCwgbWF5IGNhdXNlIGJ1Z3MsIGFuZCB3aWxsIGJlICcgKyAncmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9IGVsc2UgaWYgKHJlYWxDb250ZXh0LlByb3ZpZGVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Qcm92aWRlcikgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ29udGV4dChDb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59XG5mdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xufVxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VNZW1vKGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZU1lbW8oY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gIHtcbiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICB9XG59XG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVRyYW5zaXRpb24oKTtcbn1cbmZ1bmN0aW9uIHVzZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUlkKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUlkKCk7XG59XG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbn1cblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMoZWxlbWVudFByb3BzKSB7XG4gIGlmIChlbGVtZW50UHJvcHMgIT09IG51bGwgJiYgZWxlbWVudFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oZWxlbWVudFByb3BzLl9fc291cmNlKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG5cblxudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICBpZiAoIWluZm8pIHtcbiAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZm87XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IHRydWU7IC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG5cbiAgICAgIHZhciBfbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIF9uYW1lIHx8ICdVbmtub3duJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhdHlwZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGEgZnJhZ21lbnQsIHZhbGlkYXRlIHRoYXQgaXQgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2l0aCBmcmFnbWVudCBwcm9wc1xuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHtcbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKHByb3BzKTtcblxuICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNjb3BlLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSB7fTtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2NvcGUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gZmFsc2U7XG52YXIgZW5xdWV1ZVRhc2tJbXBsID0gbnVsbDtcbmZ1bmN0aW9uIGVucXVldWVUYXNrKHRhc2spIHtcbiAgaWYgKGVucXVldWVUYXNrSW1wbCA9PT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICAvLyByZWFkIHJlcXVpcmUgb2ZmIHRoZSBtb2R1bGUgb2JqZWN0IHRvIGdldCBhcm91bmQgdGhlIGJ1bmRsZXJzLlxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIGRldGVjdCBhIHJlcXVpcmUgYW5kIGJ1bmRsZSBhIE5vZGUgcG9seWZpbGwuXG4gICAgICB2YXIgcmVxdWlyZVN0cmluZyA9ICgncmVxdWlyZScgKyBNYXRoLnJhbmRvbSgpKS5zbGljZSgwLCA3KTtcbiAgICAgIHZhciBub2RlUmVxdWlyZSA9IG1vZHVsZSAmJiBtb2R1bGVbcmVxdWlyZVN0cmluZ107IC8vIGFzc3VtaW5nIHdlJ3JlIGluIG5vZGUsIGxldCdzIHRyeSB0byBnZXQgbm9kZSdzXG4gICAgICAvLyB2ZXJzaW9uIG9mIHNldEltbWVkaWF0ZSwgYnlwYXNzaW5nIGZha2UgdGltZXJzIGlmIGFueS5cblxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gbm9kZVJlcXVpcmUuY2FsbChtb2R1bGUsICd0aW1lcnMnKS5zZXRJbW1lZGlhdGU7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgLy8gd2UncmUgaW4gYSBicm93c2VyXG4gICAgICAvLyB3ZSBjYW4ndCB1c2UgcmVndWxhciB0aW1lcnMgYmVjYXVzZSB0aGV5IG1heSBzdGlsbCBiZSBmYWtlZFxuICAgICAgLy8gc28gd2UgdHJ5IE1lc3NhZ2VDaGFubmVsK3Bvc3RNZXNzYWdlIGluc3RlYWRcbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBlcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ2hhbm5lbCBpbXBsZW1lbnRhdGlvbiwgJyArICdzbyBlbnF1ZXVpbmcgdGFza3MgdmlhIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pIHdpbGwgZmFpbC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzICcgKyAnaWYgeW91IGVuY291bnRlciB0aGlzIHdhcm5pbmcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW5xdWV1ZVRhc2tJbXBsKHRhc2spO1xufVxuXG52YXIgYWN0U2NvcGVEZXB0aCA9IDA7XG52YXIgZGlkV2Fybk5vQXdhaXRBY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGFjdChjYWxsYmFjaykge1xuICB7XG4gICAgLy8gYGFjdGAgY2FsbHMgY2FuIGJlIG5lc3RlZCwgc28gd2UgdHJhY2sgdGhlIGRlcHRoLiBUaGlzIHJlcHJlc2VudHMgdGhlXG4gICAgLy8gbnVtYmVyIG9mIGBhY3RgIHNjb3BlcyBvbiB0aGUgc3RhY2suXG4gICAgdmFyIHByZXZBY3RTY29wZURlcHRoID0gYWN0U2NvcGVEZXB0aDtcbiAgICBhY3RTY29wZURlcHRoKys7XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgb3V0ZXJtb3N0IGBhY3RgIHNjb3BlLiBJbml0aWFsaXplIHRoZSBxdWV1ZS4gVGhlIHJlY29uY2lsZXJcbiAgICAgIC8vIHdpbGwgZGV0ZWN0IHRoZSBxdWV1ZSBhbmQgdXNlIGl0IGluc3RlYWQgb2YgU2NoZWR1bGVyLlxuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgIH1cblxuICAgIHZhciBwcmV2SXNCYXRjaGluZ0xlZ2FjeSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3k7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLiBPbmx5XG4gICAgICAvLyBzZXQgdG8gYHRydWVgIHdoaWxlIHRoZSBnaXZlbiBjYWxsYmFjayBpcyBleGVjdXRlZCwgbm90IGZvciB1cGRhdGVzXG4gICAgICAvLyB0cmlnZ2VyZWQgZHVyaW5nIGFuIGFzeW5jIGV2ZW50LCBiZWNhdXNlIHRoaXMgaXMgaG93IHRoZSBsZWdhY3lcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIGBhY3RgIGJlaGF2ZWQuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7IC8vIFJlcGxpY2F0ZSBiZWhhdmlvciBvZiBvcmlnaW5hbCBgYWN0YCBpbXBsZW1lbnRhdGlvbiBpbiBsZWdhY3kgbW9kZSxcbiAgICAgIC8vIHdoaWNoIGZsdXNoZWQgdXBkYXRlcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgc2NvcGUgZnVuY3Rpb24gZXhpdHMsIGV2ZW5cbiAgICAgIC8vIGlmIGl0J3MgYW4gYXN5bmMgZnVuY3Rpb24uXG5cbiAgICAgIGlmICghcHJldklzQmF0Y2hpbmdMZWdhY3kgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gcHJldklzQmF0Y2hpbmdMZWdhY3k7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0aGVuYWJsZVJlc3VsdCA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIGFuIGFzeW5jIGZ1bmN0aW9uIChpLmUuIHJldHVybmVkIGEgcHJvbWlzZSkuIFdhaXRcbiAgICAgIC8vIGZvciBpdCB0byByZXNvbHZlIGJlZm9yZSBleGl0aW5nIHRoZSBjdXJyZW50IHNjb3BlLlxuXG4gICAgICB2YXIgd2FzQXdhaXRlZCA9IGZhbHNlO1xuICAgICAgdmFyIHRoZW5hYmxlID0ge1xuICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgd2FzQXdhaXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhlbmFibGVSZXN1bHQudGhlbihmdW5jdGlvbiAocmV0dXJuVmFsdWUpIHtcbiAgICAgICAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgICAgICAgLy8gV2UndmUgZXhpdGVkIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBSZWN1cnNpdmVseSBmbHVzaCB0aGVcbiAgICAgICAgICAgICAgLy8gcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLlxuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAge1xuICAgICAgICBpZiAoIWRpZFdhcm5Ob0F3YWl0QWN0ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge30pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF3YXNBd2FpdGVkKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBlcnJvcignWW91IGNhbGxlZCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aXRob3V0IGF3YWl0LiAnICsgJ1RoaXMgY291bGQgbGVhZCB0byB1bmV4cGVjdGVkIHRlc3RpbmcgYmVoYXZpb3VyLCAnICsgJ2ludGVybGVhdmluZyBtdWx0aXBsZSBhY3QgY2FsbHMgYW5kIG1peGluZyB0aGVpciAnICsgJ3Njb3Blcy4gJyArICdZb3Ugc2hvdWxkIC0gYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLik7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWUgPSByZXN1bHQ7IC8vIFRoZSBjYWxsYmFjayBpcyBub3QgYW4gYXN5bmMgZnVuY3Rpb24uIEV4aXQgdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgIC8vIGltbWVkaWF0ZWx5LCB3aXRob3V0IGF3YWl0aW5nLlxuXG4gICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG5cbiAgICAgIGlmIChhY3RTY29wZURlcHRoID09PSAwKSB7XG4gICAgICAgIC8vIEV4aXRpbmcgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIEZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKF9xdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUoX3F1ZXVlKTtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSAvLyBSZXR1cm4gYSB0aGVuYWJsZS4gSWYgdGhlIHVzZXIgYXdhaXRzIGl0LCB3ZSdsbCBmbHVzaCBhZ2FpbiBpblxuICAgICAgICAvLyBjYXNlIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkIGJ5IGEgbWljcm90YXNrLlxuXG5cbiAgICAgICAgdmFyIF90aGVuYWJsZSA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAvLyBDb25maXJtIHdlIGhhdmVuJ3QgcmUtZW50ZXJlZCBhbm90aGVyIGBhY3RgIHNjb3BlLCBpbiBjYXNlXG4gICAgICAgICAgICAvLyB0aGUgdXNlciBkb2VzIHNvbWV0aGluZyB3ZWlyZCBsaWtlIGF3YWl0IHRoZSB0aGVuYWJsZVxuICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMuXG4gICAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbHVzaCB0aGUgcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luY2Ugd2UncmUgaW5zaWRlIGEgbmVzdGVkIGBhY3RgIHNjb3BlLCB0aGUgcmV0dXJuZWQgdGhlbmFibGVcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmVzb2x2ZXMuIFRoZSBvdXRlciBzY29wZSB3aWxsIGZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF90aGVuYWJsZTIgPSB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpIHtcbiAge1xuICAgIGlmIChwcmV2QWN0U2NvcGVEZXB0aCAhPT0gYWN0U2NvcGVEZXB0aCAtIDEpIHtcbiAgICAgIGVycm9yKCdZb3Ugc2VlbSB0byBoYXZlIG92ZXJsYXBwaW5nIGFjdCgpIGNhbGxzLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnQmUgc3VyZSB0byBhd2FpdCBwcmV2aW91cyBhY3QoKSBjYWxscyBiZWZvcmUgbWFraW5nIGEgbmV3IG9uZS4gJyk7XG4gICAgfVxuXG4gICAgYWN0U2NvcGVEZXB0aCA9IHByZXZBY3RTY29wZURlcHRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCkge1xuICB7XG4gICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIHdvcmsgd2FzIHNjaGVkdWxlZC4gRmluaXNoLlxuICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gS2VlcCBmbHVzaGluZyB3b3JrIHVudGlsIHRoZXJlJ3Mgbm9uZSBsZWZ0LlxuICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0ZsdXNoaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQWN0UXVldWUocXVldWUpIHtcbiAge1xuICAgIGlmICghaXNGbHVzaGluZykge1xuICAgICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICAgIHF1ZXVlID0gcXVldWUuc2xpY2UoaSArIDEpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG5leHBvcnRzLlN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBSZWFjdFNoYXJlZEludGVybmFscztcbmV4cG9ydHMuYWN0ID0gYWN0O1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5sYXp5ID0gbGF6eTtcbmV4cG9ydHMubWVtbyA9IG1lbW87XG5leHBvcnRzLnN0YXJ0VHJhbnNpdGlvbiA9IHN0YXJ0VHJhbnNpdGlvbjtcbmV4cG9ydHMudW5zdGFibGVfYWN0ID0gYWN0O1xuZXhwb3J0cy51c2VDYWxsYmFjayA9IHVzZUNhbGxiYWNrO1xuZXhwb3J0cy51c2VDb250ZXh0ID0gdXNlQ29udGV4dDtcbmV4cG9ydHMudXNlRGVidWdWYWx1ZSA9IHVzZURlYnVnVmFsdWU7XG5leHBvcnRzLnVzZURlZmVycmVkVmFsdWUgPSB1c2VEZWZlcnJlZFZhbHVlO1xuZXhwb3J0cy51c2VFZmZlY3QgPSB1c2VFZmZlY3Q7XG5leHBvcnRzLnVzZUlkID0gdXNlSWQ7XG5leHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSB1c2VJbXBlcmF0aXZlSGFuZGxlO1xuZXhwb3J0cy51c2VJbnNlcnRpb25FZmZlY3QgPSB1c2VJbnNlcnRpb25FZmZlY3Q7XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdCA9IHVzZUxheW91dEVmZmVjdDtcbmV4cG9ydHMudXNlTWVtbyA9IHVzZU1lbW87XG5leHBvcnRzLnVzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyO1xuZXhwb3J0cy51c2VSZWYgPSB1c2VSZWY7XG5leHBvcnRzLnVzZVN0YXRlID0gdXNlU3RhdGU7XG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlID0gdXNlU3luY0V4dGVybmFsU3RvcmU7XG5leHBvcnRzLnVzZVRyYW5zaXRpb24gPSB1c2VUcmFuc2l0aW9uO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0ICdmb2N1cy1vdXRsaW5lLW1hbmFnZXInO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZVJlZiwgQ29tcG9uZW50LCBjcmVhdGVSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY24gZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgc2Nyb2xsU21vb3RoIGZyb20gJ3Njcm9sbC1zbW9vdGgnO1xuaW1wb3J0IFNjcm9sbHBhcmVudCBmcm9tICdzY3JvbGxwYXJlbnQnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC5kZWJvdW5jZSc7XG5pbXBvcnQgRm9jdXNMb2NrIGZyb20gJ3JlYWN0LWZvY3VzLWxvY2snO1xuaW1wb3J0IHN0eWxlZCwgeyBjcmVhdGVHbG9iYWxTdHlsZSB9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nO1xuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSB7XG4gIChudWxsID09IGEgfHwgYSA+IHIubGVuZ3RoKSAmJiAoYSA9IHIubGVuZ3RoKTtcbiAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07XG4gIHJldHVybiBuO1xufVxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocikpIHJldHVybiByO1xufVxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChlKSB7XG4gIGlmICh2b2lkIDAgPT09IGUpIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgcmV0dXJuIGU7XG59XG5mdW5jdGlvbiBfY2FsbFN1cGVyKHQsIG8sIGUpIHtcbiAgcmV0dXJuIG8gPSBfZ2V0UHJvdG90eXBlT2YobyksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSA/IFJlZmxlY3QuY29uc3RydWN0KG8sIGUgfHwgW10sIF9nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3RvcikgOiBvLmFwcGx5KHQsIGUpKTtcbn1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhhLCBuKSB7XG4gIGlmICghKGEgaW5zdGFuY2VvZiBuKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHIpIHtcbiAgZm9yICh2YXIgdCA9IDA7IHQgPCByLmxlbmd0aDsgdCsrKSB7XG4gICAgdmFyIG8gPSByW3RdO1xuICAgIG8uZW51bWVyYWJsZSA9IG8uZW51bWVyYWJsZSB8fCAhMSwgby5jb25maWd1cmFibGUgPSAhMCwgXCJ2YWx1ZVwiIGluIG8gJiYgKG8ud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBfdG9Qcm9wZXJ0eUtleShvLmtleSksIG8pO1xuICB9XG59XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoZSwgciwgdCkge1xuICByZXR1cm4gciAmJiBfZGVmaW5lUHJvcGVydGllcyhlLnByb3RvdHlwZSwgciksIHQgJiYgX2RlZmluZVByb3BlcnRpZXMoZSwgdCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlO1xufVxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIociwgZSkge1xuICB2YXIgdCA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07XG4gIGlmICghdCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHIpIHx8ICh0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIpKSB8fCBlICYmIHIgJiYgXCJudW1iZXJcIiA9PSB0eXBlb2Ygci5sZW5ndGgpIHtcbiAgICAgIHQgJiYgKHIgPSB0KTtcbiAgICAgIHZhciBuID0gMCxcbiAgICAgICAgRiA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBuID49IHIubGVuZ3RoID8ge1xuICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgZG9uZTogITEsXG4gICAgICAgICAgICB2YWx1ZTogcltuKytdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZTogZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICB0aHJvdyByO1xuICAgICAgICB9LFxuICAgICAgICBmOiBGXG4gICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG4gIH1cbiAgdmFyIG8sXG4gICAgYSA9ICEwLFxuICAgIHUgPSAhMTtcbiAgcmV0dXJuIHtcbiAgICBzOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0ID0gdC5jYWxsKHIpO1xuICAgIH0sXG4gICAgbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHIgPSB0Lm5leHQoKTtcbiAgICAgIHJldHVybiBhID0gci5kb25lLCByO1xuICAgIH0sXG4gICAgZTogZnVuY3Rpb24gKHIpIHtcbiAgICAgIHUgPSAhMCwgbyA9IHI7XG4gICAgfSxcbiAgICBmOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhIHx8IG51bGwgPT0gdC5yZXR1cm4gfHwgdC5yZXR1cm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICh1KSB0aHJvdyBvO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG4gIHJldHVybiAociA9IF90b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpIHtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7XG4gIH0sIF9nZXRQcm90b3R5cGVPZih0KTtcbn1cbmZ1bmN0aW9uIF9pbmhlcml0cyh0LCBlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogdCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICB9XG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZSAmJiBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICB0cnkge1xuICAgIHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgfSBjYXRjaCAodCkge31cbiAgcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXQ7XG4gIH0pKCk7XG59XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkge1xuICB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdO1xuICBpZiAobnVsbCAhPSB0KSB7XG4gICAgdmFyIGUsXG4gICAgICBuLFxuICAgICAgaSxcbiAgICAgIHUsXG4gICAgICBhID0gW10sXG4gICAgICBmID0gITAsXG4gICAgICBvID0gITE7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHtcbiAgICAgICAgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuO1xuICAgICAgICBmID0gITE7XG4gICAgICB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7XG4gICAgfSBjYXRjaCAocikge1xuICAgICAgbyA9ICEwLCBuID0gcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFmICYmIG51bGwgIT0gdC5yZXR1cm4gJiYgKHUgPSB0LnJldHVybigpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobykgdGhyb3cgbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cbn1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHtcbiAgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7XG4gICAgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pO1xuICB9XG4gIHJldHVybiB0O1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIoZSkge1xuICBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykge1xuICAgIHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTtcbiAgICByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgZSkge1xuICBpZiAoZSAmJiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgZSB8fCBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUpKSByZXR1cm4gZTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KTtcbn1cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShyLCBlKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMocikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGUpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBlKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG59XG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKGUsIHQpIHtcbiAgcmV0dXJuIHQgfHwgKHQgPSBlLnNsaWNlKDApKSwgT2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCB7XG4gICAgcmF3OiB7XG4gICAgICB2YWx1ZTogT2JqZWN0LmZyZWV6ZSh0KVxuICAgIH1cbiAgfSkpO1xufVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHtcbiAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHQgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiBpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHtcbiAgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IHR5cGVvZiBpID8gaSA6IGkgKyBcIlwiO1xufVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGEpIHtcbiAgaWYgKHIpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgcikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHIsIGEpO1xuICAgIHZhciB0ID0ge30udG9TdHJpbmcuY2FsbChyKS5zbGljZSg4LCAtMSk7XG4gICAgcmV0dXJuIFwiT2JqZWN0XCIgPT09IHQgJiYgci5jb25zdHJ1Y3RvciAmJiAodCA9IHIuY29uc3RydWN0b3IubmFtZSksIFwiTWFwXCIgPT09IHQgfHwgXCJTZXRcIiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiBcIkFyZ3VtZW50c1wiID09PSB0IHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHQpID8gX2FycmF5TGlrZVRvQXJyYXkociwgYSkgOiB2b2lkIDA7XG4gIH1cbn1cblxudmFyIF90ZW1wbGF0ZU9iamVjdCQ5O1xudmFyIEdsb2JhbFN0eWxlID0gY3JlYXRlR2xvYmFsU3R5bGUoX3RlbXBsYXRlT2JqZWN0JDkgfHwgKF90ZW1wbGF0ZU9iamVjdCQ5ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIC5mb2N1cy1vdXRsaW5lLWhpZGRlbiA6Zm9jdXMge1xcbiAgICAgIG91dGxpbmU6IG5vbmU7XFxuICB9XFxuXCJdKSkpO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDg7XG52YXIgU3ZnQnV0dG9uID0gc3R5bGVkLmJ1dHRvbihfdGVtcGxhdGVPYmplY3QkOCB8fCAoX3RlbXBsYXRlT2JqZWN0JDggPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgZGlzcGxheTogYmxvY2s7XFxuICBwYWRkaW5nOiAwO1xcbiAgYm9yZGVyOiAwO1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIGZvbnQtc2l6ZTogMDtcXG4gIGN1cnNvcjogXCIsIFwiO1xcblwiXSkpLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmRpc2FibGVkID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJztcbn0pO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDcsIF90ZW1wbGF0ZU9iamVjdDI7XG52YXIgTGFiZWwgPSBzdHlsZWQuc3BhbihfdGVtcGxhdGVPYmplY3QkNyB8fCAoX3RlbXBsYXRlT2JqZWN0JDcgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgZm9udC1zaXplOiAxMnB4O1xcbiAgbGluZS1oZWlnaHQ6IDE7XFxuXCJdKSkpO1xuZnVuY3Rpb24gQXJyb3coX3JlZikge1xuICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgb25DbGljayA9IF9yZWYub25DbGljayxcbiAgICBpbnZlcnRlZCA9IF9yZWYuaW52ZXJ0ZWQsXG4gICAgbGFiZWwgPSBfcmVmLmxhYmVsLFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN2Z0J1dHRvbiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgXCJkYXRhLXRvdXItZWxlbVwiOiBcIlwiLmNvbmNhdChpbnZlcnRlZCA/ICdyaWdodCcgOiAnbGVmdCcsIFwiLWFycm93XCIpLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZFxuICB9LCBsYWJlbCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExhYmVsLCBudWxsLCBsYWJlbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgdmlld0JveDogXCIwIDAgMTguNCAxNC40XCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBpbnZlcnRlZCA/ICdNMTcgNy4ySDFNMTAuOCAxTDE3IDcuMmwtNi4yIDYuMicgOiAnTTEuNCA3LjJoMTZNNy42IDFMMS40IDcuMmw2LjIgNi4yJyxcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBzdHJva2U6IFwiY3VycmVudENvbG9yXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMlwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VNaXRlcmxpbWl0OiBcIjEwXCJcbiAgfSkpKTtcbn1cbkFycm93LnByb3BUeXBlcyA9IHtcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGludmVydGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgbGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2xcbn07XG52YXIgQXJyb3ckMSA9IHN0eWxlZChBcnJvdykoX3RlbXBsYXRlT2JqZWN0MiB8fCAoX3RlbXBsYXRlT2JqZWN0MiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBjb2xvcjogXCIsIFwiO1xcblxcbiAgXCIsIFwiO1xcbiAgXCIsIFwiO1xcblxcbiAgJjpob3ZlciB7XFxuICAgIGNvbG9yOiBcIiwgXCI7XFxuICB9XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuZGlzYWJsZWQgPyAnI2NhY2NjZScgOiAnIzY0NjQ2NCc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmludmVydGVkID8gJ21hcmdpbi1sZWZ0OiAyNHB4OycgOiAnbWFyZ2luLXJpZ2h0OiAyNHB4Oyc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuICFwcm9wcy5sYWJlbCAmJiBcIlxcbiAgICB3aWR0aDogMTZweDtcXG4gICAgaGVpZ2h0OiAxMnB4O1xcbiAgICBmbGV4OiAwIDAgMTZweDtcXG4gIFwiO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5kaXNhYmxlZCA/ICcjY2FjY2NlJyA6ICcjMDAwJztcbn0pO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDY7XG5mdW5jdGlvbiBDbG9zZShfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgIGFyaWFMYWJlbCA9IF9yZWYuYXJpYUxhYmVsO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ZnQnV0dG9uLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBcImFyaWEtbGFiZWxcIjogYXJpYUxhYmVsXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB2aWV3Qm94OiBcIjAgMCA5LjEgOS4xXCIsXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlLFxuICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIGQ6IFwiTTUuOSA0LjVsMi44LTIuOGMuNC0uNC40LTEgMC0xLjQtLjQtLjQtMS0uNC0xLjQgMEw0LjUgMy4xIDEuNy4zQzEuMy0uMS43LS4xLjMuM2MtLjQuNC0uNCAxIDAgMS40bDIuOCAyLjhMLjMgNy40Yy0uNC40LS40IDEgMCAxLjQuMi4yLjQuMy43LjNzLjUtLjEuNy0uM0w0LjUgNmwyLjggMi44Yy4zLjIuNS4zLjguM3MuNS0uMS43LS4zYy40LS40LjQtMSAwLTEuNEw1LjkgNC41elwiXG4gIH0pKSk7XG59XG5DbG9zZS5wcm9wVHlwZXMgPSB7XG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBhcmlhTGFiZWw6IFByb3BUeXBlcy5zdHJpbmdcbn07XG52YXIgU3R5bGVkQ2xvc2UgPSBzdHlsZWQoQ2xvc2UpKF90ZW1wbGF0ZU9iamVjdCQ2IHx8IChfdGVtcGxhdGVPYmplY3QkNiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDIycHg7XFxuICByaWdodDogMjJweDtcXG4gIHdpZHRoOiA5cHg7XFxuICBoZWlnaHQ6IDlweDtcXG4gIGNvbG9yOiAjNWU1ZTVlO1xcbiAgJjpob3ZlciB7XFxuICAgIGNvbG9yOiAjMDAwO1xcbiAgfVxcblwiXSkpKTtcblxuZnVuY3Rpb24gZ2V0Tm9kZVJlY3Qobm9kZSkge1xuICB2YXIgX25vZGUkZ2V0Qm91bmRpbmdDbGllID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICB0b3AgPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUudG9wLFxuICAgIHJpZ2h0ID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLnJpZ2h0LFxuICAgIGJvdHRvbSA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS5ib3R0b20sXG4gICAgbGVmdCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS5sZWZ0LFxuICAgIHdpZHRoID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLndpZHRoLFxuICAgIGhlaWdodCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS5oZWlnaHQ7XG4gIHJldHVybiB7XG4gICAgdG9wOiB0b3AsXG4gICAgcmlnaHQ6IHJpZ2h0LFxuICAgIGJvdHRvbTogYm90dG9tLFxuICAgIGxlZnQ6IGxlZnQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59XG5mdW5jdGlvbiBnZXRIaWdobGlnaHRlZFJlY3Qobm9kZSwgc3RlcCkge1xuICBpZiAoIXN0ZXAuaGlnaGxpZ2h0ZWRTZWxlY3RvcnMpIHtcbiAgICByZXR1cm4gZ2V0Tm9kZVJlY3Qobm9kZSk7XG4gIH1cbiAgdmFyIGF0dHJzID0gZ2V0Tm9kZVJlY3Qobm9kZSk7XG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzdGVwLmhpZ2hsaWdodGVkU2VsZWN0b3JzKSxcbiAgICBfc3RlcDtcbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIHNlbGVjdG9yID0gX3N0ZXAudmFsdWU7XG4gICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnIHx8IGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVjdCA9IGdldE5vZGVSZWN0KGVsZW1lbnQpO1xuICAgICAgaWYgKHJlY3QudG9wIDwgYXR0cnMudG9wKSB7XG4gICAgICAgIGF0dHJzLnRvcCA9IHJlY3QudG9wO1xuICAgICAgfVxuICAgICAgaWYgKHJlY3QucmlnaHQgPiBhdHRycy5yaWdodCkge1xuICAgICAgICBhdHRycy5yaWdodCA9IHJlY3QucmlnaHQ7XG4gICAgICB9XG4gICAgICBpZiAocmVjdC5ib3R0b20gPiBhdHRycy5ib3R0b20pIHtcbiAgICAgICAgYXR0cnMuYm90dG9tID0gcmVjdC5ib3R0b207XG4gICAgICB9XG4gICAgICBpZiAocmVjdC5sZWZ0IDwgYXR0cnMubGVmdCkge1xuICAgICAgICBhdHRycy5sZWZ0ID0gcmVjdC5sZWZ0O1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IuZigpO1xuICB9XG4gIGF0dHJzLndpZHRoID0gYXR0cnMucmlnaHQgLSBhdHRycy5sZWZ0O1xuICBhdHRycy5oZWlnaHQgPSBhdHRycy5ib3R0b20gLSBhdHRycy50b3A7XG4gIHJldHVybiBhdHRycztcbn1cbmZ1bmN0aW9uIGluVmlldyhfcmVmKSB7XG4gIHZhciB0b3AgPSBfcmVmLnRvcCxcbiAgICByaWdodCA9IF9yZWYucmlnaHQsXG4gICAgYm90dG9tID0gX3JlZi5ib3R0b20sXG4gICAgbGVmdCA9IF9yZWYubGVmdCxcbiAgICB3ID0gX3JlZi53LFxuICAgIGggPSBfcmVmLmgsXG4gICAgX3JlZiR0aHJlc2hvbGQgPSBfcmVmLnRocmVzaG9sZCxcbiAgICB0aHJlc2hvbGQgPSBfcmVmJHRocmVzaG9sZCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkdGhyZXNob2xkO1xuICByZXR1cm4gdG9wID49IDAgKyB0aHJlc2hvbGQgJiYgbGVmdCA+PSAwICsgdGhyZXNob2xkICYmIGJvdHRvbSA8PSBoIC0gdGhyZXNob2xkICYmIHJpZ2h0IDw9IHcgLSB0aHJlc2hvbGQ7XG59XG5mdW5jdGlvbiBpc0JvZHkobm9kZSkge1xuICByZXR1cm4gbm9kZSA9PT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpIHx8IG5vZGUgPT09IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKTtcbn1cbnZhciBpc0hvcml6ID0gZnVuY3Rpb24gaXNIb3Jpeihwb3MpIHtcbiAgcmV0dXJuIC8obGVmdHxyaWdodCkvLnRlc3QocG9zKTtcbn07XG52YXIgaXNPdXRzaWRlWCA9IGZ1bmN0aW9uIGlzT3V0c2lkZVgodmFsLCB3aW5kb3dXaWR0aCkge1xuICByZXR1cm4gdmFsID4gd2luZG93V2lkdGg7XG59O1xudmFyIGlzT3V0c2lkZVkgPSBmdW5jdGlvbiBpc091dHNpZGVZKHZhbCwgd2luZG93SGVpZ2h0KSB7XG4gIHJldHVybiB2YWwgPiB3aW5kb3dIZWlnaHQ7XG59O1xudmFyIHNhZmUgPSBmdW5jdGlvbiBzYWZlKHN1bSkge1xuICByZXR1cm4gc3VtIDwgMCA/IDAgOiBzdW07XG59O1xuZnVuY3Rpb24gYmVzdFBvc2l0aW9uT2YocG9zaXRpb25zKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwb3NpdGlvbnMpLm1hcChmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogcCxcbiAgICAgIHZhbHVlOiBwb3NpdGlvbnNbcF1cbiAgICB9O1xuICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIudmFsdWUgLSBhLnZhbHVlO1xuICB9KS5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gcC5wb3NpdGlvbjtcbiAgfSk7XG59XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkNTtcbnZhciBHdWlkZSA9IHN0eWxlZC5kaXYoX3RlbXBsYXRlT2JqZWN0JDUgfHwgKF90ZW1wbGF0ZU9iamVjdCQ1ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIC0tcmVhY3RvdXItYWNjZW50OiBcIiwgXCI7XFxuICBcIiwgXCJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIHotaW5kZXg6IDEwMDAwMDA7XFxuXFxuICB0cmFuc2Zvcm06IFwiLCBcIjtcXG5cIl0pKSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5hY2NlbnRDb2xvcjtcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuZGVmYXVsdFN0eWxlcyA/IFwiXFxuICBtYXgtd2lkdGg6IDMzMXB4O1xcbiAgbWluLXdpZHRoOiAxNTBweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDQwcHg7XFxuICBib3JkZXItcmFkaXVzOiBcIi5jb25jYXQocHJvcHMucm91bmRlZCwgXCJweDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICBwYWRkaW5nOiAyNHB4IDMwcHg7XFxuICBib3gtc2hhZG93OiAwIDAuNWVtIDNlbSByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICBjb2xvcjogaW5oZXJpdDtcXG4gIFwiKSA6ICcnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciB0YXJnZXRUb3AgPSBwcm9wcy50YXJnZXRUb3AsXG4gICAgdGFyZ2V0UmlnaHQgPSBwcm9wcy50YXJnZXRSaWdodCxcbiAgICB0YXJnZXRCb3R0b20gPSBwcm9wcy50YXJnZXRCb3R0b20sXG4gICAgdGFyZ2V0TGVmdCA9IHByb3BzLnRhcmdldExlZnQsXG4gICAgd2luZG93V2lkdGggPSBwcm9wcy53aW5kb3dXaWR0aCxcbiAgICB3aW5kb3dIZWlnaHQgPSBwcm9wcy53aW5kb3dIZWlnaHQsXG4gICAgaGVscGVyV2lkdGggPSBwcm9wcy5oZWxwZXJXaWR0aCxcbiAgICBoZWxwZXJIZWlnaHQgPSBwcm9wcy5oZWxwZXJIZWlnaHQsXG4gICAgaGVscGVyUG9zaXRpb24gPSBwcm9wcy5oZWxwZXJQb3NpdGlvbixcbiAgICBwYWRkaW5nID0gcHJvcHMucGFkZGluZztcbiAgdmFyIGF2YWlsYWJsZSA9IHtcbiAgICBsZWZ0OiB0YXJnZXRMZWZ0LFxuICAgIHJpZ2h0OiB3aW5kb3dXaWR0aCAtIHRhcmdldFJpZ2h0LFxuICAgIHRvcDogdGFyZ2V0VG9wLFxuICAgIGJvdHRvbTogd2luZG93SGVpZ2h0IC0gdGFyZ2V0Qm90dG9tXG4gIH07XG4gIHZhciBjb3VsZFBvc2l0aW9uQXQgPSBmdW5jdGlvbiBjb3VsZFBvc2l0aW9uQXQocG9zaXRpb24pIHtcbiAgICByZXR1cm4gYXZhaWxhYmxlW3Bvc2l0aW9uXSA+IChpc0hvcml6KHBvc2l0aW9uKSA/IGhlbHBlcldpZHRoICsgcGFkZGluZyAqIDIgOiBoZWxwZXJIZWlnaHQgKyBwYWRkaW5nICogMik7XG4gIH07XG4gIHZhciBhdXRvUG9zaXRpb24gPSBmdW5jdGlvbiBhdXRvUG9zaXRpb24oY29vcmRzKSB7XG4gICAgdmFyIHBvc2l0aW9uc09yZGVyID0gYmVzdFBvc2l0aW9uT2YoYXZhaWxhYmxlKTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBvc2l0aW9uc09yZGVyLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoY291bGRQb3NpdGlvbkF0KHBvc2l0aW9uc09yZGVyW2pdKSkge1xuICAgICAgICByZXR1cm4gY29vcmRzW3Bvc2l0aW9uc09yZGVyW2pdXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb3Jkcy5jZW50ZXI7XG4gIH07XG4gIHZhciBwb3MgPSBmdW5jdGlvbiBwb3MoaGVscGVyUG9zaXRpb24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWxwZXJQb3NpdGlvbikpIHtcbiAgICAgIHZhciBpc091dFggPSBpc091dHNpZGVYKGhlbHBlclBvc2l0aW9uWzBdLCB3aW5kb3dXaWR0aCk7XG4gICAgICB2YXIgaXNPdXRZID0gaXNPdXRzaWRlWShoZWxwZXJQb3NpdGlvblsxXSwgd2luZG93SGVpZ2h0KTtcbiAgICAgIHZhciB3YXJuID0gZnVuY3Rpb24gd2FybihheGlzLCBudW0pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiXCIuY29uY2F0KGF4aXMsIFwiOlwiKS5jb25jYXQobnVtLCBcIiBpcyBvdXRzaWRlIHdpbmRvdywgZmFsbGluZyBiYWNrIHRvIGNlbnRlclwiKSk7XG4gICAgICB9O1xuICAgICAgaWYgKGlzT3V0WCkgd2FybigneCcsIGhlbHBlclBvc2l0aW9uWzBdKTtcbiAgICAgIGlmIChpc091dFkpIHdhcm4oJ3knLCBoZWxwZXJQb3NpdGlvblsxXSk7XG4gICAgICByZXR1cm4gW2lzT3V0WCA/IHdpbmRvd1dpZHRoIC8gMiAtIGhlbHBlcldpZHRoIC8gMiA6IGhlbHBlclBvc2l0aW9uWzBdLCBpc091dFkgPyB3aW5kb3dIZWlnaHQgLyAyIC0gaGVscGVySGVpZ2h0IC8gMiA6IGhlbHBlclBvc2l0aW9uWzFdXTtcbiAgICB9XG4gICAgdmFyIGhYID0gaXNPdXRzaWRlWCh0YXJnZXRMZWZ0ICsgaGVscGVyV2lkdGgsIHdpbmRvd1dpZHRoKSA/IGlzT3V0c2lkZVgodGFyZ2V0UmlnaHQgKyBwYWRkaW5nLCB3aW5kb3dXaWR0aCkgPyB0YXJnZXRSaWdodCAtIGhlbHBlcldpZHRoIDogdGFyZ2V0UmlnaHQgLSBoZWxwZXJXaWR0aCArIHBhZGRpbmcgOiB0YXJnZXRMZWZ0IC0gcGFkZGluZztcbiAgICB2YXIgeCA9IGhYID4gcGFkZGluZyA/IGhYIDogcGFkZGluZztcbiAgICB2YXIgaFkgPSBpc091dHNpZGVZKHRhcmdldFRvcCArIGhlbHBlckhlaWdodCwgd2luZG93SGVpZ2h0KSA/IGlzT3V0c2lkZVkodGFyZ2V0Qm90dG9tICsgcGFkZGluZywgd2luZG93SGVpZ2h0KSA/IHRhcmdldEJvdHRvbSAtIGhlbHBlckhlaWdodCA6IHRhcmdldEJvdHRvbSAtIGhlbHBlckhlaWdodCArIHBhZGRpbmcgOiB0YXJnZXRUb3AgLSBwYWRkaW5nO1xuICAgIHZhciB5ID0gaFkgPiBwYWRkaW5nID8gaFkgOiBwYWRkaW5nO1xuICAgIHZhciBjb29yZHMgPSB7XG4gICAgICB0b3A6IFt4LCB0YXJnZXRUb3AgLSBoZWxwZXJIZWlnaHQgLSBwYWRkaW5nICogMl0sXG4gICAgICByaWdodDogW3RhcmdldFJpZ2h0ICsgcGFkZGluZyAqIDIsIHldLFxuICAgICAgYm90dG9tOiBbeCwgdGFyZ2V0Qm90dG9tICsgcGFkZGluZyAqIDJdLFxuICAgICAgbGVmdDogW3RhcmdldExlZnQgLSBoZWxwZXJXaWR0aCAtIHBhZGRpbmcgKiAyLCB5XSxcbiAgICAgIGNlbnRlcjogW3dpbmRvd1dpZHRoIC8gMiAtIGhlbHBlcldpZHRoIC8gMiwgd2luZG93SGVpZ2h0IC8gMiAtIGhlbHBlckhlaWdodCAvIDJdXG4gICAgfTtcbiAgICBpZiAoaGVscGVyUG9zaXRpb24gPT09ICdjZW50ZXInIHx8IGNvdWxkUG9zaXRpb25BdChoZWxwZXJQb3NpdGlvbikpIHtcbiAgICAgIHJldHVybiBjb29yZHNbaGVscGVyUG9zaXRpb25dO1xuICAgIH1cbiAgICByZXR1cm4gYXV0b1Bvc2l0aW9uKGNvb3Jkcyk7XG4gIH07XG4gIHZhciBwID0gcG9zKGhlbHBlclBvc2l0aW9uKTtcbiAgcmV0dXJuIFwidHJhbnNsYXRlKFwiLmNvbmNhdChNYXRoLnJvdW5kKHBbMF0pLCBcInB4LCBcIikuY29uY2F0KE1hdGgucm91bmQocFsxXSksIFwicHgpXCIpO1xufSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkNDtcbnZhciBCYWRnZSA9IHN0eWxlZC5zcGFuKF90ZW1wbGF0ZU9iamVjdCQ0IHx8IChfdGVtcGxhdGVPYmplY3QkNCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcbiAgYmFja2dyb3VuZDogdmFyKC0tcmVhY3RvdXItYWNjZW50KTtcXG4gIGJhY2tncm91bmQ6IFwiLCBcIjtcXG4gIGhlaWdodDogMS44NzVlbTtcXG4gIGxpbmUtaGVpZ2h0OiAyO1xcbiAgcGFkZGluZy1sZWZ0OiAwLjgxMjVlbTtcXG4gIHBhZGRpbmctcmlnaHQ6IDAuODEyNWVtO1xcbiAgZm9udC1zaXplOiAxZW07XFxuICBib3JkZXItcmFkaXVzOiAxLjYyNWVtO1xcbiAgY29sb3I6IHdoaXRlO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgYm94LXNoYWRvdzogMCAwLjI1ZW0gMC41ZW0gcmdiYSgwLCAwLCAwLCAwLjMpO1xcbiAgdG9wOiAtMC44MTI1ZW07XFxuICBsZWZ0OiAtMC44MTI1ZW07XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuYWNjZW50Q29sb3I7XG59KTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQzO1xudmFyIENvbnRyb2xzID0gc3R5bGVkLmRpdihfdGVtcGxhdGVPYmplY3QkMyB8fCAoX3RlbXBsYXRlT2JqZWN0JDMgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgZGlzcGxheTogZmxleDtcXG4gIG1hcmdpbi10b3A6IDI0cHg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuXCJdKSkpO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDI7XG52YXIgTmF2aWdhdGlvbiA9IHN0eWxlZC5uYXYoX3RlbXBsYXRlT2JqZWN0JDIgfHwgKF90ZW1wbGF0ZU9iamVjdCQyID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIGNvdW50ZXItcmVzZXQ6IGRvdDtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBmbGV4LXdyYXA6IHdyYXA7XFxuXCJdKSkpO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDE7XG52YXIgRG90ID0gc3R5bGVkLmJ1dHRvbihfdGVtcGxhdGVPYmplY3QkMSB8fCAoX3RlbXBsYXRlT2JqZWN0JDEgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgY291bnRlci1pbmNyZW1lbnQ6IGRvdDtcXG4gIHdpZHRoOiA4cHg7XFxuICBoZWlnaHQ6IDhweDtcXG4gIGJvcmRlcjogXCIsIFwiO1xcblxcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gIHBhZGRpbmc6IDA7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbjogNHB4O1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzLCB0cmFuc2Zvcm0gMC4zcztcXG4gIGN1cnNvcjogXCIsIFwiO1xcbiAgdHJhbnNmb3JtOiBzY2FsZShcIiwgXCIpO1xcblxcbiAgY29sb3I6IFwiLCBcIjtcXG4gIGJhY2tncm91bmQ6IFwiLCBcIjtcXG5cXG4gIGNvbG9yOiBcIiwgXCI7XFxuICBiYWNrZ3JvdW5kOiBcIiwgXCI7XFxuXFxuICAmOmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGNvdW50ZXIoZG90KTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IGNhbGMoMTAwJSArIDAuMjVlbSk7XFxuICAgIGxlZnQ6IDUwJTtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMWVtKTtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgZGlzcGxheTogXCIsIFwiO1xcbiAgfVxcblxcbiAgJjpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcXG5cXG4gICAgJjpiZWZvcmUge1xcbiAgICAgIG9wYWNpdHk6IDAuNTtcXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtMnB4KTtcXG4gICAgfVxcbiAgfVxcblwiXSkpLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gJzAnIDogJzFweCBzb2xpZCAjY2FjY2NlJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuZGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5jdXJyZW50ID09PSBwcm9wcy5pbmRleCA/IDEuMjUgOiAxO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5jdXJyZW50ID09PSBwcm9wcy5pbmRleCA/ICd2YXIoLS1yZWFjdG91ci1hY2NlbnQpJyA6ICcjY2FjY2NlJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuY3VycmVudCA9PT0gcHJvcHMuaW5kZXggPyAndmFyKC0tcmVhY3RvdXItYWNjZW50KScgOiAnbm9uZSc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gcHJvcHMuYWNjZW50Q29sb3IgOiAnI2NhY2NjZSc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gcHJvcHMuYWNjZW50Q29sb3IgOiAnbm9uZSc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLnNob3dOdW1iZXIgPyAnYmxvY2snIDogJ25vbmUnO1xufSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3Q7XG52YXIgU3ZnTWFza1dyYXBwZXIgPSBzdHlsZWQuZGl2KF90ZW1wbGF0ZU9iamVjdCB8fCAoX3RlbXBsYXRlT2JqZWN0ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIG9wYWNpdHk6IFwiLCBcIjtcXG4gIGNvbG9yOiBcIiwgXCI7XFxuICB3aWR0aDogMTAwJTtcXG4gIGxlZnQ6IDA7XFxuICB0b3A6IDA7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICB6LWluZGV4OiA5OTk5OTtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcblwiXSkpLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuICFwcm9wcy5tYXNrQ2xhc3NOYW1lICYmIDAuNztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gIXByb3BzLm1hc2tDbGFzc05hbWUgJiYgJyMwMDAnO1xufSk7XG5mdW5jdGlvbiBTdmdNYXNrKF9yZWYpIHtcbiAgdmFyIHdpbmRvd1dpZHRoID0gX3JlZi53aW5kb3dXaWR0aCxcbiAgICB3aW5kb3dIZWlnaHQgPSBfcmVmLndpbmRvd0hlaWdodCxcbiAgICB0YXJnZXRXaWR0aCA9IF9yZWYudGFyZ2V0V2lkdGgsXG4gICAgdGFyZ2V0SGVpZ2h0ID0gX3JlZi50YXJnZXRIZWlnaHQsXG4gICAgdGFyZ2V0VG9wID0gX3JlZi50YXJnZXRUb3AsXG4gICAgdGFyZ2V0TGVmdCA9IF9yZWYudGFyZ2V0TGVmdCxcbiAgICBwYWRkaW5nID0gX3JlZi5wYWRkaW5nLFxuICAgIHJvdW5kZWQgPSBfcmVmLnJvdW5kZWQsXG4gICAgcm91bmRlZFN0ZXAgPSBfcmVmLnJvdW5kZWRTdGVwLFxuICAgIGRpc2FibGVJbnRlcmFjdGlvbiA9IF9yZWYuZGlzYWJsZUludGVyYWN0aW9uLFxuICAgIGRpc2FibGVJbnRlcmFjdGlvbkNsYXNzTmFtZSA9IF9yZWYuZGlzYWJsZUludGVyYWN0aW9uQ2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgaGlnaGxpZ2h0ZWRCb3JkZXIgPSBfcmVmLmhpZ2hsaWdodGVkQm9yZGVyO1xuICB2YXIgd2lkdGggPSBzYWZlKHRhcmdldFdpZHRoICsgcGFkZGluZyAqIDIpO1xuICB2YXIgaGVpZ2h0ID0gc2FmZSh0YXJnZXRIZWlnaHQgKyBwYWRkaW5nICogMik7XG4gIHZhciB0b3AgPSBzYWZlKHRhcmdldFRvcCAtIHBhZGRpbmcpO1xuICB2YXIgbGVmdCA9IHNhZmUodGFyZ2V0TGVmdCAtIHBhZGRpbmcpO1xuICB2YXIgcm91bmRlZFJhZGl1cyA9IHJvdW5kZWRTdGVwID8gTWF0aC5taW4od2lkdGggLyAyLCBoZWlnaHQgLyAyKSA6IHJvdW5kZWQ7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdmdNYXNrV3JhcHBlciwge1xuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgbWFza0NsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB3aWR0aDogd2luZG93V2lkdGgsXG4gICAgaGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJtYXNrXCIsIHtcbiAgICBpZDogXCJtYXNrLW1haW5cIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3aWR0aDogd2luZG93V2lkdGgsXG4gICAgaGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IGxlZnQsXG4gICAgeTogdG9wLFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBmaWxsOiBcImJsYWNrXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCAtIDEsXG4gICAgeTogdG9wIC0gMSxcbiAgICB3aWR0aDogcm91bmRlZFJhZGl1cyxcbiAgICBoZWlnaHQ6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IGxlZnQgKyByb3VuZGVkUmFkaXVzLFxuICAgIGN5OiB0b3AgKyByb3VuZGVkUmFkaXVzLFxuICAgIHI6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJibGFja1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IGxlZnQgKyB3aWR0aCAtIHJvdW5kZWRSYWRpdXMgKyAxLFxuICAgIHk6IHRvcCAtIDEsXG4gICAgd2lkdGg6IHJvdW5kZWRSYWRpdXMsXG4gICAgaGVpZ2h0OiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiBsZWZ0ICsgd2lkdGggLSByb3VuZGVkUmFkaXVzLFxuICAgIGN5OiB0b3AgKyByb3VuZGVkUmFkaXVzLFxuICAgIHI6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJibGFja1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IGxlZnQgLSAxLFxuICAgIHk6IHRvcCArIGhlaWdodCAtIHJvdW5kZWRSYWRpdXMgKyAxLFxuICAgIHdpZHRoOiByb3VuZGVkUmFkaXVzLFxuICAgIGhlaWdodDogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogbGVmdCArIHJvdW5kZWRSYWRpdXMsXG4gICAgY3k6IHRvcCArIGhlaWdodCAtIHJvdW5kZWRSYWRpdXMsXG4gICAgcjogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcImJsYWNrXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCArIHdpZHRoIC0gcm91bmRlZFJhZGl1cyArIDEsXG4gICAgeTogdG9wICsgaGVpZ2h0IC0gcm91bmRlZFJhZGl1cyArIDEsXG4gICAgd2lkdGg6IHJvdW5kZWRSYWRpdXMsXG4gICAgaGVpZ2h0OiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiBsZWZ0ICsgd2lkdGggLSByb3VuZGVkUmFkaXVzLFxuICAgIGN5OiB0b3AgKyBoZWlnaHQgLSByb3VuZGVkUmFkaXVzLFxuICAgIHI6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJibGFjayBcIlxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2xpcFBhdGhcIiwge1xuICAgIGlkOiBcImNsaXAtcGF0aFwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHRvcFxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IHRvcCxcbiAgICB3aWR0aDogbGVmdCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiB0YXJnZXRMZWZ0ICsgdGFyZ2V0V2lkdGggKyBwYWRkaW5nLFxuICAgIHk6IHRvcCxcbiAgICB3aWR0aDogc2FmZSh3aW5kb3dXaWR0aCAtIHRhcmdldFdpZHRoIC0gbGVmdCksXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiB0YXJnZXRUb3AgKyB0YXJnZXRIZWlnaHQgKyBwYWRkaW5nLFxuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHNhZmUod2luZG93SGVpZ2h0IC0gdGFyZ2V0SGVpZ2h0IC0gdG9wKVxuICB9KSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3aWR0aDogd2luZG93V2lkdGgsXG4gICAgaGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIixcbiAgICBtYXNrOiBcInVybCgjbWFzay1tYWluKVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3aWR0aDogd2luZG93V2lkdGgsXG4gICAgaGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIixcbiAgICBjbGlwUGF0aDogXCJ1cmwoI2NsaXAtcGF0aClcIixcbiAgICBwb2ludGVyRXZlbnRzOiBcImF1dG9cIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBsZWZ0LFxuICAgIHk6IHRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgcG9pbnRlckV2ZW50czogXCJhdXRvXCIsXG4gICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIGRpc3BsYXk6IGRpc2FibGVJbnRlcmFjdGlvbiA/ICdibG9jaycgOiAnbm9uZScsXG4gICAgY2xhc3NOYW1lOiBkaXNhYmxlSW50ZXJhY3Rpb25DbGFzc05hbWVcbiAgfSksIGhpZ2hsaWdodGVkQm9yZGVyICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogc2FmZShsZWZ0ICsgaGlnaGxpZ2h0ZWRCb3JkZXIud2lkdGggLyAyLjApLFxuICAgIHk6IHNhZmUodG9wICsgaGlnaGxpZ2h0ZWRCb3JkZXIud2lkdGggLyAyLjApLFxuICAgIHdpZHRoOiBzYWZlKHdpZHRoIC0gaGlnaGxpZ2h0ZWRCb3JkZXIud2lkdGgpLFxuICAgIGhlaWdodDogc2FmZShoZWlnaHQgLSBoaWdobGlnaHRlZEJvcmRlci53aWR0aCksXG4gICAgcG9pbnRlckV2ZW50czogXCJhdXRvXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlV2lkdGg6IGhpZ2hsaWdodGVkQm9yZGVyLndpZHRoLFxuICAgIHN0cm9rZTogaGlnaGxpZ2h0ZWRCb3JkZXIuY29sb3IsXG4gICAgcng6IHJvdW5kZWRSYWRpdXMgLSAyXG4gIH0pKSk7XG59XG5TdmdNYXNrLnByb3BUeXBlcyA9IHtcbiAgd2luZG93V2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgd2luZG93SGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHRhcmdldFdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHRhcmdldEhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0YXJnZXRUb3A6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdGFyZ2V0TGVmdDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBwYWRkaW5nOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHJvdW5kZWQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcm91bmRlZFN0ZXA6IFByb3BUeXBlcy5ib29sLFxuICBkaXNhYmxlSW50ZXJhY3Rpb246IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGRpc2FibGVJbnRlcmFjdGlvbkNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBoaWdobGlnaHRlZEJvcmRlcjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBjb2xvcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWRcbiAgfSlcbn07XG5cbnZhciBSZWFjdG91clJlc2l6ZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBzdGVwID0gX3JlZi5zdGVwLFxuICAgIHJlZnJlc2ggPSBfcmVmLnJlZnJlc2g7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgwKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBtdXRhdGlvbnNDb3VudGVyID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRNdXRhdGlvbnNDb3VudGVyID0gX3VzZVN0YXRlMlsxXTtcblxuICAvLyBvbmx5IHVzZSB0byBub3RpZnkgbWFpbiBsb2dpYyBiZWxvd1xuICAvLyB0aGF0IGEgcmVzaXplT2JzZXJ2YWJsZSBoYXMgYmVlbiBhZGRlZCB0byBET00gKG9yIHJlbW92ZWQgZnJvbSBpdClcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0ZXAucmVzaXplT2JzZXJ2YWJsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGluY3JlbWVudE11dGF0aW9uc0NvdW50ZXJJZk9ic2VydmFibGUgPSBmdW5jdGlvbiBpbmNyZW1lbnRNdXRhdGlvbnNDb3VudGVySWZPYnNlcnZhYmxlKG5vZGVzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobm9kZXMpLFxuICAgICAgICBfc3RlcDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgICAgIHZhciBub2RlID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgaWYgKCFub2RlLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAxOyAvLyBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZm91bmQgPSBzdGVwLnJlc2l6ZU9ic2VydmFibGVzLmZpbmQoZnVuY3Rpb24gKG9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm1hdGNoZXMob2JzZXJ2YWJsZSkgfHwgbm9kZS5xdWVyeVNlbGVjdG9yKG9ic2VydmFibGUpICE9IG51bGw7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICBzZXRNdXRhdGlvbnNDb3VudGVyKG11dGF0aW9uc0NvdW50ZXIgKyAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgaWYgKF9sb29wKCkpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnNMaXN0KSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG11dGF0aW9uc0xpc3QpLFxuICAgICAgICBfc3RlcDI7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBtdXRhdGlvbiA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgICBpZiAoMCAhPT0gbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGluY3JlbWVudE11dGF0aW9uc0NvdW50ZXJJZk9ic2VydmFibGUobXV0YXRpb24uYWRkZWROb2Rlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgwICE9PSBtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpbmNyZW1lbnRNdXRhdGlvbnNDb3VudGVySWZPYnNlcnZhYmxlKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IyLmYoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgb2JzZXJ2YWJsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5O1xuICAgIHZhciBjb25maWcgPSB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgfTtcbiAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUob2JzZXJ2YWJsZSwgY29uZmlnKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfSwgW3N0ZXAsIG11dGF0aW9uc0NvdW50ZXJdKTtcblxuICAvLyB0aGUgbWFpbiBsb2dpYyBpcyBoZXJlXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzdGVwLnJlc2l6ZU9ic2VydmFibGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykge1xuICAgICAgcmVmcmVzaCgpO1xuICAgIH0pO1xuICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc3RlcC5yZXNpemVPYnNlcnZhYmxlcyksXG4gICAgICBfc3RlcDM7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBvYnNlcnZhYmxlID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob2JzZXJ2YWJsZSk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yMy5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH0sIFtzdGVwLCBtdXRhdGlvbnNDb3VudGVyXSk7XG4gIHJldHVybiBudWxsO1xufSk7XG5cbnZhciBSZWFjdG91ck11dGF0aW9uT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIHN0ZXAgPSBfcmVmLnN0ZXAsXG4gICAgcmVmcmVzaCA9IF9yZWYucmVmcmVzaDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0ZXAubXV0YXRpb25PYnNlcnZhYmxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcmVmcmVzaEhpZ2hsaWdodGVkUmVnaW9uSWZPYnNlcnZhYmxlID0gZnVuY3Rpb24gcmVmcmVzaEhpZ2hsaWdodGVkUmVnaW9uSWZPYnNlcnZhYmxlKG5vZGVzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobm9kZXMpLFxuICAgICAgICBfc3RlcDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgICAgIHZhciBub2RlID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgaWYgKCFub2RlLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAxOyAvLyBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZm91bmQgPSBzdGVwLm11dGF0aW9uT2JzZXJ2YWJsZXMuZmluZChmdW5jdGlvbiAob2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWF0Y2hlcyhvYnNlcnZhYmxlKSB8fCBub2RlLnF1ZXJ5U2VsZWN0b3Iob2JzZXJ2YWJsZSkgIT0gbnVsbDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIHJlZnJlc2goKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgaWYgKF9sb29wKCkpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnNMaXN0KSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG11dGF0aW9uc0xpc3QpLFxuICAgICAgICBfc3RlcDI7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBtdXRhdGlvbiA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgICBpZiAoMCAhPT0gbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlZnJlc2hIaWdobGlnaHRlZFJlZ2lvbklmT2JzZXJ2YWJsZShtdXRhdGlvbi5hZGRlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDAgIT09IG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlZnJlc2hIaWdobGlnaHRlZFJlZ2lvbklmT2JzZXJ2YWJsZShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIG9ic2VydmFibGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTtcbiAgICB2YXIgY29uZmlnID0ge1xuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZVxuICAgIH07XG4gICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9ic2VydmFibGUsIGNvbmZpZyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH0sIFtzdGVwXSk7XG4gIHJldHVybiBudWxsO1xufSk7XG5cbmZ1bmN0aW9uIFBvcnRhbChfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciByZWYgPSB1c2VSZWYobnVsbCk7XG4gIGlmIChyZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHJlZi5jdXJyZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcmVmLmN1cnJlbnQuc2V0QXR0cmlidXRlKCdpZCcsICdfX19yZWFjdG91cicpO1xuICB9XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyZWYuY3VycmVudCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtyZWZdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHJlZi5jdXJyZW50KTtcbn1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgZGlzYWJsZUZvY3VzTG9jazogUHJvcFR5cGVzLmJvb2wsXG4gIGJhZGdlQ29udGVudDogUHJvcFR5cGVzLmZ1bmMsXG4gIGhpZ2hsaWdodGVkTWFza0NsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ub2RlLCBQcm9wVHlwZXMuZWxlbWVudF0pLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsb3NlQnV0dG9uQXJpYUxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjbG9zZVdpdGhNYXNrOiBQcm9wVHlwZXMuYm9vbCxcbiAgaW5WaWV3VGhyZXNob2xkOiBQcm9wVHlwZXMubnVtYmVyLFxuICBpc09wZW46IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGxhc3RTdGVwTmV4dEJ1dHRvbjogUHJvcFR5cGVzLm5vZGUsXG4gIG1hc2tDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG1hc2tTcGFjZTogUHJvcFR5cGVzLm51bWJlcixcbiAgbmV4dEJ1dHRvbjogUHJvcFR5cGVzLm5vZGUsXG4gIG9uQWZ0ZXJPcGVuOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25CZWZvcmVDbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uUmVxdWVzdENsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgcHJldkJ1dHRvbjogUHJvcFR5cGVzLm5vZGUsXG4gIHNjcm9sbER1cmF0aW9uOiBQcm9wVHlwZXMubnVtYmVyLFxuICBzY3JvbGxPZmZzZXQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIHNob3dCdXR0b25zOiBQcm9wVHlwZXMuYm9vbCxcbiAgc2hvd0Nsb3NlQnV0dG9uOiBQcm9wVHlwZXMuYm9vbCxcbiAgc2hvd05hdmlnYXRpb246IFByb3BUeXBlcy5ib29sLFxuICBzaG93TmF2aWdhdGlvbk51bWJlcjogUHJvcFR5cGVzLmJvb2wsXG4gIHNob3dOdW1iZXI6IFByb3BUeXBlcy5ib29sLFxuICBzdGFydEF0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBnb1RvU3RlcDogUHJvcFR5cGVzLm51bWJlcixcbiAgZ2V0Q3VycmVudFN0ZXA6IFByb3BUeXBlcy5mdW5jLFxuICBuZXh0U3RlcDogUHJvcFR5cGVzLmZ1bmMsXG4gIHByZXZTdGVwOiBQcm9wVHlwZXMuZnVuYyxcbiAgc3RlcHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgc2VsZWN0b3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY29udGVudDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm5vZGUsIFByb3BUeXBlcy5lbGVtZW50LCBQcm9wVHlwZXMuZnVuY10pLmlzUmVxdWlyZWQsXG4gICAgcG9zaXRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLCBQcm9wVHlwZXMub25lT2YoWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnLCAnY2VudGVyJ10pXSksXG4gICAgYWN0aW9uOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBzdGVwSW50ZXJhY3Rpb246IFByb3BUeXBlcy5ib29sLFxuICAgIG5hdkRvdEFyaWFMYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICByb3VuZGVkU3RlcDogUHJvcFR5cGVzLmJvb2xcbiAgfSkpLFxuICB1cGRhdGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHVwZGF0ZURlbGF5OiBQcm9wVHlwZXMubnVtYmVyLFxuICBkaXNhYmxlSW50ZXJhY3Rpb246IFByb3BUeXBlcy5ib29sLFxuICBkaXNhYmxlRG90c05hdmlnYXRpb246IFByb3BUeXBlcy5ib29sLFxuICBkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2YoWydlc2MnLCAncmlnaHQnLCAnbGVmdCddKSksIFByb3BUeXBlcy5ib29sXSksXG4gIHJvdW5kZWQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGFjY2VudENvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBoaWdobGlnaHRlZEJvcmRlcjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBjb2xvcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWRcbiAgfSlcbn07XG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBkaXNhYmxlRm9jdXNMb2NrOiBmYWxzZSxcbiAgc2hvd05hdmlnYXRpb246IHRydWUsXG4gIHNob3dOYXZpZ2F0aW9uTnVtYmVyOiB0cnVlLFxuICBzaG93QnV0dG9uczogdHJ1ZSxcbiAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICBjbG9zZUJ1dHRvbkFyaWFMYWJlbDogJ0Nsb3NlJyxcbiAgc2hvd051bWJlcjogdHJ1ZSxcbiAgc2Nyb2xsRHVyYXRpb246IDEsXG4gIG1hc2tTcGFjZTogMTAsXG4gIHVwZGF0ZURlbGF5OiAxLFxuICBkaXNhYmxlSW50ZXJhY3Rpb246IGZhbHNlLFxuICByb3VuZGVkOiAwLFxuICBhY2NlbnRDb2xvcjogJyMwMDdhZmYnLFxuICBjbG9zZVdpdGhNYXNrOiB0cnVlXG59O1xuXG52YXIgQ04gPSB7XG4gIG1hc2s6IHtcbiAgICBiYXNlOiAncmVhY3RvdXJfX21hc2snLFxuICAgIGlzT3BlbjogJ3JlYWN0b3VyX19tYXNrLS1pcy1vcGVuJyxcbiAgICBkaXNhYmxlSW50ZXJhY3Rpb246ICdyZWFjdG91cl9fbWFzay0tZGlzYWJsZS1pbnRlcmFjdGlvbidcbiAgfSxcbiAgaGVscGVyOiB7XG4gICAgYmFzZTogJ3JlYWN0b3VyX19oZWxwZXInLFxuICAgIGlzT3BlbjogJ3JlYWN0b3VyX19oZWxwZXItLWlzLW9wZW4nXG4gIH0sXG4gIGRvdDoge1xuICAgIGJhc2U6ICdyZWFjdG91cl9fZG90JyxcbiAgICBhY3RpdmU6ICdyZWFjdG91cl9fZG90LS1pcy1hY3RpdmUnXG4gIH1cbn07XG5cbnZhciBUb3VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIFRvdXIoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb3VyKTtcbiAgICBfdGhpcyA9IF9jYWxsU3VwZXIodGhpcywgVG91cik7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcInVubG9ja0ZvY3VzXCIsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmb2N1c1VubG9ja2VkOiB0cnVlXG4gICAgICB9LCBjYWxsYmFjaygpKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwic2hvd1N0ZXBcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5oZWxwZXIgfHwgIV90aGlzLmhlbHBlci5jdXJyZW50KSByZXR1cm47XG4gICAgICB2YXIgc3RlcHMgPSBfdGhpcy5wcm9wcy5zdGVwcztcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IF90aGlzLnN0YXRlLFxuICAgICAgICBjdXJyZW50ID0gX3RoaXMkc3RhdGUuY3VycmVudCxcbiAgICAgICAgZm9jdXNVbmxvY2tlZCA9IF90aGlzJHN0YXRlLmZvY3VzVW5sb2NrZWQ7XG4gICAgICBpZiAoZm9jdXNVbmxvY2tlZCkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZm9jdXNVbmxvY2tlZDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgc3RlcCA9IHN0ZXBzW2N1cnJlbnRdO1xuICAgICAgdmFyIG5vZGUgPSBzdGVwLnNlbGVjdG9yID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzdGVwLnNlbGVjdG9yKSA6IG51bGw7XG4gICAgICB2YXIgc3RlcENhbGxiYWNrID0gZnVuY3Rpb24gc3RlcENhbGxiYWNrKG8pIHtcbiAgICAgICAgaWYgKHN0ZXAuYWN0aW9uICYmIHR5cGVvZiBzdGVwLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIF90aGlzLnVubG9ja0ZvY3VzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwLmFjdGlvbihvKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChzdGVwLm9ic2VydmUpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc3RlcC5vYnNlcnZlKTtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICBpZiAocHJldlN0YXRlLm9ic2VydmVyKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcHJldlN0YXRlLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXI6IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHtcbiAgICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdmFyIGNiID0gZnVuY3Rpb24gY2IoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGVwQ2FsbGJhY2sobXV0YXRpb24uYWRkZWROb2Rlc1swXSk7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5jYWxjdWxhdGVOb2RlKG11dGF0aW9uLmFkZGVkTm9kZXNbMF0sIHN0ZXAsIGNiKTtcbiAgICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JyAmJiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdmFyIF9jYiA9IGZ1bmN0aW9uIF9jYigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBDYWxsYmFjayhub2RlKTtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBfdGhpcy5jYWxjdWxhdGVOb2RlKG5vZGUsIHN0ZXAsIF9jYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5zdGF0ZS5vYnNlcnZlci5vYnNlcnZlKHRhcmdldCwgY29uZmlnKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoX3RoaXMuc3RhdGUub2JzZXJ2ZXIpIHtcbiAgICAgICAgICBfdGhpcy5zdGF0ZS5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgb2JzZXJ2ZXI6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgdmFyIGNiID0gZnVuY3Rpb24gY2IoKSB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXBDYWxsYmFjayhub2RlKTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuY2FsY3VsYXRlTm9kZShub2RlLCBzdGVwLCBjYik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZShzZXROb2RlU3RhdGUobnVsbCwgc3RlcCwgX3RoaXMuaGVscGVyLmN1cnJlbnQpLCBzdGVwQ2FsbGJhY2spO1xuICAgICAgICBzdGVwLnNlbGVjdG9yICYmIGNvbnNvbGUud2FybihcIkRvZXNuJ3QgZmluZCBhIERPTSBub2RlICdcIi5jb25jYXQoc3RlcC5zZWxlY3RvciwgXCInLiBQbGVhc2UgY2hlY2sgdGhlICdzdGVwcycgVG91ciBwcm9wIEFycmF5IGF0IHBvc2l0aW9uIFwiKS5jb25jYXQoY3VycmVudCwgXCIuXCIpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiY2FsY3VsYXRlTm9kZVwiLCBmdW5jdGlvbiAobm9kZSwgc3RlcCwgY2IpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICBzY3JvbGxEdXJhdGlvbiA9IF90aGlzJHByb3BzLnNjcm9sbER1cmF0aW9uLFxuICAgICAgICBpblZpZXdUaHJlc2hvbGQgPSBfdGhpcyRwcm9wcy5pblZpZXdUaHJlc2hvbGQsXG4gICAgICAgIHNjcm9sbE9mZnNldCA9IF90aGlzJHByb3BzLnNjcm9sbE9mZnNldDtcbiAgICAgIHZhciBhdHRycyA9IGdldEhpZ2hsaWdodGVkUmVjdChub2RlLCBzdGVwKTtcbiAgICAgIHZhciB3ID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgICAgIHZhciBoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuICAgICAgaWYgKCFpblZpZXcoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGF0dHJzKSwge30sIHtcbiAgICAgICAgdzogdyxcbiAgICAgICAgaDogaCxcbiAgICAgICAgdGhyZXNob2xkOiBpblZpZXdUaHJlc2hvbGRcbiAgICAgIH0pKSkge1xuICAgICAgICB2YXIgcGFyZW50U2Nyb2xsID0gU2Nyb2xscGFyZW50KG5vZGUpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gc2Nyb2xsT2Zmc2V0ID8gc2Nyb2xsT2Zmc2V0IDogYXR0cnMuaGVpZ2h0ID4gaCA/IC0yNSA6IC0oaCAvIDIpICsgYXR0cnMuaGVpZ2h0IC8gMjtcbiAgICAgICAgc2Nyb2xsU21vb3RoLnRvKG5vZGUsIHtcbiAgICAgICAgICBjb250ZXh0OiBpc0JvZHkocGFyZW50U2Nyb2xsKSA/IHdpbmRvdyA6IHBhcmVudFNjcm9sbCxcbiAgICAgICAgICBkdXJhdGlvbjogc2Nyb2xsRHVyYXRpb24sXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG5kKSB7XG4gICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZShzZXROb2RlU3RhdGUobmQsIHN0ZXAsIF90aGlzLmhlbHBlci5jdXJyZW50KSwgY2IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZShzZXROb2RlU3RhdGUobm9kZSwgc3RlcCwgX3RoaXMuaGVscGVyLmN1cnJlbnQpLCBjYik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcInJlY2FsY3VsYXRlTm9kZVwiLCBmdW5jdGlvbiAoc3RlcCkge1xuICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHN0ZXAuc2VsZWN0b3IpO1xuICAgICAgdmFyIHN0ZXBDYWxsYmFjayA9IGZ1bmN0aW9uIHN0ZXBDYWxsYmFjayhvKSB7XG4gICAgICAgIGlmIChzdGVwLmFjdGlvbiAmJiB0eXBlb2Ygc3RlcC5hY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBfdGhpcy51bmxvY2tGb2N1cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcC5hY3Rpb24obyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBfdGhpcy5jYWxjdWxhdGVOb2RlKG5vZGUsIHN0ZXAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHN0ZXBDYWxsYmFjayhub2RlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJtYXNrQ2xpY2tIYW5kbGVyXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgIGNsb3NlV2l0aE1hc2sgPSBfdGhpcyRwcm9wczIuY2xvc2VXaXRoTWFzayxcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2UgPSBfdGhpcyRwcm9wczIub25SZXF1ZXN0Q2xvc2U7XG4gICAgICBpZiAoY2xvc2VXaXRoTWFzayAmJiAhZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKENOLm1hc2suZGlzYWJsZUludGVyYWN0aW9uKSkge1xuICAgICAgICBvblJlcXVlc3RDbG9zZShlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwibmV4dFN0ZXBcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICBzdGVwcyA9IF90aGlzJHByb3BzMy5zdGVwcyxcbiAgICAgICAgZ2V0Q3VycmVudFN0ZXAgPSBfdGhpcyRwcm9wczMuZ2V0Q3VycmVudFN0ZXA7XG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBuZXh0U3RlcCA9IHByZXZTdGF0ZS5jdXJyZW50IDwgc3RlcHMubGVuZ3RoIC0gMSA/IHByZXZTdGF0ZS5jdXJyZW50ICsgMSA6IHByZXZTdGF0ZS5jdXJyZW50O1xuICAgICAgICBpZiAodHlwZW9mIGdldEN1cnJlbnRTdGVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2V0Q3VycmVudFN0ZXAobmV4dFN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3VycmVudDogbmV4dFN0ZXBcbiAgICAgICAgfTtcbiAgICAgIH0sIF90aGlzLnNob3dTdGVwKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwicHJldlN0ZXBcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGdldEN1cnJlbnRTdGVwID0gX3RoaXMucHJvcHMuZ2V0Q3VycmVudFN0ZXA7XG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBuZXh0U3RlcCA9IHByZXZTdGF0ZS5jdXJyZW50ID4gMCA/IHByZXZTdGF0ZS5jdXJyZW50IC0gMSA6IHByZXZTdGF0ZS5jdXJyZW50O1xuICAgICAgICBpZiAodHlwZW9mIGdldEN1cnJlbnRTdGVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2V0Q3VycmVudFN0ZXAobmV4dFN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3VycmVudDogbmV4dFN0ZXBcbiAgICAgICAgfTtcbiAgICAgIH0sIF90aGlzLnNob3dTdGVwKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiZ290b1N0ZXBcIiwgZnVuY3Rpb24gKG4pIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgc3RlcHMgPSBfdGhpcyRwcm9wczQuc3RlcHMsXG4gICAgICAgIGdldEN1cnJlbnRTdGVwID0gX3RoaXMkcHJvcHM0LmdldEN1cnJlbnRTdGVwO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICB2YXIgbmV4dFN0ZXAgPSBzdGVwc1tuXSA/IG4gOiBwcmV2U3RhdGUuY3VycmVudDtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRDdXJyZW50U3RlcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGdldEN1cnJlbnRTdGVwKG5leHRTdGVwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGN1cnJlbnQ6IG5leHRTdGVwXG4gICAgICAgIH07XG4gICAgICB9LCBfdGhpcy5zaG93U3RlcCk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcImtleURvd25IYW5kbGVyXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uUmVxdWVzdENsb3NlID0gX3RoaXMkcHJvcHM1Lm9uUmVxdWVzdENsb3NlLFxuICAgICAgICBuZXh0U3RlcCA9IF90aGlzJHByb3BzNS5uZXh0U3RlcCxcbiAgICAgICAgcHJldlN0ZXAgPSBfdGhpcyRwcm9wczUucHJldlN0ZXAsXG4gICAgICAgIGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb24gPSBfdGhpcyRwcm9wczUuZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbjtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaXNFc2NEaXNhYmxlZCwgaXNSaWdodERpc2FibGVkLCBpc0xlZnREaXNhYmxlZDtcbiAgICAgIGlmIChkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uKSB7XG4gICAgICAgIGlzRXNjRGlzYWJsZWQgPSBkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uLmluY2x1ZGVzKCdlc2MnKTtcbiAgICAgICAgaXNSaWdodERpc2FibGVkID0gZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbi5pbmNsdWRlcygncmlnaHQnKTtcbiAgICAgICAgaXNMZWZ0RGlzYWJsZWQgPSBkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uLmluY2x1ZGVzKCdsZWZ0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSAyNyAmJiAhaXNFc2NEaXNhYmxlZCkge1xuICAgICAgICAvLyBlc2NcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvblJlcXVlc3RDbG9zZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzkgJiYgIWlzUmlnaHREaXNhYmxlZCkge1xuICAgICAgICAvLyByaWdodFxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHR5cGVvZiBuZXh0U3RlcCA9PT0gJ2Z1bmN0aW9uJyA/IG5leHRTdGVwKCkgOiBfdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgfVxuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzcgJiYgIWlzTGVmdERpc2FibGVkKSB7XG4gICAgICAgIC8vIGxlZnRcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0eXBlb2YgcHJldlN0ZXAgPT09ICdmdW5jdGlvbicgPyBwcmV2U3RlcCgpIDogX3RoaXMucHJldlN0ZXAoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICBjdXJyZW50OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDAsXG4gICAgICB3OiAwLFxuICAgICAgaDogMCxcbiAgICAgIGluRE9NOiBmYWxzZSxcbiAgICAgIG9ic2VydmVyOiBudWxsLFxuICAgICAgZm9jdXNVbmxvY2tlZDogZmFsc2VcbiAgICB9O1xuICAgIF90aGlzLmhlbHBlciA9IC8qI19fUFVSRV9fKi9jcmVhdGVSZWYoKTtcbiAgICBfdGhpcy5oZWxwZXJFbGVtZW50ID0gbnVsbDtcbiAgICBfdGhpcy5kZWJvdW5jZWRTaG93U3RlcCA9IGRlYm91bmNlKF90aGlzLnNob3dTdGVwLCA3MCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9pbmhlcml0cyhUb3VyLCBfQ29tcG9uZW50KTtcbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhUb3VyLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSB0aGlzLnByb3BzLFxuICAgICAgICBpc09wZW4gPSBfdGhpcyRwcm9wczYuaXNPcGVuLFxuICAgICAgICBzdGFydEF0ID0gX3RoaXMkcHJvcHM2LnN0YXJ0QXQ7XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHRoaXMub3BlbihzdGFydEF0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM3ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgaXNPcGVuID0gX3RoaXMkcHJvcHM3LmlzT3BlbixcbiAgICAgICAgdXBkYXRlID0gX3RoaXMkcHJvcHM3LnVwZGF0ZSxcbiAgICAgICAgdXBkYXRlRGVsYXkgPSBfdGhpcyRwcm9wczcudXBkYXRlRGVsYXk7XG4gICAgICBpZiAoIWlzT3BlbiAmJiBuZXh0UHJvcHMuaXNPcGVuKSB7XG4gICAgICAgIHRoaXMub3BlbihuZXh0UHJvcHMuc3RhcnRBdCk7XG4gICAgICB9IGVsc2UgaWYgKGlzT3BlbiAmJiAhbmV4dFByb3BzLmlzT3Blbikge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNPcGVuICYmIHVwZGF0ZSAhPT0gbmV4dFByb3BzLnVwZGF0ZSkge1xuICAgICAgICBpZiAobmV4dFByb3BzLnN0ZXBzW3RoaXMuc3RhdGUuY3VycmVudF0pIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMuc2hvd1N0ZXAsIHVwZGF0ZURlbGF5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uUmVxdWVzdENsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc09wZW4gJiYgbmV4dFByb3BzLmlzT3BlbiAmJiB0aGlzLnN0YXRlLmN1cnJlbnQgIT09IG5leHRQcm9wcy5nb1RvU3RlcCkge1xuICAgICAgICB0aGlzLmdvdG9TdGVwKG5leHRQcm9wcy5nb1RvU3RlcCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdmFyIGlzT3BlbiA9IHRoaXMucHJvcHMuaXNPcGVuO1xuICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGF0ZS5vYnNlcnZlcikge1xuICAgICAgICB0aGlzLnN0YXRlLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib3BlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHN0YXJ0QXQpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIG9uQWZ0ZXJPcGVuID0gdGhpcy5wcm9wcy5vbkFmdGVyT3BlbjtcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgICAgICBjdXJyZW50OiBzdGFydEF0ICE9PSB1bmRlZmluZWQgPyBzdGFydEF0IDogcHJldlN0YXRlLmN1cnJlbnRcbiAgICAgICAgfTtcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0VGltZW91dChfdGhpczIuc2hvd1N0ZXAsIDEpO1xuICAgICAgICBfdGhpczIuaGVscGVyRWxlbWVudCA9IF90aGlzMi5oZWxwZXIuY3VycmVudDtcbiAgICAgICAgaWYgKCFfdGhpczIucHJvcHMuZGlzYWJsZUZvY3VzTG9jaykgX3RoaXMyLmhlbHBlci5jdXJyZW50LmZvY3VzKCk7XG4gICAgICAgIGlmIChvbkFmdGVyT3Blbikge1xuICAgICAgICAgIG9uQWZ0ZXJPcGVuKF90aGlzMi5oZWxwZXJFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5kZWJvdW5jZWRTaG93U3RlcCwgZmFsc2UpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleURvd25IYW5kbGVyLCBmYWxzZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIGlmIChwcmV2U3RhdGUub2JzZXJ2ZXIpIHtcbiAgICAgICAgICBwcmV2U3RhdGUub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgICBvYnNlcnZlcjogbnVsbFxuICAgICAgICB9O1xuICAgICAgfSwgdGhpcy5vbkJlZm9yZUNsb3NlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmRlYm91bmNlZFNob3dTdGVwKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlEb3duSGFuZGxlcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uQmVmb3JlQ2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25CZWZvcmVDbG9zZSgpIHtcbiAgICAgIHZhciBvbkJlZm9yZUNsb3NlID0gdGhpcy5wcm9wcy5vbkJlZm9yZUNsb3NlO1xuICAgICAgaWYgKG9uQmVmb3JlQ2xvc2UpIHtcbiAgICAgICAgb25CZWZvcmVDbG9zZSh0aGlzLmhlbHBlckVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM4ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM4LmNsYXNzTmFtZSxcbiAgICAgICAgc3RlcHMgPSBfdGhpcyRwcm9wczguc3RlcHMsXG4gICAgICAgIG1hc2tDbGFzc05hbWUgPSBfdGhpcyRwcm9wczgubWFza0NsYXNzTmFtZSxcbiAgICAgICAgc2hvd0J1dHRvbnMgPSBfdGhpcyRwcm9wczguc2hvd0J1dHRvbnMsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbiA9IF90aGlzJHByb3BzOC5zaG93Q2xvc2VCdXR0b24sXG4gICAgICAgIGNsb3NlQnV0dG9uQXJpYUxhYmVsID0gX3RoaXMkcHJvcHM4LmNsb3NlQnV0dG9uQXJpYUxhYmVsLFxuICAgICAgICBzaG93TmF2aWdhdGlvbiA9IF90aGlzJHByb3BzOC5zaG93TmF2aWdhdGlvbixcbiAgICAgICAgc2hvd05hdmlnYXRpb25OdW1iZXIgPSBfdGhpcyRwcm9wczguc2hvd05hdmlnYXRpb25OdW1iZXIsXG4gICAgICAgIHNob3dOdW1iZXIgPSBfdGhpcyRwcm9wczguc2hvd051bWJlcixcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2UgPSBfdGhpcyRwcm9wczgub25SZXF1ZXN0Q2xvc2UsXG4gICAgICAgIG1hc2tTcGFjZSA9IF90aGlzJHByb3BzOC5tYXNrU3BhY2UsXG4gICAgICAgIGxhc3RTdGVwTmV4dEJ1dHRvbiA9IF90aGlzJHByb3BzOC5sYXN0U3RlcE5leHRCdXR0b24sXG4gICAgICAgIG5leHRCdXR0b24gPSBfdGhpcyRwcm9wczgubmV4dEJ1dHRvbixcbiAgICAgICAgcHJldkJ1dHRvbiA9IF90aGlzJHByb3BzOC5wcmV2QnV0dG9uLFxuICAgICAgICBiYWRnZUNvbnRlbnQgPSBfdGhpcyRwcm9wczguYmFkZ2VDb250ZW50LFxuICAgICAgICBoaWdobGlnaHRlZE1hc2tDbGFzc05hbWUgPSBfdGhpcyRwcm9wczguaGlnaGxpZ2h0ZWRNYXNrQ2xhc3NOYW1lLFxuICAgICAgICBkaXNhYmxlSW50ZXJhY3Rpb24gPSBfdGhpcyRwcm9wczguZGlzYWJsZUludGVyYWN0aW9uLFxuICAgICAgICBkaXNhYmxlRG90c05hdmlnYXRpb24gPSBfdGhpcyRwcm9wczguZGlzYWJsZURvdHNOYXZpZ2F0aW9uLFxuICAgICAgICBuZXh0U3RlcCA9IF90aGlzJHByb3BzOC5uZXh0U3RlcCxcbiAgICAgICAgcHJldlN0ZXAgPSBfdGhpcyRwcm9wczgucHJldlN0ZXAsXG4gICAgICAgIHJvdW5kZWQgPSBfdGhpcyRwcm9wczgucm91bmRlZCxcbiAgICAgICAgYWNjZW50Q29sb3IgPSBfdGhpcyRwcm9wczguYWNjZW50Q29sb3IsXG4gICAgICAgIEN1c3RvbUhlbHBlciA9IF90aGlzJHByb3BzOC5DdXN0b21IZWxwZXIsXG4gICAgICAgIGRpc2FibGVGb2N1c0xvY2sgPSBfdGhpcyRwcm9wczguZGlzYWJsZUZvY3VzTG9jayxcbiAgICAgICAgaGlnaGxpZ2h0ZWRCb3JkZXIgPSBfdGhpcyRwcm9wczguaGlnaGxpZ2h0ZWRCb3JkZXI7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUyID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgaXNPcGVuID0gX3RoaXMkc3RhdGUyLmlzT3BlbixcbiAgICAgICAgY3VycmVudCA9IF90aGlzJHN0YXRlMi5jdXJyZW50LFxuICAgICAgICBpbkRPTSA9IF90aGlzJHN0YXRlMi5pbkRPTSxcbiAgICAgICAgdGFyZ2V0VG9wID0gX3RoaXMkc3RhdGUyLnRvcCxcbiAgICAgICAgdGFyZ2V0UmlnaHQgPSBfdGhpcyRzdGF0ZTIucmlnaHQsXG4gICAgICAgIHRhcmdldEJvdHRvbSA9IF90aGlzJHN0YXRlMi5ib3R0b20sXG4gICAgICAgIHRhcmdldExlZnQgPSBfdGhpcyRzdGF0ZTIubGVmdCxcbiAgICAgICAgdGFyZ2V0V2lkdGggPSBfdGhpcyRzdGF0ZTIud2lkdGgsXG4gICAgICAgIHRhcmdldEhlaWdodCA9IF90aGlzJHN0YXRlMi5oZWlnaHQsXG4gICAgICAgIHdpbmRvd1dpZHRoID0gX3RoaXMkc3RhdGUyLncsXG4gICAgICAgIHdpbmRvd0hlaWdodCA9IF90aGlzJHN0YXRlMi5oLFxuICAgICAgICBoZWxwZXJXaWR0aCA9IF90aGlzJHN0YXRlMi5oZWxwZXJXaWR0aCxcbiAgICAgICAgaGVscGVySGVpZ2h0ID0gX3RoaXMkc3RhdGUyLmhlbHBlckhlaWdodCxcbiAgICAgICAgaGVscGVyUG9zaXRpb24gPSBfdGhpcyRzdGF0ZTIuaGVscGVyUG9zaXRpb247XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3J0YWwsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdsb2JhbFN0eWxlLCBudWxsKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3RvdXJSZXNpemVPYnNlcnZlciwge1xuICAgICAgICAgIHN0ZXA6IHN0ZXBzW2N1cnJlbnRdLFxuICAgICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLnJlY2FsY3VsYXRlTm9kZShzdGVwc1tjdXJyZW50XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3RvdXJNdXRhdGlvbk9ic2VydmVyLCB7XG4gICAgICAgICAgc3RlcDogc3RlcHNbY3VycmVudF0sXG4gICAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMucmVjYWxjdWxhdGVOb2RlKHN0ZXBzW2N1cnJlbnRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdmdNYXNrLCB7XG4gICAgICAgICAgb25DbGljazogdGhpcy5tYXNrQ2xpY2tIYW5kbGVyLFxuICAgICAgICAgIGZvcndhcmRSZWY6IGZ1bmN0aW9uIGZvcndhcmRSZWYoYykge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5tYXNrID0gYztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdpbmRvd1dpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICAgICAgICB3aW5kb3dIZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICAgICAgICB0YXJnZXRXaWR0aDogdGFyZ2V0V2lkdGgsXG4gICAgICAgICAgdGFyZ2V0SGVpZ2h0OiB0YXJnZXRIZWlnaHQsXG4gICAgICAgICAgdGFyZ2V0VG9wOiB0YXJnZXRUb3AsXG4gICAgICAgICAgdGFyZ2V0TGVmdDogdGFyZ2V0TGVmdCxcbiAgICAgICAgICBwYWRkaW5nOiBtYXNrU3BhY2UsXG4gICAgICAgICAgcm91bmRlZDogcm91bmRlZCxcbiAgICAgICAgICByb3VuZGVkU3RlcDogc3RlcHNbY3VycmVudF0ucm91bmRlZFN0ZXAsXG4gICAgICAgICAgY2xhc3NOYW1lOiBtYXNrQ2xhc3NOYW1lLFxuICAgICAgICAgIGRpc2FibGVJbnRlcmFjdGlvbjogc3RlcHNbY3VycmVudF0uc3RlcEludGVyYWN0aW9uID09PSBmYWxzZSB8fCBkaXNhYmxlSW50ZXJhY3Rpb24gPyAhc3RlcHNbY3VycmVudF0uc3RlcEludGVyYWN0aW9uIDogZGlzYWJsZUludGVyYWN0aW9uLFxuICAgICAgICAgIGRpc2FibGVJbnRlcmFjdGlvbkNsYXNzTmFtZTogXCJcIi5jb25jYXQoQ04ubWFzay5kaXNhYmxlSW50ZXJhY3Rpb24sIFwiIFwiKS5jb25jYXQoaGlnaGxpZ2h0ZWRNYXNrQ2xhc3NOYW1lKSxcbiAgICAgICAgICBoaWdobGlnaHRlZEJvcmRlcjogaGlnaGxpZ2h0ZWRCb3JkZXJcbiAgICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzTG9jaywge1xuICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlRm9jdXNMb2NrLFxuICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2VcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoR3VpZGUsIHtcbiAgICAgICAgICByZWY6IHRoaXMuaGVscGVyLFxuICAgICAgICAgIHRhcmdldEhlaWdodDogdGFyZ2V0SGVpZ2h0LFxuICAgICAgICAgIHRhcmdldFdpZHRoOiB0YXJnZXRXaWR0aCxcbiAgICAgICAgICB0YXJnZXRUb3A6IHRhcmdldFRvcCxcbiAgICAgICAgICB0YXJnZXRSaWdodDogdGFyZ2V0UmlnaHQsXG4gICAgICAgICAgdGFyZ2V0Qm90dG9tOiB0YXJnZXRCb3R0b20sXG4gICAgICAgICAgdGFyZ2V0TGVmdDogdGFyZ2V0TGVmdCxcbiAgICAgICAgICB3aW5kb3dXaWR0aDogd2luZG93V2lkdGgsXG4gICAgICAgICAgd2luZG93SGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgICAgICAgaGVscGVyV2lkdGg6IGhlbHBlcldpZHRoLFxuICAgICAgICAgIGhlbHBlckhlaWdodDogaGVscGVySGVpZ2h0LFxuICAgICAgICAgIGhlbHBlclBvc2l0aW9uOiBoZWxwZXJQb3NpdGlvbixcbiAgICAgICAgICBwYWRkaW5nOiBtYXNrU3BhY2UsXG4gICAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnQsXG4gICAgICAgICAgc3R5bGU6IHN0ZXBzW2N1cnJlbnRdLnN0eWxlID8gc3RlcHNbY3VycmVudF0uc3R5bGUgOiB7fSxcbiAgICAgICAgICByb3VuZGVkOiByb3VuZGVkLFxuICAgICAgICAgIGNsYXNzTmFtZTogY24oQ04uaGVscGVyLmJhc2UsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBDTi5oZWxwZXIuaXNPcGVuLCBpc09wZW4pKSxcbiAgICAgICAgICBhY2NlbnRDb2xvcjogYWNjZW50Q29sb3IsXG4gICAgICAgICAgZGVmYXVsdFN0eWxlczogIUN1c3RvbUhlbHBlcixcbiAgICAgICAgICByb2xlOiBcImRpYWxvZ1wiXG4gICAgICAgIH0sIEN1c3RvbUhlbHBlciA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEN1c3RvbUhlbHBlciwge1xuICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnQsXG4gICAgICAgICAgdG90YWxTdGVwczogc3RlcHMubGVuZ3RoLFxuICAgICAgICAgIGdvdG9TdGVwOiB0aGlzLmdvdG9TdGVwLFxuICAgICAgICAgIGNsb3NlOiBvblJlcXVlc3RDbG9zZSxcbiAgICAgICAgICBjb250ZW50OiBzdGVwc1tjdXJyZW50XSAmJiAodHlwZW9mIHN0ZXBzW2N1cnJlbnRdLmNvbnRlbnQgPT09ICdmdW5jdGlvbicgPyBzdGVwc1tjdXJyZW50XS5jb250ZW50KHtcbiAgICAgICAgICAgIGNsb3NlOiBvblJlcXVlc3RDbG9zZSxcbiAgICAgICAgICAgIGdvVG86IHRoaXMuZ290b1N0ZXAsXG4gICAgICAgICAgICBpbkRPTTogaW5ET00sXG4gICAgICAgICAgICBzdGVwOiBjdXJyZW50ICsgMVxuICAgICAgICAgIH0pIDogc3RlcHNbY3VycmVudF0uY29udGVudClcbiAgICAgICAgfSwgdGhpcy5wcm9wcy5jaGlsZHJlbikgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgdGhpcy5wcm9wcy5jaGlsZHJlbiwgc3RlcHNbY3VycmVudF0gJiYgKHR5cGVvZiBzdGVwc1tjdXJyZW50XS5jb250ZW50ID09PSAnZnVuY3Rpb24nID8gc3RlcHNbY3VycmVudF0uY29udGVudCh7XG4gICAgICAgICAgY2xvc2U6IG9uUmVxdWVzdENsb3NlLFxuICAgICAgICAgIGdvVG86IHRoaXMuZ290b1N0ZXAsXG4gICAgICAgICAgaW5ET006IGluRE9NLFxuICAgICAgICAgIHN0ZXA6IGN1cnJlbnQgKyAxXG4gICAgICAgIH0pIDogc3RlcHNbY3VycmVudF0uY29udGVudCksIHNob3dOdW1iZXIgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFkZ2UsIHtcbiAgICAgICAgICBcImRhdGEtdG91ci1lbGVtXCI6IFwiYmFkZ2VcIixcbiAgICAgICAgICBhY2NlbnRDb2xvcjogYWNjZW50Q29sb3JcbiAgICAgICAgfSwgdHlwZW9mIGJhZGdlQ29udGVudCA9PT0gJ2Z1bmN0aW9uJyA/IGJhZGdlQ29udGVudChjdXJyZW50ICsgMSwgc3RlcHMubGVuZ3RoKSA6IGN1cnJlbnQgKyAxKSwgKHNob3dCdXR0b25zIHx8IHNob3dOYXZpZ2F0aW9uKSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250cm9scywge1xuICAgICAgICAgIFwiZGF0YS10b3VyLWVsZW1cIjogXCJjb250cm9sc1wiXG4gICAgICAgIH0sIHNob3dCdXR0b25zICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFycm93JDEsIHtcbiAgICAgICAgICBvbkNsaWNrOiB0eXBlb2YgcHJldlN0ZXAgPT09ICdmdW5jdGlvbicgPyBwcmV2U3RlcCA6IHRoaXMucHJldlN0ZXAsXG4gICAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnQgPT09IDAsXG4gICAgICAgICAgbGFiZWw6IHByZXZCdXR0b24gPyBwcmV2QnV0dG9uIDogbnVsbFxuICAgICAgICB9KSwgc2hvd05hdmlnYXRpb24gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTmF2aWdhdGlvbiwge1xuICAgICAgICAgIFwiZGF0YS10b3VyLWVsZW1cIjogXCJuYXZpZ2F0aW9uXCJcbiAgICAgICAgfSwgc3RlcHMubWFwKGZ1bmN0aW9uIChzLCBpKSB7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvdCwge1xuICAgICAgICAgICAga2V5OiBcIlwiLmNvbmNhdChzLnNlbGVjdG9yID8gcy5zZWxlY3RvciA6ICd1bmRlZicsIFwiX1wiKS5jb25jYXQoaSksXG4gICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLmdvdG9TdGVwKGkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnQsXG4gICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgIGFjY2VudENvbG9yOiBhY2NlbnRDb2xvcixcbiAgICAgICAgICAgIGRpc2FibGVkOiBjdXJyZW50ID09PSBpIHx8IGRpc2FibGVEb3RzTmF2aWdhdGlvbixcbiAgICAgICAgICAgIHNob3dOdW1iZXI6IHNob3dOYXZpZ2F0aW9uTnVtYmVyLFxuICAgICAgICAgICAgXCJkYXRhLXRvdXItZWxlbVwiOiBcImRvdFwiLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBjbihDTi5kb3QuYmFzZSwgX2RlZmluZVByb3BlcnR5KHt9LCBDTi5kb3QuYWN0aXZlLCBjdXJyZW50ID09PSBpKSksXG4gICAgICAgICAgICBcImFyaWEtbGFiZWxcIjogcy5uYXZEb3RBcmlhTGFiZWxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpLCBzaG93QnV0dG9ucyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBcnJvdyQxLCB7XG4gICAgICAgICAgb25DbGljazogY3VycmVudCA9PT0gc3RlcHMubGVuZ3RoIC0gMSA/IGxhc3RTdGVwTmV4dEJ1dHRvbiA/IG9uUmVxdWVzdENsb3NlIDogZnVuY3Rpb24gKCkge30gOiB0eXBlb2YgbmV4dFN0ZXAgPT09ICdmdW5jdGlvbicgPyBuZXh0U3RlcCA6IHRoaXMubmV4dFN0ZXAsXG4gICAgICAgICAgZGlzYWJsZWQ6ICFsYXN0U3RlcE5leHRCdXR0b24gJiYgY3VycmVudCA9PT0gc3RlcHMubGVuZ3RoIC0gMSxcbiAgICAgICAgICBpbnZlcnRlZDogdHJ1ZSxcbiAgICAgICAgICBsYWJlbDogbGFzdFN0ZXBOZXh0QnV0dG9uICYmIGN1cnJlbnQgPT09IHN0ZXBzLmxlbmd0aCAtIDEgPyBsYXN0U3RlcE5leHRCdXR0b24gOiBuZXh0QnV0dG9uID8gbmV4dEJ1dHRvbiA6IG51bGxcbiAgICAgICAgfSkpLCBzaG93Q2xvc2VCdXR0b24gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3R5bGVkQ2xvc2UsIHtcbiAgICAgICAgICBvbkNsaWNrOiBvblJlcXVlc3RDbG9zZSxcbiAgICAgICAgICBjbGFzc05hbWU6IFwicmVhY3RvdXJfX2Nsb3NlXCIsXG4gICAgICAgICAgYXJpYUxhYmVsOiBjbG9zZUJ1dHRvbkFyaWFMYWJlbFxuICAgICAgICB9KSkpKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1dKTtcbn0oQ29tcG9uZW50KTtcbnZhciBzZXROb2RlU3RhdGUgPSBmdW5jdGlvbiBzZXROb2RlU3RhdGUobm9kZSwgc3RlcCwgaGVscGVyKSB7XG4gIGlmICghaGVscGVyKSByZXR1cm47XG4gIHZhciB3ID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgdmFyIGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gIHZhciBfaHgkZ2V0Tm9kZVJlY3QgPSBnZXROb2RlUmVjdChoZWxwZXIpLFxuICAgIGhlbHBlcldpZHRoID0gX2h4JGdldE5vZGVSZWN0LndpZHRoLFxuICAgIGhlbHBlckhlaWdodCA9IF9oeCRnZXROb2RlUmVjdC5oZWlnaHQ7XG4gIHZhciBhdHRycyA9IHtcbiAgICB0b3A6IGggKyAxMCxcbiAgICByaWdodDogdyAvIDIgKyA5LFxuICAgIGJvdHRvbTogaCAvIDIgKyA5LFxuICAgIGxlZnQ6IHcgLyAyIC0gaGVscGVyV2lkdGggLyAyLFxuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgICB3OiB3LFxuICAgIGg6IGgsXG4gICAgaGVscGVyUG9zaXRpb246ICdjZW50ZXInXG4gIH07XG4gIGlmIChub2RlKSB7XG4gICAgYXR0cnMgPSBnZXRIaWdobGlnaHRlZFJlY3Qobm9kZSwgc3RlcCk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe1xuICAgICAgdzogdyxcbiAgICAgIGg6IGgsXG4gICAgICBoZWxwZXJXaWR0aDogaGVscGVyV2lkdGgsXG4gICAgICBoZWxwZXJIZWlnaHQ6IGhlbHBlckhlaWdodCxcbiAgICAgIGhlbHBlclBvc2l0aW9uOiBzdGVwLnBvc2l0aW9uXG4gICAgfSwgYXR0cnMpLCB7fSwge1xuICAgICAgaW5ET006IG5vZGUgPyB0cnVlIDogZmFsc2VcbiAgICB9KTtcbiAgfTtcbn07XG5Ub3VyLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblRvdXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnQgZGVmYXVsdCBUb3VyO1xuZXhwb3J0IHsgQXJyb3ckMSBhcyBBcnJvdywgQmFkZ2UsIFN0eWxlZENsb3NlIGFzIENsb3NlLCBDb250cm9scywgRG90LCBOYXZpZ2F0aW9uIH07XG4iLCIvKiFcbiAgQ29weXJpZ2h0IChjKSAyMDE4IEplZCBXYXRzb24uXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlXG4gIGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXNcbiovXG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgaGFzT3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cblx0ZnVuY3Rpb24gY2xhc3NOYW1lcygpIHtcblx0XHR2YXIgY2xhc3NlcyA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0XHRpZiAoIWFyZykgY29udGludWU7XG5cblx0XHRcdHZhciBhcmdUeXBlID0gdHlwZW9mIGFyZztcblxuXHRcdFx0aWYgKGFyZ1R5cGUgPT09ICdzdHJpbmcnIHx8IGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChhcmcpO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcblx0XHRcdFx0aWYgKGFyZy5sZW5ndGgpIHtcblx0XHRcdFx0XHR2YXIgaW5uZXIgPSBjbGFzc05hbWVzLmFwcGx5KG51bGwsIGFyZyk7XG5cdFx0XHRcdFx0aWYgKGlubmVyKSB7XG5cdFx0XHRcdFx0XHRjbGFzc2VzLnB1c2goaW5uZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhcmdUeXBlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRpZiAoYXJnLnRvU3RyaW5nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7XG5cdFx0XHRcdFx0Zm9yICh2YXIga2V5IGluIGFyZykge1xuXHRcdFx0XHRcdFx0aWYgKGhhc093bi5jYWxsKGFyZywga2V5KSAmJiBhcmdba2V5XSkge1xuXHRcdFx0XHRcdFx0XHRjbGFzc2VzLnB1c2goa2V5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGFyZy50b1N0cmluZygpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdGNsYXNzTmFtZXMuZGVmYXVsdCA9IGNsYXNzTmFtZXM7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWVzO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyByZWdpc3RlciBhcyAnY2xhc3NuYW1lcycsIGNvbnNpc3RlbnQgd2l0aCBucG0gcGFja2FnZSBuYW1lXG5cdFx0ZGVmaW5lKCdjbGFzc25hbWVzJywgW10sIGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5jbGFzc05hbWVzID0gY2xhc3NOYW1lcztcblx0fVxufSgpKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBnZXRTdGFjaykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcihcbiAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgIGxvY2F0aW9uICsgJyBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArIHR5cGVvZiBlcnJvciArICcuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIHN0YWNrID0gZ2V0U3RhY2sgPyBnZXRTdGFjaygpIDogJyc7XG5cbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnRmFpbGVkICcgKyBsb2NhdGlvbiArICcgdHlwZTogJyArIGVycm9yLm1lc3NhZ2UgKyAoc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogJycpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0cyB3YXJuaW5nIGNhY2hlIHdoZW4gdGVzdGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tQcm9wVHlwZXM7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbnZhciBjaGVja1Byb3BUeXBlcyA9IHJlcXVpcmUoJy4vY2hlY2tQcm9wVHlwZXMnKTtcblxudmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcbn1cblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgLyogZ2xvYmFsIFN5bWJvbCAqL1xuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gICAqXG4gICAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OlxuICAgKlxuICAgKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICAgKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICAgKiAgICAgICAuLi5cbiAgICogICAgIH1cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gICAqIEByZXR1cm4gez9mdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBtZXRob2RzIHRoYXQgYWxsb3cgZGVjbGFyYXRpb24gYW5kIHZhbGlkYXRpb24gb2YgcHJvcHMgdGhhdCBhcmVcbiAgICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50cy4gRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICB2YXIgUHJvcHMgPSByZXF1aXJlKCdSZWFjdFByb3BUeXBlcycpO1xuICAgKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIHByb3AgbmFtZWQgXCJkZXNjcmlwdGlvblwiLlxuICAgKiAgICAgICBkZXNjcmlwdGlvbjogUHJvcHMuc3RyaW5nLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHJlcXVpcmVkIGVudW0gcHJvcCBuYW1lZCBcImNhdGVnb3J5XCIuXG4gICAqICAgICAgIGNhdGVnb3J5OiBQcm9wcy5vbmVPZihbJ05ld3MnLCdQaG90b3MnXSkuaXNSZXF1aXJlZCxcbiAgICpcbiAgICogICAgICAgLy8gQSBwcm9wIG5hbWVkIFwiZGlhbG9nXCIgdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBEaWFsb2cuXG4gICAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihEaWFsb2cpLmlzUmVxdWlyZWRcbiAgICogICAgIH0sXG4gICAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeyAuLi4gfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBBIG1vcmUgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZXNlIG1ldGhvZHMgYXJlIHVzZWQ6XG4gICAqXG4gICAqICAgdHlwZSA6PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0pfGluc3RhbmNlT2YoLi4uKVxuICAgKiAgIGRlY2wgOj0gUmVhY3RQcm9wVHlwZXMue3R5cGV9KC5pc1JlcXVpcmVkKT9cbiAgICpcbiAgICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpc1xuICAgKiBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICB2YXIgTXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgXCJocmVmXCIuXG4gICAqICAgICAgaHJlZjogZnVuY3Rpb24ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAqICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgKiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmXG4gICAqICAgICAgICAgICAgIShwcm9wVmFsdWUgaW5zdGFuY2VvZiBVUkkpKSB7XG4gICAqICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICtcbiAgICogICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAqICAgICAgICAgICk7XG4gICAqICAgICAgICB9XG4gICAqICAgICAgfVxuICAgKiAgICB9LFxuICAgKiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn1cbiAgICogIH0pO1xuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cbiAgdmFyIEFOT05ZTU9VUyA9ICc8PGFub255bW91cz4+JztcblxuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgICBib29sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYm9vbGVhbicpLFxuICAgIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdmdW5jdGlvbicpLFxuICAgIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICAgIG9iamVjdDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ29iamVjdCcpLFxuICAgIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLFxuICAgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcpLFxuXG4gICAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICAgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixcbiAgICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSxcbiAgICBlbGVtZW50VHlwZTogY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpLFxuICAgIGluc3RhbmNlT2Y6IGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIsXG4gICAgbm9kZTogY3JlYXRlTm9kZUNoZWNrZXIoKSxcbiAgICBvYmplY3RPZjogY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixcbiAgICBvbmVPZjogY3JlYXRlRW51bVR5cGVDaGVja2VyLFxuICAgIG9uZU9mVHlwZTogY3JlYXRlVW5pb25UeXBlQ2hlY2tlcixcbiAgICBzaGFwZTogY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcixcbiAgICBleGFjdDogY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcixcbiAgfTtcblxuICAvKipcbiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAgICovXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbiAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgICB9XG4gIH1cbiAgLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbiAgLyoqXG4gICAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAgICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciwgd2UgZG9uJ3QgdXNlIHJlYWxcbiAgICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICAgKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gICAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG4gIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cbiAgUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPSAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgICAgaWYgKHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgICAgICAgICAvLyBOZXcgYmVoYXZpb3Igb25seSBmb3IgdXNlcnMgb2YgYHByb3AtdHlwZXNgIHBhY2thZ2VcbiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgJ1VzZSBgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKClgIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAgICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICAgICAgICApO1xuICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE9sZCBiZWhhdmlvciBmb3IgcGVvcGxlIHVzaW5nIFJlYWN0LlByb3BUeXBlc1xuICAgICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldICYmXG4gICAgICAgICAgICAvLyBBdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZSBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIG5vdCBhY3Rpb25hYmxlIGV4Y2VwdCBmb3IgbGliIGF1dGhvcnNcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50IDwgM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgICAnWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gJyArXG4gICAgICAgICAgICAgICdmdW5jdGlvbiBmb3IgdGhlIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgcHJvcCBvbiBgJyArIGNvbXBvbmVudE5hbWUgICsgJ2AuIFRoaXMgaXMgZGVwcmVjYXRlZCAnICtcbiAgICAgICAgICAgICAgJ2FuZCB3aWxsIHRocm93IGluIHRoZSBzdGFuZGFsb25lIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICAgJ1lvdSBtYXkgYmUgc2VlaW5nIHRoaXMgd2FybmluZyBkdWUgdG8gYSB0aGlyZC1wYXJ0eSBQcm9wVHlwZXMgJyArXG4gICAgICAgICAgICAgICdsaWJyYXJ5LiBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWRvbnQtY2FsbC1wcm9wdHlwZXMgJyArICdmb3IgZGV0YWlscy4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkICcgKyAoJ2luIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGBudWxsYC4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYHVuZGVmaW5lZGAuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gICAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKGV4cGVjdGVkVHlwZSkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICAgIC8vIGBwcm9wVmFsdWVgIGJlaW5nIGluc3RhbmNlIG9mLCBzYXksIGRhdGUvcmVnZXhwLCBwYXNzIHRoZSAnb2JqZWN0J1xuICAgICAgICAvLyBjaGVjaywgYnV0IHdlIGNhbiBvZmZlciBhIG1vcmUgcHJlY2lzZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gJ29mIHR5cGUgYG9iamVjdGAnLlxuICAgICAgICB2YXIgcHJlY2lzZVR5cGUgPSBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByZWNpc2VUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdgJyArIGV4cGVjdGVkVHlwZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQW55VHlwZUNoZWNrZXIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIGFycmF5T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJywgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFSZWFjdElzLmlzVmFsaWRFbGVtZW50VHlwZShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudCB0eXBlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcihleHBlY3RlZENsYXNzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIShwcm9wc1twcm9wTmFtZV0gaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzKSkge1xuICAgICAgICB2YXIgZXhwZWN0ZWRDbGFzc05hbWUgPSBleHBlY3RlZENsYXNzLm5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgICB2YXIgYWN0dWFsQ2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHByb3BzW3Byb3BOYW1lXSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIGFjdHVhbENsYXNzTmFtZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnaW5zdGFuY2Ugb2YgYCcgKyBleHBlY3RlZENsYXNzTmFtZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRW51bVR5cGVDaGVja2VyKGV4cGVjdGVkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWVzKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnRzIHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheSwgZ290ICcgKyBhcmd1bWVudHMubGVuZ3RoICsgJyBhcmd1bWVudHMuICcgK1xuICAgICAgICAgICAgJ0EgY29tbW9uIG1pc3Rha2UgaXMgdG8gd3JpdGUgb25lT2YoeCwgeSwgeikgaW5zdGVhZCBvZiBvbmVPZihbeCwgeSwgel0pLidcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXkuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGlzKHByb3BWYWx1ZSwgZXhwZWN0ZWRWYWx1ZXNbaV0pKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkVmFsdWVzLCBmdW5jdGlvbiByZXBsYWNlcihrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBTdHJpbmcocHJvcFZhbHVlKSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBvbmUgb2YgJyArIHZhbHVlc1N0cmluZyArICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BWYWx1ZSkge1xuICAgICAgICBpZiAoaGFzKHByb3BWYWx1ZSwga2V5KSkge1xuICAgICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlVW5pb25UeXBlQ2hlY2tlcihhcnJheU9mVHlwZUNoZWNrZXJzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5T2ZUeXBlQ2hlY2tlcnMpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZSwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLiBFeHBlY3RlZCBhbiBhcnJheSBvZiBjaGVjayBmdW5jdGlvbnMsIGJ1dCAnICtcbiAgICAgICAgICAncmVjZWl2ZWQgJyArIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyhjaGVja2VyKSArICcgYXQgaW5kZXggJyArIGkgKyAnLidcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgICBpZiAoY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghaXNOb2RlKHByb3BzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc2hhcGVUeXBlcykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKCFjaGVja2VyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBhbGwga2V5cyBpbiBjYXNlIHNvbWUgYXJlIHJlcXVpcmVkIGJ1dCBtaXNzaW5nIGZyb21cbiAgICAgIC8vIHByb3BzLlxuICAgICAgdmFyIGFsbEtleXMgPSBhc3NpZ24oe30sIHByb3BzW3Byb3BOYW1lXSwgc2hhcGVUeXBlcyk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWxsS2V5cykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKCFjaGVja2VyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgICAgICAgJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGtleSBgJyArIGtleSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLicgK1xuICAgICAgICAgICAgJ1xcbkJhZCBvYmplY3Q6ICcgKyBKU09OLnN0cmluZ2lmeShwcm9wc1twcm9wTmFtZV0sIG51bGwsICcgICcpICtcbiAgICAgICAgICAgICdcXG5WYWxpZCBrZXlzOiAnICsgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHNoYXBlVHlwZXMpLCBudWxsLCAnICAnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8IGlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuICAgICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpIHtcbiAgICAvLyBOYXRpdmUgU3ltYm9sLlxuICAgIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGZhbHN5IHZhbHVlIGNhbid0IGJlIGEgU3ltYm9sXG4gICAgaWYgKCFwcm9wVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICAgIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBub24tc3BlYyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC5cbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC5cbiAgZnVuY3Rpb24gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKSB7XG4gICAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gT2xkIHdlYmtpdHMgKGF0IGxlYXN0IHVudGlsIEFuZHJvaWQgNC4wKSByZXR1cm4gJ2Z1bmN0aW9uJyByYXRoZXIgdGhhblxuICAgICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgICAvLyBwYXNzZXMgUHJvcFR5cGVzLm9iamVjdC5cbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG4gIGZ1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyB8fCBwcm9wVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJyArIHByb3BWYWx1ZTtcbiAgICB9XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgfSBlbHNlIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcG9zdGZpeGVkIHRvIGEgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIHR5cGUuXG4gIC8vIEZvciBleGFtcGxlLCBcInVuZGVmaW5lZFwiIG9yIFwib2YgdHlwZSBhcnJheVwiXG4gIGZ1bmN0aW9uIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcmV0dXJuICdhbiAnICsgdHlwZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdyZWdleHAnOlxuICAgICAgICByZXR1cm4gJ2EgJyArIHR5cGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCwgaWYgYW55LlxuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gICAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICByZXR1cm4gQU5PTllNT1VTO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGNoZWNrUHJvcFR5cGVzO1xuICBSZWFjdFByb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlO1xuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogUmVnZXhQYXJzZXJcbiAqIFBhcnNlcyBhIHN0cmluZyBpbnB1dC5cbiAqXG4gKiBAbmFtZSBSZWdleFBhcnNlclxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBpbnB1dCB0aGF0IHNob3VsZCBiZSBwYXJzZWQgYXMgcmVndWxhclxuICogZXhwcmVzc2lvbi5cbiAqIEByZXR1cm4ge1JlZ0V4cH0gVGhlIHBhcnNlZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gKi9cbnZhciBSZWdleFBhcnNlciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgLy8gVmFsaWRhdGUgaW5wdXRcbiAgICBpZiAodHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQuIElucHV0IG11c3QgYmUgYSBzdHJpbmdcIik7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgaW5wdXRcbiAgICB2YXIgbSA9IGlucHV0Lm1hdGNoKC8oXFwvPykoLispXFwxKFthLXpdKikvaSk7XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIG1hdGNoLCB0aHJvdyBhbiBlcnJvclxuICAgIGlmICghbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3JtYXQuXCIpO1xuICAgIH1cblxuICAgIC8vIEZpbHRlciB2YWxpZCBmbGFnczogJ2cnLCAnaScsICdtJywgJ3MnLCAndScsIGFuZCAneSdcbiAgICB2YXIgdmFsaWRGbGFncyA9IEFycmF5LmZyb20obmV3IFNldChtWzNdKSkuZmlsdGVyKGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHJldHVybiBcImdpbXN1eVwiLmluY2x1ZGVzKGZsYWcpO1xuICAgIH0pLmpvaW4oXCJcIik7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgIHJldHVybiBuZXcgUmVnRXhwKG1bMl0sIHZhbGlkRmxhZ3MpO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfc2Nyb2xsU21vb3RoID0gcmVxdWlyZSgnLi9zY3JvbGxTbW9vdGgnKTtcblxudmFyIF9zY3JvbGxTbW9vdGgyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2Nyb2xsU21vb3RoKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICBfcmVmJHF1ZXJ5ID0gX3JlZi5xdWVyeSxcbiAgICAgIHF1ZXJ5ID0gX3JlZiRxdWVyeSA9PT0gdW5kZWZpbmVkID8gJ1tocmVmXj1cIiNcIl06bm90KFtocmVmPVwiI1wiXScgOiBfcmVmJHF1ZXJ5LFxuICAgICAgX3JlZiRtYXRjaCA9IF9yZWYubWF0Y2gsXG4gICAgICBtYXRjaCA9IF9yZWYkbWF0Y2ggPT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0Lmhhc2guc3Vic3RyaW5nKDEpKTtcbiAgfSA6IF9yZWYkbWF0Y2gsXG4gICAgICBfcmVmJGhhc2hDaGFuZ2UgPSBfcmVmLmhhc2hDaGFuZ2UsXG4gICAgICBoYXNoQ2hhbmdlID0gX3JlZiRoYXNoQ2hhbmdlID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZiRoYXNoQ2hhbmdlLFxuICAgICAgc2Nyb2xsU21vb3RoQ29uZmlnID0gX3JlZi5zY3JvbGxTbW9vdGhDb25maWc7XG5cbiAgdmFyIGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxdWVyeSk7XG4gIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcihlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBkZXN0ID0gbWF0Y2goZS50YXJnZXQpO1xuXG4gICAgaWYgKCFkZXN0KSByZXR1cm47XG5cbiAgICBpZiAoaGFzaENoYW5nZSkge1xuICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgbnVsbCwgJyMnICsgZGVzdC5pZCk7XG4gICAgfVxuXG4gICAgKDAsIF9zY3JvbGxTbW9vdGgyLmRlZmF1bHQpKGRlc3QsIF9leHRlbmRzKHt9LCBzY3JvbGxTbW9vdGhDb25maWcpKTtcbiAgfTtcblxuICBBcnJheS5mcm9tKGxpbmtzKS5tYXAoZnVuY3Rpb24gKGxpbmspIHtcbiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgZmFsc2UpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zY3JvbGxTbW9vdGggPSByZXF1aXJlKCcuL3Njcm9sbFNtb290aCcpO1xuXG52YXIgX3Njcm9sbFNtb290aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zY3JvbGxTbW9vdGgpO1xuXG52YXIgX3Rvb2xzID0gcmVxdWlyZSgnLi90b29scycpO1xuXG52YXIgX2FuY2hvclNjcm9sbCA9IHJlcXVpcmUoJy4vYW5jaG9yU2Nyb2xsJyk7XG5cbnZhciBfYW5jaG9yU2Nyb2xsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FuY2hvclNjcm9sbCk7XG5cbnZhciBfb2JzZXJ2ZSA9IHJlcXVpcmUoJy4vb2JzZXJ2ZScpO1xuXG52YXIgX29ic2VydmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JzZXJ2ZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgdG86IF9zY3JvbGxTbW9vdGgyLmRlZmF1bHQsXG4gIGNhbGNFbmRQb2ludDogX3Rvb2xzLmNhbGNFbmRQb2ludCxcbiAgYW5jaG9yU2Nyb2xsOiBfYW5jaG9yU2Nyb2xsMi5kZWZhdWx0LFxuICBvYnNlcnZlOiBfb2JzZXJ2ZTIuZGVmYXVsdFxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgX3JlZiRhY3RpdmVDbGFzcyA9IF9yZWYuYWN0aXZlQ2xhc3MsXG4gICAgICBhY3RpdmVDbGFzcyA9IF9yZWYkYWN0aXZlQ2xhc3MgPT09IHVuZGVmaW5lZCA/ICdhY3RpdmUnIDogX3JlZiRhY3RpdmVDbGFzcyxcbiAgICAgIF9yZWYkcXVlcnkgPSBfcmVmLnF1ZXJ5LFxuICAgICAgcXVlcnkgPSBfcmVmJHF1ZXJ5ID09PSB1bmRlZmluZWQgPyAnW2hyZWZePVwiI1wiXTpub3QoW2hyZWY9XCIjXCJdKTpub3QoW2hyZWY9XCIjMFwiXSknIDogX3JlZiRxdWVyeSxcbiAgICAgIF9yZWYkdGhyZXNob2xkID0gX3JlZi50aHJlc2hvbGQsXG4gICAgICB0aHJlc2hvbGQgPSBfcmVmJHRocmVzaG9sZCA9PT0gdW5kZWZpbmVkID8gWzAuMjUsIDAuNSwgMC43NV0gOiBfcmVmJHRocmVzaG9sZCxcbiAgICAgIF9yZWYkZGV0ZWN0VHlwZSA9IF9yZWYuZGV0ZWN0VHlwZSxcbiAgICAgIGRldGVjdFR5cGUgPSBfcmVmJGRldGVjdFR5cGUgPT09IHVuZGVmaW5lZCA/ICdtYXgnIDogX3JlZiRkZXRlY3RUeXBlO1xuXG4gIHZhciBvcHRpb25zID0geyB0aHJlc2hvbGQ6IHRocmVzaG9sZCB9O1xuXG4gIHZhciByZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcbiAgfTtcbiAgdmFyIGFkZENsYXNzID0gZnVuY3Rpb24gYWRkQ2xhc3Mobm9kZSkge1xuICAgIHJldHVybiBub2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuICB9O1xuXG4gIHZhciB1bnNldEFsbEFjdGl2ZXMgPSBmdW5jdGlvbiB1bnNldEFsbEFjdGl2ZXMoKSB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBhY3RpdmVDbGFzcykuZm9yRWFjaChyZW1vdmVDbGFzcyk7XG4gIH07XG5cbiAgdmFyIHNldEFjdGl2ZSA9IGZ1bmN0aW9uIHNldEFjdGl2ZShhY3RpdmVOb2RlKSB7XG4gICAgdW5zZXRBbGxBY3RpdmVzKCk7XG4gICAgYWRkQ2xhc3MoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYVtocmVmPVwiIycgKyBhY3RpdmVOb2RlLmlkICsgJ1wiXScpKTtcbiAgfTtcblxuICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjayhlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgaWYgKGVudHJ5LmludGVyc2VjdGlvblJhdGlvID49IE1hdGhbZGV0ZWN0VHlwZV0uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KHRocmVzaG9sZCkpKSB7XG4gICAgICAgIHNldEFjdGl2ZShlbnRyeS50YXJnZXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBsaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdGlvbnMpO1xuICB2YXIgb2JzZXJ2ZVRhcmdldCA9IGZ1bmN0aW9uIG9ic2VydmVUYXJnZXQobGluaykge1xuICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGxpbmsuaGFzaC5zbGljZSgxKSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQpO1xuICB9O1xuXG4gIGxpbmtzLmZvckVhY2gob2JzZXJ2ZVRhcmdldCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG52YXIgX3Rvb2xzID0gcmVxdWlyZShcIi4vdG9vbHNcIik7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgX3JlZiRkdXJhdGlvbiA9IF9yZWYuZHVyYXRpb24sXG4gICAgICBkdXJhdGlvbiA9IF9yZWYkZHVyYXRpb24gPT09IHVuZGVmaW5lZCA/IDUwMCA6IF9yZWYkZHVyYXRpb24sXG4gICAgICBfcmVmJGNvbnRleHQgPSBfcmVmLmNvbnRleHQsXG4gICAgICBjb250ZXh0ID0gX3JlZiRjb250ZXh0ID09PSB1bmRlZmluZWQgPyB3aW5kb3cgOiBfcmVmJGNvbnRleHQsXG4gICAgICBfcmVmJG9mZnNldCA9IF9yZWYub2Zmc2V0LFxuICAgICAgb2Zmc2V0ID0gX3JlZiRvZmZzZXQgPT09IHVuZGVmaW5lZCA/IDAgOiBfcmVmJG9mZnNldCxcbiAgICAgIF9yZWYkZWFzZSA9IF9yZWYuZWFzZSxcbiAgICAgIGVhc2UgPSBfcmVmJGVhc2UgPT09IHVuZGVmaW5lZCA/IFwiZWFzZUluT3V0Q3ViaWNcIiA6IF9yZWYkZWFzZSxcbiAgICAgIGNhbGxiYWNrID0gX3JlZi5jYWxsYmFjaztcblxuICBpZiAoKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZih3aW5kb3cpKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuO1xuXG4gIHZhciBzdGFydCA9IGNvbnRleHQuc2Nyb2xsVG9wICE9PSBudWxsICYmIGNvbnRleHQuc2Nyb2xsVG9wICE9PSB1bmRlZmluZWQgPyBjb250ZXh0LnNjcm9sbFRvcCA6IHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgdmFyIGVuZCA9ICgwLCBfdG9vbHMuY2FsY0VuZFBvaW50KSh0YXJnZXQsIGNvbnRleHQsIG9mZnNldCk7XG4gIHZhciBjbG9jayA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICB2YXIgckFGID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTtcblxuICB2YXIgdGljayA9IGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgdmFyIGVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGNsb2NrO1xuICAgIHZhciBwb3MgPSAoMCwgX3Rvb2xzLnNldFBvc2l0aW9uKShzdGFydCwgZW5kLCBlbGFwc2VkLCBkdXJhdGlvbiwgZWFzZSk7XG4gICAgaWYgKGNvbnRleHQgIT09IHdpbmRvdykge1xuICAgICAgY29udGV4dC5zY3JvbGxUb3AgPSBwb3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5zY3JvbGwoMCwgcG9zKTtcbiAgICB9XG5cbiAgICBpZiAoZWxhcHNlZCA+IGR1cmF0aW9uKSB7XG4gICAgICB0eXBlb2YgY2FsbGJhY2sgPT09IFwiZnVuY3Rpb25cIiAmJiBjYWxsYmFjayh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByQUYodGljayk7XG4gICAgfVxuICB9O1xuXG4gIHRpY2soKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xudmFyIGVhc2VGdW5jdGlvbnMgPSBleHBvcnRzLmVhc2VGdW5jdGlvbnMgPSB7XG4gIGxpbmVhcjogZnVuY3Rpb24gbGluZWFyKHQpIHtcbiAgICByZXR1cm4gdDtcbiAgfSxcbiAgZWFzZUluUXVhZDogZnVuY3Rpb24gZWFzZUluUXVhZCh0KSB7XG4gICAgcmV0dXJuIHQgKiB0O1xuICB9LFxuICBlYXNlT3V0UXVhZDogZnVuY3Rpb24gZWFzZU91dFF1YWQodCkge1xuICAgIHJldHVybiB0ICogKDIgLSB0KTtcbiAgfSxcbiAgZWFzZUluT3V0UXVhZDogZnVuY3Rpb24gZWFzZUluT3V0UXVhZCh0KSB7XG4gICAgcmV0dXJuIHQgPCAuNSA/IDIgKiB0ICogdCA6IC0xICsgKDQgLSAyICogdCkgKiB0O1xuICB9LFxuICBlYXNlSW5DdWJpYzogZnVuY3Rpb24gZWFzZUluQ3ViaWModCkge1xuICAgIHJldHVybiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VPdXRDdWJpYzogZnVuY3Rpb24gZWFzZU91dEN1YmljKHQpIHtcbiAgICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xuICB9LFxuICBlYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gZWFzZUluT3V0Q3ViaWModCkge1xuICAgIHJldHVybiB0IDwgLjUgPyA0ICogdCAqIHQgKiB0IDogKHQgLSAxKSAqICgyICogdCAtIDIpICogKDIgKiB0IC0gMikgKyAxO1xuICB9LFxuICBlYXNlSW5RdWFydDogZnVuY3Rpb24gZWFzZUluUXVhcnQodCkge1xuICAgIHJldHVybiB0ICogdCAqIHQgKiB0O1xuICB9LFxuICBlYXNlT3V0UXVhcnQ6IGZ1bmN0aW9uIGVhc2VPdXRRdWFydCh0KSB7XG4gICAgcmV0dXJuIDEgLSAtLXQgKiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VJbk91dFF1YXJ0OiBmdW5jdGlvbiBlYXNlSW5PdXRRdWFydCh0KSB7XG4gICAgcmV0dXJuIHQgPCAuNSA/IDggKiB0ICogdCAqIHQgKiB0IDogMSAtIDggKiAtLXQgKiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VJblF1aW50OiBmdW5jdGlvbiBlYXNlSW5RdWludCh0KSB7XG4gICAgcmV0dXJuIHQgKiB0ICogdCAqIHQgKiB0O1xuICB9LFxuICBlYXNlT3V0UXVpbnQ6IGZ1bmN0aW9uIGVhc2VPdXRRdWludCh0KSB7XG4gICAgcmV0dXJuIDEgKyAtLXQgKiB0ICogdCAqIHQgKiB0O1xuICB9LFxuICBlYXNlSW5PdXRRdWludDogZnVuY3Rpb24gZWFzZUluT3V0UXVpbnQodCkge1xuICAgIHJldHVybiB0IDwgLjUgPyAxNiAqIHQgKiB0ICogdCAqIHQgKiB0IDogMSArIDE2ICogLS10ICogdCAqIHQgKiB0ICogdDtcbiAgfVxufTtcblxudmFyIGlzTnVtZXJpYyA9IGV4cG9ydHMuaXNOdW1lcmljID0gZnVuY3Rpb24gaXNOdW1lcmljKG4pIHtcbiAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcbn07XG5cbnZhciBzZXRQb3NpdGlvbiA9IGV4cG9ydHMuc2V0UG9zaXRpb24gPSBmdW5jdGlvbiBzZXRQb3NpdGlvbihiZWdpbiwgZW5kLCBlbGFwc2VkLCBkdXJhdGlvbikge1xuICB2YXIgZWFzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogJ2Vhc2VJbk91dEN1YmljJztcblxuICByZXR1cm4gZWxhcHNlZCA+IGR1cmF0aW9uID8gZW5kIDogYmVnaW4gKyAoZW5kIC0gYmVnaW4pICogZWFzZUZ1bmN0aW9uc1tlYXNlXShlbGFwc2VkIC8gZHVyYXRpb24pO1xufTtcblxudmFyIGNhbGNFbmRQb2ludCA9IGV4cG9ydHMuY2FsY0VuZFBvaW50ID0gZnVuY3Rpb24gY2FsY0VuZFBvaW50KHRhcmdldCkge1xuICB2YXIgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogd2luZG93O1xuICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwO1xuXG4gIGlmIChpc051bWVyaWModGFyZ2V0KSkge1xuICAgIHJldHVybiBwYXJzZUludCh0YXJnZXQpICsgb2Zmc2V0O1xuICB9XG5cbiAgdmFyIHkgPSBjb250ZXh0ID09PSB3aW5kb3cgfHwgY29udGV4dCA9PT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ID8gd2luZG93LnBhZ2VZT2Zmc2V0IDogY29udGV4dC5zY3JvbGxUb3AgLSBjb250ZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcblxuICB2YXIgZGlzdGFuY2UgPSB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2h0bWwnID8gLXkgOiB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgeTtcblxuICByZXR1cm4gZGlzdGFuY2UgKyBvZmZzZXQ7XG59OyIsIihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoW10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICByb290LlNjcm9sbHBhcmVudCA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gIHZhciByZWdleCA9IC8oYXV0b3xzY3JvbGwpLztcblxuICB2YXIgcGFyZW50cyA9IGZ1bmN0aW9uIChub2RlLCBwcykge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUgPT09IG51bGwpIHsgcmV0dXJuIHBzOyB9XG5cbiAgICByZXR1cm4gcGFyZW50cyhub2RlLnBhcmVudE5vZGUsIHBzLmNvbmNhdChbbm9kZV0pKTtcbiAgfTtcblxuICB2YXIgc3R5bGUgPSBmdW5jdGlvbiAobm9kZSwgcHJvcCkge1xuICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUocHJvcCk7XG4gIH07XG5cbiAgdmFyIG92ZXJmbG93ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gc3R5bGUobm9kZSwgXCJvdmVyZmxvd1wiKSArIHN0eWxlKG5vZGUsIFwib3ZlcmZsb3cteVwiKSArIHN0eWxlKG5vZGUsIFwib3ZlcmZsb3cteFwiKTtcbiAgfTtcblxuICB2YXIgc2Nyb2xsID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgIHJldHVybiByZWdleC50ZXN0KG92ZXJmbG93KG5vZGUpKTtcbiAgfTtcblxuICB2YXIgc2Nyb2xsUGFyZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gO1xuICAgIH1cblxuICAgIHZhciBwcyA9IHBhcmVudHMobm9kZS5wYXJlbnROb2RlLCBbXSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAoc2Nyb2xsKHBzW2ldKSkge1xuICAgICAgICByZXR1cm4gcHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9O1xuXG4gIHJldHVybiBzY3JvbGxQYXJlbnQ7XG59KSk7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9yZWFjdC1kYXRlcGlja2VyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9yZWFjdC1kYXRlcGlja2VyLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaW5kZXguY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaW5kZXguY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9vcGVuc2lnbmRyaXZlLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL29wZW5zaWduZHJpdmUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zaWduYXR1cmUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2lnbmF0dXJlLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KG9iai5zdXBwb3J0cywgXCIpIHtcIik7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwiQGxheWVyXCIuY29uY2F0KG9iai5sYXllci5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KG9iai5sYXllcikgOiBcIlwiLCBcIiB7XCIpO1xuICB9XG4gIGNzcyArPSBvYmouY3NzO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9XG5cbiAgLy8gRm9yIG9sZCBJRVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge30sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfVxuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZG9tQVBJOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiaW1wb3J0IFN0eWxpcyBmcm9tICdzdHlsaXMvc3R5bGlzLm1pbic7XG5pbXBvcnQgX2luc2VydFJ1bGVQbHVnaW4gZnJvbSAnc3R5bGlzLXJ1bGUtc2hlZXQnO1xuaW1wb3J0IFJlYWN0LCB7IGNsb25lRWxlbWVudCwgY3JlYXRlQ29udGV4dCwgQ29tcG9uZW50LCBjcmVhdGVFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVuaXRsZXNzIGZyb20gJ0BlbW90aW9uL3VuaXRsZXNzJztcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNWYWxpZEVsZW1lbnRUeXBlLCBGb3J3YXJkUmVmIH0gZnJvbSAncmVhY3QtaXMnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnbWVtb2l6ZS1vbmUnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB2YWxpZEF0dHIgZnJvbSAnQGVtb3Rpb24vaXMtcHJvcC12YWxpZCc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnbWVyZ2UtYW55dGhpbmcnO1xuXG4vLyBcblxudmFyIGludGVybGVhdmUgPSAoZnVuY3Rpb24gKHN0cmluZ3MsIGludGVycG9sYXRpb25zKSB7XG4gIHZhciByZXN1bHQgPSBbc3RyaW5nc1swXV07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGludGVycG9sYXRpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgcmVzdWx0LnB1c2goaW50ZXJwb2xhdGlvbnNbaV0sIHN0cmluZ3NbaSArIDFdKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59O1xuXG52YXIgY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xuXG52YXIgb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzKSB7XG4gIHZhciB0YXJnZXQgPSB7fTtcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7XG4gICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gZnVuY3Rpb24gKHNlbGYsIGNhbGwpIHtcbiAgaWYgKCFzZWxmKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7XG59O1xuXG4vLyBcbnZhciBpc1BsYWluT2JqZWN0ID0gKGZ1bmN0aW9uICh4KSB7XG4gIHJldHVybiAodHlwZW9mIHggPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHgpKSA9PT0gJ29iamVjdCcgJiYgeC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xufSk7XG5cbi8vIFxudmFyIEVNUFRZX0FSUkFZID0gT2JqZWN0LmZyZWV6ZShbXSk7XG52YXIgRU1QVFlfT0JKRUNUID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG5cbi8vIFxuZnVuY3Rpb24gaXNGdW5jdGlvbih0ZXN0KSB7XG4gIHJldHVybiB0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLy8gXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUodGFyZ2V0KSB7XG4gIHJldHVybiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnICYmIHRhcmdldCA6IGZhbHNlKSB8fCB0YXJnZXQuZGlzcGxheU5hbWUgfHwgdGFyZ2V0Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG59XG5cbi8vIFxuZnVuY3Rpb24gaXNTdGF0ZWxlc3NGdW5jdGlvbih0ZXN0KSB7XG4gIHJldHVybiB0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiAhKHRlc3QucHJvdG90eXBlICYmIHRlc3QucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG4vLyBcbmZ1bmN0aW9uIGlzU3R5bGVkQ29tcG9uZW50KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuc3R5bGVkQ29tcG9uZW50SWQgPT09ICdzdHJpbmcnO1xufVxuXG4vLyBcblxudmFyIFNDX0FUVFIgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgKHByb2Nlc3MuZW52LlJFQUNUX0FQUF9TQ19BVFRSIHx8IHByb2Nlc3MuZW52LlNDX0FUVFIpIHx8ICdkYXRhLXN0eWxlZCc7XG5cbnZhciBTQ19WRVJTSU9OX0FUVFIgPSAnZGF0YS1zdHlsZWQtdmVyc2lvbic7XG5cbnZhciBTQ19TVFJFQU1fQVRUUiA9ICdkYXRhLXN0eWxlZC1zdHJlYW1lZCc7XG5cbnZhciBJU19CUk9XU0VSID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ0hUTUxFbGVtZW50JyBpbiB3aW5kb3c7XG5cbnZhciBESVNBQkxFX1NQRUVEWSA9IHR5cGVvZiBTQ19ESVNBQkxFX1NQRUVEWSA9PT0gJ2Jvb2xlYW4nICYmIFNDX0RJU0FCTEVfU1BFRURZIHx8IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAocHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0RJU0FCTEVfU1BFRURZIHx8IHByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZKSB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nO1xuXG4vLyBTaGFyZWQgZW1wdHkgZXhlY3V0aW9uIGNvbnRleHQgd2hlbiBnZW5lcmF0aW5nIHN0YXRpYyBzdHlsZXNcbnZhciBTVEFUSUNfRVhFQ1VUSU9OX0NPTlRFWFQgPSB7fTtcblxuLy8gXG5cblxuLyoqXG4gKiBQYXJzZSBlcnJvcnMubWQgYW5kIHR1cm4gaXQgaW50byBhIHNpbXBsZSBoYXNoIG9mIGNvZGU6IG1lc3NhZ2VcbiAqL1xudmFyIEVSUk9SUyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB7XG4gIFwiMVwiOiBcIkNhbm5vdCBjcmVhdGUgc3R5bGVkLWNvbXBvbmVudCBmb3IgY29tcG9uZW50OiAlcy5cXG5cXG5cIixcbiAgXCIyXCI6IFwiQ2FuJ3QgY29sbGVjdCBzdHlsZXMgb25jZSB5b3UndmUgY29uc3VtZWQgYSBgU2VydmVyU3R5bGVTaGVldGAncyBzdHlsZXMhIGBTZXJ2ZXJTdHlsZVNoZWV0YCBpcyBhIG9uZSBvZmYgaW5zdGFuY2UgZm9yIGVhY2ggc2VydmVyLXNpZGUgcmVuZGVyIGN5Y2xlLlxcblxcbi0gQXJlIHlvdSB0cnlpbmcgdG8gcmV1c2UgaXQgYWNyb3NzIHJlbmRlcnM/XFxuLSBBcmUgeW91IGFjY2lkZW50YWxseSBjYWxsaW5nIGNvbGxlY3RTdHlsZXMgdHdpY2U/XFxuXFxuXCIsXG4gIFwiM1wiOiBcIlN0cmVhbWluZyBTU1IgaXMgb25seSBzdXBwb3J0ZWQgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50OyBQbGVhc2UgZG8gbm90IHRyeSB0byBjYWxsIHRoaXMgbWV0aG9kIGluIHRoZSBicm93c2VyLlxcblxcblwiLFxuICBcIjRcIjogXCJUaGUgYFN0eWxlU2hlZXRNYW5hZ2VyYCBleHBlY3RzIGEgdmFsaWQgdGFyZ2V0IG9yIHNoZWV0IHByb3AhXFxuXFxuLSBEb2VzIHRoaXMgZXJyb3Igb2NjdXIgb24gdGhlIGNsaWVudCBhbmQgaXMgeW91ciB0YXJnZXQgZmFsc3k/XFxuLSBEb2VzIHRoaXMgZXJyb3Igb2NjdXIgb24gdGhlIHNlcnZlciBhbmQgaXMgdGhlIHNoZWV0IGZhbHN5P1xcblxcblwiLFxuICBcIjVcIjogXCJUaGUgY2xvbmUgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIG9uIHRoZSBjbGllbnQhXFxuXFxuLSBBcmUgeW91IHJ1bm5pbmcgaW4gYSBjbGllbnQtbGlrZSBlbnZpcm9ubWVudCBvbiB0aGUgc2VydmVyP1xcbi0gQXJlIHlvdSB0cnlpbmcgdG8gcnVuIFNTUiBvbiB0aGUgY2xpZW50P1xcblxcblwiLFxuICBcIjZcIjogXCJUcnlpbmcgdG8gaW5zZXJ0IGEgbmV3IHN0eWxlIHRhZywgYnV0IHRoZSBnaXZlbiBOb2RlIGlzIHVubW91bnRlZCFcXG5cXG4tIEFyZSB5b3UgdXNpbmcgYSBjdXN0b20gdGFyZ2V0IHRoYXQgaXNuJ3QgbW91bnRlZD9cXG4tIERvZXMgeW91ciBkb2N1bWVudCBub3QgaGF2ZSBhIHZhbGlkIGhlYWQgZWxlbWVudD9cXG4tIEhhdmUgeW91IGFjY2lkZW50YWxseSByZW1vdmVkIGEgc3R5bGUgdGFnIG1hbnVhbGx5P1xcblxcblwiLFxuICBcIjdcIjogXCJUaGVtZVByb3ZpZGVyOiBQbGVhc2UgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHlvdXIgXFxcInRoZW1lXFxcIiBwcm9wIGZ1bmN0aW9uLCBlLmcuXFxuXFxuYGBganNcXG50aGVtZT17KCkgPT4gKHt9KX1cXG5gYGBcXG5cXG5cIixcbiAgXCI4XCI6IFwiVGhlbWVQcm92aWRlcjogUGxlYXNlIG1ha2UgeW91ciBcXFwidGhlbWVcXFwiIHByb3AgYW4gb2JqZWN0LlxcblxcblwiLFxuICBcIjlcIjogXCJNaXNzaW5nIGRvY3VtZW50IGA8aGVhZD5gXFxuXFxuXCIsXG4gIFwiMTBcIjogXCJDYW5ub3QgZmluZCBhIFN0eWxlU2hlZXQgaW5zdGFuY2UuIFVzdWFsbHkgdGhpcyBoYXBwZW5zIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb3BpZXMgb2Ygc3R5bGVkLWNvbXBvbmVudHMgbG9hZGVkIGF0IG9uY2UuIENoZWNrIG91dCB0aGlzIGlzc3VlIGZvciBob3cgdG8gdHJvdWJsZXNob290IGFuZCBmaXggdGhlIGNvbW1vbiBjYXNlcyB3aGVyZSB0aGlzIHNpdHVhdGlvbiBjYW4gaGFwcGVuOiBodHRwczovL2dpdGh1Yi5jb20vc3R5bGVkLWNvbXBvbmVudHMvc3R5bGVkLWNvbXBvbmVudHMvaXNzdWVzLzE5NDEjaXNzdWVjb21tZW50LTQxNzg2MjAyMVxcblxcblwiLFxuICBcIjExXCI6IFwiX1RoaXMgZXJyb3Igd2FzIHJlcGxhY2VkIHdpdGggYSBkZXYtdGltZSB3YXJuaW5nLCBpdCB3aWxsIGJlIGRlbGV0ZWQgZm9yIHY0IGZpbmFsLl8gW2NyZWF0ZUdsb2JhbFN0eWxlXSByZWNlaXZlZCBjaGlsZHJlbiB3aGljaCB3aWxsIG5vdCBiZSByZW5kZXJlZC4gUGxlYXNlIHVzZSB0aGUgY29tcG9uZW50IHdpdGhvdXQgcGFzc2luZyBjaGlsZHJlbiBlbGVtZW50cy5cXG5cXG5cIixcbiAgXCIxMlwiOiBcIkl0IHNlZW1zIHlvdSBhcmUgaW50ZXJwb2xhdGluZyBhIGtleWZyYW1lIGRlY2xhcmF0aW9uICglcykgaW50byBhbiB1bnRhZ2dlZCBzdHJpbmcuIFRoaXMgd2FzIHN1cHBvcnRlZCBpbiBzdHlsZWQtY29tcG9uZW50cyB2MywgYnV0IGlzIG5vdCBsb25nZXIgc3VwcG9ydGVkIGluIHY0IGFzIGtleWZyYW1lcyBhcmUgbm93IGluamVjdGVkIG9uLWRlbWFuZC4gUGxlYXNlIHdyYXAgeW91ciBzdHJpbmcgaW4gdGhlIGNzc1xcXFxgXFxcXGAgaGVscGVyIHdoaWNoIGVuc3VyZXMgdGhlIHN0eWxlcyBhcmUgaW5qZWN0ZWQgY29ycmVjdGx5LiBTZWUgaHR0cHM6Ly93d3cuc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYXBpI2Nzc1xcblxcblwiLFxuICBcIjEzXCI6IFwiJXMgaXMgbm90IGEgc3R5bGVkIGNvbXBvbmVudCBhbmQgY2Fubm90IGJlIHJlZmVycmVkIHRvIHZpYSBjb21wb25lbnQgc2VsZWN0b3IuIFNlZSBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9hZHZhbmNlZCNyZWZlcnJpbmctdG8tb3RoZXItY29tcG9uZW50cyBmb3IgbW9yZSBkZXRhaWxzLlxcblwiXG59IDoge307XG5cbi8qKlxuICogc3VwZXIgYmFzaWMgdmVyc2lvbiBvZiBzcHJpbnRmXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdCgpIHtcbiAgdmFyIGEgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMF07XG4gIHZhciBiID0gW107XG5cbiAgZm9yICh2YXIgYyA9IDEsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGMgPCBsZW47IGMgKz0gMSkge1xuICAgIGIucHVzaChhcmd1bWVudHMubGVuZ3RoIDw9IGMgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbY10pO1xuICB9XG5cbiAgYi5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgYSA9IGEucmVwbGFjZSgvJVthLXpdLywgZCk7XG4gIH0pO1xuXG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlcnJvciBmaWxlIG91dCBvZiBlcnJvcnMubWQgZm9yIGRldmVsb3BtZW50IGFuZCBhIHNpbXBsZSB3ZWIgbGluayB0byB0aGUgZnVsbCBlcnJvcnNcbiAqIGluIHByb2R1Y3Rpb24gbW9kZS5cbiAqL1xuXG52YXIgU3R5bGVkQ29tcG9uZW50c0Vycm9yID0gZnVuY3Rpb24gKF9FcnJvcikge1xuICBpbmhlcml0cyhTdHlsZWRDb21wb25lbnRzRXJyb3IsIF9FcnJvcik7XG5cbiAgZnVuY3Rpb24gU3R5bGVkQ29tcG9uZW50c0Vycm9yKGNvZGUpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdHlsZWRDb21wb25lbnRzRXJyb3IpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGludGVycG9sYXRpb25zID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgaW50ZXJwb2xhdGlvbnNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9FcnJvci5jYWxsKHRoaXMsICdBbiBlcnJvciBvY2N1cnJlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zdHlsZWQtY29tcG9uZW50cy9zdHlsZWQtY29tcG9uZW50cy9ibG9iL21hc3Rlci9wYWNrYWdlcy9zdHlsZWQtY29tcG9uZW50cy9zcmMvdXRpbHMvZXJyb3JzLm1kIycgKyBjb2RlICsgJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nICsgKGludGVycG9sYXRpb25zLmxlbmd0aCA+IDAgPyAnIEFkZGl0aW9uYWwgYXJndW1lbnRzOiAnICsgaW50ZXJwb2xhdGlvbnMuam9pbignLCAnKSA6ICcnKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9FcnJvci5jYWxsKHRoaXMsIGZvcm1hdC5hcHBseSh1bmRlZmluZWQsIFtFUlJPUlNbY29kZV1dLmNvbmNhdChpbnRlcnBvbGF0aW9ucykpLnRyaW0oKSkpO1xuICAgIH1cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyk7XG4gIH1cblxuICByZXR1cm4gU3R5bGVkQ29tcG9uZW50c0Vycm9yO1xufShFcnJvcik7XG5cbi8vIFxudmFyIFNDX0NPTVBPTkVOVF9JRCA9IC9eW15cXFNcXG5dKj9cXC9cXCogc2MtY29tcG9uZW50LWlkOlxccyooXFxTKylcXHMrXFwqXFwvL2dtO1xuXG52YXIgZXh0cmFjdENvbXBzID0gKGZ1bmN0aW9uIChtYXliZUNTUykge1xuICB2YXIgY3NzID0gJycgKyAobWF5YmVDU1MgfHwgJycpOyAvLyBEZWZpbml0ZWx5IGEgc3RyaW5nLCBhbmQgYSBjbG9uZVxuICB2YXIgZXhpc3RpbmdDb21wb25lbnRzID0gW107XG4gIGNzcy5yZXBsYWNlKFNDX0NPTVBPTkVOVF9JRCwgZnVuY3Rpb24gKG1hdGNoLCBjb21wb25lbnRJZCwgbWF0Y2hJbmRleCkge1xuICAgIGV4aXN0aW5nQ29tcG9uZW50cy5wdXNoKHsgY29tcG9uZW50SWQ6IGNvbXBvbmVudElkLCBtYXRjaEluZGV4OiBtYXRjaEluZGV4IH0pO1xuICAgIHJldHVybiBtYXRjaDtcbiAgfSk7XG4gIHJldHVybiBleGlzdGluZ0NvbXBvbmVudHMubWFwKGZ1bmN0aW9uIChfcmVmLCBpKSB7XG4gICAgdmFyIGNvbXBvbmVudElkID0gX3JlZi5jb21wb25lbnRJZCxcbiAgICAgICAgbWF0Y2hJbmRleCA9IF9yZWYubWF0Y2hJbmRleDtcblxuICAgIHZhciBuZXh0Q29tcCA9IGV4aXN0aW5nQ29tcG9uZW50c1tpICsgMV07XG4gICAgdmFyIGNzc0Zyb21ET00gPSBuZXh0Q29tcCA/IGNzcy5zbGljZShtYXRjaEluZGV4LCBuZXh0Q29tcC5tYXRjaEluZGV4KSA6IGNzcy5zbGljZShtYXRjaEluZGV4KTtcbiAgICByZXR1cm4geyBjb21wb25lbnRJZDogY29tcG9uZW50SWQsIGNzc0Zyb21ET006IGNzc0Zyb21ET00gfTtcbiAgfSk7XG59KTtcblxuLy8gXG5cbnZhciBDT01NRU5UX1JFR0VYID0gL15cXHMqXFwvXFwvLiokL2dtO1xuXG4vLyBOT1RFOiBUaGlzIHN0eWxpcyBpbnN0YW5jZSBpcyBvbmx5IHVzZWQgdG8gc3BsaXQgcnVsZXMgZnJvbSBTU1InZCBzdHlsZSB0YWdzXG52YXIgc3R5bGlzU3BsaXR0ZXIgPSBuZXcgU3R5bGlzKHtcbiAgZ2xvYmFsOiBmYWxzZSxcbiAgY2FzY2FkZTogdHJ1ZSxcbiAga2V5ZnJhbWU6IGZhbHNlLFxuICBwcmVmaXg6IGZhbHNlLFxuICBjb21wcmVzczogZmFsc2UsXG4gIHNlbWljb2xvbjogdHJ1ZVxufSk7XG5cbnZhciBzdHlsaXMgPSBuZXcgU3R5bGlzKHtcbiAgZ2xvYmFsOiBmYWxzZSxcbiAgY2FzY2FkZTogdHJ1ZSxcbiAga2V5ZnJhbWU6IGZhbHNlLFxuICBwcmVmaXg6IHRydWUsXG4gIGNvbXByZXNzOiBmYWxzZSxcbiAgc2VtaWNvbG9uOiBmYWxzZSAvLyBOT1RFOiBUaGlzIG1lYW5zIFwiYXV0b2NvbXBsZXRlIG1pc3Npbmcgc2VtaWNvbG9uc1wiXG59KTtcblxuLy8gV3JhcCBgaW5zZXJ0UnVsZVBsdWdpbiB0byBidWlsZCBhIGxpc3Qgb2YgcnVsZXMsXG4vLyBhbmQgdGhlbiBtYWtlIG91ciBvd24gcGx1Z2luIHRvIHJldHVybiB0aGUgcnVsZXMuIFRoaXNcbi8vIG1ha2VzIGl0IGVhc2llciB0byBob29rIGludG8gdGhlIGV4aXN0aW5nIFNTUiBhcmNoaXRlY3R1cmVcblxudmFyIHBhcnNpbmdSdWxlcyA9IFtdO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciByZXR1cm5SdWxlc1BsdWdpbiA9IGZ1bmN0aW9uIHJldHVyblJ1bGVzUGx1Z2luKGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQgPT09IC0yKSB7XG4gICAgdmFyIHBhcnNlZFJ1bGVzID0gcGFyc2luZ1J1bGVzO1xuICAgIHBhcnNpbmdSdWxlcyA9IFtdO1xuICAgIHJldHVybiBwYXJzZWRSdWxlcztcbiAgfVxufTtcblxudmFyIHBhcnNlUnVsZXNQbHVnaW4gPSBfaW5zZXJ0UnVsZVBsdWdpbihmdW5jdGlvbiAocnVsZSkge1xuICBwYXJzaW5nUnVsZXMucHVzaChydWxlKTtcbn0pO1xuXG52YXIgX2NvbXBvbmVudElkID0gdm9pZCAwO1xudmFyIF9zZWxlY3RvciA9IHZvaWQgMDtcbnZhciBfc2VsZWN0b3JSZWdleHAgPSB2b2lkIDA7XG5cbnZhciBzZWxmUmVmZXJlbmNlUmVwbGFjZXIgPSBmdW5jdGlvbiBzZWxmUmVmZXJlbmNlUmVwbGFjZXIobWF0Y2gsIG9mZnNldCwgc3RyaW5nKSB7XG4gIGlmIChcbiAgLy8gdGhlIGZpcnN0IHNlbGYtcmVmIGlzIGFsd2F5cyB1bnRvdWNoZWRcbiAgb2Zmc2V0ID4gMCAmJlxuICAvLyB0aGVyZSBzaG91bGQgYmUgYXQgbGVhc3QgdHdvIHNlbGYtcmVmcyB0byBkbyBhIHJlcGxhY2VtZW50ICguYiA+IC5iKVxuICBzdHJpbmcuc2xpY2UoMCwgb2Zmc2V0KS5pbmRleE9mKF9zZWxlY3RvcikgIT09IC0xICYmXG4gIC8vIG5vIGNvbnNlY3V0aXZlIHNlbGYgcmVmcyAoLmIuYik7IHRoYXQgaXMgYSBwcmVjZWRlbmNlIGJvb3N0IGFuZCB0cmVhdGVkIGRpZmZlcmVudGx5XG4gIHN0cmluZy5zbGljZShvZmZzZXQgLSBfc2VsZWN0b3IubGVuZ3RoLCBvZmZzZXQpICE9PSBfc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gJy4nICsgX2NvbXBvbmVudElkO1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoO1xufTtcblxuLyoqXG4gKiBXaGVuIHdyaXRpbmcgYSBzdHlsZSBsaWtlXG4gKlxuICogJiArICYge1xuICogICBjb2xvcjogcmVkO1xuICogfVxuICpcbiAqIFRoZSBzZWNvbmQgYW1wZXJzYW5kIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byB0aGUgc3RhdGljIGNvbXBvbmVudCBjbGFzcy4gc3R5bGlzXG4gKiBoYXMgbm8ga25vd2xlZGdlIG9mIHN0YXRpYyBjbGFzcyBzbyB3ZSBoYXZlIHRvIGludGVsbGlnZW50bHkgcmVwbGFjZSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xudmFyIHNlbGZSZWZlcmVuY2VSZXBsYWNlbWVudFBsdWdpbiA9IGZ1bmN0aW9uIHNlbGZSZWZlcmVuY2VSZXBsYWNlbWVudFBsdWdpbihjb250ZXh0LCBfLCBzZWxlY3RvcnMpIHtcbiAgaWYgKGNvbnRleHQgPT09IDIgJiYgc2VsZWN0b3JzLmxlbmd0aCAmJiBzZWxlY3RvcnNbMF0ubGFzdEluZGV4T2YoX3NlbGVjdG9yKSA+IDApIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBzZWxlY3RvcnNbMF0gPSBzZWxlY3RvcnNbMF0ucmVwbGFjZShfc2VsZWN0b3JSZWdleHAsIHNlbGZSZWZlcmVuY2VSZXBsYWNlcik7XG4gIH1cbn07XG5cbnN0eWxpcy51c2UoW3NlbGZSZWZlcmVuY2VSZXBsYWNlbWVudFBsdWdpbiwgcGFyc2VSdWxlc1BsdWdpbiwgcmV0dXJuUnVsZXNQbHVnaW5dKTtcbnN0eWxpc1NwbGl0dGVyLnVzZShbcGFyc2VSdWxlc1BsdWdpbiwgcmV0dXJuUnVsZXNQbHVnaW5dKTtcblxudmFyIHNwbGl0QnlSdWxlcyA9IGZ1bmN0aW9uIHNwbGl0QnlSdWxlcyhjc3MpIHtcbiAgcmV0dXJuIHN0eWxpc1NwbGl0dGVyKCcnLCBjc3MpO1xufTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5UnVsZXMocnVsZXMsIHNlbGVjdG9yLCBwcmVmaXgpIHtcbiAgdmFyIGNvbXBvbmVudElkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiAnJic7XG5cbiAgdmFyIGZsYXRDU1MgPSBydWxlcy5qb2luKCcnKS5yZXBsYWNlKENPTU1FTlRfUkVHRVgsICcnKTsgLy8gcmVwbGFjZSBKUyBjb21tZW50c1xuXG4gIHZhciBjc3NTdHIgPSBzZWxlY3RvciAmJiBwcmVmaXggPyBwcmVmaXggKyAnICcgKyBzZWxlY3RvciArICcgeyAnICsgZmxhdENTUyArICcgfScgOiBmbGF0Q1NTO1xuXG4gIC8vIHN0eWxpcyBoYXMgbm8gY29uY2VwdCBvZiBzdGF0ZSB0byBiZSBwYXNzZWQgdG8gcGx1Z2luc1xuICAvLyBidXQgc2luY2UgSlMgaXMgc2luZ2xlPXRocmVhZGVkLCB3ZSBjYW4gcmVseSBvbiB0aGF0IHRvIGVuc3VyZVxuICAvLyB0aGVzZSBwcm9wZXJ0aWVzIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBjdXJyZW50IHN0eWxpcyBydW5cbiAgX2NvbXBvbmVudElkID0gY29tcG9uZW50SWQ7XG4gIF9zZWxlY3RvciA9IHNlbGVjdG9yO1xuICBfc2VsZWN0b3JSZWdleHAgPSBuZXcgUmVnRXhwKCdcXFxcJyArIF9zZWxlY3RvciArICdcXFxcYicsICdnJyk7XG5cbiAgcmV0dXJuIHN0eWxpcyhwcmVmaXggfHwgIXNlbGVjdG9yID8gJycgOiBzZWxlY3RvciwgY3NzU3RyKTtcbn1cblxuLy8gXG4vKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UsIG5vLXVuZGVmICovXG5cbnZhciBnZXROb25jZSA9IChmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09ICd1bmRlZmluZWQnID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xufSk7XG5cbi8vIFxuLyogVGhlc2UgYXJlIGhlbHBlcnMgZm9yIHRoZSBTdHlsZVRhZ3MgdG8ga2VlcCB0cmFjayBvZiB0aGUgaW5qZWN0ZWRcbiAqIHJ1bGUgbmFtZXMgZm9yIGVhY2ggKGNvbXBvbmVudCkgSUQgdGhhdCB0aGV5J3JlIGtlZXBpbmcgdHJhY2sgb2YuXG4gKiBUaGV5J3JlIGNydWNpYWwgZm9yIGRldGVjdGluZyB3aGV0aGVyIGEgbmFtZSBoYXMgYWxyZWFkeSBiZWVuXG4gKiBpbmplY3RlZC5cbiAqIChUaGlzIGV4Y2x1ZGVzIHJlaHlkcmF0ZWQgbmFtZXMpICovXG5cbi8qIGFkZHMgYSBuZXcgSUQ6bmFtZSBwYWlyaW5nIHRvIGEgbmFtZXMgZGljdGlvbmFyeSAqL1xudmFyIGFkZE5hbWVGb3JJZCA9IGZ1bmN0aW9uIGFkZE5hbWVGb3JJZChuYW1lcywgaWQsIG5hbWUpIHtcbiAgaWYgKG5hbWUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB2YXIgbmFtZXNGb3JJZCA9IG5hbWVzW2lkXSB8fCAobmFtZXNbaWRdID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgbmFtZXNGb3JJZFtuYW1lXSA9IHRydWU7XG4gIH1cbn07XG5cbi8qIHJlc2V0cyBhbiBJRCBlbnRpcmVseSBieSBvdmVyd3JpdGluZyBpdCBpbiB0aGUgZGljdGlvbmFyeSAqL1xudmFyIHJlc2V0SWROYW1lcyA9IGZ1bmN0aW9uIHJlc2V0SWROYW1lcyhuYW1lcywgaWQpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIG5hbWVzW2lkXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG59O1xuXG4vKiBmYWN0b3J5IGZvciBhIG5hbWVzIGRpY3Rpb25hcnkgY2hlY2tpbmcgdGhlIGV4aXN0YW5jZSBvZiBhbiBJRDpuYW1lIHBhaXJpbmcgKi9cbnZhciBoYXNOYW1lRm9ySWQgPSBmdW5jdGlvbiBoYXNOYW1lRm9ySWQobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpZCwgbmFtZSkge1xuICAgIHJldHVybiBuYW1lc1tpZF0gIT09IHVuZGVmaW5lZCAmJiBuYW1lc1tpZF1bbmFtZV07XG4gIH07XG59O1xuXG4vKiBzdHJpbmdpZmllcyBuYW1lcyBmb3IgdGhlIGh0bWwvZWxlbWVudCBvdXRwdXQgKi9cbnZhciBzdHJpbmdpZnlOYW1lcyA9IGZ1bmN0aW9uIHN0cmluZ2lmeU5hbWVzKG5hbWVzKSB7XG4gIHZhciBzdHIgPSAnJztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICBmb3IgKHZhciBpZCBpbiBuYW1lcykge1xuICAgIHN0ciArPSBPYmplY3Qua2V5cyhuYW1lc1tpZF0pLmpvaW4oJyAnKSArICcgJztcbiAgfVxuICByZXR1cm4gc3RyLnRyaW0oKTtcbn07XG5cbi8qIGNsb25lcyB0aGUgbmVzdGVkIG5hbWVzIGRpY3Rpb25hcnkgKi9cbnZhciBjbG9uZU5hbWVzID0gZnVuY3Rpb24gY2xvbmVOYW1lcyhuYW1lcykge1xuICB2YXIgY2xvbmUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gIGZvciAodmFyIGlkIGluIG5hbWVzKSB7XG4gICAgY2xvbmVbaWRdID0gX2V4dGVuZHMoe30sIG5hbWVzW2lkXSk7XG4gIH1cbiAgcmV0dXJuIGNsb25lO1xufTtcblxuLy8gXG5cbi8qIFRoZXNlIGFyZSBoZWxwZXJzIHRoYXQgZGVhbCB3aXRoIHRoZSBpbnNlcnRSdWxlIChha2Egc3BlZWR5KSBBUElcbiAqIFRoZXkgYXJlIHVzZWQgaW4gdGhlIFN0eWxlVGFncyBhbmQgc3BlY2lmaWNhbGx5IHRoZSBzcGVlZHkgdGFnXG4gKi9cblxuLyogcmV0cmlldmUgYSBzaGVldCBmb3IgYSBnaXZlbiBzdHlsZSB0YWcgKi9cbnZhciBzaGVldEZvclRhZyA9IGZ1bmN0aW9uIHNoZWV0Rm9yVGFnKHRhZykge1xuICAvLyAkRmxvd0ZpeE1lXG4gIGlmICh0YWcuc2hlZXQpIHJldHVybiB0YWcuc2hlZXQ7XG5cbiAgLyogRmlyZWZveCBxdWlyayByZXF1aXJlcyB1cyB0byBzdGVwIHRocm91Z2ggYWxsIHN0eWxlc2hlZXRzIHRvIGZpbmQgb25lIG93bmVkIGJ5IHRoZSBnaXZlbiB0YWcgKi9cbiAgdmFyIHNpemUgPSB0YWcub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAxKSB7XG4gICAgdmFyIHNoZWV0ID0gdGFnLm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbaV07XG4gICAgLy8gJEZsb3dGaXhNZVxuICAgIGlmIChzaGVldC5vd25lck5vZGUgPT09IHRhZykgcmV0dXJuIHNoZWV0O1xuICB9XG5cbiAgLyogd2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIGZpbmQgYSB0YWcgKi9cbiAgdGhyb3cgbmV3IFN0eWxlZENvbXBvbmVudHNFcnJvcigxMCk7XG59O1xuXG4vKiBpbnNlcnQgYSBydWxlIHNhZmVseSBhbmQgcmV0dXJuIHdoZXRoZXIgaXQgd2FzIGFjdHVhbGx5IGluamVjdGVkICovXG52YXIgc2FmZUluc2VydFJ1bGUgPSBmdW5jdGlvbiBzYWZlSW5zZXJ0UnVsZShzaGVldCwgY3NzUnVsZSwgaW5kZXgpIHtcbiAgLyogYWJvcnQgZWFybHkgaWYgY3NzUnVsZSBzdHJpbmcgaXMgZmFsc3kgKi9cbiAgaWYgKCFjc3NSdWxlKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIG1heEluZGV4ID0gc2hlZXQuY3NzUnVsZXMubGVuZ3RoO1xuXG4gIHRyeSB7XG4gICAgLyogdXNlIGluc2VydFJ1bGUgYW5kIGNhcCBwYXNzZWQgaW5kZXggd2l0aCBtYXhJbmRleCAobm8gb2YgY3NzUnVsZXMpICovXG4gICAgc2hlZXQuaW5zZXJ0UnVsZShjc3NSdWxlLCBpbmRleCA8PSBtYXhJbmRleCA/IGluZGV4IDogbWF4SW5kZXgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvKiBhbnkgZXJyb3IgaW5kaWNhdGVzIGFuIGludmFsaWQgcnVsZSAqL1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyogZGVsZXRlcyBgc2l6ZWAgcnVsZXMgc3RhcnRpbmcgZnJvbSBgcmVtb3ZhbEluZGV4YCAqL1xudmFyIGRlbGV0ZVJ1bGVzID0gZnVuY3Rpb24gZGVsZXRlUnVsZXMoc2hlZXQsIHJlbW92YWxJbmRleCwgc2l6ZSkge1xuICB2YXIgbG93ZXJCb3VuZCA9IHJlbW92YWxJbmRleCAtIHNpemU7XG4gIGZvciAodmFyIGkgPSByZW1vdmFsSW5kZXg7IGkgPiBsb3dlckJvdW5kOyBpIC09IDEpIHtcbiAgICBzaGVldC5kZWxldGVSdWxlKGkpO1xuICB9XG59O1xuXG4vLyBcblxuLyogdGhpcyBtYXJrZXIgc2VwYXJhdGVzIGNvbXBvbmVudCBzdHlsZXMgYW5kIGlzIGltcG9ydGFudCBmb3IgcmVoeWRyYXRpb24gKi9cbnZhciBtYWtlVGV4dE1hcmtlciA9IGZ1bmN0aW9uIG1ha2VUZXh0TWFya2VyKGlkKSB7XG4gIHJldHVybiAnXFxuLyogc2MtY29tcG9uZW50LWlkOiAnICsgaWQgKyAnICovXFxuJztcbn07XG5cbi8qIGFkZCB1cCBhbGwgbnVtYmVycyBpbiBhcnJheSB1cCB1bnRpbCBhbmQgaW5jbHVkaW5nIHRoZSBpbmRleCAqL1xudmFyIGFkZFVwVW50aWxJbmRleCA9IGZ1bmN0aW9uIGFkZFVwVW50aWxJbmRleChzaXplcywgaW5kZXgpIHtcbiAgdmFyIHRvdGFsVXBUb0luZGV4ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gaW5kZXg7IGkgKz0gMSkge1xuICAgIHRvdGFsVXBUb0luZGV4ICs9IHNpemVzW2ldO1xuICB9XG5cbiAgcmV0dXJuIHRvdGFsVXBUb0luZGV4O1xufTtcblxuLyogY3JlYXRlIGEgbmV3IHN0eWxlIHRhZyBhZnRlciBsYXN0RWwgKi9cbnZhciBtYWtlU3R5bGVUYWcgPSBmdW5jdGlvbiBtYWtlU3R5bGVUYWcodGFyZ2V0LCB0YWdFbCwgaW5zZXJ0QmVmb3JlKSB7XG4gIHZhciB0YXJnZXREb2N1bWVudCA9IGRvY3VtZW50O1xuICBpZiAodGFyZ2V0KSB0YXJnZXREb2N1bWVudCA9IHRhcmdldC5vd25lckRvY3VtZW50O2Vsc2UgaWYgKHRhZ0VsKSB0YXJnZXREb2N1bWVudCA9IHRhZ0VsLm93bmVyRG9jdW1lbnQ7XG5cbiAgdmFyIGVsID0gdGFyZ2V0RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgZWwuc2V0QXR0cmlidXRlKFNDX0FUVFIsICcnKTtcbiAgZWwuc2V0QXR0cmlidXRlKFNDX1ZFUlNJT05fQVRUUiwgXCI0LjQuMVwiKTtcblxuICB2YXIgbm9uY2UgPSBnZXROb25jZSgpO1xuICBpZiAobm9uY2UpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICB9XG5cbiAgLyogV29yayBhcm91bmQgaW5zZXJ0UnVsZSBxdWlyayBpbiBFZGdlSFRNTCAqL1xuICBlbC5hcHBlbmRDaGlsZCh0YXJnZXREb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJykpO1xuXG4gIGlmICh0YXJnZXQgJiYgIXRhZ0VsKSB7XG4gICAgLyogQXBwZW5kIHRvIHRhcmdldCB3aGVuIG5vIHByZXZpb3VzIGVsZW1lbnQgd2FzIHBhc3NlZCAqL1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZChlbCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCF0YWdFbCB8fCAhdGFyZ2V0IHx8ICF0YWdFbC5wYXJlbnROb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgU3R5bGVkQ29tcG9uZW50c0Vycm9yKDYpO1xuICAgIH1cblxuICAgIC8qIEluc2VydCBuZXcgc3R5bGUgdGFnIGFmdGVyIHRoZSBwcmV2aW91cyBvbmUgKi9cbiAgICB0YWdFbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbCwgaW5zZXJ0QmVmb3JlID8gdGFnRWwgOiB0YWdFbC5uZXh0U2libGluZyk7XG4gIH1cblxuICByZXR1cm4gZWw7XG59O1xuXG4vKiB0YWtlcyBhIGNzcyBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBvdXRwdXRzIGFuIGh0bWwgc3R5bGVkIHRhZyBmYWN0b3J5ICovXG52YXIgd3JhcEFzSHRtbFRhZyA9IGZ1bmN0aW9uIHdyYXBBc0h0bWxUYWcoY3NzLCBuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24gKGFkZGl0aW9uYWxBdHRycykge1xuICAgIHZhciBub25jZSA9IGdldE5vbmNlKCk7XG4gICAgdmFyIGF0dHJzID0gW25vbmNlICYmICdub25jZT1cIicgKyBub25jZSArICdcIicsIFNDX0FUVFIgKyAnPVwiJyArIHN0cmluZ2lmeU5hbWVzKG5hbWVzKSArICdcIicsIFNDX1ZFUlNJT05fQVRUUiArICc9XCInICsgXCI0LjQuMVwiICsgJ1wiJywgYWRkaXRpb25hbEF0dHJzXTtcblxuICAgIHZhciBodG1sQXR0ciA9IGF0dHJzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgcmV0dXJuICc8c3R5bGUgJyArIGh0bWxBdHRyICsgJz4nICsgY3NzKCkgKyAnPC9zdHlsZT4nO1xuICB9O1xufTtcblxuLyogdGFrZXMgYSBjc3MgZmFjdG9yeSBmdW5jdGlvbiBhbmQgb3V0cHV0cyBhbiBlbGVtZW50IGZhY3RvcnkgKi9cbnZhciB3cmFwQXNFbGVtZW50ID0gZnVuY3Rpb24gd3JhcEFzRWxlbWVudChjc3MsIG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9wcm9wcztcblxuICAgIHZhciBwcm9wcyA9IChfcHJvcHMgPSB7fSwgX3Byb3BzW1NDX0FUVFJdID0gc3RyaW5naWZ5TmFtZXMobmFtZXMpLCBfcHJvcHNbU0NfVkVSU0lPTl9BVFRSXSA9IFwiNC40LjFcIiwgX3Byb3BzKTtcblxuICAgIHZhciBub25jZSA9IGdldE5vbmNlKCk7XG4gICAgaWYgKG5vbmNlKSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICBwcm9wcy5ub25jZSA9IG5vbmNlO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby1kYW5nZXJcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCgnc3R5bGUnLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHsgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiBjc3MoKSB9IH0pKTtcbiAgfTtcbn07XG5cbnZhciBnZXRJZHNGcm9tTWFya2Vyc0ZhY3RvcnkgPSBmdW5jdGlvbiBnZXRJZHNGcm9tTWFya2Vyc0ZhY3RvcnkobWFya2Vycykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXJrZXJzKTtcbiAgfTtcbn07XG5cbi8qIHNwZWVkeSB0YWdzIHV0aWxpc2UgaW5zZXJ0UnVsZSAqL1xudmFyIG1ha2VTcGVlZHlUYWcgPSBmdW5jdGlvbiBtYWtlU3BlZWR5VGFnKGVsLCBnZXRJbXBvcnRSdWxlVGFnKSB7XG4gIHZhciBuYW1lcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBtYXJrZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIHNpemVzID0gW107XG5cbiAgdmFyIGV4dHJhY3RJbXBvcnQgPSBnZXRJbXBvcnRSdWxlVGFnICE9PSB1bmRlZmluZWQ7XG4gIC8qIGluZGljYXRlcyB3aGV0aGVyIGdldEltcG9ydFJ1bGVUYWcgd2FzIGNhbGxlZCAqL1xuICB2YXIgdXNlZEltcG9ydFJ1bGVUYWcgPSBmYWxzZTtcblxuICB2YXIgaW5zZXJ0TWFya2VyID0gZnVuY3Rpb24gaW5zZXJ0TWFya2VyKGlkKSB7XG4gICAgdmFyIHByZXYgPSBtYXJrZXJzW2lkXTtcbiAgICBpZiAocHJldiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9XG5cbiAgICBtYXJrZXJzW2lkXSA9IHNpemVzLmxlbmd0aDtcbiAgICBzaXplcy5wdXNoKDApO1xuICAgIHJlc2V0SWROYW1lcyhuYW1lcywgaWQpO1xuXG4gICAgcmV0dXJuIG1hcmtlcnNbaWRdO1xuICB9O1xuXG4gIHZhciBpbnNlcnRSdWxlcyA9IGZ1bmN0aW9uIGluc2VydFJ1bGVzKGlkLCBjc3NSdWxlcywgbmFtZSkge1xuICAgIHZhciBtYXJrZXIgPSBpbnNlcnRNYXJrZXIoaWQpO1xuICAgIHZhciBzaGVldCA9IHNoZWV0Rm9yVGFnKGVsKTtcbiAgICB2YXIgaW5zZXJ0SW5kZXggPSBhZGRVcFVudGlsSW5kZXgoc2l6ZXMsIG1hcmtlcik7XG5cbiAgICB2YXIgaW5qZWN0ZWRSdWxlcyA9IDA7XG4gICAgdmFyIGltcG9ydFJ1bGVzID0gW107XG4gICAgdmFyIGNzc1J1bGVzU2l6ZSA9IGNzc1J1bGVzLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3NzUnVsZXNTaXplOyBpICs9IDEpIHtcbiAgICAgIHZhciBjc3NSdWxlID0gY3NzUnVsZXNbaV07XG4gICAgICB2YXIgbWF5SGF2ZUltcG9ydCA9IGV4dHJhY3RJbXBvcnQ7IC8qIEBpbXBvcnQgcnVsZXMgYXJlIHJlb3JkZXJlZCB0byBhcHBlYXIgZmlyc3QgKi9cbiAgICAgIGlmIChtYXlIYXZlSW1wb3J0ICYmIGNzc1J1bGUuaW5kZXhPZignQGltcG9ydCcpICE9PSAtMSkge1xuICAgICAgICBpbXBvcnRSdWxlcy5wdXNoKGNzc1J1bGUpO1xuICAgICAgfSBlbHNlIGlmIChzYWZlSW5zZXJ0UnVsZShzaGVldCwgY3NzUnVsZSwgaW5zZXJ0SW5kZXggKyBpbmplY3RlZFJ1bGVzKSkge1xuICAgICAgICBtYXlIYXZlSW1wb3J0ID0gZmFsc2U7XG4gICAgICAgIGluamVjdGVkUnVsZXMgKz0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0cmFjdEltcG9ydCAmJiBpbXBvcnRSdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB1c2VkSW1wb3J0UnVsZVRhZyA9IHRydWU7XG4gICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICBnZXRJbXBvcnRSdWxlVGFnKCkuaW5zZXJ0UnVsZXMoaWQgKyAnLWltcG9ydCcsIGltcG9ydFJ1bGVzKTtcbiAgICB9XG5cbiAgICBzaXplc1ttYXJrZXJdICs9IGluamVjdGVkUnVsZXM7IC8qIGFkZCB1cCBubyBvZiBpbmplY3RlZCBydWxlcyAqL1xuICAgIGFkZE5hbWVGb3JJZChuYW1lcywgaWQsIG5hbWUpO1xuICB9O1xuXG4gIHZhciByZW1vdmVSdWxlcyA9IGZ1bmN0aW9uIHJlbW92ZVJ1bGVzKGlkKSB7XG4gICAgdmFyIG1hcmtlciA9IG1hcmtlcnNbaWRdO1xuICAgIGlmIChtYXJrZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIC8vICRGbG93Rml4TWVcbiAgICBpZiAoZWwuaXNDb25uZWN0ZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICB2YXIgc2l6ZSA9IHNpemVzW21hcmtlcl07XG4gICAgdmFyIHNoZWV0ID0gc2hlZXRGb3JUYWcoZWwpO1xuICAgIHZhciByZW1vdmFsSW5kZXggPSBhZGRVcFVudGlsSW5kZXgoc2l6ZXMsIG1hcmtlcikgLSAxO1xuICAgIGRlbGV0ZVJ1bGVzKHNoZWV0LCByZW1vdmFsSW5kZXgsIHNpemUpO1xuICAgIHNpemVzW21hcmtlcl0gPSAwO1xuICAgIHJlc2V0SWROYW1lcyhuYW1lcywgaWQpO1xuXG4gICAgaWYgKGV4dHJhY3RJbXBvcnQgJiYgdXNlZEltcG9ydFJ1bGVUYWcpIHtcbiAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgIGdldEltcG9ydFJ1bGVUYWcoKS5yZW1vdmVSdWxlcyhpZCArICctaW1wb3J0Jyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBjc3MgPSBmdW5jdGlvbiBjc3MoKSB7XG4gICAgdmFyIF9zaGVldEZvclRhZyA9IHNoZWV0Rm9yVGFnKGVsKSxcbiAgICAgICAgY3NzUnVsZXMgPSBfc2hlZXRGb3JUYWcuY3NzUnVsZXM7XG5cbiAgICB2YXIgc3RyID0gJyc7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgZm9yICh2YXIgaWQgaW4gbWFya2Vycykge1xuICAgICAgc3RyICs9IG1ha2VUZXh0TWFya2VyKGlkKTtcbiAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2lkXTtcbiAgICAgIHZhciBlbmQgPSBhZGRVcFVudGlsSW5kZXgoc2l6ZXMsIG1hcmtlcik7XG4gICAgICB2YXIgc2l6ZSA9IHNpemVzW21hcmtlcl07XG4gICAgICBmb3IgKHZhciBpID0gZW5kIC0gc2l6ZTsgaSA8IGVuZDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBydWxlID0gY3NzUnVsZXNbaV07XG4gICAgICAgIGlmIChydWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzdHIgKz0gcnVsZS5jc3NUZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHRocm93IG5ldyBTdHlsZWRDb21wb25lbnRzRXJyb3IoNSk7XG4gICAgfSxcblxuICAgIGNzczogY3NzLFxuICAgIGdldElkczogZ2V0SWRzRnJvbU1hcmtlcnNGYWN0b3J5KG1hcmtlcnMpLFxuICAgIGhhc05hbWVGb3JJZDogaGFzTmFtZUZvcklkKG5hbWVzKSxcbiAgICBpbnNlcnRNYXJrZXI6IGluc2VydE1hcmtlcixcbiAgICBpbnNlcnRSdWxlczogaW5zZXJ0UnVsZXMsXG4gICAgcmVtb3ZlUnVsZXM6IHJlbW92ZVJ1bGVzLFxuICAgIHNlYWxlZDogZmFsc2UsXG4gICAgc3R5bGVUYWc6IGVsLFxuICAgIHRvRWxlbWVudDogd3JhcEFzRWxlbWVudChjc3MsIG5hbWVzKSxcbiAgICB0b0hUTUw6IHdyYXBBc0h0bWxUYWcoY3NzLCBuYW1lcylcbiAgfTtcbn07XG5cbnZhciBtYWtlVGV4dE5vZGUgPSBmdW5jdGlvbiBtYWtlVGV4dE5vZGUodGFyZ2V0RG9jdW1lbnQsIGlkKSB7XG4gIHJldHVybiB0YXJnZXREb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtYWtlVGV4dE1hcmtlcihpZCkpO1xufTtcblxudmFyIG1ha2VCcm93c2VyVGFnID0gZnVuY3Rpb24gbWFrZUJyb3dzZXJUYWcoZWwsIGdldEltcG9ydFJ1bGVUYWcpIHtcbiAgdmFyIG5hbWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIG1hcmtlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIHZhciBleHRyYWN0SW1wb3J0ID0gZ2V0SW1wb3J0UnVsZVRhZyAhPT0gdW5kZWZpbmVkO1xuXG4gIC8qIGluZGljYXRlcyB3aGV0aGVyIGdldEltcG9ydFJ1bGVUYWcgd2FzIGNhbGxlZCAqL1xuICB2YXIgdXNlZEltcG9ydFJ1bGVUYWcgPSBmYWxzZTtcblxuICB2YXIgaW5zZXJ0TWFya2VyID0gZnVuY3Rpb24gaW5zZXJ0TWFya2VyKGlkKSB7XG4gICAgdmFyIHByZXYgPSBtYXJrZXJzW2lkXTtcbiAgICBpZiAocHJldiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9XG5cbiAgICBtYXJrZXJzW2lkXSA9IG1ha2VUZXh0Tm9kZShlbC5vd25lckRvY3VtZW50LCBpZCk7XG4gICAgZWwuYXBwZW5kQ2hpbGQobWFya2Vyc1tpZF0pO1xuICAgIG5hbWVzW2lkXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICByZXR1cm4gbWFya2Vyc1tpZF07XG4gIH07XG5cbiAgdmFyIGluc2VydFJ1bGVzID0gZnVuY3Rpb24gaW5zZXJ0UnVsZXMoaWQsIGNzc1J1bGVzLCBuYW1lKSB7XG4gICAgdmFyIG1hcmtlciA9IGluc2VydE1hcmtlcihpZCk7XG4gICAgdmFyIGltcG9ydFJ1bGVzID0gW107XG4gICAgdmFyIGNzc1J1bGVzU2l6ZSA9IGNzc1J1bGVzLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3NzUnVsZXNTaXplOyBpICs9IDEpIHtcbiAgICAgIHZhciBydWxlID0gY3NzUnVsZXNbaV07XG4gICAgICB2YXIgbWF5SGF2ZUltcG9ydCA9IGV4dHJhY3RJbXBvcnQ7XG4gICAgICBpZiAobWF5SGF2ZUltcG9ydCAmJiBydWxlLmluZGV4T2YoJ0BpbXBvcnQnKSAhPT0gLTEpIHtcbiAgICAgICAgaW1wb3J0UnVsZXMucHVzaChydWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heUhhdmVJbXBvcnQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9IGkgPT09IGNzc1J1bGVzU2l6ZSAtIDEgPyAnJyA6ICcgJztcbiAgICAgICAgbWFya2VyLmFwcGVuZERhdGEoJycgKyBydWxlICsgc2VwYXJhdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhZGROYW1lRm9ySWQobmFtZXMsIGlkLCBuYW1lKTtcblxuICAgIGlmIChleHRyYWN0SW1wb3J0ICYmIGltcG9ydFJ1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHVzZWRJbXBvcnRSdWxlVGFnID0gdHJ1ZTtcbiAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgIGdldEltcG9ydFJ1bGVUYWcoKS5pbnNlcnRSdWxlcyhpZCArICctaW1wb3J0JywgaW1wb3J0UnVsZXMpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcmVtb3ZlUnVsZXMgPSBmdW5jdGlvbiByZW1vdmVSdWxlcyhpZCkge1xuICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2lkXTtcbiAgICBpZiAobWFya2VyID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgIC8qIGNyZWF0ZSBuZXcgZW1wdHkgdGV4dCBub2RlIGFuZCByZXBsYWNlIHRoZSBjdXJyZW50IG9uZSAqL1xuICAgIHZhciBuZXdNYXJrZXIgPSBtYWtlVGV4dE5vZGUoZWwub3duZXJEb2N1bWVudCwgaWQpO1xuICAgIGVsLnJlcGxhY2VDaGlsZChuZXdNYXJrZXIsIG1hcmtlcik7XG4gICAgbWFya2Vyc1tpZF0gPSBuZXdNYXJrZXI7XG4gICAgcmVzZXRJZE5hbWVzKG5hbWVzLCBpZCk7XG5cbiAgICBpZiAoZXh0cmFjdEltcG9ydCAmJiB1c2VkSW1wb3J0UnVsZVRhZykge1xuICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgZ2V0SW1wb3J0UnVsZVRhZygpLnJlbW92ZVJ1bGVzKGlkICsgJy1pbXBvcnQnKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNzcyA9IGZ1bmN0aW9uIGNzcygpIHtcbiAgICB2YXIgc3RyID0gJyc7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgZm9yICh2YXIgaWQgaW4gbWFya2Vycykge1xuICAgICAgc3RyICs9IG1hcmtlcnNbaWRdLmRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHRocm93IG5ldyBTdHlsZWRDb21wb25lbnRzRXJyb3IoNSk7XG4gICAgfSxcblxuICAgIGNzczogY3NzLFxuICAgIGdldElkczogZ2V0SWRzRnJvbU1hcmtlcnNGYWN0b3J5KG1hcmtlcnMpLFxuICAgIGhhc05hbWVGb3JJZDogaGFzTmFtZUZvcklkKG5hbWVzKSxcbiAgICBpbnNlcnRNYXJrZXI6IGluc2VydE1hcmtlcixcbiAgICBpbnNlcnRSdWxlczogaW5zZXJ0UnVsZXMsXG4gICAgcmVtb3ZlUnVsZXM6IHJlbW92ZVJ1bGVzLFxuICAgIHNlYWxlZDogZmFsc2UsXG4gICAgc3R5bGVUYWc6IGVsLFxuICAgIHRvRWxlbWVudDogd3JhcEFzRWxlbWVudChjc3MsIG5hbWVzKSxcbiAgICB0b0hUTUw6IHdyYXBBc0h0bWxUYWcoY3NzLCBuYW1lcylcbiAgfTtcbn07XG5cbnZhciBtYWtlU2VydmVyVGFnID0gZnVuY3Rpb24gbWFrZVNlcnZlclRhZyhuYW1lc0FyZywgbWFya2Vyc0FyZykge1xuICB2YXIgbmFtZXMgPSBuYW1lc0FyZyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IG5hbWVzQXJnO1xuICB2YXIgbWFya2VycyA9IG1hcmtlcnNBcmcgPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBtYXJrZXJzQXJnO1xuXG4gIHZhciBpbnNlcnRNYXJrZXIgPSBmdW5jdGlvbiBpbnNlcnRNYXJrZXIoaWQpIHtcbiAgICB2YXIgcHJldiA9IG1hcmtlcnNbaWRdO1xuICAgIGlmIChwcmV2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH1cblxuICAgIHJldHVybiBtYXJrZXJzW2lkXSA9IFsnJ107XG4gIH07XG5cbiAgdmFyIGluc2VydFJ1bGVzID0gZnVuY3Rpb24gaW5zZXJ0UnVsZXMoaWQsIGNzc1J1bGVzLCBuYW1lKSB7XG4gICAgdmFyIG1hcmtlciA9IGluc2VydE1hcmtlcihpZCk7XG4gICAgbWFya2VyWzBdICs9IGNzc1J1bGVzLmpvaW4oJyAnKTtcbiAgICBhZGROYW1lRm9ySWQobmFtZXMsIGlkLCBuYW1lKTtcbiAgfTtcblxuICB2YXIgcmVtb3ZlUnVsZXMgPSBmdW5jdGlvbiByZW1vdmVSdWxlcyhpZCkge1xuICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2lkXTtcbiAgICBpZiAobWFya2VyID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBtYXJrZXJbMF0gPSAnJztcbiAgICByZXNldElkTmFtZXMobmFtZXMsIGlkKTtcbiAgfTtcblxuICB2YXIgY3NzID0gZnVuY3Rpb24gY3NzKCkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgZm9yICh2YXIgaWQgaW4gbWFya2Vycykge1xuICAgICAgdmFyIGNzc0ZvcklkID0gbWFya2Vyc1tpZF1bMF07XG4gICAgICBpZiAoY3NzRm9ySWQpIHtcbiAgICAgICAgc3RyICs9IG1ha2VUZXh0TWFya2VyKGlkKSArIGNzc0ZvcklkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIHZhciBjbG9uZSA9IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgIHZhciBuYW1lc0Nsb25lID0gY2xvbmVOYW1lcyhuYW1lcyk7XG4gICAgdmFyIG1hcmtlcnNDbG9uZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgZm9yICh2YXIgaWQgaW4gbWFya2Vycykge1xuICAgICAgbWFya2Vyc0Nsb25lW2lkXSA9IFttYXJrZXJzW2lkXVswXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VTZXJ2ZXJUYWcobmFtZXNDbG9uZSwgbWFya2Vyc0Nsb25lKTtcbiAgfTtcblxuICB2YXIgdGFnID0ge1xuICAgIGNsb25lOiBjbG9uZSxcbiAgICBjc3M6IGNzcyxcbiAgICBnZXRJZHM6IGdldElkc0Zyb21NYXJrZXJzRmFjdG9yeShtYXJrZXJzKSxcbiAgICBoYXNOYW1lRm9ySWQ6IGhhc05hbWVGb3JJZChuYW1lcyksXG4gICAgaW5zZXJ0TWFya2VyOiBpbnNlcnRNYXJrZXIsXG4gICAgaW5zZXJ0UnVsZXM6IGluc2VydFJ1bGVzLFxuICAgIHJlbW92ZVJ1bGVzOiByZW1vdmVSdWxlcyxcbiAgICBzZWFsZWQ6IGZhbHNlLFxuICAgIHN0eWxlVGFnOiBudWxsLFxuICAgIHRvRWxlbWVudDogd3JhcEFzRWxlbWVudChjc3MsIG5hbWVzKSxcbiAgICB0b0hUTUw6IHdyYXBBc0h0bWxUYWcoY3NzLCBuYW1lcylcbiAgfTtcblxuICByZXR1cm4gdGFnO1xufTtcblxudmFyIG1ha2VUYWcgPSBmdW5jdGlvbiBtYWtlVGFnKHRhcmdldCwgdGFnRWwsIGZvcmNlU2VydmVyLCBpbnNlcnRCZWZvcmUsIGdldEltcG9ydFJ1bGVUYWcpIHtcbiAgaWYgKElTX0JST1dTRVIgJiYgIWZvcmNlU2VydmVyKSB7XG4gICAgdmFyIGVsID0gbWFrZVN0eWxlVGFnKHRhcmdldCwgdGFnRWwsIGluc2VydEJlZm9yZSk7XG5cbiAgICBpZiAoRElTQUJMRV9TUEVFRFkpIHtcbiAgICAgIHJldHVybiBtYWtlQnJvd3NlclRhZyhlbCwgZ2V0SW1wb3J0UnVsZVRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtYWtlU3BlZWR5VGFnKGVsLCBnZXRJbXBvcnRSdWxlVGFnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWFrZVNlcnZlclRhZygpO1xufTtcblxudmFyIHJlaHlkcmF0ZSA9IGZ1bmN0aW9uIHJlaHlkcmF0ZSh0YWcsIGVscywgZXh0cmFjdGVkKSB7XG4gIC8qIGFkZCBhbGwgZXh0cmFjdGVkIGNvbXBvbmVudHMgdG8gdGhlIG5ldyB0YWcgKi9cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV4dHJhY3RlZC5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgIHZhciBfZXh0cmFjdGVkJGkgPSBleHRyYWN0ZWRbaV0sXG4gICAgICAgIGNvbXBvbmVudElkID0gX2V4dHJhY3RlZCRpLmNvbXBvbmVudElkLFxuICAgICAgICBjc3NGcm9tRE9NID0gX2V4dHJhY3RlZCRpLmNzc0Zyb21ET007XG5cbiAgICB2YXIgY3NzUnVsZXMgPSBzcGxpdEJ5UnVsZXMoY3NzRnJvbURPTSk7XG4gICAgdGFnLmluc2VydFJ1bGVzKGNvbXBvbmVudElkLCBjc3NSdWxlcyk7XG4gIH1cblxuICAvKiByZW1vdmUgb2xkIEhUTUxTdHlsZUVsZW1lbnRzLCBzaW5jZSB0aGV5IGhhdmUgYmVlbiByZWh5ZHJhdGVkICovXG4gIGZvciAodmFyIF9pID0gMCwgX2xlbiA9IGVscy5sZW5ndGg7IF9pIDwgX2xlbjsgX2kgKz0gMSkge1xuICAgIHZhciBlbCA9IGVsc1tfaV07XG4gICAgaWYgKGVsLnBhcmVudE5vZGUpIHtcbiAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gXG5cbnZhciBTUExJVF9SRUdFWCA9IC9cXHMrLztcblxuLyogZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wb25lbnRzIGJlZm9yZSB0YWdzIGFyZSBzaGFyZGVkICovXG52YXIgTUFYX1NJWkUgPSB2b2lkIDA7XG5pZiAoSVNfQlJPV1NFUikge1xuICAvKiBpbiBzcGVlZHkgbW9kZSB3ZSBjYW4ga2VlcCBhIGxvdCBtb3JlIHJ1bGVzIGluIGEgc2hlZXQgYmVmb3JlIGEgc2xvd2Rvd24gY2FuIGJlIGV4cGVjdGVkICovXG4gIE1BWF9TSVpFID0gRElTQUJMRV9TUEVFRFkgPyA0MCA6IDEwMDA7XG59IGVsc2Uge1xuICAvKiBmb3Igc2VydmVycyB3ZSBkbyBub3QgbmVlZCB0byBzaGFyZCBhdCBhbGwgKi9cbiAgTUFYX1NJWkUgPSAtMTtcbn1cblxudmFyIHNoZWV0UnVubmluZ0lkID0gMDtcbnZhciBtYXN0ZXIgPSB2b2lkIDA7XG5cbnZhciBTdHlsZVNoZWV0ID0gZnVuY3Rpb24gKCkge1xuXG4gIC8qIGEgbWFwIGZyb20gaWRzIHRvIHRhZ3MgKi9cblxuICAvKiBkZWZlcnJlZCBydWxlcyBmb3IgYSBnaXZlbiBpZCAqL1xuXG4gIC8qIHRoaXMgaXMgdXNlZCBmb3Igbm90IHJlaW5qZWN0aW5nIHJ1bGVzIHZpYSBoYXNOYW1lRm9ySWQoKSAqL1xuXG4gIC8qIHdoZW4gcnVsZXMgZm9yIGFuIGlkIGFyZSByZW1vdmVkIHVzaW5nIHJlbW92ZSgpIHdlIGhhdmUgdG8gaWdub3JlIHJlaHlkcmF0ZWROYW1lcyBmb3IgaXQgKi9cblxuICAvKiBhIGxpc3Qgb2YgdGFncyBiZWxvbmdpbmcgdG8gdGhpcyBTdHlsZVNoZWV0ICovXG5cbiAgLyogYSB0YWcgZm9yIGltcG9ydCBydWxlcyAqL1xuXG4gIC8qIGN1cnJlbnQgY2FwYWNpdHkgdW50aWwgYSBuZXcgdGFnIG11c3QgYmUgY3JlYXRlZCAqL1xuXG4gIC8qIGNoaWxkcmVuIChha2EgY2xvbmVzKSBvZiB0aGlzIFN0eWxlU2hlZXQgaW5oZXJpdGluZyBhbGwgYW5kIGZ1dHVyZSBpbmplY3Rpb25zICovXG5cbiAgZnVuY3Rpb24gU3R5bGVTaGVldCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogSVNfQlJPV1NFUiA/IGRvY3VtZW50LmhlYWQgOiBudWxsO1xuICAgIHZhciBmb3JjZVNlcnZlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU3R5bGVTaGVldCk7XG5cbiAgICB0aGlzLmdldEltcG9ydFJ1bGVUYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW1wb3J0UnVsZVRhZyA9IF90aGlzLmltcG9ydFJ1bGVUYWc7XG5cbiAgICAgIGlmIChpbXBvcnRSdWxlVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGltcG9ydFJ1bGVUYWc7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdFRhZyA9IF90aGlzLnRhZ3NbMF07XG4gICAgICB2YXIgaW5zZXJ0QmVmb3JlID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIF90aGlzLmltcG9ydFJ1bGVUYWcgPSBtYWtlVGFnKF90aGlzLnRhcmdldCwgZmlyc3RUYWcgPyBmaXJzdFRhZy5zdHlsZVRhZyA6IG51bGwsIF90aGlzLmZvcmNlU2VydmVyLCBpbnNlcnRCZWZvcmUpO1xuICAgIH07XG5cbiAgICBzaGVldFJ1bm5pbmdJZCArPSAxO1xuICAgIHRoaXMuaWQgPSBzaGVldFJ1bm5pbmdJZDtcbiAgICB0aGlzLmZvcmNlU2VydmVyID0gZm9yY2VTZXJ2ZXI7XG4gICAgdGhpcy50YXJnZXQgPSBmb3JjZVNlcnZlciA/IG51bGwgOiB0YXJnZXQ7XG4gICAgdGhpcy50YWdNYXAgPSB7fTtcbiAgICB0aGlzLmRlZmVycmVkID0ge307XG4gICAgdGhpcy5yZWh5ZHJhdGVkTmFtZXMgPSB7fTtcbiAgICB0aGlzLmlnbm9yZVJlaHlkcmF0ZWROYW1lcyA9IHt9O1xuICAgIHRoaXMudGFncyA9IFtdO1xuICAgIHRoaXMuY2FwYWNpdHkgPSAxO1xuICAgIHRoaXMuY2xvbmVzID0gW107XG4gIH1cblxuICAvKiByZWh5ZHJhdGUgYWxsIFNTUidkIHN0eWxlIHRhZ3MgKi9cblxuXG4gIFN0eWxlU2hlZXQucHJvdG90eXBlLnJlaHlkcmF0ZSA9IGZ1bmN0aW9uIHJlaHlkcmF0ZSQkMSgpIHtcbiAgICBpZiAoIUlTX0JST1dTRVIgfHwgdGhpcy5mb3JjZVNlcnZlcikgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgZWxzID0gW107XG4gICAgdmFyIGV4dHJhY3RlZCA9IFtdO1xuICAgIHZhciBpc1N0cmVhbWVkID0gZmFsc2U7XG5cbiAgICAvKiByZXRyaWV2ZSBhbGwgb2Ygb3VyIFNTUiBzdHlsZSBlbGVtZW50cyBmcm9tIHRoZSBET00gKi9cbiAgICB2YXIgbm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZVsnICsgU0NfQVRUUiArICddWycgKyBTQ19WRVJTSU9OX0FUVFIgKyAnPVwiJyArIFwiNC40LjFcIiArICdcIl0nKTtcblxuICAgIHZhciBub2Rlc1NpemUgPSBub2Rlcy5sZW5ndGg7XG5cbiAgICAvKiBhYm9ydCByZWh5ZHJhdGlvbiBpZiBubyBwcmV2aW91cyBzdHlsZSB0YWdzIHdlcmUgZm91bmQgKi9cbiAgICBpZiAoIW5vZGVzU2l6ZSkgcmV0dXJuIHRoaXM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzU2l6ZTsgaSArPSAxKSB7XG4gICAgICB2YXIgZWwgPSBub2Rlc1tpXTtcblxuICAgICAgLyogY2hlY2sgaWYgc3R5bGUgdGFnIGlzIGEgc3RyZWFtZWQgdGFnICovXG4gICAgICBpZiAoIWlzU3RyZWFtZWQpIGlzU3RyZWFtZWQgPSAhIWVsLmdldEF0dHJpYnV0ZShTQ19TVFJFQU1fQVRUUik7XG5cbiAgICAgIC8qIHJldHJpZXZlIGFsbCBjb21wb25lbnQgbmFtZXMgKi9cbiAgICAgIHZhciBlbE5hbWVzID0gKGVsLmdldEF0dHJpYnV0ZShTQ19BVFRSKSB8fCAnJykudHJpbSgpLnNwbGl0KFNQTElUX1JFR0VYKTtcbiAgICAgIHZhciBlbE5hbWVzU2l6ZSA9IGVsTmFtZXMubGVuZ3RoO1xuICAgICAgZm9yICh2YXIgaiA9IDAsIG5hbWU7IGogPCBlbE5hbWVzU2l6ZTsgaiArPSAxKSB7XG4gICAgICAgIG5hbWUgPSBlbE5hbWVzW2pdO1xuICAgICAgICAvKiBhZGQgcmVoeWRyYXRlZCBuYW1lIHRvIHNoZWV0IHRvIGF2b2lkIHJlLWFkZGluZyBzdHlsZXMgKi9cbiAgICAgICAgdGhpcy5yZWh5ZHJhdGVkTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBleHRyYWN0IGFsbCBjb21wb25lbnRzIGFuZCB0aGVpciBDU1MgKi9cbiAgICAgIGV4dHJhY3RlZC5wdXNoLmFwcGx5KGV4dHJhY3RlZCwgZXh0cmFjdENvbXBzKGVsLnRleHRDb250ZW50KSk7XG5cbiAgICAgIC8qIHN0b3JlIG9yaWdpbmFsIEhUTUxTdHlsZUVsZW1lbnQgKi9cbiAgICAgIGVscy5wdXNoKGVsKTtcbiAgICB9XG5cbiAgICAvKiBhYm9ydCByZWh5ZHJhdGlvbiBpZiBub3RoaW5nIHdhcyBleHRyYWN0ZWQgKi9cbiAgICB2YXIgZXh0cmFjdGVkU2l6ZSA9IGV4dHJhY3RlZC5sZW5ndGg7XG4gICAgaWYgKCFleHRyYWN0ZWRTaXplKSByZXR1cm4gdGhpcztcblxuICAgIC8qIGNyZWF0ZSBhIHRhZyB0byBiZSB1c2VkIGZvciByZWh5ZHJhdGlvbiAqL1xuICAgIHZhciB0YWcgPSB0aGlzLm1ha2VUYWcobnVsbCk7XG5cbiAgICByZWh5ZHJhdGUodGFnLCBlbHMsIGV4dHJhY3RlZCk7XG5cbiAgICAvKiByZXNldCBjYXBhY2l0eSBhbmQgYWRqdXN0IE1BWF9TSVpFIGJ5IHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHJlaHlkcmF0aW9uICovXG4gICAgdGhpcy5jYXBhY2l0eSA9IE1hdGgubWF4KDEsIE1BWF9TSVpFIC0gZXh0cmFjdGVkU2l6ZSk7XG4gICAgdGhpcy50YWdzLnB1c2godGFnKTtcblxuICAgIC8qIHJldHJpZXZlIGFsbCBjb21wb25lbnQgaWRzICovXG4gICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IGV4dHJhY3RlZFNpemU7IF9qICs9IDEpIHtcbiAgICAgIHRoaXMudGFnTWFwW2V4dHJhY3RlZFtfal0uY29tcG9uZW50SWRdID0gdGFnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qIHJldHJpZXZlIGEgXCJtYXN0ZXJcIiBpbnN0YW5jZSBvZiBTdHlsZVNoZWV0IHdoaWNoIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gbm8gb3RoZXIgaXMgYXZhaWxhYmxlXG4gICAqIFRoZSBtYXN0ZXIgU3R5bGVTaGVldCBpcyB0YXJnZXRlZCBieSBjcmVhdGVHbG9iYWxTdHlsZSwga2V5ZnJhbWVzLCBhbmQgY29tcG9uZW50cyBvdXRzaWRlIG9mIGFueVxuICAgICogU3R5bGVTaGVldE1hbmFnZXIncyBjb250ZXh0ICovXG5cblxuICAvKiByZXNldCB0aGUgaW50ZXJuYWwgXCJtYXN0ZXJcIiBpbnN0YW5jZSAqL1xuICBTdHlsZVNoZWV0LnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgdmFyIGZvcmNlU2VydmVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgIG1hc3RlciA9IG5ldyBTdHlsZVNoZWV0KHVuZGVmaW5lZCwgZm9yY2VTZXJ2ZXIpLnJlaHlkcmF0ZSgpO1xuICB9O1xuXG4gIC8qIGFkZHMgXCJjaGlsZHJlblwiIHRvIHRoZSBTdHlsZVNoZWV0IHRoYXQgaW5oZXJpdCBhbGwgb2YgdGhlIHBhcmVudHMnIHJ1bGVzXG4gICAqIHdoaWxlIHRoZWlyIG93biBydWxlcyBkbyBub3QgYWZmZWN0IHRoZSBwYXJlbnQgKi9cblxuXG4gIFN0eWxlU2hlZXQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgdmFyIHNoZWV0ID0gbmV3IFN0eWxlU2hlZXQodGhpcy50YXJnZXQsIHRoaXMuZm9yY2VTZXJ2ZXIpO1xuXG4gICAgLyogYWRkIHRvIGNsb25lIGFycmF5ICovXG4gICAgdGhpcy5jbG9uZXMucHVzaChzaGVldCk7XG5cbiAgICAvKiBjbG9uZSBhbGwgdGFncyAqL1xuICAgIHNoZWV0LnRhZ3MgPSB0aGlzLnRhZ3MubWFwKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgIHZhciBpZHMgPSB0YWcuZ2V0SWRzKCk7XG4gICAgICB2YXIgbmV3VGFnID0gdGFnLmNsb25lKCk7XG5cbiAgICAgIC8qIHJlY29uc3RydWN0IHRhZ01hcCAqL1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgc2hlZXQudGFnTWFwW2lkc1tpXV0gPSBuZXdUYWc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdUYWc7XG4gICAgfSk7XG5cbiAgICAvKiBjbG9uZSBvdGhlciBtYXBzICovXG4gICAgc2hlZXQucmVoeWRyYXRlZE5hbWVzID0gX2V4dGVuZHMoe30sIHRoaXMucmVoeWRyYXRlZE5hbWVzKTtcbiAgICBzaGVldC5kZWZlcnJlZCA9IF9leHRlbmRzKHt9LCB0aGlzLmRlZmVycmVkKTtcblxuICAgIHJldHVybiBzaGVldDtcbiAgfTtcblxuICAvKiBmb3JjZSBTdHlsZVNoZWV0IHRvIGNyZWF0ZSBhIG5ldyB0YWcgb24gdGhlIG5leHQgaW5qZWN0aW9uICovXG5cblxuICBTdHlsZVNoZWV0LnByb3RvdHlwZS5zZWFsQWxsVGFncyA9IGZ1bmN0aW9uIHNlYWxBbGxUYWdzKCkge1xuICAgIHRoaXMuY2FwYWNpdHkgPSAxO1xuXG4gICAgdGhpcy50YWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICB0YWcuc2VhbGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcblxuICBTdHlsZVNoZWV0LnByb3RvdHlwZS5tYWtlVGFnID0gZnVuY3Rpb24gbWFrZVRhZyQkMSh0YWcpIHtcbiAgICB2YXIgbGFzdEVsID0gdGFnID8gdGFnLnN0eWxlVGFnIDogbnVsbDtcbiAgICB2YXIgaW5zZXJ0QmVmb3JlID0gZmFsc2U7XG5cbiAgICByZXR1cm4gbWFrZVRhZyh0aGlzLnRhcmdldCwgbGFzdEVsLCB0aGlzLmZvcmNlU2VydmVyLCBpbnNlcnRCZWZvcmUsIHRoaXMuZ2V0SW1wb3J0UnVsZVRhZyk7XG4gIH07XG5cbiAgLyogZ2V0IGEgdGFnIGZvciBhIGdpdmVuIGNvbXBvbmVudElkLCBhc3NpZ24gdGhlIGNvbXBvbmVudElkIHRvIG9uZSwgb3Igc2hhcmQgKi9cbiAgU3R5bGVTaGVldC5wcm90b3R5cGUuZ2V0VGFnRm9ySWQgPSBmdW5jdGlvbiBnZXRUYWdGb3JJZChpZCkge1xuICAgIC8qIHNpbXBseSByZXR1cm4gYSB0YWcsIHdoZW4gdGhlIGNvbXBvbmVudElkIHdhcyBhbHJlYWR5IGFzc2lnbmVkIG9uZSAqL1xuICAgIHZhciBwcmV2ID0gdGhpcy50YWdNYXBbaWRdO1xuICAgIGlmIChwcmV2ICE9PSB1bmRlZmluZWQgJiYgIXByZXYuc2VhbGVkKSB7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9XG5cbiAgICB2YXIgdGFnID0gdGhpcy50YWdzW3RoaXMudGFncy5sZW5ndGggLSAxXTtcblxuICAgIC8qIHNoYXJkIChjcmVhdGUgYSBuZXcgdGFnKSBpZiB0aGUgdGFnIGlzIGV4aGF1c3RlZCAoU2VlIE1BWF9TSVpFKSAqL1xuICAgIHRoaXMuY2FwYWNpdHkgLT0gMTtcblxuICAgIGlmICh0aGlzLmNhcGFjaXR5ID09PSAwKSB7XG4gICAgICB0aGlzLmNhcGFjaXR5ID0gTUFYX1NJWkU7XG4gICAgICB0YWcgPSB0aGlzLm1ha2VUYWcodGFnKTtcbiAgICAgIHRoaXMudGFncy5wdXNoKHRhZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudGFnTWFwW2lkXSA9IHRhZztcbiAgfTtcblxuICAvKiBtYWlubHkgZm9yIGNyZWF0ZUdsb2JhbFN0eWxlIHRvIGNoZWNrIGZvciBpdHMgaWQgKi9cblxuXG4gIFN0eWxlU2hlZXQucHJvdG90eXBlLmhhc0lkID0gZnVuY3Rpb24gaGFzSWQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy50YWdNYXBbaWRdICE9PSB1bmRlZmluZWQ7XG4gIH07XG5cbiAgLyogY2FjaGluZyBsYXllciBjaGVja2luZyBpZCtuYW1lIHRvIGFscmVhZHkgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgdGFnIGFuZCBpbmplY3RlZCBydWxlcyAqL1xuXG5cbiAgU3R5bGVTaGVldC5wcm90b3R5cGUuaGFzTmFtZUZvcklkID0gZnVuY3Rpb24gaGFzTmFtZUZvcklkKGlkLCBuYW1lKSB7XG4gICAgLyogZXhjZXB0aW9uIGZvciByZWh5ZHJhdGVkIG5hbWVzIHdoaWNoIGFyZSBjaGVja2VkIHNlcGFyYXRlbHkgKi9cbiAgICBpZiAodGhpcy5pZ25vcmVSZWh5ZHJhdGVkTmFtZXNbaWRdID09PSB1bmRlZmluZWQgJiYgdGhpcy5yZWh5ZHJhdGVkTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciB0YWcgPSB0aGlzLnRhZ01hcFtpZF07XG4gICAgcmV0dXJuIHRhZyAhPT0gdW5kZWZpbmVkICYmIHRhZy5oYXNOYW1lRm9ySWQoaWQsIG5hbWUpO1xuICB9O1xuXG4gIC8qIHJlZ2lzdGVycyBhIGNvbXBvbmVudElkIGFuZCByZWdpc3RlcnMgaXQgb24gaXRzIHRhZyAqL1xuXG5cbiAgU3R5bGVTaGVldC5wcm90b3R5cGUuZGVmZXJyZWRJbmplY3QgPSBmdW5jdGlvbiBkZWZlcnJlZEluamVjdChpZCwgY3NzUnVsZXMpIHtcbiAgICAvKiBkb24ndCBpbmplY3Qgd2hlbiB0aGUgaWQgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovXG4gICAgaWYgKHRoaXMudGFnTWFwW2lkXSAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICB2YXIgY2xvbmVzID0gdGhpcy5jbG9uZXM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2xvbmVzW2ldLmRlZmVycmVkSW5qZWN0KGlkLCBjc3NSdWxlcyk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRUYWdGb3JJZChpZCkuaW5zZXJ0TWFya2VyKGlkKTtcbiAgICB0aGlzLmRlZmVycmVkW2lkXSA9IGNzc1J1bGVzO1xuICB9O1xuXG4gIC8qIGluamVjdHMgcnVsZXMgZm9yIGEgZ2l2ZW4gaWQgd2l0aCBhIG5hbWUgdGhhdCB3aWxsIG5lZWQgdG8gYmUgY2FjaGVkICovXG5cblxuICBTdHlsZVNoZWV0LnByb3RvdHlwZS5pbmplY3QgPSBmdW5jdGlvbiBpbmplY3QoaWQsIGNzc1J1bGVzLCBuYW1lKSB7XG4gICAgdmFyIGNsb25lcyA9IHRoaXMuY2xvbmVzO1xuXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2xvbmVzW2ldLmluamVjdChpZCwgY3NzUnVsZXMsIG5hbWUpO1xuICAgIH1cblxuICAgIHZhciB0YWcgPSB0aGlzLmdldFRhZ0ZvcklkKGlkKTtcblxuICAgIC8qIGFkZCBkZWZlcnJlZCBydWxlcyBmb3IgY29tcG9uZW50ICovXG4gICAgaWYgKHRoaXMuZGVmZXJyZWRbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIENvbWJpbmUgcGFzc2VkIGNzc1J1bGVzIHdpdGggcHJldmlvdXNseSBkZWZlcnJlZCBDU1MgcnVsZXNcbiAgICAgIC8vIE5PVEU6IFdlIGNhbm5vdCBtdXRhdGUgdGhlIGRlZmVycmVkIGFycmF5IGl0c2VsZiBhcyBhbGwgY2xvbmVzXG4gICAgICAvLyBkbyB0aGUgc2FtZSAoc2VlIGNsb25lc1tpXS5pbmplY3QpXG4gICAgICB2YXIgcnVsZXMgPSB0aGlzLmRlZmVycmVkW2lkXS5jb25jYXQoY3NzUnVsZXMpO1xuICAgICAgdGFnLmluc2VydFJ1bGVzKGlkLCBydWxlcywgbmFtZSk7XG5cbiAgICAgIHRoaXMuZGVmZXJyZWRbaWRdID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWcuaW5zZXJ0UnVsZXMoaWQsIGNzc1J1bGVzLCBuYW1lKTtcbiAgICB9XG4gIH07XG5cbiAgLyogcmVtb3ZlcyBhbGwgcnVsZXMgZm9yIGEgZ2l2ZW4gaWQsIHdoaWNoIGRvZXNuJ3QgcmVtb3ZlIGl0cyBtYXJrZXIgYnV0IHJlc2V0cyBpdCAqL1xuXG5cbiAgU3R5bGVTaGVldC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKGlkKSB7XG4gICAgdmFyIHRhZyA9IHRoaXMudGFnTWFwW2lkXTtcbiAgICBpZiAodGFnID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgIHZhciBjbG9uZXMgPSB0aGlzLmNsb25lcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xvbmVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjbG9uZXNbaV0ucmVtb3ZlKGlkKTtcbiAgICB9XG5cbiAgICAvKiByZW1vdmUgYWxsIHJ1bGVzIGZyb20gdGhlIHRhZyAqL1xuICAgIHRhZy5yZW1vdmVSdWxlcyhpZCk7XG5cbiAgICAvKiBpZ25vcmUgcG9zc2libGUgcmVoeWRyYXRlZCBuYW1lcyAqL1xuICAgIHRoaXMuaWdub3JlUmVoeWRyYXRlZE5hbWVzW2lkXSA9IHRydWU7XG5cbiAgICAvKiBkZWxldGUgcG9zc2libGUgZGVmZXJyZWQgcnVsZXMgKi9cbiAgICB0aGlzLmRlZmVycmVkW2lkXSA9IHVuZGVmaW5lZDtcbiAgfTtcblxuICBTdHlsZVNoZWV0LnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiB0b0hUTUwoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFncy5tYXAoZnVuY3Rpb24gKHRhZykge1xuICAgICAgcmV0dXJuIHRhZy50b0hUTUwoKTtcbiAgICB9KS5qb2luKCcnKTtcbiAgfTtcblxuICBTdHlsZVNoZWV0LnByb3RvdHlwZS50b1JlYWN0RWxlbWVudHMgPSBmdW5jdGlvbiB0b1JlYWN0RWxlbWVudHMoKSB7XG4gICAgdmFyIGlkID0gdGhpcy5pZDtcblxuXG4gICAgcmV0dXJuIHRoaXMudGFncy5tYXAoZnVuY3Rpb24gKHRhZywgaSkge1xuICAgICAgdmFyIGtleSA9ICdzYy0nICsgaWQgKyAnLScgKyBpO1xuICAgICAgcmV0dXJuIGNsb25lRWxlbWVudCh0YWcudG9FbGVtZW50KCksIHsga2V5OiBrZXkgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY3JlYXRlQ2xhc3MoU3R5bGVTaGVldCwgbnVsbCwgW3tcbiAgICBrZXk6ICdtYXN0ZXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIG1hc3RlciB8fCAobWFzdGVyID0gbmV3IFN0eWxlU2hlZXQoKS5yZWh5ZHJhdGUoKSk7XG4gICAgfVxuXG4gICAgLyogTk9URTogVGhpcyBpcyBqdXN0IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIGplc3Qtc3R5bGVkLWNvbXBvbmVudHMgKi9cblxuICB9LCB7XG4gICAga2V5OiAnaW5zdGFuY2UnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFN0eWxlU2hlZXQubWFzdGVyO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gU3R5bGVTaGVldDtcbn0oKTtcblxuLy8gXG5cbnZhciBLZXlmcmFtZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEtleWZyYW1lcyhuYW1lLCBydWxlcykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBLZXlmcmFtZXMpO1xuXG4gICAgdGhpcy5pbmplY3QgPSBmdW5jdGlvbiAoc3R5bGVTaGVldCkge1xuICAgICAgaWYgKCFzdHlsZVNoZWV0Lmhhc05hbWVGb3JJZChfdGhpcy5pZCwgX3RoaXMubmFtZSkpIHtcbiAgICAgICAgc3R5bGVTaGVldC5pbmplY3QoX3RoaXMuaWQsIF90aGlzLnJ1bGVzLCBfdGhpcy5uYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IG5ldyBTdHlsZWRDb21wb25lbnRzRXJyb3IoMTIsIFN0cmluZyhfdGhpcy5uYW1lKSk7XG4gICAgfTtcblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5ydWxlcyA9IHJ1bGVzO1xuXG4gICAgdGhpcy5pZCA9ICdzYy1rZXlmcmFtZXMtJyArIG5hbWU7XG4gIH1cblxuICBLZXlmcmFtZXMucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbiBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH07XG5cbiAgcmV0dXJuIEtleWZyYW1lcztcbn0oKTtcblxuLy8gXG5cbi8qKlxuICogaW5saW5lZCB2ZXJzaW9uIG9mXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmJqcy9ibG9iL21hc3Rlci9wYWNrYWdlcy9mYmpzL3NyYy9jb3JlL2h5cGhlbmF0ZVN0eWxlTmFtZS5qc1xuICovXG5cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG5cbi8qKlxuICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ2JhY2tncm91bmRDb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ01velRyYW5zaXRpb24nKVxuICogICA8IFwiLW1vei10cmFuc2l0aW9uXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ21zVHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbXMtdHJhbnNpdGlvblwiXG4gKlxuICogQXMgTW9kZXJuaXpyIHN1Z2dlc3RzIChodHRwOi8vbW9kZXJuaXpyLmNvbS9kb2NzLyNwcmVmaXhlZCksIGFuIGBtc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gYC1tcy1gLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgJy0kMScpLnRvTG93ZXJDYXNlKCkucmVwbGFjZShtc1BhdHRlcm4sICctbXMtJyk7XG59XG5cbi8vIFxuXG4vLyBUYWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iL2I4N2FhYmRmZTFiNzQ2MWU3MzMxYWJiMzYwMWQ5ZTZiYjI3NTQ0YmMvcGFja2FnZXMvcmVhY3QtZG9tL3NyYy9zaGFyZWQvZGFuZ2Vyb3VzU3R5bGVWYWx1ZS5qc1xuZnVuY3Rpb24gYWRkVW5pdElmTmVlZGVkKG5hbWUsIHZhbHVlKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbWlsYWphY2svZXNsaW50LXBsdWdpbi1mbG93dHlwZS1lcnJvcnMvaXNzdWVzLzEzM1xuICAvLyAkRmxvd0ZpeE1lXG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSAwICYmICEobmFtZSBpbiB1bml0bGVzcykpIHtcbiAgICByZXR1cm4gdmFsdWUgKyAncHgnOyAvLyBQcmVzdW1lcyBpbXBsaWNpdCAncHgnIHN1ZmZpeCBmb3IgdW5pdGxlc3MgbnVtYmVyc1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkudHJpbSgpO1xufVxuXG4vLyBcblxuLyoqXG4gKiBJdCdzIGZhbHNpc2ggbm90IGZhbHN5IGJlY2F1c2UgMCBpcyBhbGxvd2VkLlxuICovXG52YXIgaXNGYWxzaXNoID0gZnVuY3Rpb24gaXNGYWxzaXNoKGNodW5rKSB7XG4gIHJldHVybiBjaHVuayA9PT0gdW5kZWZpbmVkIHx8IGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSBmYWxzZSB8fCBjaHVuayA9PT0gJyc7XG59O1xuXG52YXIgb2JqVG9Dc3NBcnJheSA9IGZ1bmN0aW9uIG9ialRvQ3NzQXJyYXkob2JqLCBwcmV2S2V5KSB7XG4gIHZhciBydWxlcyA9IFtdO1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIWlzRmFsc2lzaChvYmpba2V5XSkpIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KG9ialtrZXldKSkge1xuICAgICAgICBydWxlcy5wdXNoLmFwcGx5KHJ1bGVzLCBvYmpUb0Nzc0FycmF5KG9ialtrZXldLCBrZXkpKTtcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ob2JqW2tleV0pKSB7XG4gICAgICAgIHJ1bGVzLnB1c2goaHlwaGVuYXRlU3R5bGVOYW1lKGtleSkgKyAnOicsIG9ialtrZXldLCAnOycpO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICAgIH1cbiAgICAgIHJ1bGVzLnB1c2goaHlwaGVuYXRlU3R5bGVOYW1lKGtleSkgKyAnOiAnICsgYWRkVW5pdElmTmVlZGVkKGtleSwgb2JqW2tleV0pICsgJzsnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJ1bGVzO1xuICB9KTtcblxuICByZXR1cm4gcHJldktleSA/IFtwcmV2S2V5ICsgJyB7J10uY29uY2F0KHJ1bGVzLCBbJ30nXSkgOiBydWxlcztcbn07XG5cbmZ1bmN0aW9uIGZsYXR0ZW4oY2h1bmssIGV4ZWN1dGlvbkNvbnRleHQsIHN0eWxlU2hlZXQpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2h1bmspKSB7XG4gICAgdmFyIHJ1bGVTZXQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGgsIHJlc3VsdDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICByZXN1bHQgPSBmbGF0dGVuKGNodW5rW2ldLCBleGVjdXRpb25Db250ZXh0LCBzdHlsZVNoZWV0KTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgY29udGludWU7ZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSBydWxlU2V0LnB1c2guYXBwbHkocnVsZVNldCwgcmVzdWx0KTtlbHNlIHJ1bGVTZXQucHVzaChyZXN1bHQpO1xuICAgIH1cblxuICAgIHJldHVybiBydWxlU2V0O1xuICB9XG5cbiAgaWYgKGlzRmFsc2lzaChjaHVuaykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qIEhhbmRsZSBvdGhlciBjb21wb25lbnRzICovXG4gIGlmIChpc1N0eWxlZENvbXBvbmVudChjaHVuaykpIHtcbiAgICByZXR1cm4gJy4nICsgY2h1bmsuc3R5bGVkQ29tcG9uZW50SWQ7XG4gIH1cblxuICAvKiBFaXRoZXIgZXhlY3V0ZSBvciBkZWZlciB0aGUgZnVuY3Rpb24gKi9cbiAgaWYgKGlzRnVuY3Rpb24oY2h1bmspKSB7XG4gICAgaWYgKGlzU3RhdGVsZXNzRnVuY3Rpb24oY2h1bmspICYmIGV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHZhciBfcmVzdWx0ID0gY2h1bmsoZXhlY3V0aW9uQ29udGV4dCk7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGlzRWxlbWVudChfcmVzdWx0KSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oZ2V0Q29tcG9uZW50TmFtZShjaHVuaykgKyAnIGlzIG5vdCBhIHN0eWxlZCBjb21wb25lbnQgYW5kIGNhbm5vdCBiZSByZWZlcnJlZCB0byB2aWEgY29tcG9uZW50IHNlbGVjdG9yLiBTZWUgaHR0cHM6Ly93d3cuc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYWR2YW5jZWQjcmVmZXJyaW5nLXRvLW90aGVyLWNvbXBvbmVudHMgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZsYXR0ZW4oX3Jlc3VsdCwgZXhlY3V0aW9uQ29udGV4dCwgc3R5bGVTaGVldCk7XG4gICAgfSBlbHNlIHJldHVybiBjaHVuaztcbiAgfVxuXG4gIGlmIChjaHVuayBpbnN0YW5jZW9mIEtleWZyYW1lcykge1xuICAgIGlmIChzdHlsZVNoZWV0KSB7XG4gICAgICBjaHVuay5pbmplY3Qoc3R5bGVTaGVldCk7XG4gICAgICByZXR1cm4gY2h1bmsuZ2V0TmFtZSgpO1xuICAgIH0gZWxzZSByZXR1cm4gY2h1bms7XG4gIH1cblxuICAvKiBIYW5kbGUgb2JqZWN0cyAqL1xuICByZXR1cm4gaXNQbGFpbk9iamVjdChjaHVuaykgPyBvYmpUb0Nzc0FycmF5KGNodW5rKSA6IGNodW5rLnRvU3RyaW5nKCk7XG59XG5cbi8vIFxuXG5mdW5jdGlvbiBjc3Moc3R5bGVzKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBpbnRlcnBvbGF0aW9ucyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBpbnRlcnBvbGF0aW9uc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoaXNGdW5jdGlvbihzdHlsZXMpIHx8IGlzUGxhaW5PYmplY3Qoc3R5bGVzKSkge1xuICAgIC8vICRGbG93Rml4TWVcbiAgICByZXR1cm4gZmxhdHRlbihpbnRlcmxlYXZlKEVNUFRZX0FSUkFZLCBbc3R5bGVzXS5jb25jYXQoaW50ZXJwb2xhdGlvbnMpKSk7XG4gIH1cblxuICAvLyAkRmxvd0ZpeE1lXG4gIHJldHVybiBmbGF0dGVuKGludGVybGVhdmUoc3R5bGVzLCBpbnRlcnBvbGF0aW9ucykpO1xufVxuXG4vLyBcblxuZnVuY3Rpb24gY29uc3RydWN0V2l0aE9wdGlvbnMoY29tcG9uZW50Q29uc3RydWN0b3IsIHRhZykge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogRU1QVFlfT0JKRUNUO1xuXG4gIGlmICghaXNWYWxpZEVsZW1lbnRUeXBlKHRhZykpIHtcbiAgICB0aHJvdyBuZXcgU3R5bGVkQ29tcG9uZW50c0Vycm9yKDEsIFN0cmluZyh0YWcpKTtcbiAgfVxuXG4gIC8qIFRoaXMgaXMgY2FsbGFibGUgZGlyZWN0bHkgYXMgYSB0ZW1wbGF0ZSBmdW5jdGlvbiAqL1xuICAvLyAkRmxvd0ZpeE1lOiBOb3QgdHlwZWQgdG8gYXZvaWQgZGVzdHJ1Y3R1cmluZyBhcmd1bWVudHNcbiAgdmFyIHRlbXBsYXRlRnVuY3Rpb24gPSBmdW5jdGlvbiB0ZW1wbGF0ZUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjb21wb25lbnRDb25zdHJ1Y3Rvcih0YWcsIG9wdGlvbnMsIGNzcy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cykpO1xuICB9O1xuXG4gIC8qIElmIGNvbmZpZyBtZXRob2RzIGFyZSBjYWxsZWQsIHdyYXAgdXAgYSBuZXcgdGVtcGxhdGUgZnVuY3Rpb24gYW5kIG1lcmdlIG9wdGlvbnMgKi9cbiAgdGVtcGxhdGVGdW5jdGlvbi53aXRoQ29uZmlnID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIHJldHVybiBjb25zdHJ1Y3RXaXRoT3B0aW9ucyhjb21wb25lbnRDb25zdHJ1Y3RvciwgdGFnLCBfZXh0ZW5kcyh7fSwgb3B0aW9ucywgY29uZmlnKSk7XG4gIH07XG5cbiAgLyogTW9kaWZ5L2luamVjdCBuZXcgcHJvcHMgYXQgcnVudGltZSAqL1xuICB0ZW1wbGF0ZUZ1bmN0aW9uLmF0dHJzID0gZnVuY3Rpb24gKGF0dHJzKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdFdpdGhPcHRpb25zKGNvbXBvbmVudENvbnN0cnVjdG9yLCB0YWcsIF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBhdHRyczogQXJyYXkucHJvdG90eXBlLmNvbmNhdChvcHRpb25zLmF0dHJzLCBhdHRycykuZmlsdGVyKEJvb2xlYW4pXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiB0ZW1wbGF0ZUZ1bmN0aW9uO1xufVxuXG4vLyBcbi8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2dhcnljb3VydC9tdXJtdXJoYXNoLWpzL2Jsb2IvbWFzdGVyL211cm11cmhhc2gyX2djLmpzXG5mdW5jdGlvbiBtdXJtdXJoYXNoKGMpIHtcbiAgZm9yICh2YXIgZSA9IGMubGVuZ3RoIHwgMCwgYSA9IGUgfCAwLCBkID0gMCwgYjsgZSA+PSA0Oykge1xuICAgIGIgPSBjLmNoYXJDb2RlQXQoZCkgJiAyNTUgfCAoYy5jaGFyQ29kZUF0KCsrZCkgJiAyNTUpIDw8IDggfCAoYy5jaGFyQ29kZUF0KCsrZCkgJiAyNTUpIDw8IDE2IHwgKGMuY2hhckNvZGVBdCgrK2QpICYgMjU1KSA8PCAyNCwgYiA9IDE1NDA0ODM0NzcgKiAoYiAmIDY1NTM1KSArICgoMTU0MDQ4MzQ3NyAqIChiID4+PiAxNikgJiA2NTUzNSkgPDwgMTYpLCBiIF49IGIgPj4+IDI0LCBiID0gMTU0MDQ4MzQ3NyAqIChiICYgNjU1MzUpICsgKCgxNTQwNDgzNDc3ICogKGIgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNiksIGEgPSAxNTQwNDgzNDc3ICogKGEgJiA2NTUzNSkgKyAoKDE1NDA0ODM0NzcgKiAoYSA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSBeIGIsIGUgLT0gNCwgKytkO1xuICB9XG4gIHN3aXRjaCAoZSkge1xuICAgIGNhc2UgMzpcbiAgICAgIGEgXj0gKGMuY2hhckNvZGVBdChkICsgMikgJiAyNTUpIDw8IDE2O1xuICAgIGNhc2UgMjpcbiAgICAgIGEgXj0gKGMuY2hhckNvZGVBdChkICsgMSkgJiAyNTUpIDw8IDg7XG4gICAgY2FzZSAxOlxuICAgICAgYSBePSBjLmNoYXJDb2RlQXQoZCkgJiAyNTUsIGEgPSAxNTQwNDgzNDc3ICogKGEgJiA2NTUzNSkgKyAoKDE1NDA0ODM0NzcgKiAoYSA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KTtcbiAgfVxuICBhIF49IGEgPj4+IDEzO1xuICBhID0gMTU0MDQ4MzQ3NyAqIChhICYgNjU1MzUpICsgKCgxNTQwNDgzNDc3ICogKGEgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNik7XG4gIHJldHVybiAoYSBeIGEgPj4+IDE1KSA+Pj4gMDtcbn1cblxuLy8gXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5cbi8qIFRoaXMgaXMgdGhlIFwiY2FwYWNpdHlcIiBvZiBvdXIgYWxwaGFiZXQgaS5lLiAyeDI2IGZvciBhbGwgbGV0dGVycyBwbHVzIHRoZWlyIGNhcGl0YWxpc2VkXG4gKiBjb3VudGVycGFydHMgKi9cbnZhciBjaGFyc0xlbmd0aCA9IDUyO1xuXG4vKiBzdGFydCBhdCA3NSBmb3IgJ2EnIHVudGlsICd6JyAoMjUpIGFuZCB0aGVuIHN0YXJ0IGF0IDY1IGZvciBjYXBpdGFsaXNlZCBsZXR0ZXJzICovXG52YXIgZ2V0QWxwaGFiZXRpY0NoYXIgPSBmdW5jdGlvbiBnZXRBbHBoYWJldGljQ2hhcihjb2RlKSB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUgKyAoY29kZSA+IDI1ID8gMzkgOiA5NykpO1xufTtcblxuLyogaW5wdXQgYSBudW1iZXIsIHVzdWFsbHkgYSBoYXNoIGFuZCBjb252ZXJ0IGl0IHRvIGJhc2UtNTIgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQWxwaGFiZXRpY05hbWUoY29kZSkge1xuICB2YXIgbmFtZSA9ICcnO1xuICB2YXIgeCA9IHZvaWQgMDtcblxuICAvKiBnZXQgYSBjaGFyIGFuZCBkaXZpZGUgYnkgYWxwaGFiZXQtbGVuZ3RoICovXG4gIGZvciAoeCA9IGNvZGU7IHggPiBjaGFyc0xlbmd0aDsgeCA9IE1hdGguZmxvb3IoeCAvIGNoYXJzTGVuZ3RoKSkge1xuICAgIG5hbWUgPSBnZXRBbHBoYWJldGljQ2hhcih4ICUgY2hhcnNMZW5ndGgpICsgbmFtZTtcbiAgfVxuXG4gIHJldHVybiBnZXRBbHBoYWJldGljQ2hhcih4ICUgY2hhcnNMZW5ndGgpICsgbmFtZTtcbn1cblxuLy8gXG5cbmZ1bmN0aW9uIGhhc0Z1bmN0aW9uT2JqZWN0S2V5KG9iaikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluLCBuby1yZXN0cmljdGVkLXN5bnRheFxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqW2tleV0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU3RhdGljUnVsZXMocnVsZXMsIGF0dHJzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgcnVsZSA9IHJ1bGVzW2ldO1xuXG4gICAgLy8gcmVjdXJzaXZlIGNhc2VcbiAgICBpZiAoQXJyYXkuaXNBcnJheShydWxlKSAmJiAhaXNTdGF0aWNSdWxlcyhydWxlLCBhdHRycykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocnVsZSkgJiYgIWlzU3R5bGVkQ29tcG9uZW50KHJ1bGUpKSB7XG4gICAgICAvLyBmdW5jdGlvbnMgYXJlIGFsbG93ZWQgdG8gYmUgc3RhdGljIGlmIHRoZXkncmUganVzdCBiZWluZ1xuICAgICAgLy8gdXNlZCB0byBnZXQgdGhlIGNsYXNzbmFtZSBvZiBhIG5lc3RlZCBzdHlsZWQgY29tcG9uZW50XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKGF0dHJzLnNvbWUoZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gaXNGdW5jdGlvbih4KSB8fCBoYXNGdW5jdGlvbk9iamVjdEtleSh4KTtcbiAgfSkpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gXG5cbi8qIGNvbWJpbmVzIGhhc2hTdHIgKG11cm11cmhhc2gpIGFuZCBuYW1lR2VuZXJhdG9yIGZvciBjb252ZW5pZW5jZSAqL1xudmFyIGhhc2hlciA9IGZ1bmN0aW9uIGhhc2hlcihzdHIpIHtcbiAgcmV0dXJuIGdlbmVyYXRlQWxwaGFiZXRpY05hbWUobXVybXVyaGFzaChzdHIpKTtcbn07XG5cbi8qXG4gQ29tcG9uZW50U3R5bGUgaXMgYWxsIHRoZSBDU1Mtc3BlY2lmaWMgc3R1ZmYsIG5vdFxuIHRoZSBSZWFjdC1zcGVjaWZpYyBzdHVmZi5cbiAqL1xuXG52YXIgQ29tcG9uZW50U3R5bGUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbXBvbmVudFN0eWxlKHJ1bGVzLCBhdHRycywgY29tcG9uZW50SWQpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wb25lbnRTdHlsZSk7XG5cbiAgICB0aGlzLnJ1bGVzID0gcnVsZXM7XG4gICAgdGhpcy5pc1N0YXRpYyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgJiYgaXNTdGF0aWNSdWxlcyhydWxlcywgYXR0cnMpO1xuICAgIHRoaXMuY29tcG9uZW50SWQgPSBjb21wb25lbnRJZDtcblxuICAgIGlmICghU3R5bGVTaGVldC5tYXN0ZXIuaGFzSWQoY29tcG9uZW50SWQpKSB7XG4gICAgICBTdHlsZVNoZWV0Lm1hc3Rlci5kZWZlcnJlZEluamVjdChjb21wb25lbnRJZCwgW10pO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIEZsYXR0ZW5zIGEgcnVsZSBzZXQgaW50byB2YWxpZCBDU1NcbiAgICogSGFzaGVzIGl0LCB3cmFwcyB0aGUgd2hvbGUgY2h1bmsgaW4gYSAuaGFzaDEyMzQge31cbiAgICogUmV0dXJucyB0aGUgaGFzaCB0byBiZSBpbmplY3RlZCBvbiByZW5kZXIoKVxuICAgKiAqL1xuXG5cbiAgQ29tcG9uZW50U3R5bGUucHJvdG90eXBlLmdlbmVyYXRlQW5kSW5qZWN0U3R5bGVzID0gZnVuY3Rpb24gZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXMoZXhlY3V0aW9uQ29udGV4dCwgc3R5bGVTaGVldCkge1xuICAgIHZhciBpc1N0YXRpYyA9IHRoaXMuaXNTdGF0aWMsXG4gICAgICAgIGNvbXBvbmVudElkID0gdGhpcy5jb21wb25lbnRJZCxcbiAgICAgICAgbGFzdENsYXNzTmFtZSA9IHRoaXMubGFzdENsYXNzTmFtZTtcblxuICAgIGlmIChJU19CUk9XU0VSICYmIGlzU3RhdGljICYmIHR5cGVvZiBsYXN0Q2xhc3NOYW1lID09PSAnc3RyaW5nJyAmJiBzdHlsZVNoZWV0Lmhhc05hbWVGb3JJZChjb21wb25lbnRJZCwgbGFzdENsYXNzTmFtZSkpIHtcbiAgICAgIHJldHVybiBsYXN0Q2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHZhciBmbGF0Q1NTID0gZmxhdHRlbih0aGlzLnJ1bGVzLCBleGVjdXRpb25Db250ZXh0LCBzdHlsZVNoZWV0KTtcbiAgICB2YXIgbmFtZSA9IGhhc2hlcih0aGlzLmNvbXBvbmVudElkICsgZmxhdENTUy5qb2luKCcnKSk7XG4gICAgaWYgKCFzdHlsZVNoZWV0Lmhhc05hbWVGb3JJZChjb21wb25lbnRJZCwgbmFtZSkpIHtcbiAgICAgIHN0eWxlU2hlZXQuaW5qZWN0KHRoaXMuY29tcG9uZW50SWQsIHN0cmluZ2lmeVJ1bGVzKGZsYXRDU1MsICcuJyArIG5hbWUsIHVuZGVmaW5lZCwgY29tcG9uZW50SWQpLCBuYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RDbGFzc05hbWUgPSBuYW1lO1xuICAgIHJldHVybiBuYW1lO1xuICB9O1xuXG4gIENvbXBvbmVudFN0eWxlLmdlbmVyYXRlTmFtZSA9IGZ1bmN0aW9uIGdlbmVyYXRlTmFtZShzdHIpIHtcbiAgICByZXR1cm4gaGFzaGVyKHN0cik7XG4gIH07XG5cbiAgcmV0dXJuIENvbXBvbmVudFN0eWxlO1xufSgpO1xuXG4vLyBcblxudmFyIExJTUlUID0gMjAwO1xuXG52YXIgY3JlYXRlV2FyblRvb01hbnlDbGFzc2VzID0gKGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkge1xuICB2YXIgZ2VuZXJhdGVkQ2xhc3NlcyA9IHt9O1xuICB2YXIgd2FybmluZ1NlZW4gPSBmYWxzZTtcblxuICByZXR1cm4gZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgIGlmICghd2FybmluZ1NlZW4pIHtcbiAgICAgIGdlbmVyYXRlZENsYXNzZXNbY2xhc3NOYW1lXSA9IHRydWU7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoZ2VuZXJhdGVkQ2xhc3NlcykubGVuZ3RoID49IExJTUlUKSB7XG4gICAgICAgIC8vIFVuYWJsZSB0byBmaW5kIGxhdGVzdFJ1bGUgaW4gdGVzdCBlbnZpcm9ubWVudC5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSwgcHJlZmVyLXRlbXBsYXRlICovXG4gICAgICAgIGNvbnNvbGUud2FybignT3ZlciAnICsgTElNSVQgKyAnIGNsYXNzZXMgd2VyZSBnZW5lcmF0ZWQgZm9yIGNvbXBvbmVudCAnICsgZGlzcGxheU5hbWUgKyAnLiBcXG4nICsgJ0NvbnNpZGVyIHVzaW5nIHRoZSBhdHRycyBtZXRob2QsIHRvZ2V0aGVyIHdpdGggYSBzdHlsZSBvYmplY3QgZm9yIGZyZXF1ZW50bHkgY2hhbmdlZCBzdHlsZXMuXFxuJyArICdFeGFtcGxlOlxcbicgKyAnICBjb25zdCBDb21wb25lbnQgPSBzdHlsZWQuZGl2LmF0dHJzKHByb3BzID0+ICh7XFxuJyArICcgICAgc3R5bGU6IHtcXG4nICsgJyAgICAgIGJhY2tncm91bmQ6IHByb3BzLmJhY2tncm91bmQsXFxuJyArICcgICAgfSxcXG4nICsgJyAgfSkpYHdpZHRoOiAxMDAlO2BcXG5cXG4nICsgJyAgPENvbXBvbmVudCAvPicpO1xuICAgICAgICB3YXJuaW5nU2VlbiA9IHRydWU7XG4gICAgICAgIGdlbmVyYXRlZENsYXNzZXMgPSB7fTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59KTtcblxuLy8gXG5cbnZhciBkZXRlcm1pbmVUaGVtZSA9IChmdW5jdGlvbiAocHJvcHMsIGZhbGxiYWNrVGhlbWUpIHtcbiAgdmFyIGRlZmF1bHRQcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogRU1QVFlfT0JKRUNUO1xuXG4gIC8vIFByb3BzIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBUaGVtZVByb3ZpZGVyLCB3aGljaCBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXJcbiAgLy8gZGVmYXVsdFByb3BzLCBidXQgUmVhY3QgYXV0b21hdGljYWxseSBwdXRzIGRlZmF1bHRQcm9wcyBvbiBwcm9wcy5cblxuICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9wcm9wLXR5cGVzLCBmbG93dHlwZS1lcnJvcnMvc2hvdy1lcnJvcnMgKi9cbiAgdmFyIGlzRGVmYXVsdFRoZW1lID0gZGVmYXVsdFByb3BzID8gcHJvcHMudGhlbWUgPT09IGRlZmF1bHRQcm9wcy50aGVtZSA6IGZhbHNlO1xuICB2YXIgdGhlbWUgPSBwcm9wcy50aGVtZSAmJiAhaXNEZWZhdWx0VGhlbWUgPyBwcm9wcy50aGVtZSA6IGZhbGxiYWNrVGhlbWUgfHwgZGVmYXVsdFByb3BzLnRoZW1lO1xuICAvKiBlc2xpbnQtZW5hYmxlICovXG5cbiAgcmV0dXJuIHRoZW1lO1xufSk7XG5cbi8vIFxudmFyIGVzY2FwZVJlZ2V4ID0gL1tbXFxdLiMqJD48K349fF46KCksXCInYC1dKy9nO1xudmFyIGRhc2hlc0F0RW5kcyA9IC8oXi18LSQpL2c7XG5cbi8qKlxuICogVE9ETzogRXhwbG9yZSB1c2luZyBDU1MuZXNjYXBlIHdoZW4gaXQgYmVjb21lcyBtb3JlIGF2YWlsYWJsZVxuICogaW4gZXZlcmdyZWVuIGJyb3dzZXJzLlxuICovXG5mdW5jdGlvbiBlc2NhcGUoc3RyKSB7XG4gIHJldHVybiBzdHJcbiAgLy8gUmVwbGFjZSBhbGwgcG9zc2libGUgQ1NTIHNlbGVjdG9yc1xuICAucmVwbGFjZShlc2NhcGVSZWdleCwgJy0nKVxuXG4gIC8vIFJlbW92ZSBleHRyYW5lb3VzIGh5cGhlbnMgYXQgdGhlIHN0YXJ0IGFuZCBlbmRcbiAgLnJlcGxhY2UoZGFzaGVzQXRFbmRzLCAnJyk7XG59XG5cbi8vIFxuXG5mdW5jdGlvbiBpc1RhZyh0YXJnZXQpIHtcbiAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnICYmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gdGFyZ2V0LmNoYXJBdCgwKSA9PT0gdGFyZ2V0LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpIDogdHJ1ZSk7XG59XG5cbi8vIFxuXG5mdW5jdGlvbiBnZW5lcmF0ZURpc3BsYXlOYW1lKHRhcmdldCkge1xuICAvLyAkRmxvd0ZpeE1lXG4gIHJldHVybiBpc1RhZyh0YXJnZXQpID8gJ3N0eWxlZC4nICsgdGFyZ2V0IDogJ1N0eWxlZCgnICsgZ2V0Q29tcG9uZW50TmFtZSh0YXJnZXQpICsgJyknO1xufVxuXG52YXIgX1RZUEVfU1RBVElDUztcblxudmFyIFJFQUNUX1NUQVRJQ1MgPSB7XG4gIGNoaWxkQ29udGV4dFR5cGVzOiB0cnVlLFxuICBjb250ZXh0VHlwZXM6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xuXG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xuXG52YXIgVFlQRV9TVEFUSUNTID0gKF9UWVBFX1NUQVRJQ1MgPSB7fSwgX1RZUEVfU1RBVElDU1tGb3J3YXJkUmVmXSA9IHtcbiAgJCR0eXBlb2Y6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZVxufSwgX1RZUEVfU1RBVElDUyk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSQxID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LFxuICAgIGdldE93blByb3BlcnR5TmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgICBfT2JqZWN0JGdldE93blByb3BlcnQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICAgIGdldE93blByb3BlcnR5U3ltYm9scyA9IF9PYmplY3QkZ2V0T3duUHJvcGVydCA9PT0gdW5kZWZpbmVkID8gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gW107XG59IDogX09iamVjdCRnZXRPd25Qcm9wZXJ0LFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gICAgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsXG4gICAgb2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBhcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuXG5mdW5jdGlvbiBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIHNvdXJjZUNvbXBvbmVudCwgYmxhY2tsaXN0KSB7XG4gIGlmICh0eXBlb2Ygc291cmNlQ29tcG9uZW50ICE9PSAnc3RyaW5nJykge1xuICAgIC8vIGRvbid0IGhvaXN0IG92ZXIgc3RyaW5nIChodG1sKSBjb21wb25lbnRzXG5cbiAgICB2YXIgaW5oZXJpdGVkQ29tcG9uZW50ID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlQ29tcG9uZW50KTtcblxuICAgIGlmIChpbmhlcml0ZWRDb21wb25lbnQgJiYgaW5oZXJpdGVkQ29tcG9uZW50ICE9PSBvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50LCBibGFja2xpc3QpO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gYXJyYXlQcm90b3R5cGUuY29uY2F0KGdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ29tcG9uZW50KSxcbiAgICAvLyAkRmxvd0ZpeE1lXG4gICAgZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZUNvbXBvbmVudCkpO1xuXG4gICAgdmFyIHRhcmdldFN0YXRpY3MgPSBUWVBFX1NUQVRJQ1NbdGFyZ2V0Q29tcG9uZW50LiQkdHlwZW9mXSB8fCBSRUFDVF9TVEFUSUNTO1xuXG4gICAgdmFyIHNvdXJjZVN0YXRpY3MgPSBUWVBFX1NUQVRJQ1Nbc291cmNlQ29tcG9uZW50LiQkdHlwZW9mXSB8fCBSRUFDVF9TVEFUSUNTO1xuXG4gICAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHZvaWQgMDtcbiAgICB2YXIga2V5ID0gdm9pZCAwO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKFxuICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgIUtOT1dOX1NUQVRJQ1Nba2V5XSAmJiAhKGJsYWNrbGlzdCAmJiBibGFja2xpc3Rba2V5XSkgJiYgIShzb3VyY2VTdGF0aWNzICYmIHNvdXJjZVN0YXRpY3Nba2V5XSkgJiZcbiAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICEodGFyZ2V0U3RhdGljcyAmJiB0YXJnZXRTdGF0aWNzW2tleV0pKSB7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlQ29tcG9uZW50LCBrZXkpO1xuXG4gICAgICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGZhaWx1cmVzIGZyb20gcmVhZC1vbmx5IHByb3BlcnRpZXNcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnR5JDEodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8qIGZhaWwgc2lsZW50bHkgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldENvbXBvbmVudDtcbn1cblxuLy8gXG5mdW5jdGlvbiBpc0Rlcml2ZWRSZWFjdENvbXBvbmVudChmbikge1xuICByZXR1cm4gISEoZm4gJiYgZm4ucHJvdG90eXBlICYmIGZuLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuLy8gXG4vLyBIZWxwZXIgdG8gY2FsbCBhIGdpdmVuIGZ1bmN0aW9uLCBvbmx5IG9uY2VcbnZhciBvbmNlID0gKGZ1bmN0aW9uIChjYikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIGNiLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICB9XG4gIH07XG59KTtcblxuLy8gXG5cbnZhciBUaGVtZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0KCk7XG5cbnZhciBUaGVtZUNvbnN1bWVyID0gVGhlbWVDb250ZXh0LkNvbnN1bWVyO1xuXG4vKipcbiAqIFByb3ZpZGUgYSB0aGVtZSB0byBhbiBlbnRpcmUgcmVhY3QgY29tcG9uZW50IHRyZWUgdmlhIGNvbnRleHRcbiAqL1xuXG52YXIgVGhlbWVQcm92aWRlciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKFRoZW1lUHJvdmlkZXIsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRoZW1lUHJvdmlkZXIocHJvcHMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUaGVtZVByb3ZpZGVyKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSk7XG5cbiAgICBfdGhpcy5nZXRDb250ZXh0ID0gbWVtb2l6ZShfdGhpcy5nZXRDb250ZXh0LmJpbmQoX3RoaXMpKTtcbiAgICBfdGhpcy5yZW5kZXJJbm5lciA9IF90aGlzLnJlbmRlcklubmVyLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFRoZW1lUHJvdmlkZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuY2hpbGRyZW4pIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICBUaGVtZUNvbnRleHQuQ29uc3VtZXIsXG4gICAgICBudWxsLFxuICAgICAgdGhpcy5yZW5kZXJJbm5lclxuICAgICk7XG4gIH07XG5cbiAgVGhlbWVQcm92aWRlci5wcm90b3R5cGUucmVuZGVySW5uZXIgPSBmdW5jdGlvbiByZW5kZXJJbm5lcihvdXRlclRoZW1lKSB7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQodGhpcy5wcm9wcy50aGVtZSwgb3V0ZXJUaGVtZSk7XG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgIFRoZW1lQ29udGV4dC5Qcm92aWRlcixcbiAgICAgIHsgdmFsdWU6IGNvbnRleHQgfSxcbiAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRoZW1lIGZyb20gdGhlIHByb3BzLCBzdXBwb3J0aW5nIGJvdGggKG91dGVyVGhlbWUpID0+IHt9XG4gICAqIGFzIHdlbGwgYXMgb2JqZWN0IG5vdGF0aW9uXG4gICAqL1xuXG5cbiAgVGhlbWVQcm92aWRlci5wcm90b3R5cGUuZ2V0VGhlbWUgPSBmdW5jdGlvbiBnZXRUaGVtZSh0aGVtZSwgb3V0ZXJUaGVtZSkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHRoZW1lKSkge1xuICAgICAgdmFyIG1lcmdlZFRoZW1lID0gdGhlbWUob3V0ZXJUaGVtZSk7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIChtZXJnZWRUaGVtZSA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG1lcmdlZFRoZW1lKSB8fCAodHlwZW9mIG1lcmdlZFRoZW1lID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihtZXJnZWRUaGVtZSkpICE9PSAnb2JqZWN0JykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0eWxlZENvbXBvbmVudHNFcnJvcig3KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1lcmdlZFRoZW1lO1xuICAgIH1cblxuICAgIGlmICh0aGVtZSA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHRoZW1lKSB8fCAodHlwZW9mIHRoZW1lID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih0aGVtZSkpICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFN0eWxlZENvbXBvbmVudHNFcnJvcig4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2V4dGVuZHMoe30sIG91dGVyVGhlbWUsIHRoZW1lKTtcbiAgfTtcblxuICBUaGVtZVByb3ZpZGVyLnByb3RvdHlwZS5nZXRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q29udGV4dCh0aGVtZSwgb3V0ZXJUaGVtZSkge1xuICAgIHJldHVybiB0aGlzLmdldFRoZW1lKHRoZW1lLCBvdXRlclRoZW1lKTtcbiAgfTtcblxuICByZXR1cm4gVGhlbWVQcm92aWRlcjtcbn0oQ29tcG9uZW50KTtcblxuLy8gXG5cbnZhciBDTE9TSU5HX1RBR19SID0gL15cXHMqPFxcL1thLXpdL2k7XG5cbnZhciBTZXJ2ZXJTdHlsZVNoZWV0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTZXJ2ZXJTdHlsZVNoZWV0KCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNlcnZlclN0eWxlU2hlZXQpO1xuXG4gICAgLyogVGhlIG1hc3RlciBzaGVldCBtaWdodCBiZSByZXNldCwgc28ga2VlcCBhIHJlZmVyZW5jZSBoZXJlICovXG4gICAgdGhpcy5tYXN0ZXJTaGVldCA9IFN0eWxlU2hlZXQubWFzdGVyO1xuICAgIHRoaXMuaW5zdGFuY2UgPSB0aGlzLm1hc3RlclNoZWV0LmNsb25lKCk7XG4gICAgdGhpcy5zZWFsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrIHRoZSBTZXJ2ZXJTdHlsZVNoZWV0IGFzIGJlaW5nIGZ1bGx5IGVtaXR0ZWQgYW5kIG1hbnVhbGx5IEdDIGl0IGZyb20gdGhlXG4gICAqIFN0eWxlU2hlZXQgc2luZ2xldG9uLlxuICAgKi9cblxuXG4gIFNlcnZlclN0eWxlU2hlZXQucHJvdG90eXBlLnNlYWwgPSBmdW5jdGlvbiBzZWFsKCkge1xuICAgIGlmICghdGhpcy5zZWFsZWQpIHtcbiAgICAgIC8qIFJlbW92ZSBzZWFsZWQgU3R5bGVTaGVldHMgZnJvbSB0aGUgbWFzdGVyIHNoZWV0ICovXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLm1hc3RlclNoZWV0LmNsb25lcy5pbmRleE9mKHRoaXMuaW5zdGFuY2UpO1xuICAgICAgdGhpcy5tYXN0ZXJTaGVldC5jbG9uZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuc2VhbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgU2VydmVyU3R5bGVTaGVldC5wcm90b3R5cGUuY29sbGVjdFN0eWxlcyA9IGZ1bmN0aW9uIGNvbGxlY3RTdHlsZXMoY2hpbGRyZW4pIHtcbiAgICBpZiAodGhpcy5zZWFsZWQpIHtcbiAgICAgIHRocm93IG5ldyBTdHlsZWRDb21wb25lbnRzRXJyb3IoMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICBTdHlsZVNoZWV0TWFuYWdlcixcbiAgICAgIHsgc2hlZXQ6IHRoaXMuaW5zdGFuY2UgfSxcbiAgICAgIGNoaWxkcmVuXG4gICAgKTtcbiAgfTtcblxuICBTZXJ2ZXJTdHlsZVNoZWV0LnByb3RvdHlwZS5nZXRTdHlsZVRhZ3MgPSBmdW5jdGlvbiBnZXRTdHlsZVRhZ3MoKSB7XG4gICAgdGhpcy5zZWFsKCk7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UudG9IVE1MKCk7XG4gIH07XG5cbiAgU2VydmVyU3R5bGVTaGVldC5wcm90b3R5cGUuZ2V0U3R5bGVFbGVtZW50ID0gZnVuY3Rpb24gZ2V0U3R5bGVFbGVtZW50KCkge1xuICAgIHRoaXMuc2VhbCgpO1xuICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnRvUmVhY3RFbGVtZW50cygpO1xuICB9O1xuXG4gIFNlcnZlclN0eWxlU2hlZXQucHJvdG90eXBlLmludGVybGVhdmVXaXRoTm9kZVN0cmVhbSA9IGZ1bmN0aW9uIGludGVybGVhdmVXaXRoTm9kZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB7XG4gICAgICB0aHJvdyBuZXcgU3R5bGVkQ29tcG9uZW50c0Vycm9yKDMpO1xuICAgIH1cblxuICAgIC8qIHRoZSB0YWcgaW5kZXgga2VlcHMgdHJhY2sgb2Ygd2hpY2ggdGFncyBoYXZlIGFscmVhZHkgYmVlbiBlbWl0dGVkICovXG4gICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZTtcblxuICAgIHZhciBpbnN0YW5jZVRhZ0luZGV4ID0gMDtcblxuICAgIHZhciBzdHJlYW1BdHRyID0gU0NfU1RSRUFNX0FUVFIgKyAnPVwidHJ1ZVwiJztcblxuICAgIHZhciB0cmFuc2Zvcm1lciA9IG5ldyBzdHJlYW0uVHJhbnNmb3JtKHtcbiAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gYXBwZW5kU3R5bGVDaHVua3MoY2h1bmssIC8qIGVuY29kaW5nICovXywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHRhZ3MgPSBpbnN0YW5jZS50YWdzO1xuXG4gICAgICAgIHZhciBodG1sID0gJyc7XG5cbiAgICAgICAgLyogcmV0cmlldmUgaHRtbCBmb3IgZWFjaCBuZXcgc3R5bGUgdGFnICovXG4gICAgICAgIGZvciAoOyBpbnN0YW5jZVRhZ0luZGV4IDwgdGFncy5sZW5ndGg7IGluc3RhbmNlVGFnSW5kZXggKz0gMSkge1xuICAgICAgICAgIHZhciB0YWcgPSB0YWdzW2luc3RhbmNlVGFnSW5kZXhdO1xuICAgICAgICAgIGh0bWwgKz0gdGFnLnRvSFRNTChzdHJlYW1BdHRyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGZvcmNlIG91ciBTdHlsZVNoZWV0cyB0byBlbWl0IGVudGlyZWx5IG5ldyB0YWdzICovXG4gICAgICAgIGluc3RhbmNlLnNlYWxBbGxUYWdzKCk7XG5cbiAgICAgICAgdmFyIHJlbmRlcmVkSHRtbCA9IGNodW5rLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLyogcHJlcGVuZCBzdHlsZSBodG1sIHRvIGNodW5rLCB1bmxlc3MgdGhlIHN0YXJ0IG9mIHRoZSBjaHVuayBpcyBhIGNsb3NpbmcgdGFnIGluIHdoaWNoIGNhc2UgYXBwZW5kIHJpZ2h0IGFmdGVyIHRoYXQgKi9cbiAgICAgICAgaWYgKENMT1NJTkdfVEFHX1IudGVzdChyZW5kZXJlZEh0bWwpKSB7XG4gICAgICAgICAgdmFyIGVuZE9mQ2xvc2luZ1RhZyA9IHJlbmRlcmVkSHRtbC5pbmRleE9mKCc+Jyk7XG5cbiAgICAgICAgICB0aGlzLnB1c2gocmVuZGVyZWRIdG1sLnNsaWNlKDAsIGVuZE9mQ2xvc2luZ1RhZyArIDEpICsgaHRtbCArIHJlbmRlcmVkSHRtbC5zbGljZShlbmRPZkNsb3NpbmdUYWcgKyAxKSk7XG4gICAgICAgIH0gZWxzZSB0aGlzLnB1c2goaHRtbCArIHJlbmRlcmVkSHRtbCk7XG5cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlYWRhYmxlU3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuc2VhbCgpO1xuICAgIH0pO1xuXG4gICAgcmVhZGFibGVTdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgX3RoaXMuc2VhbCgpO1xuXG4gICAgICAvLyBmb3J3YXJkIHRoZSBlcnJvciB0byB0aGUgdHJhbnNmb3JtIHN0cmVhbVxuICAgICAgdHJhbnNmb3JtZXIuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlYWRhYmxlU3RyZWFtLnBpcGUodHJhbnNmb3JtZXIpO1xuICB9O1xuXG4gIHJldHVybiBTZXJ2ZXJTdHlsZVNoZWV0O1xufSgpO1xuXG4vLyBcblxudmFyIFN0eWxlU2hlZXRDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xudmFyIFN0eWxlU2hlZXRDb25zdW1lciA9IFN0eWxlU2hlZXRDb250ZXh0LkNvbnN1bWVyO1xuXG52YXIgU3R5bGVTaGVldE1hbmFnZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhTdHlsZVNoZWV0TWFuYWdlciwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU3R5bGVTaGVldE1hbmFnZXIocHJvcHMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdHlsZVNoZWV0TWFuYWdlcik7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX3RoaXMuZ2V0Q29udGV4dCA9IG1lbW9pemUoX3RoaXMuZ2V0Q29udGV4dCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgU3R5bGVTaGVldE1hbmFnZXIucHJvdG90eXBlLmdldENvbnRleHQgPSBmdW5jdGlvbiBnZXRDb250ZXh0KHNoZWV0LCB0YXJnZXQpIHtcbiAgICBpZiAoc2hlZXQpIHtcbiAgICAgIHJldHVybiBzaGVldDtcbiAgICB9IGVsc2UgaWYgKHRhcmdldCkge1xuICAgICAgcmV0dXJuIG5ldyBTdHlsZVNoZWV0KHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBTdHlsZWRDb21wb25lbnRzRXJyb3IoNCk7XG4gICAgfVxuICB9O1xuXG4gIFN0eWxlU2hlZXRNYW5hZ2VyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBzaGVldCA9IF9wcm9wcy5zaGVldCxcbiAgICAgICAgdGFyZ2V0ID0gX3Byb3BzLnRhcmdldDtcblxuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICBTdHlsZVNoZWV0Q29udGV4dC5Qcm92aWRlcixcbiAgICAgIHsgdmFsdWU6IHRoaXMuZ2V0Q29udGV4dChzaGVldCwgdGFyZ2V0KSB9LFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pIDogY2hpbGRyZW5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBTdHlsZVNoZWV0TWFuYWdlcjtcbn0oQ29tcG9uZW50KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFN0eWxlU2hlZXRNYW5hZ2VyLnByb3BUeXBlcyA9IHtcbiAgc2hlZXQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5pbnN0YW5jZU9mKFN0eWxlU2hlZXQpLCBQcm9wVHlwZXMuaW5zdGFuY2VPZihTZXJ2ZXJTdHlsZVNoZWV0KV0pLFxuXG4gIHRhcmdldDogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBhcHBlbmRDaGlsZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICB9KVxufSA6IHZvaWQgMDtcblxuLy8gXG5cbnZhciBpZGVudGlmaWVycyA9IHt9O1xuXG4vKiBXZSBkZXBlbmQgb24gY29tcG9uZW50cyBoYXZpbmcgdW5pcXVlIElEcyAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJZChfQ29tcG9uZW50U3R5bGUsIF9kaXNwbGF5TmFtZSwgcGFyZW50Q29tcG9uZW50SWQpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIF9kaXNwbGF5TmFtZSAhPT0gJ3N0cmluZycgPyAnc2MnIDogZXNjYXBlKF9kaXNwbGF5TmFtZSk7XG5cbiAgLyoqXG4gICAqIFRoaXMgZW5zdXJlcyB1bmlxdWVuZXNzIGlmIHR3byBjb21wb25lbnRzIGhhcHBlbiB0byBzaGFyZVxuICAgKiB0aGUgc2FtZSBkaXNwbGF5TmFtZS5cbiAgICovXG4gIHZhciBuciA9IChpZGVudGlmaWVyc1tkaXNwbGF5TmFtZV0gfHwgMCkgKyAxO1xuICBpZGVudGlmaWVyc1tkaXNwbGF5TmFtZV0gPSBucjtcblxuICB2YXIgY29tcG9uZW50SWQgPSBkaXNwbGF5TmFtZSArICctJyArIF9Db21wb25lbnRTdHlsZS5nZW5lcmF0ZU5hbWUoZGlzcGxheU5hbWUgKyBucik7XG5cbiAgcmV0dXJuIHBhcmVudENvbXBvbmVudElkID8gcGFyZW50Q29tcG9uZW50SWQgKyAnLScgKyBjb21wb25lbnRJZCA6IGNvbXBvbmVudElkO1xufVxuXG4vLyAkRmxvd0ZpeE1lXG5cbnZhciBTdHlsZWRDb21wb25lbnQgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhTdHlsZWRDb21wb25lbnQsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFN0eWxlZENvbXBvbmVudCgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdHlsZWRDb21wb25lbnQpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMuYXR0cnMgPSB7fTtcblxuICAgIF90aGlzLnJlbmRlck91dGVyID0gX3RoaXMucmVuZGVyT3V0ZXIuYmluZChfdGhpcyk7XG4gICAgX3RoaXMucmVuZGVySW5uZXIgPSBfdGhpcy5yZW5kZXJJbm5lci5iaW5kKF90aGlzKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBfdGhpcy53YXJuSW5uZXJSZWYgPSBvbmNlKGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgXCJpbm5lclJlZlwiIEFQSSBoYXMgYmVlbiByZW1vdmVkIGluIHN0eWxlZC1jb21wb25lbnRzIHY0IGluIGZhdm9yIG9mIFJlYWN0IDE2IHJlZiBmb3J3YXJkaW5nLCB1c2UgXCJyZWZcIiBpbnN0ZWFkIGxpa2UgYSB0eXBpY2FsIGNvbXBvbmVudC4gXCJpbm5lclJlZlwiIHdhcyBkZXRlY3RlZCBvbiBjb21wb25lbnQgXCInICsgZGlzcGxheU5hbWUgKyAnXCIuJylcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy53YXJuQXR0cnNGbk9iamVjdEtleURlcHJlY2F0ZWQgPSBvbmNlKGZ1bmN0aW9uIChrZXksIGRpc3BsYXlOYW1lKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Z1bmN0aW9ucyBhcyBvYmplY3QtZm9ybSBhdHRycyh7fSkga2V5cyBhcmUgbm93IGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHN0eWxlZC1jb21wb25lbnRzLiBTd2l0Y2ggdG8gdGhlIG5ldyBhdHRycyhwcm9wcyA9PiAoe30pKSBzeW50YXggaW5zdGVhZCBmb3IgZWFzaWVyIGFuZCBtb3JlIHBvd2VyZnVsIGNvbXBvc2l0aW9uLiBUaGUgYXR0cnMga2V5IGluIHF1ZXN0aW9uIGlzIFwiJyArIGtleSArICdcIiBvbiBjb21wb25lbnQgXCInICsgZGlzcGxheU5hbWUgKyAnXCIuJywgJ1xcbiAnICsgbmV3IEVycm9yKCkuc3RhY2spXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMud2Fybk5vblN0eWxlZENvbXBvbmVudEF0dHJzT2JqZWN0S2V5ID0gb25jZShmdW5jdGlvbiAoa2V5LCBkaXNwbGF5TmFtZSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS53YXJuKCdJdCBsb29rcyBsaWtlIHlvdVxcJ3ZlIHVzZWQgYSBub24gc3R5bGVkLWNvbXBvbmVudCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBcIicgKyBrZXkgKyAnXCIgcHJvcCBpbiBhbiBvYmplY3QtZm9ybSBhdHRycyBjb25zdHJ1Y3RvciBvZiBcIicgKyBkaXNwbGF5TmFtZSArICdcIi5cXG4nICsgJ1lvdSBzaG91bGQgdXNlIHRoZSBuZXcgZnVuY3Rpb24tZm9ybSBhdHRycyBjb25zdHJ1Y3RvciB3aGljaCBhdm9pZHMgdGhpcyBpc3N1ZTogYXR0cnMocHJvcHMgPT4gKHsgeW91clN0dWZmIH0pKVxcbicgKyBcIlRvIGNvbnRpbnVlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9iamVjdCBzeW50YXgsIHlvdSdsbCBuZWVkIHRvIHdyYXAgeW91ciBjb21wb25lbnQgcHJvcCBpbiBhIGZ1bmN0aW9uIHRvIG1ha2UgaXQgYXZhaWxhYmxlIGluc2lkZSB0aGUgc3R5bGVkIGNvbXBvbmVudCAoeW91J2xsIHN0aWxsIGdldCB0aGUgZGVwcmVjYXRpb24gd2FybmluZyB0aG91Z2guKVxcblwiICsgKCdGb3IgZXhhbXBsZSwgeyAnICsga2V5ICsgJzogKCkgPT4gSW5uZXJDb21wb25lbnQgfSBpbnN0ZWFkIG9mIHsgJyArIGtleSArICc6IElubmVyQ29tcG9uZW50IH0nKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBTdHlsZWRDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgIFN0eWxlU2hlZXRDb25zdW1lcixcbiAgICAgIG51bGwsXG4gICAgICB0aGlzLnJlbmRlck91dGVyXG4gICAgKTtcbiAgfTtcblxuICBTdHlsZWRDb21wb25lbnQucHJvdG90eXBlLnJlbmRlck91dGVyID0gZnVuY3Rpb24gcmVuZGVyT3V0ZXIoKSB7XG4gICAgdmFyIHN0eWxlU2hlZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFN0eWxlU2hlZXQubWFzdGVyO1xuXG4gICAgdGhpcy5zdHlsZVNoZWV0ID0gc3R5bGVTaGVldDtcblxuICAgIC8vIE5vIG5lZWQgdG8gc3Vic2NyaWJlIGEgc3RhdGljIGNvbXBvbmVudCB0byB0aGVtZSBjaGFuZ2VzLCBpdCB3b24ndCBjaGFuZ2UgYW55dGhpbmdcbiAgICBpZiAodGhpcy5wcm9wcy5mb3J3YXJkZWRDb21wb25lbnQuY29tcG9uZW50U3R5bGUuaXNTdGF0aWMpIHJldHVybiB0aGlzLnJlbmRlcklubmVyKCk7XG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgIFRoZW1lQ29uc3VtZXIsXG4gICAgICBudWxsLFxuICAgICAgdGhpcy5yZW5kZXJJbm5lclxuICAgICk7XG4gIH07XG5cbiAgU3R5bGVkQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXJJbm5lciA9IGZ1bmN0aW9uIHJlbmRlcklubmVyKHRoZW1lKSB7XG4gICAgdmFyIF9wcm9wcyRmb3J3YXJkZWRDb21wbyA9IHRoaXMucHJvcHMuZm9yd2FyZGVkQ29tcG9uZW50LFxuICAgICAgICBjb21wb25lbnRTdHlsZSA9IF9wcm9wcyRmb3J3YXJkZWRDb21wby5jb21wb25lbnRTdHlsZSxcbiAgICAgICAgZGVmYXVsdFByb3BzID0gX3Byb3BzJGZvcndhcmRlZENvbXBvLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheU5hbWUgPSBfcHJvcHMkZm9yd2FyZGVkQ29tcG8uZGlzcGxheU5hbWUsXG4gICAgICAgIGZvbGRlZENvbXBvbmVudElkcyA9IF9wcm9wcyRmb3J3YXJkZWRDb21wby5mb2xkZWRDb21wb25lbnRJZHMsXG4gICAgICAgIHN0eWxlZENvbXBvbmVudElkID0gX3Byb3BzJGZvcndhcmRlZENvbXBvLnN0eWxlZENvbXBvbmVudElkLFxuICAgICAgICB0YXJnZXQgPSBfcHJvcHMkZm9yd2FyZGVkQ29tcG8udGFyZ2V0O1xuXG5cbiAgICB2YXIgZ2VuZXJhdGVkQ2xhc3NOYW1lID0gdm9pZCAwO1xuICAgIGlmIChjb21wb25lbnRTdHlsZS5pc1N0YXRpYykge1xuICAgICAgZ2VuZXJhdGVkQ2xhc3NOYW1lID0gdGhpcy5nZW5lcmF0ZUFuZEluamVjdFN0eWxlcyhFTVBUWV9PQkpFQ1QsIHRoaXMucHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5lcmF0ZWRDbGFzc05hbWUgPSB0aGlzLmdlbmVyYXRlQW5kSW5qZWN0U3R5bGVzKGRldGVybWluZVRoZW1lKHRoaXMucHJvcHMsIHRoZW1lLCBkZWZhdWx0UHJvcHMpIHx8IEVNUFRZX09CSkVDVCwgdGhpcy5wcm9wcyk7XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnRUb0JlQ3JlYXRlZCA9IHRoaXMucHJvcHMuYXMgfHwgdGhpcy5hdHRycy5hcyB8fCB0YXJnZXQ7XG4gICAgdmFyIGlzVGFyZ2V0VGFnID0gaXNUYWcoZWxlbWVudFRvQmVDcmVhdGVkKTtcblxuICAgIHZhciBwcm9wc0ZvckVsZW1lbnQgPSB7fTtcbiAgICB2YXIgY29tcHV0ZWRQcm9wcyA9IF9leHRlbmRzKHt9LCB0aGlzLnByb3BzLCB0aGlzLmF0dHJzKTtcblxuICAgIHZhciBrZXkgPSB2b2lkIDA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICAgIGZvciAoa2V5IGluIGNvbXB1dGVkUHJvcHMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGtleSA9PT0gJ2lubmVyUmVmJyAmJiBpc1RhcmdldFRhZykge1xuICAgICAgICB0aGlzLndhcm5Jbm5lclJlZihkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09ICdmb3J3YXJkZWRDb21wb25lbnQnIHx8IGtleSA9PT0gJ2FzJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnZm9yd2FyZGVkUmVmJykgcHJvcHNGb3JFbGVtZW50LnJlZiA9IGNvbXB1dGVkUHJvcHNba2V5XTtlbHNlIGlmIChrZXkgPT09ICdmb3J3YXJkZWRBcycpIHByb3BzRm9yRWxlbWVudC5hcyA9IGNvbXB1dGVkUHJvcHNba2V5XTtlbHNlIGlmICghaXNUYXJnZXRUYWcgfHwgdmFsaWRBdHRyKGtleSkpIHtcbiAgICAgICAgLy8gRG9uJ3QgcGFzcyB0aHJvdWdoIG5vbiBIVE1MIHRhZ3MgdGhyb3VnaCB0byBIVE1MIGVsZW1lbnRzXG4gICAgICAgIHByb3BzRm9yRWxlbWVudFtrZXldID0gY29tcHV0ZWRQcm9wc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLnN0eWxlICYmIHRoaXMuYXR0cnMuc3R5bGUpIHtcbiAgICAgIHByb3BzRm9yRWxlbWVudC5zdHlsZSA9IF9leHRlbmRzKHt9LCB0aGlzLmF0dHJzLnN0eWxlLCB0aGlzLnByb3BzLnN0eWxlKTtcbiAgICB9XG5cbiAgICBwcm9wc0ZvckVsZW1lbnQuY2xhc3NOYW1lID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdChmb2xkZWRDb21wb25lbnRJZHMsIHN0eWxlZENvbXBvbmVudElkLCBnZW5lcmF0ZWRDbGFzc05hbWUgIT09IHN0eWxlZENvbXBvbmVudElkID8gZ2VuZXJhdGVkQ2xhc3NOYW1lIDogbnVsbCwgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHRoaXMuYXR0cnMuY2xhc3NOYW1lKS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoZWxlbWVudFRvQmVDcmVhdGVkLCBwcm9wc0ZvckVsZW1lbnQpO1xuICB9O1xuXG4gIFN0eWxlZENvbXBvbmVudC5wcm90b3R5cGUuYnVpbGRFeGVjdXRpb25Db250ZXh0ID0gZnVuY3Rpb24gYnVpbGRFeGVjdXRpb25Db250ZXh0KHRoZW1lLCBwcm9wcywgYXR0cnMpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBjb250ZXh0ID0gX2V4dGVuZHMoe30sIHByb3BzLCB7IHRoZW1lOiB0aGVtZSB9KTtcblxuICAgIGlmICghYXR0cnMubGVuZ3RoKSByZXR1cm4gY29udGV4dDtcblxuICAgIHRoaXMuYXR0cnMgPSB7fTtcblxuICAgIGF0dHJzLmZvckVhY2goZnVuY3Rpb24gKGF0dHJEZWYpIHtcbiAgICAgIHZhciByZXNvbHZlZEF0dHJEZWYgPSBhdHRyRGVmO1xuICAgICAgdmFyIGF0dHJEZWZXYXNGbiA9IGZhbHNlO1xuICAgICAgdmFyIGF0dHIgPSB2b2lkIDA7XG4gICAgICB2YXIga2V5ID0gdm9pZCAwO1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbihyZXNvbHZlZEF0dHJEZWYpKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgcmVzb2x2ZWRBdHRyRGVmID0gcmVzb2x2ZWRBdHRyRGVmKGNvbnRleHQpO1xuICAgICAgICBhdHRyRGVmV2FzRm4gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbiAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgIGZvciAoa2V5IGluIHJlc29sdmVkQXR0ckRlZikge1xuICAgICAgICBhdHRyID0gcmVzb2x2ZWRBdHRyRGVmW2tleV07XG5cbiAgICAgICAgaWYgKCFhdHRyRGVmV2FzRm4pIHtcbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbihhdHRyKSAmJiAhaXNEZXJpdmVkUmVhY3RDb21wb25lbnQoYXR0cikgJiYgIWlzU3R5bGVkQ29tcG9uZW50KGF0dHIpKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICBfdGhpczIud2FybkF0dHJzRm5PYmplY3RLZXlEZXByZWNhdGVkKGtleSwgcHJvcHMuZm9yd2FyZGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXR0ciA9IGF0dHIoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIFJlYWN0LmlzVmFsaWRFbGVtZW50KGF0dHIpKSB7XG4gICAgICAgICAgICAgIF90aGlzMi53YXJuTm9uU3R5bGVkQ29tcG9uZW50QXR0cnNPYmplY3RLZXkoa2V5LCBwcm9wcy5mb3J3YXJkZWRDb21wb25lbnQuZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMi5hdHRyc1trZXldID0gYXR0cjtcbiAgICAgICAgY29udGV4dFtrZXldID0gYXR0cjtcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICB9KTtcblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9O1xuXG4gIFN0eWxlZENvbXBvbmVudC5wcm90b3R5cGUuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXMgPSBmdW5jdGlvbiBnZW5lcmF0ZUFuZEluamVjdFN0eWxlcyh0aGVtZSwgcHJvcHMpIHtcbiAgICB2YXIgX3Byb3BzJGZvcndhcmRlZENvbXBvMiA9IHByb3BzLmZvcndhcmRlZENvbXBvbmVudCxcbiAgICAgICAgYXR0cnMgPSBfcHJvcHMkZm9yd2FyZGVkQ29tcG8yLmF0dHJzLFxuICAgICAgICBjb21wb25lbnRTdHlsZSA9IF9wcm9wcyRmb3J3YXJkZWRDb21wbzIuY29tcG9uZW50U3R5bGUsXG4gICAgICAgIHdhcm5Ub29NYW55Q2xhc3NlcyA9IF9wcm9wcyRmb3J3YXJkZWRDb21wbzIud2FyblRvb01hbnlDbGFzc2VzO1xuXG4gICAgLy8gc3RhdGljYWxseSBzdHlsZWQtY29tcG9uZW50cyBkb24ndCBuZWVkIHRvIGJ1aWxkIGFuIGV4ZWN1dGlvbiBjb250ZXh0IG9iamVjdCxcbiAgICAvLyBhbmQgc2hvdWxkbid0IGJlIGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBjbGFzcyBuYW1lc1xuXG4gICAgaWYgKGNvbXBvbmVudFN0eWxlLmlzU3RhdGljICYmICFhdHRycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnRTdHlsZS5nZW5lcmF0ZUFuZEluamVjdFN0eWxlcyhFTVBUWV9PQkpFQ1QsIHRoaXMuc3R5bGVTaGVldCk7XG4gICAgfVxuXG4gICAgdmFyIGNsYXNzTmFtZSA9IGNvbXBvbmVudFN0eWxlLmdlbmVyYXRlQW5kSW5qZWN0U3R5bGVzKHRoaXMuYnVpbGRFeGVjdXRpb25Db250ZXh0KHRoZW1lLCBwcm9wcywgYXR0cnMpLCB0aGlzLnN0eWxlU2hlZXQpO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FyblRvb01hbnlDbGFzc2VzKSB3YXJuVG9vTWFueUNsYXNzZXMoY2xhc3NOYW1lKTtcblxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH07XG5cbiAgcmV0dXJuIFN0eWxlZENvbXBvbmVudDtcbn0oQ29tcG9uZW50KTtcblxuZnVuY3Rpb24gY3JlYXRlU3R5bGVkQ29tcG9uZW50KHRhcmdldCwgb3B0aW9ucywgcnVsZXMpIHtcbiAgdmFyIGlzVGFyZ2V0U3R5bGVkQ29tcCA9IGlzU3R5bGVkQ29tcG9uZW50KHRhcmdldCk7XG4gIHZhciBpc0NsYXNzID0gIWlzVGFnKHRhcmdldCk7XG5cbiAgdmFyIF9vcHRpb25zJGRpc3BsYXlOYW1lID0gb3B0aW9ucy5kaXNwbGF5TmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lID0gX29wdGlvbnMkZGlzcGxheU5hbWUgPT09IHVuZGVmaW5lZCA/IGdlbmVyYXRlRGlzcGxheU5hbWUodGFyZ2V0KSA6IF9vcHRpb25zJGRpc3BsYXlOYW1lLFxuICAgICAgX29wdGlvbnMkY29tcG9uZW50SWQgPSBvcHRpb25zLmNvbXBvbmVudElkLFxuICAgICAgY29tcG9uZW50SWQgPSBfb3B0aW9ucyRjb21wb25lbnRJZCA9PT0gdW5kZWZpbmVkID8gZ2VuZXJhdGVJZChDb21wb25lbnRTdHlsZSwgb3B0aW9ucy5kaXNwbGF5TmFtZSwgb3B0aW9ucy5wYXJlbnRDb21wb25lbnRJZCkgOiBfb3B0aW9ucyRjb21wb25lbnRJZCxcbiAgICAgIF9vcHRpb25zJFBhcmVudENvbXBvbiA9IG9wdGlvbnMuUGFyZW50Q29tcG9uZW50LFxuICAgICAgUGFyZW50Q29tcG9uZW50ID0gX29wdGlvbnMkUGFyZW50Q29tcG9uID09PSB1bmRlZmluZWQgPyBTdHlsZWRDb21wb25lbnQgOiBfb3B0aW9ucyRQYXJlbnRDb21wb24sXG4gICAgICBfb3B0aW9ucyRhdHRycyA9IG9wdGlvbnMuYXR0cnMsXG4gICAgICBhdHRycyA9IF9vcHRpb25zJGF0dHJzID09PSB1bmRlZmluZWQgPyBFTVBUWV9BUlJBWSA6IF9vcHRpb25zJGF0dHJzO1xuXG5cbiAgdmFyIHN0eWxlZENvbXBvbmVudElkID0gb3B0aW9ucy5kaXNwbGF5TmFtZSAmJiBvcHRpb25zLmNvbXBvbmVudElkID8gZXNjYXBlKG9wdGlvbnMuZGlzcGxheU5hbWUpICsgJy0nICsgb3B0aW9ucy5jb21wb25lbnRJZCA6IG9wdGlvbnMuY29tcG9uZW50SWQgfHwgY29tcG9uZW50SWQ7XG5cbiAgLy8gZm9sZCB0aGUgdW5kZXJseWluZyBTdHlsZWRDb21wb25lbnQgYXR0cnMgdXAgKGltcGxpY2l0IGV4dGVuZClcbiAgdmFyIGZpbmFsQXR0cnMgPVxuICAvLyAkRmxvd0ZpeE1lXG4gIGlzVGFyZ2V0U3R5bGVkQ29tcCAmJiB0YXJnZXQuYXR0cnMgPyBBcnJheS5wcm90b3R5cGUuY29uY2F0KHRhcmdldC5hdHRycywgYXR0cnMpLmZpbHRlcihCb29sZWFuKSA6IGF0dHJzO1xuXG4gIHZhciBjb21wb25lbnRTdHlsZSA9IG5ldyBDb21wb25lbnRTdHlsZShpc1RhcmdldFN0eWxlZENvbXAgPyAvLyBmb2xkIHRoZSB1bmRlcmx5aW5nIFN0eWxlZENvbXBvbmVudCBydWxlcyB1cCAoaW1wbGljaXQgZXh0ZW5kKVxuICAvLyAkRmxvd0ZpeE1lXG4gIHRhcmdldC5jb21wb25lbnRTdHlsZS5ydWxlcy5jb25jYXQocnVsZXMpIDogcnVsZXMsIGZpbmFsQXR0cnMsIHN0eWxlZENvbXBvbmVudElkKTtcblxuICAvKipcbiAgICogZm9yd2FyZFJlZiBjcmVhdGVzIGEgbmV3IGludGVyaW0gY29tcG9uZW50LCB3aGljaCB3ZSdsbCB0YWtlIGFkdmFudGFnZSBvZlxuICAgKiBpbnN0ZWFkIG9mIGV4dGVuZGluZyBQYXJlbnRDb21wb25lbnQgdG8gY3JlYXRlIF9hbm90aGVyXyBpbnRlcmltIGNsYXNzXG4gICAqL1xuICB2YXIgV3JhcHBlZFN0eWxlZENvbXBvbmVudCA9IHZvaWQgMDtcbiAgdmFyIGZvcndhcmRSZWYgPSBmdW5jdGlvbiBmb3J3YXJkUmVmKHByb3BzLCByZWYpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChQYXJlbnRDb21wb25lbnQsIF9leHRlbmRzKHt9LCBwcm9wcywgeyBmb3J3YXJkZWRDb21wb25lbnQ6IFdyYXBwZWRTdHlsZWRDb21wb25lbnQsIGZvcndhcmRlZFJlZjogcmVmIH0pKTtcbiAgfTtcbiAgZm9yd2FyZFJlZi5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICBXcmFwcGVkU3R5bGVkQ29tcG9uZW50ID0gUmVhY3QuZm9yd2FyZFJlZihmb3J3YXJkUmVmKTtcbiAgV3JhcHBlZFN0eWxlZENvbXBvbmVudC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuXG4gIC8vICRGbG93Rml4TWVcbiAgV3JhcHBlZFN0eWxlZENvbXBvbmVudC5hdHRycyA9IGZpbmFsQXR0cnM7XG4gIC8vICRGbG93Rml4TWVcbiAgV3JhcHBlZFN0eWxlZENvbXBvbmVudC5jb21wb25lbnRTdHlsZSA9IGNvbXBvbmVudFN0eWxlO1xuXG4gIC8vICRGbG93Rml4TWVcbiAgV3JhcHBlZFN0eWxlZENvbXBvbmVudC5mb2xkZWRDb21wb25lbnRJZHMgPSBpc1RhcmdldFN0eWxlZENvbXAgPyAvLyAkRmxvd0ZpeE1lXG4gIEFycmF5LnByb3RvdHlwZS5jb25jYXQodGFyZ2V0LmZvbGRlZENvbXBvbmVudElkcywgdGFyZ2V0LnN0eWxlZENvbXBvbmVudElkKSA6IEVNUFRZX0FSUkFZO1xuXG4gIC8vICRGbG93Rml4TWVcbiAgV3JhcHBlZFN0eWxlZENvbXBvbmVudC5zdHlsZWRDb21wb25lbnRJZCA9IHN0eWxlZENvbXBvbmVudElkO1xuXG4gIC8vIGZvbGQgdGhlIHVuZGVybHlpbmcgU3R5bGVkQ29tcG9uZW50IHRhcmdldCB1cCBzaW5jZSB3ZSBmb2xkZWQgdGhlIHN0eWxlc1xuICAvLyAkRmxvd0ZpeE1lXG4gIFdyYXBwZWRTdHlsZWRDb21wb25lbnQudGFyZ2V0ID0gaXNUYXJnZXRTdHlsZWRDb21wID8gdGFyZ2V0LnRhcmdldCA6IHRhcmdldDtcblxuICAvLyAkRmxvd0ZpeE1lXG4gIFdyYXBwZWRTdHlsZWRDb21wb25lbnQud2l0aENvbXBvbmVudCA9IGZ1bmN0aW9uIHdpdGhDb21wb25lbnQodGFnKSB7XG4gICAgdmFyIHByZXZpb3VzQ29tcG9uZW50SWQgPSBvcHRpb25zLmNvbXBvbmVudElkLFxuICAgICAgICBvcHRpb25zVG9Db3B5ID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob3B0aW9ucywgWydjb21wb25lbnRJZCddKTtcblxuXG4gICAgdmFyIG5ld0NvbXBvbmVudElkID0gcHJldmlvdXNDb21wb25lbnRJZCAmJiBwcmV2aW91c0NvbXBvbmVudElkICsgJy0nICsgKGlzVGFnKHRhZykgPyB0YWcgOiBlc2NhcGUoZ2V0Q29tcG9uZW50TmFtZSh0YWcpKSk7XG5cbiAgICB2YXIgbmV3T3B0aW9ucyA9IF9leHRlbmRzKHt9LCBvcHRpb25zVG9Db3B5LCB7XG4gICAgICBhdHRyczogZmluYWxBdHRycyxcbiAgICAgIGNvbXBvbmVudElkOiBuZXdDb21wb25lbnRJZCxcbiAgICAgIFBhcmVudENvbXBvbmVudDogUGFyZW50Q29tcG9uZW50XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3JlYXRlU3R5bGVkQ29tcG9uZW50KHRhZywgbmV3T3B0aW9ucywgcnVsZXMpO1xuICB9O1xuXG4gIC8vICRGbG93Rml4TWVcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyYXBwZWRTdHlsZWRDb21wb25lbnQsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9sZGVkRGVmYXVsdFByb3BzO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEob2JqKSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICB0aGlzLl9mb2xkZWREZWZhdWx0UHJvcHMgPSBpc1RhcmdldFN0eWxlZENvbXAgPyBtZXJnZSh0YXJnZXQuZGVmYXVsdFByb3BzLCBvYmopIDogb2JqO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyAkRmxvd0ZpeE1lXG4gICAgV3JhcHBlZFN0eWxlZENvbXBvbmVudC53YXJuVG9vTWFueUNsYXNzZXMgPSBjcmVhdGVXYXJuVG9vTWFueUNsYXNzZXMoZGlzcGxheU5hbWUpO1xuICB9XG5cbiAgLy8gJEZsb3dGaXhNZVxuICBXcmFwcGVkU3R5bGVkQ29tcG9uZW50LnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnLicgKyBXcmFwcGVkU3R5bGVkQ29tcG9uZW50LnN0eWxlZENvbXBvbmVudElkO1xuICB9O1xuXG4gIGlmIChpc0NsYXNzKSB7XG4gICAgaG9pc3ROb25SZWFjdFN0YXRpY3MoV3JhcHBlZFN0eWxlZENvbXBvbmVudCwgdGFyZ2V0LCB7XG4gICAgICAvLyBhbGwgU0Mtc3BlY2lmaWMgdGhpbmdzIHNob3VsZCBub3QgYmUgaG9pc3RlZFxuICAgICAgYXR0cnM6IHRydWUsXG4gICAgICBjb21wb25lbnRTdHlsZTogdHJ1ZSxcbiAgICAgIGRpc3BsYXlOYW1lOiB0cnVlLFxuICAgICAgZm9sZGVkQ29tcG9uZW50SWRzOiB0cnVlLFxuICAgICAgc3R5bGVkQ29tcG9uZW50SWQ6IHRydWUsXG4gICAgICB0YXJnZXQ6IHRydWUsXG4gICAgICB3aXRoQ29tcG9uZW50OiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gV3JhcHBlZFN0eWxlZENvbXBvbmVudDtcbn1cblxuLy8gXG4vLyBUaGFua3MgdG8gUmVhY3RET01GYWN0b3JpZXMgZm9yIHRoaXMgaGFuZHkgbGlzdCFcblxudmFyIGRvbUVsZW1lbnRzID0gWydhJywgJ2FiYnInLCAnYWRkcmVzcycsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYXVkaW8nLCAnYicsICdiYXNlJywgJ2JkaScsICdiZG8nLCAnYmlnJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FudmFzJywgJ2NhcHRpb24nLCAnY2l0ZScsICdjb2RlJywgJ2NvbCcsICdjb2xncm91cCcsICdkYXRhJywgJ2RhdGFsaXN0JywgJ2RkJywgJ2RlbCcsICdkZXRhaWxzJywgJ2RmbicsICdkaWFsb2cnLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtJywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2knLCAnaWZyYW1lJywgJ2ltZycsICdpbnB1dCcsICdpbnMnLCAna2JkJywgJ2tleWdlbicsICdsYWJlbCcsICdsZWdlbmQnLCAnbGknLCAnbGluaycsICdtYWluJywgJ21hcCcsICdtYXJrJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRhJywgJ21ldGVyJywgJ25hdicsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAnb3B0Z3JvdXAnLCAnb3B0aW9uJywgJ291dHB1dCcsICdwJywgJ3BhcmFtJywgJ3BpY3R1cmUnLCAncHJlJywgJ3Byb2dyZXNzJywgJ3EnLCAncnAnLCAncnQnLCAncnVieScsICdzJywgJ3NhbXAnLCAnc2NyaXB0JywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NtYWxsJywgJ3NvdXJjZScsICdzcGFuJywgJ3N0cm9uZycsICdzdHlsZScsICdzdWInLCAnc3VtbWFyeScsICdzdXAnLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGltZScsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1JywgJ3VsJywgJ3ZhcicsICd2aWRlbycsICd3YnInLFxuXG4vLyBTVkdcbidjaXJjbGUnLCAnY2xpcFBhdGgnLCAnZGVmcycsICdlbGxpcHNlJywgJ2ZvcmVpZ25PYmplY3QnLCAnZycsICdpbWFnZScsICdsaW5lJywgJ2xpbmVhckdyYWRpZW50JywgJ21hcmtlcicsICdtYXNrJywgJ3BhdGgnLCAncGF0dGVybicsICdwb2x5Z29uJywgJ3BvbHlsaW5lJywgJ3JhZGlhbEdyYWRpZW50JywgJ3JlY3QnLCAnc3RvcCcsICdzdmcnLCAndGV4dCcsICd0c3BhbiddO1xuXG4vLyBcblxudmFyIHN0eWxlZCA9IGZ1bmN0aW9uIHN0eWxlZCh0YWcpIHtcbiAgcmV0dXJuIGNvbnN0cnVjdFdpdGhPcHRpb25zKGNyZWF0ZVN0eWxlZENvbXBvbmVudCwgdGFnKTtcbn07XG5cbi8vIFNob3J0aGFuZHMgZm9yIGFsbCB2YWxpZCBIVE1MIEVsZW1lbnRzXG5kb21FbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb21FbGVtZW50KSB7XG4gIHN0eWxlZFtkb21FbGVtZW50XSA9IHN0eWxlZChkb21FbGVtZW50KTtcbn0pO1xuXG4vLyBcblxudmFyIEdsb2JhbFN0eWxlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHbG9iYWxTdHlsZShydWxlcywgY29tcG9uZW50SWQpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHbG9iYWxTdHlsZSk7XG5cbiAgICB0aGlzLnJ1bGVzID0gcnVsZXM7XG4gICAgdGhpcy5jb21wb25lbnRJZCA9IGNvbXBvbmVudElkO1xuICAgIHRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpY1J1bGVzKHJ1bGVzLCBFTVBUWV9BUlJBWSk7XG5cbiAgICBpZiAoIVN0eWxlU2hlZXQubWFzdGVyLmhhc0lkKGNvbXBvbmVudElkKSkge1xuICAgICAgU3R5bGVTaGVldC5tYXN0ZXIuZGVmZXJyZWRJbmplY3QoY29tcG9uZW50SWQsIFtdKTtcbiAgICB9XG4gIH1cblxuICBHbG9iYWxTdHlsZS5wcm90b3R5cGUuY3JlYXRlU3R5bGVzID0gZnVuY3Rpb24gY3JlYXRlU3R5bGVzKGV4ZWN1dGlvbkNvbnRleHQsIHN0eWxlU2hlZXQpIHtcbiAgICB2YXIgZmxhdENTUyA9IGZsYXR0ZW4odGhpcy5ydWxlcywgZXhlY3V0aW9uQ29udGV4dCwgc3R5bGVTaGVldCk7XG4gICAgdmFyIGNzcyA9IHN0cmluZ2lmeVJ1bGVzKGZsYXRDU1MsICcnKTtcblxuICAgIHN0eWxlU2hlZXQuaW5qZWN0KHRoaXMuY29tcG9uZW50SWQsIGNzcyk7XG4gIH07XG5cbiAgR2xvYmFsU3R5bGUucHJvdG90eXBlLnJlbW92ZVN0eWxlcyA9IGZ1bmN0aW9uIHJlbW92ZVN0eWxlcyhzdHlsZVNoZWV0KSB7XG4gICAgdmFyIGNvbXBvbmVudElkID0gdGhpcy5jb21wb25lbnRJZDtcblxuICAgIGlmIChzdHlsZVNoZWV0Lmhhc0lkKGNvbXBvbmVudElkKSkge1xuICAgICAgc3R5bGVTaGVldC5yZW1vdmUoY29tcG9uZW50SWQpO1xuICAgIH1cbiAgfTtcblxuICAvLyBUT0RPOiBvdmVyd3JpdGUgaW4tcGxhY2UgaW5zdGVhZCBvZiByZW1vdmUrY3JlYXRlP1xuXG5cbiAgR2xvYmFsU3R5bGUucHJvdG90eXBlLnJlbmRlclN0eWxlcyA9IGZ1bmN0aW9uIHJlbmRlclN0eWxlcyhleGVjdXRpb25Db250ZXh0LCBzdHlsZVNoZWV0KSB7XG4gICAgdGhpcy5yZW1vdmVTdHlsZXMoc3R5bGVTaGVldCk7XG4gICAgdGhpcy5jcmVhdGVTdHlsZXMoZXhlY3V0aW9uQ29udGV4dCwgc3R5bGVTaGVldCk7XG4gIH07XG5cbiAgcmV0dXJuIEdsb2JhbFN0eWxlO1xufSgpO1xuXG4vLyBcblxuLy8gcGxhY2Ugb3VyIGNhY2hlIGludG8gc2hhcmVkIGNvbnRleHQgc28gaXQnbGwgcGVyc2lzdCBiZXR3ZWVuIEhNUnNcbmlmIChJU19CUk9XU0VSKSB7XG4gIHdpbmRvdy5zY0NHU0hNUkNhY2hlID0ge307XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUdsb2JhbFN0eWxlKHN0cmluZ3MpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGludGVycG9sYXRpb25zID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGludGVycG9sYXRpb25zW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBydWxlcyA9IGNzcy5hcHBseSh1bmRlZmluZWQsIFtzdHJpbmdzXS5jb25jYXQoaW50ZXJwb2xhdGlvbnMpKTtcbiAgdmFyIGlkID0gJ3NjLWdsb2JhbC0nICsgbXVybXVyaGFzaChKU09OLnN0cmluZ2lmeShydWxlcykpO1xuICB2YXIgc3R5bGUgPSBuZXcgR2xvYmFsU3R5bGUocnVsZXMsIGlkKTtcblxuICB2YXIgR2xvYmFsU3R5bGVDb21wb25lbnQgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIGluaGVyaXRzKEdsb2JhbFN0eWxlQ29tcG9uZW50LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIEdsb2JhbFN0eWxlQ29tcG9uZW50KHByb3BzKSB7XG4gICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHbG9iYWxTdHlsZUNvbXBvbmVudCk7XG5cbiAgICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSk7XG5cbiAgICAgIHZhciBfdGhpcyRjb25zdHJ1Y3RvciA9IF90aGlzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgIGdsb2JhbFN0eWxlID0gX3RoaXMkY29uc3RydWN0b3IuZ2xvYmFsU3R5bGUsXG4gICAgICAgICAgc3R5bGVkQ29tcG9uZW50SWQgPSBfdGhpcyRjb25zdHJ1Y3Rvci5zdHlsZWRDb21wb25lbnRJZDtcblxuXG4gICAgICBpZiAoSVNfQlJPV1NFUikge1xuICAgICAgICB3aW5kb3cuc2NDR1NITVJDYWNoZVtzdHlsZWRDb21wb25lbnRJZF0gPSAod2luZG93LnNjQ0dTSE1SQ2FjaGVbc3R5bGVkQ29tcG9uZW50SWRdIHx8IDApICsgMTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIGZpeGVzIEhNUiBjb21wYXRpYmlsaXR5LiBEb24ndCBhc2sgbWUgd2h5LCBidXQgdGhpcyBjb21iaW5hdGlvbiBvZlxuICAgICAgICogY2FjaGluZyB0aGUgY2xvc3VyZSB2YXJpYWJsZXMgdmlhIHN0YXRpY3MgYW5kIHRoZW4gcGVyc2lzdGluZyB0aGUgc3RhdGljcyBpblxuICAgICAgICogc3RhdGUgd29ya3MgYWNyb3NzIEhNUiB3aGVyZSBubyBvdGhlciBjb21iaW5hdGlvbiBkaWQuIMKvXFxfKOODhClfL8KvXG4gICAgICAgKi9cbiAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICBnbG9iYWxTdHlsZTogZ2xvYmFsU3R5bGUsXG4gICAgICAgIHN0eWxlZENvbXBvbmVudElkOiBzdHlsZWRDb21wb25lbnRJZFxuICAgICAgfTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICBHbG9iYWxTdHlsZUNvbXBvbmVudC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGlmICh3aW5kb3cuc2NDR1NITVJDYWNoZVt0aGlzLnN0YXRlLnN0eWxlZENvbXBvbmVudElkXSkge1xuICAgICAgICB3aW5kb3cuc2NDR1NITVJDYWNoZVt0aGlzLnN0YXRlLnN0eWxlZENvbXBvbmVudElkXSAtPSAxO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBEZXBlbmRpbmcgb24gdGhlIG9yZGVyIFwicmVuZGVyXCIgaXMgY2FsbGVkIHRoaXMgY2FuIGNhdXNlIHRoZSBzdHlsZXMgdG8gYmUgbG9zdFxuICAgICAgICogdW50aWwgdGhlIG5leHQgcmVuZGVyIHBhc3Mgb2YgdGhlIHJlbWFpbmluZyBpbnN0YW5jZSwgd2hpY2ggbWF5XG4gICAgICAgKiBub3QgYmUgaW1tZWRpYXRlLlxuICAgICAgICovXG4gICAgICBpZiAod2luZG93LnNjQ0dTSE1SQ2FjaGVbdGhpcy5zdGF0ZS5zdHlsZWRDb21wb25lbnRJZF0gPT09IDApIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5nbG9iYWxTdHlsZS5yZW1vdmVTdHlsZXModGhpcy5zdHlsZVNoZWV0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgR2xvYmFsU3R5bGVDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBSZWFjdC5DaGlsZHJlbi5jb3VudCh0aGlzLnByb3BzLmNoaWxkcmVuKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSBnbG9iYWwgc3R5bGUgY29tcG9uZW50ICcgKyB0aGlzLnN0YXRlLnN0eWxlZENvbXBvbmVudElkICsgJyB3YXMgZ2l2ZW4gY2hpbGQgSlNYLiBjcmVhdGVHbG9iYWxTdHlsZSBkb2VzIG5vdCByZW5kZXIgY2hpbGRyZW4uJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBTdHlsZVNoZWV0Q29uc3VtZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGZ1bmN0aW9uIChzdHlsZVNoZWV0KSB7XG4gICAgICAgICAgX3RoaXMyLnN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0IHx8IFN0eWxlU2hlZXQubWFzdGVyO1xuXG4gICAgICAgICAgdmFyIGdsb2JhbFN0eWxlID0gX3RoaXMyLnN0YXRlLmdsb2JhbFN0eWxlO1xuXG5cbiAgICAgICAgICBpZiAoZ2xvYmFsU3R5bGUuaXNTdGF0aWMpIHtcbiAgICAgICAgICAgIGdsb2JhbFN0eWxlLnJlbmRlclN0eWxlcyhTVEFUSUNfRVhFQ1VUSU9OX0NPTlRFWFQsIF90aGlzMi5zdHlsZVNoZWV0KTtcblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICBUaGVtZUNvbnN1bWVyLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBmdW5jdGlvbiAodGhlbWUpIHtcbiAgICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgICAgICAgICAgdmFyIGRlZmF1bHRQcm9wcyA9IF90aGlzMi5jb25zdHJ1Y3Rvci5kZWZhdWx0UHJvcHM7XG5cblxuICAgICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gX2V4dGVuZHMoe30sIF90aGlzMi5wcm9wcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoZW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgY29udGV4dC50aGVtZSA9IGRldGVybWluZVRoZW1lKF90aGlzMi5wcm9wcywgdGhlbWUsIGRlZmF1bHRQcm9wcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZ2xvYmFsU3R5bGUucmVuZGVyU3R5bGVzKGNvbnRleHQsIF90aGlzMi5zdHlsZVNoZWV0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEdsb2JhbFN0eWxlQ29tcG9uZW50O1xuICB9KFJlYWN0LkNvbXBvbmVudCk7XG5cbiAgR2xvYmFsU3R5bGVDb21wb25lbnQuZ2xvYmFsU3R5bGUgPSBzdHlsZTtcbiAgR2xvYmFsU3R5bGVDb21wb25lbnQuc3R5bGVkQ29tcG9uZW50SWQgPSBpZDtcblxuXG4gIHJldHVybiBHbG9iYWxTdHlsZUNvbXBvbmVudDtcbn1cblxuLy8gXG5cbnZhciByZXBsYWNlV2hpdGVzcGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2VXaGl0ZXNwYWNlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcc3xcXFxcbi9nLCAnJyk7XG59O1xuXG5mdW5jdGlvbiBrZXlmcmFtZXMoc3RyaW5ncykge1xuICAvKiBXYXJuaW5nIGlmIHlvdSd2ZSB1c2VkIGtleWZyYW1lcyBvbiBSZWFjdCBOYXRpdmUgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdSZWFjdE5hdGl2ZScpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybignYGtleWZyYW1lc2AgY2Fubm90IGJlIHVzZWQgb24gUmVhY3ROYXRpdmUsIG9ubHkgb24gdGhlIHdlYi4gVG8gZG8gYW5pbWF0aW9uIGluIFJlYWN0TmF0aXZlIHBsZWFzZSB1c2UgQW5pbWF0ZWQuJyk7XG4gIH1cblxuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgaW50ZXJwb2xhdGlvbnMgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgaW50ZXJwb2xhdGlvbnNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgdmFyIHJ1bGVzID0gY3NzLmFwcGx5KHVuZGVmaW5lZCwgW3N0cmluZ3NdLmNvbmNhdChpbnRlcnBvbGF0aW9ucykpO1xuXG4gIHZhciBuYW1lID0gZ2VuZXJhdGVBbHBoYWJldGljTmFtZShtdXJtdXJoYXNoKHJlcGxhY2VXaGl0ZXNwYWNlKEpTT04uc3RyaW5naWZ5KHJ1bGVzKSkpKTtcblxuICByZXR1cm4gbmV3IEtleWZyYW1lcyhuYW1lLCBzdHJpbmdpZnlSdWxlcyhydWxlcywgbmFtZSwgJ0BrZXlmcmFtZXMnKSk7XG59XG5cbi8vIFxuXG52YXIgd2l0aFRoZW1lID0gKGZ1bmN0aW9uIChDb21wb25lbnQkJDEpIHtcbiAgdmFyIFdpdGhUaGVtZSA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgIFRoZW1lQ29uc3VtZXIsXG4gICAgICBudWxsLFxuICAgICAgZnVuY3Rpb24gKHRoZW1lKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgdmFyIGRlZmF1bHRQcm9wcyA9IENvbXBvbmVudCQkMS5kZWZhdWx0UHJvcHM7XG5cbiAgICAgICAgdmFyIHRoZW1lUHJvcCA9IGRldGVybWluZVRoZW1lKHByb3BzLCB0aGVtZSwgZGVmYXVsdFByb3BzKTtcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0aGVtZVByb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS53YXJuKCdbd2l0aFRoZW1lXSBZb3UgYXJlIG5vdCB1c2luZyBhIFRoZW1lUHJvdmlkZXIgbm9yIHBhc3NpbmcgYSB0aGVtZSBwcm9wIG9yIGEgdGhlbWUgaW4gZGVmYXVsdFByb3BzIGluIGNvbXBvbmVudCBjbGFzcyBcIicgKyBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCQkMSkgKyAnXCInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCQkMSwgX2V4dGVuZHMoe30sIHByb3BzLCB7IHRoZW1lOiB0aGVtZVByb3AsIHJlZjogcmVmIH0pKTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcblxuICBob2lzdE5vblJlYWN0U3RhdGljcyhXaXRoVGhlbWUsIENvbXBvbmVudCQkMSk7XG5cbiAgV2l0aFRoZW1lLmRpc3BsYXlOYW1lID0gJ1dpdGhUaGVtZSgnICsgZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQkJDEpICsgJyknO1xuXG4gIHJldHVybiBXaXRoVGhlbWU7XG59KTtcblxuLy8gXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG52YXIgX19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0hBVU5URURfQllfU1BPT0tZX0dIT1NUUyA9IHtcbiAgU3R5bGVTaGVldDogU3R5bGVTaGVldFxufTtcblxuLy8gXG5cbi8qIFdhcm5pbmcgaWYgeW91J3ZlIGltcG9ydGVkIHRoaXMgZmlsZSBvbiBSZWFjdCBOYXRpdmUgKi9cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUud2FybihcIkl0IGxvb2tzIGxpa2UgeW91J3ZlIGltcG9ydGVkICdzdHlsZWQtY29tcG9uZW50cycgb24gUmVhY3QgTmF0aXZlLlxcblwiICsgXCJQZXJoYXBzIHlvdSdyZSBsb29raW5nIHRvIGltcG9ydCAnc3R5bGVkLWNvbXBvbmVudHMvbmF0aXZlJz9cXG5cIiArICdSZWFkIG1vcmUgYWJvdXQgdGhpcyBhdCBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9iYXNpY3MjcmVhY3QtbmF0aXZlJyk7XG59XG5cbi8qIFdhcm5pbmcgaWYgdGhlcmUgYXJlIHNldmVyYWwgaW5zdGFuY2VzIG9mIHN0eWxlZC1jb21wb25lbnRzICovXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50ID09PSAnc3RyaW5nJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ05vZGUuanMnKSA9PT0gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdqc2RvbScpID09PSAtMSkge1xuICB3aW5kb3dbJ19fc3R5bGVkLWNvbXBvbmVudHMtaW5pdF9fJ10gPSB3aW5kb3dbJ19fc3R5bGVkLWNvbXBvbmVudHMtaW5pdF9fJ10gfHwgMDtcblxuICBpZiAod2luZG93WydfX3N0eWxlZC1jb21wb25lbnRzLWluaXRfXyddID09PSAxKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oXCJJdCBsb29rcyBsaWtlIHRoZXJlIGFyZSBzZXZlcmFsIGluc3RhbmNlcyBvZiAnc3R5bGVkLWNvbXBvbmVudHMnIGluaXRpYWxpemVkIGluIHRoaXMgYXBwbGljYXRpb24uIFwiICsgJ1RoaXMgbWF5IGNhdXNlIGR5bmFtaWMgc3R5bGVzIG5vdCByZW5kZXJpbmcgcHJvcGVybHksIGVycm9ycyBoYXBwZW5pbmcgZHVyaW5nIHJlaHlkcmF0aW9uIHByb2Nlc3MgJyArICdhbmQgbWFrZXMgeW91ciBhcHBsaWNhdGlvbiBiaWdnZXIgd2l0aG91dCBhIGdvb2QgcmVhc29uLlxcblxcbicgKyAnU2VlIGh0dHBzOi8vcy1jLnNoLzJCQVh6ZWQgZm9yIG1vcmUgaW5mby4nKTtcbiAgfVxuXG4gIHdpbmRvd1snX19zdHlsZWQtY29tcG9uZW50cy1pbml0X18nXSArPSAxO1xufVxuXG4vL1xuXG5leHBvcnQgZGVmYXVsdCBzdHlsZWQ7XG5leHBvcnQgeyBjcmVhdGVHbG9iYWxTdHlsZSwgY3NzLCBpc1N0eWxlZENvbXBvbmVudCwga2V5ZnJhbWVzLCBTZXJ2ZXJTdHlsZVNoZWV0LCBTdHlsZVNoZWV0Q29uc3VtZXIsIFN0eWxlU2hlZXRDb250ZXh0LCBTdHlsZVNoZWV0TWFuYWdlciwgVGhlbWVDb25zdW1lciwgVGhlbWVDb250ZXh0LCBUaGVtZVByb3ZpZGVyLCB3aXRoVGhlbWUsIF9fRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9IQVVOVEVEX0JZX1NQT09LWV9HSE9TVFMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0eWxlZC1jb21wb25lbnRzLmJyb3dzZXIuZXNtLmpzLm1hcFxuIiwidmFyIHVuaXRsZXNzS2V5cyA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IDEsXG4gIGJvcmRlckltYWdlT3V0c2V0OiAxLFxuICBib3JkZXJJbWFnZVNsaWNlOiAxLFxuICBib3JkZXJJbWFnZVdpZHRoOiAxLFxuICBib3hGbGV4OiAxLFxuICBib3hGbGV4R3JvdXA6IDEsXG4gIGJveE9yZGluYWxHcm91cDogMSxcbiAgY29sdW1uQ291bnQ6IDEsXG4gIGNvbHVtbnM6IDEsXG4gIGZsZXg6IDEsXG4gIGZsZXhHcm93OiAxLFxuICBmbGV4UG9zaXRpdmU6IDEsXG4gIGZsZXhTaHJpbms6IDEsXG4gIGZsZXhOZWdhdGl2ZTogMSxcbiAgZmxleE9yZGVyOiAxLFxuICBncmlkUm93OiAxLFxuICBncmlkUm93RW5kOiAxLFxuICBncmlkUm93U3BhbjogMSxcbiAgZ3JpZFJvd1N0YXJ0OiAxLFxuICBncmlkQ29sdW1uOiAxLFxuICBncmlkQ29sdW1uRW5kOiAxLFxuICBncmlkQ29sdW1uU3BhbjogMSxcbiAgZ3JpZENvbHVtblN0YXJ0OiAxLFxuICBtc0dyaWRSb3c6IDEsXG4gIG1zR3JpZFJvd1NwYW46IDEsXG4gIG1zR3JpZENvbHVtbjogMSxcbiAgbXNHcmlkQ29sdW1uU3BhbjogMSxcbiAgZm9udFdlaWdodDogMSxcbiAgbGluZUhlaWdodDogMSxcbiAgb3BhY2l0eTogMSxcbiAgb3JkZXI6IDEsXG4gIG9ycGhhbnM6IDEsXG4gIHRhYlNpemU6IDEsXG4gIHdpZG93czogMSxcbiAgekluZGV4OiAxLFxuICB6b29tOiAxLFxuICBXZWJraXRMaW5lQ2xhbXA6IDEsXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IDEsXG4gIGZsb29kT3BhY2l0eTogMSxcbiAgc3RvcE9wYWNpdHk6IDEsXG4gIHN0cm9rZURhc2hhcnJheTogMSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogMSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogMSxcbiAgc3Ryb2tlT3BhY2l0eTogMSxcbiAgc3Ryb2tlV2lkdGg6IDFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHVuaXRsZXNzS2V5cztcbiIsInZhciBzYWZlSXNOYU4gPSBOdW1iZXIuaXNOYU4gfHxcbiAgICBmdW5jdGlvbiBwb255ZmlsbCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gdmFsdWU7XG4gICAgfTtcbmZ1bmN0aW9uIGlzRXF1YWwoZmlyc3QsIHNlY29uZCkge1xuICAgIGlmIChmaXJzdCA9PT0gc2Vjb25kKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoc2FmZUlzTmFOKGZpcnN0KSAmJiBzYWZlSXNOYU4oc2Vjb25kKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gYXJlSW5wdXRzRXF1YWwobmV3SW5wdXRzLCBsYXN0SW5wdXRzKSB7XG4gICAgaWYgKG5ld0lucHV0cy5sZW5ndGggIT09IGxhc3RJbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdJbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFpc0VxdWFsKG5ld0lucHV0c1tpXSwgbGFzdElucHV0c1tpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWVtb2l6ZU9uZShyZXN1bHRGbiwgaXNFcXVhbCkge1xuICAgIGlmIChpc0VxdWFsID09PSB2b2lkIDApIHsgaXNFcXVhbCA9IGFyZUlucHV0c0VxdWFsOyB9XG4gICAgdmFyIGxhc3RUaGlzO1xuICAgIHZhciBsYXN0QXJncyA9IFtdO1xuICAgIHZhciBsYXN0UmVzdWx0O1xuICAgIHZhciBjYWxsZWRPbmNlID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgICAgIHZhciBuZXdBcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBuZXdBcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbGxlZE9uY2UgJiYgbGFzdFRoaXMgPT09IHRoaXMgJiYgaXNFcXVhbChuZXdBcmdzLCBsYXN0QXJncykpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGxhc3RSZXN1bHQgPSByZXN1bHRGbi5hcHBseSh0aGlzLCBuZXdBcmdzKTtcbiAgICAgICAgY2FsbGVkT25jZSA9IHRydWU7XG4gICAgICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICAgICAgbGFzdEFyZ3MgPSBuZXdBcmdzO1xuICAgICAgICByZXR1cm4gbGFzdFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZW1vaXplT25lO1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIGhhc1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKSA6IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKSA6IDB4ZWFjYjtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKSA6IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKSA6IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKSA6IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0JykgOiAweGVhY2U7IC8vIFRPRE86IFdlIGRvbid0IHVzZSBBc3luY01vZGUgb3IgQ29uY3VycmVudE1vZGUgYW55bW9yZS4gVGhleSB3ZXJlIHRlbXBvcmFyeVxuLy8gKHVuc3RhYmxlKSBBUElzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQuIENhbiB3ZSByZW1vdmUgdGhlIHN5bWJvbHM/XG5cbnZhciBSRUFDVF9BU1lOQ19NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5hc3luY19tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb25jdXJyZW50X21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKSA6IDB4ZWFkMDtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKSA6IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0JykgOiAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubWVtbycpIDogMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKSA6IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYmxvY2snKSA6IDB4ZWFkOTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnVuZGFtZW50YWwnKSA6IDB4ZWFkNTtcbnZhciBSRUFDVF9SRVNQT05ERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnJlc3BvbmRlcicpIDogMHhlYWQ2O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpIDogMHhlYWQ3O1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IC8vIE5vdGU6IGl0cyB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyBpZiBpdCdzIGEgcG9seWZpbGwuXG4gIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9SRVNQT05ERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9TQ09QRV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0JMT0NLX1RZUEUpO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0FTWU5DX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0gLy8gQXN5bmNNb2RlIGlzIGRlcHJlY2F0ZWQgYWxvbmcgd2l0aCBpc0FzeW5jTW9kZVxuXG52YXIgQXN5bmNNb2RlID0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xudmFyIENvbmN1cnJlbnRNb2RlID0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE3Ky4gVXBkYXRlIHlvdXIgY29kZSB0byB1c2UgJyArICdSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBpbnN0ZWFkLiBJdCBoYXMgdGhlIGV4YWN0IHNhbWUgQVBJLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkgfHwgdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5cbmV4cG9ydHMuQXN5bmNNb2RlID0gQXN5bmNNb2RlO1xuZXhwb3J0cy5Db25jdXJyZW50TW9kZSA9IENvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIihmdW5jdGlvbiAoZmFjdG9yeSkge1xuXHR0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyAobW9kdWxlWydleHBvcnRzJ10gPSBmYWN0b3J5KCkpIDpcblx0XHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10gPyBkZWZpbmUoZmFjdG9yeSgpKSA6XG5cdFx0XHQod2luZG93WydzdHlsaXNSdWxlU2hlZXQnXSA9IGZhY3RvcnkoKSlcbn0oZnVuY3Rpb24gKCkge1xuXG5cdCd1c2Ugc3RyaWN0J1xuXG5cdHJldHVybiBmdW5jdGlvbiAoaW5zZXJ0UnVsZSkge1xuXHRcdHZhciBkZWxpbWl0ZXIgPSAnLyp8Ki8nXG5cdFx0dmFyIG5lZWRsZSA9IGRlbGltaXRlcisnfSdcblxuXHRcdGZ1bmN0aW9uIHRvU2hlZXQgKGJsb2NrKSB7XG5cdFx0XHRpZiAoYmxvY2spXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0aW5zZXJ0UnVsZShibG9jayArICd9Jylcblx0XHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcnVsZVNoZWV0IChjb250ZXh0LCBjb250ZW50LCBzZWxlY3RvcnMsIHBhcmVudHMsIGxpbmUsIGNvbHVtbiwgbGVuZ3RoLCBucywgZGVwdGgsIGF0KSB7XG5cdFx0XHRzd2l0Y2ggKGNvbnRleHQpIHtcblx0XHRcdFx0Ly8gcHJvcGVydHlcblx0XHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRcdC8vIEBpbXBvcnRcblx0XHRcdFx0XHRpZiAoZGVwdGggPT09IDAgJiYgY29udGVudC5jaGFyQ29kZUF0KDApID09PSA2NClcblx0XHRcdFx0XHRcdHJldHVybiBpbnNlcnRSdWxlKGNvbnRlbnQrJzsnKSwgJydcblx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHQvLyBzZWxlY3RvclxuXHRcdFx0XHRjYXNlIDI6XG5cdFx0XHRcdFx0aWYgKG5zID09PSAwKVxuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRlbnQgKyBkZWxpbWl0ZXJcblx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHQvLyBhdC1ydWxlXG5cdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRzd2l0Y2ggKG5zKSB7XG5cdFx0XHRcdFx0XHQvLyBAZm9udC1mYWNlLCBAcGFnZVxuXHRcdFx0XHRcdFx0Y2FzZSAxMDI6XG5cdFx0XHRcdFx0XHRjYXNlIDExMjpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGluc2VydFJ1bGUoc2VsZWN0b3JzWzBdK2NvbnRlbnQpLCAnJ1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRlbnQgKyAoYXQgPT09IDAgPyBkZWxpbWl0ZXIgOiAnJylcblx0XHRcdFx0XHR9XG5cdFx0XHRcdGNhc2UgLTI6XG5cdFx0XHRcdFx0Y29udGVudC5zcGxpdChuZWVkbGUpLmZvckVhY2godG9TaGVldClcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pKVxuIiwiIWZ1bmN0aW9uKGUpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWUobnVsbCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShlKG51bGwpKTp3aW5kb3cuc3R5bGlzPWUobnVsbCl9KGZ1bmN0aW9uIGUoYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9L15cXDArL2csYz0vW1xcMFxcclxcZl0vZyxzPS86ICovZyx0PS96b298Z3JhLyxpPS8oWyw6IF0pKHRyYW5zZm9ybSkvZyxmPS8sK1xccyooPyFbXihdKlspXSkvZyxuPS8gK1xccyooPyFbXihdKlspXSkvZyxsPS8gKltcXDBdICovZyxvPS8sXFxyKz8vZyxoPS8oW1xcdFxcclxcbiBdKSpcXGY/Ji9nLHU9LzpnbG9iYWxcXCgoKD86W15cXChcXClcXFtcXF1dKnxcXFsuKlxcXXxcXChbXlxcKFxcKV0qXFwpKSopXFwpL2csZD0vXFxXKy9nLGI9L0Aoa1xcdyspXFxzKihcXFMqKVxccyovLHA9Lzo6KHBsYWNlKS9nLGs9LzoocmVhZC1vbmx5KS9nLGc9L1xccysoPz1be1xcXTs9Oj5dKS9nLEE9LyhbW309Oj5dKVxccysvZyxDPS8oXFx7W157XSs/KTsoPz1cXH0pL2csdz0vXFxzezIsfS9nLHY9LyhbXlxcKF0pKDorKSAqL2csbT0vW3N2aF1cXHcrLVt0YmxyXXsyfS8seD0vXFwoXFxzKiguKilcXHMqXFwpL2csJD0vKFtcXHNcXFNdKj8pOy9nLHk9Ly1zZWxmfGZsZXgtL2csTz0vW15dKj8oOltycF1bZWxdYVtcXHctXSspW15dKi8saj0vc3RyZXRjaHw6XFxzKlxcdytcXC0oPzpjb250ZXxhdmFpbCkvLHo9LyhbXi1dKShpbWFnZS1zZXRcXCgpLyxOPVwiLXdlYmtpdC1cIixTPVwiLW1vei1cIixGPVwiLW1zLVwiLFc9NTkscT0xMjUsQj0xMjMsRD00MCxFPTQxLEc9OTEsSD05MyxJPTEwLEo9MTMsSz05LEw9NjQsTT0zMixQPTM4LFE9NDUsUj05NSxUPTQyLFU9NDQsVj01OCxYPTM5LFk9MzQsWj00NyxfPTYyLGVlPTQzLGFlPTEyNixyZT0wLGNlPTEyLHNlPTExLHRlPTEwNyxpZT0xMDksZmU9MTE1LG5lPTExMixsZT0xMTEsb2U9MTA1LGhlPTk5LHVlPTEwMCxkZT0xMTIsYmU9MSxwZT0xLGtlPTAsZ2U9MSxBZT0xLENlPTEsd2U9MCx2ZT0wLG1lPTAseGU9W10sJGU9W10seWU9MCxPZT1udWxsLGplPS0yLHplPS0xLE5lPTAsU2U9MSxGZT0yLFdlPTMscWU9MCxCZT0xLERlPVwiXCIsRWU9XCJcIixHZT1cIlwiO2Z1bmN0aW9uIEhlKGUsYSxzLHQsaSl7Zm9yKHZhciBmLG4sbz0wLGg9MCx1PTAsZD0wLGc9MCxBPTAsQz0wLHc9MCxtPTAsJD0wLHk9MCxPPTAsaj0wLHo9MCxSPTAsd2U9MCwkZT0wLE9lPTAsamU9MCx6ZT1zLmxlbmd0aCxKZT16ZS0xLFJlPVwiXCIsVGU9XCJcIixVZT1cIlwiLFZlPVwiXCIsWGU9XCJcIixZZT1cIlwiO1I8emU7KXtpZihDPXMuY2hhckNvZGVBdChSKSxSPT09SmUpaWYoaCtkK3UrbyE9PTApe2lmKDAhPT1oKUM9aD09PVo/STpaO2Q9dT1vPTAsemUrKyxKZSsrfWlmKGgrZCt1K289PT0wKXtpZihSPT09SmUpe2lmKHdlPjApVGU9VGUucmVwbGFjZShjLFwiXCIpO2lmKFRlLnRyaW0oKS5sZW5ndGg+MCl7c3dpdGNoKEMpe2Nhc2UgTTpjYXNlIEs6Y2FzZSBXOmNhc2UgSjpjYXNlIEk6YnJlYWs7ZGVmYXVsdDpUZSs9cy5jaGFyQXQoUil9Qz1XfX1pZigxPT09JGUpc3dpdGNoKEMpe2Nhc2UgQjpjYXNlIHE6Y2FzZSBXOmNhc2UgWTpjYXNlIFg6Y2FzZSBEOmNhc2UgRTpjYXNlIFU6JGU9MDtjYXNlIEs6Y2FzZSBKOmNhc2UgSTpjYXNlIE06YnJlYWs7ZGVmYXVsdDpmb3IoJGU9MCxqZT1SLGc9QyxSLS0sQz1XO2plPHplOylzd2l0Y2gocy5jaGFyQ29kZUF0KGplKyspKXtjYXNlIEk6Y2FzZSBKOmNhc2UgVzorK1IsQz1nLGplPXplO2JyZWFrO2Nhc2UgVjppZih3ZT4wKSsrUixDPWc7Y2FzZSBCOmplPXplfX1zd2l0Y2goQyl7Y2FzZSBCOmZvcihnPShUZT1UZS50cmltKCkpLmNoYXJDb2RlQXQoMCkseT0xLGplPSsrUjtSPHplOyl7c3dpdGNoKEM9cy5jaGFyQ29kZUF0KFIpKXtjYXNlIEI6eSsrO2JyZWFrO2Nhc2UgcTp5LS07YnJlYWs7Y2FzZSBaOnN3aXRjaChBPXMuY2hhckNvZGVBdChSKzEpKXtjYXNlIFQ6Y2FzZSBaOlI9UWUoQSxSLEplLHMpfWJyZWFrO2Nhc2UgRzpDKys7Y2FzZSBEOkMrKztjYXNlIFk6Y2FzZSBYOmZvcig7UisrPEplJiZzLmNoYXJDb2RlQXQoUikhPT1DOyk7fWlmKDA9PT15KWJyZWFrO1IrK31pZihVZT1zLnN1YnN0cmluZyhqZSxSKSxnPT09cmUpZz0oVGU9VGUucmVwbGFjZShyLFwiXCIpLnRyaW0oKSkuY2hhckNvZGVBdCgwKTtzd2l0Y2goZyl7Y2FzZSBMOmlmKHdlPjApVGU9VGUucmVwbGFjZShjLFwiXCIpO3N3aXRjaChBPVRlLmNoYXJDb2RlQXQoMSkpe2Nhc2UgdWU6Y2FzZSBpZTpjYXNlIGZlOmNhc2UgUTpmPWE7YnJlYWs7ZGVmYXVsdDpmPXhlfWlmKGplPShVZT1IZShhLGYsVWUsQSxpKzEpKS5sZW5ndGgsbWU+MCYmMD09PWplKWplPVRlLmxlbmd0aDtpZih5ZT4wKWlmKGY9SWUoeGUsVGUsT2UpLG49UGUoV2UsVWUsZixhLHBlLGJlLGplLEEsaSx0KSxUZT1mLmpvaW4oXCJcIiksdm9pZCAwIT09bilpZigwPT09KGplPShVZT1uLnRyaW0oKSkubGVuZ3RoKSlBPTAsVWU9XCJcIjtpZihqZT4wKXN3aXRjaChBKXtjYXNlIGZlOlRlPVRlLnJlcGxhY2UoeCxNZSk7Y2FzZSB1ZTpjYXNlIGllOmNhc2UgUTpVZT1UZStcIntcIitVZStcIn1cIjticmVhaztjYXNlIHRlOmlmKFVlPShUZT1UZS5yZXBsYWNlKGIsXCIkMSAkMlwiKyhCZT4wP0RlOlwiXCIpKSkrXCJ7XCIrVWUrXCJ9XCIsMT09PUFlfHwyPT09QWUmJkxlKFwiQFwiK1VlLDMpKVVlPVwiQFwiK04rVWUrXCJAXCIrVWU7ZWxzZSBVZT1cIkBcIitVZTticmVhaztkZWZhdWx0OmlmKFVlPVRlK1VlLHQ9PT1kZSlWZSs9VWUsVWU9XCJcIn1lbHNlIFVlPVwiXCI7YnJlYWs7ZGVmYXVsdDpVZT1IZShhLEllKGEsVGUsT2UpLFVlLHQsaSsxKX1YZSs9VWUsTz0wLCRlPTAsej0wLHdlPTAsT2U9MCxqPTAsVGU9XCJcIixVZT1cIlwiLEM9cy5jaGFyQ29kZUF0KCsrUik7YnJlYWs7Y2FzZSBxOmNhc2UgVzppZigoamU9KFRlPSh3ZT4wP1RlLnJlcGxhY2UoYyxcIlwiKTpUZSkudHJpbSgpKS5sZW5ndGgpPjEpe2lmKDA9PT16KWlmKChnPVRlLmNoYXJDb2RlQXQoMCkpPT09UXx8Zz45NiYmZzwxMjMpamU9KFRlPVRlLnJlcGxhY2UoXCIgXCIsXCI6XCIpKS5sZW5ndGg7aWYoeWU+MClpZih2b2lkIDAhPT0obj1QZShTZSxUZSxhLGUscGUsYmUsVmUubGVuZ3RoLHQsaSx0KSkpaWYoMD09PShqZT0oVGU9bi50cmltKCkpLmxlbmd0aCkpVGU9XCJcXDBcXDBcIjtzd2l0Y2goZz1UZS5jaGFyQ29kZUF0KDApLEE9VGUuY2hhckNvZGVBdCgxKSxnKXtjYXNlIHJlOmJyZWFrO2Nhc2UgTDppZihBPT09b2V8fEE9PT1oZSl7WWUrPVRlK3MuY2hhckF0KFIpO2JyZWFrfWRlZmF1bHQ6aWYoVGUuY2hhckNvZGVBdChqZS0xKT09PVYpYnJlYWs7VmUrPUtlKFRlLGcsQSxUZS5jaGFyQ29kZUF0KDIpKX19Tz0wLCRlPTAsej0wLHdlPTAsT2U9MCxUZT1cIlwiLEM9cy5jaGFyQ29kZUF0KCsrUil9fXN3aXRjaChDKXtjYXNlIEo6Y2FzZSBJOmlmKGgrZCt1K28rdmU9PT0wKXN3aXRjaCgkKXtjYXNlIEU6Y2FzZSBYOmNhc2UgWTpjYXNlIEw6Y2FzZSBhZTpjYXNlIF86Y2FzZSBUOmNhc2UgZWU6Y2FzZSBaOmNhc2UgUTpjYXNlIFY6Y2FzZSBVOmNhc2UgVzpjYXNlIEI6Y2FzZSBxOmJyZWFrO2RlZmF1bHQ6aWYoej4wKSRlPTF9aWYoaD09PVopaD0wO2Vsc2UgaWYoZ2UrTz09PTAmJnQhPT10ZSYmVGUubGVuZ3RoPjApd2U9MSxUZSs9XCJcXDBcIjtpZih5ZSpxZT4wKVBlKE5lLFRlLGEsZSxwZSxiZSxWZS5sZW5ndGgsdCxpLHQpO2JlPTEscGUrKzticmVhaztjYXNlIFc6Y2FzZSBxOmlmKGgrZCt1K289PT0wKXtiZSsrO2JyZWFrfWRlZmF1bHQ6c3dpdGNoKGJlKyssUmU9cy5jaGFyQXQoUiksQyl7Y2FzZSBLOmNhc2UgTTppZihkK28raD09PTApc3dpdGNoKHcpe2Nhc2UgVTpjYXNlIFY6Y2FzZSBLOmNhc2UgTTpSZT1cIlwiO2JyZWFrO2RlZmF1bHQ6aWYoQyE9PU0pUmU9XCIgXCJ9YnJlYWs7Y2FzZSByZTpSZT1cIlxcXFwwXCI7YnJlYWs7Y2FzZSBjZTpSZT1cIlxcXFxmXCI7YnJlYWs7Y2FzZSBzZTpSZT1cIlxcXFx2XCI7YnJlYWs7Y2FzZSBQOmlmKGQraCtvPT09MCYmZ2U+MClPZT0xLHdlPTEsUmU9XCJcXGZcIitSZTticmVhaztjYXNlIDEwODppZihkK2grbytrZT09PTAmJno+MClzd2l0Y2goUi16KXtjYXNlIDI6aWYodz09PW5lJiZzLmNoYXJDb2RlQXQoUi0zKT09PVYpa2U9dztjYXNlIDg6aWYobT09PWxlKWtlPW19YnJlYWs7Y2FzZSBWOmlmKGQraCtvPT09MCl6PVI7YnJlYWs7Y2FzZSBVOmlmKGgrdStkK289PT0wKXdlPTEsUmUrPVwiXFxyXCI7YnJlYWs7Y2FzZSBZOmNhc2UgWDppZigwPT09aClkPWQ9PT1DPzA6MD09PWQ/QzpkO2JyZWFrO2Nhc2UgRzppZihkK2grdT09PTApbysrO2JyZWFrO2Nhc2UgSDppZihkK2grdT09PTApby0tO2JyZWFrO2Nhc2UgRTppZihkK2grbz09PTApdS0tO2JyZWFrO2Nhc2UgRDppZihkK2grbz09PTApe2lmKDA9PT1PKXN3aXRjaCgyKncrMyptKXtjYXNlIDUzMzpicmVhaztkZWZhdWx0Onk9MCxPPTF9dSsrfWJyZWFrO2Nhc2UgTDppZihoK3UrZCtvK3oraj09PTApaj0xO2JyZWFrO2Nhc2UgVDpjYXNlIFo6aWYoZCtvK3U+MClicmVhaztzd2l0Y2goaCl7Y2FzZSAwOnN3aXRjaCgyKkMrMypzLmNoYXJDb2RlQXQoUisxKSl7Y2FzZSAyMzU6aD1aO2JyZWFrO2Nhc2UgMjIwOmplPVIsaD1UfWJyZWFrO2Nhc2UgVDppZihDPT09WiYmdz09PVQmJmplKzIhPT1SKXtpZigzMz09PXMuY2hhckNvZGVBdChqZSsyKSlWZSs9cy5zdWJzdHJpbmcoamUsUisxKTtSZT1cIlwiLGg9MH19fWlmKDA9PT1oKXtpZihnZStkK28raj09PTAmJnQhPT10ZSYmQyE9PVcpc3dpdGNoKEMpe2Nhc2UgVTpjYXNlIGFlOmNhc2UgXzpjYXNlIGVlOmNhc2UgRTpjYXNlIEQ6aWYoMD09PU8pe3N3aXRjaCh3KXtjYXNlIEs6Y2FzZSBNOmNhc2UgSTpjYXNlIEo6UmUrPVwiXFwwXCI7YnJlYWs7ZGVmYXVsdDpSZT1cIlxcMFwiK1JlKyhDPT09VT9cIlwiOlwiXFwwXCIpfXdlPTF9ZWxzZSBzd2l0Y2goQyl7Y2FzZSBEOmlmKHorNz09PVImJjEwOD09PXcpej0wO089Kyt5O2JyZWFrO2Nhc2UgRTppZigwPT0oTz0tLXkpKXdlPTEsUmUrPVwiXFwwXCJ9YnJlYWs7Y2FzZSBLOmNhc2UgTTpzd2l0Y2godyl7Y2FzZSByZTpjYXNlIEI6Y2FzZSBxOmNhc2UgVzpjYXNlIFU6Y2FzZSBjZTpjYXNlIEs6Y2FzZSBNOmNhc2UgSTpjYXNlIEo6YnJlYWs7ZGVmYXVsdDppZigwPT09Tyl3ZT0xLFJlKz1cIlxcMFwifX1pZihUZSs9UmUsQyE9PU0mJkMhPT1LKSQ9Q319bT13LHc9QyxSKyt9aWYoamU9VmUubGVuZ3RoLG1lPjApaWYoMD09PWplJiYwPT09WGUubGVuZ3RoJiYwPT09YVswXS5sZW5ndGg9PWZhbHNlKWlmKHQhPT1pZXx8MT09PWEubGVuZ3RoJiYoZ2U+MD9FZTpHZSk9PT1hWzBdKWplPWEuam9pbihcIixcIikubGVuZ3RoKzI7aWYoamU+MCl7aWYoZj0wPT09Z2UmJnQhPT10ZT9mdW5jdGlvbihlKXtmb3IodmFyIGEscixzPTAsdD1lLmxlbmd0aCxpPUFycmF5KHQpO3M8dDsrK3Mpe2Zvcih2YXIgZj1lW3NdLnNwbGl0KGwpLG49XCJcIixvPTAsaD0wLHU9MCxkPTAsYj1mLmxlbmd0aDtvPGI7KytvKXtpZigwPT09KGg9KHI9ZltvXSkubGVuZ3RoKSYmYj4xKWNvbnRpbnVlO2lmKHU9bi5jaGFyQ29kZUF0KG4ubGVuZ3RoLTEpLGQ9ci5jaGFyQ29kZUF0KDApLGE9XCJcIiwwIT09bylzd2l0Y2godSl7Y2FzZSBUOmNhc2UgYWU6Y2FzZSBfOmNhc2UgZWU6Y2FzZSBNOmNhc2UgRDpicmVhaztkZWZhdWx0OmE9XCIgXCJ9c3dpdGNoKGQpe2Nhc2UgUDpyPWErRWU7Y2FzZSBhZTpjYXNlIF86Y2FzZSBlZTpjYXNlIE06Y2FzZSBFOmNhc2UgRDpicmVhaztjYXNlIEc6cj1hK3IrRWU7YnJlYWs7Y2FzZSBWOnN3aXRjaCgyKnIuY2hhckNvZGVBdCgxKSszKnIuY2hhckNvZGVBdCgyKSl7Y2FzZSA1MzA6aWYoQ2U+MCl7cj1hK3Iuc3Vic3RyaW5nKDgsaC0xKTticmVha31kZWZhdWx0OmlmKG88MXx8ZltvLTFdLmxlbmd0aDwxKXI9YStFZStyfWJyZWFrO2Nhc2UgVTphPVwiXCI7ZGVmYXVsdDppZihoPjEmJnIuaW5kZXhPZihcIjpcIik+MClyPWErci5yZXBsYWNlKHYsXCIkMVwiK0VlK1wiJDJcIik7ZWxzZSByPWErcitFZX1uKz1yfWlbc109bi5yZXBsYWNlKGMsXCJcIikudHJpbSgpfXJldHVybiBpfShhKTphLHllPjApaWYodm9pZCAwIT09KG49UGUoRmUsVmUsZixlLHBlLGJlLGplLHQsaSx0KSkmJjA9PT0oVmU9bikubGVuZ3RoKXJldHVybiBZZStWZStYZTtpZihWZT1mLmpvaW4oXCIsXCIpK1wie1wiK1ZlK1wifVwiLEFlKmtlIT0wKXtpZigyPT09QWUmJiFMZShWZSwyKSlrZT0wO3N3aXRjaChrZSl7Y2FzZSBsZTpWZT1WZS5yZXBsYWNlKGssXCI6XCIrUytcIiQxXCIpK1ZlO2JyZWFrO2Nhc2UgbmU6VmU9VmUucmVwbGFjZShwLFwiOjpcIitOK1wiaW5wdXQtJDFcIikrVmUucmVwbGFjZShwLFwiOjpcIitTK1wiJDFcIikrVmUucmVwbGFjZShwLFwiOlwiK0YrXCJpbnB1dC0kMVwiKStWZX1rZT0wfX1yZXR1cm4gWWUrVmUrWGV9ZnVuY3Rpb24gSWUoZSxhLHIpe3ZhciBjPWEudHJpbSgpLnNwbGl0KG8pLHM9Yyx0PWMubGVuZ3RoLGk9ZS5sZW5ndGg7c3dpdGNoKGkpe2Nhc2UgMDpjYXNlIDE6Zm9yKHZhciBmPTAsbj0wPT09aT9cIlwiOmVbMF0rXCIgXCI7Zjx0OysrZilzW2ZdPUplKG4sc1tmXSxyLGkpLnRyaW0oKTticmVhaztkZWZhdWx0OmY9MDt2YXIgbD0wO2ZvcihzPVtdO2Y8dDsrK2YpZm9yKHZhciBoPTA7aDxpOysraClzW2wrK109SmUoZVtoXStcIiBcIixjW2ZdLHIsaSkudHJpbSgpfXJldHVybiBzfWZ1bmN0aW9uIEplKGUsYSxyLGMpe3ZhciBzPWEsdD1zLmNoYXJDb2RlQXQoMCk7aWYodDwzMyl0PShzPXMudHJpbSgpKS5jaGFyQ29kZUF0KDApO3N3aXRjaCh0KXtjYXNlIFA6c3dpdGNoKGdlK2Mpe2Nhc2UgMDpjYXNlIDE6aWYoMD09PWUudHJpbSgpLmxlbmd0aClicmVhaztkZWZhdWx0OnJldHVybiBzLnJlcGxhY2UoaCxcIiQxXCIrZS50cmltKCkpfWJyZWFrO2Nhc2UgVjpzd2l0Y2gocy5jaGFyQ29kZUF0KDEpKXtjYXNlIDEwMzppZihDZT4wJiZnZT4wKXJldHVybiBzLnJlcGxhY2UodSxcIiQxXCIpLnJlcGxhY2UoaCxcIiQxXCIrR2UpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIGUudHJpbSgpK3MucmVwbGFjZShoLFwiJDFcIitlLnRyaW0oKSl9ZGVmYXVsdDppZihyKmdlPjAmJnMuaW5kZXhPZihcIlxcZlwiKT4wKXJldHVybiBzLnJlcGxhY2UoaCwoZS5jaGFyQ29kZUF0KDApPT09Vj9cIlwiOlwiJDFcIikrZS50cmltKCkpfXJldHVybiBlK3N9ZnVuY3Rpb24gS2UoZSxhLHIsYyl7dmFyIGwsbz0wLGg9ZStcIjtcIix1PTIqYSszKnIrNCpjO2lmKDk0ND09PXUpcmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBhPWUubGVuZ3RoLHI9ZS5pbmRleE9mKFwiOlwiLDkpKzEsYz1lLnN1YnN0cmluZygwLHIpLnRyaW0oKSxzPWUuc3Vic3RyaW5nKHIsYS0xKS50cmltKCk7c3dpdGNoKGUuY2hhckNvZGVBdCg5KSpCZSl7Y2FzZSAwOmJyZWFrO2Nhc2UgUTppZigxMTAhPT1lLmNoYXJDb2RlQXQoMTApKWJyZWFrO2RlZmF1bHQ6Zm9yKHZhciB0PXMuc3BsaXQoKHM9XCJcIixmKSksaT0wLHI9MCxhPXQubGVuZ3RoO2k8YTtyPTAsKytpKXtmb3IodmFyIGw9dFtpXSxvPWwuc3BsaXQobik7bD1vW3JdOyl7dmFyIGg9bC5jaGFyQ29kZUF0KDApO2lmKDE9PT1CZSYmKGg+TCYmaDw5MHx8aD45NiYmaDwxMjN8fGg9PT1SfHxoPT09USYmbC5jaGFyQ29kZUF0KDEpIT09USkpc3dpdGNoKGlzTmFOKHBhcnNlRmxvYXQobCkpKygtMSE9PWwuaW5kZXhPZihcIihcIikpKXtjYXNlIDE6c3dpdGNoKGwpe2Nhc2VcImluZmluaXRlXCI6Y2FzZVwiYWx0ZXJuYXRlXCI6Y2FzZVwiYmFja3dhcmRzXCI6Y2FzZVwicnVubmluZ1wiOmNhc2VcIm5vcm1hbFwiOmNhc2VcImZvcndhcmRzXCI6Y2FzZVwiYm90aFwiOmNhc2VcIm5vbmVcIjpjYXNlXCJsaW5lYXJcIjpjYXNlXCJlYXNlXCI6Y2FzZVwiZWFzZS1pblwiOmNhc2VcImVhc2Utb3V0XCI6Y2FzZVwiZWFzZS1pbi1vdXRcIjpjYXNlXCJwYXVzZWRcIjpjYXNlXCJyZXZlcnNlXCI6Y2FzZVwiYWx0ZXJuYXRlLXJldmVyc2VcIjpjYXNlXCJpbmhlcml0XCI6Y2FzZVwiaW5pdGlhbFwiOmNhc2VcInVuc2V0XCI6Y2FzZVwic3RlcC1zdGFydFwiOmNhc2VcInN0ZXAtZW5kXCI6YnJlYWs7ZGVmYXVsdDpsKz1EZX19b1tyKytdPWx9cys9KDA9PT1pP1wiXCI6XCIsXCIpK28uam9pbihcIiBcIil9fWlmKHM9YytzK1wiO1wiLDE9PT1BZXx8Mj09PUFlJiZMZShzLDEpKXJldHVybiBOK3MrcztyZXR1cm4gc30oaCk7ZWxzZSBpZigwPT09QWV8fDI9PT1BZSYmIUxlKGgsMSkpcmV0dXJuIGg7c3dpdGNoKHUpe2Nhc2UgMTAxNTpyZXR1cm4gOTc9PT1oLmNoYXJDb2RlQXQoMTApP04raCtoOmg7Y2FzZSA5NTE6cmV0dXJuIDExNj09PWguY2hhckNvZGVBdCgzKT9OK2graDpoO2Nhc2UgOTYzOnJldHVybiAxMTA9PT1oLmNoYXJDb2RlQXQoNSk/TitoK2g6aDtjYXNlIDEwMDk6aWYoMTAwIT09aC5jaGFyQ29kZUF0KDQpKWJyZWFrO2Nhc2UgOTY5OmNhc2UgOTQyOnJldHVybiBOK2graDtjYXNlIDk3ODpyZXR1cm4gTitoK1MraCtoO2Nhc2UgMTAxOTpjYXNlIDk4MzpyZXR1cm4gTitoK1MraCtGK2graDtjYXNlIDg4MzppZihoLmNoYXJDb2RlQXQoOCk9PT1RKXJldHVybiBOK2graDtpZihoLmluZGV4T2YoXCJpbWFnZS1zZXQoXCIsMTEpPjApcmV0dXJuIGgucmVwbGFjZSh6LFwiJDFcIitOK1wiJDJcIikraDtyZXR1cm4gaDtjYXNlIDkzMjppZihoLmNoYXJDb2RlQXQoNCk9PT1RKXN3aXRjaChoLmNoYXJDb2RlQXQoNSkpe2Nhc2UgMTAzOnJldHVybiBOK1wiYm94LVwiK2gucmVwbGFjZShcIi1ncm93XCIsXCJcIikrTitoK0YraC5yZXBsYWNlKFwiZ3Jvd1wiLFwicG9zaXRpdmVcIikraDtjYXNlIDExNTpyZXR1cm4gTitoK0YraC5yZXBsYWNlKFwic2hyaW5rXCIsXCJuZWdhdGl2ZVwiKStoO2Nhc2UgOTg6cmV0dXJuIE4raCtGK2gucmVwbGFjZShcImJhc2lzXCIsXCJwcmVmZXJyZWQtc2l6ZVwiKStofXJldHVybiBOK2grRitoK2g7Y2FzZSA5NjQ6cmV0dXJuIE4raCtGK1wiZmxleC1cIitoK2g7Y2FzZSAxMDIzOmlmKDk5IT09aC5jaGFyQ29kZUF0KDgpKWJyZWFrO3JldHVybiBsPWguc3Vic3RyaW5nKGguaW5kZXhPZihcIjpcIiwxNSkpLnJlcGxhY2UoXCJmbGV4LVwiLFwiXCIpLnJlcGxhY2UoXCJzcGFjZS1iZXR3ZWVuXCIsXCJqdXN0aWZ5XCIpLE4rXCJib3gtcGFja1wiK2wrTitoK0YrXCJmbGV4LXBhY2tcIitsK2g7Y2FzZSAxMDA1OnJldHVybiB0LnRlc3QoaCk/aC5yZXBsYWNlKHMsXCI6XCIrTikraC5yZXBsYWNlKHMsXCI6XCIrUykraDpoO2Nhc2UgMWUzOnN3aXRjaChvPShsPWguc3Vic3RyaW5nKDEzKS50cmltKCkpLmluZGV4T2YoXCItXCIpKzEsbC5jaGFyQ29kZUF0KDApK2wuY2hhckNvZGVBdChvKSl7Y2FzZSAyMjY6bD1oLnJlcGxhY2UobSxcInRiXCIpO2JyZWFrO2Nhc2UgMjMyOmw9aC5yZXBsYWNlKG0sXCJ0Yi1ybFwiKTticmVhaztjYXNlIDIyMDpsPWgucmVwbGFjZShtLFwibHJcIik7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gaH1yZXR1cm4gTitoK0YrbCtoO2Nhc2UgMTAxNzppZigtMT09PWguaW5kZXhPZihcInN0aWNreVwiLDkpKXJldHVybiBoO2Nhc2UgOTc1OnN3aXRjaChvPShoPWUpLmxlbmd0aC0xMCx1PShsPSgzMz09PWguY2hhckNvZGVBdChvKT9oLnN1YnN0cmluZygwLG8pOmgpLnN1YnN0cmluZyhlLmluZGV4T2YoXCI6XCIsNykrMSkudHJpbSgpKS5jaGFyQ29kZUF0KDApKygwfGwuY2hhckNvZGVBdCg3KSkpe2Nhc2UgMjAzOmlmKGwuY2hhckNvZGVBdCg4KTwxMTEpYnJlYWs7Y2FzZSAxMTU6aD1oLnJlcGxhY2UobCxOK2wpK1wiO1wiK2g7YnJlYWs7Y2FzZSAyMDc6Y2FzZSAxMDI6aD1oLnJlcGxhY2UobCxOKyh1PjEwMj9cImlubGluZS1cIjpcIlwiKStcImJveFwiKStcIjtcIitoLnJlcGxhY2UobCxOK2wpK1wiO1wiK2gucmVwbGFjZShsLEYrbCtcImJveFwiKStcIjtcIitofXJldHVybiBoK1wiO1wiO2Nhc2UgOTM4OmlmKGguY2hhckNvZGVBdCg1KT09PVEpc3dpdGNoKGguY2hhckNvZGVBdCg2KSl7Y2FzZSAxMDU6cmV0dXJuIGw9aC5yZXBsYWNlKFwiLWl0ZW1zXCIsXCJcIiksTitoK04rXCJib3gtXCIrbCtGK1wiZmxleC1cIitsK2g7Y2FzZSAxMTU6cmV0dXJuIE4raCtGK1wiZmxleC1pdGVtLVwiK2gucmVwbGFjZSh5LFwiXCIpK2g7ZGVmYXVsdDpyZXR1cm4gTitoK0YrXCJmbGV4LWxpbmUtcGFja1wiK2gucmVwbGFjZShcImFsaWduLWNvbnRlbnRcIixcIlwiKS5yZXBsYWNlKHksXCJcIikraH1icmVhaztjYXNlIDk3MzpjYXNlIDk4OTppZihoLmNoYXJDb2RlQXQoMykhPT1RfHwxMjI9PT1oLmNoYXJDb2RlQXQoNCkpYnJlYWs7Y2FzZSA5MzE6Y2FzZSA5NTM6aWYodHJ1ZT09PWoudGVzdChlKSlpZigxMTU9PT0obD1lLnN1YnN0cmluZyhlLmluZGV4T2YoXCI6XCIpKzEpKS5jaGFyQ29kZUF0KDApKXJldHVybiBLZShlLnJlcGxhY2UoXCJzdHJldGNoXCIsXCJmaWxsLWF2YWlsYWJsZVwiKSxhLHIsYykucmVwbGFjZShcIjpmaWxsLWF2YWlsYWJsZVwiLFwiOnN0cmV0Y2hcIik7ZWxzZSByZXR1cm4gaC5yZXBsYWNlKGwsTitsKStoLnJlcGxhY2UobCxTK2wucmVwbGFjZShcImZpbGwtXCIsXCJcIikpK2g7YnJlYWs7Y2FzZSA5NjI6aWYoaD1OK2grKDEwMj09PWguY2hhckNvZGVBdCg1KT9GK2g6XCJcIikraCxyK2M9PT0yMTEmJjEwNT09PWguY2hhckNvZGVBdCgxMykmJmguaW5kZXhPZihcInRyYW5zZm9ybVwiLDEwKT4wKXJldHVybiBoLnN1YnN0cmluZygwLGguaW5kZXhPZihcIjtcIiwyNykrMSkucmVwbGFjZShpLFwiJDFcIitOK1wiJDJcIikraH1yZXR1cm4gaH1mdW5jdGlvbiBMZShlLGEpe3ZhciByPWUuaW5kZXhPZigxPT09YT9cIjpcIjpcIntcIiksYz1lLnN1YnN0cmluZygwLDMhPT1hP3I6MTApLHM9ZS5zdWJzdHJpbmcocisxLGUubGVuZ3RoLTEpO3JldHVybiBPZSgyIT09YT9jOmMucmVwbGFjZShPLFwiJDFcIikscyxhKX1mdW5jdGlvbiBNZShlLGEpe3ZhciByPUtlKGEsYS5jaGFyQ29kZUF0KDApLGEuY2hhckNvZGVBdCgxKSxhLmNoYXJDb2RlQXQoMikpO3JldHVybiByIT09YStcIjtcIj9yLnJlcGxhY2UoJCxcIiBvciAoJDEpXCIpLnN1YnN0cmluZyg0KTpcIihcIithK1wiKVwifWZ1bmN0aW9uIFBlKGUsYSxyLGMscyx0LGksZixuLGwpe2Zvcih2YXIgbyxoPTAsdT1hO2g8eWU7KytoKXN3aXRjaChvPSRlW2hdLmNhbGwoVGUsZSx1LHIsYyxzLHQsaSxmLG4sbCkpe2Nhc2Ugdm9pZCAwOmNhc2UgZmFsc2U6Y2FzZSB0cnVlOmNhc2UgbnVsbDpicmVhaztkZWZhdWx0OnU9b31pZih1IT09YSlyZXR1cm4gdX1mdW5jdGlvbiBRZShlLGEscixjKXtmb3IodmFyIHM9YSsxO3M8cjsrK3Mpc3dpdGNoKGMuY2hhckNvZGVBdChzKSl7Y2FzZSBaOmlmKGU9PT1UKWlmKGMuY2hhckNvZGVBdChzLTEpPT09VCYmYSsyIT09cylyZXR1cm4gcysxO2JyZWFrO2Nhc2UgSTppZihlPT09WilyZXR1cm4gcysxfXJldHVybiBzfWZ1bmN0aW9uIFJlKGUpe2Zvcih2YXIgYSBpbiBlKXt2YXIgcj1lW2FdO3N3aXRjaChhKXtjYXNlXCJrZXlmcmFtZVwiOkJlPTB8cjticmVhaztjYXNlXCJnbG9iYWxcIjpDZT0wfHI7YnJlYWs7Y2FzZVwiY2FzY2FkZVwiOmdlPTB8cjticmVhaztjYXNlXCJjb21wcmVzc1wiOndlPTB8cjticmVhaztjYXNlXCJzZW1pY29sb25cIjp2ZT0wfHI7YnJlYWs7Y2FzZVwicHJlc2VydmVcIjptZT0wfHI7YnJlYWs7Y2FzZVwicHJlZml4XCI6aWYoT2U9bnVsbCwhcilBZT0wO2Vsc2UgaWYoXCJmdW5jdGlvblwiIT10eXBlb2YgcilBZT0xO2Vsc2UgQWU9MixPZT1yfX1yZXR1cm4gUmV9ZnVuY3Rpb24gVGUoYSxyKXtpZih2b2lkIDAhPT10aGlzJiZ0aGlzLmNvbnN0cnVjdG9yPT09VGUpcmV0dXJuIGUoYSk7dmFyIHM9YSx0PXMuY2hhckNvZGVBdCgwKTtpZih0PDMzKXQ9KHM9cy50cmltKCkpLmNoYXJDb2RlQXQoMCk7aWYoQmU+MClEZT1zLnJlcGxhY2UoZCx0PT09Rz9cIlwiOlwiLVwiKTtpZih0PTEsMT09PWdlKUdlPXM7ZWxzZSBFZT1zO3ZhciBpLGY9W0dlXTtpZih5ZT4wKWlmKHZvaWQgMCE9PShpPVBlKHplLHIsZixmLHBlLGJlLDAsMCwwLDApKSYmXCJzdHJpbmdcIj09dHlwZW9mIGkpcj1pO3ZhciBuPUhlKHhlLGYsciwwLDApO2lmKHllPjApaWYodm9pZCAwIT09KGk9UGUoamUsbixmLGYscGUsYmUsbi5sZW5ndGgsMCwwLDApKSYmXCJzdHJpbmdcIiE9dHlwZW9mKG49aSkpdD0wO3JldHVybiBEZT1cIlwiLEdlPVwiXCIsRWU9XCJcIixrZT0wLHBlPTEsYmU9MSx3ZSp0PT0wP246bi5yZXBsYWNlKGMsXCJcIikucmVwbGFjZShnLFwiXCIpLnJlcGxhY2UoQSxcIiQxXCIpLnJlcGxhY2UoQyxcIiQxXCIpLnJlcGxhY2UodyxcIiBcIil9aWYoVGUudXNlPWZ1bmN0aW9uIGUoYSl7c3dpdGNoKGEpe2Nhc2Ugdm9pZCAwOmNhc2UgbnVsbDp5ZT0kZS5sZW5ndGg9MDticmVhaztkZWZhdWx0OmlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGEpJGVbeWUrK109YTtlbHNlIGlmKFwib2JqZWN0XCI9PXR5cGVvZiBhKWZvcih2YXIgcj0wLGM9YS5sZW5ndGg7cjxjOysrcillKGFbcl0pO2Vsc2UgcWU9MHwhIWF9cmV0dXJuIGV9LFRlLnNldD1SZSx2b2lkIDAhPT1hKVJlKGEpO3JldHVybiBUZX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3R5bGlzLm1pbi5qcy5tYXAiLCIvKiFcbiogdGFiYmFibGUgNi4yLjBcbiogQGxpY2Vuc2UgTUlULCBodHRwczovL2dpdGh1Yi5jb20vZm9jdXMtdHJhcC90YWJiYWJsZS9ibG9iL21hc3Rlci9MSUNFTlNFXG4qL1xuLy8gTk9URTogc2VwYXJhdGUgYDpub3QoKWAgc2VsZWN0b3JzIGhhcyBicm9hZGVyIGJyb3dzZXIgc3VwcG9ydCB0aGFuIHRoZSBuZXdlclxuLy8gIGA6bm90KFtpbmVydF0sIFtpbmVydF0gKilgIChGZWIgMjAyMylcbi8vIENBUkVGVUw6IEpTRG9tIGRvZXMgbm90IHN1cHBvcnQgYDpub3QoW2luZXJ0XSAqKWAgYXMgYSBzZWxlY3RvcjsgdXNpbmcgaXQgY2F1c2VzXG4vLyAgdGhlIGVudGlyZSBxdWVyeSB0byBmYWlsLCByZXN1bHRpbmcgaW4gbm8gbm9kZXMgZm91bmQsIHdoaWNoIHdpbGwgYnJlYWsgYSBsb3Rcbi8vICBvZiB0aGluZ3MuLi4gc28gd2UgaGF2ZSB0byByZWx5IG9uIEpTIHRvIGlkZW50aWZ5IG5vZGVzIGluc2lkZSBhbiBpbmVydCBjb250YWluZXJcbnZhciBjYW5kaWRhdGVTZWxlY3RvcnMgPSBbJ2lucHV0Om5vdChbaW5lcnRdKScsICdzZWxlY3Q6bm90KFtpbmVydF0pJywgJ3RleHRhcmVhOm5vdChbaW5lcnRdKScsICdhW2hyZWZdOm5vdChbaW5lcnRdKScsICdidXR0b246bm90KFtpbmVydF0pJywgJ1t0YWJpbmRleF06bm90KHNsb3QpOm5vdChbaW5lcnRdKScsICdhdWRpb1tjb250cm9sc106bm90KFtpbmVydF0pJywgJ3ZpZGVvW2NvbnRyb2xzXTpub3QoW2luZXJ0XSknLCAnW2NvbnRlbnRlZGl0YWJsZV06bm90KFtjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiXSk6bm90KFtpbmVydF0pJywgJ2RldGFpbHM+c3VtbWFyeTpmaXJzdC1vZi10eXBlOm5vdChbaW5lcnRdKScsICdkZXRhaWxzOm5vdChbaW5lcnRdKSddO1xudmFyIGNhbmRpZGF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY2FuZGlkYXRlU2VsZWN0b3JzLmpvaW4oJywnKTtcbnZhciBOb0VsZW1lbnQgPSB0eXBlb2YgRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCc7XG52YXIgbWF0Y2hlcyA9IE5vRWxlbWVudCA/IGZ1bmN0aW9uICgpIHt9IDogRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyB8fCBFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG52YXIgZ2V0Um9vdE5vZGUgPSAhTm9FbGVtZW50ICYmIEVsZW1lbnQucHJvdG90eXBlLmdldFJvb3ROb2RlID8gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JGdldFJvb3ROb2RlO1xuICByZXR1cm4gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2VsZW1lbnQkZ2V0Um9vdE5vZGUgPSBlbGVtZW50LmdldFJvb3ROb2RlKSA9PT0gbnVsbCB8fCBfZWxlbWVudCRnZXRSb290Tm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZW1lbnQkZ2V0Um9vdE5vZGUuY2FsbChlbGVtZW50KTtcbn0gOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBub2RlIGlzIGluZXJ0IG9yIGluIGFuIGluZXJ0IGFuY2VzdG9yLlxuICogQHBhcmFtIHtFbGVtZW50fSBbbm9kZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvb2tVcF0gSWYgdHJ1ZSBhbmQgYG5vZGVgIGlzIG5vdCBpbmVydCwgbG9va3MgdXAgYXQgYW5jZXN0b3JzIHRvXG4gKiAgc2VlIGlmIGFueSBvZiB0aGVtIGFyZSBpbmVydC4gSWYgZmFsc2UsIG9ubHkgYG5vZGVgIGl0c2VsZiBpcyBjb25zaWRlcmVkLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgaW5lcnQgaXRzZWxmIG9yIGJ5IHdheSBvZiBiZWluZyBpbiBhbiBpbmVydCBhbmNlc3Rvci5cbiAqICBGYWxzZSBpZiBgbm9kZWAgaXMgZmFsc3kuXG4gKi9cbnZhciBpc0luZXJ0ID0gZnVuY3Rpb24gaXNJbmVydChub2RlLCBsb29rVXApIHtcbiAgdmFyIF9ub2RlJGdldEF0dHJpYnV0ZTtcbiAgaWYgKGxvb2tVcCA9PT0gdm9pZCAwKSB7XG4gICAgbG9va1VwID0gdHJ1ZTtcbiAgfVxuICAvLyBDQVJFRlVMOiBKU0RvbSBkb2VzIG5vdCBzdXBwb3J0IGluZXJ0IGF0IGFsbCwgc28gd2UgY2FuJ3QgdXNlIHRoZSBgSFRNTEVsZW1lbnQuaW5lcnRgXG4gIC8vICBKUyBBUEkgcHJvcGVydHk7IHdlIGhhdmUgdG8gY2hlY2sgdGhlIGF0dHJpYnV0ZSwgd2hpY2ggY2FuIGVpdGhlciBiZSBlbXB0eSBvciAndHJ1ZSc7XG4gIC8vICBpZiBpdCdzIGBudWxsYCAobm90IHNwZWNpZmllZCkgb3IgJ2ZhbHNlJywgaXQncyBhbiBhY3RpdmUgZWxlbWVudFxuICB2YXIgaW5lcnRBdHQgPSBub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfbm9kZSRnZXRBdHRyaWJ1dGUgPSBub2RlLmdldEF0dHJpYnV0ZSkgPT09IG51bGwgfHwgX25vZGUkZ2V0QXR0cmlidXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbm9kZSRnZXRBdHRyaWJ1dGUuY2FsbChub2RlLCAnaW5lcnQnKTtcbiAgdmFyIGluZXJ0ID0gaW5lcnRBdHQgPT09ICcnIHx8IGluZXJ0QXR0ID09PSAndHJ1ZSc7XG5cbiAgLy8gTk9URTogdGhpcyBjb3VsZCBhbHNvIGJlIGhhbmRsZWQgd2l0aCBgbm9kZS5tYXRjaGVzKCdbaW5lcnRdLCA6aXMoW2luZXJ0XSAqKScpYFxuICAvLyAgaWYgaXQgd2VyZW4ndCBmb3IgYG1hdGNoZXMoKWAgbm90IGJlaW5nIGEgZnVuY3Rpb24gb24gc2hhZG93IHJvb3RzOyB0aGUgZm9sbG93aW5nXG4gIC8vICBjb2RlIHdvcmtzIGZvciBhbnkga2luZCBvZiBub2RlXG4gIC8vIENBUkVGVUw6IEpTRG9tIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IGNlcnRhaW4gc2VsZWN0b3JzIGxpa2UgYDpub3QoW2luZXJ0XSAqKWBcbiAgLy8gIHNvIGl0IGxpa2VseSB3b3VsZCBub3Qgc3VwcG9ydCBgOmlzKFtpbmVydF0gKilgIGVpdGhlci4uLlxuICB2YXIgcmVzdWx0ID0gaW5lcnQgfHwgbG9va1VwICYmIG5vZGUgJiYgaXNJbmVydChub2RlLnBhcmVudE5vZGUpOyAvLyByZWN1cnNpdmVcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgbm9kZSdzIGNvbnRlbnQgaXMgZWRpdGFibGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IFtub2RlXVxuICogQHJldHVybnMgVHJ1ZSBpZiBpdCdzIGNvbnRlbnQtZWRpdGFibGU7IGZhbHNlIGlmIGl0J3Mgbm90IG9yIGBub2RlYCBpcyBmYWxzeS5cbiAqL1xudmFyIGlzQ29udGVudEVkaXRhYmxlID0gZnVuY3Rpb24gaXNDb250ZW50RWRpdGFibGUobm9kZSkge1xuICB2YXIgX25vZGUkZ2V0QXR0cmlidXRlMjtcbiAgLy8gQ0FSRUZVTDogSlNEb20gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYEhUTUxFbGVtZW50LmlzQ29udGVudEVkaXRhYmxlYCBBUEkgc28gd2UgaGF2ZVxuICAvLyAgdG8gdXNlIHRoZSBhdHRyaWJ1dGUgZGlyZWN0bHkgdG8gY2hlY2sgZm9yIHRoaXMsIHdoaWNoIGNhbiBlaXRoZXIgYmUgZW1wdHkgb3IgJ3RydWUnO1xuICAvLyAgaWYgaXQncyBgbnVsbGAgKG5vdCBzcGVjaWZpZWQpIG9yICdmYWxzZScsIGl0J3MgYSBub24tZWRpdGFibGUgZWxlbWVudFxuICB2YXIgYXR0VmFsdWUgPSBub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfbm9kZSRnZXRBdHRyaWJ1dGUyID0gbm9kZS5nZXRBdHRyaWJ1dGUpID09PSBudWxsIHx8IF9ub2RlJGdldEF0dHJpYnV0ZTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ub2RlJGdldEF0dHJpYnV0ZTIuY2FsbChub2RlLCAnY29udGVudGVkaXRhYmxlJyk7XG4gIHJldHVybiBhdHRWYWx1ZSA9PT0gJycgfHwgYXR0VmFsdWUgPT09ICd0cnVlJztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBjb250YWluZXIgdG8gY2hlY2sgaW5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUNvbnRhaW5lciBhZGQgY29udGFpbmVyIHRvIGNoZWNrXG4gKiBAcGFyYW0geyhub2RlOiBFbGVtZW50KSA9PiBib29sZWFufSBmaWx0ZXIgZmlsdGVyIGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gKi9cbnZhciBnZXRDYW5kaWRhdGVzID0gZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlcyhlbCwgaW5jbHVkZUNvbnRhaW5lciwgZmlsdGVyKSB7XG4gIC8vIGV2ZW4gaWYgYGluY2x1ZGVDb250YWluZXI9ZmFsc2VgLCB3ZSBzdGlsbCBoYXZlIHRvIGNoZWNrIGl0IGZvciBpbmVydG5lc3MgYmVjYXVzZVxuICAvLyAgaWYgaXQncyBpbmVydCwgYWxsIGl0cyBjaGlsZHJlbiBhcmUgaW5lcnRcbiAgaWYgKGlzSW5lcnQoZWwpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBjYW5kaWRhdGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGVsLnF1ZXJ5U2VsZWN0b3JBbGwoY2FuZGlkYXRlU2VsZWN0b3IpKTtcbiAgaWYgKGluY2x1ZGVDb250YWluZXIgJiYgbWF0Y2hlcy5jYWxsKGVsLCBjYW5kaWRhdGVTZWxlY3RvcikpIHtcbiAgICBjYW5kaWRhdGVzLnVuc2hpZnQoZWwpO1xuICB9XG4gIGNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzLmZpbHRlcihmaWx0ZXIpO1xuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFNoYWRvd1Jvb3RcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCB0byBjaGVjayBmb3Igc2hhZG93IHJvb3RcbiAqIEByZXR1cm5zIHtTaGFkb3dSb290fGJvb2xlYW59IFNoYWRvd1Jvb3QgaWYgYXZhaWxhYmxlIG9yIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhIHNoYWRvd1Jvb3QgaXMgYXR0YWNoZWQgYnV0IG5vdCBhdmFpbGFibGUuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2hhZG93Um9vdEZpbHRlclxuICogQHBhcmFtIHtFbGVtZW50fSBzaGFkb3dIb3N0Tm9kZSB0aGUgZWxlbWVudCB3aGljaCBjb250YWlucyBzaGFkb3cgY29udGVudFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYSBzaGFkb3cgcm9vdCBjb3VsZCBwb3RlbnRpYWxseSBjb250YWluIHZhbGlkIGNhbmRpZGF0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYW5kaWRhdGVTY29wZVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBzY29wZVBhcmVudCBjb250YWlucyBpbm5lciBjYW5kaWRhdGVzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gY2FuZGlkYXRlcyBsaXN0IG9mIGNhbmRpZGF0ZXMgZm91bmQgaW4gdGhlIHNjb3BlIHBhcmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSXRlcmF0aXZlT3B0aW9uc1xuICogQHByb3BlcnR5IHtHZXRTaGFkb3dSb290fGJvb2xlYW59IGdldFNoYWRvd1Jvb3QgdHJ1ZSBpZiBzaGFkb3cgc3VwcG9ydCBpcyBlbmFibGVkOyBmYWxzeSBpZiBub3Q7XG4gKiAgaWYgYSBmdW5jdGlvbiwgaW1wbGllcyBzaGFkb3cgc3VwcG9ydCBpcyBlbmFibGVkIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgc2hhZG93IHJvb3Qgb2YgYW4gZWxlbWVudFxuICogIG9yIGEgYm9vbGVhbiBzdGF0aW5nIGlmIGl0IGhhcyBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgcm9vdFxuICogQHByb3BlcnR5IHsobm9kZTogRWxlbWVudCkgPT4gYm9vbGVhbn0gZmlsdGVyIGZpbHRlciBjYW5kaWRhdGVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGZsYXR0ZW4gaWYgdHJ1ZSB0aGVuIHJlc3VsdCB3aWxsIGZsYXR0ZW4gYW55IENhbmRpZGF0ZVNjb3BlIGludG8gdGhlIHJldHVybmVkIGxpc3RcbiAqIEBwcm9wZXJ0eSB7U2hhZG93Um9vdEZpbHRlcn0gc2hhZG93Um9vdEZpbHRlciBmaWx0ZXIgc2hhZG93IHJvb3RzO1xuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50W119IGVsZW1lbnRzIGxpc3Qgb2YgZWxlbWVudCBjb250YWluZXJzIHRvIG1hdGNoIGNhbmRpZGF0ZXMgZnJvbVxuICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQ29udGFpbmVyIGFkZCBjb250YWluZXIgbGlzdCB0byBjaGVja1xuICogQHBhcmFtIHtJdGVyYXRpdmVPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJucyB7QXJyYXkuPEVsZW1lbnR8Q2FuZGlkYXRlU2NvcGU+fVxuICovXG52YXIgZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5ID0gZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KGVsZW1lbnRzLCBpbmNsdWRlQ29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHZhciBjYW5kaWRhdGVzID0gW107XG4gIHZhciBlbGVtZW50c1RvQ2hlY2sgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcbiAgd2hpbGUgKGVsZW1lbnRzVG9DaGVjay5sZW5ndGgpIHtcbiAgICB2YXIgZWxlbWVudCA9IGVsZW1lbnRzVG9DaGVjay5zaGlmdCgpO1xuICAgIGlmIChpc0luZXJ0KGVsZW1lbnQsIGZhbHNlKSkge1xuICAgICAgLy8gbm8gbmVlZCB0byBsb29rIHVwIHNpbmNlIHdlJ3JlIGRyaWxsaW5nIGRvd25cbiAgICAgIC8vIGFueXRoaW5nIGluc2lkZSB0aGlzIGNvbnRhaW5lciB3aWxsIGFsc28gYmUgaW5lcnRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0xPVCcpIHtcbiAgICAgIC8vIGFkZCBzaGFkb3cgZG9tIHNsb3Qgc2NvcGUgKHNsb3QgaXRzZWxmIGNhbm5vdCBiZSBmb2N1c2FibGUpXG4gICAgICB2YXIgYXNzaWduZWQgPSBlbGVtZW50LmFzc2lnbmVkRWxlbWVudHMoKTtcbiAgICAgIHZhciBjb250ZW50ID0gYXNzaWduZWQubGVuZ3RoID8gYXNzaWduZWQgOiBlbGVtZW50LmNoaWxkcmVuO1xuICAgICAgdmFyIG5lc3RlZENhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoY29udGVudCwgdHJ1ZSwgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5mbGF0dGVuKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaC5hcHBseShjYW5kaWRhdGVzLCBuZXN0ZWRDYW5kaWRhdGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgICAgc2NvcGVQYXJlbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgY2FuZGlkYXRlczogbmVzdGVkQ2FuZGlkYXRlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2hlY2sgY2FuZGlkYXRlIGVsZW1lbnRcbiAgICAgIHZhciB2YWxpZENhbmRpZGF0ZSA9IG1hdGNoZXMuY2FsbChlbGVtZW50LCBjYW5kaWRhdGVTZWxlY3Rvcik7XG4gICAgICBpZiAodmFsaWRDYW5kaWRhdGUgJiYgb3B0aW9ucy5maWx0ZXIoZWxlbWVudCkgJiYgKGluY2x1ZGVDb250YWluZXIgfHwgIWVsZW1lbnRzLmluY2x1ZGVzKGVsZW1lbnQpKSkge1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGl0ZXJhdGUgb3ZlciBzaGFkb3cgY29udGVudCBpZiBwb3NzaWJsZVxuICAgICAgdmFyIHNoYWRvd1Jvb3QgPSBlbGVtZW50LnNoYWRvd1Jvb3QgfHxcbiAgICAgIC8vIGNoZWNrIGZvciBhbiB1bmRpc2Nsb3NlZCBzaGFkb3dcbiAgICAgIHR5cGVvZiBvcHRpb25zLmdldFNoYWRvd1Jvb3QgPT09ICdmdW5jdGlvbicgJiYgb3B0aW9ucy5nZXRTaGFkb3dSb290KGVsZW1lbnQpO1xuXG4gICAgICAvLyBubyBpbmVydCBsb29rIHVwIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBkcmlsbGluZyBkb3duIGFuZCBjaGVja2luZyBmb3IgaW5lcnRuZXNzXG4gICAgICAvLyAgb24gdGhlIHdheSBkb3duLCBzbyBhbGwgY29udGFpbmVycyB0byB0aGlzIHJvb3Qgbm9kZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW5cbiAgICAgIC8vICB2ZXR0ZWQgYXMgbm9uLWluZXJ0XG4gICAgICB2YXIgdmFsaWRTaGFkb3dSb290ID0gIWlzSW5lcnQoc2hhZG93Um9vdCwgZmFsc2UpICYmICghb3B0aW9ucy5zaGFkb3dSb290RmlsdGVyIHx8IG9wdGlvbnMuc2hhZG93Um9vdEZpbHRlcihlbGVtZW50KSk7XG4gICAgICBpZiAoc2hhZG93Um9vdCAmJiB2YWxpZFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgLy8gYWRkIHNoYWRvdyBkb20gc2NvcGUgSUlGIGEgc2hhZG93IHJvb3Qgbm9kZSB3YXMgZ2l2ZW47IG90aGVyd2lzZSwgYW4gdW5kaXNjbG9zZWRcbiAgICAgICAgLy8gIHNoYWRvdyBleGlzdHMsIHNvIGxvb2sgYXQgbGlnaHQgZG9tIGNoaWxkcmVuIGFzIGZhbGxiYWNrIEJVVCBjcmVhdGUgYSBzY29wZSBmb3IgYW55XG4gICAgICAgIC8vICBjaGlsZCBjYW5kaWRhdGVzIGZvdW5kIGJlY2F1c2UgdGhleSdyZSBsaWtlbHkgc2xvdHRlZCBlbGVtZW50cyAoZWxlbWVudHMgdGhhdCBhcmVcbiAgICAgICAgLy8gIGNoaWxkcmVuIG9mIHRoZSB3ZWIgY29tcG9uZW50IGVsZW1lbnQgKHdoaWNoIGhhcyB0aGUgc2hhZG93KSwgaW4gdGhlIGxpZ2h0IGRvbSwgYnV0XG4gICAgICAgIC8vICBzbG90dGVkIHNvbWV3aGVyZSBfaW5zaWRlXyB0aGUgdW5kaXNjbG9zZWQgc2hhZG93KSAtLSB0aGUgc2NvcGUgaXMgY3JlYXRlZCBiZWxvdyxcbiAgICAgICAgLy8gIF9hZnRlcl8gd2UgcmV0dXJuIGZyb20gdGhpcyByZWN1cnNpdmUgY2FsbFxuICAgICAgICB2YXIgX25lc3RlZENhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoc2hhZG93Um9vdCA9PT0gdHJ1ZSA/IGVsZW1lbnQuY2hpbGRyZW4gOiBzaGFkb3dSb290LmNoaWxkcmVuLCB0cnVlLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZmxhdHRlbikge1xuICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaC5hcHBseShjYW5kaWRhdGVzLCBfbmVzdGVkQ2FuZGlkYXRlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgICAgIHNjb3BlUGFyZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgY2FuZGlkYXRlczogX25lc3RlZENhbmRpZGF0ZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlcmUncyBub3Qgc2hhZG93IHNvIGp1c3QgZGlnIGludG8gdGhlIGVsZW1lbnQncyAobGlnaHQgZG9tKSBjaGlsZHJlblxuICAgICAgICAvLyAgX193aXRob3V0X18gZ2l2aW5nIHRoZSBlbGVtZW50IHNwZWNpYWwgc2NvcGUgdHJlYXRtZW50XG4gICAgICAgIGVsZW1lbnRzVG9DaGVjay51bnNoaWZ0LmFwcGx5KGVsZW1lbnRzVG9DaGVjaywgZWxlbWVudC5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogRGV0ZXJtaW5lcyBpZiB0aGUgbm9kZSBoYXMgYW4gZXhwbGljaXRseSBzcGVjaWZpZWQgYHRhYmluZGV4YCBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBzbzsgZmFsc2UgaWYgbm90LlxuICovXG52YXIgaGFzVGFiSW5kZXggPSBmdW5jdGlvbiBoYXNUYWJJbmRleChub2RlKSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VJbnQobm9kZS5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JyksIDEwKSk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB0aGUgdGFiIGluZGV4IG9mIGEgZ2l2ZW4gbm9kZS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRhYiBvcmRlciAobmVnYXRpdmUsIDAsIG9yIHBvc2l0aXZlIG51bWJlcikuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYG5vZGVgIGlzIGZhbHN5LlxuICovXG52YXIgZ2V0VGFiSW5kZXggPSBmdW5jdGlvbiBnZXRUYWJJbmRleChub2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gbm9kZSBwcm92aWRlZCcpO1xuICB9XG4gIGlmIChub2RlLnRhYkluZGV4IDwgMCkge1xuICAgIC8vIGluIENocm9tZSwgPGRldGFpbHMvPiwgPGF1ZGlvIGNvbnRyb2xzLz4gYW5kIDx2aWRlbyBjb250cm9scy8+IGVsZW1lbnRzIGdldCBhIGRlZmF1bHRcbiAgICAvLyBgdGFiSW5kZXhgIG9mIC0xIHdoZW4gdGhlICd0YWJpbmRleCcgYXR0cmlidXRlIGlzbid0IHNwZWNpZmllZCBpbiB0aGUgRE9NLFxuICAgIC8vIHlldCB0aGV5IGFyZSBzdGlsbCBwYXJ0IG9mIHRoZSByZWd1bGFyIHRhYiBvcmRlcjsgaW4gRkYsIHRoZXkgZ2V0IGEgZGVmYXVsdFxuICAgIC8vIGB0YWJJbmRleGAgb2YgMDsgc2luY2UgQ2hyb21lIHN0aWxsIHB1dHMgdGhvc2UgZWxlbWVudHMgaW4gdGhlIHJlZ3VsYXIgdGFiXG4gICAgLy8gb3JkZXIsIGNvbnNpZGVyIHRoZWlyIHRhYiBpbmRleCB0byBiZSAwLlxuICAgIC8vIEFsc28gYnJvd3NlcnMgZG8gbm90IHJldHVybiBgdGFiSW5kZXhgIGNvcnJlY3RseSBmb3IgY29udGVudEVkaXRhYmxlIG5vZGVzO1xuICAgIC8vIHNvIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhIHRhYmluZGV4IGF0dHJpYnV0ZSBzcGVjaWZpY2FsbHkgc2V0LCBhc3N1bWUgaXQncyAwLlxuICAgIGlmICgoL14oQVVESU98VklERU98REVUQUlMUykkLy50ZXN0KG5vZGUudGFnTmFtZSkgfHwgaXNDb250ZW50RWRpdGFibGUobm9kZSkpICYmICFoYXNUYWJJbmRleChub2RlKSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG4gIHJldHVybiBub2RlLnRhYkluZGV4O1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIHRhYiBpbmRleCBvZiBhIGdpdmVuIG5vZGUgX19mb3Igc29ydCBvcmRlciBwdXJwb3Nlc19fLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtib29sZWFufSBbaXNTY29wZV0gVHJ1ZSBmb3IgYSBjdXN0b20gZWxlbWVudCB3aXRoIHNoYWRvdyByb290IG9yIHNsb3QgdGhhdCwgYnkgZGVmYXVsdCxcbiAqICBoYXMgdGFiSW5kZXggLTEsIGJ1dCBuZWVkcyB0byBiZSBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgaW4gb3JkZXIgZm9yIGl0cyBjb250ZW50IHRvIGJlXG4gKiAgaW5zZXJ0ZWQgaW50byB0aGUgY29ycmVjdCBzb3J0IHBvc2l0aW9uLlxuICogQHJldHVybnMge251bWJlcn0gVGFiIG9yZGVyIChuZWdhdGl2ZSwgMCwgb3IgcG9zaXRpdmUgbnVtYmVyKS5cbiAqL1xudmFyIGdldFNvcnRPcmRlclRhYkluZGV4ID0gZnVuY3Rpb24gZ2V0U29ydE9yZGVyVGFiSW5kZXgobm9kZSwgaXNTY29wZSkge1xuICB2YXIgdGFiSW5kZXggPSBnZXRUYWJJbmRleChub2RlKTtcbiAgaWYgKHRhYkluZGV4IDwgMCAmJiBpc1Njb3BlICYmICFoYXNUYWJJbmRleChub2RlKSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiB0YWJJbmRleDtcbn07XG52YXIgc29ydE9yZGVyZWRUYWJiYWJsZXMgPSBmdW5jdGlvbiBzb3J0T3JkZXJlZFRhYmJhYmxlcyhhLCBiKSB7XG4gIHJldHVybiBhLnRhYkluZGV4ID09PSBiLnRhYkluZGV4ID8gYS5kb2N1bWVudE9yZGVyIC0gYi5kb2N1bWVudE9yZGVyIDogYS50YWJJbmRleCAtIGIudGFiSW5kZXg7XG59O1xudmFyIGlzSW5wdXQgPSBmdW5jdGlvbiBpc0lucHV0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ0lOUFVUJztcbn07XG52YXIgaXNIaWRkZW5JbnB1dCA9IGZ1bmN0aW9uIGlzSGlkZGVuSW5wdXQobm9kZSkge1xuICByZXR1cm4gaXNJbnB1dChub2RlKSAmJiBub2RlLnR5cGUgPT09ICdoaWRkZW4nO1xufTtcbnZhciBpc0RldGFpbHNXaXRoU3VtbWFyeSA9IGZ1bmN0aW9uIGlzRGV0YWlsc1dpdGhTdW1tYXJ5KG5vZGUpIHtcbiAgdmFyIHIgPSBub2RlLnRhZ05hbWUgPT09ICdERVRBSUxTJyAmJiBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkobm9kZS5jaGlsZHJlbikuc29tZShmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQudGFnTmFtZSA9PT0gJ1NVTU1BUlknO1xuICB9KTtcbiAgcmV0dXJuIHI7XG59O1xudmFyIGdldENoZWNrZWRSYWRpbyA9IGZ1bmN0aW9uIGdldENoZWNrZWRSYWRpbyhub2RlcywgZm9ybSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG5vZGVzW2ldLmNoZWNrZWQgJiYgbm9kZXNbaV0uZm9ybSA9PT0gZm9ybSkge1xuICAgICAgcmV0dXJuIG5vZGVzW2ldO1xuICAgIH1cbiAgfVxufTtcbnZhciBpc1RhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc1RhYmJhYmxlUmFkaW8obm9kZSkge1xuICBpZiAoIW5vZGUubmFtZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciByYWRpb1Njb3BlID0gbm9kZS5mb3JtIHx8IGdldFJvb3ROb2RlKG5vZGUpO1xuICB2YXIgcXVlcnlSYWRpb3MgPSBmdW5jdGlvbiBxdWVyeVJhZGlvcyhuYW1lKSB7XG4gICAgcmV0dXJuIHJhZGlvU2NvcGUucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cInJhZGlvXCJdW25hbWU9XCInICsgbmFtZSArICdcIl0nKTtcbiAgfTtcbiAgdmFyIHJhZGlvU2V0O1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5DU1MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuQ1NTLmVzY2FwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJhZGlvU2V0ID0gcXVlcnlSYWRpb3Mod2luZG93LkNTUy5lc2NhcGUobm9kZS5uYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHJhZGlvU2V0ID0gcXVlcnlSYWRpb3Mobm9kZS5uYW1lKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKCdMb29rcyBsaWtlIHlvdSBoYXZlIGEgcmFkaW8gYnV0dG9uIHdpdGggYSBuYW1lIGF0dHJpYnV0ZSBjb250YWluaW5nIGludmFsaWQgQ1NTIHNlbGVjdG9yIGNoYXJhY3RlcnMgYW5kIG5lZWQgdGhlIENTUy5lc2NhcGUgcG9seWZpbGw6ICVzJywgZXJyLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB2YXIgY2hlY2tlZCA9IGdldENoZWNrZWRSYWRpbyhyYWRpb1NldCwgbm9kZS5mb3JtKTtcbiAgcmV0dXJuICFjaGVja2VkIHx8IGNoZWNrZWQgPT09IG5vZGU7XG59O1xudmFyIGlzUmFkaW8gPSBmdW5jdGlvbiBpc1JhZGlvKG5vZGUpIHtcbiAgcmV0dXJuIGlzSW5wdXQobm9kZSkgJiYgbm9kZS50eXBlID09PSAncmFkaW8nO1xufTtcbnZhciBpc05vblRhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc05vblRhYmJhYmxlUmFkaW8obm9kZSkge1xuICByZXR1cm4gaXNSYWRpbyhub2RlKSAmJiAhaXNUYWJiYWJsZVJhZGlvKG5vZGUpO1xufTtcblxuLy8gZGV0ZXJtaW5lcyBpZiBhIG5vZGUgaXMgdWx0aW1hdGVseSBhdHRhY2hlZCB0byB0aGUgd2luZG93J3MgZG9jdW1lbnRcbnZhciBpc05vZGVBdHRhY2hlZCA9IGZ1bmN0aW9uIGlzTm9kZUF0dGFjaGVkKG5vZGUpIHtcbiAgdmFyIF9ub2RlUm9vdDtcbiAgLy8gVGhlIHJvb3Qgbm9kZSBpcyB0aGUgc2hhZG93IHJvb3QgaWYgdGhlIG5vZGUgaXMgaW4gYSBzaGFkb3cgRE9NOyBzb21lIGRvY3VtZW50IG90aGVyd2lzZVxuICAvLyAgKGJ1dCBOT1QgX3RoZV8gZG9jdW1lbnQ7IHNlZSBzZWNvbmQgJ0lmJyBjb21tZW50IGJlbG93IGZvciBtb3JlKS5cbiAgLy8gSWYgcm9vdE5vZGUgaXMgc2hhZG93IHJvb3QsIGl0J2xsIGhhdmUgYSBob3N0LCB3aGljaCBpcyB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgc2hhZG93XG4gIC8vICBpcyBhdHRhY2hlZCwgYW5kIHRoZSBvbmUgd2UgbmVlZCB0byBjaGVjayBpZiBpdCdzIGluIHRoZSBkb2N1bWVudCBvciBub3QgKGJlY2F1c2UgdGhlXG4gIC8vICBzaGFkb3csIGFuZCBhbGwgbm9kZXMgaXQgY29udGFpbnMsIGlzIG5ldmVyIGNvbnNpZGVyZWQgaW4gdGhlIGRvY3VtZW50IHNpbmNlIHNoYWRvd3NcbiAgLy8gIGJlaGF2ZSBsaWtlIHNlbGYtY29udGFpbmVkIERPTXM7IGJ1dCBpZiB0aGUgc2hhZG93J3MgSE9TVCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgZG9jdW1lbnQsXG4gIC8vICBpcyBoaWRkZW4sIG9yIGlzIG5vdCBpbiB0aGUgZG9jdW1lbnQgaXRzZWxmIGJ1dCBpcyBkZXRhY2hlZCwgaXQgd2lsbCBhZmZlY3QgdGhlIHNoYWRvdydzXG4gIC8vICB2aXNpYmlsaXR5LCBpbmNsdWRpbmcgYWxsIHRoZSBub2RlcyBpdCBjb250YWlucykuIFRoZSBob3N0IGNvdWxkIGJlIGFueSBub3JtYWwgbm9kZSxcbiAgLy8gIG9yIGEgY3VzdG9tIGVsZW1lbnQgKGkuZS4gd2ViIGNvbXBvbmVudCkuIEVpdGhlciB3YXksIHRoYXQncyB0aGUgb25lIHRoYXQgaXMgY29uc2lkZXJlZFxuICAvLyAgcGFydCBvZiB0aGUgZG9jdW1lbnQsIG5vdCB0aGUgc2hhZG93IHJvb3QsIG5vciBhbnkgb2YgaXRzIGNoaWxkcmVuIChpLmUuIHRoZSBub2RlIGJlaW5nXG4gIC8vICB0ZXN0ZWQpLlxuICAvLyBUbyBmdXJ0aGVyIGNvbXBsaWNhdGUgdGhpbmdzLCB3ZSBoYXZlIHRvIGxvb2sgYWxsIHRoZSB3YXkgdXAgdW50aWwgd2UgZmluZCBhIHNoYWRvdyBIT1NUXG4gIC8vICB0aGF0IGlzIGF0dGFjaGVkIChvciBmaW5kIG5vbmUpIGJlY2F1c2UgdGhlIG5vZGUgbWlnaHQgYmUgaW4gbmVzdGVkIHNoYWRvd3MuLi5cbiAgLy8gSWYgcm9vdE5vZGUgaXMgbm90IGEgc2hhZG93IHJvb3QsIGl0IHdvbid0IGhhdmUgYSBob3N0LCBhbmQgc28gcm9vdE5vZGUgc2hvdWxkIGJlIHRoZVxuICAvLyAgZG9jdW1lbnQgKHBlciB0aGUgZG9jcykgYW5kIHdoaWxlIGl0J3MgYSBEb2N1bWVudC10eXBlIG9iamVjdCwgdGhhdCBkb2N1bWVudCBkb2VzIG5vdFxuICAvLyAgYXBwZWFyIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBub2RlJ3MgYG93bmVyRG9jdW1lbnRgIGZvciBzb21lIHJlYXNvbiwgc28gaXQncyBzYWZlclxuICAvLyAgdG8gaWdub3JlIHRoZSByb290Tm9kZSBhdCB0aGlzIHBvaW50LCBhbmQgdXNlIGBub2RlLm93bmVyRG9jdW1lbnRgLiBPdGhlcndpc2UsXG4gIC8vICB1c2luZyBgcm9vdE5vZGUuY29udGFpbnMobm9kZSlgIHdpbGwgX2Fsd2F5c18gYmUgdHJ1ZSB3ZSdsbCBnZXQgZmFsc2UtcG9zaXRpdmVzIHdoZW5cbiAgLy8gIG5vZGUgaXMgYWN0dWFsbHkgZGV0YWNoZWQuXG4gIC8vIE5PVEU6IElmIGBub2RlUm9vdEhvc3RgIG9yIGBub2RlYCBoYXBwZW5zIHRvIGJlIHRoZSBgZG9jdW1lbnRgIGl0c2VsZiAod2hpY2ggaXMgcG9zc2libGVcbiAgLy8gIGlmIGEgdGFiYmFibGUvZm9jdXNhYmxlIG5vZGUgd2FzIHF1aWNrbHkgYWRkZWQgdG8gdGhlIERPTSwgZm9jdXNlZCwgYW5kIHRoZW4gcmVtb3ZlZFxuICAvLyAgZnJvbSB0aGUgRE9NIGFzIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAtcmVhY3QvaXNzdWVzLzkwNSksIHRoZW5cbiAgLy8gIGBvd25lckRvY3VtZW50YCB3aWxsIGJlIGBudWxsYCwgaGVuY2UgdGhlIG9wdGlvbmFsIGNoYWluaW5nIG9uIGl0LlxuICB2YXIgbm9kZVJvb3QgPSBub2RlICYmIGdldFJvb3ROb2RlKG5vZGUpO1xuICB2YXIgbm9kZVJvb3RIb3N0ID0gKF9ub2RlUm9vdCA9IG5vZGVSb290KSA9PT0gbnVsbCB8fCBfbm9kZVJvb3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ub2RlUm9vdC5ob3N0O1xuXG4gIC8vIGluIHNvbWUgY2FzZXMsIGEgZGV0YWNoZWQgbm9kZSB3aWxsIHJldHVybiBpdHNlbGYgYXMgdGhlIHJvb3QgaW5zdGVhZCBvZiBhIGRvY3VtZW50IG9yXG4gIC8vICBzaGFkb3cgcm9vdCBvYmplY3QsIGluIHdoaWNoIGNhc2UsIHdlIHNob3VsZG4ndCB0cnkgdG8gbG9vayBmdXJ0aGVyIHVwIHRoZSBob3N0IGNoYWluXG4gIHZhciBhdHRhY2hlZCA9IGZhbHNlO1xuICBpZiAobm9kZVJvb3QgJiYgbm9kZVJvb3QgIT09IG5vZGUpIHtcbiAgICB2YXIgX25vZGVSb290SG9zdCwgX25vZGVSb290SG9zdCRvd25lckRvLCBfbm9kZSRvd25lckRvY3VtZW50O1xuICAgIGF0dGFjaGVkID0gISEoKF9ub2RlUm9vdEhvc3QgPSBub2RlUm9vdEhvc3QpICE9PSBudWxsICYmIF9ub2RlUm9vdEhvc3QgIT09IHZvaWQgMCAmJiAoX25vZGVSb290SG9zdCRvd25lckRvID0gX25vZGVSb290SG9zdC5vd25lckRvY3VtZW50KSAhPT0gbnVsbCAmJiBfbm9kZVJvb3RIb3N0JG93bmVyRG8gIT09IHZvaWQgMCAmJiBfbm9kZVJvb3RIb3N0JG93bmVyRG8uY29udGFpbnMobm9kZVJvb3RIb3N0KSB8fCBub2RlICE9PSBudWxsICYmIG5vZGUgIT09IHZvaWQgMCAmJiAoX25vZGUkb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudCkgIT09IG51bGwgJiYgX25vZGUkb3duZXJEb2N1bWVudCAhPT0gdm9pZCAwICYmIF9ub2RlJG93bmVyRG9jdW1lbnQuY29udGFpbnMobm9kZSkpO1xuICAgIHdoaWxlICghYXR0YWNoZWQgJiYgbm9kZVJvb3RIb3N0KSB7XG4gICAgICB2YXIgX25vZGVSb290MiwgX25vZGVSb290SG9zdDIsIF9ub2RlUm9vdEhvc3QyJG93bmVyRDtcbiAgICAgIC8vIHNpbmNlIGl0J3Mgbm90IGF0dGFjaGVkIGFuZCB3ZSBoYXZlIGEgcm9vdCBob3N0LCB0aGUgbm9kZSBNVVNUIGJlIGluIGEgbmVzdGVkIHNoYWRvdyBET00sXG4gICAgICAvLyAgd2hpY2ggbWVhbnMgd2UgbmVlZCB0byBnZXQgdGhlIGhvc3QncyBob3N0IGFuZCBjaGVjayBpZiB0aGF0IHBhcmVudCBob3N0IGlzIGNvbnRhaW5lZFxuICAgICAgLy8gIGluIChpLmUuIGF0dGFjaGVkIHRvKSB0aGUgZG9jdW1lbnRcbiAgICAgIG5vZGVSb290ID0gZ2V0Um9vdE5vZGUobm9kZVJvb3RIb3N0KTtcbiAgICAgIG5vZGVSb290SG9zdCA9IChfbm9kZVJvb3QyID0gbm9kZVJvb3QpID09PSBudWxsIHx8IF9ub2RlUm9vdDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ub2RlUm9vdDIuaG9zdDtcbiAgICAgIGF0dGFjaGVkID0gISEoKF9ub2RlUm9vdEhvc3QyID0gbm9kZVJvb3RIb3N0KSAhPT0gbnVsbCAmJiBfbm9kZVJvb3RIb3N0MiAhPT0gdm9pZCAwICYmIChfbm9kZVJvb3RIb3N0MiRvd25lckQgPSBfbm9kZVJvb3RIb3N0Mi5vd25lckRvY3VtZW50KSAhPT0gbnVsbCAmJiBfbm9kZVJvb3RIb3N0MiRvd25lckQgIT09IHZvaWQgMCAmJiBfbm9kZVJvb3RIb3N0MiRvd25lckQuY29udGFpbnMobm9kZVJvb3RIb3N0KSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBhdHRhY2hlZDtcbn07XG52YXIgaXNaZXJvQXJlYSA9IGZ1bmN0aW9uIGlzWmVyb0FyZWEobm9kZSkge1xuICB2YXIgX25vZGUkZ2V0Qm91bmRpbmdDbGllID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICB3aWR0aCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS53aWR0aCxcbiAgICBoZWlnaHQgPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUuaGVpZ2h0O1xuICByZXR1cm4gd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwO1xufTtcbnZhciBpc0hpZGRlbiA9IGZ1bmN0aW9uIGlzSGlkZGVuKG5vZGUsIF9yZWYpIHtcbiAgdmFyIGRpc3BsYXlDaGVjayA9IF9yZWYuZGlzcGxheUNoZWNrLFxuICAgIGdldFNoYWRvd1Jvb3QgPSBfcmVmLmdldFNoYWRvd1Jvb3Q7XG4gIC8vIE5PVEU6IHZpc2liaWxpdHkgd2lsbCBiZSBgdW5kZWZpbmVkYCBpZiBub2RlIGlzIGRldGFjaGVkIGZyb20gdGhlIGRvY3VtZW50XG4gIC8vICAoc2VlIG5vdGVzIGFib3V0IHRoaXMgZnVydGhlciBkb3duKSwgd2hpY2ggbWVhbnMgd2Ugd2lsbCBjb25zaWRlciBpdCB2aXNpYmxlXG4gIC8vICAodGhpcyBpcyBsZWdhY3kgYmVoYXZpb3IgZnJvbSBhIHZlcnkgbG9uZyB3YXkgYmFjaylcbiAgLy8gTk9URTogd2UgY2hlY2sgdGhpcyByZWdhcmRsZXNzIG9mIGBkaXNwbGF5Q2hlY2s9XCJub25lXCJgIGJlY2F1c2UgdGhpcyBpcyBhXG4gIC8vICBfdmlzaWJpbGl0eV8gY2hlY2ssIG5vdCBhIF9kaXNwbGF5XyBjaGVja1xuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBpc0RpcmVjdFN1bW1hcnkgPSBtYXRjaGVzLmNhbGwobm9kZSwgJ2RldGFpbHM+c3VtbWFyeTpmaXJzdC1vZi10eXBlJyk7XG4gIHZhciBub2RlVW5kZXJEZXRhaWxzID0gaXNEaXJlY3RTdW1tYXJ5ID8gbm9kZS5wYXJlbnRFbGVtZW50IDogbm9kZTtcbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlVW5kZXJEZXRhaWxzLCAnZGV0YWlsczpub3QoW29wZW5dKSAqJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIWRpc3BsYXlDaGVjayB8fCBkaXNwbGF5Q2hlY2sgPT09ICdmdWxsJyB8fCBkaXNwbGF5Q2hlY2sgPT09ICdsZWdhY3ktZnVsbCcpIHtcbiAgICBpZiAodHlwZW9mIGdldFNoYWRvd1Jvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGNvbnNpZGVyIHRoZSBub2RlIHRvIGJlIGluIGFuIHVuZGlzY2xvc2VkIHNoYWRvdyBhbmQgdXNlIHRoZVxuICAgICAgLy8gICdub24temVyby1hcmVhJyBmYWxsYmFja1xuICAgICAgdmFyIG9yaWdpbmFsTm9kZSA9IG5vZGU7XG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICB2YXIgcGFyZW50RWxlbWVudCA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICAgICAgdmFyIHJvb3ROb2RlID0gZ2V0Um9vdE5vZGUobm9kZSk7XG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICYmICFwYXJlbnRFbGVtZW50LnNoYWRvd1Jvb3QgJiYgZ2V0U2hhZG93Um9vdChwYXJlbnRFbGVtZW50KSA9PT0gdHJ1ZSAvLyBjaGVjayBpZiB0aGVyZSdzIGFuIHVuZGlzY2xvc2VkIHNoYWRvd1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyBub2RlIGhhcyBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgd2hpY2ggbWVhbnMgd2UgY2FuIG9ubHkgdHJlYXQgaXQgYXMgYSBibGFjayBib3gsIHNvIHdlXG4gICAgICAgICAgLy8gIGZhbGwgYmFjayB0byBhIG5vbi16ZXJvLWFyZWEgdGVzdFxuICAgICAgICAgIHJldHVybiBpc1plcm9BcmVhKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuYXNzaWduZWRTbG90KSB7XG4gICAgICAgICAgLy8gaXRlcmF0ZSB1cCBzbG90XG4gICAgICAgICAgbm9kZSA9IG5vZGUuYXNzaWduZWRTbG90O1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXJlbnRFbGVtZW50ICYmIHJvb3ROb2RlICE9PSBub2RlLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgICAvLyBjcm9zcyBzaGFkb3cgYm91bmRhcnlcbiAgICAgICAgICBub2RlID0gcm9vdE5vZGUuaG9zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpdGVyYXRlIHVwIG5vcm1hbCBkb21cbiAgICAgICAgICBub2RlID0gcGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbm9kZSA9IG9yaWdpbmFsTm9kZTtcbiAgICB9XG4gICAgLy8gZWxzZSwgYGdldFNoYWRvd1Jvb3RgIG1pZ2h0IGJlIHRydWUsIGJ1dCBhbGwgdGhhdCBkb2VzIGlzIGVuYWJsZSBzaGFkb3cgRE9NIHN1cHBvcnRcbiAgICAvLyAgKGkuZS4gaXQgZG9lcyBub3QgYWxzbyBwcmVzdW1lIHRoYXQgYWxsIG5vZGVzIG1pZ2h0IGhhdmUgdW5kaXNjbG9zZWQgc2hhZG93cyk7IG9yXG4gICAgLy8gIGl0IG1pZ2h0IGJlIGEgZmFsc3kgdmFsdWUsIHdoaWNoIG1lYW5zIHNoYWRvdyBET00gc3VwcG9ydCBpcyBkaXNhYmxlZFxuXG4gICAgLy8gU2luY2Ugd2UgZGlkbid0IGZpbmQgaXQgc2l0dGluZyBpbiBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgKG9yIHNoYWRvd3MgYXJlIGRpc2FibGVkKVxuICAgIC8vICBub3cgd2UgY2FuIGp1c3QgdGVzdCB0byBzZWUgaWYgaXQgd291bGQgbm9ybWFsbHkgYmUgdmlzaWJsZSBvciBub3QsIHByb3ZpZGVkIGl0J3NcbiAgICAvLyAgYXR0YWNoZWQgdG8gdGhlIG1haW4gZG9jdW1lbnQuXG4gICAgLy8gTk9URTogV2UgbXVzdCBjb25zaWRlciBjYXNlIHdoZXJlIG5vZGUgaXMgaW5zaWRlIGEgc2hhZG93IERPTSBhbmQgZ2l2ZW4gZGlyZWN0bHkgdG9cbiAgICAvLyAgYGlzVGFiYmFibGUoKWAgb3IgYGlzRm9jdXNhYmxlKClgIC0tIHJlZ2FyZGxlc3Mgb2YgYGdldFNoYWRvd1Jvb3RgIG9wdGlvbiBzZXR0aW5nLlxuXG4gICAgaWYgKGlzTm9kZUF0dGFjaGVkKG5vZGUpKSB7XG4gICAgICAvLyB0aGlzIHdvcmtzIHdoZXJldmVyIHRoZSBub2RlIGlzOiBpZiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjbGllbnQgcmVjdCwgaXQnc1xuICAgICAgLy8gIHNvbWVob3cgZGlzcGxheWVkOyBpdCBhbHNvIGNvdmVycyB0aGUgQ1NTICdkaXNwbGF5OiBjb250ZW50cycgY2FzZSB3aGVyZSB0aGVcbiAgICAgIC8vICBub2RlIGl0c2VsZiBpcyBoaWRkZW4gaW4gcGxhY2Ugb2YgaXRzIGNvbnRlbnRzOyBhbmQgdGhlcmUncyBubyBuZWVkIHRvIHNlYXJjaFxuICAgICAgLy8gIHVwIHRoZSBoaWVyYXJjaHkgZWl0aGVyXG4gICAgICByZXR1cm4gIW5vZGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gRWxzZSwgdGhlIG5vZGUgaXNuJ3QgYXR0YWNoZWQgdG8gdGhlIGRvY3VtZW50LCB3aGljaCBtZWFucyB0aGUgYGdldENsaWVudFJlY3RzKClgXG4gICAgLy8gIEFQSSB3aWxsIF9fYWx3YXlzX18gcmV0dXJuIHplcm8gcmVjdHMgKHRoaXMgY2FuIGhhcHBlbiwgZm9yIGV4YW1wbGUsIGlmIFJlYWN0XG4gICAgLy8gIGlzIHVzZWQgdG8gcmVuZGVyIG5vZGVzIG9udG8gYSBkZXRhY2hlZCB0cmVlLCBhcyBjb25maXJtZWQgaW4gdGhpcyB0aHJlYWQ6XG4gICAgLy8gIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvOTExNyNpc3N1ZWNvbW1lbnQtMjg0MjI4ODcwKVxuICAgIC8vXG4gICAgLy8gSXQgYWxzbyBtZWFucyB0aGF0IGV2ZW4gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSkuZGlzcGxheSB3aWxsIHJldHVybiBgdW5kZWZpbmVkYFxuICAgIC8vICBiZWNhdXNlIHN0eWxlcyBhcmUgb25seSBjb21wdXRlZCBmb3Igbm9kZXMgdGhhdCBhcmUgaW4gdGhlIGRvY3VtZW50LlxuICAgIC8vXG4gICAgLy8gTk9URTogVEhJUyBIQVMgQkVFTiBUSEUgQ0FTRSBGT1IgWUVBUlMuIEl0IGlzIG5vdCBuZXcsIG5vciBpcyBpdCBjYXVzZWQgYnkgdGFiYmFibGVcbiAgICAvLyAgc29tZWhvdy4gVGhvdWdoIGl0IHdhcyBuZXZlciBzdGF0ZWQgb2ZmaWNpYWxseSwgYW55b25lIHdobyBoYXMgZXZlciB1c2VkIHRhYmJhYmxlXG4gICAgLy8gIEFQSXMgb24gbm9kZXMgaW4gZGV0YWNoZWQgY29udGFpbmVycyBoYXMgYWN0dWFsbHkgaW1wbGljaXRseSB1c2VkIHRhYmJhYmxlIGluIHdoYXRcbiAgICAvLyAgd2FzIGxhdGVyIChhcyBvZiB2NS4yLjAgb24gQXByIDksIDIwMjEpIGNhbGxlZCBgZGlzcGxheUNoZWNrPVwibm9uZVwiYCBtb2RlIC0tIGVzc2VudGlhbGx5XG4gICAgLy8gIGNvbnNpZGVyaW5nIF9fZXZlcnl0aGluZ19fIHRvIGJlIHZpc2libGUgYmVjYXVzZSBvZiB0aGUgaW5uYWJpbGl0eSB0byBkZXRlcm1pbmUgc3R5bGVzLlxuICAgIC8vXG4gICAgLy8gdjYuMC4wOiBBcyBvZiB0aGlzIG1ham9yIHJlbGVhc2UsIHRoZSBkZWZhdWx0ICdmdWxsJyBvcHRpb24gX19ubyBsb25nZXIgdHJlYXRzIGRldGFjaGVkXG4gICAgLy8gIG5vZGVzIGFzIHZpc2libGUgd2l0aCB0aGUgJ25vbmUnIGZhbGxiYWNrLl9fXG4gICAgaWYgKGRpc3BsYXlDaGVjayAhPT0gJ2xlZ2FjeS1mdWxsJykge1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGhpZGRlblxuICAgIH1cbiAgICAvLyBlbHNlLCBmYWxsYmFjayB0byAnbm9uZScgbW9kZSBhbmQgY29uc2lkZXIgdGhlIG5vZGUgdmlzaWJsZVxuICB9IGVsc2UgaWYgKGRpc3BsYXlDaGVjayA9PT0gJ25vbi16ZXJvLWFyZWEnKSB7XG4gICAgLy8gTk9URTogRXZlbiB0aG91Z2ggdGhpcyB0ZXN0cyB0aGF0IHRoZSBub2RlJ3MgY2xpZW50IHJlY3QgaXMgbm9uLXplcm8gdG8gZGV0ZXJtaW5lXG4gICAgLy8gIHdoZXRoZXIgaXQncyBkaXNwbGF5ZWQsIGFuZCB0aGF0IGEgZGV0YWNoZWQgbm9kZSB3aWxsIF9fYWx3YXlzX18gaGF2ZSBhIHplcm8tYXJlYVxuICAgIC8vICBjbGllbnQgcmVjdCwgd2UgZG9uJ3Qgc3BlY2lhbC1jYXNlIGZvciB3aGV0aGVyIHRoZSBub2RlIGlzIGF0dGFjaGVkIG9yIG5vdC4gSW5cbiAgICAvLyAgdGhpcyBtb2RlLCB3ZSBkbyB3YW50IHRvIGNvbnNpZGVyIG5vZGVzIHRoYXQgaGF2ZSBhIHplcm8gYXJlYSB0byBiZSBoaWRkZW4gYXQgYWxsXG4gICAgLy8gIHRpbWVzLCBhbmQgdGhhdCBpbmNsdWRlcyBhdHRhY2hlZCBvciBub3QuXG4gICAgcmV0dXJuIGlzWmVyb0FyZWEobm9kZSk7XG4gIH1cblxuICAvLyB2aXNpYmxlLCBhcyBmYXIgYXMgd2UgY2FuIHRlbGwsIG9yIHBlciBjdXJyZW50IGBkaXNwbGF5Q2hlY2s9bm9uZWAgbW9kZSwgd2UgYXNzdW1lXG4gIC8vICBpdCdzIHZpc2libGVcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLy8gZm9ybSBmaWVsZHMgKG5lc3RlZCkgaW5zaWRlIGEgZGlzYWJsZWQgZmllbGRzZXQgYXJlIG5vdCBmb2N1c2FibGUvdGFiYmFibGVcbi8vICB1bmxlc3MgdGhleSBhcmUgaW4gdGhlIF9maXJzdF8gPGxlZ2VuZD4gZWxlbWVudCBvZiB0aGUgdG9wLW1vc3QgZGlzYWJsZWRcbi8vICBmaWVsZHNldFxudmFyIGlzRGlzYWJsZWRGcm9tRmllbGRzZXQgPSBmdW5jdGlvbiBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0KG5vZGUpIHtcbiAgaWYgKC9eKElOUFVUfEJVVFRPTnxTRUxFQ1R8VEVYVEFSRUEpJC8udGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICAgdmFyIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgLy8gY2hlY2sgaWYgYG5vZGVgIGlzIGNvbnRhaW5lZCBpbiBhIGRpc2FibGVkIDxmaWVsZHNldD5cbiAgICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgICAgaWYgKHBhcmVudE5vZGUudGFnTmFtZSA9PT0gJ0ZJRUxEU0VUJyAmJiBwYXJlbnROb2RlLmRpc2FibGVkKSB7XG4gICAgICAgIC8vIGxvb2sgZm9yIHRoZSBmaXJzdCA8bGVnZW5kPiBhbW9uZyB0aGUgY2hpbGRyZW4gb2YgdGhlIGRpc2FibGVkIDxmaWVsZHNldD5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gcGFyZW50Tm9kZS5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICAgIC8vIHdoZW4gdGhlIGZpcnN0IDxsZWdlbmQ+IChpbiBkb2N1bWVudCBvcmRlcikgaXMgZm91bmRcbiAgICAgICAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ0xFR0VORCcpIHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyBwYXJlbnQgPGZpZWxkc2V0PiBpcyBub3QgbmVzdGVkIGluIGFub3RoZXIgZGlzYWJsZWQgPGZpZWxkc2V0PixcbiAgICAgICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGBub2RlYCBpcyBhIGRlc2NlbmRhbnQgb2YgaXRzIGZpcnN0IDxsZWdlbmQ+XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcy5jYWxsKHBhcmVudE5vZGUsICdmaWVsZHNldFtkaXNhYmxlZF0gKicpID8gdHJ1ZSA6ICFjaGlsZC5jb250YWlucyhub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIGRpc2FibGVkIDxmaWVsZHNldD4gY29udGFpbmluZyBgbm9kZWAgaGFzIG5vIDxsZWdlbmQ+XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcbiAgICB9XG4gIH1cblxuICAvLyBlbHNlLCBub2RlJ3MgdGFiYmFibGUvZm9jdXNhYmxlIHN0YXRlIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgYSBmaWVsZHNldCdzXG4gIC8vICBlbmFibGVkL2Rpc2FibGVkIHN0YXRlXG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZSA9IGZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSkge1xuICBpZiAobm9kZS5kaXNhYmxlZCB8fFxuICAvLyB3ZSBtdXN0IGRvIGFuIGluZXJ0IGxvb2sgdXAgdG8gZmlsdGVyIG91dCBhbnkgZWxlbWVudHMgaW5zaWRlIGFuIGluZXJ0IGFuY2VzdG9yXG4gIC8vICBiZWNhdXNlIHdlJ3JlIGxpbWl0ZWQgaW4gdGhlIHR5cGUgb2Ygc2VsZWN0b3JzIHdlIGNhbiB1c2UgaW4gSlNEb20gKHNlZSByZWxhdGVkXG4gIC8vICBub3RlIHJlbGF0ZWQgdG8gYGNhbmRpZGF0ZVNlbGVjdG9yc2ApXG4gIGlzSW5lcnQobm9kZSkgfHwgaXNIaWRkZW5JbnB1dChub2RlKSB8fCBpc0hpZGRlbihub2RlLCBvcHRpb25zKSB8fFxuICAvLyBGb3IgYSBkZXRhaWxzIGVsZW1lbnQgd2l0aCBhIHN1bW1hcnksIHRoZSBzdW1tYXJ5IGVsZW1lbnQgZ2V0cyB0aGUgZm9jdXNcbiAgaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkgfHwgaXNEaXNhYmxlZEZyb21GaWVsZHNldChub2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlID0gZnVuY3Rpb24gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlKG9wdGlvbnMsIG5vZGUpIHtcbiAgaWYgKGlzTm9uVGFiYmFibGVSYWRpbyhub2RlKSB8fCBnZXRUYWJJbmRleChub2RlKSA8IDAgfHwgIWlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGlzVmFsaWRTaGFkb3dSb290VGFiYmFibGUgPSBmdW5jdGlvbiBpc1ZhbGlkU2hhZG93Um9vdFRhYmJhYmxlKHNoYWRvd0hvc3ROb2RlKSB7XG4gIHZhciB0YWJJbmRleCA9IHBhcnNlSW50KHNoYWRvd0hvc3ROb2RlLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgMTApO1xuICBpZiAoaXNOYU4odGFiSW5kZXgpIHx8IHRhYkluZGV4ID49IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBJZiBhIGN1c3RvbSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBuZWdhdGl2ZSB0YWJpbmRleCxcbiAgLy8gYnJvd3NlcnMgd2lsbCBub3QgYWxsb3cgdGFiIHRhcmdldGluZyBzYWlkIGVsZW1lbnQncyBjaGlsZHJlbi5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5LjxFbGVtZW50fENhbmRpZGF0ZVNjb3BlPn0gY2FuZGlkYXRlc1xuICogQHJldHVybnMgRWxlbWVudFtdXG4gKi9cbnZhciBzb3J0QnlPcmRlciA9IGZ1bmN0aW9uIHNvcnRCeU9yZGVyKGNhbmRpZGF0ZXMpIHtcbiAgdmFyIHJlZ3VsYXJUYWJiYWJsZXMgPSBbXTtcbiAgdmFyIG9yZGVyZWRUYWJiYWJsZXMgPSBbXTtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgdmFyIGlzU2NvcGUgPSAhIWl0ZW0uc2NvcGVQYXJlbnQ7XG4gICAgdmFyIGVsZW1lbnQgPSBpc1Njb3BlID8gaXRlbS5zY29wZVBhcmVudCA6IGl0ZW07XG4gICAgdmFyIGNhbmRpZGF0ZVRhYmluZGV4ID0gZ2V0U29ydE9yZGVyVGFiSW5kZXgoZWxlbWVudCwgaXNTY29wZSk7XG4gICAgdmFyIGVsZW1lbnRzID0gaXNTY29wZSA/IHNvcnRCeU9yZGVyKGl0ZW0uY2FuZGlkYXRlcykgOiBlbGVtZW50O1xuICAgIGlmIChjYW5kaWRhdGVUYWJpbmRleCA9PT0gMCkge1xuICAgICAgaXNTY29wZSA/IHJlZ3VsYXJUYWJiYWJsZXMucHVzaC5hcHBseShyZWd1bGFyVGFiYmFibGVzLCBlbGVtZW50cykgOiByZWd1bGFyVGFiYmFibGVzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9yZGVyZWRUYWJiYWJsZXMucHVzaCh7XG4gICAgICAgIGRvY3VtZW50T3JkZXI6IGksXG4gICAgICAgIHRhYkluZGV4OiBjYW5kaWRhdGVUYWJpbmRleCxcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgaXNTY29wZTogaXNTY29wZSxcbiAgICAgICAgY29udGVudDogZWxlbWVudHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvcmRlcmVkVGFiYmFibGVzLnNvcnQoc29ydE9yZGVyZWRUYWJiYWJsZXMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBzb3J0YWJsZSkge1xuICAgIHNvcnRhYmxlLmlzU2NvcGUgPyBhY2MucHVzaC5hcHBseShhY2MsIHNvcnRhYmxlLmNvbnRlbnQpIDogYWNjLnB1c2goc29ydGFibGUuY29udGVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10pLmNvbmNhdChyZWd1bGFyVGFiYmFibGVzKTtcbn07XG52YXIgdGFiYmFibGUgPSBmdW5jdGlvbiB0YWJiYWJsZShjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBjYW5kaWRhdGVzO1xuICBpZiAob3B0aW9ucy5nZXRTaGFkb3dSb290KSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXNJdGVyYXRpdmVseShbY29udGFpbmVyXSwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCB7XG4gICAgICBmaWx0ZXI6IGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpLFxuICAgICAgZmxhdHRlbjogZmFsc2UsXG4gICAgICBnZXRTaGFkb3dSb290OiBvcHRpb25zLmdldFNoYWRvd1Jvb3QsXG4gICAgICBzaGFkb3dSb290RmlsdGVyOiBpc1ZhbGlkU2hhZG93Um9vdFRhYmJhYmxlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXMoY29udGFpbmVyLCBvcHRpb25zLmluY2x1ZGVDb250YWluZXIsIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgfVxuICByZXR1cm4gc29ydEJ5T3JkZXIoY2FuZGlkYXRlcyk7XG59O1xudmFyIGZvY3VzYWJsZSA9IGZ1bmN0aW9uIGZvY3VzYWJsZShjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBjYW5kaWRhdGVzO1xuICBpZiAob3B0aW9ucy5nZXRTaGFkb3dSb290KSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXNJdGVyYXRpdmVseShbY29udGFpbmVyXSwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCB7XG4gICAgICBmaWx0ZXI6IGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUuYmluZChudWxsLCBvcHRpb25zKSxcbiAgICAgIGZsYXR0ZW46IHRydWUsXG4gICAgICBnZXRTaGFkb3dSb290OiBvcHRpb25zLmdldFNoYWRvd1Jvb3RcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlcyhjb250YWluZXIsIG9wdGlvbnMuaW5jbHVkZUNvbnRhaW5lciwgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG52YXIgaXNUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzVGFiYmFibGUobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlLCBjYW5kaWRhdGVTZWxlY3RvcikgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yVGFiYmFibGUob3B0aW9ucywgbm9kZSk7XG59O1xudmFyIGZvY3VzYWJsZUNhbmRpZGF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY2FuZGlkYXRlU2VsZWN0b3JzLmNvbmNhdCgnaWZyYW1lJykuam9pbignLCcpO1xudmFyIGlzRm9jdXNhYmxlID0gZnVuY3Rpb24gaXNGb2N1c2FibGUobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlLCBmb2N1c2FibGVDYW5kaWRhdGVTZWxlY3RvcikgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG9wdGlvbnMsIG5vZGUpO1xufTtcblxuZXhwb3J0IHsgZm9jdXNhYmxlLCBnZXRUYWJJbmRleCwgaXNGb2N1c2FibGUsIGlzVGFiYmFibGUsIHRhYmJhYmxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLnRyaW1DYW52YXM9dCgpOmUudHJpbUNhbnZhcz10KCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtpZihyW25dKXJldHVybiByW25dLmV4cG9ydHM7dmFyIG89cltuXT17ZXhwb3J0czp7fSxpZDpuLGxvYWRlZDohMX07cmV0dXJuIGVbbl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsdCksby5sb2FkZWQ9ITAsby5leHBvcnRzfXZhciByPXt9O3JldHVybiB0Lm09ZSx0LmM9cix0LnA9XCJcIix0KDApfShbZnVuY3Rpb24oZSx0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKGUpe3ZhciB0PWUuZ2V0Q29udGV4dChcIjJkXCIpLHI9ZS53aWR0aCxuPWUuaGVpZ2h0LG89dC5nZXRJbWFnZURhdGEoMCwwLHIsbikuZGF0YSxmPWEoITAscixuLG8pLGk9YSghMSxyLG4sbyksYz11KCEwLHIsbixvKSxkPXUoITEscixuLG8pLHA9ZC1jKzEsbD1pLWYrMSxzPXQuZ2V0SW1hZ2VEYXRhKGMsZixwLGwpO3JldHVybiBlLndpZHRoPXAsZS5oZWlnaHQ9bCx0LmNsZWFyUmVjdCgwLDAscCxsKSx0LnB1dEltYWdlRGF0YShzLDAsMCksZX1mdW5jdGlvbiBuKGUsdCxyLG4pe3JldHVybntyZWQ6bls0KihyKnQrZSldLGdyZWVuOm5bNCoocip0K2UpKzFdLGJsdWU6bls0KihyKnQrZSkrMl0sYWxwaGE6bls0KihyKnQrZSkrM119fWZ1bmN0aW9uIG8oZSx0LHIsbyl7cmV0dXJuIG4oZSx0LHIsbykuYWxwaGF9ZnVuY3Rpb24gYShlLHQscixuKXtmb3IodmFyIGE9ZT8xOi0xLHU9ZT8wOnItMSxmPXU7ZT9mPHI6Zj4tMTtmKz1hKWZvcih2YXIgaT0wO2k8dDtpKyspaWYobyhpLGYsdCxuKSlyZXR1cm4gZjtyZXR1cm4gbnVsbH1mdW5jdGlvbiB1KGUsdCxyLG4pe2Zvcih2YXIgYT1lPzE6LTEsdT1lPzA6dC0xLGY9dTtlP2Y8dDpmPi0xO2YrPWEpZm9yKHZhciBpPTA7aTxyO2krKylpZihvKGYsaSx0LG4pKXJldHVybiBmO3JldHVybiBudWxsfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD1yfV0pfSk7IiwiLyoqXG4gKiBBc3NpZ25zIGEgdmFsdWUgZm9yIGEgZ2l2ZW4gcmVmLCBubyBtYXR0ZXIgb2YgdGhlIHJlZiBmb3JtYXRcbiAqIEBwYXJhbSB7UmVmT2JqZWN0fSByZWYgLSBhIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIHJlZiBvYmplY3RcbiAqIEBwYXJhbSB2YWx1ZSAtIGEgbmV3IHZhbHVlXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L3VzZS1jYWxsYmFjay1yZWYjYXNzaWducmVmXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcmVmT2JqZWN0ID0gdXNlUmVmKCk7XG4gKiBjb25zdCByZWZGbiA9IChyZWYpID0+IHsuLi4ufVxuICpcbiAqIGFzc2lnblJlZihyZWZPYmplY3QsIFwicmVmVmFsdWVcIik7XG4gKiBhc3NpZ25SZWYocmVmRm4sIFwicmVmVmFsdWVcIik7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25SZWYocmVmLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlZih2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlZikge1xuICAgICAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVmO1xufVxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgYXNzaWduUmVmIH0gZnJvbSAnLi9hc3NpZ25SZWYnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tICcuL3VzZVJlZic7XG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0O1xudmFyIGN1cnJlbnRWYWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBNZXJnZXMgdHdvIG9yIG1vcmUgcmVmcyB0b2dldGhlciBwcm92aWRpbmcgYSBzaW5nbGUgaW50ZXJmYWNlIHRvIHNldCB0aGVpciB2YWx1ZVxuICogQHBhcmFtIHtSZWZPYmplY3R8UmVmfSByZWZzXG4gKiBAcmV0dXJucyB7TXV0YWJsZVJlZk9iamVjdH0gLSBhIG5ldyByZWYsIHdoaWNoIHRyYW5zbGF0ZXMgYWxsIGNoYW5nZXMgdG8ge3JlZnN9XG4gKlxuICogQHNlZSB7QGxpbmsgbWVyZ2VSZWZzfSBhIHZlcnNpb24gd2l0aG91dCBidWl0LWluIG1lbW9pemF0aW9uXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVLYXNoZXkvdXNlLWNhbGxiYWNrLXJlZiN1c2VtZXJnZXJlZnNcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBDb21wb25lbnQgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gKiAgIGNvbnN0IG93blJlZiA9IHVzZVJlZigpO1xuICogICBjb25zdCBkb21SZWYgPSB1c2VNZXJnZVJlZnMoW3JlZiwgb3duUmVmXSk7IC8vIPCfkYggbWVyZ2UgdG9nZXRoZXJcbiAqICAgcmV0dXJuIDxkaXYgcmVmPXtkb21SZWZ9Pi4uLjwvZGl2PlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWVyZ2VSZWZzKHJlZnMsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciBjYWxsYmFja1JlZiA9IHVzZUNhbGxiYWNrUmVmKGRlZmF1bHRWYWx1ZSB8fCBudWxsLCBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHJlZnMuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7IHJldHVybiBhc3NpZ25SZWYocmVmLCBuZXdWYWx1ZSk7IH0pO1xuICAgIH0pO1xuICAgIC8vIGhhbmRsZSByZWZzIGNoYW5nZXMgLSBhZGRlZCBvciByZW1vdmVkXG4gICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IGN1cnJlbnRWYWx1ZXMuZ2V0KGNhbGxiYWNrUmVmKTtcbiAgICAgICAgaWYgKG9sZFZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgcHJldlJlZnNfMSA9IG5ldyBTZXQob2xkVmFsdWUpO1xuICAgICAgICAgICAgdmFyIG5leHRSZWZzXzEgPSBuZXcgU2V0KHJlZnMpO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRfMSA9IGNhbGxiYWNrUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICBwcmV2UmVmc18xLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgICAgICAgICAgIGlmICghbmV4dFJlZnNfMS5oYXMocmVmKSkge1xuICAgICAgICAgICAgICAgICAgICBhc3NpZ25SZWYocmVmLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5leHRSZWZzXzEuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2UmVmc18xLmhhcyhyZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2lnblJlZihyZWYsIGN1cnJlbnRfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFZhbHVlcy5zZXQoY2FsbGJhY2tSZWYsIHJlZnMpO1xuICAgIH0sIFtyZWZzXSk7XG4gICAgcmV0dXJuIGNhbGxiYWNrUmVmO1xufVxuIiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIGNyZWF0ZXMgYSBNdXRhYmxlUmVmIHdpdGggcmVmIGNoYW5nZSBjYWxsYmFja1xuICogQHBhcmFtIGluaXRpYWxWYWx1ZSAtIGluaXRpYWwgcmVmIHZhbHVlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIGEgY2FsbGJhY2sgdG8gcnVuIHdoZW4gdmFsdWUgY2hhbmdlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByZWYgPSB1c2VDYWxsYmFja1JlZigwLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiBjb25zb2xlLmxvZyhvbGRWYWx1ZSwgJy0+JywgbmV3VmFsdWUpO1xuICogcmVmLmN1cnJlbnQgPSAxO1xuICogLy8gcHJpbnRzIDAgLT4gMVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2hvb2tzLXJlZmVyZW5jZS5odG1sI3VzZXJlZlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L3VzZS1jYWxsYmFjay1yZWYjdXNlY2FsbGJhY2tyZWYtLS10by1yZXBsYWNlLXJlYWN0dXNlcmVmXG4gKiBAcmV0dXJucyB7TXV0YWJsZVJlZk9iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNhbGxiYWNrUmVmKGluaXRpYWxWYWx1ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgcmVmID0gdXNlU3RhdGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgLy8gdmFsdWVcbiAgICAgICAgdmFsdWU6IGluaXRpYWxWYWx1ZSxcbiAgICAgICAgLy8gbGFzdCBjYWxsYmFja1xuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgIC8vIFwibWVtb2l6ZWRcIiBwdWJsaWMgaW50ZXJmYWNlXG4gICAgICAgIGZhY2FkZToge1xuICAgICAgICAgICAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZi52YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgY3VycmVudCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0ID0gcmVmLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZWYudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVmLmNhbGxiYWNrKHZhbHVlLCBsYXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pOyB9KVswXTtcbiAgICAvLyB1cGRhdGUgY2FsbGJhY2tcbiAgICByZWYuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICByZXR1cm4gcmVmLmZhY2FkZTtcbn1cbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBTaWRlQ2FyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHNpZGVDYXIgPSBfYS5zaWRlQ2FyLCByZXN0ID0gX19yZXN0KF9hLCBbXCJzaWRlQ2FyXCJdKTtcbiAgICBpZiAoIXNpZGVDYXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWRlY2FyOiBwbGVhc2UgcHJvdmlkZSBgc2lkZUNhcmAgcHJvcGVydHkgdG8gaW1wb3J0IHRoZSByaWdodCBjYXInKTtcbiAgICB9XG4gICAgdmFyIFRhcmdldCA9IHNpZGVDYXIucmVhZCgpO1xuICAgIGlmICghVGFyZ2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2lkZWNhciBtZWRpdW0gbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFRhcmdldCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbn07XG5TaWRlQ2FyLmlzU2lkZUNhckV4cG9ydCA9IHRydWU7XG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0U2lkZWNhcihtZWRpdW0sIGV4cG9ydGVkKSB7XG4gICAgbWVkaXVtLnVzZU1lZGl1bShleHBvcnRlZCk7XG4gICAgcmV0dXJuIFNpZGVDYXI7XG59XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuZnVuY3Rpb24gSXRvSShhKSB7XG4gICAgcmV0dXJuIGE7XG59XG5mdW5jdGlvbiBpbm5lckNyZWF0ZU1lZGl1bShkZWZhdWx0cywgbWlkZGxld2FyZSkge1xuICAgIGlmIChtaWRkbGV3YXJlID09PSB2b2lkIDApIHsgbWlkZGxld2FyZSA9IEl0b0k7IH1cbiAgICB2YXIgYnVmZmVyID0gW107XG4gICAgdmFyIGFzc2lnbmVkID0gZmFsc2U7XG4gICAgdmFyIG1lZGl1bSA9IHtcbiAgICAgICAgcmVhZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGFzc2lnbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWRlY2FyOiBjb3VsZCBub3QgYHJlYWRgIGZyb20gYW4gYGFzc2lnbmVkYCBtZWRpdW0uIGByZWFkYCBjb3VsZCBiZSB1c2VkIG9ubHkgd2l0aCBgdXNlTWVkaXVtYC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgICAgIH0sXG4gICAgICAgIHVzZU1lZGl1bTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gbWlkZGxld2FyZShkYXRhLCBhc3NpZ25lZCk7XG4gICAgICAgICAgICBidWZmZXIucHVzaChpdGVtKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCAhPT0gaXRlbTsgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBhc3NpZ25TeW5jTWVkaXVtOiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgIGFzc2lnbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNicyA9IGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICBjYnMuZm9yRWFjaChjYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIgPSB7XG4gICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGNiKHgpOyB9LFxuICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gYnVmZmVyOyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgYXNzaWduTWVkaXVtOiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgIGFzc2lnbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBwZW5kaW5nUXVldWUgPSBbXTtcbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNicyA9IGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICBjYnMuZm9yRWFjaChjYik7XG4gICAgICAgICAgICAgICAgcGVuZGluZ1F1ZXVlID0gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGV4ZWN1dGVRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2JzID0gcGVuZGluZ1F1ZXVlO1xuICAgICAgICAgICAgICAgIHBlbmRpbmdRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgIGNicy5mb3JFYWNoKGNiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgY3ljbGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGV4ZWN1dGVRdWV1ZSk7IH07XG4gICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgYnVmZmVyID0ge1xuICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdRdWV1ZS5wdXNoKHgpO1xuICAgICAgICAgICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdRdWV1ZSA9IHBlbmRpbmdRdWV1ZS5maWx0ZXIoZmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBtZWRpdW07XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVkaXVtKGRlZmF1bHRzLCBtaWRkbGV3YXJlKSB7XG4gICAgaWYgKG1pZGRsZXdhcmUgPT09IHZvaWQgMCkgeyBtaWRkbGV3YXJlID0gSXRvSTsgfVxuICAgIHJldHVybiBpbm5lckNyZWF0ZU1lZGl1bShkZWZhdWx0cywgbWlkZGxld2FyZSk7XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpZGVjYXJNZWRpdW0ob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIG1lZGl1bSA9IGlubmVyQ3JlYXRlTWVkaXVtKG51bGwpO1xuICAgIG1lZGl1bS5vcHRpb25zID0gX19hc3NpZ24oeyBhc3luYzogdHJ1ZSwgc3NyOiBmYWxzZSB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gbWVkaXVtO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgcmV0dXJuIHggPT09IHkgJiYgKHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5KSB8fCB4ICE9PSB4ICYmIHkgIT09IHkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgO1xufVxuXG52YXIgb2JqZWN0SXMgPSB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaXM7XG5cbnZhciB1c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlO1xuXG4vLyBmb3IgQ29tbW9uSlMgaW50ZXJvcC5cblxudmFyIHVzZVJlZiA9IFJlYWN0LnVzZVJlZixcbiAgICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gICAgdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8sXG4gICAgdXNlRGVidWdWYWx1ZSA9IFJlYWN0LnVzZURlYnVnVmFsdWU7IC8vIFNhbWUgYXMgdXNlU3luY0V4dGVybmFsU3RvcmUsIGJ1dCBzdXBwb3J0cyBzZWxlY3RvciBhbmQgaXNFcXVhbCBhcmd1bWVudHMuXG5cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbCkge1xuICAvLyBVc2UgdGhpcyB0byB0cmFjayB0aGUgcmVuZGVyZWQgc25hcHNob3QuXG4gIHZhciBpbnN0UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgaW5zdDtcblxuICBpZiAoaW5zdFJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgaW5zdCA9IHtcbiAgICAgIGhhc1ZhbHVlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBudWxsXG4gICAgfTtcbiAgICBpbnN0UmVmLmN1cnJlbnQgPSBpbnN0O1xuICB9IGVsc2Uge1xuICAgIGluc3QgPSBpbnN0UmVmLmN1cnJlbnQ7XG4gIH1cblxuICB2YXIgX3VzZU1lbW8gPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUcmFjayB0aGUgbWVtb2l6ZWQgc3RhdGUgdXNpbmcgY2xvc3VyZSB2YXJpYWJsZXMgdGhhdCBhcmUgbG9jYWwgdG8gdGhpc1xuICAgIC8vIG1lbW9pemVkIGluc3RhbmNlIG9mIGEgZ2V0U25hcHNob3QgZnVuY3Rpb24uIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGFcbiAgICAvLyB1c2VSZWYgaG9vaywgYmVjYXVzZSB0aGF0IHN0YXRlIHdvdWxkIGJlIHNoYXJlZCBhY3Jvc3MgYWxsIGNvbmN1cnJlbnRcbiAgICAvLyBjb3BpZXMgb2YgdGhlIGhvb2svY29tcG9uZW50LlxuICAgIHZhciBoYXNNZW1vID0gZmFsc2U7XG4gICAgdmFyIG1lbW9pemVkU25hcHNob3Q7XG4gICAgdmFyIG1lbW9pemVkU2VsZWN0aW9uO1xuXG4gICAgdmFyIG1lbW9pemVkU2VsZWN0b3IgPSBmdW5jdGlvbiAobmV4dFNuYXBzaG90KSB7XG4gICAgICBpZiAoIWhhc01lbW8pIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIGhvb2sgaXMgY2FsbGVkLCB0aGVyZSBpcyBubyBtZW1vaXplZCByZXN1bHQuXG4gICAgICAgIGhhc01lbW8gPSB0cnVlO1xuICAgICAgICBtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90O1xuXG4gICAgICAgIHZhciBfbmV4dFNlbGVjdGlvbiA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7XG5cbiAgICAgICAgaWYgKGlzRXF1YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEV2ZW4gaWYgdGhlIHNlbGVjdG9yIGhhcyBjaGFuZ2VkLCB0aGUgY3VycmVudGx5IHJlbmRlcmVkIHNlbGVjdGlvblxuICAgICAgICAgIC8vIG1heSBiZSBlcXVhbCB0byB0aGUgbmV3IHNlbGVjdGlvbi4gV2Ugc2hvdWxkIGF0dGVtcHQgdG8gcmV1c2UgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCB2YWx1ZSBpZiBwb3NzaWJsZSwgdG8gcHJlc2VydmUgZG93bnN0cmVhbSBtZW1vaXphdGlvbnMuXG4gICAgICAgICAgaWYgKGluc3QuaGFzVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U2VsZWN0aW9uID0gaW5zdC52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGlzRXF1YWwoY3VycmVudFNlbGVjdGlvbiwgX25leHRTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgIG1lbW9pemVkU2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24gPSBfbmV4dFNlbGVjdGlvbjtcbiAgICAgICAgcmV0dXJuIF9uZXh0U2VsZWN0aW9uO1xuICAgICAgfSAvLyBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSB0aGUgcHJldmlvdXMgaW52b2NhdGlvbidzIHJlc3VsdC5cblxuXG4gICAgICAvLyBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSB0aGUgcHJldmlvdXMgaW52b2NhdGlvbidzIHJlc3VsdC5cbiAgICAgIHZhciBwcmV2U25hcHNob3QgPSBtZW1vaXplZFNuYXBzaG90O1xuICAgICAgdmFyIHByZXZTZWxlY3Rpb24gPSBtZW1vaXplZFNlbGVjdGlvbjtcblxuICAgICAgaWYgKG9iamVjdElzKHByZXZTbmFwc2hvdCwgbmV4dFNuYXBzaG90KSkge1xuICAgICAgICAvLyBUaGUgc25hcHNob3QgaXMgdGhlIHNhbWUgYXMgbGFzdCB0aW1lLiBSZXVzZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLlxuICAgICAgICByZXR1cm4gcHJldlNlbGVjdGlvbjtcbiAgICAgIH0gLy8gVGhlIHNuYXBzaG90IGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNvbXB1dGUgYSBuZXcgc2VsZWN0aW9uLlxuXG5cbiAgICAgIC8vIFRoZSBzbmFwc2hvdCBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjb21wdXRlIGEgbmV3IHNlbGVjdGlvbi5cbiAgICAgIHZhciBuZXh0U2VsZWN0aW9uID0gc2VsZWN0b3IobmV4dFNuYXBzaG90KTsgLy8gSWYgYSBjdXN0b20gaXNFcXVhbCBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdXNlIHRoYXQgdG8gY2hlY2sgaWYgdGhlIGRhdGFcbiAgICAgIC8vIGhhcyBjaGFuZ2VkLiBJZiBpdCBoYXNuJ3QsIHJldHVybiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLiBUaGF0IHNpZ25hbHNcbiAgICAgIC8vIHRvIFJlYWN0IHRoYXQgdGhlIHNlbGVjdGlvbnMgYXJlIGNvbmNlcHR1YWxseSBlcXVhbCwgYW5kIHdlIGNhbiBiYWlsXG4gICAgICAvLyBvdXQgb2YgcmVuZGVyaW5nLlxuXG4gICAgICAvLyBJZiBhIGN1c3RvbSBpc0VxdWFsIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB1c2UgdGhhdCB0byBjaGVjayBpZiB0aGUgZGF0YVxuICAgICAgLy8gaGFzIGNoYW5nZWQuIElmIGl0IGhhc24ndCwgcmV0dXJuIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uIFRoYXQgc2lnbmFsc1xuICAgICAgLy8gdG8gUmVhY3QgdGhhdCB0aGUgc2VsZWN0aW9ucyBhcmUgY29uY2VwdHVhbGx5IGVxdWFsLCBhbmQgd2UgY2FuIGJhaWxcbiAgICAgIC8vIG91dCBvZiByZW5kZXJpbmcuXG4gICAgICBpZiAoaXNFcXVhbCAhPT0gdW5kZWZpbmVkICYmIGlzRXF1YWwocHJldlNlbGVjdGlvbiwgbmV4dFNlbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTZWxlY3Rpb247XG4gICAgICB9XG5cbiAgICAgIG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3Q7XG4gICAgICBtZW1vaXplZFNlbGVjdGlvbiA9IG5leHRTZWxlY3Rpb247XG4gICAgICByZXR1cm4gbmV4dFNlbGVjdGlvbjtcbiAgICB9OyAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0YW50IHNvIHRoYXQgRmxvdyBrbm93cyBpdCBjYW4ndCBjaGFuZ2UuXG5cblxuICAgIC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3RhbnQgc28gdGhhdCBGbG93IGtub3dzIGl0IGNhbid0IGNoYW5nZS5cbiAgICB2YXIgbWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCA9IGdldFNlcnZlclNuYXBzaG90ID09PSB1bmRlZmluZWQgPyBudWxsIDogZ2V0U2VydmVyU25hcHNob3Q7XG5cbiAgICB2YXIgZ2V0U25hcHNob3RXaXRoU2VsZWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihnZXRTbmFwc2hvdCgpKTtcbiAgICB9O1xuXG4gICAgdmFyIGdldFNlcnZlclNuYXBzaG90V2l0aFNlbGVjdG9yID0gbWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZW1vaXplZFNlbGVjdG9yKG1heWJlR2V0U2VydmVyU25hcHNob3QoKSk7XG4gICAgfTtcbiAgICByZXR1cm4gW2dldFNuYXBzaG90V2l0aFNlbGVjdG9yLCBnZXRTZXJ2ZXJTbmFwc2hvdFdpdGhTZWxlY3Rvcl07XG4gIH0sIFtnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QsIHNlbGVjdG9yLCBpc0VxdWFsXSksXG4gICAgICBnZXRTZWxlY3Rpb24gPSBfdXNlTWVtb1swXSxcbiAgICAgIGdldFNlcnZlclNlbGVjdGlvbiA9IF91c2VNZW1vWzFdO1xuXG4gIHZhciB2YWx1ZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U2VsZWN0aW9uLCBnZXRTZXJ2ZXJTZWxlY3Rpb24pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGluc3QuaGFzVmFsdWUgPSB0cnVlO1xuICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgfSwgW3ZhbHVlXSk7XG4gIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXdpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNQVhcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX21heC5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5JTFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbmlsLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicGFyc2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3BhcnNlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3RyaW5naWZ5XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2MVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdi5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInYxVG9WNlwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjFUb1YuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2M1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjIuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjMuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjQuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NlwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjUuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NlRvVjFcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3Y2VG9WLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjdcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3Y2LmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidmFsaWRhdGVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3ZhbGlkYXRlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidmVyc2lvblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdmVyc2lvbi5kZWZhdWx0O1xuICB9XG59KTtcbnZhciBfbWF4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9tYXguanNcIikpO1xudmFyIF9uaWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL25pbC5qc1wiKSk7XG52YXIgX3BhcnNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZS5qc1wiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpKTtcbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjEuanNcIikpO1xudmFyIF92MVRvViA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjFUb1Y2LmpzXCIpKTtcbnZhciBfdjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YzLmpzXCIpKTtcbnZhciBfdjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y0LmpzXCIpKTtcbnZhciBfdjQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y1LmpzXCIpKTtcbnZhciBfdjUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y2LmpzXCIpKTtcbnZhciBfdjZUb1YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y2VG9WMS5qc1wiKSk7XG52YXIgX3Y2ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92Ny5qc1wiKSk7XG52YXIgX3ZhbGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKSk7XG52YXIgX3ZlcnNpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3ZlcnNpb24uanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gJ2ZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZic7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEphdmFTY3JpcHQgTUQ1XG4gKlxuICogTW9kaWZpY2F0aW9uIG9mIEphdmFTY3JpcHQgTUQ1XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9KYXZhU2NyaXB0LU1ENVxuICpcbiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqXG4gKiBCYXNlZCBvblxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZVxuICogRGlnZXN0IEFsZ29yaXRobSwgYXMgZGVmaW5lZCBpbiBSRkMgMTMyMS5cbiAqIFZlcnNpb24gMi4yIENvcHlyaWdodCAoQykgUGF1bCBKb2huc3RvbiAxOTk5IC0gMjAwOVxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgbW9yZSBpbmZvLlxuICovXG5mdW5jdGlvbiBtZDUoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KG1zZy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlc1tpXSA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG5cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAqL1xuZnVuY3Rpb24gbWQ1VG9IZXhFbmNvZGVkQXJyYXkoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgbGVuZ3RoMzIgPSBpbnB1dC5sZW5ndGggKiAzMjtcbiAgdmFyIGhleFRhYiA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgdmFyIHggPSBpbnB1dFtpID4+IDVdID4+PiBpICUgMzIgJiAweGZmO1xuICAgIHZhciBoZXggPSBwYXJzZUludChoZXhUYWIuY2hhckF0KHggPj4+IDQgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpLCAxNik7XG4gICAgb3V0cHV0LnB1c2goaGV4KTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBvdXRwdXQgbGVuZ3RoIHdpdGggcGFkZGluZyBhbmQgYml0IGxlbmd0aFxuICovXG5mdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGg4KSB7XG4gIHJldHVybiAoaW5wdXRMZW5ndGg4ICsgNjQgPj4+IDkgPDwgNCkgKyAxNCArIDE7XG59XG5cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiB3b3Jkc1RvTWQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4W2dldE91dHB1dExlbmd0aChsZW4pIC0gMV0gPSBsZW47XG4gIHZhciBhID0gMTczMjU4NDE5MztcbiAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICB2YXIgZCA9IDI3MTczMzg3ODtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikge1xuICAgIHZhciBvbGRhID0gYTtcbiAgICB2YXIgb2xkYiA9IGI7XG4gICAgdmFyIG9sZGMgPSBjO1xuICAgIHZhciBvbGRkID0gZDtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTYsIDE4MzkwMzA1NjIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNCwgLTE1MzA5OTIwNjApO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA0XSwgMTEsIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNCwgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpXSwgMTEsIC0zNTg1MzcyMjIpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyA2XSwgMjMsIDc2MDI5MTg5KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgOV0sIDQsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNiwgNTMwNzQyNTIwKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMl0sIDIzLCAtOTk1MzM4NjUxKTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG4gICAgYSA9IHNhZmVBZGQoYSwgb2xkYSk7XG4gICAgYiA9IHNhZmVBZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVBZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVBZGQoZCwgb2xkZCk7XG4gIH1cbiAgcmV0dXJuIFthLCBiLCBjLCBkXTtcbn1cblxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgYnl0ZXMgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKi9cbmZ1bmN0aW9uIGJ5dGVzVG9Xb3JkcyhpbnB1dCkge1xuICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBsZW5ndGg4ID0gaW5wdXQubGVuZ3RoICogODtcbiAgdmFyIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShnZXRPdXRwdXRMZW5ndGgobGVuZ3RoOCkpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDg7IGkgKz0gOCkge1xuICAgIG91dHB1dFtpID4+IDVdIHw9IChpbnB1dFtpIC8gOF0gJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLypcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcbiAqIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG4gKi9cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gIHJldHVybiBtc3cgPDwgMTYgfCBsc3cgJiAweGZmZmY7XG59XG5cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cbmZ1bmN0aW9uIGJpdFJvdGF0ZUxlZnQobnVtLCBjbnQpIHtcbiAgcmV0dXJuIG51bSA8PCBjbnQgfCBudW0gPj4+IDMyIC0gY250O1xufVxuXG4vKlxuICogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgZm91ciBiYXNpYyBvcGVyYXRpb25zIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqL1xuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5mdW5jdGlvbiBtZDVmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGMgfCB+YiAmIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBkIHwgYyAmIH5kLCBhLCBiLCB4LCBzLCB0KTtcbn1cbmZ1bmN0aW9uIG1kNWhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBtZDU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgcmFuZG9tVVVJRCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEICYmIGNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgcmFuZG9tVVVJRFxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF92YWxpZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdmFsaWRhdGUuanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuZnVuY3Rpb24gcGFyc2UodXVpZCkge1xuICBpZiAoISgwLCBfdmFsaWRhdGUuZGVmYXVsdCkodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG4gIHZhciB2O1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuXG4gIC8vIFBhcnNlICMjIyMjIyMjLS4uLi4tLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuICBhcnJbMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0O1xuICBhcnJbMV0gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsyXSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbM10gPSB2ICYgMHhmZjtcblxuICAvLyBQYXJzZSAuLi4uLi4uLi0jIyMjLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cbiAgYXJyWzRdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDksIDEzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzVdID0gdiAmIDB4ZmY7XG5cbiAgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0jIyMjLS4uLi4tLi4uLi4uLi4uLi4uXG4gIGFycls2XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTgpLCAxNikpID4+PiA4O1xuICBhcnJbN10gPSB2ICYgMHhmZjtcblxuICAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tIyMjIy0uLi4uLi4uLi4uLi5cbiAgYXJyWzhdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDg7XG4gIGFycls5XSA9IHYgJiAweGZmO1xuXG4gIC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0uLi4uLSMjIyMjIyMjIyMjI1xuICAvLyAoVXNlIFwiL1wiIHRvIGF2b2lkIDMyLWJpdCB0cnVuY2F0aW9uIHdoZW4gYml0LXNoaWZ0aW5nIGhpZ2gtb3JkZXIgYnl0ZXMpXG4gIGFyclsxMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMjQsIDM2KSwgMTYpKSAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTFdID0gdiAvIDB4MTAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzEyXSA9IHYgPj4+IDI0ICYgMHhmZjtcbiAgYXJyWzEzXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzE0XSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbMTVdID0gdiAmIDB4ZmY7XG4gIHJldHVybiBhcnI7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBwYXJzZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtOF1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwfGZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZikkL2k7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBybmc7XG4vLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cblxudmFyIGdldFJhbmRvbVZhbHVlcztcbnZhciBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmZ1bmN0aW9uIHJuZygpIHtcbiAgLy8gbGF6eSBsb2FkIHNvIHRoYXQgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBwb2x5ZmlsbCBoYXZlIGEgY2hhbmNlIHRvIGRvIHNvXG4gIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvIGltcGxlbWVudGF0aW9uLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byk7XG4gICAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vLyBBZGFwdGVkIGZyb20gQ2hyaXMgVmVuZXNzJyBTSEExIGNvZGUgYXRcbi8vIGh0dHA6Ly93d3cubW92YWJsZS10eXBlLmNvLnVrL3NjcmlwdHMvc2hhMS5odG1sXG5mdW5jdGlvbiBmKHMsIHgsIHksIHopIHtcbiAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIHggJiB5IF4gfnggJiB6O1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuICB9XG59XG5mdW5jdGlvbiBST1RMKHgsIG4pIHtcbiAgcmV0dXJuIHggPDwgbiB8IHggPj4+IDMyIC0gbjtcbn1cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzLnB1c2gobXNnLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShieXRlcykpIHtcbiAgICAvLyBDb252ZXJ0IEFycmF5LWxpa2UgdG8gQXJyYXlcbiAgICBieXRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJ5dGVzKTtcbiAgfVxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IE47ICsrX2kpIHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQzMkFycmF5KDE2KTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIGFycltqXSA9IGJ5dGVzW19pICogNjQgKyBqICogNF0gPDwgMjQgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAxXSA8PCAxNiB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDJdIDw8IDggfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAzXTtcbiAgICB9XG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cbiAgTVtOIC0gMV1bMTRdID0gKGJ5dGVzLmxlbmd0aCAtIDEpICogOCAvIE1hdGgucG93KDIsIDMyKTtcbiAgTVtOIC0gMV1bMTRdID0gTWF0aC5mbG9vcihNW04gLSAxXVsxNF0pO1xuICBNW04gLSAxXVsxNV0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4ICYgMHhmZmZmZmZmZjtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgKytfaTIpIHtcbiAgICB2YXIgVyA9IG5ldyBVaW50MzJBcnJheSg4MCk7XG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfdCA9IDE2OyBfdCA8IDgwOyArK190KSB7XG4gICAgICBXW190XSA9IFJPVEwoV1tfdCAtIDNdIF4gV1tfdCAtIDhdIF4gV1tfdCAtIDE0XSBeIFdbX3QgLSAxNl0sIDEpO1xuICAgIH1cbiAgICB2YXIgYSA9IEhbMF07XG4gICAgdmFyIGIgPSBIWzFdO1xuICAgIHZhciBjID0gSFsyXTtcbiAgICB2YXIgZCA9IEhbM107XG4gICAgdmFyIGUgPSBIWzRdO1xuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cbiAgICBIWzBdID0gSFswXSArIGEgPj4+IDA7XG4gICAgSFsxXSA9IEhbMV0gKyBiID4+PiAwO1xuICAgIEhbMl0gPSBIWzJdICsgYyA+Pj4gMDtcbiAgICBIWzNdID0gSFszXSArIGQgPj4+IDA7XG4gICAgSFs0XSA9IEhbNF0gKyBlID4+PiAwO1xuICB9XG4gIHJldHVybiBbSFswXSA+PiAyNCAmIDB4ZmYsIEhbMF0gPj4gMTYgJiAweGZmLCBIWzBdID4+IDggJiAweGZmLCBIWzBdICYgMHhmZiwgSFsxXSA+PiAyNCAmIDB4ZmYsIEhbMV0gPj4gMTYgJiAweGZmLCBIWzFdID4+IDggJiAweGZmLCBIWzFdICYgMHhmZiwgSFsyXSA+PiAyNCAmIDB4ZmYsIEhbMl0gPj4gMTYgJiAweGZmLCBIWzJdID4+IDggJiAweGZmLCBIWzJdICYgMHhmZiwgSFszXSA+PiAyNCAmIDB4ZmYsIEhbM10gPj4gMTYgJiAweGZmLCBIWzNdID4+IDggJiAweGZmLCBIWzNdICYgMHhmZiwgSFs0XSA+PiAyNCAmIDB4ZmYsIEhbNF0gPj4gMTYgJiAweGZmLCBIWzRdID4+IDggJiAweGZmLCBIWzRdICYgMHhmZl07XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBzaGExOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuZXhwb3J0cy51bnNhZmVTdHJpbmdpZnkgPSB1bnNhZmVTdHJpbmdpZnk7XG52YXIgX3ZhbGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cbnZhciBieXRlVG9IZXggPSBbXTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnNsaWNlKDEpKTtcbn1cbmZ1bmN0aW9uIHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIC8vXG4gIC8vIE5vdGUgdG8gZnV0dXJlLXNlbGY6IE5vLCB5b3UgY2FuJ3QgcmVtb3ZlIHRoZSBgdG9Mb3dlckNhc2UoKWAgY2FsbC5cbiAgLy8gUkVGOiBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC82NzcjaXNzdWVjb21tZW50LTE3NTczNTEzNTFcbiAgcmV0dXJuIChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgdmFyIHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpO1xuICAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG4gIGlmICghKDAsIF92YWxpZGF0ZS5kZWZhdWx0KSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cbiAgcmV0dXJuIHV1aWQ7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBzdHJpbmdpZnk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JuZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcm5nLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcbnZhciBfY2xvY2tzZXE7XG5cbi8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwO1xuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBBcnJheSgxNik7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZTtcbiAgdmFyIGNsb2Nrc2VxID0gb3B0aW9ucy5jbG9ja3NlcTtcblxuICAvLyB2MSBvbmx5OiBVc2UgY2FjaGVkIGBub2RlYCBhbmQgYGNsb2Nrc2VxYCB2YWx1ZXNcbiAgaWYgKCFvcHRpb25zLl92Nikge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgbm9kZSA9IF9ub2RlSWQ7XG4gICAgfVxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcTtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgY2FzZXMgd2hlcmUgd2UgbmVlZCBlbnRyb3B5LiAgV2UgZG8gdGhpcyBsYXppbHkgdG8gbWluaW1pemUgaXNzdWVzXG4gIC8vIHJlbGF0ZWQgdG8gaW5zdWZmaWNpZW50IHN5c3RlbSBlbnRyb3B5LiAgU2VlICMxODlcbiAgaWYgKG5vZGUgPT0gbnVsbCB8fCBjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgdmFyIHNlZWRCeXRlcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBfcm5nLmRlZmF1bHQpKCk7XG5cbiAgICAvLyBSYW5kb21pemUgbm9kZVxuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIG5vZGUgPSBbc2VlZEJ5dGVzWzBdLCBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XV07XG5cbiAgICAgIC8vIHYxIG9ubHk6IGNhY2hlIG5vZGUgdmFsdWUgZm9yIHJldXNlXG4gICAgICBpZiAoIV9ub2RlSWQgJiYgIW9wdGlvbnMuX3Y2KSB7XG4gICAgICAgIC8vIHBlciBSRkM0MTIyIDQuNTogU2V0IE1BQyBtdWx0aWNhc3QgYml0ICh2MSBvbmx5KVxuICAgICAgICBub2RlWzBdIHw9IDB4MDE7IC8vIFNldCBtdWx0aWNhc3QgYml0XG5cbiAgICAgICAgX25vZGVJZCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmFuZG9taXplIGNsb2Nrc2VxXG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgICBpZiAoX2Nsb2Nrc2VxID09PSB1bmRlZmluZWQgJiYgIW9wdGlvbnMuX3Y2KSB7XG4gICAgICAgIF9jbG9ja3NlcSA9IGNsb2Nrc2VxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHYxICYgdjYgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvIHRpbWUgaXNcbiAgLy8gaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogRGF0ZS5ub3coKTtcblxuICAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG4gIHZhciBuc2VjcyA9IG9wdGlvbnMubnNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNlY3MgOiBfbGFzdE5TZWNzICsgMTtcblxuICAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG4gIHZhciBkdCA9IG1zZWNzIC0gX2xhc3RNU2VjcyArIChuc2VjcyAtIF9sYXN0TlNlY3MpIC8gMTAwMDA7XG5cbiAgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuICBpZiAoZHQgPCAwICYmIG9wdGlvbnMuY2xvY2tzZXEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNsb2Nrc2VxID0gY2xvY2tzZXEgKyAxICYgMHgzZmZmO1xuICB9XG5cbiAgLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfVxuXG4gIC8vIFBlciA0LjIuMS4yIFRocm93IGVycm9yIGlmIHRvbyBtYW55IHV1aWRzIGFyZSByZXF1ZXN0ZWRcbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWNcIik7XG4gIH1cbiAgX2xhc3RNU2VjcyA9IG1zZWNzO1xuICBfbGFzdE5TZWNzID0gbnNlY3M7XG4gIF9jbG9ja3NlcSA9IGNsb2Nrc2VxO1xuXG4gIC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuICBtc2VjcyArPSAxMjIxOTI5MjgwMDAwMDtcblxuICAvLyBgdGltZV9sb3dgXG4gIHZhciB0bCA9ICgobXNlY3MgJiAweGZmZmZmZmYpICogMTAwMDAgKyBuc2VjcykgJSAweDEwMDAwMDAwMDtcbiAgYltpKytdID0gdGwgPj4+IDI0ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDE2ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bCAmIDB4ZmY7XG5cbiAgLy8gYHRpbWVfbWlkYFxuICB2YXIgdG1oID0gbXNlY3MgLyAweDEwMDAwMDAwMCAqIDEwMDAwICYgMHhmZmZmZmZmO1xuICBiW2krK10gPSB0bWggPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bWggJiAweGZmO1xuXG4gIC8vIGB0aW1lX2hpZ2hfYW5kX3ZlcnNpb25gXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMjQgJiAweGYgfCAweDEwOyAvLyBpbmNsdWRlIHZlcnNpb25cbiAgYltpKytdID0gdG1oID4+PiAxNiAmIDB4ZmY7XG5cbiAgLy8gYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgIChQZXIgNC4yLjIgLSBpbmNsdWRlIHZhcmlhbnQpXG4gIGJbaSsrXSA9IGNsb2Nrc2VxID4+PiA4IHwgMHg4MDtcblxuICAvLyBgY2xvY2tfc2VxX2xvd2BcbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmO1xuXG4gIC8vIGBub2RlYFxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuICByZXR1cm4gYnVmIHx8ICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkoYik7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2MTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHYxVG9WNjtcbnZhciBfcGFyc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLyoqXG4gKiBDb252ZXJ0IGEgdjEgVVVJRCB0byBhIHY2IFVVSURcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xVaW50OEFycmF5fSB1dWlkIC0gVGhlIHYxIFVVSUQgdG8gY29udmVydCB0byB2NlxuICogQHJldHVybnMge3N0cmluZ3xVaW50OEFycmF5fSBUaGUgdjYgVVVJRCBhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBgdXVpZGAgYXJnXG4gKiAoc3RyaW5nIG9yIFVpbnQ4QXJyYXkpXG4gKi9cbmZ1bmN0aW9uIHYxVG9WNih1dWlkKSB7XG4gIHZhciB2MUJ5dGVzID0gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIF9wYXJzZS5kZWZhdWx0KSh1dWlkKSA6IHV1aWQ7XG4gIHZhciB2NkJ5dGVzID0gX3YxVG9WNih2MUJ5dGVzKTtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyA/ICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkodjZCeXRlcykgOiB2NkJ5dGVzO1xufVxuXG4vLyBEbyB0aGUgZmllbGQgdHJhbnNmb3JtYXRpb24gbmVlZGVkIGZvciB2MSAtPiB2NlxuZnVuY3Rpb24gX3YxVG9WNih2MUJ5dGVzLCByYW5kb21pemUgPSBmYWxzZSkge1xuICByZXR1cm4gVWludDhBcnJheS5vZigodjFCeXRlc1s2XSAmIDB4MGYpIDw8IDQgfCB2MUJ5dGVzWzddID4+IDQgJiAweDBmLCAodjFCeXRlc1s3XSAmIDB4MGYpIDw8IDQgfCAodjFCeXRlc1s0XSAmIDB4ZjApID4+IDQsICh2MUJ5dGVzWzRdICYgMHgwZikgPDwgNCB8ICh2MUJ5dGVzWzVdICYgMHhmMCkgPj4gNCwgKHYxQnl0ZXNbNV0gJiAweDBmKSA8PCA0IHwgKHYxQnl0ZXNbMF0gJiAweGYwKSA+PiA0LCAodjFCeXRlc1swXSAmIDB4MGYpIDw8IDQgfCAodjFCeXRlc1sxXSAmIDB4ZjApID4+IDQsICh2MUJ5dGVzWzFdICYgMHgwZikgPDwgNCB8ICh2MUJ5dGVzWzJdICYgMHhmMCkgPj4gNCwgMHg2MCB8IHYxQnl0ZXNbMl0gJiAweDBmLCB2MUJ5dGVzWzNdLCB2MUJ5dGVzWzhdLCB2MUJ5dGVzWzldLCB2MUJ5dGVzWzEwXSwgdjFCeXRlc1sxMV0sIHYxQnl0ZXNbMTJdLCB2MUJ5dGVzWzEzXSwgdjFCeXRlc1sxNF0sIHYxQnl0ZXNbMTVdKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjM1LmpzXCIpKTtcbnZhciBfbWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21kNS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG52YXIgdjMgPSAoMCwgX3YuZGVmYXVsdCkoJ3YzJywgMHgzMCwgX21kLmRlZmF1bHQpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdjM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlVSTCA9IGV4cG9ydHMuRE5TID0gdm9pZCAwO1xuZXhwb3J0cy5kZWZhdWx0ID0gdjM1O1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG52YXIgX3BhcnNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBzdHIgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgdmFyIGJ5dGVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxudmFyIEROUyA9IGV4cG9ydHMuRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG52YXIgVVJMID0gZXhwb3J0cy5VUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmZ1bmN0aW9uIHYzNShuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICB2YXIgX25hbWVzcGFjZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lc3BhY2UgPSAoMCwgX3BhcnNlLmRlZmF1bHQpKG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGlmICgoKF9uYW1lc3BhY2UgPSBuYW1lc3BhY2UpID09PSBudWxsIHx8IF9uYW1lc3BhY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uYW1lc3BhY2UubGVuZ3RoKSAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKGJ5dGVzKTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTtcbiAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gIC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX25hdGl2ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbmF0aXZlLmpzXCIpKTtcbnZhciBfcm5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ybmcuanNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBpZiAoX25hdGl2ZS5kZWZhdWx0LnJhbmRvbVVVSUQgJiYgIWJ1ZiAmJiAhb3B0aW9ucykge1xuICAgIHJldHVybiBfbmF0aXZlLmRlZmF1bHQucmFuZG9tVVVJRCgpO1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBfcm5nLmRlZmF1bHQpKCk7XG5cbiAgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwO1xuXG4gIC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIHJldHVybiAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKHJuZHMpO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdjQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YzNS5qc1wiKSk7XG52YXIgX3NoYSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc2hhMS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG52YXIgdjUgPSAoMCwgX3YuZGVmYXVsdCkoJ3Y1JywgMHg1MCwgX3NoYS5kZWZhdWx0KTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHY1OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdjY7XG52YXIgX3N0cmluZ2lmeSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjEuanNcIikpO1xudmFyIF92MVRvViA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjFUb1Y2LmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHsgcmV0dXJuIChyID0gX3RvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgeyB2YWx1ZTogdCwgZW51bWVyYWJsZTogITAsIGNvbmZpZ3VyYWJsZTogITAsIHdyaXRhYmxlOiAhMCB9KSA6IGVbcl0gPSB0LCBlOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgaSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHQgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIGkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuLyoqXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7VWludDhBcnJheT19IGJ1ZlxuICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHY2KG9wdGlvbnMgPSB7fSwgYnVmLCBvZmZzZXQgPSAwKSB7XG4gIC8vIHY2IGlzIHYxIHdpdGggZGlmZmVyZW50IGZpZWxkIGxheW91dCwgc28gd2Ugc3RhcnQgd2l0aCBhIHYxIFVVSUQsIGFsYmVpdFxuICAvLyB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCBiZWhhdmlvciBhcm91bmQgaG93IHRoZSBjbG9ja19zZXEgYW5kIG5vZGUgZmllbGRzXG4gIC8vIGFyZSByYW5kb21pemVkLCB3aGljaCBpcyB3aHkgd2UgY2FsbCB2MSB3aXRoIF92NjogdHJ1ZS5cbiAgdmFyIGJ5dGVzID0gKDAsIF92LmRlZmF1bHQpKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgX3Y2OiB0cnVlXG4gIH0pLCBuZXcgVWludDhBcnJheSgxNikpO1xuXG4gIC8vIFJlb3JkZXIgdGhlIGZpZWxkcyB0byB2NiBsYXlvdXQuXG4gIGJ5dGVzID0gKDAsIF92MVRvVi5kZWZhdWx0KShieXRlcyk7XG5cbiAgLy8gUmV0dXJuIGFzIGEgYnl0ZSBhcnJheSBpZiByZXF1ZXN0ZWRcbiAgaWYgKGJ1Zikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkoYnl0ZXMpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdjZUb1YxO1xudmFyIF9wYXJzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2UuanNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG4vKipcbiAqIENvbnZlcnQgYSB2NiBVVUlEIHRvIGEgdjEgVVVJRFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfFVpbnQ4QXJyYXl9IHV1aWQgLSBUaGUgdjYgVVVJRCB0byBjb252ZXJ0IHRvIHY2XG4gKiBAcmV0dXJucyB7c3RyaW5nfFVpbnQ4QXJyYXl9IFRoZSB2MSBVVUlEIGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGB1dWlkYCBhcmdcbiAqIChzdHJpbmcgb3IgVWludDhBcnJheSlcbiAqL1xuZnVuY3Rpb24gdjZUb1YxKHV1aWQpIHtcbiAgdmFyIHY2Qnl0ZXMgPSB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgPyAoMCwgX3BhcnNlLmRlZmF1bHQpKHV1aWQpIDogdXVpZDtcbiAgdmFyIHYxQnl0ZXMgPSBfdjZUb1YxKHY2Qnl0ZXMpO1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIF9zdHJpbmdpZnkudW5zYWZlU3RyaW5naWZ5KSh2MUJ5dGVzKSA6IHYxQnl0ZXM7XG59XG5cbi8vIERvIHRoZSBmaWVsZCB0cmFuc2Zvcm1hdGlvbiBuZWVkZWQgZm9yIHY2IC0+IHYxXG5mdW5jdGlvbiBfdjZUb1YxKHY2Qnl0ZXMpIHtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkub2YoKHY2Qnl0ZXNbM10gJiAweDBmKSA8PCA0IHwgdjZCeXRlc1s0XSA+PiA0ICYgMHgwZiwgKHY2Qnl0ZXNbNF0gJiAweDBmKSA8PCA0IHwgKHY2Qnl0ZXNbNV0gJiAweGYwKSA+PiA0LCAodjZCeXRlc1s1XSAmIDB4MGYpIDw8IDQgfCB2NkJ5dGVzWzZdICYgMHgwZiwgdjZCeXRlc1s3XSwgKHY2Qnl0ZXNbMV0gJiAweDBmKSA8PCA0IHwgKHY2Qnl0ZXNbMl0gJiAweGYwKSA+PiA0LCAodjZCeXRlc1syXSAmIDB4MGYpIDw8IDQgfCAodjZCeXRlc1szXSAmIDB4ZjApID4+IDQsIDB4MTAgfCAodjZCeXRlc1swXSAmIDB4ZjApID4+IDQsICh2NkJ5dGVzWzBdICYgMHgwZikgPDwgNCB8ICh2NkJ5dGVzWzFdICYgMHhmMCkgPj4gNCwgdjZCeXRlc1s4XSwgdjZCeXRlc1s5XSwgdjZCeXRlc1sxMF0sIHY2Qnl0ZXNbMTFdLCB2NkJ5dGVzWzEyXSwgdjZCeXRlc1sxM10sIHY2Qnl0ZXNbMTRdLCB2NkJ5dGVzWzE1XSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JuZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcm5nLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLyoqXG4gKiBVVUlEIFY3IC0gVW5peCBFcG9jaCB0aW1lLWJhc2VkIFVVSURcbiAqXG4gKiBUaGUgSUVURiBoYXMgcHVibGlzaGVkIFJGQzk1NjIsIGludHJvZHVjaW5nIDMgbmV3IFVVSUQgdmVyc2lvbnMgKDYsNyw4KS4gVGhpc1xuICogaW1wbGVtZW50YXRpb24gb2YgVjcgaXMgYmFzZWQgb24gdGhlIGFjY2VwdGVkLCB0aG91Z2ggbm90IHlldCBhcHByb3ZlZCxcbiAqIHJldmlzaW9ucy5cbiAqXG4gKiBSRkMgOTU2MjpodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTU2Mi5odG1sIFVuaXZlcnNhbGx5IFVuaXF1ZVxuICogSURlbnRpZmllcnMgKFVVSURzKVxuXG4gKlxuICogU2FtcGxlIFY3IHZhbHVlOlxuICogaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzk1NjIuaHRtbCNuYW1lLWV4YW1wbGUtb2YtYS11dWlkdjctdmFsdWVcbiAqXG4gKiBNb25vdG9uaWMgQml0IExheW91dDogUkZDIHJmYzk1NjIuNi4yIE1ldGhvZCAxLCBEZWRpY2F0ZWQgQ291bnRlciBCaXRzIHJlZjpcbiAqICAgICBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTU2Mi5odG1sI3NlY3Rpb24tNi4yLTUuMVxuICpcbiAqICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAwIDEgMiAzIDQgNSA2XG4gKiAgIDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDFcbiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfdHNfbXMgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqICB8ICAgICAgICAgIHVuaXhfdHNfbXMgICAgICAgICAgIHwgIHZlciAgfCAgICAgICAgc2VxX2hpICAgICAgICAgfFxuICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gKiAgfHZhcnwgICAgICAgICAgICAgICBzZXFfbG93ICAgICAgICAgICAgICAgfCAgICAgICAgcmFuZCAgICAgICAgIHxcbiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqXG4gKiBzZXEgaXMgYSAzMSBiaXQgc2VyaWFsaXplZCBjb3VudGVyOyBjb21wcmlzZWQgb2YgMTIgYml0IHNlcV9oaSBhbmQgMTkgYml0XG4gKiBzZXFfbG93LCBhbmQgcmFuZG9tbHkgaW5pdGlhbGl6ZWQgdXBvbiB0aW1lc3RhbXAgY2hhbmdlLiAzMSBiaXQgY291bnRlciBzaXplXG4gKiB3YXMgc2VsZWN0ZWQgYXMgYW55IGJpdHdpc2Ugb3BlcmF0aW9ucyBpbiBub2RlIGFyZSBkb25lIGFzIF9zaWduZWRfIDMyIGJpdFxuICogaW50cy4gd2UgZXhjbHVkZSB0aGUgc2lnbiBiaXQuXG4gKi9cblxudmFyIF9zZXFMb3cgPSBudWxsO1xudmFyIF9zZXFIaWdoID0gbnVsbDtcbnZhciBfbXNlY3MgPSAwO1xuZnVuY3Rpb24gdjcob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gaW5pdGlhbGl6ZSBidWZmZXIgYW5kIHBvaW50ZXJcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBVaW50OEFycmF5KDE2KTtcblxuICAvLyBybmRzIGlzIFVpbnQ4QXJyYXkoMTYpIGZpbGxlZCB3aXRoIHJhbmRvbSBieXRlc1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBfcm5nLmRlZmF1bHQpKCk7XG5cbiAgLy8gbWlsbGlzZWNvbmRzIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDBcbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IERhdGUubm93KCk7XG5cbiAgLy8gc2VxIGlzIHVzZXIgcHJvdmlkZWQgMzEgYml0IGNvdW50ZXJcbiAgdmFyIHNlcSA9IG9wdGlvbnMuc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNlcSA6IG51bGw7XG5cbiAgLy8gaW5pdGlhbGl6ZSBsb2NhbCBzZXEgaGlnaC9sb3cgcGFydHNcbiAgdmFyIHNlcUhpZ2ggPSBfc2VxSGlnaDtcbiAgdmFyIHNlcUxvdyA9IF9zZXFMb3c7XG5cbiAgLy8gY2hlY2sgaWYgY2xvY2sgaGFzIGFkdmFuY2VkIGFuZCB1c2VyIGhhcyBub3QgcHJvdmlkZWQgbXNlY3NcbiAgaWYgKG1zZWNzID4gX21zZWNzICYmIG9wdGlvbnMubXNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIF9tc2VjcyA9IG1zZWNzO1xuXG4gICAgLy8gdW5sZXNzIHVzZXIgcHJvdmlkZWQgc2VxLCByZXNldCBzZXEgcGFydHNcbiAgICBpZiAoc2VxICE9PSBudWxsKSB7XG4gICAgICBzZXFIaWdoID0gbnVsbDtcbiAgICAgIHNlcUxvdyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgd2UgaGF2ZSBhIHVzZXIgcHJvdmlkZWQgc2VxXG4gIGlmIChzZXEgIT09IG51bGwpIHtcbiAgICAvLyB0cmltIHByb3ZpZGVkIHNlcSB0byAzMSBiaXRzIG9mIHZhbHVlLCBhdm9pZGluZyBvdmVyZmxvd1xuICAgIGlmIChzZXEgPiAweDdmZmZmZmZmKSB7XG4gICAgICBzZXEgPSAweDdmZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIHNwbGl0IHByb3ZpZGVkIHNlcSBpbnRvIGhpZ2gvbG93IHBhcnRzXG4gICAgc2VxSGlnaCA9IHNlcSA+Pj4gMTkgJiAweGZmZjtcbiAgICBzZXFMb3cgPSBzZXEgJiAweDdmZmZmO1xuICB9XG5cbiAgLy8gcmFuZG9tbHkgaW5pdGlhbGl6ZSBzZXFcbiAgaWYgKHNlcUhpZ2ggPT09IG51bGwgfHwgc2VxTG93ID09PSBudWxsKSB7XG4gICAgc2VxSGlnaCA9IHJuZHNbNl0gJiAweDdmO1xuICAgIHNlcUhpZ2ggPSBzZXFIaWdoIDw8IDggfCBybmRzWzddO1xuICAgIHNlcUxvdyA9IHJuZHNbOF0gJiAweDNmOyAvLyBwYWQgZm9yIHZhclxuICAgIHNlcUxvdyA9IHNlcUxvdyA8PCA4IHwgcm5kc1s5XTtcbiAgICBzZXFMb3cgPSBzZXFMb3cgPDwgNSB8IHJuZHNbMTBdID4+PiAzO1xuICB9XG5cbiAgLy8gaW5jcmVtZW50IHNlcSBpZiB3aXRoaW4gbXNlY3Mgd2luZG93XG4gIGlmIChtc2VjcyArIDEwMDAwID4gX21zZWNzICYmIHNlcSA9PT0gbnVsbCkge1xuICAgIGlmICgrK3NlcUxvdyA+IDB4N2ZmZmYpIHtcbiAgICAgIHNlcUxvdyA9IDA7XG4gICAgICBpZiAoKytzZXFIaWdoID4gMHhmZmYpIHtcbiAgICAgICAgc2VxSGlnaCA9IDA7XG5cbiAgICAgICAgLy8gaW5jcmVtZW50IGludGVybmFsIF9tc2Vjcy4gdGhpcyBhbGxvd3MgdXMgdG8gY29udGludWUgaW5jcmVtZW50aW5nXG4gICAgICAgIC8vIHdoaWxlIHN0YXlpbmcgbW9ub3RvbmljLiBOb3RlLCBvbmNlIHdlIGhpdCAxMGsgbWlsbGlzZWNvbmRzIGJleW9uZCBzeXN0ZW1cbiAgICAgICAgLy8gY2xvY2ssIHdlIHdpbGwgcmVzZXQgYnJlYWtpbmcgbW9ub3RvbmljaXR5IChhZnRlciAoMl4zMSkqMTAwMDAgZ2VuZXJhdGlvbnMpXG4gICAgICAgIF9tc2VjcysrO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyByZXNldHRpbmc7IHdlIGhhdmUgYWR2YW5jZWQgbW9yZSB0aGFuXG4gICAgLy8gMTBrIG1pbGxpc2Vjb25kcyBiZXlvbmQgc3lzdGVtIGNsb2NrXG4gICAgX21zZWNzID0gbXNlY3M7XG4gIH1cbiAgX3NlcUhpZ2ggPSBzZXFIaWdoO1xuICBfc2VxTG93ID0gc2VxTG93O1xuXG4gIC8vIFtieXRlcyAwLTVdIDQ4IGJpdHMgb2YgbG9jYWwgdGltZXN0YW1wXG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwMDAwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAmIDB4ZmY7XG5cbiAgLy8gW2J5dGUgNl0gLSBzZXQgNCBiaXRzIG9mIHZlcnNpb24gKDcpIHdpdGggZmlyc3QgNCBiaXRzIHNlcV9oaVxuICBiW2krK10gPSBzZXFIaWdoID4+PiA0ICYgMHgwZiB8IDB4NzA7XG5cbiAgLy8gW2J5dGUgN10gcmVtYWluaW5nIDggYml0cyBvZiBzZXFfaGlcbiAgYltpKytdID0gc2VxSGlnaCAmIDB4ZmY7XG5cbiAgLy8gW2J5dGUgOF0gLSB2YXJpYW50ICgyIGJpdHMpLCBmaXJzdCA2IGJpdHMgc2VxX2xvd1xuICBiW2krK10gPSBzZXFMb3cgPj4+IDEzICYgMHgzZiB8IDB4ODA7XG5cbiAgLy8gW2J5dGUgOV0gOCBiaXRzIHNlcV9sb3dcbiAgYltpKytdID0gc2VxTG93ID4+PiA1ICYgMHhmZjtcblxuICAvLyBbYnl0ZSAxMF0gcmVtYWluaW5nIDUgYml0cyBzZXFfbG93LCAzIGJpdHMgcmFuZG9tXG4gIGJbaSsrXSA9IHNlcUxvdyA8PCAzICYgMHhmZiB8IHJuZHNbMTBdICYgMHgwNztcblxuICAvLyBbYnl0ZXMgMTEtMTVdIGFsd2F5cyByYW5kb21cbiAgYltpKytdID0gcm5kc1sxMV07XG4gIGJbaSsrXSA9IHJuZHNbMTJdO1xuICBiW2krK10gPSBybmRzWzEzXTtcbiAgYltpKytdID0gcm5kc1sxNF07XG4gIGJbaSsrXSA9IHJuZHNbMTVdO1xuICByZXR1cm4gYnVmIHx8ICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkoYik7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2NzsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVnZXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JlZ2V4LmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBfcmVnZXguZGVmYXVsdC50ZXN0KHV1aWQpO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdmFsaWRhdGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3ZhbGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCEoMCwgX3ZhbGlkYXRlLmRlZmF1bHQpKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTUpLCAxNik7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2ZXJzaW9uOyIsIi8qKlxuICogVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gYHByZS1wdWJsaXNoLmpzYC5cbiAqIERvIG5vdCBtYW51YWxseSBlZGl0LlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBcImFyZWFcIjogdHJ1ZSxcbiAgXCJiYXNlXCI6IHRydWUsXG4gIFwiYnJcIjogdHJ1ZSxcbiAgXCJjb2xcIjogdHJ1ZSxcbiAgXCJlbWJlZFwiOiB0cnVlLFxuICBcImhyXCI6IHRydWUsXG4gIFwiaW1nXCI6IHRydWUsXG4gIFwiaW5wdXRcIjogdHJ1ZSxcbiAgXCJsaW5rXCI6IHRydWUsXG4gIFwibWV0YVwiOiB0cnVlLFxuICBcInBhcmFtXCI6IHRydWUsXG4gIFwic291cmNlXCI6IHRydWUsXG4gIFwidHJhY2tcIjogdHJ1ZSxcbiAgXCJ3YnJcIjogdHJ1ZVxufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgX19ERVZfXyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbic7XG5cbnZhciB3YXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKF9fREVWX18pIHtcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDEgPyBsZW4gLSAxIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMTsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAxXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgK1xuICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH1cblxuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArXG4gICAgICAgICAgJ21lc3NhZ2UgYXJndW1lbnQnXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgcHJpbnRXYXJuaW5nLmFwcGx5KG51bGwsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdhcm5pbmc7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3dzIGRvZXMgbm90IHdvcmsgaW4gdGhlIGJyb3dzZXIuIEJyb3dzZXIgY2xpZW50cyBtdXN0IHVzZSB0aGUgbmF0aXZlICcgK1xuICAgICAgJ1dlYlNvY2tldCBvYmplY3QnXG4gICk7XG59O1xuIiwiZnVuY3Rpb24gZShlLGksdCxvKXtmb3IoO2k+PXQmJiFlKFwiKG1pbi1yZXNvbHV0aW9uOiBcIitpL28rXCJkcHB4KVwiKS5tYXRjaGVzOylpLS07cmV0dXJuIGl9ZnVuY3Rpb24gaShpKXtpZih2b2lkIDA9PT1pJiYoaT13aW5kb3cpLCFpKXJldHVybiAxO2lmKHZvaWQgMCE9PWkuZGV2aWNlUGl4ZWxSYXRpbylyZXR1cm4gaS5kZXZpY2VQaXhlbFJhdGlvO3ZhciB0PWkuZG9jdW1lbnQuZnJhbWVzO3JldHVybiB2b2lkIDAhPT10P3ZvaWQgMCE9PXQuZGV2aWNlUGl4ZWxSYXRpbz90LmRldmljZVBpeGVsUmF0aW86dC5zY3JlZW4uZGV2aWNlWERQSS90LnNjcmVlbi5zeXN0ZW1YRFBJOnZvaWQgMCE9PWkubWF0Y2hNZWRpYT9mdW5jdGlvbihpKXtmb3IodmFyIHQ9aS5tYXRjaE1lZGlhLG89MTAsbj0uMSxyPTEsYT1vLGM9MDtjPDQ7YysrKW89KGE9MTAqZSh0LG8sbixyKSkrOSxuPWEscio9MTA7cmV0dXJuIGEvcn0oaSk6MX1mdW5jdGlvbiB0KGUsdCl7dmFyIG89KGUgaW5zdGFuY2VvZiBFbGVtZW50P2dldENvbXB1dGVkU3R5bGUoZSkuem9vbTplLnpvb20pfHwxO3JldHVybiBpKHQpKihcInN0cmluZ1wiPT10eXBlb2Ygbz9wYXJzZUZsb2F0KG8pOm8pfWV4cG9ydHt0IGFzIGVsZW1lbnRab29tTGV2ZWwsaSBhcyB6b29tTGV2ZWx9O1xuIiwiLyogKGlnbm9yZWQpICovIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS9mcm9tXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvaXMtYXJyYXlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9iaW5kXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZW50cmllc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2V2ZXJ5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmlsdGVyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmluZC1pbmRleFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2ZpbmRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9rZXlzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvbWFwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvcmVkdWNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zb3J0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc3BsaWNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS92YWx1ZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9qc29uL3N0cmluZ2lmeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL21hcFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL251bWJlci9pcy1pbnRlZ2VyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2Fzc2lnblwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9jcmVhdGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2VudHJpZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZnJlZXplXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2tleXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9wYXJzZS1pbnRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9wcm9taXNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvc2V0LWludGVydmFsXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvc2V0LXRpbWVvdXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9zZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS93ZWFrLW1hcFwiKTsiLCJ2YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvZmVhdHVyZXMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZShcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiKTtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG4gIHJldHVybiAociA9IHRvUHJvcGVydHlLZXkocikpIGluIGUgPyBfT2JqZWN0JGRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHtcbiAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICBcImRlZmF1bHRcIjogZVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF9TeW1ib2wkdG9QcmltaXRpdmUgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC90by1wcmltaXRpdmUuanNcIik7XG52YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbX1N5bWJvbCR0b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gdG9QcmltaXRpdmUsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKFwiLi90b1ByaW1pdGl2ZS5qc1wiKTtcbmZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IHRvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiO1xufVxubW9kdWxlLmV4cG9ydHMgPSB0b1Byb3BlcnR5S2V5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF9TeW1ib2wgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC9pbmRleC5qc1wiKTtcbnZhciBfU3ltYm9sJGl0ZXJhdG9yID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9mZWF0dXJlcy9zeW1ib2wvaXRlcmF0b3IuanNcIik7XG5mdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiAobW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBfU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIF9TeW1ib2wkaXRlcmF0b3IgPyBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiB0eXBlb2YgbztcbiAgfSA6IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBfU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IF9TeW1ib2wgJiYgbyAhPT0gX1N5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yobyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhYmxlL3N5bWJvbCcpO1xuXG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5mdW5jdGlvbi5tZXRhZGF0YScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmFzeW5jLWRpc3Bvc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5kaXNwb3NlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWV0YWRhdGEnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhYmxlL3N5bWJvbC9pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9zdGFibGUvc3ltYm9sL3RvLXByaW1pdGl2ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmlzLWFycmF5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5pc0FycmF5O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5jb25jYXQnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnY29uY2F0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZW50cmllcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5ldmVyeScpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdldmVyeScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5maWx0ZXInKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZmlsdGVyJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXgnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZmluZEluZGV4Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZmluZCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdmb3JFYWNoJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2luZGV4T2YnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdrZXlzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5Lm1hcCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdtYXAnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3JlZHVjZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5zbGljZScpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdzbGljZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5zb3J0Jyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3NvcnQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3NwbGljZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3ZhbHVlcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0Z1bmN0aW9uJywgJ2JpbmQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9mdW5jdGlvbi92aXJ0dWFsL2JpbmQnKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuYmluZDtcbiAgcmV0dXJuIGl0ID09PSBGdW5jdGlvblByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihGdW5jdGlvblByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gRnVuY3Rpb25Qcm90b3R5cGUuYmluZCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvY29uY2F0Jyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmNvbmNhdDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuY29uY2F0KSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9ldmVyeScpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5ldmVyeTtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuZXZlcnkpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2ZpbHRlcicpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5maWx0ZXI7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmZpbHRlcikgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvZmluZC1pbmRleCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5maW5kSW5kZXg7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmZpbmRJbmRleCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvZmluZCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5maW5kO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5maW5kKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgYXJyYXlNZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2luY2x1ZGVzJyk7XG52YXIgc3RyaW5nTWV0aG9kID0gcmVxdWlyZSgnLi4vc3RyaW5nL3ZpcnR1YWwvaW5jbHVkZXMnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xudmFyIFN0cmluZ1Byb3RvdHlwZSA9IFN0cmluZy5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5pbmNsdWRlcztcbiAgaWYgKGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuaW5jbHVkZXMpKSByZXR1cm4gYXJyYXlNZXRob2Q7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgfHwgaXQgPT09IFN0cmluZ1Byb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihTdHJpbmdQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IFN0cmluZ1Byb3RvdHlwZS5pbmNsdWRlcykpIHtcbiAgICByZXR1cm4gc3RyaW5nTWV0aG9kO1xuICB9IHJldHVybiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvaW5kZXgtb2YnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuaW5kZXhPZjtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuaW5kZXhPZikgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvbWFwJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0Lm1hcDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUubWFwKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9yZWR1Y2UnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQucmVkdWNlO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5yZWR1Y2UpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL3NsaWNlJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnNsaWNlO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5zbGljZSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvc29ydCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5zb3J0O1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5zb3J0KSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9zcGxpY2UnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuc3BsaWNlO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5zcGxpY2UpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9zdHJpbmcvdmlydHVhbC9zdGFydHMtd2l0aCcpO1xuXG52YXIgU3RyaW5nUHJvdG90eXBlID0gU3RyaW5nLnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnN0YXJ0c1dpdGg7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N0cmluZycgfHwgaXQgPT09IFN0cmluZ1Byb3RvdHlwZVxuICAgIHx8IChpc1Byb3RvdHlwZU9mKFN0cmluZ1Byb3RvdHlwZSwgaXQpICYmIG93biA9PT0gU3RyaW5nUHJvdG90eXBlLnN0YXJ0c1dpdGgpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuZGF0ZS50by1qc29uJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHknKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWpzb24gLS0gc2FmZVxuaWYgKCFwYXRoLkpTT04pIHBhdGguSlNPTiA9IHsgc3RyaW5naWZ5OiBKU09OLnN0cmluZ2lmeSB9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICByZXR1cm4gYXBwbHkocGF0aC5KU09OLnN0cmluZ2lmeSwgbnVsbCwgYXJndW1lbnRzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hcCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5tYXAuZ3JvdXAtYnknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk1hcDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXInKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5pc0ludGVnZXI7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5hc3NpZ247XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5jcmVhdGUnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxudmFyIE9iamVjdCA9IHBhdGguT2JqZWN0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKSB7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKFAsIEQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG52YXIgT2JqZWN0ID0gcGF0aC5PYmplY3Q7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYykge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xufTtcblxuaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5zaGFtKSBkZWZpbmVQcm9wZXJ0eS5zaGFtID0gdHJ1ZTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5lbnRyaWVzO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZnJlZXplJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZnJlZXplO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbnZhciBPYmplY3QgPSBwYXRoLk9iamVjdDtcblxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7XG59O1xuXG5pZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtKSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2hhbSA9IHRydWU7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5rZXlzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3Qua2V5cztcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucGFyc2UtaW50Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5wYXJzZUludDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYW55Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2Uud2l0aC1yZXNvbHZlcnMnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguUHJvbWlzZTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LmRpZmZlcmVuY2UudjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LmludGVyc2VjdGlvbi52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuaXMtZGlzam9pbnQtZnJvbS52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuaXMtc3Vic2V0LW9mLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnNldC5pcy1zdXBlcnNldC1vZi52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UudjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LnVuaW9uLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguU2V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnU3RyaW5nJywgJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdTdHJpbmcnLCAnc3RhcnRzV2l0aCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5jb25jYXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaGFzLWluc3RhbmNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5pcy1jb25jYXQtc3ByZWFkYWJsZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC1hbGwnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnJlcGxhY2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuc3BsaXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudW5zY29wYWJsZXMnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5yZWZsZWN0LnRvLXN0cmluZy10YWcnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlN5bWJvbDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yJyk7XG52YXIgV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKCdpdGVyYXRvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5kYXRlLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tcHJpbWl0aXZlJyk7XG52YXIgV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKCd0b1ByaW1pdGl2ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLndlYWstbWFwJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5XZWFrTWFwO1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9mdWxsL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZnVsbC9zeW1ib2wnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZnVsbC9zeW1ib2wvaXRlcmF0b3InKTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZnVsbC9zeW1ib2wvdG8tcHJpbWl0aXZlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vYWN0dWFsL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vYWN0dWFsL3N5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXJlZ2lzdGVyZWQtc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtd2VsbC1rbm93bi1zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5jdXN0b20tbWF0Y2hlcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUnKTtcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtcmVnaXN0ZXJlZCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXdlbGwta25vd24nKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5tYXRjaGVyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWV0YWRhdGEta2V5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucGF0dGVybi1tYXRjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLnJlcGxhY2UtYWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2FjdHVhbC9zeW1ib2wvaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vYWN0dWFsL3N5bWJvbC90by1wcmltaXRpdmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IElzQ2FsbGFibGUoYXJndW1lbnQpIGlzIHRydWVgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkgaXMgdHJ1ZWBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcG9zc2libGUtcHJvdG90eXBlJyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc1Bvc3NpYmxlUHJvdG90eXBlKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArICRTdHJpbmcoYXJndW1lbnQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBQZXJmb3JtID8gUmVxdWlyZUludGVybmFsU2xvdChNLCBbW1NldERhdGFdXSlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ29iamVjdCcgJiYgJ3NpemUnIGluIGl0ICYmICdoYXMnIGluIGl0ICYmICdhZGQnIGluIGl0ICYmICdkZWxldGUnIGluIGl0ICYmICdrZXlzJyBpbiBpdCkgcmV0dXJuIGl0O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdCkgKyAnIGlzIG5vdCBhIHNldCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFByb3RvdHlwZSkge1xuICBpZiAoaXNQcm90b3R5cGVPZihQcm90b3R5cGUsIGl0KSkgcmV0dXJuIGl0O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IFR5cGUoYXJndW1lbnQpIGlzIE9iamVjdGBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc09iamVjdChhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJFN0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBGRjI2LSBidWc6IEFycmF5QnVmZmVycyBhcmUgbm9uLWV4dGVuc2libGUsIGJ1dCBPYmplY3QuaXNFeHRlbnNpYmxlIGRvZXMgbm90IHJlcG9ydCBpdFxudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyID09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlLCBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIGlmIChPYmplY3QuaXNFeHRlbnNpYmxlKGJ1ZmZlcikpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShidWZmZXIsICdhJywgeyB2YWx1ZTogOCB9KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZm9yRWFjaDtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcblxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdmb3JFYWNoJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG5tb2R1bGUuZXhwb3J0cyA9ICFTVFJJQ1RfTUVUSE9EID8gZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGZvckVhY2godGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LXByb3RvdHlwZS1mb3JlYWNoIC0tIHNhZmVcbn0gOiBbXS5mb3JFYWNoO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3InKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbnZhciAkQXJyYXkgPSBBcnJheTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgSVNfQ09OU1RSVUNUT1IgPSBpc0NvbnN0cnVjdG9yKHRoaXMpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3IsIG5leHQsIHZhbHVlO1xuICAvLyBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBpdGVyYWJsZSBvciBpdCdzIGFuIGFycmF5IHdpdGggdGhlIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2UgYSBzaW1wbGUgY2FzZVxuICBpZiAoaXRlcmF0b3JNZXRob2QgJiYgISh0aGlzID09PSAkQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKCkgOiBbXTtcbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKE8sIGl0ZXJhdG9yTWV0aG9kKTtcbiAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICBmb3IgKDshKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgcmVzdWx0ID0gSVNfQ09OU1RSVUNUT1IgPyBuZXcgdGhpcyhsZW5ndGgpIDogJEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlID0gbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICAgIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIGlmICgoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykgJiYgT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZm9yRWFjaCwgbWFwLCBmaWx0ZXIsIHNvbWUsIGV2ZXJ5LCBmaW5kLCBmaW5kSW5kZXgsIGZpbHRlclJlamVjdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PT0gNjtcbiAgdmFyIElTX0ZJTFRFUl9SRUpFQ1QgPSBUWVBFID09PSA3O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShzZWxmKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlO1xuICAgIHZhciB0YXJnZXQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgfHwgSVNfRklMVEVSX1JFSkVDVCA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbHVlLCByZXN1bHQ7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHB1c2godGFyZ2V0LCB2YWx1ZSk7ICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBmYWxzZTsgICAgICAgICAgICAgLy8gZXZlcnlcbiAgICAgICAgICBjYXNlIDc6IHB1c2godGFyZ2V0LCB2YWx1ZSk7ICAgICAgLy8gZmlsdGVyUmVqZWN0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4gIGZvckVhY2g6IGNyZWF0ZU1ldGhvZCgwKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbiAgbWFwOiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb21lXG4gIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4gIGV2ZXJ5OiBjcmVhdGVNZXRob2QoNCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRJbmRleFxuICBmaW5kSW5kZXg6IGNyZWF0ZU1ldGhvZCg2KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJSZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maWx0ZXJpbmdcbiAgZmlsdGVyUmVqZWN0OiBjcmVhdGVNZXRob2QoNylcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIC8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc3XG4gIHJldHVybiBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gYXJyYXkuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGZvbzogMSB9O1xuICAgIH07XG4gICAgcmV0dXJuIGFycmF5W01FVEhPRF9OQU1FXShCb29sZWFuKS5mb28gIT09IDE7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgYXJndW1lbnQpIHtcbiAgdmFyIG1ldGhvZCA9IFtdW01FVEhPRF9OQU1FXTtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgbWV0aG9kLmNhbGwobnVsbCwgYXJndW1lbnQgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSwgMSk7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFJFRFVDRV9FTVBUWSA9ICdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJztcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IHJlZHVjZSwgcmVkdWNlUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19SSUdIVCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c0xlbmd0aCwgbWVtbykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhhdCk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICBhQ2FsbGFibGUoY2FsbGJhY2tmbik7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCAmJiBhcmd1bWVudHNMZW5ndGggPCAyKSB0aHJvdyBuZXcgJFR5cGVFcnJvcihSRURVQ0VfRU1QVFkpO1xuICAgIHZhciBpbmRleCA9IElTX1JJR0hUID8gbGVuZ3RoIC0gMSA6IDA7XG4gICAgdmFyIGkgPSBJU19SSUdIVCA/IC0xIDogMTtcbiAgICBpZiAoYXJndW1lbnRzTGVuZ3RoIDwgMikgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgICAgIG1lbW8gPSBzZWxmW2luZGV4XTtcbiAgICAgICAgaW5kZXggKz0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpbmRleCArPSBpO1xuICAgICAgaWYgKElTX1JJR0hUID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICAgIHRocm93IG5ldyAkVHlwZUVycm9yKFJFRFVDRV9FTVBUWSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoO0lTX1JJR0hUID8gaW5kZXggPj0gMCA6IGxlbmd0aCA+IGluZGV4OyBpbmRleCArPSBpKSBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgbWVtbyA9IGNhbGxiYWNrZm4obWVtbywgc2VsZltpbmRleF0sIGluZGV4LCBPKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbW87XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VcbiAgbGVmdDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZXJpZ2h0XG4gIHJpZ2h0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIFNhZmFyaSA8IDEzIGRvZXMgbm90IHRocm93IGFuIGVycm9yIGluIHRoaXMgY2FzZVxudmFyIFNJTEVOVF9PTl9OT05fV1JJVEFCTEVfTEVOR1RIX1NFVCA9IERFU0NSSVBUT1JTICYmICFmdW5jdGlvbiAoKSB7XG4gIC8vIG1ha2VzIG5vIHNlbnNlIHdpdGhvdXQgcHJvcGVyIHN0cmljdCBtb2RlIHN1cHBvcnRcbiAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB3cml0YWJsZTogZmFsc2UgfSkubGVuZ3RoID0gMTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3I7XG4gIH1cbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPyBmdW5jdGlvbiAoTywgbGVuZ3RoKSB7XG4gIGlmIChpc0FycmF5KE8pICYmICFnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgJ2xlbmd0aCcpLndyaXRhYmxlKSB7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgnKTtcbiAgfSByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59IDogZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKFtdLnNsaWNlKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbnZhciBzb3J0ID0gZnVuY3Rpb24gKGFycmF5LCBjb21wYXJlZm4pIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOCkge1xuICAgIC8vIGluc2VydGlvbiBzb3J0XG4gICAgdmFyIGkgPSAxO1xuICAgIHZhciBlbGVtZW50LCBqO1xuXG4gICAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICAgIGogPSBpO1xuICAgICAgZWxlbWVudCA9IGFycmF5W2ldO1xuICAgICAgd2hpbGUgKGogJiYgY29tcGFyZWZuKGFycmF5W2ogLSAxXSwgZWxlbWVudCkgPiAwKSB7XG4gICAgICAgIGFycmF5W2pdID0gYXJyYXlbLS1qXTtcbiAgICAgIH1cbiAgICAgIGlmIChqICE9PSBpKyspIGFycmF5W2pdID0gZWxlbWVudDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gbWVyZ2Ugc29ydFxuICAgIHZhciBtaWRkbGUgPSBmbG9vcihsZW5ndGggLyAyKTtcbiAgICB2YXIgbGVmdCA9IHNvcnQoYXJyYXlTbGljZShhcnJheSwgMCwgbWlkZGxlKSwgY29tcGFyZWZuKTtcbiAgICB2YXIgcmlnaHQgPSBzb3J0KGFycmF5U2xpY2UoYXJyYXksIG1pZGRsZSksIGNvbXBhcmVmbik7XG4gICAgdmFyIGxsZW5ndGggPSBsZWZ0Lmxlbmd0aDtcbiAgICB2YXIgcmxlbmd0aCA9IHJpZ2h0Lmxlbmd0aDtcbiAgICB2YXIgbGluZGV4ID0gMDtcbiAgICB2YXIgcmluZGV4ID0gMDtcblxuICAgIHdoaWxlIChsaW5kZXggPCBsbGVuZ3RoIHx8IHJpbmRleCA8IHJsZW5ndGgpIHtcbiAgICAgIGFycmF5W2xpbmRleCArIHJpbmRleF0gPSAobGluZGV4IDwgbGxlbmd0aCAmJiByaW5kZXggPCBybGVuZ3RoKVxuICAgICAgICA/IGNvbXBhcmVmbihsZWZ0W2xpbmRleF0sIHJpZ2h0W3JpbmRleF0pIDw9IDAgPyBsZWZ0W2xpbmRleCsrXSA6IHJpZ2h0W3JpbmRleCsrXVxuICAgICAgICA6IGxpbmRleCA8IGxsZW5ndGggPyBsZWZ0W2xpbmRleCsrXSA6IHJpZ2h0W3JpbmRleCsrXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciAkQXJyYXkgPSBBcnJheTtcblxuLy8gYSBwYXJ0IG9mIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXkpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsQXJyYXkpKSB7XG4gICAgQyA9IG9yaWdpbmFsQXJyYXkuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAoaXNDb25zdHJ1Y3RvcihDKSAmJiAoQyA9PT0gJEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/ICRBcnJheSA6IEM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFycmF5U3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3InKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKGFycmF5U3BlY2llc0NvbnN0cnVjdG9yKG9yaWdpbmFsQXJyYXkpKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtZXRob2ROYW1lLCBudW1BcmdzKSB7XG4gIHJldHVybiBudW1BcmdzID09PSAxID8gZnVuY3Rpb24gKG9iamVjdCwgYXJnKSB7XG4gICAgcmV0dXJuIG9iamVjdFttZXRob2ROYW1lXShhcmcpO1xuICB9IDogZnVuY3Rpb24gKG9iamVjdCwgYXJnMSwgYXJnMikge1xuICAgIHJldHVybiBvYmplY3RbbWV0aG9kTmFtZV0oYXJnMSwgYXJnMik7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20sIG5vLXRocm93LWxpdGVyYWwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICB0cnkge1xuICAgIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgcmV0dXJuIGZhbHNlOyB9IC8vIHdvcmthcm91bmQgb2Ygb2xkIFdlYktpdCArIGBldmFsYCBidWdcbiAgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIG9iamVjdFtJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogSVRFUkFUSU9OX1NVUFBPUlQgPSB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBleGVjKG9iamVjdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIElURVJBVElPTl9TVVBQT1JUO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoe30udG9TdHJpbmcpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gc3RyaW5nU2xpY2UodG9TdHJpbmcoaXQpLCA4LCAtMSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9ICRPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWdcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PT0gJ09iamVjdCcgJiYgaXNDYWxsYWJsZShPLmNhbGxlZSkgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSByZXF1aXJlKCcuLi9p